From 41da192219a5326bdf28139e6e74104d018ff4ea Mon Sep 17 00:00:00 2001 From: Rajeshwar Kurapaty Date: Fri, 1 Mar 2013 13:14:16 +0530 Subject: mm-video: vdec: Notify display about the format of video playback An H.264 clip may have SPS+PPS that indicates the clip is interlaced. However, the subsequent frame data may be progressive. In this case, display is not updated about the progressive content, it continues to display the video as if it was interlaced. With this change, we are now notifying display about the Interlace/Progressive format of video playback by calling setMetaData API for each buffer during handling of Interlace Extradata Change-Id: I0f3f11ba21ffc659b0a54c1494c2aa72fdd367a7 CRs-Fixed: 406941 --- mm-video/vidc/vdec/Android.mk | 2 ++ mm-video/vidc/vdec/inc/omx_vdec.h | 6 ++++++ mm-video/vidc/vdec/src/omx_vdec.cpp | 32 +++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/mm-video/vidc/vdec/Android.mk b/mm-video/vidc/vdec/Android.mk index 47f26ef1..424e50e5 100644 --- a/mm-video/vidc/vdec/Android.mk +++ b/mm-video/vidc/vdec/Android.mk @@ -69,6 +69,7 @@ libmm-vdec-inc += frameworks/av/include/media/stagefright libmm-vdec-inc += hardware/qcom/display/libqservice libmm-vdec-inc += frameworks/av/media/libmediaplayerservice libmm-vdec-inc += frameworks/native/include/binder +libmm-vdec-inc += hardware/qcom/display/libqdutils LOCAL_MODULE := libOmxVdec @@ -82,6 +83,7 @@ LOCAL_SHARED_LIBRARIES := liblog libutils libbinder libcutils libdl LOCAL_SHARED_LIBRARIES += libgenlock LOCAL_SHARED_LIBRARIES += libdivxdrmdecrypt LOCAL_SHARED_LIBRARIES += libqservice +LOCAL_SHARED_LIBRARIES += libqdMetaData LOCAL_SRC_FILES := src/frameparser.cpp LOCAL_SRC_FILES += src/h264_utils.cpp diff --git a/mm-video/vidc/vdec/inc/omx_vdec.h b/mm-video/vidc/vdec/inc/omx_vdec.h index e1fd663c..7de5a371 100644 --- a/mm-video/vidc/vdec/inc/omx_vdec.h +++ b/mm-video/vidc/vdec/inc/omx_vdec.h @@ -84,6 +84,7 @@ extern "C"{ #if defined (_ANDROID_ICS_) #include #include +#include #endif #include @@ -591,8 +592,13 @@ private: void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr); OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true); void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra); +#ifdef _MSM8974_ void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_U32 interlaced_format_type); +#else + void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, + OMX_U32 interlaced_format_type, OMX_U32 buf_index); +#endif void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_U32 num_conceal_mb, OMX_U32 picture_type, diff --git a/mm-video/vidc/vdec/src/omx_vdec.cpp b/mm-video/vidc/vdec/src/omx_vdec.cpp index 2c038762..1b8c5935 100644 --- a/mm-video/vidc/vdec/src/omx_vdec.cpp +++ b/mm-video/vidc/vdec/src/omx_vdec.cpp @@ -4244,6 +4244,12 @@ OMX_ERRORTYPE omx_vdec::use_output_buffer( drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; +#if defined(_ANDROID_ICS_) + if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) { + int enable = 1; + setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable); + } +#endif } else #endif @@ -8469,7 +8475,7 @@ void omx_vdec::handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr) { p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; append_interlace_extradata(p_extra, - ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format); + ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format, index); p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); } if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra && @@ -8659,7 +8665,7 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) { p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; append_interlace_extradata(p_extra, - ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format); + ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format, index); p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); } if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra && @@ -8876,10 +8882,17 @@ void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) } void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, - OMX_U32 interlaced_format_type) + OMX_U32 interlaced_format_type, OMX_U32 buf_index) { OMX_STREAMINTERLACEFORMAT *interlace_format; OMX_U32 mbaff = 0; +#if defined(_ANDROID_ICS_) + OMX_U32 enable = 0; + private_handle_t *handle = NULL; + handle = (private_handle_t *)native_buffer[buf_index].nativehandle; + if(!handle) + DEBUG_PRINT_LOW("%s: Native Buffer handle is NULL",__func__); +#endif extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; extra->nVersion.nVersion = OMX_SPEC_VERSION; extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; @@ -8895,12 +8908,25 @@ void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, interlace_format->bInterlaceFormat = OMX_FALSE; interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; drv_ctx.interlace = VDEC_InterlaceFrameProgressive; +#if defined(_ANDROID_ICS_) + if(handle) + { + setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable); + } +#endif } else { interlace_format->bInterlaceFormat = OMX_TRUE; interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; +#if defined(_ANDROID_ICS_) + enable = 1; + if(handle) + { + setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable); + } +#endif } print_debug_extradata(extra); } -- cgit v1.2.3