diff options
author | Praveen Chavan <pchavan@codeaurora.org> | 2017-06-07 16:51:28 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-03-21 20:54:34 -0700 |
commit | 0b61c1a2689a1de9cfaf36f593a9ba56c8b440de (patch) | |
tree | d1569fae9cb2fdc91e2f5ae4ecc2b736c8180e08 | |
parent | 9ab537860bf0c6f9ecce0c9d1e37211efaef9afb (diff) | |
download | android_hardware_qcom_media-0b61c1a2689a1de9cfaf36f593a9ba56c8b440de.tar.gz android_hardware_qcom_media-0b61c1a2689a1de9cfaf36f593a9ba56c8b440de.tar.bz2 android_hardware_qcom_media-0b61c1a2689a1de9cfaf36f593a9ba56c8b440de.zip |
mm-video-v4l2: vdec: Fix reporting change in color-space to the client
If the colorspace in bitstream gets updated, the client is notified.
However, when the client comes back to read, it must be notified of
the color-space values from bitstream (if specified) and use
default (client's values) if unspecified.
Exception: For VPX, return the stream colorspace only if client has
unspecified aspects.
Bug: 36373942
CRs-Fixed: 2058039
Change-Id: Ie7c387371c55c655115c040f94f6e712a6c8b322
-rw-r--r-- | mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 2 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp | 44 |
2 files changed, 32 insertions, 14 deletions
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index bcc61816..d1e15ffb 100644 --- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h +++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h @@ -50,6 +50,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <cutils/atomic.h> #include <qdMetaData.h> #include <color_metadata.h> +#define STRINGIFY_ENUMS #include <media/msm_media_info.h> static ptrdiff_t x; @@ -79,6 +80,7 @@ extern "C" { #endif // _ANDROID_ #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) +#define STRINGIFY_ENUMS #include <media/hardware/HardwareAPI.h> #endif 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 2a3829c7..60199546 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp @@ -5500,20 +5500,34 @@ OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; - print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client"); - print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal"); - if (params->bRequestingDataSpace) { DEBUG_PRINT_HIGH("Does not handle dataspace request"); return OMX_ErrorUnsupportedSetting; } - if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) { - DEBUG_PRINT_LOW("Updating Client's color aspects with internal"); - memcpy(&(m_client_color_space.sAspects), - &(m_internal_color_space.sAspects), sizeof(ColorAspects)); - m_internal_color_space.bDataSpaceChanged = OMX_FALSE; - } - memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects)); + + print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client"); + print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal"); + + // For VPX, use client-color if specified. + // For the rest, try to use the stream-color if present + bool preferClientColor = (output_capability == V4L2_PIX_FMT_VP8 || + output_capability == V4L2_PIX_FMT_VP9); + + const ColorAspects &preferredColor = preferClientColor ? + m_client_color_space.sAspects : m_internal_color_space.sAspects; + const ColorAspects &defaultColor = preferClientColor ? + m_internal_color_space.sAspects : m_client_color_space.sAspects; + + params->sAspects.mPrimaries = preferredColor.mPrimaries != ColorAspects::PrimariesUnspecified ? + preferredColor.mPrimaries : defaultColor.mPrimaries; + params->sAspects.mTransfer = preferredColor.mTransfer != ColorAspects::TransferUnspecified ? + preferredColor.mTransfer : defaultColor.mTransfer; + params->sAspects.mMatrixCoeffs = preferredColor.mMatrixCoeffs != ColorAspects::MatrixUnspecified ? + preferredColor.mMatrixCoeffs : defaultColor.mMatrixCoeffs; + params->sAspects.mRange = preferredColor.mRange != ColorAspects::RangeUnspecified ? + preferredColor.mRange : defaultColor.mRange; + + print_debug_color_aspects(&(params->sAspects), "GetConfig"); break; } @@ -11163,9 +11177,10 @@ void omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range, } } -void omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) { - DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d", - prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs); +void omx_vdec::print_debug_color_aspects(ColorAspects *a, const char *prefix) { + DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d(%s) Range = %d(%s) Tx = %d(%s) Matrix = %d(%s)", + prefix, a->mPrimaries, asString(a->mPrimaries), a->mRange, asString(a->mRange), + a->mTransfer, asString(a->mTransfer), a->mMatrixCoeffs, asString(a->mMatrixCoeffs)); } void omx_vdec::prepare_color_aspects_metadata(OMX_U32 primaries, OMX_U32 range, @@ -11277,6 +11292,8 @@ bool omx_vdec::handle_color_space_info(void *data, if (vpx_color_space_payload->color_space == 0) { *color_space = ITU_R_601; + aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525; + aspects->mRange = ColorAspects::RangeLimited; } else { DEBUG_PRINT_ERROR("Unsupported Color space for VP8"); break; @@ -11351,7 +11368,6 @@ bool omx_vdec::handle_color_space_info(void *data, m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs || m_internal_color_space.sAspects.mRange != aspects->mRange) { memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects)); - m_internal_color_space.bDataSpaceChanged = OMX_TRUE; m_color_mdata.colorPrimaries = color_mdata->colorPrimaries; m_color_mdata.range = color_mdata->range; |