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

Issue: FP2P-432
Issue: FP2P-435
Change-Id: Ibd5b8f2d2795d4241bc3bc413e2209edc0318f42
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index 514b354..b55fc8a 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -515,6 +515,14 @@
 
     /* OMX.google.android.index.allocateNativeHandle */
     OMX_GoogleAndroidIndexAllocateNativeHandle = 0x7F00005D,
+
+   /*"OMX.google.android.index.describeColorAspects"*/
+    OMX_QTIIndexConfigDescribeColorAspects = 0x7F000062,
+
+    OMX_QTIIndexParamVUIExtraDataExtraData = 0x7F000063,
+
+    OMX_QTIIndexParamMPEG2SeqDispExtraData = 0x7F000064,
+
 };
 
 /**
@@ -1487,6 +1495,8 @@
 #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 3580e11..3ceaf12 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,7 +642,15 @@
         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 print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+ 	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,
                 OMX_U32 interlaced_format_type, bool is_mbaff);
@@ -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..b8ba617 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,29 @@
                                         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 +4186,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 +4269,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 +8668,224 @@
     }
 }
 
+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 +9018,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 +9057,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 +9149,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 +9197,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 enbale 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;