diff options
author | Andriy Chepurnyy <x0155536@ti.com> | 2012-11-08 15:06:28 +0200 |
---|---|---|
committer | Daniel Levin <dendy@ti.com> | 2012-11-26 20:17:15 +0200 |
commit | 688b4ebe94e90db255ea2a779bcd110e20bf4fe6 (patch) | |
tree | aeb6ed50ef661e115738bb11b3252c707b09e3be | |
parent | 8315549554d6b10ced4bdda46930b2b1510c2a5e (diff) | |
download | hardware_ti_omap4-688b4ebe94e90db255ea2a779bcd110e20bf4fe6.tar.gz hardware_ti_omap4-688b4ebe94e90db255ea2a779bcd110e20bf4fe6.tar.bz2 hardware_ti_omap4-688b4ebe94e90db255ea2a779bcd110e20bf4fe6.zip |
CameraHAL: Append Huffman Table during using HW MJPEG
Some camera's don't write Huffman Table to MJPEG buffers.
In case of HW MJPEG decoder usage DHT will be added
if it does not exists in buffer.
Change-Id: I12c47d6fdb555a32eeac789b58b481b06c3f82d6
Signed-off-by: Andriy Chepurnyy <x0155536@ti.com>
-rwxr-xr-x | camera/Decoder_libjpeg.cpp | 18 | ||||
-rw-r--r-- | camera/OmxFrameDecoder.cpp | 35 | ||||
-rwxr-xr-x | camera/inc/Decoder_libjpeg.h | 5 | ||||
-rw-r--r-- | camera/inc/OmxFrameDecoder.h | 5 |
4 files changed, 54 insertions, 9 deletions
diff --git a/camera/Decoder_libjpeg.cpp b/camera/Decoder_libjpeg.cpp index 5cdaa11..35c343f 100755 --- a/camera/Decoder_libjpeg.cpp +++ b/camera/Decoder_libjpeg.cpp @@ -166,6 +166,24 @@ int Decoder_libjpeg::readDHTSize() return sizeof(jpeg_odml_dht); } +// 0xFF 0xC4 - DHT (Define Huffman Table) marker +// 0xFF 0xD9 - SOI (Start Of Image) marker +// 0xFF 0xD9 - EOI (End Of Image) marker +// This function return true if if found DHT +bool Decoder_libjpeg::isDhtExist(unsigned char *jpeg_src, int filled_len) { + if (filled_len <= 0) { + return false; + } + + for (int i = 1; i < filled_len; i++) { + if((jpeg_src[i - 1] == 0xFF) && (jpeg_src[i] == 0xC4)) { + CAMHAL_LOGD("Found DHT (Define Huffman Table) marker"); + return true; + } + } + return false; +} + int Decoder_libjpeg::appendDHT(unsigned char *jpeg_src, int filled_len, unsigned char *jpeg_with_dht_buffer, int buff_size) { /* Appending DHT to JPEG */ diff --git a/camera/OmxFrameDecoder.cpp b/camera/OmxFrameDecoder.cpp index bd429c7..be794e5 100644 --- a/camera/OmxFrameDecoder.cpp +++ b/camera/OmxFrameDecoder.cpp @@ -18,6 +18,8 @@ #include "OmxFrameDecoder.h" #include "OMX_TI_IVCommon.h" #include "OMX_TI_Index.h" +#include "Decoder_libjpeg.h" + namespace Ti { namespace Camera { @@ -157,13 +159,14 @@ OMX_ERRORTYPE OmxFrameDecoder::fillBufferDoneCallback(OMX_HANDLETYPE hComponent, OmxFrameDecoder::OmxFrameDecoder(DecoderType type) : mOmxInialized(false), mCurrentState(OmxDecoderState_Unloaded), mPreviousState(OmxDecoderState_Unloaded), - mStopping(false), mDecoderType(type) { + mStopping(false), mDecoderType(type), mIsNeedCheckDHT(true), mAlwaysAppendDHT(false) { } OmxFrameDecoder::~OmxFrameDecoder() { } OMX_ERRORTYPE OmxFrameDecoder::emptyBufferDoneHandler(OMX_BUFFERHEADERTYPE* pBuffHead) { + LOG_FUNCTION_NAME; android::AutoMutex lock(mHwLock); int bufferIndex = reinterpret_cast<int>(pBuffHead->pAppPrivate); @@ -177,6 +180,7 @@ OMX_ERRORTYPE OmxFrameDecoder::emptyBufferDoneHandler(OMX_BUFFERHEADERTYPE* pBuf } OMX_ERRORTYPE OmxFrameDecoder::fillBufferDoneHandler(OMX_BUFFERHEADERTYPE* pBuffHead) { + LOG_FUNCTION_NAME; android::AutoMutex lock(mHwLock); int index = (int)pBuffHead->pAppPrivate; @@ -517,7 +521,6 @@ status_t OmxFrameDecoder::omxGetHandle(OMX_HANDLETYPE *handle, OMX_PTR pAppData, return Utils::ErrorUtils::omxToAndroidError(eError); } - status_t OmxFrameDecoder::omxEmptyThisBuffer(android::sp<MediaBuffer>& inBuffer, OMX_BUFFERHEADERTYPE *pInBufHdr) { LOG_FUNCTION_NAME; @@ -533,10 +536,28 @@ status_t OmxFrameDecoder::omxEmptyThisBuffer(android::sp<MediaBuffer>& inBuffer, CAMHAL_LOGE("Can't copy IN buffer due to it too small %d than needed %d", def.nBufferSize, inBuffer->filledLen); return UNKNOWN_ERROR; } - memcpy(pInBufHdr->pBuffer, reinterpret_cast<unsigned char*>(inBuffer->buffer), inBuffer->filledLen); - CAMHAL_LOGV("Copied %d bytes into In buffer with bh=%p", inBuffer->filledLen, pInBufHdr); + + int filledLen = inBuffer->filledLen; + unsigned char* dataBuffer = reinterpret_cast<unsigned char*>(inBuffer->buffer); + + //If decoder type MJPEG we check if append DHT forced and if true append it + //in other case we check mIsNeedCheckDHT and if true search for DHT in buffer + //if we don't found it - will do append + //once we find that buffer not contain DHT we will append it each time + if ((mDecoderType == DecoderType_MJPEG) && ((mAlwaysAppendDHT) || ((mIsNeedCheckDHT) && + (mIsNeedCheckDHT = !Decoder_libjpeg::isDhtExist(dataBuffer, filledLen))))) { + CAMHAL_LOGV("Will append DHT to buffer"); + Decoder_libjpeg::appendDHT(dataBuffer, filledLen, pInBufHdr->pBuffer, filledLen + Decoder_libjpeg::readDHTSize()); + filledLen += Decoder_libjpeg::readDHTSize(); + mIsNeedCheckDHT = false; + mAlwaysAppendDHT = true; + } else { + memcpy(pInBufHdr->pBuffer, dataBuffer, filledLen); + } + + CAMHAL_LOGV("Copied %d bytes into In buffer with bh=%p", filledLen, pInBufHdr); CAMHAL_LOGV("Empty this buffer id=%d timestamp %lld offset=%d", inBuffer->bufferId, pInBufHdr->nTimeStamp, pInBufHdr->nOffset); - pInBufHdr->nFilledLen = inBuffer->filledLen; + pInBufHdr->nFilledLen = filledLen; pInBufHdr->nTimeStamp = inBuffer->getTimestamp(); pInBufHdr->nFlags = 16; pInBufHdr->nOffset = 0; @@ -972,7 +993,7 @@ void OmxFrameDecoder::doStop() { void OmxFrameDecoder::doFlush() { LOG_FUNCTION_NAME; - + mIsNeedCheckDHT = true; LOG_FUNCTION_NAME_EXIT; } @@ -1047,7 +1068,7 @@ bool OmxFrameDecoder::getPaddedDimensions(size_t &width, size_t &height) { } - CAMHAL_LOGE("WxH updated to padded values : %d x %d", width, height); + CAMHAL_LOGD("WxH updated to padded values : %d x %d", width, height); return true; } diff --git a/camera/inc/Decoder_libjpeg.h b/camera/inc/Decoder_libjpeg.h index 8d5b649..425ebf1 100755 --- a/camera/inc/Decoder_libjpeg.h +++ b/camera/inc/Decoder_libjpeg.h @@ -37,8 +37,9 @@ class Decoder_libjpeg public: Decoder_libjpeg(); ~Decoder_libjpeg(); - int readDHTSize(); - int appendDHT(unsigned char *jpeg_src, int filled_len, unsigned char *jpeg_with_dht_buffer, int buff_size); + static int readDHTSize(); + static bool isDhtExist(unsigned char *jpeg_src, int filled_len); + static int appendDHT(unsigned char *jpeg_src, int filled_len, unsigned char *jpeg_with_dht_buffer, int buff_size); bool decode(unsigned char *jpeg_src, int filled_len, unsigned char *nv12_buffer, int stride); private: diff --git a/camera/inc/OmxFrameDecoder.h b/camera/inc/OmxFrameDecoder.h index bcd9378..7cbbf2c 100644 --- a/camera/inc/OmxFrameDecoder.h +++ b/camera/inc/OmxFrameDecoder.h @@ -192,6 +192,11 @@ private: bool mStopping; DecoderType mDecoderType; + + // If true we will search for DHT in JPEG buffer + bool mIsNeedCheckDHT; + // If true we always append DHT to JPEG buffer + bool mAlwaysAppendDHT; }; } //namespace Camera |