mm-video: vdec: Separate meta buffers support in secure mode

Extradata is appended at the end of the output buffer
in the normal scenario. But in case of secure playback,
we can not parse the input and output buffers,
therefore extradata support is unavailable in this case.
This change adds the extradata support in case of secure
playback. For secure playback,extradata is now dumped
in the separate meta buffers that enables HLOS to read
and parse it.

Change-Id: Ic4358a519f22a121122098908a596be62497efa6
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index db1b7cb..0fd27a5 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -216,6 +216,9 @@
     OMX_U32 pmem_fd;
     /** Offset from pmem device base address */
     OMX_U32 offset;
+    OMX_U32 size;
+    OMX_U32 mapped_size;
+    OMX_PTR buffer;
 }OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO;
 
 typedef struct OMX_QCOM_PLATFORM_PRIVATE_ENTRY
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 750421a..b8a4a34 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -671,6 +671,8 @@
         void append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra);
         void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
         void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
+        void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data);
         void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
                 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload);
         void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
@@ -915,6 +917,7 @@
         bool external_meta_buffer;
         bool external_meta_buffer_iommu;
         OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
+        OMX_OTHER_EXTRADATATYPE *m_other_extradata;
         bool codec_config_flag;
 #ifdef _MSM8974_
         int capture_capability;
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
index d7b732e..f05b059 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -551,6 +551,7 @@
     in_reconfig(false),
     m_display_id(NULL),
     client_extradata(0),
+    m_other_extradata(NULL),
     m_reject_avc_1080p_mp (0),
 #ifdef _ANDROID_
     m_enable_android_native_buffers(OMX_FALSE),
@@ -1485,8 +1486,12 @@
         secure_mode = true;
         arbitrary_bytes = false;
         role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
+    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",
+                OMX_MAX_STRINGNAME_SIZE)) {
+        secure_mode = true;
+        arbitrary_bytes = false;
+        role = "OMX.qcom.video.decoder.mpeg2";
     }
-
     drv_ctx.video_driver_fd = open(device_name, O_RDWR);
 
     DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open returned fd %d",
@@ -1811,8 +1816,7 @@
 #ifdef DEFAULT_EXTRADATA
         if (strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",
                 OMX_MAX_STRINGNAME_SIZE)
-                && (eRet == OMX_ErrorNone)
-                && (!secure_mode))
+                && (eRet == OMX_ErrorNone))
                 enable_extradata(DEFAULT_EXTRADATA, true, true);
 #endif
         eRet = get_buffer_req(&drv_ctx.ip_buf);
@@ -3450,91 +3454,41 @@
                                      break;
                                  }
         case OMX_QcomIndexParamConcealMBMapExtraData:
-                                 if (!secure_mode)
-                                     eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
-                                             ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                                 else {
-                                     DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                     eRet = OMX_ErrorUnsupportedSetting;
-                                 }
-                                 break;
-        case OMX_QcomIndexParamFrameInfoExtraData: {
-                                   if (!secure_mode)
-                                       eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
-                                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                                   else {
-                                       DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                       eRet = OMX_ErrorUnsupportedSetting;
-                                   }
-                                   break;
-                               }
-        case OMX_ExtraDataFrameDimension: {
-            if (!secure_mode)
-                eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false,
-                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
-            else {
-                DEBUG_PRINT_ERROR("secure mode setting not supported");
-                eRet = OMX_ErrorUnsupportedSetting;
-            }
-            break;
-        }
+                               eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               break;
+        case OMX_QcomIndexParamFrameInfoExtraData:
+                               eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               break;
+        case OMX_ExtraDataFrameDimension:
+                               eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               break;
         case OMX_QcomIndexParamInterlaceExtraData:
-                               if (!secure_mode)
-                                   eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
-                                           ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                               else {
-                                   DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                   eRet = OMX_ErrorUnsupportedSetting;
-                               }
+                               eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
                                break;
         case OMX_QcomIndexParamH264TimeInfo:
-                               if (!secure_mode)
-                                   eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
-                                           ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                               else {
-                                   DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                   eRet = OMX_ErrorUnsupportedSetting;
-                               }
+                               eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
                                break;
         case OMX_QcomIndexParamVideoFramePackingExtradata:
-                               if (!secure_mode)
-                                   eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
-                                           ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                               else {
-                                   DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                   eRet = OMX_ErrorUnsupportedSetting;
-                               }
+                               eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
                                break;
-        case OMX_QcomIndexParamVideoQPExtraData: {
-                                   if (!secure_mode)
-                                       eRet = enable_extradata(OMX_QP_EXTRADATA, false,
-                                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                                   else {
-                                       DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                       eRet = OMX_ErrorUnsupportedSetting;
-                                   }
-                                   break;
-                               }
-        case OMX_QcomIndexParamVideoInputBitsInfoExtraData: {
-                                   if (!secure_mode)
-                                       eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
-                                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                                   else {
-                                       DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                       eRet = OMX_ErrorUnsupportedSetting;
-                                   }
-                                   break;
-                               }
-        case OMX_QcomIndexEnableExtnUserData: {
-                                   if (!secure_mode)
-                                       eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
-                                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
-                                   else {
-                                       DEBUG_PRINT_ERROR("secure mode setting not supported");
-                                       eRet = OMX_ErrorUnsupportedSetting;
-                                   }
-                                   break;
-                               }
+        case OMX_QcomIndexParamVideoQPExtraData:
+                               eRet = enable_extradata(OMX_QP_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               break;
+        case OMX_QcomIndexParamVideoInputBitsInfoExtraData:
+                               eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
+                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               break;
+        case OMX_QcomIndexEnableExtnUserData:
+                                eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
+                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                                break;
         case OMX_QcomIndexParamVideoDivx: {
                               QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
                           }
@@ -3590,18 +3544,16 @@
                                    break;
 
         case OMX_QcomIndexParamIndexExtraDataType: {
-                                   if (!secure_mode) {
-                                       QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
-                                       if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
-                                               (extradataIndexType->bEnabled == OMX_TRUE) &&
-                                               (extradataIndexType->nPortIndex == 1)) {
-                                           DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
-                                           eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
+                                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
+                                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
+                                            (extradataIndexType->bEnabled == OMX_TRUE) &&
+                                            (extradataIndexType->nPortIndex == 1)) {
+                                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
+                                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
 
-                                       }
-                                   }
-                               }
-                               break;
+                                    }
+                                }
+                                break;
         case OMX_QcomIndexParamEnableSmoothStreaming: {
 #ifndef SMOOTH_STREAMING_DISABLED
                                       eRet = enable_smoothstreaming();
@@ -4246,6 +4198,13 @@
         }
     }
 #endif
+    if (!m_other_extradata) {
+        m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size);
+        if (!m_other_extradata) {
+            DEBUG_PRINT_ERROR("Failed to alloc memory\n");
+            return OMX_ErrorInsufficientResources;
+        }
+    }
     return OMX_ErrorNone;
 }
 
@@ -4259,6 +4218,10 @@
     }
     memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
 #endif
+    if (m_other_extradata) {
+        free(m_other_extradata);
+        m_other_extradata = NULL;
+    }
 }
 
 OMX_ERRORTYPE  omx_vdec::use_output_buffer(
@@ -4455,6 +4418,9 @@
             }
         m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
         m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+        m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
+        m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
+        m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
 
         *bufferHdr = (m_out_mem_ptr + i );
         if (secure_mode)
@@ -5218,6 +5184,9 @@
                 drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
                 drv_ctx.ptr_outputbuffer[i].bufferaddr =
                     pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+                m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
+                m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
+                m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
 
                 DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p",
                         pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
@@ -7891,7 +7860,7 @@
         alloc_data->flags |= ION_SECURE;
 
     alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
-    if (secure_mode)
+    if (secure_mode && (alloc_data->flags & ION_SECURE))
         alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
     rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
     if (rc || !alloc_data->handle) {
@@ -8623,12 +8592,21 @@
         DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
         return;
     }
-    p_extra = (OMX_OTHER_EXTRADATATYPE *)
-        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
-    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
-    if (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) {
+    if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) {
         DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data");
         p_extra = NULL;
+        return;
+    }
+    if (!secure_mode)
+        p_extra = (OMX_OTHER_EXTRADATATYPE *)
+            ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
+    else
+        p_extra = m_other_extradata;
+    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
+
+    if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
+        p_extra = NULL;
+        return;
     }
     OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
     if (data && p_extra) {
@@ -8676,7 +8654,7 @@
                         setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
                                 PP_PARAM_INTERLACED, (void*)&enable);
                     }
-                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
+                    if (client_extradata & OMX_INTERLACE_EXTRADATA) {
                         append_interlace_extradata(p_extra, payload->format);
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
@@ -8745,7 +8723,7 @@
                 case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING:
                     struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload;
                     s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)data->data;
-                    if (!secure_mode && (client_extradata & OMX_FRAMEPACK_EXTRADATA)) {
+                    if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
                         append_framepack_extradata(p_extra, s3d_frame_packing_payload);
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
@@ -8753,7 +8731,7 @@
                 case MSM_VIDC_EXTRADATA_FRAME_QP:
                     struct msm_vidc_frame_qp_payload *qp_payload;
                     qp_payload = (struct msm_vidc_frame_qp_payload*)data->data;
-                    if (!secure_mode && (client_extradata & OMX_QP_EXTRADATA)) {
+                    if (client_extradata & OMX_QP_EXTRADATA) {
                         append_qp_extradata(p_extra, qp_payload);
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
@@ -8761,13 +8739,13 @@
                 case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO:
                     struct msm_vidc_frame_bits_info_payload *bits_info_payload;
                     bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)data->data;
-                    if (!secure_mode && (client_extradata & OMX_BITSINFO_EXTRADATA)) {
+                    if (client_extradata & OMX_BITSINFO_EXTRADATA) {
                         append_bitsinfo_extradata(p_extra, bits_info_payload);
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
                     break;
                 case MSM_VIDC_EXTRADATA_STREAM_USERDATA:
-                    if (!secure_mode && (client_extradata & OMX_EXTNUSER_EXTRADATA)) {
+                    if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
                         append_user_extradata(p_extra, data);
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
@@ -8779,7 +8757,7 @@
             consumed_len += data->nSize;
             data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
         }
-        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
             p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
             append_frame_info_extradata(p_extra,
                     num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
@@ -8787,16 +8765,23 @@
                         p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
             p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
         }
-        if (!secure_mode && (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) {
+        if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) {
             append_frame_dimension_extradata(p_extra);
             p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
         }
     }
 unrecognized_extradata:
-    if (!secure_mode && client_extradata && p_extra) {
+    if (client_extradata && p_extra) {
         p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
         append_terminator_extradata(p_extra);
     }
+    if (secure_mode) {
+        struct vdec_output_frameinfo  *ptr_extradatabuff = NULL;
+        memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size);
+        ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate;
+        ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata;
+        ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size;
+    }
     return;
 }
 
diff --git a/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp b/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp
index 261baca..f923ab8 100644
--- a/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp
+++ b/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp
@@ -905,7 +905,7 @@
 #endif
             if (pBuffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
                 OMX_OTHER_EXTRADATATYPE *pExtra;
-                DEBUG_PRINT(">> BUFFER WITH EXTRA DATA RCVD <<<");
+                DEBUG_PRINT_ERROR(">> BUFFER WITH EXTRA DATA RCVD <<<");
                 pExtra = (OMX_OTHER_EXTRADATATYPE *)
                     ((unsigned)(pBuffer->pBuffer + pBuffer->nOffset +
                         pBuffer->nFilledLen + 3)&(~3));
@@ -926,7 +926,7 @@
                         case OMX_ExtraDataFrameInfo:
                             {
                                 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtra->data;
-                                DEBUG_PRINT("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
+                                DEBUG_PRINT_ERROR("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
                                         pBuffer->pBuffer, pBuffer->nTimeStamp, frame_info->ePicType,
                                         frame_info->interlaceType, frame_info->nConcealedMacroblocks);
                                 if (aspectratio_prop)
@@ -935,13 +935,13 @@
                                             frame_info->aspectRatio.aspectRatioY, frame_info->displayAspectRatio.displayHorizontalSize,
                                             frame_info->displayAspectRatio.displayVerticalSize);
                                 else
-                                    DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) DispWidth(%u) DispHeight(%u)",
+                                    DEBUG_PRINT_ERROR(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) DispWidth(%u) DispHeight(%u)",
                                             frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
                                             frame_info->aspectRatio.aspectRatioY, frame_info->displayAspectRatio.displayHorizontalSize,
                                             frame_info->displayAspectRatio.displayVerticalSize);
-                                DEBUG_PRINT("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
+                                DEBUG_PRINT_ERROR("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
                                 for (unsigned int i = 0; i < frame_info->panScan.numWindows; i++) {
-                                    DEBUG_PRINT("WINDOW Lft(%d) Tp(%d) Rgt(%d) Bttm(%d)",
+                                    DEBUG_PRINT_ERROR("WINDOW Lft(%d) Tp(%d) Rgt(%d) Bttm(%d)",
                                             frame_info->panScan.window[i].x,
                                             frame_info->panScan.window[i].y,
                                             frame_info->panScan.window[i].dx,
@@ -963,17 +963,17 @@
                                     data_ptr++;
                                     bytes_cnt++;
                                 }
-                                DEBUG_PRINT("OMX_ExtraDataConcealMB: Buf(%p) TSmp(%lld) ConcealMB(%u)",
+                                DEBUG_PRINT_ERROR("OMX_ExtraDataConcealMB: Buf(%p) TSmp(%lld) ConcealMB(%u)",
                                         pBuffer->pBuffer, pBuffer->nTimeStamp, concealMBnum);
                             }
                             break;
                         case OMX_ExtraDataMP2ExtnData:
                             {
-                                DEBUG_PRINT("\nOMX_ExtraDataMP2ExtnData");
+                                DEBUG_PRINT_ERROR("\nOMX_ExtraDataMP2ExtnData");
                                 OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
                                 OMX_U32 bytes_cnt = 0;
                                 while (bytes_cnt < pExtra->nDataSize) {
-                                    DEBUG_PRINT("\n MPEG-2 Extension Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
+                                    DEBUG_PRINT_ERROR("\n MPEG-2 Extension Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
                                     data_ptr++;
                                     bytes_cnt++;
                                 }
@@ -981,11 +981,11 @@
                             break;
                         case OMX_ExtraDataMP2UserData:
                             {
-                                DEBUG_PRINT("\nOMX_ExtraDataMP2UserData");
+                                DEBUG_PRINT_ERROR("\nOMX_ExtraDataMP2UserData");
                                 OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
                                 OMX_U32 bytes_cnt = 0;
                                 while (bytes_cnt < pExtra->nDataSize) {
-                                    DEBUG_PRINT("\n MPEG-2 User Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
+                                    DEBUG_PRINT_ERROR("\n MPEG-2 User Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
                                     data_ptr++;
                                     bytes_cnt++;
                                 }
@@ -2048,26 +2048,45 @@
 #endif
     QOMX_ENABLETYPE extra_data;
     extra_data.bEnable = OMX_TRUE;
-#if 0
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamInterlaceExtraData,
+
+    char frameinfo_value[PROPERTY_VALUE_MAX] = {0};
+    char interlace_value[PROPERTY_VALUE_MAX] = {0};
+    char h264info_value[PROPERTY_VALUE_MAX] = {0};
+    char video_qp_value[PROPERTY_VALUE_MAX] = {0};
+    char videoinput_bitsinfo_value[PROPERTY_VALUE_MAX] = {0};
+
+    OMX_U32 frameinfo = 0,interlace = 0,h264info =0, video_qp =0, videoinput_bitsinfo =0;
+    property_get("vidc.vdec.debug.frameinfo", frameinfo_value, "0");
+    frameinfo = atoi(frameinfo_value);
+    if (frameinfo) {
+        OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamFrameInfoExtraData,
             (OMX_PTR)&extra_data);
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
+    }
+    property_get("vidc.vdec.debug.interlace", interlace_value, "0");
+    interlace = atoi(interlace_value);
+    if (interlace) {
+        OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamInterlaceExtraData,
             (OMX_PTR)&extra_data);
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData,
+    }
+    property_get("vidc.vdec.debug.h264info", h264info_value, "0");
+    h264info = atoi(h264info_value);
+    if (h264info) {
+        OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamH264TimeInfo,
             (OMX_PTR)&extra_data);
-#endif
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata,
+    }
+    property_get("vidc.vdec.debug.video_qp_value", video_qp_value, "0");
+    video_qp = atoi(video_qp_value);
+    if (video_qp) {
+        OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData,
             (OMX_PTR)&extra_data);
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData,
+    }
+    property_get("vidc.vdec.debug.input_bitsinfo", videoinput_bitsinfo_value, "0");
+    videoinput_bitsinfo = atoi(videoinput_bitsinfo_value);
+    if (videoinput_bitsinfo) {
+        OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData,
             (OMX_PTR)&extra_data);
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData,
-            (OMX_PTR)&extra_data);
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamFrameInfoExtraData,
-            (OMX_PTR)&extra_data);
-#ifdef TEST_TS_FROM_SEI
-    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamH264TimeInfo,
-            (OMX_PTR)&extra_data);
-#endif
+    }
+
     /* Query the decoder outport's min buf requirements */
     CONFIG_VERSION_SIZE(portFmt);