mm-video: vdec: Inform native window of color space

Enable and parse the VUI display info extradata to determine
the color space.

Author: Deva Ramasubramanian <dramasub@codeaurora.org>

Bug: 24444518
Change-Id: I7ed4b89a7c7ff792ee63d090e4d8265fc7eb225a
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 9b7095a..120a11d 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -202,6 +202,7 @@
 #define OMX_QP_EXTRADATA        0x00800000
 #define OMX_BITSINFO_EXTRADATA  0x01000000
 #define OMX_MPEG2SEQDISP_EXTRADATA 0x02000000
+#define OMX_VUI_DISPLAY_INFO_EXTRADATA  0x04000000
 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
 
 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
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 22115b3..8600dff 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -128,7 +128,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_VUI_DISPLAY_INFO_EXTRADATA)
 #define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default
 
 
@@ -9116,9 +9116,6 @@
     OMX_U32 recovery_sei_flags = 1;
     int enable = 0;
 
-    //TODO: disable extradata
-    return;
-
     int buf_index = p_buf_hdr - m_out_mem_ptr;
     if (buf_index >= drv_ctx.extradata_info.count) {
         DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
@@ -9290,6 +9287,33 @@
                         p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
                     }
                     break;
+                case MSM_VIDC_EXTRADATA_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;
+
+                    if (client_extradata & OMX_VUI_DISPLAY_INFO_EXTRADATA) {
+                        /* This extradata usually isn't needed by clients. Leave it unimplemented for now */
+                        DEBUG_PRINT_ERROR("VUI display info not propagated to client");
+                    }
+
+                    if (m_enable_android_native_buffers) {
+                        ColorSpace_t color_space = ITU_R_601_FR;
+
+                        switch (display_info_payload->color_primaries) {
+                            case 1:
+                                color_space = ITU_R_709;
+                                break;
+                            case 5:
+                                color_space = display_info_payload->video_full_range_flag ?
+                                    ITU_R_601_FR : ITU_R_601;
+                                break;
+                        }
+
+                        DEBUG_PRINT_LOW("colorspace from VUI = %d", color_space);
+                        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
+                               UPDATE_COLOR_SPACE, (void*)&color_space);
+                    }
+                    break;
                 default:
                     DEBUG_PRINT_LOW("Unrecognized extradata");
                     goto unrecognized_extradata;
@@ -9334,8 +9358,6 @@
         DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
         return OMX_ErrorIncorrectStateOperation;
     }
-    //TODO: disable extradata
-    return ret;
 
     DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d",
             (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal);
@@ -9435,6 +9457,13 @@
                 DEBUG_PRINT_HIGH("Seq display extradata is supported for MPEG2 only");
             }
         }
+        if (requested_extradata & OMX_VUI_DISPLAY_INFO_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set display VUI extradata");
+            }
+        }
     }
     ret = get_buffer_req(&drv_ctx.op_buf);
     return ret;