summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm-video/qdsp6/vdec/src/H264_Utils.cpp2
-rw-r--r--mm-video/qdsp6/vdec/src/omx_vdec.cpp67
-rw-r--r--mm-video/qdsp6/vdec/src/vdec.cpp28
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);