mm-video-v4ls-vdec: Add support for color aspects for decoder alone.

Issue: FP2P-432
Issue: FP2P-435
Issue: FP2A10-47
Change-Id: Ibd5b8f2d2795d4241bc3bc413e2209edc0318f42
(cherry picked from commit 81a1e218760b7963503ce9dc435045ed15b10d9a)
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index 514b354..3be7ad3 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -515,6 +515,13 @@
 
     /* OMX.google.android.index.allocateNativeHandle */
     OMX_GoogleAndroidIndexAllocateNativeHandle = 0x7F00005D,
+
+    /* OMX.google.android.index.describeColorAspects */
+    OMX_QTIIndexConfigDescribeColorAspects = 0x7F000062,
+
+    OMX_QTIIndexParamVUIExtraDataExtraData = 0x7F000063,
+
+    OMX_QTIIndexParamMPEG2SeqDispExtraData = 0x7F000064,
 };
 
 /**
@@ -1487,6 +1494,7 @@
 #define OMX_QCOM_INDEX_PARAM_VIDEO_BASE_LAYER_ID "OMX.QCOM.index.param.video.baselayerid"
 #define OMX_QCOM_INDEX_CONFIG_VIDEO_QP "OMX.QCOM.index.config.video.qp"
 #define OMX_QCOM_INDEX_PARAM_VIDEO_SAR "OMX.QCOM.index.param.video.sar"
+#define OMX_QTI_INDEX_CONFIG_COLOR_ASPECTS "OMX.google.android.index.describeColorAspects"
 
 typedef enum {
     QOMX_VIDEO_FRAME_PACKING_CHECKERBOARD = 0,
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 99de795..1f27227 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -48,6 +48,7 @@
 #include <inttypes.h>
 #include <cstddef>
 #include <cutils/atomic.h>
+#include <qdMetaData.h>
 
 static ptrdiff_t x;
 
@@ -192,6 +193,12 @@
 #define OMX_BITSINFO_EXTRADATA  0x01000000
 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
 
+#define OMX_VUI_DISPLAY_INFO_EXTRADATA 0x08000000
+#define OMX_MPEG2_SEQDISP_INFO_EXTRADATA 0x10000000
+
+#define OMX_DISPLAY_INFO_EXTRADATA 0x80000000
+#define DRIVER_EXTRADATA_MASK 0x0000FFFF
+
 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
             sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
@@ -635,6 +642,14 @@
         void set_frame_rate(OMX_S64 act_timestamp);
         void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
         void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+        void convert_color_space_info_to_mpeg2(OMX_U32 primaries, OMX_U32 range,
+            OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space,
+            ColorAspects *aspects);
+        void convert_color_space_info_to_h264(OMX_U32 primaries, OMX_U32 range,
+            OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space,
+            ColorAspects *aspects);
+        void handle_color_space_info(void *data, unsigned int buf_index);
+        void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
         void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
 #ifdef _MSM8974_
         void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
@@ -945,6 +960,9 @@
         bool dynamic_buf_mode;
         struct dynamic_buf_list *out_dynamic_list;
 
+        DescribeColorAspectsParams m_client_color_space;
+        DescribeColorAspectsParams m_internal_color_space;
+
         bool m_smoothstreaming_mode;
         OMX_U32 m_smoothstreaming_width;
         OMX_U32 m_smoothstreaming_height;
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 4ae21b1..c687793 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -124,7 +124,7 @@
 #define EXTRADATA_IDX(__num_planes) (__num_planes  - 1)
 #define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1))
 
-#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
+#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_DISPLAY_INFO_EXTRADATA)
 #define DEFAULT_CONCEAL_COLOR "32896" //0x8080, black by default
 
 int debug_level = PRIO_ERROR;
@@ -645,6 +645,8 @@
     memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
     memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
     memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
+    memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams));
+    memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams));
     m_demux_entries = 0;
     msg_thread_id = 0;
     async_thread_id = 0;
@@ -680,6 +682,18 @@
     m_smoothstreaming_width = 0;
     m_smoothstreaming_height = 0;
     is_q6_platform = false;
+    m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
+    m_client_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
+    m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
+    m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
+    m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
+
+    m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
+    m_internal_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
+    m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
+    m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
+    m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
+    m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams);
 }
 
 static const int event_type[] = {
@@ -1294,6 +1308,8 @@
                                             DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u",
                                                     pThis->rectangle.nLeft, pThis->rectangle.nTop,
                                                     pThis->rectangle.nWidth, pThis->rectangle.nHeight);
+                                        } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) {
+                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects");
                                         } else {
                                             DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2);
                                             break;
@@ -3987,6 +4003,28 @@
                                         rectangle.nWidth, rectangle.nHeight);
                                   break;
                               }
+
+        case OMX_QTIIndexConfigDescribeColorAspects: {
+            VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
+            DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
+
+            print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client");
+            print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal");
+
+            if (params->bRequestingDataSpace) {
+                DEBUG_PRINT_ERROR("Does not handle dataspace request");
+                return OMX_ErrorUnsupportedSetting;
+            }
+            if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) {
+                DEBUG_PRINT_LOW("Updating Client's color aspects with internal");
+                memcpy(&(m_client_color_space.sAspects),
+                        &(m_internal_color_space.sAspects), sizeof(ColorAspects));
+                m_internal_color_space.bDataSpaceChanged = OMX_FALSE;
+            }
+            memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects));
+
+            break;
+        }
         default: {
                  DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
                  eRet = OMX_ErrorBadParameter;
@@ -4147,6 +4185,16 @@
                     rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno));
         }
         return ret;
+    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) {
+        VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
+        DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
+        if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) {
+            enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true);
+        }
+
+        print_debug_color_aspects(&(params->sAspects), "Set Config");
+        memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams));
+        return ret;
     }
 
     return OMX_ErrorNotImplemented;
@@ -4220,6 +4268,9 @@
         *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription;
     }
 #endif
+    else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) {
+        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects;
+    }
     else {
         DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
         return OMX_ErrorNotImplemented;
@@ -8616,6 +8667,187 @@
     }
 }
 
+void omx_vdec::convert_color_space_info_to_mpeg2(OMX_U32 primaries, OMX_U32 range,
+    OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects)
+{
+    DEBUG_PRINT_HIGH(" convert_color_Space_info_to_mpeg2");
+
+    if (primaries == MSM_VIDC_BT709_5 && transfer == MSM_VIDC_TRANSFER_BT709_5 && matrix ==MSM_VIDC_MATRIX_BT_709_5) {
+        DEBUG_PRINT_HIGH("BT709_5");
+        *color_space = ITU_R_709;
+        aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
+        aspects->mRange = m_client_color_space.sAspects.mRange;
+        if (m_client_color_space.sAspects.mTransfer == ColorAspects::TransferUnspecified || m_client_color_space.sAspects.mPrimaries == ColorAspects::PrimariesUnspecified) {
+            DEBUG_PRINT_HIGH("BT709_5 unspecified");
+            aspects->mTransfer = ColorAspects::TransferSRGB;
+            DEBUG_PRINT_LOW("aspects->matrnasfer..%d", aspects->mTransfer);
+        } else {
+            DEBUG_PRINT_HIGH("BT709_5 specified");
+            aspects->mTransfer = ColorAspects::TransferSMPTE170M;
+        }
+    } else if (primaries == MSM_VIDC_BT601_6_625 && transfer == MSM_VIDC_TRANSFER_BT709_5 && matrix == MSM_VIDC_MATRIX_BT_709_5) {
+        DEBUG_PRINT_HIGH("BT601_6_625");
+        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
+        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
+        aspects->mRange = m_client_color_space.sAspects.mRange;
+    } else if (primaries == MSM_VIDC_BT709_5 && transfer == MSM_VIDC_TRANSFER_601_6_525 && matrix ==MSM_VIDC_MATRIX_601_6_525) {
+        DEBUG_PRINT_HIGH("BT60_6_525");
+        *color_space = range ? ITU_R_601_FR : ITU_R_601;
+        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525;
+        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
+        aspects->mRange = m_client_color_space.sAspects.mRange;
+    } else {
+        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
+        aspects->mTransfer = m_client_color_space.sAspects.mTransfer;
+        aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
+        aspects->mRange = m_client_color_space.sAspects.mRange;
+    }
+}
+
+
+void omx_vdec::convert_color_space_info_to_h264(OMX_U32 primaries, OMX_U32 range,
+    OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects)
+{
+    DEBUG_PRINT_HIGH(" convert_color_Space_info_to_h264");
+    aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
+
+    if (primaries == 0 && transfer == 0 && matrix == 0) {
+        DEBUG_PRINT_HIGH("BT709_5 h264");
+        *color_space = ITU_R_709;
+        aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
+    } else if (primaries == MSM_VIDC_BT601_6_625 && transfer == MSM_VIDC_TRANSFER_UNSPECIFIED && matrix == MSM_VIDC_MATRIX_UNSPECIFIED) {
+        DEBUG_PRINT_HIGH("BT601_6_625 h264");
+        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
+        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
+    } else if (primaries == MSM_VIDC_UNSPECIFIED && transfer == MSM_VIDC_TRANSFER_601_6_525 && matrix == MSM_VIDC_MATRIX_601_6_525) {
+        DEBUG_PRINT_HIGH("BT60_6_525 h264");
+        *color_space = range ? ITU_R_601_FR : ITU_R_601;
+        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525;
+        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
+    } else if (primaries == MSM_VIDC_BT709_5 && transfer == MSM_VIDC_TRANSFER_SRGB && matrix == MSM_VIDC_MATRIX_BT_709_5) {
+        DEBUG_PRINT_HIGH("BT709_5 h264 RGB");
+        *color_space = ITU_R_709;
+        aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
+        aspects->mTransfer = ColorAspects::TransferSRGB;
+        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
+    } else {
+        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
+        aspects->mTransfer = m_client_color_space.sAspects.mTransfer;
+        aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
+    }
+}
+
+
+void omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) {
+    DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d",
+        prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs);
+}
+
+void omx_vdec::handle_color_space_info(void *data, unsigned int buf_index)
+{
+    ColorSpace_t color_space = ITU_R_601_FR;
+    ColorAspects tempAspects;
+    memset(&tempAspects, 0x0, sizeof(ColorAspects));
+    ColorAspects *aspects = &tempAspects;
+    DEBUG_PRINT_HIGH("In handle_Color_Space_info");
+    switch (output_capability) {
+        case V4L2_PIX_FMT_MPEG2: {
+            DEBUG_PRINT_HIGH("color space MPEG2");
+            struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
+            seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data;
+
+            DEBUG_PRINT_HIGH("MPEG2 primaries..%d", seqdisp_payload->color_primaries);
+            DEBUG_PRINT_HIGH("MPEG2 transfer_char..%d", seqdisp_payload->transfer_char);
+            //DEBUG_PRINT_HIGH("color_descp..%d", seqdisp_payload->color_descp);
+            DEBUG_PRINT_HIGH("MPEG2 matrix_coeffs..%d", seqdisp_payload->matrix_coeffs);
+            //DEBUG_PRINT_HIGH("disp..hor..size..%d", seqdisp_payload->disp_width);
+            //DEBUG_PRINT_HIGH("dips vert size..%d",seqdisp_payload->disp_height);
+
+            /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to
+             * understand this code */
+            seqdisp_payload->color_descp = 1;
+            if (seqdisp_payload && seqdisp_payload->color_descp) {
+                convert_color_space_info_to_mpeg2(seqdisp_payload->color_primaries, 1,
+                    seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
+                    &color_space,aspects);
+                m_disp_hor_size = seqdisp_payload->disp_width;
+                m_disp_vert_size = seqdisp_payload->disp_height;
+            }
+            break;
+        }
+        case V4L2_PIX_FMT_H264: {
+            DEBUG_PRINT_HIGH("color space H264");
+            struct msm_vidc_vui_display_info_payload *display_info_payload;
+            display_info_payload = (struct msm_vidc_vui_display_info_payload*)data;
+            DEBUG_PRINT_HIGH("H264 primaries..%d", display_info_payload->color_primaries);
+            DEBUG_PRINT_HIGH("H264 transfer_char..%d", display_info_payload->transfer_characteristics);
+            DEBUG_PRINT_HIGH("H264 matrix_coeffs..%d", display_info_payload->matrix_coefficients);
+            DEBUG_PRINT_HIGH("H264 video full range..%d", display_info_payload->video_full_range_flag);
+            DEBUG_PRINT_HIGH("H264 video present flasg..%d", display_info_payload->video_signal_present_flag);
+            DEBUG_PRINT_HIGH("H264 color descp flasg..%d", display_info_payload->color_description_present_flag);
+            /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */
+
+            //if (display_info_payload->video_signal_present_flag &&
+            //    display_info_payload->color_description_present_flag) {
+            convert_color_space_info_to_h264(display_info_payload->color_primaries,
+                display_info_payload->video_full_range_flag,
+                display_info_payload->transfer_characteristics,
+                display_info_payload->matrix_coefficients,
+                &color_space,aspects);
+            //}
+            break;
+        }
+        //case V4L2_PIX_FMT_HEVC: {
+        //    struct msm_vidc_vui_display_info_payload *display_info_payload;
+        //    display_info_payload = (struct msm_vidc_vui_display_info_payload*)data;
+
+        //    /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */
+
+        //    if (display_info_payload->video_signal_present_flag &&
+        //            display_info_payload->color_description_present_flag) {
+        //        convert_color_space_info(display_info_payload->color_primaries,
+        //            display_info_payload->video_full_range_flag,
+        //            display_info_payload->transfer_characteristics,
+        //            display_info_payload->matrix_coefficients,
+        //            &color_space,aspects);
+        //        }
+        //    break;
+        //}
+        case V4L2_PIX_FMT_VC1_ANNEX_G:
+            break;
+
+        default:
+            break;
+    }
+    if (m_enable_android_native_buffers)
+        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
+            UPDATE_COLOR_SPACE, (void*)&color_space);
+
+    print_debug_color_aspects(aspects, "Bitstream");
+
+    if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries ||
+            m_internal_color_space.sAspects.mTransfer != aspects->mTransfer ||
+            m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs ||
+            m_internal_color_space.sAspects.mRange != aspects->mRange) {
+        memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects));
+        m_internal_color_space.bDataSpaceChanged = OMX_TRUE;
+
+        DEBUG_PRINT_HIGH("Initiating PORT Reconfig");
+        print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal");
+        print_debug_color_aspects(&(m_client_color_space.sAspects), "Client");
+
+        post_event(OMX_CORE_OUTPUT_PORT_INDEX,
+                OMX_QTIIndexConfigDescribeColorAspects,
+                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+    }
+}
+
 void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
     OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
@@ -8748,11 +8980,13 @@
                     panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
                     break;
                 case EXTRADATA_MPEG2_SEQDISP:
+                    DEBUG_PRINT_HIGH("in MPEG2 SEQDISP..");
                     struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
                     seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data->data;
                     if (seqdisp_payload) {
                         m_disp_hor_size = seqdisp_payload->disp_width;
                         m_disp_vert_size = seqdisp_payload->disp_height;
+                        handle_color_space_info((void *)data->data, buf_index);
                     }
                     break;
                 case EXTRADATA_S3D_FRAME_PACKING:
@@ -8785,6 +9019,12 @@
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
                     break;
+                case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO:
+                    DEBUG_PRINT_HIGH("in VUI DISPLAY INFO..");
+                    struct msm_vidc_vui_display_info_payload *display_info_payload;
+                    display_info_payload = (struct msm_vidc_vui_display_info_payload*)(void *)data->data;
+                    handle_color_space_info((void *)data->data, buf_index);
+                    break;
                 default:
                     DEBUG_PRINT_LOW("Unrecognized extradata");
                     goto unrecognized_extradata;
@@ -8871,13 +9111,13 @@
             if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
                 DEBUG_PRINT_HIGH("Failed to set panscan extradata");
             }
-            if (output_capability == V4L2_PIX_FMT_MPEG2) {
-                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-                control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
-                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
-                }
-            }
+            //if (output_capability == V4L2_PIX_FMT_MPEG2) {
+            //    control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            //    control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
+            //    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+            //        DEBUG_PRINT_HIGH("Failed to set panscan extradata");
+            //    }
+            //}
         }
         if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
             control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
@@ -8919,6 +9159,33 @@
                 DEBUG_PRINT_HIGH("Failed to set stream userdata extradata");
             }
         }
+        if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            DEBUG_PRINT_HIGH("in enable extradata..");
+            switch(output_capability) {
+                case V4L2_PIX_FMT_H264:
+                    DEBUG_PRINT_HIGH("in H264 extradata..");
+                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
+                    break;
+                case V4L2_PIX_FMT_HEVC:
+                    DEBUG_PRINT_HIGH("in HEVC extradata..");
+                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
+                    break;
+                case V4L2_PIX_FMT_MPEG2:
+                    DEBUG_PRINT_HIGH("in MPEG2 extradata..");
+                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
+                    break;
+                case V4L2_PIX_FMT_VP8:
+                case V4L2_PIX_FMT_VC1_ANNEX_G:
+                default:
+                    DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind);
+                    return ret;
+            }
+
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set Display info extradata");
+            }
+        }
     }
     ret = get_buffer_req(&drv_ctx.op_buf);
     return ret;