diff options
author | Praveen Chavan <pchavan@codeaurora.org> | 2015-10-07 01:56:56 -0700 |
---|---|---|
committer | Chien-Yu Chen <cychen@google.com> | 2015-10-07 16:48:11 -0700 |
commit | 6ee2d713ec3877635f654ba65aa95395e5323eb6 (patch) | |
tree | 95184991ebb3df77b14a3bbce6a0cc572f12342e | |
parent | f615ee7ed76c741a5a6149ae8868690c3d985528 (diff) | |
download | android_hardware_qcom_media-6ee2d713ec3877635f654ba65aa95395e5323eb6.tar.gz android_hardware_qcom_media-6ee2d713ec3877635f654ba65aa95395e5323eb6.tar.bz2 android_hardware_qcom_media-6ee2d713ec3877635f654ba65aa95395e5323eb6.zip |
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
-rw-r--r-- | mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 1 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp | 41 |
2 files changed, 36 insertions, 6 deletions
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index 9b7095aa..120a11dd 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 @@ class VideoHeap : public MemoryHeapBase #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 22115b3d..8600dffc 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 @@ extern "C" { #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 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 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 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 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 @@ OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 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 @@ OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 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; |