diff options
author | Mahesh Lanka <mlanka@codeaurora.org> | 2019-12-04 14:51:23 -0800 |
---|---|---|
committer | Paras Nagda <pnagda@codeaurora.org> | 2020-03-23 16:47:04 +0530 |
commit | f033abd081fdc2bc70d4170b95143bb5a394a991 (patch) | |
tree | c4497be26be7e3c19775d160b2f03b2834a1a8c1 | |
parent | ed70ab607c0fbf0f40f307302d087c750197bc4a (diff) | |
download | media-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.h | 7 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp | 103 |
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 |