Loading include/media/stagefright/ACodec.h +18 −0 Original line number Diff line number Diff line Loading @@ -302,6 +302,7 @@ private: bool mTunneled; OMX_INDEXTYPE mDescribeColorAspectsIndex; OMX_INDEXTYPE mDescribeHDRStaticInfoIndex; status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode); status_t allocateBuffersOnPort(OMX_U32 portIndex); Loading Loading @@ -421,6 +422,23 @@ private: // unspecified values. void onDataSpaceChanged(android_dataspace dataSpace, const ColorAspects &aspects); // gets index or sets it to 0 on error. Returns error from codec. status_t initDescribeHDRStaticInfoIndex(); // sets HDR static information for the decoder based on |configFormat|, and // set resulting HDRStaticInfo config into |outputFormat|. Returns error from the codec. status_t setHDRStaticInfoForVideoDecoder( const sp<AMessage> &configFormat, sp<AMessage> &outputFormat); // sets |params|. Returns the codec error. status_t setHDRStaticInfo(const DescribeHDRStaticInfoParams ¶ms); // gets |params|. Returns the codec error. status_t getHDRStaticInfo(DescribeHDRStaticInfoParams ¶ms); // gets HDR static information for the video decoder port and sets them into |format|. status_t getHDRStaticInfoForVideoDecoder(sp<AMessage> &format); typedef struct drcParams { int32_t drcCut; int32_t drcBoost; Loading include/media/stagefright/foundation/ColorUtils.h +7 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,13 @@ struct ColorUtils { // written. static void setColorAspectsIntoFormat( const ColorAspects &aspects, sp<AMessage> &format, bool force = false); // finds HDR metadata in format as HDRStaticInfo, defaulting them to 0. // Return |true| if could find HDR metadata in format. Otherwise, return |false|. static bool getHDRStaticInfoFromFormat(const sp<AMessage> &format, HDRStaticInfo *info); // writes |info| into format. static void setHDRStaticInfoIntoFormat(const HDRStaticInfo &info, sp<AMessage> &format); }; inline static const char *asString(android::ColorUtils::ColorStandard i, const char *def = "??") { Loading media/libstagefright/ACodec.cpp +85 −2 Original line number Diff line number Diff line Loading @@ -521,7 +521,8 @@ ACodec::ACodec() mTimePerCaptureUs(-1ll), mCreateInputBuffersSuspended(false), mTunneled(false), mDescribeColorAspectsIndex((OMX_INDEXTYPE)0) { mDescribeColorAspectsIndex((OMX_INDEXTYPE)0), mDescribeHDRStaticInfoIndex((OMX_INDEXTYPE)0) { mUninitializedState = new UninitializedState(this); mLoadedState = new LoadedState(this); mLoadedToIdleState = new LoadedToIdleState(this); Loading Loading @@ -3186,6 +3187,15 @@ status_t ACodec::setupVideoDecoder( if (err == ERROR_UNSUPPORTED) { // support is optional err = OK; } if (err != OK) { return err; } err = setHDRStaticInfoForVideoDecoder(msg, outputFormat); if (err == ERROR_UNSUPPORTED) { // support is optional err = OK; } return err; } Loading Loading @@ -3216,7 +3226,7 @@ status_t ACodec::setCodecColorAspects(DescribeColorAspectsParams ¶ms, bool v } ALOGW_IF(err == ERROR_UNSUPPORTED && mDescribeColorAspectsIndex, "[%s] getting color aspects failed even though codec advertises support", "[%s] setting color aspects failed even though codec advertises support", mComponentName.c_str()); return err; } Loading Loading @@ -3434,6 +3444,78 @@ status_t ACodec::setInitialColorAspectsForVideoEncoderSurfaceAndGetDataSpace( return err; } status_t ACodec::getHDRStaticInfoForVideoDecoder(sp<AMessage> &format) { DescribeHDRStaticInfoParams params; InitOMXParams(¶ms); params.nPortIndex = kPortIndexOutput; status_t err = getHDRStaticInfo(params); if (err == OK) { // we only set decodec output HDRStaticInfo if codec supports them setHDRStaticInfoIntoFormat(params.sInfo, format); } return err; } status_t ACodec::initDescribeHDRStaticInfoIndex() { status_t err = mOMX->getExtensionIndex( mNode, "OMX.google.android.index.describeHDRStaticInfo", &mDescribeHDRStaticInfoIndex); if (err != OK) { mDescribeHDRStaticInfoIndex = (OMX_INDEXTYPE)0; } return err; } status_t ACodec::setHDRStaticInfoForVideoDecoder( const sp<AMessage> &configFormat, sp<AMessage> &outputFormat) { DescribeHDRStaticInfoParams params; InitOMXParams(¶ms); params.nPortIndex = kPortIndexOutput; HDRStaticInfo *info = ¶ms.sInfo; if (getHDRStaticInfoFromFormat(configFormat, info)) { setHDRStaticInfoIntoFormat(params.sInfo, outputFormat); } (void)initDescribeHDRStaticInfoIndex(); // communicate HDR static Info to codec return setHDRStaticInfo(params); } status_t ACodec::setHDRStaticInfo(const DescribeHDRStaticInfoParams ¶ms) { status_t err = ERROR_UNSUPPORTED; if (mDescribeHDRStaticInfoIndex) { err = mOMX->setConfig(mNode, mDescribeHDRStaticInfoIndex, ¶ms, sizeof(params)); } const HDRStaticInfo *info = ¶ms.sInfo; ALOGV("[%s] setting HDRStaticInfo (R: %u %u, G: %u %u, B: %u, %u, W: %u, %u, " "MaxDispL: %u, MinDispL: %u, MaxContentL: %u, MaxFrameAvgL: %u)", mComponentName.c_str(), info->sType1.mR.x, info->sType1.mR.y, info->sType1.mG.x, info->sType1.mG.y, info->sType1.mB.x, info->sType1.mB.y, info->sType1.mW.x, info->sType1.mW.y, info->sType1.mMaxDisplayLuminance, info->sType1.mMinDisplayLuminance, info->sType1.mMaxContentLightLevel, info->sType1.mMaxFrameAverageLightLevel); ALOGW_IF(err == ERROR_UNSUPPORTED && mDescribeHDRStaticInfoIndex, "[%s] setting HDRStaticInfo failed even though codec advertises support", mComponentName.c_str()); return err; } status_t ACodec::getHDRStaticInfo(DescribeHDRStaticInfoParams ¶ms) { status_t err = ERROR_UNSUPPORTED; if (mDescribeHDRStaticInfoIndex) { err = mOMX->getConfig(mNode, mDescribeHDRStaticInfoIndex, ¶ms, sizeof(params)); } ALOGW_IF(err == ERROR_UNSUPPORTED && mDescribeHDRStaticInfoIndex, "[%s] getting HDRStaticInfo failed even though codec advertises support", mComponentName.c_str()); return err; } status_t ACodec::setupVideoEncoder( const char *mime, const sp<AMessage> &msg, sp<AMessage> &outputFormat, sp<AMessage> &inputFormat) { Loading Loading @@ -4647,6 +4729,7 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { if (mUsingNativeWindow) { notify->setInt32("android._dataspace", dataSpace); } (void)getHDRStaticInfoForVideoDecoder(notify); } else { (void)getInputColorAspectsForVideoEncoder(notify); } Loading media/libstagefright/foundation/ColorUtils.cpp +105 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,8 @@ #define LOG_TAG "ColorUtils" #include <inttypes.h> #include <arpa/inet.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/ALookup.h> #include <media/stagefright/foundation/ColorUtils.h> Loading @@ -29,6 +30,9 @@ namespace android { typedef ColorAspects CA; typedef ColorUtils CU; #define HI_UINT16(a) (((a) >> 8) & 0xFF) #define LO_UINT16(a) ((a) & 0xFF) const static ALookup<CU::ColorRange, CA::Range> sRanges{ { Loading Loading @@ -578,5 +582,105 @@ void ColorUtils::setColorAspectsIntoFormat( transfer, asString((ColorTransfer)transfer)); } // static void ColorUtils::setHDRStaticInfoIntoFormat( const HDRStaticInfo &info, sp<AMessage> &format) { sp<ABuffer> infoBuffer = new ABuffer(25); // Convert the data in infoBuffer to little endian format as defined by CTA-861-3 uint8_t *data = infoBuffer->data(); // Static_Metadata_Descriptor_ID data[0] = info.mID; // display primary 0 data[1] = LO_UINT16(info.sType1.mR.x); data[2] = HI_UINT16(info.sType1.mR.x); data[3] = LO_UINT16(info.sType1.mR.y); data[4] = HI_UINT16(info.sType1.mR.y); // display primary 1 data[5] = LO_UINT16(info.sType1.mG.x); data[6] = HI_UINT16(info.sType1.mG.x); data[7] = LO_UINT16(info.sType1.mG.y); data[8] = HI_UINT16(info.sType1.mG.y); // display primary 2 data[9] = LO_UINT16(info.sType1.mB.x); data[10] = HI_UINT16(info.sType1.mB.x); data[11] = LO_UINT16(info.sType1.mB.y); data[12] = HI_UINT16(info.sType1.mB.y); // white point data[13] = LO_UINT16(info.sType1.mW.x); data[14] = HI_UINT16(info.sType1.mW.x); data[15] = LO_UINT16(info.sType1.mW.y); data[16] = HI_UINT16(info.sType1.mW.y); // MaxDisplayLuminance data[17] = LO_UINT16(info.sType1.mMaxDisplayLuminance); data[18] = HI_UINT16(info.sType1.mMaxDisplayLuminance); // MinDisplayLuminance data[19] = LO_UINT16(info.sType1.mMinDisplayLuminance); data[20] = HI_UINT16(info.sType1.mMinDisplayLuminance); // MaxContentLightLevel data[21] = LO_UINT16(info.sType1.mMaxContentLightLevel); data[22] = HI_UINT16(info.sType1.mMaxContentLightLevel); // MaxFrameAverageLightLevel data[23] = LO_UINT16(info.sType1.mMaxFrameAverageLightLevel); data[24] = HI_UINT16(info.sType1.mMaxFrameAverageLightLevel); format->setBuffer("hdr-static-info", infoBuffer); } // a simple method copied from Utils.cpp static uint16_t U16LE_AT(const uint8_t *ptr) { return ptr[0] | (ptr[1] << 8); } // static bool ColorUtils::getHDRStaticInfoFromFormat(const sp<AMessage> &format, HDRStaticInfo *info) { sp<ABuffer> buf; if (!format->findBuffer("hdr-static-info", &buf)) { return false; } // TODO: Make this more flexible when adding more members to HDRStaticInfo if (buf->size() != 25 /* static Metadata Type 1 size */) { ALOGW("Ignore invalid HDRStaticInfo with size: %zu", buf->size()); return false; } const uint8_t *data = buf->data(); if (*data != HDRStaticInfo::kType1) { ALOGW("Unsupported static Metadata Type %u", *data); return false; } info->mID = HDRStaticInfo::kType1; info->sType1.mR.x = U16LE_AT(&data[1]); info->sType1.mR.y = U16LE_AT(&data[3]); info->sType1.mG.x = U16LE_AT(&data[5]); info->sType1.mG.y = U16LE_AT(&data[7]); info->sType1.mB.x = U16LE_AT(&data[9]); info->sType1.mB.y = U16LE_AT(&data[11]); info->sType1.mW.x = U16LE_AT(&data[13]); info->sType1.mW.y = U16LE_AT(&data[15]); info->sType1.mMaxDisplayLuminance = U16LE_AT(&data[17]); info->sType1.mMinDisplayLuminance = U16LE_AT(&data[19]); info->sType1.mMaxContentLightLevel = U16LE_AT(&data[21]); info->sType1.mMaxFrameAverageLightLevel = U16LE_AT(&data[23]); ALOGV("Got HDRStaticInfo from config (R: %u %u, G: %u %u, B: %u, %u, W: %u, %u, " "MaxDispL: %u, MinDispL: %u, MaxContentL: %u, MaxFrameAvgL: %u)", info->sType1.mR.x, info->sType1.mR.y, info->sType1.mG.x, info->sType1.mG.y, info->sType1.mB.x, info->sType1.mB.y, info->sType1.mW.x, info->sType1.mW.y, info->sType1.mMaxDisplayLuminance, info->sType1.mMinDisplayLuminance, info->sType1.mMaxContentLightLevel, info->sType1.mMaxFrameAverageLightLevel); return true; } } // namespace android Loading
include/media/stagefright/ACodec.h +18 −0 Original line number Diff line number Diff line Loading @@ -302,6 +302,7 @@ private: bool mTunneled; OMX_INDEXTYPE mDescribeColorAspectsIndex; OMX_INDEXTYPE mDescribeHDRStaticInfoIndex; status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode); status_t allocateBuffersOnPort(OMX_U32 portIndex); Loading Loading @@ -421,6 +422,23 @@ private: // unspecified values. void onDataSpaceChanged(android_dataspace dataSpace, const ColorAspects &aspects); // gets index or sets it to 0 on error. Returns error from codec. status_t initDescribeHDRStaticInfoIndex(); // sets HDR static information for the decoder based on |configFormat|, and // set resulting HDRStaticInfo config into |outputFormat|. Returns error from the codec. status_t setHDRStaticInfoForVideoDecoder( const sp<AMessage> &configFormat, sp<AMessage> &outputFormat); // sets |params|. Returns the codec error. status_t setHDRStaticInfo(const DescribeHDRStaticInfoParams ¶ms); // gets |params|. Returns the codec error. status_t getHDRStaticInfo(DescribeHDRStaticInfoParams ¶ms); // gets HDR static information for the video decoder port and sets them into |format|. status_t getHDRStaticInfoForVideoDecoder(sp<AMessage> &format); typedef struct drcParams { int32_t drcCut; int32_t drcBoost; Loading
include/media/stagefright/foundation/ColorUtils.h +7 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,13 @@ struct ColorUtils { // written. static void setColorAspectsIntoFormat( const ColorAspects &aspects, sp<AMessage> &format, bool force = false); // finds HDR metadata in format as HDRStaticInfo, defaulting them to 0. // Return |true| if could find HDR metadata in format. Otherwise, return |false|. static bool getHDRStaticInfoFromFormat(const sp<AMessage> &format, HDRStaticInfo *info); // writes |info| into format. static void setHDRStaticInfoIntoFormat(const HDRStaticInfo &info, sp<AMessage> &format); }; inline static const char *asString(android::ColorUtils::ColorStandard i, const char *def = "??") { Loading
media/libstagefright/ACodec.cpp +85 −2 Original line number Diff line number Diff line Loading @@ -521,7 +521,8 @@ ACodec::ACodec() mTimePerCaptureUs(-1ll), mCreateInputBuffersSuspended(false), mTunneled(false), mDescribeColorAspectsIndex((OMX_INDEXTYPE)0) { mDescribeColorAspectsIndex((OMX_INDEXTYPE)0), mDescribeHDRStaticInfoIndex((OMX_INDEXTYPE)0) { mUninitializedState = new UninitializedState(this); mLoadedState = new LoadedState(this); mLoadedToIdleState = new LoadedToIdleState(this); Loading Loading @@ -3186,6 +3187,15 @@ status_t ACodec::setupVideoDecoder( if (err == ERROR_UNSUPPORTED) { // support is optional err = OK; } if (err != OK) { return err; } err = setHDRStaticInfoForVideoDecoder(msg, outputFormat); if (err == ERROR_UNSUPPORTED) { // support is optional err = OK; } return err; } Loading Loading @@ -3216,7 +3226,7 @@ status_t ACodec::setCodecColorAspects(DescribeColorAspectsParams ¶ms, bool v } ALOGW_IF(err == ERROR_UNSUPPORTED && mDescribeColorAspectsIndex, "[%s] getting color aspects failed even though codec advertises support", "[%s] setting color aspects failed even though codec advertises support", mComponentName.c_str()); return err; } Loading Loading @@ -3434,6 +3444,78 @@ status_t ACodec::setInitialColorAspectsForVideoEncoderSurfaceAndGetDataSpace( return err; } status_t ACodec::getHDRStaticInfoForVideoDecoder(sp<AMessage> &format) { DescribeHDRStaticInfoParams params; InitOMXParams(¶ms); params.nPortIndex = kPortIndexOutput; status_t err = getHDRStaticInfo(params); if (err == OK) { // we only set decodec output HDRStaticInfo if codec supports them setHDRStaticInfoIntoFormat(params.sInfo, format); } return err; } status_t ACodec::initDescribeHDRStaticInfoIndex() { status_t err = mOMX->getExtensionIndex( mNode, "OMX.google.android.index.describeHDRStaticInfo", &mDescribeHDRStaticInfoIndex); if (err != OK) { mDescribeHDRStaticInfoIndex = (OMX_INDEXTYPE)0; } return err; } status_t ACodec::setHDRStaticInfoForVideoDecoder( const sp<AMessage> &configFormat, sp<AMessage> &outputFormat) { DescribeHDRStaticInfoParams params; InitOMXParams(¶ms); params.nPortIndex = kPortIndexOutput; HDRStaticInfo *info = ¶ms.sInfo; if (getHDRStaticInfoFromFormat(configFormat, info)) { setHDRStaticInfoIntoFormat(params.sInfo, outputFormat); } (void)initDescribeHDRStaticInfoIndex(); // communicate HDR static Info to codec return setHDRStaticInfo(params); } status_t ACodec::setHDRStaticInfo(const DescribeHDRStaticInfoParams ¶ms) { status_t err = ERROR_UNSUPPORTED; if (mDescribeHDRStaticInfoIndex) { err = mOMX->setConfig(mNode, mDescribeHDRStaticInfoIndex, ¶ms, sizeof(params)); } const HDRStaticInfo *info = ¶ms.sInfo; ALOGV("[%s] setting HDRStaticInfo (R: %u %u, G: %u %u, B: %u, %u, W: %u, %u, " "MaxDispL: %u, MinDispL: %u, MaxContentL: %u, MaxFrameAvgL: %u)", mComponentName.c_str(), info->sType1.mR.x, info->sType1.mR.y, info->sType1.mG.x, info->sType1.mG.y, info->sType1.mB.x, info->sType1.mB.y, info->sType1.mW.x, info->sType1.mW.y, info->sType1.mMaxDisplayLuminance, info->sType1.mMinDisplayLuminance, info->sType1.mMaxContentLightLevel, info->sType1.mMaxFrameAverageLightLevel); ALOGW_IF(err == ERROR_UNSUPPORTED && mDescribeHDRStaticInfoIndex, "[%s] setting HDRStaticInfo failed even though codec advertises support", mComponentName.c_str()); return err; } status_t ACodec::getHDRStaticInfo(DescribeHDRStaticInfoParams ¶ms) { status_t err = ERROR_UNSUPPORTED; if (mDescribeHDRStaticInfoIndex) { err = mOMX->getConfig(mNode, mDescribeHDRStaticInfoIndex, ¶ms, sizeof(params)); } ALOGW_IF(err == ERROR_UNSUPPORTED && mDescribeHDRStaticInfoIndex, "[%s] getting HDRStaticInfo failed even though codec advertises support", mComponentName.c_str()); return err; } status_t ACodec::setupVideoEncoder( const char *mime, const sp<AMessage> &msg, sp<AMessage> &outputFormat, sp<AMessage> &inputFormat) { Loading Loading @@ -4647,6 +4729,7 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { if (mUsingNativeWindow) { notify->setInt32("android._dataspace", dataSpace); } (void)getHDRStaticInfoForVideoDecoder(notify); } else { (void)getInputColorAspectsForVideoEncoder(notify); } Loading
media/libstagefright/foundation/ColorUtils.cpp +105 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,8 @@ #define LOG_TAG "ColorUtils" #include <inttypes.h> #include <arpa/inet.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/ALookup.h> #include <media/stagefright/foundation/ColorUtils.h> Loading @@ -29,6 +30,9 @@ namespace android { typedef ColorAspects CA; typedef ColorUtils CU; #define HI_UINT16(a) (((a) >> 8) & 0xFF) #define LO_UINT16(a) ((a) & 0xFF) const static ALookup<CU::ColorRange, CA::Range> sRanges{ { Loading Loading @@ -578,5 +582,105 @@ void ColorUtils::setColorAspectsIntoFormat( transfer, asString((ColorTransfer)transfer)); } // static void ColorUtils::setHDRStaticInfoIntoFormat( const HDRStaticInfo &info, sp<AMessage> &format) { sp<ABuffer> infoBuffer = new ABuffer(25); // Convert the data in infoBuffer to little endian format as defined by CTA-861-3 uint8_t *data = infoBuffer->data(); // Static_Metadata_Descriptor_ID data[0] = info.mID; // display primary 0 data[1] = LO_UINT16(info.sType1.mR.x); data[2] = HI_UINT16(info.sType1.mR.x); data[3] = LO_UINT16(info.sType1.mR.y); data[4] = HI_UINT16(info.sType1.mR.y); // display primary 1 data[5] = LO_UINT16(info.sType1.mG.x); data[6] = HI_UINT16(info.sType1.mG.x); data[7] = LO_UINT16(info.sType1.mG.y); data[8] = HI_UINT16(info.sType1.mG.y); // display primary 2 data[9] = LO_UINT16(info.sType1.mB.x); data[10] = HI_UINT16(info.sType1.mB.x); data[11] = LO_UINT16(info.sType1.mB.y); data[12] = HI_UINT16(info.sType1.mB.y); // white point data[13] = LO_UINT16(info.sType1.mW.x); data[14] = HI_UINT16(info.sType1.mW.x); data[15] = LO_UINT16(info.sType1.mW.y); data[16] = HI_UINT16(info.sType1.mW.y); // MaxDisplayLuminance data[17] = LO_UINT16(info.sType1.mMaxDisplayLuminance); data[18] = HI_UINT16(info.sType1.mMaxDisplayLuminance); // MinDisplayLuminance data[19] = LO_UINT16(info.sType1.mMinDisplayLuminance); data[20] = HI_UINT16(info.sType1.mMinDisplayLuminance); // MaxContentLightLevel data[21] = LO_UINT16(info.sType1.mMaxContentLightLevel); data[22] = HI_UINT16(info.sType1.mMaxContentLightLevel); // MaxFrameAverageLightLevel data[23] = LO_UINT16(info.sType1.mMaxFrameAverageLightLevel); data[24] = HI_UINT16(info.sType1.mMaxFrameAverageLightLevel); format->setBuffer("hdr-static-info", infoBuffer); } // a simple method copied from Utils.cpp static uint16_t U16LE_AT(const uint8_t *ptr) { return ptr[0] | (ptr[1] << 8); } // static bool ColorUtils::getHDRStaticInfoFromFormat(const sp<AMessage> &format, HDRStaticInfo *info) { sp<ABuffer> buf; if (!format->findBuffer("hdr-static-info", &buf)) { return false; } // TODO: Make this more flexible when adding more members to HDRStaticInfo if (buf->size() != 25 /* static Metadata Type 1 size */) { ALOGW("Ignore invalid HDRStaticInfo with size: %zu", buf->size()); return false; } const uint8_t *data = buf->data(); if (*data != HDRStaticInfo::kType1) { ALOGW("Unsupported static Metadata Type %u", *data); return false; } info->mID = HDRStaticInfo::kType1; info->sType1.mR.x = U16LE_AT(&data[1]); info->sType1.mR.y = U16LE_AT(&data[3]); info->sType1.mG.x = U16LE_AT(&data[5]); info->sType1.mG.y = U16LE_AT(&data[7]); info->sType1.mB.x = U16LE_AT(&data[9]); info->sType1.mB.y = U16LE_AT(&data[11]); info->sType1.mW.x = U16LE_AT(&data[13]); info->sType1.mW.y = U16LE_AT(&data[15]); info->sType1.mMaxDisplayLuminance = U16LE_AT(&data[17]); info->sType1.mMinDisplayLuminance = U16LE_AT(&data[19]); info->sType1.mMaxContentLightLevel = U16LE_AT(&data[21]); info->sType1.mMaxFrameAverageLightLevel = U16LE_AT(&data[23]); ALOGV("Got HDRStaticInfo from config (R: %u %u, G: %u %u, B: %u, %u, W: %u, %u, " "MaxDispL: %u, MinDispL: %u, MaxContentL: %u, MaxFrameAvgL: %u)", info->sType1.mR.x, info->sType1.mR.y, info->sType1.mG.x, info->sType1.mG.y, info->sType1.mB.x, info->sType1.mB.y, info->sType1.mW.x, info->sType1.mW.y, info->sType1.mMaxDisplayLuminance, info->sType1.mMinDisplayLuminance, info->sType1.mMaxContentLightLevel, info->sType1.mMaxFrameAverageLightLevel); return true; } } // namespace android