mm-video-v4l2: vdec: read color primaries as per H264 spec
Currently not reading range flag, if color_description_present_flag
is not set. But as per H264 spec, bitstream can have valid range
info even if color_description_present_flag is not set. So made
necessay changes to inline with H264 spec.
Change-Id: I549c791e05542803707e4c129bfa8d86b31e9e40
Signed-off-by: Govindaraj Rajagopal <grajagop@codeaurora.org>
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index b666cd6..af4fa47 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -851,7 +851,7 @@
void adjust_timestamp(OMX_S64 &act_timestamp);
void set_frame_rate(OMX_S64 act_timestamp);
bool handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
- void convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
+ void convert_color_space_info(OMX_U32 primaries,
OMX_U32 transfer, OMX_U32 matrix,
ColorAspects *aspects);
bool handle_color_space_info(void *data);
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
index 845581b..37071c4 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -7472,7 +7472,7 @@
prev_ts = act_timestamp;
}
-void omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
+void omx_vdec::convert_color_space_info(OMX_U32 primaries,
OMX_U32 transfer, OMX_U32 matrix, ColorAspects *aspects)
{
switch (primaries) {
@@ -7502,8 +7502,6 @@
break;
}
- aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
-
switch (transfer) {
case MSM_VIDC_TRANSFER_BT709_5:
case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625:
@@ -7586,7 +7584,7 @@
if (seqdisp_payload && seqdisp_payload->color_descp) {
- convert_color_space_info(seqdisp_payload->color_primaries, 0,
+ convert_color_space_info(seqdisp_payload->color_primaries,
seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
aspects);
/* MPEG2 seqdisp payload doesn't give range info. Hence assing the value
@@ -7601,17 +7599,20 @@
case V4L2_PIX_FMT_HEVC:
{
struct msm_vidc_vui_display_info_payload *display_info_payload;
+ OMX_U32 range;
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_char,
- display_info_payload->matrix_coeffs,
- aspects);
+ if (display_info_payload->video_signal_present_flag) {
+ range = display_info_payload->video_full_range_flag;
+ aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
+ if (display_info_payload->color_description_present_flag) {
+ convert_color_space_info(display_info_payload->color_primaries,
+ display_info_payload->transfer_char,
+ display_info_payload->matrix_coeffs,
+ aspects);
+ }
}
}
break;