分类: LINUX
2011-01-06 19:18:25
Hi, I have made jpeg code in demos, and It seams that JPEG and MPEG4 encoder on our board works fine at the same time. Following is my JPEG code , you can add them into encode demos. /* jpeg.h*/ #include#include > To: <> Cc: "davinci-linux-open-source" <> Sent: Thursday, May 14, 2009 12:20 AM Subject: Re: Can JPEG and MPEG4 run on DM355 simultaneity > Steve Chen wrote: >> On Wed, 2009-05-13 at 23:14 +0800, Jammy Dane wrote: >>> Hi all, >>> >>> I want to run JPEG and MPEG4 encode on DM355 board, and I wrote a >>> demo referencing the code in ../DVSDK_1_00_30_xx/demo/encode/* and the >>> code in ../DVSDK_1_00_30_xx/examples/jpegenc/*. After I run the demo, >>> it said on the terminal: >>> /*********************************************************/ >>> :/opt/dvsdk# ./encode_test_jpeg -v 1.mpeg4 -r 640x576 -b 384000 >>> Encode demo started. >>> gpio control udp socket create ok! >>> the /dev/modem is opened >>> allocate modem buffer >>> fd = 17 >>> Capturing 720x576 video (cropped to 640x576) >>> ERROR: can't open engine image >>> CMEMK Error: GETPHYS: Failed to convert virtual 0x4001cbe0 to physical. >>> CMEM Error: getPhys: Failed to get physical address of 0x4001cbe0 >> >> Don't know much about applications, but 0x400xxxxx seems more like a >> physical rather than virtual address to me. Just a thought... > > no, 0x4001cbe0 is a virtual address > > I doubt you can run JPEG and MPEG4 at the same time, I think they share the HW. > > but, in any case, run with CE_DEBGU=2 > > > _______________________________________________ > Davinci-linux-open-source mailing list > > > -------------- next part -------------- An HTML attachment was scrubbed... URL:#include #include #include #include #include "encode.h" #ifndef __JPEG_H__ #define __JPEG_H__ int jpegEncodeAlgCreate(Engine_Handle hEngine, IMGENC1_Handle *hEncodePtr, int width, int height, int num, XDAS_Int32 *imageBufSize); void jpegencode(IMGENC1_Handle enc, unsigned char *inBuf, unsigned int inBufSize, unsigned char *encodedBuf, unsigned int * encodedBufSize); typedef struct ImageEnv { Rendezvous_Handle hRendezvousInit; Rendezvous_Handle hRendezvousCleanup; Pause_Handle hPause; FifoUtil_Obj inFifo; FifoUtil_Obj outFifo; int imageWidth; int imageHeight; int chcnt; } ImageEnv; void * imageThrFxn(void *arg); #endif /* __JPEG_H__ */ /*jpeg.c*/ /* Standard Linux headers */ #include #include #include #include #include #include #include #include #include #include /* Codec Engine headers */ #include #include #include #include "encode.h" #include "jpeg.h" #include "capture.h" #include "recorder.h" static char *jpegenc_name[MAXCHNUM] = {"jpegenc", "jpegenc:1", "jpegenc:2", "jpegenc:3"}; int jpegEncodeAlgCreate(Engine_Handle hEngine, IMGENC1_Handle *hEncodePtr, int width, int height, int num, XDAS_Int32 *imageBufSize) { IMGENC1_Params image_encParams; IMGENC1_DynamicParams image_dynParams; IMGENC1_Status image_imgStatus; IMGENC1_Handle hEncode; #define SCANS 4 #define QVALUE 73 image_encParams.size = sizeof(IMGENC1_Params); image_encParams.maxWidth = width; image_encParams.maxHeight = height; image_encParams.maxScans = SCANS; image_encParams.dataEndianness = XDM_DEFAULT; image_encParams.forceChromaFormat = XDM_YUV_422ILE; hEncode = IMGENC1_create(hEngine, jpegenc_name[num], &image_encParams); if (NULL == hEncode) { fprintf(stderr, "error: can't open codec jpegenc\n"); seterrdev(ERR_IMGENCCREAT); return FAILURE; } /* set the parameters for encoding */ image_dynParams.size = sizeof(IMGENC1_DynamicParams); image_dynParams.numAU = XDM_DEFAULT; image_dynParams.inputChromaFormat = XDM_YUV_422ILE; image_dynParams.inputWidth = width; image_dynParams.inputHeight = height; image_dynParams.captureWidth = 0; image_dynParams.generateHeader = XDM_ENCODE_AU; image_dynParams.qValue = QVALUE; image_imgStatus.size = sizeof(image_imgStatus); if (IMGENC1_control(hEncode, XDM_SETPARAMS, &image_dynParams, &image_imgStatus) == XDM_EFAIL) { fprintf(stderr, "error: could not set PARAMS: 0x%x\n", XDM_SETPARAMS); seterrdev(ERR_IMGENCCREAT); return FAILURE; } /* ask the codec for buffer sizes - these are typically conservative */ if (IMGENC1_control(hEncode, XDM_GETBUFINFO, &image_dynParams, &image_imgStatus) == XDM_EFAIL) { fprintf(stderr, "error: could not get BUFINFO: 0x%x\n", XDM_GETBUFINFO); seterrdev(ERR_IMGENCCREAT); return FAILURE; } *imageBufSize = image_imgStatus.bufInfo.minOutBufSize[0]; *hEncodePtr = hEncode; return SUCCESS; } void jpegencode(IMGENC1_Handle enc, unsigned char *inBuf, unsigned int inBufSize, unsigned char *encodedBuf, unsigned int *encodedBufSize) { Int32 status; IMGENC1_InArgs encInArgs; IMGENC1_OutArgs encOutArgs; XDM1_BufDesc inBufDesc; XDM1_BufDesc encodedBufDesc; //XDAS_Int32 numRead; /* initialize buffer descriptors that hold input and output buffers */ inBufDesc.numBufs = 1; inBufDesc.descs[0].bufSize = inBufSize; inBufDesc.descs[0].buf = inBuf; encodedBufDesc.numBufs = 1; encodedBufDesc.descs[0].bufSize = *encodedBufSize; encodedBufDesc.descs[0].buf = encodedBuf; /* the size field of Args and Params structs must be initialized */ encInArgs.size = sizeof(encInArgs); encOutArgs.size = sizeof(encOutArgs); /* perform the image (JPEG) encoding */ status = IMGENC1_process(enc, &inBufDesc, &encodedBufDesc, &encInArgs, &encOutArgs); if (status == IMGENC1_EOK) { *encodedBufSize = encOutArgs.bytesGenerated; } else { printf( "Encoder frame processing FAILED, status = 0x%lx, " "extendedError = 0x%lx\n", status, encOutArgs.extendedError); seterrdev(ERR_IMGENCPROC); } } void * imageThrFxn(void *arg) { Engine_Handle hEngine_en = NULL; ImageEnv *envp = (ImageEnv *) arg; void *status = THREAD_SUCCESS; int imgWidth = envp->imageWidth/(envp->chcnt>1?2:1); int imgHeight = envp->imageHeight/(envp->chcnt>1?2:1); int ch; CaptureBufferElement ce; /* Reset, load, and starot DSP Engine */ hEngine_en = Engine_open("image", NULL, NULL); if (hEngine_en == NULL) { ERR("Failed to open encode engine %s\n", "image"); seterrdev(ERR_ENGINEOPNE); cleanup(THREAD_FAILURE); } DBG("Encode Engine opened in jpeg thread\n"); // here for mjpeg IMGENC1_Handle image_enc = NULL; XDAS_Int8 *image_encodedBuf[MAXCHNUM] = {NULL}; XDAS_Int32 image_encodedBufSize = 0; XDAS_Int32 image_BufSize[MAXCHNUM]; if(FAILURE == jpegEncodeAlgCreate(hEngine_en, &image_enc, imgWidth, imgHeight, 0, &image_encodedBufSize)) { cleanup(THREAD_FAILURE); } printf("image_encodedBufSize: %lu\n", image_encodedBufSize); image_encodedBuf[0] = (XDAS_Int8 *)Memory_contigAlloc(image_encodedBufSize*(envp->chcnt>1?4:1), Memory_DEFAULTALIGNMENT); if (image_encodedBuf[0] == NULL) { fprintf(stderr, "image_encodedBuf[0] alloc failed!\n"); seterrdev(ERR_SYSTEM); cleanup(THREAD_FAILURE); } for(ch=1; ch chcnt) image_encodedBuf[ch] = image_encodedBuf[0] + ch*image_encodedBufSize; else image_encodedBuf[ch] = NULL; } DBG("Image encoder created.\n"); /* Signal that initialization is done and wait for other threads */ Rendezvous_meet(envp->hRendezvousInit); DBG("Entering jpeg main loop.\n"); while (!gblGetQuit()) { /* Get a buffer from the capture thread */ if (FifoUtil_get(&envp->inFifo, &ce) == FIFOUTIL_FAILURE) { ERR("Failed to put buffer in output fifo\n"); seterrdev(ERR_SYSTEM); breakLoop(THREAD_FAILURE); } /* Is the capture thread flushing the pipe? */ if (ce.id == CAPTURE_FLUSH) { ERR("Receive Flush and Break fifo\n"); breakLoop(THREAD_SUCCESS); } ms_time_t nTime = ce.nTime; //it's time get yuv data time; /* Encode the captured video frame */ char *virtBuf = ce.virtBuf; //int bufSize = ce.bufSize/(envp->chcnt>1?4:1); int bufSize = imgWidth*imgHeight*SCREEN_BPP/8; for(ch=0; ch chcnt; ch++) { virtBuf = ce.virtBuf + bufSize*ch; //here for jpegenc image_BufSize[ch] = image_encodedBufSize; jpegencode(image_enc, virtBuf, bufSize, image_encodedBuf[ch], (unsigned int *)&image_BufSize[ch]); //printf(".............. jpeg size %lu\n", image_BufSize[ch]); } writeJpegData(image_encodedBuf, image_BufSize, nTime); #if 0 /* Send the buffer back to the capture thread */ if (FifoUtil_put(&envp->outFifo, &ce) == FIFOUTIL_FAILURE) { ERR("Failed to put buffer in output fifo\n"); breakLoop(THREAD_FAILURE); } #endif } DBG("Exitted jpeg main loop.\n"); cleanup: /* Make sure the other threads aren't waiting for init to complete */ Rendezvous_force(envp->hRendezvousInit); /* Make sure the other threads aren't stuck pausing */ Pause_off(envp->hPause); #if 0 /* Make sure the capture thread isn't stuck in FifoUtil_get() */ FifoUtil_put(&envp->outFifo, &cFlush); #endif /* Meet up with other threads before cleaning up */ Rendezvous_meet(envp->hRendezvousCleanup); if (image_enc) { IMGENC1_delete(image_enc); } if (image_encodedBuf[0]) { Memory_contigFree(image_encodedBuf[0], image_encodedBufSize*(envp->chcnt>1?4:1)); } if (hEngine_en) { Engine_close(hEngine_en); } return status; } ----- Original Message ----- From: "Vladimir Pantelic" <