summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2010-10-23 05:48:04 +0530
committerSteve Kondik <shade@chemlab.org>2011-04-10 16:57:13 -0400
commit5eae2e9c5f498e58c5684f09936b6b1eec0409a2 (patch)
tree4632592b8943ae42334da373cddc2fdf671140f4
parent688f2b12e16ae186352ee83981351d0e2d742116 (diff)
downloadandroid_hardware_qcom_media-5eae2e9c5f498e58c5684f09936b6b1eec0409a2.tar.gz
android_hardware_qcom_media-5eae2e9c5f498e58c5684f09936b6b1eec0409a2.tar.bz2
android_hardware_qcom_media-5eae2e9c5f498e58c5684f09936b6b1eec0409a2.zip
mm-video:8k:vdec: Additional bugfixes from CodeAuroracm-7.0.0
mm-video:8k:vdec: not able to play h264 streams with 3byte start code. H264 streams can have both 3byte and 4byte start codes, we were not playing the ones with 3byte start code. Bookkeeping of the NALU boundaries is not done correctly for 3byte start code. Change-Id: Ic4268d3dcd97688f3b367a81f44de24791547500 mm-video:8k:vdec: Proper EOS handling for partial frames In arbitrary byte mode if EOS comes immediately after a partial frame then overwriting is happing on the partial frame inputs with EOS and zeros. Avoiding this by checking the EOS flag and input stream length. Change-Id: I8904fee747b10a208281a3ccec0f69e6707ab2f1 CRs-Fixed: 268125 mm-video: 8k: vdec: Fix for frame dimension parameters corruption Pointer to pExtraData of interlace format parameters is not correct. Hence it is corrupting previous pExtraData structure. Change-Id: I397552c4cec04e8d83a1a0c394a60a73c144c3ce CRs-Fixed: 267514 mm-video: 8k: vdec: Fix for garbled video while playing VP6 content using flash Qdsp6 needs the sequence header for arriving at correct width and height also vp6 bit stream needs frame size to be in front of actual frame, this is to be taken care while logging the input bit stream else the logged bit steam cannot be played back. CRs-Fixed: 272236 (cherry picked from commit 46dd15300c5979d7b9a8d2b56532757201851a58) Change-Id: I0a11c362db08db7c1e11fd7737616dcbb894bfd0 mm-video:8k:vdec: EOS handling before video decoder open. browser getting crash with the playback of video clips from flash. fixed by checking whether video decoder opened or not. Change-Id: Ibd45fb4468f6fc47574de40666f433ab013c22ff CRs-Fixed: 275820 273915
-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);