You need to configure CMEM at insmod time with adequate memory pools. The app requests these pools at runtime via Memory_contigAlloc(). Check your insmod parameters (sometimes provided via a loadmodules.sh script).
Some gaps (volunteers welcome!), but some details here: http://wiki.davincidsp.com/index.php?title=CMEM_Overview Chris ________________________________ From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of ashish pareek Sent: Saturday, September 13, 2008 11:11 PM To: [email protected] Subject: Help : Jpegenc demo application Hi All , I am trying to run an application tht convert Raw image to Yuv .And finally convert it to jpg format by using jpegenc . I am using mt9t001 image sensor type . While running the application i got an error :- Failed to get a pool fillting a size 3145728. While debugging i found tht encodedBuf = (XDAS_Int8 *)Memory_contigAlloc(encodedBufSize, BUFALIGN); is returning Null . I am putting my test file here .Could any one help me ? Ashish /* * ======== jpegenc.c ======== * * A simple example of encoding an image using the JPEG encoder. */ //typedef int bool; #include <xdc/std.h> #include <ti/sdo/ce/Engine.h> #include <ti/sdo/ce/osal/Memory.h> #include <ti/sdo/ce/image1/imgenc1.h> #include <ti/sdo/ce/trace/gt.h> #include <ti/sdo/codecs/jpegenc/dm355/ijpegenc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <asm/types.h> #include <linux/videodev.h> #include <media/davinci/davinci_vpfe.h> #include <media/davinci/ccdc_dm355.h> #include <asm/arch/dm355_ipipe.h> #include "ipipe_example.h" #include "ipipe_config.h" #include "mt9t001_capture.h" /* * The parameters for the encoding process. These can be changed to try * different image sizes and JPEG features. */ #define SCANS 4 #define QVALUE 73 /* this example only supports YUV422 interleaved */ #define CHROMAFORMAT XDM_YUV_422ILE //#define CHROMAFORMAT XDM_YUV_422P /* Not a cached system, no buffer alignment constraints */ #define BUFALIGN Memory_DEFAULTALIGNMENT static XDAS_Int8 *inBuf; static XDAS_Int8 *encodedBuf; static XDAS_Int32 inBufSize; static XDAS_Int32 encodedBufSize; static String progName = "app"; static String encoderName = "jpegenc"; static String engineName = "image"; static String image_base_name = "image"; extern GT_Mask curMask; static Int32 encode(IMGENC1_Handle enc, XDAS_Int8 * in, XDAS_Int8 * out ); void save( void * data, int len, char * basename, char * ext ); /* * ======== smain ======== */ Int smain(Int argc, String argv[]) { Engine_Handle ce = NULL; IMGENC1_Handle enc = NULL; IMGENC1_Params encParams; IMGENC1_DynamicParams dynParams; IMGENC1_Status imgStatus; IJPEGENC_DynamicParams extDynParams; char outFile[80]; int capbuf_phyaddr; struct buffer * capbuf; struct buffer ipipebuffer; int length; // Setup the capture device InitCaptureDevice(CAP_FORMAT, CAP_WIDTH, CAP_HEIGHT); // Initialize the IPIPE to just convert from bayer to YCC InitIpipe( RAW2YUV ,CAP_WIDTH ,CAP_HEIGHT ,CAP_WIDTH ,CAP_HEIGHT ,&ipipebuffer ); // Create a name for the output file sprintf( outFile, "%s_%04d", image_base_name, 0 ); GT_0trace(curMask, GT_1CLASS, "Application started.\n"); /* open the Codec Engine */ if ((ce = Engine_open(engineName, NULL, NULL)) == NULL) { fprintf(stderr, "ERROR: can't open engine %s\n", engineName); goto end; } printf("Engine Successfully Opend :\n"); /* allocate and initialize image encoder on the engine */ encParams.size = sizeof(IMGENC1_Params); encParams.maxWidth = CAP_WIDTH; encParams.maxHeight = CAP_HEIGHT; encParams.maxScans = SCANS; encParams.dataEndianness = XDM_DEFAULT; encParams.forceChromaFormat = CHROMAFORMAT; enc = IMGENC1_create(ce, encoderName, &encParams); if (enc == NULL) { fprintf(stderr, "%s: error: can't open codec %s\n", progName, encoderName); goto end; } printf("Codec Successfully Opend :\n"); /* set the parameters for encoding */ dynParams.size = sizeof(IMGENC1_DynamicParams); dynParams.numAU = XDM_DEFAULT; dynParams.inputChromaFormat = CHROMAFORMAT; dynParams.inputHeight = CAP_HEIGHT; dynParams.inputWidth = CAP_WIDTH; dynParams.captureWidth = 0; dynParams.generateHeader = XDM_ENCODE_AU; dynParams.qValue = QVALUE; #if 0 /* set the extended parameters for encoding */ extDynParams.imgencDynamicParams = dynParams; extDynParams.rstInterval = XDM_DEFAULT; extDynParams.disableEOI = XDM_DEFAULT; extDynParams.rotation = 90; extDynParams.customQ = NULL; imgStatus.size = sizeof(imgStatus); if (IMGENC1_control(enc, XDM_SETPARAMS, (IMGENC1_DynamicParams *)&extDynParams, &imgStatus) == XDM_EFAIL) { fprintf(stderr, "%s: error: could not set PARAMS: 0x%x\n", progName, (unsigned int)imgStatus.extendedError); goto end; } #else imgStatus.size = sizeof(imgStatus); if (IMGENC1_control(enc, XDM_SETPARAMS, &dynParams, &imgStatus) == XDM_EFAIL) { fprintf(stderr, "%s: error: could not set PARAMS: 0x%x\n", progName, (unsigned int)imgStatus.extendedError); goto end; } printf("Engine PARAMS Successfully Set :\n"); #endif /* ask the codec for buffer sizes - these are typically conservative */ if (IMGENC1_control(enc, XDM_GETBUFINFO, &dynParams, &imgStatus) == XDM_EFAIL) { fprintf(stderr, "%s: error: could not get BUFINFO: 0x%x\n", progName, (unsigned int)imgStatus.extendedError); goto end; } printf("BUFINFO steps done :\n"); /* allocate input, encoded buffers based on GETBUFINFO */ inBufSize = imgStatus.bufInfo.minInBufSize[0]; inBuf = (XDAS_Int8 *)Memory_contigAlloc(inBufSize, BUFALIGN); if (inBuf==NULL) printf("Memory_ContigAlloc for inbuf Not done :\n"); encodedBufSize = imgStatus.bufInfo.minOutBufSize[0]; encodedBuf = (XDAS_Int8 *)Memory_contigAlloc(encodedBufSize, BUFALIGN); if(encodedBuf == NULL) printf("Memory_ContigAlloc for encodeBuf Not done :\n"); if ((inBuf == NULL) || (encodedBuf == NULL)) { printf("Memory_ContigAlloc Not done :\n"); goto end; } // Start the video stream StartStreaming(); // Capture a frame capbuf = CaptureFrame(&capbuf_phyaddr); // Stop the video stream StopStreaming(); sleep(1); // Convert the frame from bayer to YCC DoIPIPING( RAW2YUV ,CAP_WIDTH ,CAP_HEIGHT ,CAP_WIDTH ,CAP_HEIGHT ,capbuf_phyaddr ); /* Copy the data to where the encoder can access it */ memcpy( inBuf, ipipebuffer.start, inBufSize ); /* use engine to encode the data */ length = encode(enc, inBuf, encodedBuf ); save( capbuf->start, CAP_HEIGHT * CAP_WIDTH * sizeof( unsigned short ), outFile, "raw" ); save( ipipebuffer.start, CAP_HEIGHT * CAP_WIDTH * sizeof( unsigned short ), outFile, "ycc" ); save( encodedBuf, length, outFile, "jpg" ); end: /* free buffers */ if (encodedBuf) { Memory_contigFree(encodedBuf, encodedBufSize); } if (inBuf) { Memory_contigFree(inBuf, inBufSize); } /* teardown the codec */ if (enc) { IMGENC1_delete(enc); } /* close the engine */ if (ce) { Engine_close(ce); } CloseCaptureDevice(); CloseIpipe(&ipipebuffer); return (0); } /* * ======== encode ======== */ static Int32 encode(IMGENC1_Handle enc, XDAS_Int8 * in, XDAS_Int8 * out ) { Int32 status; IMGENC1_InArgs encInArgs; IMGENC1_OutArgs encOutArgs; IMGENC1_DynamicParams encDynParams; XDM1_BufDesc inBufDesc; XDM1_BufDesc encodedBufDesc; /* initialize buffer descriptors that hold input and output buffers */ inBufDesc.numBufs = 1; inBufDesc.descs[0].bufSize = inBufSize; inBufDesc.descs[0].buf = in; encodedBufDesc.numBufs = 1; encodedBufDesc.descs[0].bufSize = encodedBufSize; encodedBufDesc.descs[0].buf = out; /* the size field of Args and Params structs must be initialized */ encInArgs.size = sizeof(encInArgs); encOutArgs.size = sizeof(encOutArgs); encDynParams.size = sizeof(encDynParams); /* perform the image (JPEG) encoding */ status = IMGENC1_process( enc ,&inBufDesc ,&encodedBufDesc ,&encInArgs ,&encOutArgs ); if (status == IMGENC1_EOK) { GT_2trace(curMask, GT_2CLASS, "Encoder process returned - 0x%x, %d bytes\n", status, encOutArgs.bytesGenerated ); } else { GT_2trace(curMask, GT_7CLASS, "Encoder frame processing FAILED, status = 0x%x, " "extendedError = 0x%x\n", status, encOutArgs.extendedError); } return encOutArgs.bytesGenerated; } void save( void * data, int len, char * basename, char * ext ) { char name[80]; FILE * out; int ret; sprintf( name, "%s.%s", basename, ext ); if ((out = fopen(name, "wb")) == NULL) { fprintf(stderr, "ERROR: can't write to file %s\n", name); } else { ret = fwrite(data, 1, len, out); if ( ret != len ) { fprintf( stderr ,"ERROR: '%s' only wrote %d bytes, expected %d bytes\n" ,name ,ret ,len ); } else { fclose( out ); } } }
_______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
