summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMahesh Lanka <mlanka@codeaurora.org>2019-12-04 14:51:23 -0800
committerParas Nagda <pnagda@codeaurora.org>2020-03-23 16:47:04 +0530
commitf033abd081fdc2bc70d4170b95143bb5a394a991 (patch)
treec4497be26be7e3c19775d160b2f03b2834a1a8c1
parented70ab607c0fbf0f40f307302d087c750197bc4a (diff)
downloadmedia-f033abd081fdc2bc70d4170b95143bb5a394a991.tar.gz
mm-video-v4l2: HDR static and dynamic metadata via framework
-- Enable and send HDR static metadata to framework. -- Enable and send HDR dynamic metadata to framework. -- Enable and send color aspects to framework. -- Deprecate sending HDR metadata and color aspects via gralloc path. Change-Id: I9ba1228a3269823803986a68d325768f5e7a6919
-rw-r--r--mm-video-v4l2/vidc/vdec/inc/omx_vdec.h7
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp103
2 files changed, 86 insertions, 24 deletions
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 05b1ce5d..d72d6585 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010 - 2019, The Linux Foundation. All rights reserved.
+Copyright (c) 2010 - 2020, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -1470,12 +1470,15 @@ class omx_vdec: public qc_omx_component
void get_preferred_color_aspects(ColorAspects& preferredColorAspects);
void get_preferred_hdr_info(HDRStaticInfo& preferredHDRInfo);
bool vdec_query_cap(struct v4l2_queryctrl &cap);
- bool store_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusinfo);
+ bool store_vp9_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusinfo);
+ bool store_hevc_hdr10plusinfo(uint32_t payload_size,
+ msm_vidc_stream_userdata_payload *hdr10plusdata);
void update_hdr10plusinfo_cookie_using_timestamp(OMX_PTR cookie, OMX_TICKS timestamp);
void convert_hdr10plusinfo_to_metadata(OMX_PTR cookie, ColorMetaData &colorData);
void remove_hdr10plusinfo_using_cookie(OMX_PTR cookie);
void clear_hdr10plusinfo();
void get_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata);
+ void print_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata);
public:
bool is_down_scalar_enabled;
bool m_is_split_mode;
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 09fea4bf..c8823e63 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010 - 2019, The Linux Foundation. All rights reserved.
+Copyright (c) 2010 - 2020, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -153,14 +153,13 @@ extern "C" {
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
/*
-To enable sending vp9 hdr10plus metadata via private gralloc
-handle to display, define VP9_HDR10PLUS_GRALLOC_PATH_ENABLE
-as 1. This disables sending metadata via framework.
-To enable sending vp9 hdr10plus metadata via framework, define
-VP9_HDR10PLUS_GRALLOC_PATH_ENABLE as 0. This disables sending
-metadata via gralloc handle.
+To enable sending vp9/hevc hdr10plus metadata via private gralloc
+handle to display, define HDR10PLUS_SETMETADATA_ENABLE as 1.This
+disables sending metadata via framework. To enable sending vp9/hevc
+hdr10plus metadata via framework, define HDR10PLUS_SETMETADATA_ENABLE
+as 0. This disables sending metadata via gralloc handle.
*/
-#define VP9HDR10PLUS_SETMETADATA_ENABLE 1
+#define HDR10_SETMETADATA_ENABLE 0
using namespace android;
@@ -1612,8 +1611,9 @@ void omx_vdec::process_event_cb(void *ctxt)
pThis->omx_report_error ();
break;
}
-#if !VP9HDR10PLUS_SETMETADATA_ENABLE
- if (pThis->output_capability != V4L2_PIX_FMT_VP9)
+#if !HDR10_SETMETADATA_ENABLE
+ if (pThis->output_capability != V4L2_PIX_FMT_VP9 &&
+ pThis->output_capability != V4L2_PIX_FMT_HEVC)
break;
if (!pThis->m_cb.EventHandler) {
@@ -5389,7 +5389,7 @@ OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client");
print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal");
get_preferred_color_aspects(params->sAspects);
- print_debug_color_aspects(&(params->sAspects), "GetConfig");
+ print_debug_color_aspects(&(params->sAspects), "Frameworks path GetConfig Color Aspects");
break;
}
@@ -5400,7 +5400,7 @@ OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "GetConfig Client HDR");
print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "GetConfig Internal HDR");
get_preferred_hdr_info(params->sInfo);
- print_debug_hdr_color_info(&(params->sInfo), "GetConfig HDR");
+ print_debug_hdr_color_info(&(params->sInfo), "Frameworks path GetConfig HDR");
break;
}
@@ -5409,6 +5409,7 @@ OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
VALIDATE_OMX_PARAM_DATA(configData, DescribeHDR10PlusInfoParams);
DescribeHDR10PlusInfoParams *params = (DescribeHDR10PlusInfoParams *)configData;
get_hdr10plusinfo(params);
+ print_hdr10plusinfo(params);
break;
}
case OMX_IndexConfigAndroidVendorExtension:
@@ -5611,7 +5612,7 @@ OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
} else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeHDR10PlusInfo) {
VALIDATE_OMX_PARAM_DATA(configData, DescribeHDR10PlusInfoParams);
- if (!store_hdr10plusinfo((DescribeHDR10PlusInfoParams *)configData)) {
+ if (!store_vp9_hdr10plusinfo((DescribeHDR10PlusInfoParams *)configData)) {
DEBUG_PRINT_ERROR("Failed to set hdr10plus info");
}
return ret;
@@ -11517,10 +11518,14 @@ bool omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
(payload_len > HDR_DYNAMIC_META_DATA_SZ)) {
DEBUG_PRINT_ERROR("Invalid User extradata size %u for HDR10+", data->nDataSize);
} else {
+#if HDR10_SETMETADATA_ENABLE
color_mdata.dynamicMetaDataValid = true;
color_mdata.dynamicMetaDataLen = payload_len;
memcpy(color_mdata.dynamicMetaDataPayload, userdata_payload->data, payload_len);
DEBUG_PRINT_HIGH("Copied %u bytes of HDR10+ extradata", payload_len);
+#else
+ store_hevc_hdr10plusinfo(payload_len, userdata_payload);
+#endif
}
}
if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
@@ -11588,15 +11593,15 @@ bool omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
final_color_aspects.mMatrixCoeffs = ColorAspects::MatrixBT601_6;
}
get_preferred_hdr_info(final_hdr_info);
- convert_color_aspects_to_metadata(final_color_aspects, color_mdata);
+#if HDR10_SETMETADATA_ENABLE
convert_hdr_info_to_metadata(final_hdr_info, color_mdata);
-#if VP9HDR10PLUS_SETMETADATA_ENABLE
convert_hdr10plusinfo_to_metadata(p_buf_hdr->pMarkData, color_mdata);
remove_hdr10plusinfo_using_cookie(p_buf_hdr->pMarkData);
-#endif
+ convert_color_aspects_to_metadata(final_color_aspects, color_mdata);
print_debug_hdr_color_info_mdata(&color_mdata);
print_debug_hdr10plus_metadata(color_mdata);
set_colormetadata_in_handle(&color_mdata, buf_index);
+#endif
}
}
@@ -13150,7 +13155,7 @@ bool omx_vdec::prefetch_buffers(unsigned long prefetch_count,
return rc;
}
-bool omx_vdec::store_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
+bool omx_vdec::store_vp9_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
{
struct hdr10plusInfo metadata;
@@ -13199,6 +13204,44 @@ bool omx_vdec::store_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
return true;
}
+bool omx_vdec::store_hevc_hdr10plusinfo(uint32_t payload_size,
+ msm_vidc_stream_userdata_payload *hdr10plusdata)
+{
+ struct hdr10plusInfo metadata;
+
+ if (!hdr10plusdata) {
+ DEBUG_PRINT_ERROR("hdr10plus info not present");
+ return false;
+ }
+
+ if (payload_size > MAX_HDR10PLUSINFO_SIZE ||
+ payload_size < 1) {
+ DEBUG_PRINT_ERROR("Invalid hdr10plus metadata size %u", payload_size);
+ return false;
+ }
+
+ if (output_capability != V4L2_PIX_FMT_HEVC) {
+ DEBUG_PRINT_ERROR("msm_vidc_stream_userdata_payload is not supported for %d codec",
+ output_capability);
+ return false;
+ }
+
+ memset(&metadata, 0, sizeof(struct hdr10plusInfo));
+ metadata.nParamSizeUsed = payload_size;
+ memcpy(metadata.payload, hdr10plusdata->data , payload_size);
+ metadata.is_new = true;
+ if (m_etb_count) {
+ metadata.timestamp = m_etb_timestamp + 1;
+ }
+
+ pthread_mutex_lock(&m_hdr10pluslock);
+ DEBUG_PRINT_LOW("add hevc hdr10plus info to the list with size %u", payload_size);
+ m_hdr10pluslist.push_back(metadata);
+ pthread_mutex_unlock(&m_hdr10pluslock);
+
+ return true;
+}
+
void omx_vdec::update_hdr10plusinfo_cookie_using_timestamp(OMX_PTR markdata, OMX_TICKS timestamp)
{
std::list<hdr10plusInfo>::reverse_iterator iter;
@@ -13206,7 +13249,8 @@ void omx_vdec::update_hdr10plusinfo_cookie_using_timestamp(OMX_PTR markdata, OMX
unsigned int cookie = (unsigned int)(unsigned long)markdata;
bool is_list_empty = false;
- if (output_capability != V4L2_PIX_FMT_VP9)
+ if (output_capability != V4L2_PIX_FMT_VP9 &&
+ output_capability != V4L2_PIX_FMT_HEVC)
return;
pthread_mutex_lock(&m_hdr10pluslock);
@@ -13248,7 +13292,8 @@ void omx_vdec::convert_hdr10plusinfo_to_metadata(OMX_PTR markdata, ColorMetaData
unsigned int cookie = (unsigned int)(unsigned long)markdata;
bool is_list_empty = false;
- if (output_capability != V4L2_PIX_FMT_VP9)
+ if (output_capability != V4L2_PIX_FMT_VP9 &&
+ output_capability != V4L2_PIX_FMT_HEVC)
return;
pthread_mutex_lock(&m_hdr10pluslock);
@@ -13283,7 +13328,8 @@ void omx_vdec::remove_hdr10plusinfo_using_cookie(OMX_PTR markdata)
unsigned int cookie = (unsigned int)(unsigned long)markdata;
bool is_list_empty = false;
- if (output_capability != V4L2_PIX_FMT_VP9)
+ if (output_capability != V4L2_PIX_FMT_VP9 &&
+ output_capability != V4L2_PIX_FMT_HEVC)
return;
pthread_mutex_lock(&m_hdr10pluslock);
@@ -13312,7 +13358,8 @@ void omx_vdec::clear_hdr10plusinfo()
{
bool is_list_empty = false;
- if (output_capability != V4L2_PIX_FMT_VP9)
+ if (output_capability != V4L2_PIX_FMT_VP9 &&
+ output_capability != V4L2_PIX_FMT_HEVC)
return;
pthread_mutex_lock(&m_hdr10pluslock);
@@ -13334,7 +13381,8 @@ void omx_vdec::get_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
std::list<hdr10plusInfo>::iterator iter;
bool is_list_empty = false;
- if (output_capability != V4L2_PIX_FMT_VP9)
+ if (output_capability != V4L2_PIX_FMT_VP9 &&
+ output_capability != V4L2_PIX_FMT_HEVC)
return;
pthread_mutex_lock(&m_hdr10pluslock);
@@ -13363,6 +13411,17 @@ void omx_vdec::get_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
pthread_mutex_unlock(&m_hdr10pluslock);
}
+void omx_vdec::print_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
+{
+ DEBUG_PRINT_LOW("HDR10+ frameworks path valid data length: %d", hdr10plusdata->nParamSizeUsed);
+ for (uint32_t i = 0 ; i < hdr10plusdata->nParamSizeUsed && i+3 < 1024; i=i+4) {
+ DEBUG_PRINT_LOW("HDR10+ mdata: %02X %02X %02X %02X", hdr10plusdata->nValue[i],
+ hdr10plusdata->nValue[i+1],
+ hdr10plusdata->nValue[i+2],
+ hdr10plusdata->nValue[i+3]);
+ }
+}
+
// No code beyond this !
// inline import of vendor-extensions implementation