[x265] [PATCH] Added JsonType enum to differentiate between Legacy and LLC file format
Ashok Kumar Mishra
ashok at multicorewareinc.com
Tue Aug 7 10:01:53 CEST 2018
On Tue, Aug 7, 2018 at 1:30 PM, <ashok at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Ashok Kumar Mishra <ashok at multicorewareinc.com>
> # Date 1533625311 -19800
> # Tue Aug 07 12:31:51 2018 +0530
> # Node ID d17bc7714ed2343b8349ffb32d4037105d086c92
> # Parent eea92165b035db5ebb1f902debba171362fec783
> Added JsonType enum to differentiate between Legacy and LLC file format.
> Added usage of switch inside parameter functions instead of multiple
> condition IF's
>
> diff -r eea92165b035 -r d17bc7714ed2 source/dynamicHDR10/
> metadataFromJson.cpp
> --- a/source/dynamicHDR10/metadataFromJson.cpp Fri Jul 20 14:57:04 2018
> +0530
> +++ b/source/dynamicHDR10/metadataFromJson.cpp Tue Aug 07 12:31:51 2018
> +0530
> @@ -46,132 +46,133 @@
> int mCurrentStreamBit;
> int mCurrentStreamByte;
>
> - bool luminanceParamFromJson(const Json &data, LuminanceParameters
> &obj)
> + bool luminanceParamFromJson(const Json &data, LuminanceParameters
> &obj, const JsonType jsonType)
> {
> JsonObject lumJsonData = data.object_items();
> if(!lumJsonData.empty())
> {
> - obj.averageLuminance = static_cast<float>(
> lumJsonData[LuminanceNames::AverageRGB].number_value());
> - obj.maxRLuminance = static_cast<float>(
> lumJsonData[LuminanceNames::MaxSCL0].number_value());
> - obj.maxGLuminance = static_cast<float>(
> lumJsonData[LuminanceNames::MaxSCL1].number_value());
> - obj.maxBLuminance = static_cast<float>(
> lumJsonData[LuminanceNames::MaxSCL2].number_value());
> + switch(jsonType)
> + {
> + case LEGACY:
> + {
> + obj.averageLuminance =
> static_cast<float>(lumJsonData[LuminanceNames::
> AverageRGB].number_value());
> + obj.maxRLuminance =
> static_cast<float>(lumJsonData[LuminanceNames::MaxSCL0].number_value());
> + obj.maxGLuminance =
> static_cast<float>(lumJsonData[LuminanceNames::MaxSCL1].number_value());
> + obj.maxBLuminance =
> static_cast<float>(lumJsonData[LuminanceNames::MaxSCL2].number_value());
>
> - JsonObject percentileData = lumJsonData[PercentileNames::
> TagName].object_items();
> - obj.order = percentileData[PercentileNames::
> NumberOfPercentiles].int_value();
> - if(!percentileData.empty())
> - {
> - obj.percentiles.resize(obj.order);
> - for(int i = 0; i < obj.order; ++i)
> - {
> - std::string percentileTag = PercentileNames::TagName;
> - percentileTag += std::to_string(i);
> - obj.percentiles[i] = static_cast<unsigned
> int>(percentileData[percentileTag].int_value());
> - }
> - }
> - return true;
> - }
> + JsonObject percentileData =
> lumJsonData[PercentileNames::TagName].object_items();
> + obj.order = percentileData[
> PercentileNames::NumberOfPercentiles].int_value();
> + if(!percentileData.empty())
> + {
> + obj.percentiles.resize(obj.
> order);
> + for(int i = 0; i <
> obj.order; ++i)
> + {
> + std::string
> percentileTag = PercentileNames::TagName;
> + percentileTag +=
> std::to_string(i);
> + obj.percentiles[i]
> = static_cast<unsigned int>(percentileData[percentileTag].int_value());
> + }
> + }
> + return true;
> + } break;
> + case LLC:
> + {
> + obj.averageLuminance =
> static_cast<float>(lumJsonData[LuminanceNames::
> AverageRGB].number_value());
> + JsonArray maxScl =
> lumJsonData[LuminanceNames::MaxSCL].array_items();
> + obj.maxRLuminance =
> static_cast<float>(maxScl[0].number_value());
> + obj.maxGLuminance =
> static_cast<float>(maxScl[1].number_value());
> + obj.maxBLuminance =
> static_cast<float>(maxScl[2].number_value());
> +
> + JsonObject percentileData =
> lumJsonData[LuminanceNames::LlcTagName].object_items();
> + if(!percentileData.empty())
> + {
> + JsonArray
> distributionValues = percentileData[PercentileNames::
> DistributionValues].array_items();
> + obj.order =
> static_cast<int>(distributionValues.size());
> + obj.percentiles.resize(obj.
> order);
> + for(int i = 0; i <
> obj.order; ++i)
> + {
> + obj.percentiles[i]
> = static_cast<unsigned int>(distributionValues[i].int_value());
> + }
> + }
> + return true;
> + } break;
> + }
> + }
> return false;
> }
>
> - bool luminanceParamFromLLCJson(const Json &data, LuminanceParameters
> &obj)
> - {
> - JsonObject lumJsonData = data.object_items();
> - if(!lumJsonData.empty())
> - {
> - obj.averageLuminance = static_cast<float>(
> lumJsonData[LuminanceNames::AverageRGB].number_value());
> - JsonArray maxScl = lumJsonData[LuminanceNames::
> MaxSCL].array_items();
> - obj.maxRLuminance = static_cast<float>(maxScl[0].
> number_value());
> - obj.maxGLuminance = static_cast<float>(maxScl[1].
> number_value());
> - obj.maxBLuminance = static_cast<float>(maxScl[2].
> number_value());
> -
> - JsonObject percentileData = lumJsonData[LuminanceNames::
> LlcTagName].object_items();
> - if(!percentileData.empty())
> - {
> - JsonArray distributionValues = percentileData[
> PercentileNames::DistributionValues].array_items();
> - obj.order = static_cast<int>(distributionValues.size());
> - obj.percentiles.resize(obj.order);
> - for(int i = 0; i < obj.order; ++i)
> - {
> - obj.percentiles[i] = static_cast<unsigned
> int>(distributionValues[i].int_value());
> - }
> - }
> - return true;
> - }
> - return false;
> - }
> -
> - bool percentagesFromJson(const Json &data, std::vector<unsigned int>
> &percentages)
> + bool percentagesFromJson(const Json &data, std::vector<unsigned int>
> &percentages, const JsonType jsonType)
> {
> JsonObject jsonData = data.object_items();
> if(!jsonData.empty())
> {
> - JsonObject percentileData = jsonData[PercentileNames::
> TagName].object_items();
> - int order = percentileData[PercentileNames::
> NumberOfPercentiles].int_value();
> - percentages.resize(order);
> - for(int i = 0; i < order; ++i)
> - {
> - std::string percentileTag = PercentileNames::
> PercentilePercentageValue[i];
> - percentages[i] = static_cast<unsigned int>(percentileData[
> percentileTag].int_value());
> - }
> - return true;
> + switch(jsonType)
> + {
> + case LEGACY:
> + {
> + JsonObject percentileData =
> jsonData[PercentileNames::TagName].object_items();
> + int order = percentileData[
> PercentileNames::NumberOfPercentiles].int_value();
> + percentages.resize(order);
> + for(int i = 0; i < order; ++i)
> + {
> + std::string percentileTag
> = PercentileNames::PercentilePercentageValue[i];
> + percentages[i] =
> static_cast<unsigned int>(percentileData[percentileTag].int_value());
> + }
> + return true;
> + } break;
> + case LLC:
> + {
> + JsonObject percentileData =
> jsonData[LuminanceNames::LlcTagName].object_items();
> + if(!percentileData.empty())
> + {
> + JsonArray percentageValues
> = percentileData[PercentileNames::DistributionIndex].array_items();
> + int order =
> static_cast<int>(percentageValues.size());
> + percentages.resize(order);
> + for(int i = 0; i < order;
> ++i)
> + {
> + percentages[i] =
> static_cast<unsigned int>(percentageValues[i].int_value());
> + }
> + }
> + return true;
> + } break;
> + }
> +
> }
> return false;
> }
>
> - bool percentagesFromLLCJson(const Json &data, std::vector<unsigned
> int> &percentages)
> - {
> - JsonObject lumJsonData = data.object_items();
> - if(!lumJsonData.empty())
> - {
> - JsonObject percentileData = lumJsonData[LuminanceNames::
> LlcTagName].object_items();
> - if(!percentileData.empty())
> - {
> - JsonArray percentageValues = percentileData[
> PercentileNames::DistributionIndex].array_items();
> - int order = static_cast<int>(percentageValues.size());
> - percentages.resize(order);
> - for(int i = 0; i < order; ++i)
> - {
> - percentages[i] = static_cast<unsigned
> int>(percentageValues[i].int_value());
> - }
> - }
> - return true;
> - }
> - return false;
> - }
> -
> - bool bezierCurveFromJson(const Json &data, BezierCurveData &obj)
> + bool bezierCurveFromJson(const Json &data, BezierCurveData &obj,
> const JsonType jsonType)
> {
> JsonObject jsonData = data.object_items();
> if(!jsonData.empty())
> {
> - obj.sPx = jsonData[BezierCurveNames::KneePointX].int_value();
> - obj.sPy = jsonData[BezierCurveNames::KneePointY].int_value();
> - obj.order = jsonData[BezierCurveNames::
> NumberOfAnchors].int_value();
> - obj.coeff.resize(obj.order);
> - for(int i = 0; i < obj.order; ++i)
> - {
> - obj.coeff[i] = jsonData[BezierCurveNames::
> Anchors[i]].int_value();
> - }
> - return true;
> - }
> - return false;
> - }
> -
> - bool bezierCurveFromLLCJson(const Json &data, BezierCurveData &obj)
> - {
> - JsonObject jsonData = data.object_items();
> - if(!jsonData.empty())
> - {
> - obj.sPx = jsonData[BezierCurveNames::KneePointX].int_value();
> - obj.sPy = jsonData[BezierCurveNames::KneePointY].int_value();
> - JsonArray anchorValues = data[BezierCurveNames::
> AnchorsTag].array_items();
> - obj.order = static_cast<int>(anchorValues.size());
> - obj.coeff.resize(obj.order);
> - for(int i = 0; i < obj.order; ++i)
> - {
> - obj.coeff[i] = anchorValues[i].int_value();
> - }
> - return true;
> + switch(jsonType)
> + {
> + case LEGACY:
> + {
> + obj.sPx = jsonData[BezierCurveNames::
> KneePointX].int_value();
> + obj.sPy =
> jsonData[BezierCurveNames::KneePointY].int_value();
> + obj.order =
> jsonData[BezierCurveNames::NumberOfAnchors].int_value();
> + obj.coeff.resize(obj.order);
> + for(int i = 0; i < obj.order; ++i)
> + {
> + obj.coeff[i] =
> jsonData[BezierCurveNames::Anchors[i]].int_value();
> + }
> + return true;
> + } break;
> + case LLC:
> + {
> + obj.sPx =
> jsonData[BezierCurveNames::KneePointX].int_value();
> + obj.sPy =
> jsonData[BezierCurveNames::KneePointY].int_value();
> + JsonArray anchorValues =
> data[BezierCurveNames::AnchorsTag].array_items();
> + obj.order =
> static_cast<int>(anchorValues.size());
> + obj.coeff.resize(obj.order);
> + for(int i = 0; i < obj.order; ++i)
> + {
> + obj.coeff[i] =
> anchorValues[i].int_value();
> + }
> + return true;
> + } break;
> + }
> }
> return false;
> }
> @@ -256,10 +257,10 @@
> {
> std::string path(filePath);
> JsonArray fileData = JsonHelper::readJsonArray(path);
> - bool isLLCJson = false;
> + JsonType jsonType = LEGACY;
> if(fileData.empty())
> {
> - isLLCJson = true;
> + jsonType = LLC;
> fileData = JsonHelper::readJson(filePath)
> .at("SceneInfo").array_items();
> }
>
> @@ -281,7 +282,7 @@
> mPimpl->mCurrentStreamByte = 1;
> memset(metadata, 0, mSEIBytesToRead);
>
> - fillMetadataArray(fileData, frame, isLLCJson, metadata);
> + fillMetadataArray(fileData, frame, jsonType, metadata);
> mPimpl->setPayloadSize(metadata, 0, mPimpl->mCurrentStreamByte);
> return true;
> }
> @@ -290,11 +291,10 @@
> {
> std::string path(filePath);
> JsonArray fileData = JsonHelper::readJsonArray(path);
> - bool isLLCJson = false;
> -
> + JsonType jsonType = LEGACY;
> if (fileData.empty())
> {
> - isLLCJson = true;
> + jsonType = LLC;
> fileData = JsonHelper::readJson(filePath)
> .at("SceneInfo").array_items();
> }
>
> @@ -307,7 +307,7 @@
> mPimpl->mCurrentStreamBit = 8;
> mPimpl->mCurrentStreamByte = 1;
>
> - fillMetadataArray(fileData, frame, isLLCJson, metadata[frame]);
> + fillMetadataArray(fileData, frame, jsonType, metadata[frame]);
> mPimpl->setPayloadSize(metadata[frame], 0,
> mPimpl->mCurrentStreamByte);
> }
>
> @@ -353,7 +353,7 @@
> /* NOTE: We leave TWO BYTES of space for the payload */
> mPimpl->mCurrentStreamByte += 2;
>
> - fillMetadataArray(fileData, frame, false, metadata);
> + fillMetadataArray(fileData, frame, LEGACY, metadata);
>
> /* Set payload in bytes 2 & 3 as indicated in Extended InfoFrame Type
> syntax */
> metadata[2] = (mPimpl->mCurrentStreamByte & 0xFF00) >> 8;
> @@ -388,7 +388,7 @@
> /* NOTE: We leave TWO BYTES of space for the payload */
> mPimpl->mCurrentStreamByte += 2;
>
> - fillMetadataArray(fileData, frame, false, metadata[frame]);
> + fillMetadataArray(fileData, frame, LEGACY, metadata[frame]);
>
> /* Set payload in bytes 2 & 3 as indicated in Extended InfoFrame
> Type syntax */
> metadata[frame][2] = (mPimpl->mCurrentStreamByte & 0xFF00) >> 8;
> @@ -398,7 +398,7 @@
> return numFrames;
> }
>
> -void metadataFromJson::fillMetadataArray(const JsonArray &fileData, int
> frame, const bool isLLCJson, uint8_t *&metadata)
> +void metadataFromJson::fillMetadataArray(const JsonArray &fileData, int
> frame, const JsonType jsonType, uint8_t *&metadata)
> {
> const uint8_t countryCode = 0xB5;
> const uint16_t terminalProviderCode = 0x003C;
> @@ -415,7 +415,7 @@
>
> uint16_t numWindows = 0;
> /* HDR10+ LLC doesn't consider local windows */
> - if(isLLCJson)
> + if(jsonType & LLC)
> {
> numWindows = 1;
> mPimpl->appendBits(metadata, numWindows, 2);
> @@ -488,8 +488,7 @@
> {
> Json lumObj = fileData[frame][LuminanceNames::TagName];
> LuminanceParameters luminanceData;
> - if(!((isLLCJson && mPimpl->luminanceParamFromLLCJson(lumObj,
> luminanceData)) ||
> - !(mPimpl->luminanceParamFromJson(lumObj, luminanceData) &&
> isLLCJson)))
> + if(!mPimpl->luminanceParamFromJson(lumObj, luminanceData,
> jsonType))
> {
> std::cout << "error parsing luminance parameters frame: " <<
> w << std::endl;
> }
> @@ -511,16 +510,7 @@
> mPimpl->appendBits(metadata, numDistributionMaxrgbPercentiles,
> 4);
>
> std::vector<unsigned int>percentilePercentages;
> -
> - if(isLLCJson)
> - {
> - mPimpl->percentagesFromLLCJson(lumObj,
> percentilePercentages);
> - }
> - else
> - {
> - mPimpl->percentagesFromJson(lumObj, percentilePercentages);
> - }
> -
> + mPimpl->percentagesFromJson(lumObj, percentilePercentages,
> jsonType);
>
> for (int i = 0; i < numDistributionMaxrgbPercentiles; ++i)
> {
> @@ -551,27 +541,24 @@
> /* Bezier Curve Data */
> for (int w = 0; w < numWindows; ++w)
> {
> - uint8_t toneMappingFlag = 1;
> + uint8_t toneMappingFlag = 0;
> /* Check if the window contains tone mapping bezier curve
> data and set toneMappingFlag appropriately */
> - //Json bezierData = fileData[frame][
> BezierCurveNames::TagName];
> BezierCurveData curveData;
> /* Select curve data based on global window */
> if (w == 0)
> - {
> - if(!((isLLCJson && mPimpl->bezierCurveFromLLCJson(
> fileData[frame][BezierCurveNames::TagName], curveData)) ||
> - !(mPimpl->bezierCurveFromJson(fileData[frame][BezierCurveNames::TagName],
> curveData) && isLLCJson)))
> + {
> + if (mPimpl->bezierCurveFromJson(fileData[frame][BezierCurveNames::TagName],
> curveData, jsonType))
> {
> - toneMappingFlag = 0;
> + toneMappingFlag = 1;
> }
> }
> -
> /* Select curve data based on local window */
> else
> {
> JsonArray jsonArray = fileData[frame][JsonDataKeys::
> LocalParameters].array_items();
> - if (!mPimpl->bezierCurveFromJson(jsonArray[w -
> 1][BezierCurveNames::TagName], curveData))
> + if (mPimpl->bezierCurveFromJson(jsonArray[w -
> 1][BezierCurveNames::TagName], curveData, jsonType))
> {
> - toneMappingFlag = 0;
> + toneMappingFlag = 1;
> }
> }
> mPimpl->appendBits(metadata, toneMappingFlag, 1);
> diff -r eea92165b035 -r d17bc7714ed2 source/dynamicHDR10/
> metadataFromJson.h
> --- a/source/dynamicHDR10/metadataFromJson.h Fri Jul 20 14:57:04 2018
> +0530
> +++ b/source/dynamicHDR10/metadataFromJson.h Tue Aug 07 12:31:51 2018
> +0530
> @@ -36,6 +36,11 @@
> metadataFromJson();
> ~metadataFromJson();
>
> + enum JsonType{
> + LEGACY,
> + LLC
> + };
> +
>
> /**
> * @brief frameMetadataFromJson: Generates a sigle frame metadata
> array from Json file with all
> @@ -98,7 +103,7 @@
>
> class DynamicMetaIO;
> DynamicMetaIO *mPimpl;
> - void fillMetadataArray(const JsonArray &fileData, int frame, const
> bool isLLCJson, uint8_t *&metadata);
> + void fillMetadataArray(const JsonArray &fileData, int frame, const
> JsonType jsonType, uint8_t *&metadata);
> };
>
> #endif // METADATAFROMJSON_H
>
Pushed to default.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180807/0eff3f91/attachment-0001.html>
More information about the x265-devel
mailing list