// this function passed the jpeg image buffer in, and returns the decoded // image int decodeImage(OPENMAX_JPEG_DECODER * decoder, char *sourceImage, size_t imageSize) { char *sourceOffset = sourceImage; // we store a seperate // buffer ot image so we // can offset it size_t toread = 0; // bytes left to read from buffer toread += imageSize; int bFilled = 0; // have we filled our output // buffer bufferIndex = 0; while (toread > 0) { // get next buffer from array OMX_BUFFERHEADERTYPE *pBufHeader = decoder->ppInputBufferHeader[bufferIndex]; // step index and reset to 0 if required bufferIndex++; if (bufferIndex >= decoder->inputBufferHeaderCount) bufferIndex = 0; // work out the next chunk to load into the decoder if (toread > pBufHeader->nAllocLen) pBufHeader->nFilledLen = pBufHeader->nAllocLen; else pBufHeader->nFilledLen = toread; toread = toread - pBufHeader->nFilledLen; // pass the bytes to the buffer memcpy(pBufHeader->pBuffer, sourceOffset, pBufHeader->nFilledLen); printf("Read into buffer %d\n", pBufHeader->nFilledLen); // update the buffer pointer and set the input flags sourceOffset = sourceOffset + pBufHeader->nFilledLen; pBufHeader->nOffset = 0; pBufHeader->nFlags = 0; if (toread <= 0) { pBufHeader->nFlags = OMX_BUFFERFLAG_EOS; printf("Added EOS to last inout buffer\n"); } // empty the current buffer printf("Emptying buffer\n"); int ret = OMX_EmptyThisBuffer(decoder->imageDecoder->handle, pBufHeader); if (ret != OMX_ErrorNone) { perror("Empty input buffer"); fprintf(stderr, "return code %x\n", ret); return OMXJPEG_ERROR_MEMORY; } // wait for buffer to empty or port changed event int done = 0; while ((done == 0) || (decoder->pOutputBufferHeader == NULL)) { if (decoder->pOutputBufferHeader == NULL) { ret = ilclient_wait_for_event (decoder->imageDecoder->component, OMX_EventPortSettingsChanged, decoder->imageDecoder->outPort, 0, 0, 1, 0, 5); if (ret == 0) { portSettingsChanged(decoder); } } else { ret = ilclient_remove_event(decoder->imageDecoder->component, OMX_EventPortSettingsChanged, decoder->imageDecoder->outPort, 0, 0, 1); if (ret == 0) portSettingsChangedAgain(decoder); } // check to see if buffer is now empty if (pBufHeader->nFilledLen == 0) done = 1; if ((done == 0) || (decoder->pOutputBufferHeader == NULL)) { printf("Buffer is now size %d\n", pBufHeader->nFilledLen); sleep(1); } } // fill the buffer if we have created the buffer if (bFilled == 0) { if ((decoder->pOutputBufferHeader == NULL)) { portSettingsChanged(decoder); } OMX_PARAM_U32TYPE param; param.nSize = sizeof(OMX_PARAM_U32TYPE); param.nVersion.nVersion = OMX_VERSION; param.nPortIndex = decoder->imageDecoder->outPort; OMX_GetParameter(decoder->imageDecoder->handle, OMX_IndexParamActiveStream, ¶m); printf("Active stream %d\n", param.nU32); printf("Trying to fill output buffer\n"); printState(decoder->imageDecoder->handle); ret = OMX_FillThisBuffer(decoder->imageDecoder->handle, decoder->pOutputBufferHeader); if (ret != OMX_ErrorNone) { perror("Filling output buffer"); fprintf(stderr, "Error code %x\n", ret); return OMXJPEG_ERROR_MEMORY; } bFilled = 1; } } // wait for buffer to fill /* * while(pBufHeader->nFilledLen == 0) { sleep(5); } */ // wait for end of stream events int ret = ilclient_wait_for_event(decoder->imageDecoder->component, OMX_EventBufferFlag, decoder->imageDecoder->outPort, 1, OMX_BUFFERFLAG_EOS, 1, 0, 2); if (ret != 0) { fprintf(stderr, "No EOS event on image decoder %d\n", ret); } else { fprintf(stderr, "EOS event on image decoder %d\n", ret); } printf("Resized %d\n", decoder->pOutputBufferHeader->nFilledLen); FILE *fp = fopen("out", "w"); int n; for (n = 0; n < decoder->pOutputBufferHeader->nFilledLen; n++) { //fputc(decoder->pOutputBufferHeader->pBuffer[n], fp); fputc(decoder->ppRenderInputBufferHeader[0]->pBuffer[n], fp); } fclose(fp); printf("File written\n"); renderImage(decoder); return OMXJPEG_OK; }
// this function passed the jpeg image buffer in, and returns the decoded // image int decodeImage(OPENMAX_JPEG_DECODER * decoder, char *sourceImage, size_t imageSize) { char *sourceOffset = sourceImage; // we store a seperate // buffer ot image so we // can offset it size_t toread = 0; // bytes left to read from buffer toread += imageSize; int bFilled = 0; // have we filled our output // buffer bufferIndex = 0; while (toread > 0) { // get next buffer from array OMX_BUFFERHEADERTYPE *pBufHeader = decoder->ppInputBufferHeader[bufferIndex]; // step index and reset to 0 if required bufferIndex++; if (bufferIndex >= decoder->inputBufferHeaderCount) bufferIndex = 0; // work out the next chunk to load into the decoder if (toread > pBufHeader->nAllocLen) pBufHeader->nFilledLen = pBufHeader->nAllocLen; else pBufHeader->nFilledLen = toread; toread = toread - pBufHeader->nFilledLen; // pass the bytes to the buffer memcpy(pBufHeader->pBuffer, sourceOffset, pBufHeader->nFilledLen); // update the buffer pointer and set the input flags sourceOffset = sourceOffset + pBufHeader->nFilledLen; pBufHeader->nOffset = 0; pBufHeader->nFlags = 0; if (toread <= 0) { pBufHeader->nFlags = OMX_BUFFERFLAG_EOS; } // empty the current buffer int ret = OMX_EmptyThisBuffer(decoder->imageDecoder->handle, pBufHeader); if (ret != OMX_ErrorNone) { perror("Empty input buffer"); fprintf(stderr, "return code %x\n", ret); return OMXJPEG_ERROR_MEMORY; } // wait for buffer to empty or port changed event int done = 0; while ((done == 0) && (decoder->pOutputBufferHeader == NULL)) { if (decoder->pOutputBufferHeader == NULL) { ret = ilclient_wait_for_event (decoder->imageDecoder->component, OMX_EventPortSettingsChanged, decoder->imageDecoder->outPort, 0, 0, 1, 0, 5); if (ret == 0) { ret = portSettingsChanged(decoder); if (ret != OMXJPEG_OK) return ret; } } else { ret = ilclient_remove_event(decoder->imageDecoder->component, OMX_EventPortSettingsChanged, decoder->imageDecoder->outPort, 0, 0, 1); if (ret == 0) portSettingsChangedAgain(decoder); } // check to see if buffer is now empty if (pBufHeader->nFilledLen == 0) done = 1; if ((done == 0) || (decoder->pOutputBufferHeader == NULL)) sleep(1); } // fill the buffer if we have created the buffer if ((bFilled == 0) && (decoder->pOutputBufferHeader != NULL)) { ret = OMX_FillThisBuffer(decoder->imageResizer->handle, decoder->pOutputBufferHeader); if (ret != OMX_ErrorNone) { perror("Filling output buffer"); fprintf(stderr, "Error code %x\n", ret); return OMXJPEG_ERROR_MEMORY; } bFilled = 1; } } // wait for buffer to fill /* * while(pBufHeader->nFilledLen == 0) { sleep(5); } */ // wait for end of stream events int ret = ilclient_wait_for_event(decoder->imageDecoder->component, OMX_EventBufferFlag, decoder->imageDecoder->outPort, 1, OMX_BUFFERFLAG_EOS, 1, 0, 2); if (ret != 0) { fprintf(stderr, "No EOS event on image decoder %d\n", ret); } ret = ilclient_wait_for_event(decoder->imageResizer->component, OMX_EventBufferFlag, decoder->imageResizer->outPort, 1, OMX_BUFFERFLAG_EOS, 1, 0, 2); if (ret != 0) { fprintf(stderr, "No EOS event on image resizer %d\n", ret); } return OMXJPEG_OK; }