[x265] [PATCH] Added support for the new HDR10+ LLC JSON format injection inside dynamicHDR10 library

Ashok Kumar Mishra ashok at multicorewareinc.com
Mon Jul 16 08:45:30 CEST 2018


On Thu, Jul 12, 2018 at 5:54 PM, <ashok at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Ashok Kumar Mishra <ashok at multicorewareinc.com>
> # Date 1531377840 -19800
> #      Thu Jul 12 12:14:00 2018 +0530
> # Node ID 7763d20f092a208904b3ae3ec1762441d1573696
> # Parent  8bf51aa8a1708fa106c225db2d6671ede0ad29b0
> Added support for the new HDR10+ LLC JSON format injection inside
> dynamicHDR10 library.
>
> diff -r 8bf51aa8a170 -r 7763d20f092a source/dynamicHDR10/
> SeiMetadataDictionary.cpp
> --- a/source/dynamicHDR10/SeiMetadataDictionary.cpp     Thu Jul 12
> 17:23:26 2018 +0800
> +++ b/source/dynamicHDR10/SeiMetadataDictionary.cpp     Thu Jul 12
> 12:14:00 2018 +0530
> @@ -34,6 +34,7 @@
>  const std::string BezierCurveNames::NumberOfAnchors =
> std::string("NumberOfAnchors");
>  const std::string BezierCurveNames::KneePointX =
> std::string("KneePointX");
>  const std::string BezierCurveNames::KneePointY =
> std::string("KneePointY");
> +const std::string BezierCurveNames::AnchorsTag = std::string("Anchors");
>  const std::string BezierCurveNames::Anchors[] = {std::string("Anchor0"),
>                                                   std::string("Anchor1"),
>                                                   std::string("Anchor2"),
> @@ -69,6 +70,8 @@
>
>  const std::string PercentileNames::TagName = std::string("
> PercentileLuminance");
>  const std::string PercentileNames::NumberOfPercentiles = std::string("
> NumberOfPercentiles");
> +const std::string PercentileNames::DistributionIndex = std::string("
> DistributionIndex");
> +const std::string PercentileNames::DistributionValues = std::string("
> DistributionValues");
>  const std::string PercentileNames::PercentilePercentageValue[] =
> {std::string("PercentilePercentage0"),
>
>  std::string("PercentilePercentage1"),
>
>  std::string("PercentilePercentage2"),
> @@ -104,7 +107,9 @@
>
>
>  const std::string LuminanceNames::TagName = std::string("
> LuminanceParameters");
> +const std::string LuminanceNames::LlcTagName = std::string("
> LuminanceDistributions");
>  const std::string LuminanceNames::AverageRGB = std::string("AverageRGB");
> +const std::string LuminanceNames::MaxSCL = std::string("MaxScl");
>  const std::string LuminanceNames::MaxSCL0 = std::string("MaxScl0");
>  const std::string LuminanceNames::MaxSCL1 = std::string("MaxScl1");
>  const std::string LuminanceNames::MaxSCL2 = std::string("MaxScl2");
> diff -r 8bf51aa8a170 -r 7763d20f092a source/dynamicHDR10/
> SeiMetadataDictionary.h
> --- a/source/dynamicHDR10/SeiMetadataDictionary.h       Thu Jul 12
> 17:23:26 2018 +0800
> +++ b/source/dynamicHDR10/SeiMetadataDictionary.h       Thu Jul 12
> 12:14:00 2018 +0530
> @@ -48,6 +48,7 @@
>          static const std::string NumberOfAnchors;
>          static const std::string KneePointX;
>          static const std::string KneePointY;
> +        static const std::string AnchorsTag;
>          static const std::string Anchors[14];
>      };
>      //Ellipse Selection Data
> @@ -79,6 +80,8 @@
>          public:
>          static const std::string TagName;
>          static const std::string NumberOfPercentiles;
> +        static const std::string DistributionIndex;
> +        static const std::string DistributionValues;
>          static const std::string PercentilePercentageValue[15];
>          static const std::string PercentileLuminanceValue[15];
>      };
> @@ -87,7 +90,9 @@
>      {
>          public:
>          static const std::string TagName;
> +        static const std::string LlcTagName;
>          static const std::string AverageRGB;
> +        static const std::string MaxSCL;
>          static const std::string MaxSCL0;
>          static const std::string MaxSCL1;
>          static const std::string MaxSCL2;
> diff -r 8bf51aa8a170 -r 7763d20f092a source/dynamicHDR10/
> metadataFromJson.cpp
> --- a/source/dynamicHDR10/metadataFromJson.cpp  Thu Jul 12 17:23:26 2018
> +0800
> +++ b/source/dynamicHDR10/metadataFromJson.cpp  Thu Jul 12 12:14:00 2018
> +0530
> @@ -51,14 +51,13 @@
>          JsonObject lumJsonData = data.object_items();
>          if(!lumJsonData.empty())
>          {
> -            JsonObject percentileData = lumJsonData[PercentileNames::
> TagName].object_items();
> -            obj.order = percentileData[PercentileNames::
> NumberOfPercentiles].int_value();
> -
>              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);
> @@ -69,7 +68,33 @@
>                      obj.percentiles[i] = static_cast<unsigned
> int>(percentileData[percentileTag].int_value());
>                  }
>              }
> +            return true;
> +        }
> +        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 = 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;
> @@ -82,33 +107,33 @@
>          {
>              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;
>          }
>          return false;
>      }
>
> -    bool percentagesFromJson(const Json &data, unsigned int *percentages)
> +    bool percentagesFromLLCJson(const Json &data, std::vector<unsigned
> int> &percentages)
>      {
> -        JsonObject jsonData = data.object_items();
> -        if(!jsonData.empty())
> -        {
> -            JsonObject percentileData = jsonData[PercentileNames::
> TagName].object_items();
> -            int order = percentileData[PercentileNames::
> NumberOfPercentiles].int_value();
> -
> -            for(int i = 0; i < order; ++i)
> +        JsonObject lumJsonData = data.object_items();
> +        if(!lumJsonData.empty())
> +        {
> +            JsonObject percentileData = lumJsonData[LuminanceNames::
> LlcTagName].object_items();
> +            if(!percentileData.empty())
>              {
> -                std::string percentileTag = PercentileNames::
> PercentilePercentageValue[i];
> -                percentages[i] = static_cast<unsigned int>(percentileData[
> percentileTag].int_value());
> +                JsonArray percentageValues = percentileData[
> PercentileNames::DistributionIndex].array_items();
> +                int order = 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;
> @@ -119,15 +144,33 @@
>          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);
> -            obj.sPx = jsonData[BezierCurveNames::KneePointX].int_value();
> -            obj.sPy = jsonData[BezierCurveNames::KneePointY].int_value();
>              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 = anchorValues.size();
> +            obj.coeff.resize(obj.order);
> +            for(int i = 0; i < obj.order; ++i)
> +            {
> +                obj.coeff[i] = anchorValues[i].int_value();
> +            }
>              return true;
>          }
>          return false;
> @@ -162,9 +205,7 @@
>      void setPayloadSize(uint8_t *dataStream, int positionOnStream, int
> payload)
>      {
>          int payloadBytes = 1;
> -
>          for(;payload >= 0xFF; payload -= 0xFF, ++payloadBytes);
> -
>          if(payloadBytes > 1)
>          {
>              shiftData(dataStream, payloadBytes-1, mCurrentStreamByte,
> positionOnStream);
> @@ -196,8 +237,6 @@
>          }
>      }
>
> -//    const std::string LocalParameters = std::string("LocalParameters");
> -//    const std::string TargetDisplayLuminance = std::string("
> TargetedSystemDisplayMaximumLuminance");
>  };
>
>  metadataFromJson::metadataFromJson() :
> @@ -211,17 +250,17 @@
>      delete mPimpl;
>  }
>
> -
>  bool metadataFromJson::frameMetadataFromJson(const char* filePath,
>                                                int frame,
>                                                uint8_t *&metadata)
>  {
>      std::string path(filePath);
>      JsonArray fileData = JsonHelper::readJsonArray(path);
> -
> +    bool isLLCJson = false;
>      if(fileData.empty())
>      {
> -        return false;
> +        isLLCJson = true;
> +        fileData = JsonHelper::readJson(filePath)
> .at("SceneInfo").array_items();
>      }
>
>  //    frame = frame + 1; //index on the array start at 0 frames starts at
> 1
> @@ -233,7 +272,6 @@
>      }
>
>      int mSEIBytesToRead = 509;
> -
>      if(metadata)
>      {
>          delete(metadata);
> @@ -241,13 +279,9 @@
>      metadata = new uint8_t[mSEIBytesToRead];
>      mPimpl->mCurrentStreamBit = 8;
>      mPimpl->mCurrentStreamByte = 1;
> +    memset(metadata, 0, mSEIBytesToRead);
>
> -    for(int j = 0; j < mSEIBytesToRead; ++j)
> -    {
> -        (metadata)[j] = 0;
> -    }
> -
> -    fillMetadataArray(fileData, frame, metadata);
> +    fillMetadataArray(fileData, frame, isLLCJson, metadata);
>      mPimpl->setPayloadSize(metadata, 0, mPimpl->mCurrentStreamByte);
>      return true;
>  }
> @@ -256,9 +290,12 @@
>  {
>      std::string path(filePath);
>      JsonArray fileData = JsonHelper::readJsonArray(path);
> +    bool isLLCJson = false;
> +
>      if (fileData.empty())
>      {
> -        return -1;
> +        isLLCJson = true;
> +        fileData = JsonHelper::readJson(filePath)
> .at("SceneInfo").array_items();
>      }
>
>      int numFrames = static_cast<int>(fileData.size());
> @@ -266,17 +303,12 @@
>      for (int frame = 0; frame < numFrames; ++frame)
>      {
>          metadata[frame] = new uint8_t[509];
> -        for (int i = 0; i < 509; ++i)
> -        {
> -            metadata[frame][i] = 0;
> -        }
> +        memset(metadata[frame], 0, 509);
>          mPimpl->mCurrentStreamBit = 8;
>          mPimpl->mCurrentStreamByte = 1;
>
> -        fillMetadataArray(fileData, frame, metadata[frame]);
> -
> +        fillMetadataArray(fileData, frame, isLLCJson, metadata[frame]);
>          mPimpl->setPayloadSize(metadata[frame], 0,
> mPimpl->mCurrentStreamByte);
> -
>      }
>
>      return numFrames;
> @@ -321,7 +353,7 @@
>      /* NOTE: We leave TWO BYTES of space for the payload */
>      mPimpl->mCurrentStreamByte += 2;
>
> -    fillMetadataArray(fileData, frame, metadata);
> +    fillMetadataArray(fileData, frame, false, metadata);
>
>      /* Set payload in bytes 2 & 3 as indicated in Extended InfoFrame Type
> syntax */
>      metadata[2] = (mPimpl->mCurrentStreamByte & 0xFF00) >> 8;
> @@ -331,7 +363,7 @@
>
>  int metadataFromJson::movieExtendedInfoFrameMetadataFromJson(const char*
> filePath, uint8_t **&metadata)
>  {
> -       std::string path(filePath);
> +    std::string path(filePath);
>      JsonArray fileData = JsonHelper::readJsonArray(path);
>      if(fileData.empty())
>      {
> @@ -344,9 +376,9 @@
>      {
>          metadata[frame] = new uint8_t[509];
>          for(int i = 0; i < 509; ++i)
> -               {
> -                       metadata[frame][i] = 0;
> -               }
> +        {
> +            metadata[frame][i] = 0;
> +        }
>          mPimpl->mCurrentStreamBit = 8;
>          mPimpl->mCurrentStreamByte = 0;
>
> @@ -356,7 +388,7 @@
>          /* NOTE: We leave TWO BYTES of space for the payload */
>          mPimpl->mCurrentStreamByte += 2;
>
> -        fillMetadataArray(fileData, frame, metadata[frame]);
> +        fillMetadataArray(fileData, frame, false, metadata[frame]);
>
>          /* Set payload in bytes 2 & 3 as indicated in Extended InfoFrame
> Type syntax */
>          metadata[frame][2] = (mPimpl->mCurrentStreamByte & 0xFF00) >> 8;
> @@ -366,7 +398,7 @@
>      return numFrames;
>  }
>
> -void metadataFromJson::fillMetadataArray(const JsonArray &fileData, int
> frame, uint8_t *&metadata)
> +void metadataFromJson::fillMetadataArray(const JsonArray &fileData, int
> frame, const bool isLLCJson, uint8_t *&metadata)
>  {
>      const uint8_t countryCode = 0xB5;
>      const uint16_t terminalProviderCode = 0x003C;
> @@ -381,57 +413,68 @@
>      mPimpl->appendBits(metadata, applicationIdentifier, 8);
>      mPimpl->appendBits(metadata, applicationVersion, 8);
>
> -    //Note: Validated only add up to two local selections, ignore the rest
> -    JsonArray jsonArray = fileData[frame][JsonDataKeys::
> LocalParameters].array_items();
> -    int ellipsesNum = static_cast<int>(jsonArray.size() > 2 ? 2 :
> jsonArray.size());
> -    uint16_t numWindows = (uint16_t)fileData[frame][
> JsonDataKeys::NumberOfWindows].int_value();
> -    mPimpl->appendBits(metadata, numWindows, 2);
> -    for (int i = 0; i < ellipsesNum; ++i)
> +    uint16_t numWindows = 0;
> +    /* HDR10+ LLC doesn't consider local windows */
> +    if(isLLCJson)
>      {
> -        mPimpl->appendBits(metadata, jsonArray[i][EllipseSelectionNames::
> WindowData]
> -            [EllipseSelectionNames::WindowUpperLeftCornerX].int_value(),
> 16);
> -        mPimpl->appendBits(metadata, jsonArray[i][EllipseSelectionNames::
> WindowData]
> -            [EllipseSelectionNames::WindowUpperLeftCornerY].int_value(),
> 16);
> -        mPimpl->appendBits(metadata, jsonArray[i][EllipseSelectionNames::
> WindowData]
> -            [EllipseSelectionNames::WindowLowerRightCornerX].int_value(),
> 16);
> -        mPimpl->appendBits(metadata, jsonArray[i][EllipseSelectionNames::
> WindowData]
> -            [EllipseSelectionNames::WindowLowerRightCornerY].int_value(),
> 16);
> -
> -        JsonObject ellipseJsonObject = jsonArray[i][EllipseNames::
> TagName].object_items();
> -
> -        mPimpl->appendBits(metadata,
> -            static_cast<uint16_t>(ellipseJsonObject[EllipseNames::
> CenterOfEllipseX].int_value()),
> -            16);
> +        numWindows = 1;
> +        mPimpl->appendBits(metadata, numWindows, 2);
> +    }
> +    else
> +    {
> +        //Note: Validated only add up to two local selections, ignore the
> rest
> +        JsonArray jsonArray = fileData[frame][JsonDataKeys::
> LocalParameters].array_items();
> +        int ellipsesNum = static_cast<int>(jsonArray.size() > 2 ? 2 :
> jsonArray.size());
> +        numWindows = (uint16_t)fileData[frame][
> JsonDataKeys::NumberOfWindows].int_value();
> +        mPimpl->appendBits(metadata, numWindows, 2);
> +        for (int i = 0; i < ellipsesNum; ++i)
> +        {
> +            mPimpl->appendBits(metadata, jsonArray[i][
> EllipseSelectionNames::WindowData]
> +                    [EllipseSelectionNames::WindowUpperLeftCornerX].int_value(),
> 16);
> +            mPimpl->appendBits(metadata, jsonArray[i][
> EllipseSelectionNames::WindowData]
> +                    [EllipseSelectionNames::WindowUpperLeftCornerY].int_value(),
> 16);
> +            mPimpl->appendBits(metadata, jsonArray[i][
> EllipseSelectionNames::WindowData]
> +                    [EllipseSelectionNames::WindowLowerRightCornerX].int_value(),
> 16);
> +            mPimpl->appendBits(metadata, jsonArray[i][
> EllipseSelectionNames::WindowData]
> +                    [EllipseSelectionNames::WindowLowerRightCornerY].int_value(),
> 16);
>
> -        mPimpl->appendBits(metadata,
> -            static_cast<uint16_t>(ellipseJsonObject[EllipseNames::
> CenterOfEllipseY].int_value()),
> -            16);
> -
> -        int angle = ellipseJsonObject[EllipseNames::RotationAngle].
> int_value();
> -        uint8_t rotationAngle = static_cast<uint8_t>((angle > 180.0) ?
> angle - 180.0 : angle);
> -        mPimpl->appendBits(metadata, rotationAngle, 8);
> -
> -        uint16_t semimajorExternalAxis =
> -            static_cast<uint16_t>(ellipseJsonObject[EllipseNames::
> SemiMajorAxisExternalEllipse].int_value());
> -
> -        uint16_t semiminorExternalAxis =
> -            static_cast<uint16_t>(ellipseJsonObject[EllipseNames::
> SemiMinorAxisExternalEllipse].int_value());
> +            JsonObject ellipseJsonObject = jsonArray[i][EllipseNames::
> TagName].object_items();
>
> -        uint16_t semimajorInternalEllipse =
> -            static_cast<uint16_t>(ellipseJsonObject[EllipseNames::
> SemiMajorAxisInternalEllipse].int_value());
> -
> -        mPimpl->appendBits(metadata, semimajorInternalEllipse, 16);
> +            mPimpl->appendBits(metadata,
> +                               static_cast<uint16_t>(ellipseJsonObject[
> EllipseNames::CenterOfEllipseX].int_value()),
> +                    16);
>
> -        mPimpl->appendBits(metadata, semimajorExternalAxis, 16);
> -        mPimpl->appendBits(metadata, semiminorExternalAxis, 16);
> -        uint8_t overlapProcessOption = static_cast<uint8_t>(
> ellipseJsonObject[EllipseNames::OverlapProcessOption].int_value());
> -        //TODO: Uses Layering method, the value is "1"
> -        mPimpl->appendBits(metadata, overlapProcessOption, 1);
> +            mPimpl->appendBits(metadata,
> +                               static_cast<uint16_t>(ellipseJsonObject[
> EllipseNames::CenterOfEllipseY].int_value()),
> +                    16);
> +
> +            int angle = ellipseJsonObject[EllipseNames::RotationAngle].
> int_value();
> +            uint8_t rotationAngle = static_cast<uint8_t>((angle > 180.0)
> ? angle - 180.0 : angle);
> +            mPimpl->appendBits(metadata, rotationAngle, 8);
> +
> +            uint16_t semimajorExternalAxis =
> +                    static_cast<uint16_t>(ellipseJsonObject[
> EllipseNames::SemiMajorAxisExternalEllipse].int_value());
> +
> +            uint16_t semiminorExternalAxis =
> +                    static_cast<uint16_t>(ellipseJsonObject[
> EllipseNames::SemiMinorAxisExternalEllipse].int_value());
> +
> +            uint16_t semimajorInternalEllipse =
> +                    static_cast<uint16_t>(ellipseJsonObject[
> EllipseNames::SemiMajorAxisInternalEllipse].int_value());
> +
> +            mPimpl->appendBits(metadata, semimajorInternalEllipse, 16);
> +
> +            mPimpl->appendBits(metadata, semimajorExternalAxis, 16);
> +            mPimpl->appendBits(metadata, semiminorExternalAxis, 16);
> +            uint8_t overlapProcessOption = static_cast<uint8_t>(
> ellipseJsonObject[EllipseNames::OverlapProcessOption].int_value());
> +            //TODO: Uses Layering method, the value is "1"
> +            mPimpl->appendBits(metadata, overlapProcessOption, 1);
> +        }
>      }
> +
>      /* Targeted System Display Data */
> -    uint32_t monitorPeak = fileData[frame][JsonDataKeys::
> TargetDisplayLuminance].int_value();     //500;
> +    uint32_t monitorPeak = fileData[frame][JsonDataKeys::
> TargetDisplayLuminance].int_value();
>      mPimpl->appendBits(metadata, monitorPeak, 27);
> -    //NOTE: Set as false for now, as requested
> +
>      uint8_t targetedSystemDisplayActualPeakLuminanceFlag = 0;
>      mPimpl->appendBits(metadata, targetedSystemDisplayActualPeakLuminanceFlag,
> 1);
>      if (targetedSystemDisplayActualPeakLuminanceFlag)
> @@ -439,21 +482,21 @@
>          //TODO
>      }
>
> -    /* Max rgb values (maxScl)*/
> +    /* Max RGB values (maxScl)*/
>      /* Luminance values/percentile for each window */
>      for (int w = 0; w < numWindows; ++w)
>      {
>          Json lumObj = fileData[frame][LuminanceNames::TagName];
>          LuminanceParameters luminanceData;
> -        if (!mPimpl->luminanceParamFromJson(lumObj, luminanceData))
> +        if(!((isLLCJson && mPimpl->luminanceParamFromLLCJson(lumObj,
> luminanceData)) ||
> +            !(isLLCJson && mPimpl->luminanceParamFromJson(lumObj,
> luminanceData))))
>          {
>              std::cout << "error parsing luminance parameters frame: " <<
> w << std::endl;
>          }
>
> -        /* NOTE: Maxscl from 0 t 100,000 based on data that says in
> values of 0.00001
> +        /* NOTE: Maxscl from 0 to 100,000 based on data that says in
> values of 0.00001
>          * one for each channel R,G,B
>          */
> -
>          mPimpl->appendBits(metadata, static_cast<uint8_t>(((int)luminanceData.maxRLuminance
> & 0x10000) >> 16), 1);
>          mPimpl->appendBits(metadata, static_cast<uint16_t>((int)luminanceData.maxRLuminance
> & 0xFFFF), 16);
>          mPimpl->appendBits(metadata, static_cast<uint8_t>(((int)luminanceData.maxGLuminance
> & 0x10000) >> 16), 1);
> @@ -467,11 +510,21 @@
>          uint8_t numDistributionMaxrgbPercentiles = static_cast<uint8_t>(
> luminanceData.order);
>          mPimpl->appendBits(metadata, numDistributionMaxrgbPercentiles,
> 4);
>
> -        std::vector<unsigned int>percentilPercentages;
> -        mPimpl->percentagesFromJson(lumObj, percentilPercentages);
> +        std::vector<unsigned int>percentilePercentages;
> +
> +        if(isLLCJson)
> +        {
> +            mPimpl->percentagesFromLLCJson(lumObj,
> percentilePercentages);
> +        }
> +        else
> +        {
> +            mPimpl->percentagesFromJson(lumObj, percentilePercentages);
> +        }
> +
> +
>          for (int i = 0; i < numDistributionMaxrgbPercentiles; ++i)
>          {
> -            uint8_t distributionMaxrgbPercentage = static_cast<uint8_t>(
> percentilPercentages.at(i));
> +            uint8_t distributionMaxrgbPercentage = static_cast<uint8_t>(
> percentilePercentages.at(i));
>              mPimpl->appendBits(metadata, distributionMaxrgbPercentage, 7);
>
>              /* 17bits: 1bit then 16 */
> @@ -483,7 +536,7 @@
>          }
>
>          /* 10bits: Fraction bright pixels */
> -        uint16_t fractionBrightPixels = 1;
> +        uint16_t fractionBrightPixels = 0;
>          mPimpl->appendBits(metadata, fractionBrightPixels, 10);
>
>      }
> @@ -505,17 +558,20 @@
>                 /* Select curve data based on global window */
>          if (w == 0)
>          {
> -            if (!mPimpl->bezierCurveFromJson(fileData[frame][BezierCurveNames::TagName],
> curveData))
> +            if(!((isLLCJson && mPimpl->bezierCurveFromLLCJson(
> fileData[frame][BezierCurveNames::TagName], curveData)) ||
> +                !(isLLCJson && mPimpl->bezierCurveFromJson(
> fileData[frame][BezierCurveNames::TagName], curveData))))
>              {
> -                               toneMappingFlag = 0;
> +                toneMappingFlag = 0;
>              }
>          }
> -           /* Select curve data based on local window */
> +
> +        /* 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))
>              {
> -                               toneMappingFlag = 0;
> +                toneMappingFlag = 0;
>              }
>          }
>          mPimpl->appendBits(metadata, toneMappingFlag, 1);
> diff -r 8bf51aa8a170 -r 7763d20f092a source/dynamicHDR10/
> metadataFromJson.h
> --- a/source/dynamicHDR10/metadataFromJson.h    Thu Jul 12 17:23:26 2018
> +0800
> +++ b/source/dynamicHDR10/metadataFromJson.h    Thu Jul 12 12:14:00 2018
> +0530
> @@ -98,7 +98,7 @@
>
>      class DynamicMetaIO;
>      DynamicMetaIO *mPimpl;
> -    void fillMetadataArray(const JsonArray &fileData, int frame, uint8_t
> *&metadata);
> +    void fillMetadataArray(const JsonArray &fileData, int frame, const
> bool isLLCJson, uint8_t *&metadata);
>  };
>
>  #endif // METADATAFROMJSON_H
>

Pushed.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180716/9bf28ea6/attachment-0001.html>


More information about the x265-devel mailing list