diff options
| -rw-r--r-- | mm-video/qdsp6/vdec/src/H264_Utils.cpp | 2 | ||||
| -rw-r--r-- | mm-video/qdsp6/vdec/src/omx_vdec.cpp | 67 | ||||
| -rw-r--r-- | mm-video/qdsp6/vdec/src/vdec.cpp | 28 |
3 files changed, 85 insertions, 12 deletions
diff --git a/mm-video/qdsp6/vdec/src/H264_Utils.cpp b/mm-video/qdsp6/vdec/src/H264_Utils.cpp index 78c5f944..141fadb8 100644 --- a/mm-video/qdsp6/vdec/src/H264_Utils.cpp +++ b/mm-video/qdsp6/vdec/src/H264_Utils.cpp @@ -1167,7 +1167,7 @@ bool H264_Utils::parseHeader(uint8 * encodedBytes, } } // If not currently in a NALU, detect next NALU start code. - if ((cursor & 0xFFFFFF) == 0x000001) { + else if ((cursor & 0xFFFFFF) == 0x000001) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_MED, "H264Parser-->26..here\n"); inNalu = true; diff --git a/mm-video/qdsp6/vdec/src/omx_vdec.cpp b/mm-video/qdsp6/vdec/src/omx_vdec.cpp index f3a73fa6..c0132b71 100644 --- a/mm-video/qdsp6/vdec/src/omx_vdec.cpp +++ b/mm-video/qdsp6/vdec/src/omx_vdec.cpp @@ -5482,6 +5482,26 @@ OMX_ERRORTYPE omx_vdec:: m_current_frame->nTimeStamp = -1; } + else if((m_current_arbitrary_bytes_input->nFlags & OMX_BUFFERFLAG_EOS) && + (m_current_arbitrary_bytes_input->nFilledLen == 0) && m_vdec ) + { /* If the current ETB came with EOS with size 0 in partial frame mode + then declare the previous ETB is complete frame and post it to QDSP. */ + unsigned nPortIndex = m_current_frame - ((OMX_BUFFERHEADERTYPE *) m_inp_mem_ptr); + add_entry(nPortIndex); + m_current_frame = get_free_input_buffer(); + if (m_current_frame == NULL) { + QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_HIGH, + "omx_vdec::empty_this_buffer_proxy_arbitrary_bytes, waiting for resource"); + m_bWaitForResource = true; + return OMX_ErrorNone; + } + m_current_frame->pBuffer = m_current_arbitrary_bytes_input->pBuffer + + m_current_arbitrary_bytes_input->nOffset; + m_current_frame->nOffset = 0; + m_current_frame->nFilledLen = 0; + m_current_frame->nTimeStamp = -1; + m_bPartialFrame = false; + } if (!m_vdec) { if (m_vendor_config.pData) { @@ -7947,8 +7967,11 @@ OMX_ERRORTYPE omx_vdec:: } else if (strncmp(m_vdec_cfg.kind, "OMX.qcom.video.decoder.divx", 27) == 0 ) { if(m_codec_format == QOMX_VIDEO_DIVXFormat311) { - m_vdec_cfg.sequenceHeader = NULL; - m_vdec_cfg.sequenceHeaderLen = 0; + m_vdec_cfg.sequenceHeader = + (byte *) malloc(buffer->nFilledLen); + m_vdec_cfg.sequenceHeaderLen = buffer->nFilledLen; + memcpy(m_vdec_cfg.sequenceHeader, buffer->pBuffer, + m_vdec_cfg.sequenceHeaderLen); m_vdec_cfg.fourcc = MAKEFOURCC('D', 'I', 'V', '3'); }else { m_vdec_cfg.sequenceHeader = @@ -7964,6 +7987,9 @@ OMX_ERRORTYPE omx_vdec:: if (strncmp (m_vdec_cfg.kind, "OMX.qcom.video.decoder.avc", 26) == 0) { + QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_MED, + "h.264 clip \n"); + m_vdec_cfg.sequenceHeader = (byte *) malloc(buffer->nFilledLen); m_vdec_cfg.sequenceHeaderLen = @@ -7982,24 +8008,34 @@ OMX_ERRORTYPE omx_vdec:: 28) == 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_MED, "SPARK clip \n"); - m_vdec_cfg.sequenceHeaderLen = 0; - m_vdec_cfg.sequenceHeader = NULL; + m_vdec_cfg.sequenceHeader = + (byte *) malloc(buffer->nFilledLen); + m_vdec_cfg.sequenceHeaderLen = buffer->nFilledLen; + memcpy(m_vdec_cfg.sequenceHeader, buffer->pBuffer, + m_vdec_cfg.sequenceHeaderLen); } else if (strncmp (m_vdec_cfg.kind, "OMX.qcom.video.decoder.h263", 27) == 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_MED, "H263 clip \n"); - m_vdec_cfg.sequenceHeaderLen = 0; - m_vdec_cfg.sequenceHeader = NULL; + m_vdec_cfg.sequenceHeader = + (byte *) malloc(buffer->nFilledLen); + m_vdec_cfg.sequenceHeaderLen = buffer->nFilledLen; + memcpy(m_vdec_cfg.sequenceHeader, buffer->pBuffer, + m_vdec_cfg.sequenceHeaderLen); } else if (strncmp (m_vdec_cfg.kind, "OMX.qcom.video.decoder.vp", 25) == 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_MED, "VP6 clip \n"); - m_vdec_cfg.sequenceHeaderLen = 0; - m_vdec_cfg.sequenceHeader = NULL; + LOGE("seq header len %d",buffer->nFilledLen); + m_vdec_cfg.sequenceHeader = + (byte *) malloc(buffer->nFilledLen); + m_vdec_cfg.sequenceHeaderLen = buffer->nFilledLen; + memcpy(m_vdec_cfg.sequenceHeader, buffer->pBuffer, + m_vdec_cfg.sequenceHeaderLen); } else if (strncmp (m_vdec_cfg.kind, "OMX.qcom.video.decoder.vc1", @@ -8547,6 +8583,19 @@ bool omx_vdec::get_one_complete_frame(OMX_OUT OMX_BUFFERHEADERTYPE * dest) { } mutex_unlock(); if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARYBYTES) { + OMX_BUFFERHEADERTYPE *next_etb_input = (OMX_BUFFERHEADERTYPE *) p2; + /* This check avoids the overwrite of current ETB TimeStamp + with next ETB TimeStamp if next ETB comes with EOS and + zero stream len */ + if((next_etb_input->nFlags & OMX_BUFFERFLAG_EOS)&& + (next_etb_input->nFilledLen == 0)) + { + mutex_lock(); + m_etb_arbitrarybytes_q.insert_entry(p1, p2, ident); + mutex_unlock(); + m_bPartialFrame = false; + break; + } m_current_arbitrary_bytes_input = (OMX_BUFFERHEADERTYPE *) p2; @@ -9927,6 +9976,8 @@ void omx_vdec::fill_extradata(OMX_INOUT OMX_BUFFERHEADERTYPE * pBufHdr, /* khronos standardized way of converying interlaced info */ OMX_STREAMINTERLACEFORMATTYPE *pInterlaceInfo=NULL; + addr += size; + pExtraData = (OMX_OTHER_EXTRADATATYPE *)addr; size = (OMX_EXTRADATA_HEADER_SIZE + sizeof(OMX_STREAMINTERLACEFORMATTYPE) + 3) & (~3); diff --git a/mm-video/qdsp6/vdec/src/vdec.cpp b/mm-video/qdsp6/vdec/src/vdec.cpp index 8cca1f35..67b627ac 100644 --- a/mm-video/qdsp6/vdec/src/vdec.cpp +++ b/mm-video/qdsp6/vdec/src/vdec.cpp @@ -824,17 +824,24 @@ struct VDecoder *vdec_open(struct vdec_context *ctxt) init.seq_header = dec->ctxt->sequenceHeader; init.seq_len = dec->ctxt->sequenceHeaderLen; - if(init.seq_len > VDEC_MAX_SEQ_HEADER_SIZE) - init.seq_len = VDEC_MAX_SEQ_HEADER_SIZE; #if LOG_INPUT_BUFFERS - if(pInputFile) { + if(pInputFile && init.seq_header) { + + /* Divx 3.11 & VP6 bit streams need the frame size before every frame */ + if((MAKEFOURCC('D', 'I', 'V', '3') == dec->ctxt->fourcc ) || !strcmp(dec->ctxt->kind, "OMX.qcom.video.decoder.vp")) + fwrite(&init.seq_len, sizeof(init.seq_len), 1,pInputFile); + fwritex((uint8 *) init.seq_header, init.seq_len, pInputFile); QTV_MSG_PRIO1(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "seq head length %d\n", init.seq_len); } #endif + /* limiting this as DAL packet size is max 512 bytes */ + if(init.seq_len > VDEC_MAX_SEQ_HEADER_SIZE) + init.seq_len = VDEC_MAX_SEQ_HEADER_SIZE; + init.width = dec->ctxt->width; init.height = dec->ctxt->height; @@ -870,10 +877,17 @@ struct VDecoder *vdec_open(struct vdec_context *ctxt) QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_HIGH, "vdec: Opening Divx Decoder \n"); init.order = 1; + if(MAKEFOURCC('D', 'I', 'V', '3') == init.fourcc ){ + init.seq_header = NULL; + init.seq_len = 0; + } }else if (!strcmp(dec->ctxt->kind, "OMX.qcom.video.decoder.h263")) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_HIGH, "vdec: Opening H263 Decoder \n"); init.order = 0; + init.seq_header = NULL; + init.seq_len = 0; + } else if (!strcmp(dec->ctxt->kind, "OMX.qcom.video.decoder.vc1")) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_HIGH, "vdec: Opening VC1 Decoder \n"); @@ -886,6 +900,9 @@ struct VDecoder *vdec_open(struct vdec_context *ctxt) QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_HIGH, "vdec: Opening Spark Decoder \n"); init.order = 0; + init.seq_header = NULL; + init.seq_len = 0; + } else { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "Incorrect codec kind\n"); @@ -1050,6 +1067,11 @@ Vdec_ReturnType vdec_post_input_buffer(struct VDecoder * dec, } #if LOG_INPUT_BUFFERS if(pInputFile) { + + /* Divx 3.11 & VP6 bit streams need the frame size before every frame */ + if((MAKEFOURCC('D', 'I', 'V', '3') == dec->ctxt->fourcc ) || !strcmp(dec->ctxt->kind, "OMX.qcom.video.decoder.vp")) + fwrite(&frame->len, sizeof(frame->len),1,pInputFile); + fwritex((uint8 *) frame->data, frame->len, pInputFile); QTV_MSG_PRIO2(QTVDIAG_GENERAL, QTVDIAG_PRIO_HIGH, "vdec: input buffer %d len %d\n", counter++, frame->len); |
