[x265] [PATCH] Added command line options to generate a VUI and add it to the coded bitstream

dave dtyx265 at gmail.com
Fri Feb 21 00:31:11 CET 2014


On 02/20/2014 12:44 PM, Steve Borho wrote:
>
>
>
> On Wed, Feb 19, 2014 at 12:01 PM, <dtyx265 at gmail.com 
> <mailto:dtyx265 at gmail.com>> wrote:
>
>     # HG changeset patch
>     # User David T Yuen <dtyx265 at gmail.com <mailto:dtyx265 at gmail.com>>
>     # Date 1392832822 28800
>     # Node ID 8ef0c14054879a7a0ba7720ecb3a640e6b3767d1
>     # Parent  1c78bd13a14f3d5227c4b961664af97f86a8810d
>     Added command line options to generate a VUI and add it to the
>     coded bitstream
>
>
> Hello,  Thanks for working through these details.
>
> I had some review comments for this patch but unfortunately didn't get 
> around to responding to this patch yesterday.
>
>     diff -r 1c78bd13a14f -r 8ef0c1405487 source/Lib/TLibCommon/TComSlice.h
>     --- a/source/Lib/TLibCommon/TComSlice.h Wed Feb 19 09:46:46 2014 -0800
>     +++ b/source/Lib/TLibCommon/TComSlice.h Wed Feb 19 10:00:22 2014 -0800
>     @@ -604,6 +604,7 @@
>          bool m_frameFieldInfoPresentFlag;
>          bool m_hrdParametersPresentFlag;
>          bool m_bitstreamRestrictionFlag;
>     +    bool m_tilesFixedStructureFlag;
>          bool m_motionVectorsOverPicBoundariesFlag;
>          bool m_restrictedRefPicListsFlag;
>          int  m_minSpatialSegmentationIdc;
>     @@ -638,6 +639,7 @@
>              , m_frameFieldInfoPresentFlag(false)
>              , m_hrdParametersPresentFlag(false)
>              , m_bitstreamRestrictionFlag(false)
>     +        , m_tilesFixedStructureFlag(false)
>
>
> We don't support tiles, so it is ok to leave this hard-coded to zero
>
>              , m_motionVectorsOverPicBoundariesFlag(true)
>              , m_restrictedRefPicListsFlag(1)
>              , m_minSpatialSegmentationIdc(0)
>     @@ -737,6 +739,10 @@
>
>          void setBitstreamRestrictionFlag(bool i) {
>     m_bitstreamRestrictionFlag = i; }
>
>     +    bool getTilesFixedStructureFlag() { return
>     m_tilesFixedStructureFlag; }
>     +
>     +    void setTilesFixedStructureFlag(bool i) {
>     m_tilesFixedStructureFlag = i; }
>
>
>
> We're trying to remove these C++ style get/set methods.  Just set/get 
> these variables directly.
I agree, they are more work than they are worth.  I was just sticking to 
with "coding style already in place".  I know the long term goal is to 
convert everything to C and I would rather work on that than simply 
convert the new VUI code to not use get/set style.
>
>          bool getMotionVectorsOverPicBoundariesFlag() { return
>     m_motionVectorsOverPicBoundariesFlag; }
>
>          void setMotionVectorsOverPicBoundariesFlag(bool i) {
>     m_motionVectorsOverPicBoundariesFlag = i; }
>     diff -r 1c78bd13a14f -r 8ef0c1405487 source/Lib/TLibEncoder/TEncCfg.h
>     --- a/source/Lib/TLibEncoder/TEncCfg.h  Wed Feb 19 09:46:46 2014 -0800
>     +++ b/source/Lib/TLibEncoder/TEncCfg.h  Wed Feb 19 10:00:22 2014 -0800
>     @@ -151,6 +151,14 @@
>          int       m_maxBitsPerMinCuDenom;     ///< Indicates an upper
>     bound for the number of bits of coding_unit() data
>          int       m_log2MaxMvLengthHorizontal;      ///< Indicate the
>     maximum absolute value of a decoded horizontal MV component in
>     quarter-pel luma units
>          int       m_log2MaxMvLengthVertical;      ///< Indicate the
>     maximum absolute value of a decoded vertical MV component in
>     quarter-pel luma units
>
>
>
> there's no need to add these flags to TEncCfg since TEncCfg itself has 
> an x265_param structure built into it.  These are redundant.
Again, I agree, it's over engineering to copy a value from arguments to 
x265_param, to TEncCfg, to TComVUI to coded output when nothing happens 
to it other than copying it.  I wanted to work within the existing code 
structure because I thought it would make it easier to convert 
everything to C and potentially, actually preferably, re-structure or 
redesign it from it's current state than some mixed style.
>
>     +    bool      m_fieldSeqFlag;     ///< Indicates that each
>     picture is a field and has its own SEI timing message
>     +    bool      m_vuiTimingInfoPresentFlag;     ///< Indicates that
>     timing info is added to the VUI
>     +    int       m_vuiNumUnitsInTick;      ///< The number of system
>     ticks in an h265 tick where an h265 tick is in units of system
>     ticks per frame
>     +    int       m_vuiTimeScale;     ///< The number of system ticks
>     per second
>     +    bool      m_vuiHrdParametersPresentFlag;      ///< Indicates
>     HRD parameters are to be added to the VUI
>     +    bool      m_subPicHrdParamsPresentFlag;     ///< Indicates
>     that sub pic parameters should be added to the HRD
>     +    bool      m_restrictedRefPicListsFlag;      ///< Indicates
>     all P and B slices have the same reference pic list 0 and all B
>     slices have the same reference pic list 1
>     +    bool      m_tilesFixedStructureFlag;      ///< Indicates each
>     PPS in the CVS have the same tile structure fields
>
>      public:
>
>     @@ -305,6 +313,22 @@
>          bool getNonPackedConstraintFlag() const { return
>     m_nonPackedConstraintFlag; }
>
>          bool getFrameOnlyConstraintFlag() const { return
>     m_frameOnlyConstraintFlag; }
>
>
> ditto here, these should go away
Agreed
>
>     +
>     +    bool getFieldSeqFlag() const { return m_fieldSeqFlag; }
>     +
>     +    bool getVuiTimingInfoPresentFlag() const { return
>     m_vuiTimingInfoPresentFlag; }
>     +
>     +    int getVuiNumUnitsInTick() const { return m_vuiNumUnitsInTick; }
>     +
>     +    int getVuiTimeScale() const { return m_vuiTimeScale; }
>     +
>     +    bool getVuiHrdParametersPresentFlag() const { return
>     m_vuiHrdParametersPresentFlag; }
>     +
>     +    bool getSubPicHrdParamsPresentFlag() const { return
>     m_subPicHrdParamsPresentFlag; }
>     +
>     +    bool getRestrictedRefPicListsFlag() const { return
>     m_restrictedRefPicListsFlag; }
>     +
>     +    bool getTilesFixedStructureFlag() const { return
>     m_tilesFixedStructureFlag; }
>      };
>      }
>      //! \}
>     diff -r 1c78bd13a14f -r 8ef0c1405487
>     source/Lib/TLibEncoder/TEncSbac.cpp
>     --- a/source/Lib/TLibEncoder/TEncSbac.cpp       Wed Feb 19
>     09:46:46 2014 -0800
>     +++ b/source/Lib/TLibEncoder/TEncSbac.cpp       Wed Feb 19
>     10:00:22 2014 -0800
>     @@ -665,7 +665,7 @@
>          WRITE_FLAG(vui->getBitstreamRestrictionFlag(),        
>      "bitstream_restriction_flag");
>          if (vui->getBitstreamRestrictionFlag())
>          {
>     -        WRITE_FLAG(0,            "tiles_fixed_structure_flag");
>     +        WRITE_FLAG(vui->getTilesFixedStructureFlag(),            
>     "tiles_fixed_structure_flag");
>
> this one can be backed out
No problem.  Are there any plans for Tiles in the future?
>
>      WRITE_FLAG(vui->getMotionVectorsOverPicBoundariesFlag(),
>      "motion_vectors_over_pic_boundaries_flag");
>      WRITE_FLAG(vui->getRestrictedRefPicListsFlag(),    
>     "restricted_ref_pic_lists_flag");
>      WRITE_UVLC(vui->getMinSpatialSegmentationIdc(),    
>     "min_spatial_segmentation_idc");
>     diff -r 1c78bd13a14f -r 8ef0c1405487 source/common/common.cpp
>     --- a/source/common/common.cpp  Wed Feb 19 09:46:46 2014 -0800
>     +++ b/source/common/common.cpp  Wed Feb 19 10:00:22 2014 -0800
>     @@ -221,6 +221,35 @@
>          /* Quality Measurement Metrics */
>          param->bEnablePsnr = 0;
>          param->bEnableSsim = 0;
>     +
>     +    /* Video Usability Information (VUI) */
>     +    param->bEnableVuiParametersPresentFlag = 0;
>     +    param->bEnableAspectRatioIdc = 0;
>     +    param->aspectRatioIdc = 0;
>     +    param->sarWidth = 0;
>     +    param->sarHeight = 0;
>     +    param->bEnableOverscanAppropriateFlag = 0;
>     +    param->bEnableVideoSignalTypePresentFlag = 0;
>     +    param->videoFormat = 5;
>     +    param->bEnableVideoFullRangeFlag = 0;
>     +    param->bEnableColorDescriptionPresentFlag = 0;
>     +    param->colorPrimaries = 2;
>     +    param->transferCharacteristics = 2;
>     +    param->matrixCoeffs = 2;
>     +    param->bEnableChromaLocInfoPresentFlag = 0;
>     +    param->chromaSampleLocTypeTopField = 0;
>     +    param->chromaSampleLocTypeBottomField = 0;
>     +    param->bEnableFieldSeqFlag = 0;
>     +    param->bEnableFrameFieldInfoPresentFlag = 0;
>     +    param->bEnableDefaultDisplayWindowFlag = 0;
>     +    param->defDispWinLeftOffset = 0;
>     +    param->defDispWinRightOffset = 0;
>     +    param->defDispWinTopOffset = 0;
>     +    param->defDispWinBottomOffset = 0;
>     +    param->bEnableVuiTimingInfoPresentFlag = 0;
>     +    param->bEnableVuiHrdParametersPresentFlag = 0;
>     +    param->bEnableBitstreamRestrictionFlag = 0;
>     +    param->bEnableSubPicHrdParamsPresentFlag = 0;
>      }
>
>      extern "C"
>     @@ -764,6 +793,200 @@
>          OPT("me")        p->searchMethod = parseName(value,
>     x265_motion_est_names, berror);
>          OPT("cutree")    p->rc.cuTree = bvalue;
>          OPT("no-cutree") p->rc.cuTree = bvalue;
>     +    OPT("vui")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = bvalue;
>     +        p->bEnableAspectRatioIdc = bvalue;
>     +        p->bEnableOverscanInfoPresentFlag = bvalue;
>     +        p->bEnableVideoSignalTypePresentFlag = bvalue;
>     +        p->bEnableColorDescriptionPresentFlag = bvalue;
>     +        p->bEnableChromaLocInfoPresentFlag = bvalue;
>     +        p->bEnableFieldSeqFlag = bvalue;
>     +        p->bEnableFrameFieldInfoPresentFlag = bvalue;
>     +        p->bEnableDefaultDisplayWindowFlag = bvalue;
>     +        p->bEnableVuiTimingInfoPresentFlag = bvalue;
>     +        p->bEnableVuiHrdParametersPresentFlag = bvalue;
>     +        p->bEnableBitstreamRestrictionFlag = bvalue;
>     +        p->bEnableSubPicHrdParamsPresentFlag = bvalue;
>     +    }
>     +    OPT("sar")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableAspectRatioIdc = bvalue;
>     +        p->aspectRatioIdc = atoi(value);
>     +    }
>     +    OPT("extended-sar")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableAspectRatioIdc = bvalue;
>     +        p->aspectRatioIdc = 255;
>     +        sscanf(value, "%dx%d", &p->sarWidth, &p->sarHeight);
>     +    }
>     +    OPT("overscan")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        if (!strcmp(value, "show"))
>     +            p->bEnableOverscanInfoPresentFlag = bvalue;
>     +        else if (!strcmp(value, "crop"))
>     +        {
>     +            p->bEnableOverscanInfoPresentFlag = bvalue;
>     +            p->bEnableOverscanAppropriateFlag = bvalue;
>     +        }
>     +    }
>     +    OPT("videoformat")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVideoSignalTypePresentFlag = bvalue;
>     +        if (!strcmp(value, "component"))
>     +            p->videoFormat = 0;
>     +        else if (!strcmp(value, "pal"))
>     +            p->videoFormat = 1;
>     +        else if (!strcmp(value, "ntsc"))
>     +            p->videoFormat = 2;
>     +        else if (!strcmp(value, "secam"))
>     +            p->videoFormat = 3;
>     +        else if (!strcmp(value, "mac"))
>     +            p->videoFormat = 4;
>     +        else if (!strcmp(value, "undef"))
>     +            p->videoFormat = 5;
>     +    }
>     +    OPT("range")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVideoSignalTypePresentFlag = bvalue;
>     +        p->bEnableVideoFullRangeFlag = bvalue;
>     +    }
>     +    OPT("colorprim")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVideoSignalTypePresentFlag = bvalue;
>     +        p->bEnableColorDescriptionPresentFlag = bvalue;
>     +        if (!strcmp(value, "bt709"))
>     +            p->colorPrimaries = 1;
>     +        else if (!strcmp(value, "undef"))
>     +            p->colorPrimaries = 2;
>     +        else if (!strcmp(value, "bt470m"))
>     +            p->colorPrimaries = 4;
>     +        else if (!strcmp(value, "bt470bg"))
>     +            p->colorPrimaries = 5;
>     +        else if (!strcmp(value, "smpte170m"))
>     +            p->colorPrimaries = 6;
>     +        else if (!strcmp(value, "smpte240m"))
>     +            p->colorPrimaries = 7;
>     +        else if (!strcmp(value, "film"))
>     +            p->colorPrimaries = 8;
>     +        else if (!strcmp(value, "bt2020"))
>     +            p->colorPrimaries = 9;
>     +    }
>     +    OPT("transfer")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVideoSignalTypePresentFlag = bvalue;
>     +        p->bEnableColorDescriptionPresentFlag = bvalue;
>     +        if (!strcmp(value, "bt709"))
>     +            p->transferCharacteristics = 1;
>     +        else if (!strcmp(value, "undef"))
>     +            p->transferCharacteristics = 2;
>     +        else if (!strcmp(value, "bt470m"))
>     +            p->transferCharacteristics = 4;
>     +        else if (!strcmp(value, "bt470bg"))
>     +            p->transferCharacteristics = 5;
>     +        else if (!strcmp(value, "smpte170m"))
>     +            p->transferCharacteristics = 6;
>     +        else if (!strcmp(value, "smpte240m"))
>     +            p->transferCharacteristics = 7;
>     +        else if (!strcmp(value, "linear"))
>     +            p->transferCharacteristics = 8;
>     +        else if (!strcmp(value, "log100"))
>     +            p->transferCharacteristics = 9;
>     +        else if (!strcmp(value, "log316"))
>     +            p->transferCharacteristics = 10;
>     +        else if (!strcmp(value, "iec61966-2-4"))
>     +            p->transferCharacteristics = 11;
>     +        else if (!strcmp(value, "bt1361e"))
>     +            p->transferCharacteristics = 12;
>     +        else if (!strcmp(value, "iec61966-2-1"))
>     +            p->transferCharacteristics = 13;
>     +        else if (!strcmp(value, "bt2020-10"))
>     +            p->transferCharacteristics = 14;
>     +        else if (!strcmp(value, "bt2020-12"))
>     +            p->transferCharacteristics = 15;
>     +    }
>     +    OPT("colormatrix")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVideoSignalTypePresentFlag = bvalue;
>     +        p->bEnableColorDescriptionPresentFlag = bvalue;
>     +        if (!strcmp(value, "GBR"))
>     +            p->matrixCoeffs = 0;
>     +        else if (!strcmp(value, "bt709"))
>     +            p->matrixCoeffs = 1;
>     +        else if (!strcmp(value, "undef"))
>     +            p->matrixCoeffs = 2;
>     +        else if (!strcmp(value, "fcc"))
>     +            p->matrixCoeffs = 4;
>     +        else if (!strcmp(value, "bt470bg"))
>     +            p->matrixCoeffs = 5;
>     +        else if (!strcmp(value, "smpte170m"))
>     +            p->matrixCoeffs = 6;
>     +        else if (!strcmp(value, "smpte240m"))
>     +            p->matrixCoeffs = 7;
>     +        else if (!strcmp(value, "YCgCo"))
>     +            p->matrixCoeffs = 8;
>     +        else if (!strcmp(value, "bt2020nc"))
>     +            p->matrixCoeffs = 9;
>     +        else if (!strcmp(value, "bt2020c"))
>     +            p->matrixCoeffs = 10;
>     +    }
>     +    OPT("chromaloc")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableChromaLocInfoPresentFlag = bvalue;
>     +        p->chromaSampleLocTypeTopField = atoi(value);
>     +        p->chromaSampleLocTypeBottomField =
>     p->chromaSampleLocTypeTopField;
>     +    }
>     +    OPT("fieldseq")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableFieldSeqFlag = bvalue;
>     +    }
>     +    OPT("framefieldinfo")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableFrameFieldInfoPresentFlag = bvalue;
>     +    }
>     +    OPT("crop-rect")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableDefaultDisplayWindowFlag = bvalue;
>     +        sscanf(value,"%d,%d,%d,%d",
>     +            &p->defDispWinLeftOffset,
>     +            &p->defDispWinTopOffset,
>     +            &p->defDispWinRightOffset,
>     +            &p->defDispWinBottomOffset);
>     +    }
>     +    OPT("timinginfo")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVuiTimingInfoPresentFlag = bvalue;
>     +    }
>     +    OPT("nal-hrd")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVuiTimingInfoPresentFlag = bvalue;
>     +        p->bEnableVuiHrdParametersPresentFlag = bvalue;
>     +    }
>     +    OPT("bitstreamrestriction")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableBitstreamRestrictionFlag = bvalue;
>     +    }
>     +    OPT("subpichrd")
>     +    {
>     +        p->bEnableVuiParametersPresentFlag = 1;
>     +        p->bEnableVuiHrdParametersPresentFlag = bvalue;
>     +        p->bEnableSubPicHrdParamsPresentFlag = bvalue;
>     +    }
>
>          else
>              return X265_PARAM_BAD_NAME;
>     diff -r 1c78bd13a14f -r 8ef0c1405487 source/encoder/encoder.cpp
>     --- a/source/encoder/encoder.cpp        Wed Feb 19 09:46:46 2014 -0800
>     +++ b/source/encoder/encoder.cpp        Wed Feb 19 10:00:22 2014 -0800
>     @@ -1043,7 +1043,7 @@
>          if (sps->getVuiParametersPresentFlag())
>          {
>              TComVUI* vui = sps->getVuiParameters();
>     -  vui->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
>
>
> you can use param.* here
Again, I was just maintaining style.
>
>     +
>      vui->setAspectRatioInfoPresentFlag(getAspectRatioInfoPresentFlag());
>              vui->setAspectRatioIdc(getAspectRatioIdc());
>              vui->setSarWidth(getSarWidth());
>              vui->setSarHeight(getSarHeight());
>     @@ -1062,12 +1062,17 @@
>      vui->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
>      vui->setDefaultDisplayWindow(getDefaultDisplayWindow());
>      vui->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
>     -        vui->setFieldSeqFlag(false);
>     -        vui->setHrdParametersPresentFlag(false);
>     +        vui->setFieldSeqFlag(getFieldSeqFlag());
>     +  vui->setHrdParametersPresentFlag(getVuiHrdParametersPresentFlag());
>     +
>      vui->getTimingInfo()->setTimingInfoPresentFlag(getVuiTimingInfoPresentFlag());
>     +  vui->getTimingInfo()->setNumUnitsInTick(getVuiNumUnitsInTick());
>     +  vui->getTimingInfo()->setTimeScale(getVuiTimeScale());
>      vui->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
>      vui->getTimingInfo()->setNumTicksPocDiffOneMinus1(getNumTicksPocDiffOneMinus1());
>      vui->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
>     +  vui->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
>      vui->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
>     +  vui->setRestrictedRefPicListsFlag(getRestrictedRefPicListsFlag());
>      vui->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
>      vui->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
>      vui->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
>     @@ -1390,11 +1395,11 @@
>          m_quadtreeTULog2MinSize = tuQTMinLog2Size;
>
>          //========= set default display window
>     ==================================
>     -    m_defaultDisplayWindow.m_enabledFlag = true;
>     -    m_defaultDisplayWindow.m_winRightOffset = 0;
>     -    m_defaultDisplayWindow.m_winTopOffset = 0;
>     -    m_defaultDisplayWindow.m_winBottomOffset = 0;
>     -    m_defaultDisplayWindow.m_winLeftOffset = 0;
>     +    m_defaultDisplayWindow.m_enabledFlag =
>     _param->bEnableDefaultDisplayWindowFlag;
>     +    m_defaultDisplayWindow.m_winRightOffset =
>     _param->defDispWinRightOffset;
>     +    m_defaultDisplayWindow.m_winTopOffset =
>     _param->defDispWinTopOffset;
>     +    m_defaultDisplayWindow.m_winBottomOffset =
>     _param->defDispWinBottomOffset;
>     +    m_defaultDisplayWindow.m_winLeftOffset =
>     _param->defDispWinLeftOffset;
>          m_pad[0] = m_pad[1] = 0;
>
>          //======== set pad size if width is not multiple of the
>     minimum CU size =========
>     @@ -1465,25 +1470,26 @@
>          m_decodingUnitInfoSEIEnabled = 0;
>          m_useScalingListId = 0;
>          m_activeParameterSetsSEIEnabled = 0;
>
>
> All the sets to fields redundant with x265_param should go away
Agreed.
>
>     -    m_vuiParametersPresentFlag = false;
>     +    m_vuiParametersPresentFlag =
>     _param->bEnableVuiParametersPresentFlag;
>          m_minSpatialSegmentationIdc = 0;
>     -    m_aspectRatioIdc = 0;
>     -    m_sarWidth = 0;
>     -    m_sarHeight = 0;
>     -    m_overscanInfoPresentFlag = false;
>     -    m_overscanAppropriateFlag = false;
>     -    m_videoSignalTypePresentFlag = false;
>     -    m_videoFormat = 5;
>     -    m_videoFullRangeFlag = false;
>     -    m_colourDescriptionPresentFlag = false;
>     -    m_colourPrimaries = 2;
>     -    m_transferCharacteristics = 2;
>     -    m_matrixCoefficients = 2;
>     -    m_chromaLocInfoPresentFlag = false;
>     -    m_chromaSampleLocTypeTopField = 0;
>     -    m_chromaSampleLocTypeBottomField = 0;
>     +    m_aspectRatioInfoPresentFlag = _param->bEnableAspectRatioIdc;
>     +    m_aspectRatioIdc = _param->aspectRatioIdc;
>     +    m_sarWidth = _param->sarWidth;
>     +    m_sarHeight = _param->sarHeight;
>     +    m_overscanInfoPresentFlag =
>     _param->bEnableOverscanInfoPresentFlag;
>     +    m_overscanAppropriateFlag =
>     _param->bEnableOverscanAppropriateFlag;
>     +    m_videoSignalTypePresentFlag =
>     _param->bEnableVideoSignalTypePresentFlag;
>     +    m_videoFormat = _param->videoFormat;
>     +    m_videoFullRangeFlag = _param->bEnableVideoFullRangeFlag;
>     +    m_colourDescriptionPresentFlag =
>     _param->bEnableColorDescriptionPresentFlag;
>     +    m_colourPrimaries = _param->colorPrimaries;
>     +    m_transferCharacteristics = _param->transferCharacteristics;
>     +    m_matrixCoefficients = _param->matrixCoeffs;
>     +    m_chromaLocInfoPresentFlag =
>     _param->bEnableChromaLocInfoPresentFlag;
>     +    m_chromaSampleLocTypeTopField =
>     _param->chromaSampleLocTypeTopField;
>     +    m_chromaSampleLocTypeBottomField =
>     _param->chromaSampleLocTypeBottomField;
>          m_neutralChromaIndicationFlag = false;
>     -    m_frameFieldInfoPresentFlag = false;
>     +    m_frameFieldInfoPresentFlag =
>     _param->bEnableFrameFieldInfoPresentFlag;
>          m_pocProportionalToTimingFlag = false;
>          m_numTicksPocDiffOneMinus1 = 0;
>          m_bitstreamRestrictionFlag = false;
>     @@ -1501,6 +1507,11 @@
>          m_useLossless = false;  // x264 configures this via --qp=0
>          m_TransquantBypassEnableFlag = false;
>          m_CUTransquantBypassFlagValue = false;
>     +    m_fieldSeqFlag = _param->bEnableFieldSeqFlag;
>     +    m_vuiTimingInfoPresentFlag =
>     _param->bEnableVuiTimingInfoPresentFlag;
>     +    m_vuiHrdParametersPresentFlag =
>     _param->bEnableVuiHrdParametersPresentFlag;
>     +    m_bitstreamRestrictionFlag =
>     _param->bEnableBitstreamRestrictionFlag;
>     +    m_subPicHrdParamsPresentFlag =
>     _param->bEnableSubPicHrdParamsPresentFlag;
>      }
>
>      int Encoder::extractNalData(NALUnitEBSP **nalunits)
>     diff -r 1c78bd13a14f -r 8ef0c1405487 source/x265.cpp
>     --- a/source/x265.cpp   Wed Feb 19 09:46:46 2014 -0800
>     +++ b/source/x265.cpp   Wed Feb 19 10:00:22 2014 -0800
>     @@ -154,6 +154,26 @@
>          { "strong-intra-smoothing",    no_argument, NULL, 0 },
>          { "no-cutree",                 no_argument, NULL, 0 },
>          { "cutree",                    no_argument, NULL, 0 },
>     +    { "vui",                  no_argument, NULL, 0 },
>     +    { "sar",            required_argument, NULL, 0 },
>     +    { "extended-sar",   required_argument, NULL, 0 },
>     +    { "overscan",       required_argument, NULL, 0 },
>     +    { "videoformat",    required_argument, NULL, 0 },
>     +    { "range",                no_argument, NULL, 0 },
>     +    { "no-range",             no_argument, NULL, 0 },
>     +    { "colorprim",      required_argument, NULL, 0 },
>     +    { "transfer",       required_argument, NULL, 0 },
>     +    { "colormatrix",    required_argument, NULL, 0 },
>     +    { "chromaloc",      required_argument, NULL, 0 },
>     +    { "fieldseq",             no_argument, NULL, 0 },
>     +    { "no-fieldseq",          no_argument, NULL, 0 },
>     +    { "framefieldinfo",       no_argument, NULL, 0 },
>     +    { "no-framefieldinfo",    no_argument, NULL, 0 },
>     +    { "crop-rect",      required_argument, NULL, 0 },
>     +    { "timinginfo",           no_argument, NULL, 0 },
>     +    { "nal-hrd",              no_argument, NULL, 0 },
>     +    { "bitstreamrestriction", no_argument, NULL, 0 },
>     +    { "subpichrd",            no_argument, NULL, 0 },
>          { 0, 0, 0, 0 }
>      };
>
>     @@ -351,6 +371,32 @@
>          H0("   --recon-depth                 Bit-depth of
>     reconstructed raw image file. Defaults to input bit depth\n");
>          H0("\nSEI options:\n");
>          H0("   --hash                        Decoded Picture Hash SEI
>     0: disabled, 1: MD5, 2: CRC, 3: Checksum. Default %d\n",
>     param->decodedPictureHashSEI);
>     +    H0("\nVUI options:\n");
>     +    H0("   --vui                         Add Video Useability
>     Information with all fields to the SPS. Default %s\n",
>     OPT(param->bEnableVuiParametersPresentFlag));
>     +    H0("   --sar                         Sample Aspect Ratio, the
>     ratio of width to height of an individual pixel.\n");
>     +    H0("                                 Choose from
>     0=Unspecified, 1=1:1(\"square\"), 2=12:11, 3=10:11, 4=16:11,\n");
>     +    H0("                                 5=40:33, 6=24:11,
>     7=20:11, 8=32:11, 9=80:33, 10=18:11, 11=15:11,\n");
>     +    H0("                                 12=64:33, 13=160:99,
>     14=4:3, 15=3:2, 16=2:1. Default %d\n",param->aspectRatioIdc);
>     +    H0("   --extended-sar                Use a custom Sample
>     Aspect Ratio,[WxH]\n");
>     +    H0("   --overscan <string>           Specify crop overscan
>     setting from undef, show or crop. Default of undef\n");
>     +    H0("   --videoformat <string>        Specify video format
>     from undef, component, pal, ntsc, secam, mac. Default of undef\n");
>     +    H0("   --[no-]range                       Specify black level
>     and range of luma and chroma signals. Default of %s\n",
>     OPT(param->bEnableVideoFullRangeFlag));
>     +    H0("   --colorprim <string>          Specify color primaries
>     from undef, bt709, bt470m, bt470bg, smpte170m,\n");
>     +    H0("                                 smpte240m, film, bt2020.
>     Default of undef\n");
>     +    H0("   --transfer <string>           Specify transfer
>     characteristics from undef, bt709, bt470m, bt470bg, smpte170m,\n");
>     +    H0("                                 smpte240m, linear,
>     log100, log316, iec61966-2-4, bt1361e, iec61966-2-1,\n");
>     +    H0("                                 bt2020-10, bt2020-12.
>     Default of undef\n");
>     +    H0("   --colormatrix <string>        Specify color matrix
>     setting from undef, bt709, fcc, bt470bg, smpte170m,\n");
>     +    H0("                                 smpte240m, GBR, YCgCo,
>     bt2020nc, bt2020c\n");
>     +    H0("   --chromaloc <integer>         Specify chroma sample
>     location (0 to 5). Default of
>     %d\n",param->chromaSampleLocTypeTopField);
>     +    H0("   --[no-]fieldseq               Specify that pictures
>     are fields and an SEI timing message\n");
>     +    H0("                                 will be added to every
>     access unit. Default %s\n", OPT(param->bEnableFieldSeqFlag));
>     +    H0("   --[no-]framefieldinfo         Specify that a
>     pic-struct will be added to the SEI timing message. Default %s\n",
>     OPT(param->bEnableFrameFieldInfoPresentFlag));
>     +    H0("   --crop-rect <string>          Add
>     'left,top,right,bottom' to the bitstream-level cropping rectangle\n");
>     +    H0("   --timinginfo                  Add timing information
>     to the VUI. Defaut %s\n",
>     OPT(param->bEnableVuiTimingInfoPresentFlag));
>     +    H0("   --nal-hrd                     Signal HRD information.
>     Default %s\n", OPT(param->bEnableVuiHrdParametersPresentFlag));
>     +    H0("   --bitstreamrestriction        Add bit stream
>     restriction fields to the VUI. Default %s\n",
>     OPT(param->bEnableBitstreamRestrictionFlag));
>     +    H0("   --subpichrd                   Add sub picture HRD
>     parameters to the HRD. Default %s\n",
>     OPT(param->bEnableSubPicHrdParamsPresentFlag));
>
>
> nicely done
Thanks.  It's all modeled after x264 cli.
>
>      #undef OPT
>      #undef H0
>          exit(0);
>     diff -r 1c78bd13a14f -r 8ef0c1405487 source/x265.h
>     --- a/source/x265.h     Wed Feb 19 09:46:46 2014 -0800
>     +++ b/source/x265.h     Wed Feb 19 10:00:22 2014 -0800
>     @@ -332,6 +332,147 @@
>           * types are MD5(1), CRC(2), Checksum(3).  Default is 0, none */
>          int       decodedPictureHashSEI;
>
>
> I think these parameters should go within a vui sub-struct, similar to 
> the rc sub-struct.
>
> Excellent job documenting them all.
I was planning on reviewing these.  A few may come close to plagiarizing 
the h265 spec.  In those cases, unless someone can come up with 
something better I suggest simply quoting the h265 spec and giving it 
credit.
>
>
>     +    /*== Video Usability Information ==*/
>     +
>     +    /* Enable the generation of a VUI with all fields in the SPS.
>      VUI fields
>     +     * that are not specified on the command line will have
>     default values. */
>     +    int       bEnableVuiParametersPresentFlag;
>     +
>     +    /* Enable aspect ratio in VUI.  Causes the aspect_ratio_idc
>     to be added
>     +     * to the VUI.  The default is false. */
>     +    int bEnableAspectRatioIdc;
>     +
>     +    /* Aspect ratio idc to be added to the VUI.  The default is 0
>     indicating
>     +     * the apsect ratio is unspecified.  If set to
>     EXTENDED_SAR(255) then
>     +     * sarWidth and sarHeight must also be set. */
>     +    int       aspectRatioIdc;
>     +
>     +    /* Sample Aspect Ratio width in arbitrary units to be added
>     to the VUI
>     +     * only if aspectRatioIdc is set to EXTENDED_SAR(255).  This
>     is the width
>     +     * of an individual pixel.  If this is set then sarHeight
>     must also be set.
>     +     */
>     +    int       sarWidth;
>     +
>     +    /* Sample Aspect Ratio height in arbitrary units to be added
>     to the VUI.
>     +     * only if aspectRatioIdc is set to EXTENDED_SAR(255).  This
>     is the width
>     +     * of an individual pixel.  If this is set then sarWidth must
>     also be set.
>     +     */
>     +    int       sarHeight;
>     +
>     +    /* Enable overscan info present flag in the VUI.  If this is
>     set then
>     +     * bEnabledOverscanAppropriateFlag will be added to the VUI.
>     The default
>     +     * is false. */
>     +    int       bEnableOverscanInfoPresentFlag;
>     +
>     +    /* Enable overscan appropriate flag.  The status of this flag
>     is added to
>     +     * the VUI only if bEnableOverscanInfoPresentFlag is set.  If
>     this flag is
>     +     * set then cropped decoded pictures may be output for
>     display. The default
>     +     * is false. */
>     +    int       bEnableOverscanAppropriateFlag;
>     +
>     +    /* Video signal type present flag of the VUI.  If this is set
>     then
>     +     * videoFormat, bEnableVideoFullRangeFlag and
>     +     * bEnableColorDescriptionPresentFlag will be added to the
>     VUI.  The default
>     +     * is false. */
>     +    int       bEnableVideoSignalTypePresentFlag;
>     +
>     +    /* Video format of the source video.  0 = component, 1 = PAL,
>     2 = NTSC,
>     +     * 3 = SECAM, 4 = MAC, 5 = unspecified video format is the
>     default. */
>     +    int       videoFormat;
>     +
>     +    /* Video full range flag indicates the black level and range
>     of the luma
>     +     * and chroma signals as derived from E?Y, E?PB, and E?PR or
>     E?R, E?G, and
>     +     * E?B real-valued component signals.  False is the default. */
>     +    int       bEnableVideoFullRangeFlag;
>     +
>     +    /* Color description present flag in the VUI.  If this is set
>     then
>     +     * color_primaries, transfer_characteristics and
>     matrix_coeffs are to be added
>     +     * to the VUI.  The default is false. */
>     +    int       bEnableColorDescriptionPresentFlag;
>     +
>     +    /* Color primaries holds the chromacity coordinates of the
>     source primaries.
>     +     * The default is 2. */
>     +    int       colorPrimaries;
>     +
>     +    /* Transfer characteristics indicates the opto-electronic
>     transfer characteristic
>     +     * of the source picture.  The default is 2. */
>     +    int       transferCharacteristics;
>     +
>     +    /* Matrix coefficients used to derive the luma and chroma
>     signals from the red,
>     +     * blue and green primaries.  The default is 2. */
>     +    int       matrixCoeffs;
>     +
>     +    /* Chroma location info present flag adds
>     chroma_sample_loc_type_top_field and
>     +     * chroma_sample_loc_type_bottom_field to the VUI.  The
>     default is false. */
>     +    int       bEnableChromaLocInfoPresentFlag;
>     +
>     +    /* Chroma sample location type top field holds the chroma
>     location in the top
>     +     * field.  The default is 0. */
>     +    int       chromaSampleLocTypeTopField;
>     +
>     +    /* Chroma sample location type bottom field holds the chroma
>     location in the bottom
>     +     * field.  The default is 0. */
>     +    int       chromaSampleLocTypeBottomField;
>     +
>     +    /* Field seq flag specifies that the pictures are fields and
>     each one has a
>     +     * timing SEI message.  The default is false */
>     +    int       bEnableFieldSeqFlag;
>     +
>     +    /* Frame field info present flag indicates that each picture
>     has a timing SEI
>     +     * message wich includes a pic_struct, source_scan_type and
>     duplicate_flag
>     +     * elements.  If not set then the pic_struct element is not
>     included.  The
>     +     * default is false. */
>     +    int       bEnableFrameFieldInfoPresentFlag;
>     +
>     +    /* Default display window flag adds def_disp_win_left_offset ,
>     +     * def_disp_win_right_offset, def_disp_win_top_offset and
>     +     * def_disp_win_bottom_offset to the VUI.  The default is
>     false. */
>     +    int       bEnableDefaultDisplayWindowFlag;
>     +
>     +    /* Default display window left offset holds the left offset
>     with the
>     +     * conformance cropping window to further crop the displayed
>     window. */
>     +    int       defDispWinLeftOffset;
>     +
>     +    /* Default display window right offset holds the right offset
>     with the
>     +     * conformance cropping window to further crop the displayed
>     window. */
>     +    int       defDispWinRightOffset;
>     +
>     +    /* Default display window top offset holds the top offset
>     with the
>     +     * conformance cropping window to further crop the displayed
>     window. */
>     +    int       defDispWinTopOffset;
>     +
>     +    /* Default display window bottom offset holds the bottom
>     offset with the
>     +     * conformance cropping window to further crop the displayed
>     window. */
>     +    int       defDispWinBottomOffset;
>     +
>     +    /* VUI timing info present flag adds vui_num_units_in_tick,
>     vui_time_scale,
>     +     * vui_poc_proportional_to_timing_flag and
>     vui_hrd_parameters_present_flag
>     +     * to the VUI.  vui_num_units_in_tick, vui_time_scale and
>     +     * vui_poc_proportional_to_timing_flag are derived from
>     processing the input
>     +     * video.  The default is false. */
>     +    int       bEnableVuiTimingInfoPresentFlag;
>     +
>     +    /* VUI hrd parameters present flag adds the HRD to the VUI */
>     +    int       bEnableVuiHrdParametersPresentFlag;
>     +
>     +    /* Bitstream restriction flag adds tiles_fixed_structure_flag,
>     +     * motion_vectors_over_pic_boundaries_flag,
>     restricted_ref_pic_lists_flag,
>     +     * min_spatial_segmentation_idc, max_bytes_per_pic_denom,
>     +     * max_bit_per_min_cu_denom, log2_max_mv_length_horizontal and
>     +     * log2_max_mv_length_vertical to the VUI. All values are
>     derived from
>     +     * processing the input video.  The default is false.  */
>     +    int       bEnableBitstreamRestrictionFlag;
>     +
>     +    /*== Hypothetical Reference Decoder Parameters ==*/
>     +
>     +    /* Sub pic HRD params present flag determines if
>     tic_divisor_minus2,
>     +     * du_cpb_removal_delay_increment_length_minus1,
>     +     * sub_pic_cpb_params_in_pic_timing_sei_flag,
>     +     * dpb_output_delay_du_length_minus1 and cpb_size_du_scale
>     +     * are added to the HRD.  All are derived from processing the
>     input video.
>     +     * The default is false. */
>     +    int       bEnableSubPicHrdParamsPresentFlag;
>     +
>          /*== Internal Picture Specification ==*/
>
>          /* Internal encoder bit depth. If x265 was compiled to use
>     8bit pixels
>     _______________________________________________
>     x265-devel mailing list
>     x265-devel at videolan.org <mailto:x265-devel at videolan.org>
>     https://mailman.videolan.org/listinfo/x265-devel
>
>
>
>
> -- 
> Steve Borho
>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
I have already found a minor nit here and there so you will probably see 
me submit a relevant tweak here and there.

There looks like a lot of cruft in the design of x265, mostly from the 
HM base, If you want get rid of it then there needs to be a plan of 
coming up with something to replace it with and I am not a fan of simply 
replacing x265's C++ classes with C structures that are copies of those 
classes.  If this is something that you need somebody to work on then I 
would like to volunteer.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20140220/5d97d565/attachment-0001.html>


More information about the x265-devel mailing list