Ignore:
Timestamp:
26 Feb 2015, 00:21:54 (10 years ago)
Author:
seregin
Message:

merge with SHM-upgrade branch

Location:
branches/SHM-dev
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-dev

  • branches/SHM-dev/source

  • branches/SHM-dev/source/Lib/TLibDecoder/SEIread.cpp

    r912 r1029  
    3232 */
    3333
    34 /** 
     34/**
    3535 \file     SEIread.cpp
    36  \brief    reading functionality for SEI messages
     36 \brief    reading funtionality for SEI messages
    3737 */
    3838
     
    4343#include "SyntaxElementParser.h"
    4444#include "SEIread.h"
     45#include "TLibCommon/TComPicYuv.h"
     46#include <iomanip>
     47
    4548
    4649//! \ingroup TLibDecoder
    4750//! \{
    4851
     52
    4953#if ENC_DEC_TRACE
    5054Void  xTraceSEIHeader()
     
    5559Void  xTraceSEIMessageType(SEI::PayloadType payloadType)
    5660{
    57   switch (payloadType)
    58   {
    59   case SEI::DECODED_PICTURE_HASH:
    60     fprintf( g_hTrace, "=========== Decoded picture hash SEI message ===========\n");
    61     break;
    62   case SEI::USER_DATA_UNREGISTERED:
    63     fprintf( g_hTrace, "=========== User Data Unregistered SEI message ===========\n");
    64     break;
    65   case SEI::ACTIVE_PARAMETER_SETS:
    66     fprintf( g_hTrace, "=========== Active Parameter sets SEI message ===========\n");
    67     break;
    68   case SEI::BUFFERING_PERIOD:
    69     fprintf( g_hTrace, "=========== Buffering period SEI message ===========\n");
    70     break;
    71   case SEI::PICTURE_TIMING:
    72     fprintf( g_hTrace, "=========== Picture timing SEI message ===========\n");
    73     break;
    74   case SEI::RECOVERY_POINT:
    75     fprintf( g_hTrace, "=========== Recovery point SEI message ===========\n");
    76     break;
    77   case SEI::FRAME_PACKING:
    78     fprintf( g_hTrace, "=========== Frame Packing Arrangement SEI message ===========\n");
    79     break;
    80   case SEI::DISPLAY_ORIENTATION:
    81     fprintf( g_hTrace, "=========== Display Orientation SEI message ===========\n");
    82     break;
    83   case SEI::TEMPORAL_LEVEL0_INDEX:
    84     fprintf( g_hTrace, "=========== Temporal Level Zero Index SEI message ===========\n");
    85     break;
    86   case SEI::REGION_REFRESH_INFO:
    87     fprintf( g_hTrace, "=========== Gradual Decoding Refresh Information SEI message ===========\n");
    88     break;
    89   case SEI::DECODING_UNIT_INFO:
    90     fprintf( g_hTrace, "=========== Decoding Unit Information SEI message ===========\n");
    91     break;
    92   case SEI::TONE_MAPPING_INFO:
    93     fprintf( g_hTrace, "===========Tone Mapping Info SEI message ===========\n");
    94     break;
    95 #if P0050_KNEE_FUNCTION_SEI
    96   case SEI::KNEE_FUNCTION_INFO:
    97     fprintf( g_hTrace, "=========== Knee Function Information SEI message ===========\n");
    98     break;
    99 #endif
    100 #if Q0074_COLOUR_REMAPPING_SEI
    101   case SEI::COLOUR_REMAPPING_INFO:
    102     fprintf( g_hTrace, "===========Colour Remapping Information SEI message ===========\n");
    103     break;
    104 #endif
    105   case SEI::SOP_DESCRIPTION:
    106     fprintf( g_hTrace, "=========== SOP Description SEI message ===========\n");
    107     break;
    108   case SEI::SCALABLE_NESTING:
    109     fprintf( g_hTrace, "=========== Scalable Nesting SEI message ===========\n");
    110     break;
    111 #if SVC_EXTENSION
    112 #if LAYERS_NOT_PRESENT_SEI
    113   case SEI::LAYERS_NOT_PRESENT:
    114     fprintf( g_hTrace, "=========== Layers Present SEI message ===========\n");
    115     break;
    116 #endif
    117 #if N0383_IL_CONSTRAINED_TILE_SETS_SEI
    118   case SEI::INTER_LAYER_CONSTRAINED_TILE_SETS:
    119     fprintf( g_hTrace, "=========== Inter Layer Constrained Tile Sets SEI message ===========\n");
    120     break;
    121 #endif
    122 #if SUB_BITSTREAM_PROPERTY_SEI
    123   case SEI::SUB_BITSTREAM_PROPERTY:
    124     fprintf( g_hTrace, "=========== Sub-bitstream property SEI message ===========\n");
    125     break;
    126 #endif
    127 #if O0164_MULTI_LAYER_HRD
    128   case SEI::BSP_NESTING:
    129     fprintf( g_hTrace, "=========== Bitstream parition nesting SEI message ===========\n");
    130     break;
    131   case SEI::BSP_INITIAL_ARRIVAL_TIME:
    132     fprintf( g_hTrace, "=========== Bitstream parition initial arrival time SEI message ===========\n");
    133     break;
    134 #if !REMOVE_BSP_HRD_SEI
    135   case SEI::BSP_HRD:
    136     fprintf( g_hTrace, "=========== Bitstream parition HRD parameters SEI message ===========\n");
    137     break;
    138 #endif
    139 #endif
    140 #if Q0078_ADD_LAYER_SETS
    141   case SEI::OUTPUT_LAYER_SET_NESTING:
    142     fprintf(g_hTrace, "=========== Output layer set nesting SEI message ===========\n");
    143     break;
    144   case SEI::VPS_REWRITING:
    145     fprintf(g_hTrace, "=========== VPS rewriting SEI message ===========\n");
    146     break;
    147 #endif
    148 #if Q0096_OVERLAY_SEI
    149   case SEI::OVERLAY_INFO:
    150     fprintf( g_hTrace, "=========== Overlay Information SEI message ===========\n");
    151     break;
    152 #endif
    153 #endif //SVC_EXTENSION
    154   default:
    155     fprintf( g_hTrace, "=========== Unknown SEI message ===========\n");
    156     break;
    157   }
    158 }
    159 #endif
     61  fprintf( g_hTrace, "=========== %s SEI message ===========\n", SEI::getSEIMessageString(payloadType));
     62}
     63#endif
     64
     65Void SEIReader::sei_read_code(std::ostream *pOS, UInt uiLength, UInt& ruiCode, const Char *pSymbolName)
     66{
     67  READ_CODE(uiLength, ruiCode, pSymbolName);
     68  if (pOS)      (*pOS) << "  " << std::setw(55) << pSymbolName << ": " << ruiCode << "\n";
     69}
     70
     71Void SEIReader::sei_read_uvlc(std::ostream *pOS, UInt& ruiCode, const Char *pSymbolName)
     72{
     73  READ_UVLC(ruiCode, pSymbolName);
     74  if (pOS)      (*pOS) << "  " << std::setw(55) << pSymbolName << ": " << ruiCode << "\n";
     75}
     76
     77Void SEIReader::sei_read_svlc(std::ostream *pOS, Int& ruiCode, const Char *pSymbolName)
     78{
     79  READ_SVLC(ruiCode, pSymbolName);
     80  if (pOS)      (*pOS) << "  " << std::setw(55) << pSymbolName << ": " << ruiCode << "\n";
     81}
     82
     83Void SEIReader::sei_read_flag(std::ostream *pOS, UInt& ruiCode, const Char *pSymbolName)
     84{
     85  READ_FLAG(ruiCode, pSymbolName);
     86  if (pOS)      (*pOS) << "  " << std::setw(55) << pSymbolName << ": " << (ruiCode?1:0) << "\n";
     87}
     88
     89static inline Void output_sei_message_header(SEI &sei, std::ostream *pDecodedMessageOutputStream, UInt payloadSize)
     90{
     91  if (pDecodedMessageOutputStream)
     92  {
     93    std::string seiMessageHdr(SEI::getSEIMessageString(sei.payloadType())); seiMessageHdr+=" SEI message";
     94    (*pDecodedMessageOutputStream) << std::setfill('-') << std::setw(seiMessageHdr.size()) << "-" << std::setfill(' ') << "\n" << seiMessageHdr << "\n";
     95  }
     96}
     97
     98#undef READ_CODE
     99#undef READ_SVLC
     100#undef READ_UVLC
     101#undef READ_FLAG
     102
    160103
    161104/**
     
    163106 */
    164107#if LAYERS_NOT_PRESENT_SEI
    165 void SEIReader::parseSEImessage(TComInputBitstream* bs, SEIMessages& seis, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps)
    166 #else
    167 void SEIReader::parseSEImessage(TComInputBitstream* bs, SEIMessages& seis, const NalUnitType nalUnitType, TComSPS *sps)
     108Void SEIReader::parseSEImessage(TComInputBitstream* bs, SEIMessages& seis, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
     109#else
     110Void SEIReader::parseSEImessage(TComInputBitstream* bs, SEIMessages& seis, const NalUnitType nalUnitType, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
    168111#endif
    169112{
     
    174117  {
    175118#if LAYERS_NOT_PRESENT_SEI
    176     xReadSEImessage(seis, nalUnitType, vps, sps);
    177 #else
    178     xReadSEImessage(seis, nalUnitType, sps);
     119    xReadSEImessage(seis, nalUnitType, vps, sps, pDecodedMessageOutputStream);
     120#else
     121    xReadSEImessage(seis, nalUnitType, sps, pDecodedMessageOutputStream);
    179122#endif
    180123    /* SEI messages are an integer number of bytes, something has failed
     
    184127
    185128  UInt rbspTrailingBits;
    186   READ_CODE(8, rbspTrailingBits, "rbsp_trailing_bits");
     129  sei_read_code(NULL, 8, rbspTrailingBits, "rbsp_trailing_bits");
    187130  assert(rbspTrailingBits == 0x80);
    188131}
     
    190133#if O0164_MULTI_LAYER_HRD
    191134#if LAYERS_NOT_PRESENT_SEI
    192 Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, const SEIScalableNesting *nestingSei, const SEIBspNesting *bspNestingSei)
    193 #else
    194 Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComSPS *sps, const SEIScalableNesting *nestingSei)
     135Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, std::ostream *pDecodedMessageOutputStream, const SEIScalableNesting *nestingSei, const SEIBspNesting *bspNestingSei)
     136#else
     137Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComSPS *sps, std::ostream *pDecodedMessageOutputStream, const SEIScalableNesting *nestingSei)
    195138#endif
    196139#else
    197140#if LAYERS_NOT_PRESENT_SEI
    198 Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps)
    199 #else
    200 Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComSPS *sps)
     141Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
     142#else
     143Void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
    201144#endif
    202145#endif
     
    210153  do
    211154  {
    212     READ_CODE (8, val, "payload_type");
     155    sei_read_code(NULL, 8, val, "payload_type");
    213156    payloadType += val;
    214157  } while (val==0xFF);
     
    217160  do
    218161  {
    219     READ_CODE (8, val, "payload_size");
     162    sei_read_code(NULL, 8, val, "payload_size");
    220163    payloadSize += val;
    221164  } while (val==0xFF);
     
    242185    case SEI::USER_DATA_UNREGISTERED:
    243186      sei = new SEIuserDataUnregistered;
    244       xParseSEIuserDataUnregistered((SEIuserDataUnregistered&) *sei, payloadSize);
     187      xParseSEIuserDataUnregistered((SEIuserDataUnregistered&) *sei, payloadSize, pDecodedMessageOutputStream);
    245188      break;
    246189    case SEI::ACTIVE_PARAMETER_SETS:
    247       sei = new SEIActiveParameterSets; 
    248       xParseSEIActiveParameterSets((SEIActiveParameterSets&) *sei, payloadSize);
    249       break; 
     190      sei = new SEIActiveParameterSets;
     191      xParseSEIActiveParameterSets((SEIActiveParameterSets&) *sei, payloadSize, pDecodedMessageOutputStream);
     192      break;
    250193    case SEI::DECODING_UNIT_INFO:
    251194      if (!sps)
     
    255198      else
    256199      {
    257         sei = new SEIDecodingUnitInfo; 
     200        sei = new SEIDecodingUnitInfo;
    258201#if VPS_VUI_BSP_HRD_PARAMS
    259         xParseSEIDecodingUnitInfo((SEIDecodingUnitInfo&) *sei, payloadSize, sps, nestingSei, bspNestingSei, vps);
    260 #else
    261         xParseSEIDecodingUnitInfo((SEIDecodingUnitInfo&) *sei, payloadSize, sps);
    262 #endif
    263       }
    264       break; 
     202        xParseSEIDecodingUnitInfo((SEIDecodingUnitInfo&) *sei, payloadSize, sps, nestingSei, bspNestingSei, vps, pDecodedMessageOutputStream);
     203#else       
     204        xParseSEIDecodingUnitInfo((SEIDecodingUnitInfo&) *sei, payloadSize, sps, pDecodedMessageOutputStream);
     205#endif
     206      }
     207      break;
    265208    case SEI::BUFFERING_PERIOD:
    266209      if (!sps)
     
    272215        sei = new SEIBufferingPeriod;
    273216#if VPS_VUI_BSP_HRD_PARAMS
    274         xParseSEIBufferingPeriod((SEIBufferingPeriod&) *sei, payloadSize, sps, nestingSei, bspNestingSei, vps);
    275 #else
    276         xParseSEIBufferingPeriod((SEIBufferingPeriod&) *sei, payloadSize, sps);
     217        xParseSEIBufferingPeriod((SEIBufferingPeriod&) *sei, payloadSize, sps, nestingSei, bspNestingSei, vps, pDecodedMessageOutputStream);
     218#else
     219        xParseSEIBufferingPeriod((SEIBufferingPeriod&) *sei, payloadSize, sps, pDecodedMessageOutputStream);
    277220#endif
    278221      }
     
    287230        sei = new SEIPictureTiming;
    288231#if VPS_VUI_BSP_HRD_PARAMS
    289         xParseSEIPictureTiming((SEIPictureTiming&)*sei, payloadSize, sps, nestingSei, bspNestingSei, vps);
    290 #else
    291         xParseSEIPictureTiming((SEIPictureTiming&)*sei, payloadSize, sps);
     232        xParseSEIPictureTiming((SEIPictureTiming&)*sei, payloadSize, sps, nestingSei, bspNestingSei, vps, pDecodedMessageOutputStream);
     233#else
     234        xParseSEIPictureTiming((SEIPictureTiming&)*sei, payloadSize, sps, pDecodedMessageOutputStream);
    292235#endif
    293236      }
     
    295238    case SEI::RECOVERY_POINT:
    296239      sei = new SEIRecoveryPoint;
    297       xParseSEIRecoveryPoint((SEIRecoveryPoint&) *sei, payloadSize);
     240      xParseSEIRecoveryPoint((SEIRecoveryPoint&) *sei, payloadSize, pDecodedMessageOutputStream);
    298241      break;
    299242    case SEI::FRAME_PACKING:
    300243      sei = new SEIFramePacking;
    301       xParseSEIFramePacking((SEIFramePacking&) *sei, payloadSize);
     244      xParseSEIFramePacking((SEIFramePacking&) *sei, payloadSize, pDecodedMessageOutputStream);
     245      break;
     246    case SEI::SEGM_RECT_FRAME_PACKING:
     247      sei = new SEISegmentedRectFramePacking;
     248      xParseSEISegmentedRectFramePacking((SEISegmentedRectFramePacking&) *sei, payloadSize, pDecodedMessageOutputStream);
    302249      break;
    303250    case SEI::DISPLAY_ORIENTATION:
    304251      sei = new SEIDisplayOrientation;
    305       xParseSEIDisplayOrientation((SEIDisplayOrientation&) *sei, payloadSize);
     252      xParseSEIDisplayOrientation((SEIDisplayOrientation&) *sei, payloadSize, pDecodedMessageOutputStream);
    306253      break;
    307254    case SEI::TEMPORAL_LEVEL0_INDEX:
    308255      sei = new SEITemporalLevel0Index;
    309       xParseSEITemporalLevel0Index((SEITemporalLevel0Index&) *sei, payloadSize);
     256      xParseSEITemporalLevel0Index((SEITemporalLevel0Index&) *sei, payloadSize, pDecodedMessageOutputStream);
    310257      break;
    311258    case SEI::REGION_REFRESH_INFO:
    312259      sei = new SEIGradualDecodingRefreshInfo;
    313       xParseSEIGradualDecodingRefreshInfo((SEIGradualDecodingRefreshInfo&) *sei, payloadSize);
     260      xParseSEIRegionRefreshInfo((SEIGradualDecodingRefreshInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
     261      break;
     262    case SEI::NO_DISPLAY:
     263      sei = new SEINoDisplay;
     264      xParseSEINoDisplay((SEINoDisplay&) *sei, payloadSize, pDecodedMessageOutputStream);
    314265      break;
    315266    case SEI::TONE_MAPPING_INFO:
    316267      sei = new SEIToneMappingInfo;
    317       xParseSEIToneMappingInfo((SEIToneMappingInfo&) *sei, payloadSize);
    318       break;
    319 #if P0050_KNEE_FUNCTION_SEI
     268      xParseSEIToneMappingInfo((SEIToneMappingInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
     269      break;
     270    case SEI::SOP_DESCRIPTION:
     271      sei = new SEISOPDescription;
     272      xParseSEISOPDescription((SEISOPDescription&) *sei, payloadSize, pDecodedMessageOutputStream);
     273      break;
     274    case SEI::SCALABLE_NESTING:
     275      sei = new SEIScalableNesting;
     276#if LAYERS_NOT_PRESENT_SEI
     277      xParseSEIScalableNesting((SEIScalableNesting&) *sei, nalUnitType, payloadSize, vps, sps, pDecodedMessageOutputStream);
     278#else
     279      xParseSEIScalableNesting((SEIScalableNesting&) *sei, nalUnitType, payloadSize, sps, pDecodedMessageOutputStream);
     280#endif
     281      break;
     282    case SEI::TEMP_MOTION_CONSTRAINED_TILE_SETS:
     283      sei = new SEITempMotionConstrainedTileSets;
     284      xParseSEITempMotionConstraintsTileSets((SEITempMotionConstrainedTileSets&) *sei, payloadSize, pDecodedMessageOutputStream);
     285      break;
     286    case SEI::TIME_CODE:
     287      sei = new SEITimeCode;
     288      xParseSEITimeCode((SEITimeCode&) *sei, payloadSize, pDecodedMessageOutputStream);
     289      break;
     290    case SEI::CHROMA_SAMPLING_FILTER_HINT:
     291      sei = new SEIChromaSamplingFilterHint;
     292      xParseSEIChromaSamplingFilterHint((SEIChromaSamplingFilterHint&) *sei, payloadSize/*, sps*/, pDecodedMessageOutputStream);
     293      //}
     294      break;
    320295    case SEI::KNEE_FUNCTION_INFO:
    321296      sei = new SEIKneeFunctionInfo;
    322       xParseSEIKneeFunctionInfo((SEIKneeFunctionInfo&) *sei, payloadSize);
    323       break;
    324 #endif
     297      xParseSEIKneeFunctionInfo((SEIKneeFunctionInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
     298      break;
     299    case SEI::MASTERING_DISPLAY_COLOUR_VOLUME:
     300      sei = new SEIMasteringDisplayColourVolume;
     301      xParseSEIMasteringDisplayColourVolume((SEIMasteringDisplayColourVolume&) *sei, payloadSize, pDecodedMessageOutputStream);
     302      break;
    325303#if Q0074_COLOUR_REMAPPING_SEI
    326304    case SEI::COLOUR_REMAPPING_INFO:
    327305      sei = new SEIColourRemappingInfo;
    328       xParseSEIColourRemappingInfo((SEIColourRemappingInfo&) *sei, payloadSize);
    329       break;
    330 #endif
    331     case SEI::SOP_DESCRIPTION:
    332       sei = new SEISOPDescription;
    333       xParseSEISOPDescription((SEISOPDescription&) *sei, payloadSize);
    334       break;
    335     case SEI::SCALABLE_NESTING:
    336       sei = new SEIScalableNesting;
    337 #if LAYERS_NOT_PRESENT_SEI
    338       xParseSEIScalableNesting((SEIScalableNesting&) *sei, nalUnitType, payloadSize, vps, sps);
    339 #else
    340       xParseSEIScalableNesting((SEIScalableNesting&) *sei, nalUnitType, payloadSize, sps);
    341 #endif
    342       break;
     306      xParseSEIColourRemappingInfo((SEIColourRemappingInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
     307      break;
     308#endif
    343309#if SVC_EXTENSION
    344310#if LAYERS_NOT_PRESENT_SEI
     
    351317      {
    352318        sei = new SEILayersNotPresent;
    353         xParseSEILayersNotPresent((SEILayersNotPresent&) *sei, payloadSize, vps);
     319        xParseSEILayersNotPresent((SEILayersNotPresent&) *sei, payloadSize, vps, pDecodedMessageOutputStream);
    354320      }
    355321      break;
     
    358324    case SEI::INTER_LAYER_CONSTRAINED_TILE_SETS:
    359325      sei = new SEIInterLayerConstrainedTileSets;
    360       xParseSEIInterLayerConstrainedTileSets((SEIInterLayerConstrainedTileSets&) *sei, payloadSize);
     326      xParseSEIInterLayerConstrainedTileSets((SEIInterLayerConstrainedTileSets&) *sei, payloadSize, pDecodedMessageOutputStream);
    361327      break;
    362328#endif
     
    365331     sei = new SEISubBitstreamProperty;
    366332#if OLS_IDX_CHK
    367      xParseSEISubBitstreamProperty((SEISubBitstreamProperty&) *sei, vps);
    368 #else
    369      xParseSEISubBitstreamProperty((SEISubBitstreamProperty&) *sei);
     333     xParseSEISubBitstreamProperty((SEISubBitstreamProperty&) *sei, vps, pDecodedMessageOutputStream);
     334#else
     335     xParseSEISubBitstreamProperty((SEISubBitstreamProperty&) *sei, pDecodedMessageOutputStream);
    370336#endif
    371337     break;
     
    375341     sei = new SEIBspNesting;
    376342#if LAYERS_NOT_PRESENT_SEI
    377      xParseSEIBspNesting((SEIBspNesting&) *sei, nalUnitType, vps, sps, *nestingSei);
    378 #else
    379      xParseSEIBspNesting((SEIBspNesting&) *sei, nalUnitType, sps, *nestingSei);
     343     xParseSEIBspNesting((SEIBspNesting&) *sei, nalUnitType, vps, sps, *nestingSei, pDecodedMessageOutputStream);
     344#else
     345     xParseSEIBspNesting((SEIBspNesting&) *sei, nalUnitType, sps, *nestingSei, pDecodedMessageOutputStream);
    380346#endif
    381347     break;
    382348   case SEI::BSP_INITIAL_ARRIVAL_TIME:
    383349     sei = new SEIBspInitialArrivalTime;
    384      xParseSEIBspInitialArrivalTime((SEIBspInitialArrivalTime&) *sei, vps, sps, *nestingSei, *bspNestingSei);
     350     xParseSEIBspInitialArrivalTime((SEIBspInitialArrivalTime&) *sei, vps, sps, *nestingSei, *bspNestingSei, pDecodedMessageOutputStream);
    385351     break;
    386352#if !REMOVE_BSP_HRD_SEI
    387353   case SEI::BSP_HRD:
    388354     sei = new SEIBspHrd;
    389      xParseSEIBspHrd((SEIBspHrd&) *sei, sps, *nestingSei);
     355     xParseSEIBspHrd((SEIBspHrd&) *sei, sps, *nestingSei, pDecodedMessageOutputStream);
    390356     break;
    391357#endif
     
    395361     sei = new SEIOutputLayerSetNesting;
    396362#if LAYERS_NOT_PRESENT_SEI
    397      xParseSEIOutputLayerSetNesting((SEIOutputLayerSetNesting&)*sei, nalUnitType, vps, sps);
    398 #else
    399      xParseSEIOutputLayerSetNesting((SEIOutputLayerSetNesting&)*sei, nalUnitType, sps);
     363     xParseSEIOutputLayerSetNesting((SEIOutputLayerSetNesting&)*sei, nalUnitType, vps, sps, pDecodedMessageOutputStream);
     364#else
     365     xParseSEIOutputLayerSetNesting((SEIOutputLayerSetNesting&)*sei, nalUnitType, sps, pDecodedMessageOutputStream);
    400366#endif
    401367     break;
    402368   case SEI::VPS_REWRITING:
    403369     sei = new SEIVPSRewriting;
    404      xParseSEIVPSRewriting((SEIVPSRewriting&)*sei);
     370     xParseSEIVPSRewriting((SEIVPSRewriting&)*sei, pDecodedMessageOutputStream);
    405371     break;
    406372#endif
     
    408374   case SEI::TMVP_CONSTRAINTS:
    409375     sei =  new SEITMVPConstrains;
    410      xParseSEITMVPConstraints((SEITMVPConstrains&) *sei, payloadSize);
     376     xParseSEITMVPConstraints((SEITMVPConstrains&) *sei, payloadSize, pDecodedMessageOutputStream);
    411377     break;
    412378#endif
     
    414380   case SEI::FRAME_FIELD_INFO:
    415381     sei =  new SEIFrameFieldInfo;
    416      xParseSEIFrameFieldInfo    ((SEIFrameFieldInfo&) *sei, payloadSize);
     382     xParseSEIFrameFieldInfo    ((SEIFrameFieldInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
    417383     break;
    418384#endif
     
    420386   case SEI::OVERLAY_INFO:
    421387     sei = new SEIOverlayInfo;
    422      xParseSEIOverlayInfo((SEIOverlayInfo&) *sei, payloadSize);
     388     xParseSEIOverlayInfo((SEIOverlayInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
    423389     break;
    424390#endif
     
    429395      {
    430396        UInt seiByte;
    431         READ_CODE (8, seiByte, "unknown prefix SEI payload byte");
     397        sei_read_code (NULL, 8, seiByte, "unknown prefix SEI payload byte");
    432398      }
    433399      printf ("Unknown prefix SEI message (payloadType = %d) was found!\n", payloadType);
     400      if (pDecodedMessageOutputStream)
     401      {
     402        (*pDecodedMessageOutputStream) << "Unknown prefix SEI message (payloadType = " << payloadType << ") was found!\n";
     403      }
     404      break;
    434405    }
    435406  }
     
    440411      case SEI::USER_DATA_UNREGISTERED:
    441412        sei = new SEIuserDataUnregistered;
    442         xParseSEIuserDataUnregistered((SEIuserDataUnregistered&) *sei, payloadSize);
     413        xParseSEIuserDataUnregistered((SEIuserDataUnregistered&) *sei, payloadSize, pDecodedMessageOutputStream);
    443414        break;
    444415      case SEI::DECODED_PICTURE_HASH:
    445416        sei = new SEIDecodedPictureHash;
    446         xParseSEIDecodedPictureHash((SEIDecodedPictureHash&) *sei, payloadSize);
     417        xParseSEIDecodedPictureHash((SEIDecodedPictureHash&) *sei, payloadSize, pDecodedMessageOutputStream);
    447418        break;
    448419      default:
     
    450421        {
    451422          UInt seiByte;
    452           READ_CODE (8, seiByte, "unknown suffix SEI payload byte");
     423          sei_read_code( NULL, 8, seiByte, "unknown suffix SEI payload byte");
    453424        }
    454425        printf ("Unknown suffix SEI message (payloadType = %d) was found!\n", payloadType);
    455     }
    456   }
     426        if (pDecodedMessageOutputStream)
     427        {
     428          (*pDecodedMessageOutputStream) << "Unknown suffix SEI message (payloadType = " << payloadType << ") was found!\n";
     429        }
     430        break;
     431    }
     432  }
     433
    457434  if (sei != NULL)
    458435  {
     
    473450    {
    474451      UInt reservedPayloadExtensionData;
    475       READ_CODE (1, reservedPayloadExtensionData, "reserved_payload_extension_data");
     452      sei_read_code ( pDecodedMessageOutputStream, 1, reservedPayloadExtensionData, "reserved_payload_extension_data");
    476453    }
    477454
     
    488465    {
    489466      UInt reservedPayloadExtensionData;
    490       READ_FLAG (reservedPayloadExtensionData, "reserved_payload_extension_data");
     467      sei_read_flag ( 0, reservedPayloadExtensionData, "reserved_payload_extension_data");
    491468    }
    492469
    493470    UInt dummy;
    494     READ_FLAG (dummy, "payload_bit_equal_to_one"); payloadBitsRemaining--;
     471    sei_read_flag( 0, dummy, "payload_bit_equal_to_one"); payloadBitsRemaining--;
    495472    while (payloadBitsRemaining)
    496473    {
    497       READ_FLAG (dummy, "payload_bit_equal_to_zero"); payloadBitsRemaining--;
     474      sei_read_flag( 0, dummy, "payload_bit_equal_to_zero"); payloadBitsRemaining--;
    498475    }
    499476  }
     
    505482}
    506483
    507 #if P0138_USE_ALT_CPB_PARAMS_FLAG
    508 /**
    509  * Check if SEI message contains payload extension
    510  */
    511 Bool SEIReader::xPayloadExtensionPresent()
    512 {
    513   Int payloadBitsRemaining = getBitstream()->getNumBitsLeft();
    514   Bool payloadExtensionPresent = false;
    515 
    516   if (payloadBitsRemaining > 8)
    517   {
    518     payloadExtensionPresent = true;
    519   }
    520   else
    521   {
    522     Int finalBits = getBitstream()->peekBits(payloadBitsRemaining);
    523     while (payloadBitsRemaining && (finalBits & 1) == 0)
    524     {
    525       payloadBitsRemaining--;
    526       finalBits >>= 1;
    527     }
    528     payloadBitsRemaining--;
    529     if (payloadBitsRemaining > 0)
    530     {
    531       payloadExtensionPresent = true;
    532     }
    533   }
    534 
    535   return payloadExtensionPresent;
    536 }
    537 #endif
    538 
    539484/**
    540485 * parse bitstream bs and unpack a user_data_unregistered SEI message
    541486 * of payloasSize bytes into sei.
    542487 */
    543 Void SEIReader::xParseSEIuserDataUnregistered(SEIuserDataUnregistered &sei, UInt payloadSize)
    544 {
    545   assert(payloadSize >= 16);
     488
     489Void SEIReader::xParseSEIuserDataUnregistered(SEIuserDataUnregistered &sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     490{
     491  assert(payloadSize >= ISO_IEC_11578_LEN);
    546492  UInt val;
    547 
    548   for (UInt i = 0; i < 16; i++)
    549   {
    550     READ_CODE (8, val, "uuid_iso_iec_11578");
     493  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     494
     495  for (UInt i = 0; i < ISO_IEC_11578_LEN; i++)
     496  {
     497    sei_read_code( pDecodedMessageOutputStream, 8, val, "uuid_iso_iec_11578");
    551498    sei.uuid_iso_iec_11578[i] = val;
    552499  }
    553500
    554   sei.userDataLength = payloadSize - 16;
     501  sei.userDataLength = payloadSize - ISO_IEC_11578_LEN;
    555502  if (!sei.userDataLength)
    556503  {
     
    562509  for (UInt i = 0; i < sei.userDataLength; i++)
    563510  {
    564     READ_CODE (8, val, "user_data" );
     511    sei_read_code( pDecodedMessageOutputStream, 8, val, "user_data" );
    565512    sei.userData[i] = val;
    566513  }
     
    571518 * of payloadSize bytes into sei.
    572519 */
    573 Void SEIReader::xParseSEIDecodedPictureHash(SEIDecodedPictureHash& sei, UInt /*payloadSize*/)
    574 {
     520Void SEIReader::xParseSEIDecodedPictureHash(SEIDecodedPictureHash& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     521{
     522  UInt bytesRead = 0;
     523  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     524
    575525  UInt val;
    576   READ_CODE (8, val, "hash_type");
    577   sei.method = static_cast<SEIDecodedPictureHash::Method>(val);
    578   for(Int yuvIdx = 0; yuvIdx < 3; yuvIdx++)
    579   {
    580     if(SEIDecodedPictureHash::MD5 == sei.method)
    581     {
    582       for (UInt i = 0; i < 16; i++)
    583       {
    584         READ_CODE(8, val, "picture_md5");
    585         sei.digest[yuvIdx][i] = val;
    586       }
    587     }
    588     else if(SEIDecodedPictureHash::CRC == sei.method)
    589     {
    590       READ_CODE(16, val, "picture_crc");
    591       sei.digest[yuvIdx][0] = val >> 8 & 0xFF;
    592       sei.digest[yuvIdx][1] = val & 0xFF;
    593     }
    594     else if(SEIDecodedPictureHash::CHECKSUM == sei.method)
    595     {
    596       READ_CODE(32, val, "picture_checksum");
    597       sei.digest[yuvIdx][0] = (val>>24) & 0xff;
    598       sei.digest[yuvIdx][1] = (val>>16) & 0xff;
    599       sei.digest[yuvIdx][2] = (val>>8)  & 0xff;
    600       sei.digest[yuvIdx][3] =  val      & 0xff;
    601     }
    602   }
    603 }
    604 Void SEIReader::xParseSEIActiveParameterSets(SEIActiveParameterSets& sei, UInt /*payloadSize*/)
     526  sei_read_code( pDecodedMessageOutputStream, 8, val, "hash_type");
     527  sei.method = static_cast<SEIDecodedPictureHash::Method>(val); bytesRead++;
     528
     529  const Char *traceString="\0";
     530  switch (sei.method)
     531  {
     532    case SEIDecodedPictureHash::MD5: traceString="picture_md5"; break;
     533    case SEIDecodedPictureHash::CRC: traceString="picture_crc"; break;
     534    case SEIDecodedPictureHash::CHECKSUM: traceString="picture_checksum"; break;
     535    default: assert(false); break;
     536  }
     537
     538  if (pDecodedMessageOutputStream) (*pDecodedMessageOutputStream) << "  " << std::setw(55) << traceString << ": " << std::hex << std::setfill('0');
     539
     540  sei.m_digest.hash.clear();
     541  for(;bytesRead < payloadSize; bytesRead++)
     542  {
     543    sei_read_code( NULL, 8, val, traceString);
     544    sei.m_digest.hash.push_back((UChar)val);
     545    if (pDecodedMessageOutputStream) (*pDecodedMessageOutputStream) << std::setw(2) << val;
     546  }
     547
     548  if (pDecodedMessageOutputStream) (*pDecodedMessageOutputStream) << std::dec << std::setfill(' ') << "\n";
     549}
     550
     551Void SEIReader::xParseSEIActiveParameterSets(SEIActiveParameterSets& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    605552{
    606553  UInt val;
    607   READ_CODE(4, val, "active_video_parameter_set_id");   sei.activeVPSId = val;
    608   READ_FLAG(   val, "self_contained_cvs_flag");         sei.m_selfContainedCvsFlag = val ? true : false;
    609   READ_FLAG(   val, "no_parameter_set_update_flag");    sei.m_noParameterSetUpdateFlag = val ? true : false;
    610   READ_UVLC(   val, "num_sps_ids_minus1"); sei.numSpsIdsMinus1 = val;
     554  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     555
     556  sei_read_code( pDecodedMessageOutputStream, 4, val, "active_video_parameter_set_id");   sei.activeVPSId = val;
     557  sei_read_flag( pDecodedMessageOutputStream,    val, "self_contained_cvs_flag");         sei.m_selfContainedCvsFlag     = (val != 0);
     558  sei_read_flag( pDecodedMessageOutputStream,    val, "no_parameter_set_update_flag");    sei.m_noParameterSetUpdateFlag = (val != 0);
     559  sei_read_uvlc( pDecodedMessageOutputStream,    val, "num_sps_ids_minus1");              sei.numSpsIdsMinus1 = val;
    611560
    612561  sei.activeSeqParameterSetId.resize(sei.numSpsIdsMinus1 + 1);
     
    616565  for (Int i=0; i < (sei.numSpsIdsMinus1 + 1); i++)
    617566  {
    618     READ_UVLC(val, "active_seq_parameter_set_id");      sei.activeSeqParameterSetId[i] = val;
     567    sei_read_uvlc( pDecodedMessageOutputStream, val, "active_seq_parameter_set_id[i]");    sei.activeSeqParameterSetId[i] = val;
    619568  }
    620569#if R0247_SEI_ACTIVE
    621570  for (Int i=1; i < (sei.numSpsIdsMinus1 + 1); i++)
    622571  {
    623     READ_UVLC(val, "layer_sps_idx"); sei.layerSpsIdx[i] = val;
    624   }
    625 #endif
    626   xParseByteAlign();
     572    sei_read_uvlc( pDecodedMessageOutputStream, val, "layer_sps_idx"); sei.layerSpsIdx[i] = val;
     573  }
     574#endif 
    627575}
    628576
    629577#if VPS_VUI_BSP_HRD_PARAMS
    630 Void SEIReader::xParseSEIDecodingUnitInfo(SEIDecodingUnitInfo& sei, UInt /*payloadSize*/, TComSPS *sps, const SEIScalableNesting* nestingSei, const SEIBspNesting* bspNestingSei, TComVPS *vps)
    631 #else
    632 Void SEIReader::xParseSEIDecodingUnitInfo(SEIDecodingUnitInfo& sei, UInt /*payloadSize*/, TComSPS *sps)
     578Void SEIReader::xParseSEIDecodingUnitInfo(SEIDecodingUnitInfo& sei, UInt payloadSize, TComSPS *sps, const SEIScalableNesting* nestingSei, const SEIBspNesting* bspNestingSei, TComVPS *vps,std::ostream *pDecodedMessageOutputStream)
     579#else
     580Void SEIReader::xParseSEIDecodingUnitInfo(SEIDecodingUnitInfo& sei, UInt payloadSize, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
    633581#endif
    634582{
    635583  UInt val;
    636   READ_UVLC(val, "decoding_unit_idx");
     584  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     585  sei_read_uvlc( pDecodedMessageOutputStream, val, "decoding_unit_idx");
    637586  sei.m_decodingUnitIdx = val;
    638587
     
    674623    hrd = vui->getHrdParameters();
    675624  }
    676 #else
    677   TComVUI *vui = sps->getVuiParameters();
    678   TComHrd *hrd = vui->getHrdParameters();
    679 #endif
     625
    680626  if(hrd->getSubPicCpbParamsInPicTimingSEIFlag())
    681627  {
    682     READ_CODE( ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), val, "du_spt_cpb_removal_delay");
     628    sei_read_code( pDecodedMessageOutputStream, ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), val, "du_spt_cpb_removal_delay_increment");
    683629    sei.m_duSptCpbRemovalDelay = val;
    684630  }
     
    687633    sei.m_duSptCpbRemovalDelay = 0;
    688634  }
    689   READ_FLAG( val, "dpb_output_du_delay_present_flag"); sei.m_dpbOutputDuDelayPresentFlag = val ? true : false;
     635  sei_read_flag( pDecodedMessageOutputStream, val, "dpb_output_du_delay_present_flag"); sei.m_dpbOutputDuDelayPresentFlag = (val != 0);
    690636  if(sei.m_dpbOutputDuDelayPresentFlag)
    691637  {
    692     READ_CODE(hrd->getDpbOutputDelayDuLengthMinus1() + 1, val, "pic_spt_dpb_output_du_delay");
     638    sei_read_code( pDecodedMessageOutputStream, hrd->getDpbOutputDelayDuLengthMinus1() + 1, val, "pic_spt_dpb_output_du_delay");
    693639    sei.m_picSptDpbOutputDuDelay = val;
    694640  }
    695   xParseByteAlign();
     641#else
     642  TComVUI *vui = sps->getVuiParameters(); 
     643
     644  if(vui->getHrdParameters()->getSubPicCpbParamsInPicTimingSEIFlag())
     645  {
     646    sei_read_code( pDecodedMessageOutputStream, ( vui->getHrdParameters()->getDuCpbRemovalDelayLengthMinus1() + 1 ), val, "du_spt_cpb_removal_delay_increment");
     647    sei.m_duSptCpbRemovalDelay = val;
     648  }
     649  else
     650  {
     651    sei.m_duSptCpbRemovalDelay = 0;
     652  }
     653  sei_read_flag( pDecodedMessageOutputStream, val, "dpb_output_du_delay_present_flag"); sei.m_dpbOutputDuDelayPresentFlag = (val != 0);
     654  if(sei.m_dpbOutputDuDelayPresentFlag)
     655  {
     656    sei_read_code( pDecodedMessageOutputStream, vui->getHrdParameters()->getDpbOutputDelayDuLengthMinus1() + 1, val, "pic_spt_dpb_output_du_delay");
     657    sei.m_picSptDpbOutputDuDelay = val;
     658  }
     659#endif
    696660}
    697661
    698662#if VPS_VUI_BSP_HRD_PARAMS
    699 Void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, UInt /*payloadSize*/, TComSPS *sps, const SEIScalableNesting* nestingSei, const SEIBspNesting* bspNestingSei, TComVPS *vps)
    700 #else
    701 Void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, UInt /*payloadSize*/, TComSPS *sps)
     663Void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, UInt payloadSize, TComSPS *sps, const SEIScalableNesting* nestingSei, const SEIBspNesting* bspNestingSei, TComVPS *vps, std::ostream *pDecodedMessageOutputStream)
     664#else
     665Void SEIReader::xParseSEIBufferingPeriod(SEIBufferingPeriod& sei, UInt payloadSize, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
    702666#endif
    703667{
     
    747711#endif
    748712
    749   READ_UVLC( code, "bp_seq_parameter_set_id" );                         sei.m_bpSeqParameterSetId     = code;
     713  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     714
     715  sei_read_uvlc( pDecodedMessageOutputStream, code, "bp_seq_parameter_set_id" );                         sei.m_bpSeqParameterSetId     = code;
    750716  if( !pHRD->getSubPicCpbParamsPresentFlag() )
    751717  {
    752     READ_FLAG( code, "irap_cpb_params_present_flag" );                   sei.m_rapCpbParamsPresentFlag = code;
     718    sei_read_flag( pDecodedMessageOutputStream, code, "irap_cpb_params_present_flag" );                   sei.m_rapCpbParamsPresentFlag = code;
    753719  }
    754720  if( sei.m_rapCpbParamsPresentFlag )
    755721  {
    756     READ_CODE( pHRD->getCpbRemovalDelayLengthMinus1() + 1, code, "cpb_delay_offset" );      sei.m_cpbDelayOffset = code;
    757     READ_CODE( pHRD->getDpbOutputDelayLengthMinus1()  + 1, code, "dpb_delay_offset" );      sei.m_dpbDelayOffset = code;
    758   }
     722    sei_read_code( pDecodedMessageOutputStream, pHRD->getCpbRemovalDelayLengthMinus1() + 1, code, "cpb_delay_offset" );      sei.m_cpbDelayOffset = code;
     723    sei_read_code( pDecodedMessageOutputStream, pHRD->getDpbOutputDelayLengthMinus1()  + 1, code, "dpb_delay_offset" );      sei.m_dpbDelayOffset = code;
     724  }
     725
    759726  //read splicing flag and cpb_removal_delay_delta
    760   READ_FLAG( code, "concatenation_flag");
     727  sei_read_flag( pDecodedMessageOutputStream, code, "concatenation_flag");
    761728  sei.m_concatenationFlag = code;
    762   READ_CODE( ( pHRD->getCpbRemovalDelayLengthMinus1() + 1 ), code, "au_cpb_removal_delay_delta_minus1" );
     729  sei_read_code( pDecodedMessageOutputStream, ( pHRD->getCpbRemovalDelayLengthMinus1() + 1 ), code, "au_cpb_removal_delay_delta_minus1" );
    763730  sei.m_auCpbRemovalDelayDelta = code + 1;
     731
    764732  for( nalOrVcl = 0; nalOrVcl < 2; nalOrVcl ++ )
    765733  {
     
    769737      for( i = 0; i < ( pHRD->getCpbCntMinus1( 0 ) + 1 ); i ++ )
    770738      {
    771         READ_CODE( ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, "initial_cpb_removal_delay" );
     739        sei_read_code( pDecodedMessageOutputStream, ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, nalOrVcl?"vcl_initial_cpb_removal_delay":"nal_initial_cpb_removal_delay" );
    772740        sei.m_initialCpbRemovalDelay[i][nalOrVcl] = code;
    773         READ_CODE( ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, "initial_cpb_removal_delay_offset" );
     741        sei_read_code( pDecodedMessageOutputStream, ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, nalOrVcl?"vcl_initial_cpb_removal_offset":"vcl_initial_cpb_removal_offset" );
    774742        sei.m_initialCpbRemovalDelayOffset[i][nalOrVcl] = code;
    775743        if( pHRD->getSubPicCpbParamsPresentFlag() || sei.m_rapCpbParamsPresentFlag )
    776744        {
    777           READ_CODE( ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, "initial_alt_cpb_removal_delay" );
     745          sei_read_code( pDecodedMessageOutputStream, ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, nalOrVcl?"vcl_initial_alt_cpb_removal_delay":"vcl_initial_alt_cpb_removal_delay" );
    778746          sei.m_initialAltCpbRemovalDelay[i][nalOrVcl] = code;
    779           READ_CODE( ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, "initial_alt_cpb_removal_delay_offset" );
     747          sei_read_code( pDecodedMessageOutputStream, ( pHRD->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , code, nalOrVcl?"vcl_initial_alt_cpb_removal_offset":"vcl_initial_alt_cpb_removal_offset" );
    780748          sei.m_initialAltCpbRemovalDelayOffset[i][nalOrVcl] = code;
    781749        }
     
    789757  if (xPayloadExtensionPresent())
    790758  {
    791     READ_FLAG (code, "use_alt_cpb_params_flag");
     759    sei_read_flag( pDecodedMessageOutputStream, code, "use_alt_cpb_params_flag");
    792760    sei.m_useAltCpbParamsFlag = code;
    793761    sei.m_useAltCpbParamsFlagPresent = true;
    794762  }
    795763#endif
    796 
    797   xParseByteAlign();
    798 }
     764}
     765
    799766#if VPS_VUI_BSP_HRD_PARAMS
    800 Void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, UInt /*payloadSize*/, TComSPS *sps, const SEIScalableNesting* nestingSei, const SEIBspNesting* bspNestingSei, TComVPS *vps)
    801 #else
    802 Void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, UInt /*payloadSize*/, TComSPS *sps)
     767Void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, UInt payloadSize, TComSPS *sps, const SEIScalableNesting* nestingSei, const SEIBspNesting* bspNestingSei, TComVPS *vps, std::ostream *pDecodedMessageOutputStream)
     768#else
     769Void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, UInt payloadSize, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
    803770#endif
    804771{
     
    851818  TComHRD *hrd = vui->getHrdParameters();
    852819#endif
     820  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
    853821
    854822  if( vui->getFrameFieldInfoPresentFlag() )
    855823  {
    856     READ_CODE( 4, code, "pic_struct" );             sei.m_picStruct            = code;
    857     READ_CODE( 2, code, "source_scan_type" );       sei.m_sourceScanType = code;
    858     READ_FLAG(    code, "duplicate_flag" );         sei.m_duplicateFlag        = ( code == 1 ? true : false );
     824    sei_read_code( pDecodedMessageOutputStream, 4, code, "pic_struct" );             sei.m_picStruct            = code;
     825    sei_read_code( pDecodedMessageOutputStream, 2, code, "source_scan_type" );       sei.m_sourceScanType      = code;
     826    sei_read_flag( pDecodedMessageOutputStream,    code, "duplicate_flag" );         sei.m_duplicateFlag        = (code == 1);
    859827  }
    860828
    861829  if( hrd->getCpbDpbDelaysPresentFlag())
    862830  {
    863     READ_CODE( ( hrd->getCpbRemovalDelayLengthMinus1() + 1 ), code, "au_cpb_removal_delay_minus1" );
     831    sei_read_code( pDecodedMessageOutputStream, ( hrd->getCpbRemovalDelayLengthMinus1() + 1 ), code, "au_cpb_removal_delay_minus1" );
    864832    sei.m_auCpbRemovalDelay = code + 1;
    865     READ_CODE( ( hrd->getDpbOutputDelayLengthMinus1() + 1 ), code, "pic_dpb_output_delay" );
     833    sei_read_code( pDecodedMessageOutputStream, ( hrd->getDpbOutputDelayLengthMinus1() + 1 ), code, "pic_dpb_output_delay" );
    866834    sei.m_picDpbOutputDelay = code;
    867835
    868836    if(hrd->getSubPicCpbParamsPresentFlag())
    869837    {
    870       READ_CODE(hrd->getDpbOutputDelayDuLengthMinus1()+1, code, "pic_dpb_output_du_delay" );
     838      sei_read_code( pDecodedMessageOutputStream, hrd->getDpbOutputDelayDuLengthMinus1()+1, code, "pic_dpb_output_du_delay" );
    871839      sei.m_picDpbOutputDuDelay = code;
    872840    }
     841
    873842    if( hrd->getSubPicCpbParamsPresentFlag() && hrd->getSubPicCpbParamsInPicTimingSEIFlag() )
    874843    {
    875       READ_UVLC( code, "num_decoding_units_minus1");
     844      sei_read_uvlc( pDecodedMessageOutputStream, code, "num_decoding_units_minus1");
    876845      sei.m_numDecodingUnitsMinus1 = code;
    877       READ_FLAG( code, "du_common_cpb_removal_delay_flag" );
     846      sei_read_flag( pDecodedMessageOutputStream, code, "du_common_cpb_removal_delay_flag" );
    878847      sei.m_duCommonCpbRemovalDelayFlag = code;
    879848      if( sei.m_duCommonCpbRemovalDelayFlag )
    880849      {
    881         READ_CODE( ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), code, "du_common_cpb_removal_delay_minus1" );
     850        sei_read_code( pDecodedMessageOutputStream, ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), code, "du_common_cpb_removal_delay_increment_minus1" );
    882851        sei.m_duCommonCpbRemovalDelayMinus1 = code;
    883852      }
     
    895864      for( i = 0; i <= sei.m_numDecodingUnitsMinus1; i ++ )
    896865      {
    897         READ_UVLC( code, "num_nalus_in_du_minus1");
     866        sei_read_uvlc( pDecodedMessageOutputStream, code, "num_nalus_in_du_minus1[i]");
    898867        sei.m_numNalusInDuMinus1[ i ] = code;
    899868        if( ( !sei.m_duCommonCpbRemovalDelayFlag ) && ( i < sei.m_numDecodingUnitsMinus1 ) )
    900869        {
    901           READ_CODE( ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), code, "du_cpb_removal_delay_minus1" );
     870          sei_read_code( pDecodedMessageOutputStream, ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), code, "du_cpb_removal_delay_minus1[i]" );
    902871          sei.m_duCpbRemovalDelayMinus1[ i ] = code;
    903872        }
     
    905874    }
    906875  }
    907   xParseByteAlign();
    908 }
    909 Void SEIReader::xParseSEIRecoveryPoint(SEIRecoveryPoint& sei, UInt /*payloadSize*/)
     876}
     877
     878Void SEIReader::xParseSEIRecoveryPoint(SEIRecoveryPoint& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    910879{
    911880  Int  iCode;
    912881  UInt uiCode;
    913   READ_SVLC( iCode,  "recovery_poc_cnt" );      sei.m_recoveryPocCnt     = iCode;
    914   READ_FLAG( uiCode, "exact_matching_flag" );   sei.m_exactMatchingFlag  = uiCode;
    915   READ_FLAG( uiCode, "broken_link_flag" );      sei.m_brokenLinkFlag     = uiCode;
    916   xParseByteAlign();
    917 }
    918 Void SEIReader::xParseSEIFramePacking(SEIFramePacking& sei, UInt /*payloadSize*/)
     882  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     883
     884  sei_read_svlc( pDecodedMessageOutputStream, iCode,  "recovery_poc_cnt" );      sei.m_recoveryPocCnt     = iCode;
     885  sei_read_flag( pDecodedMessageOutputStream, uiCode, "exact_matching_flag" );   sei.m_exactMatchingFlag  = uiCode;
     886  sei_read_flag( pDecodedMessageOutputStream, uiCode, "broken_link_flag" );      sei.m_brokenLinkFlag     = uiCode;
     887}
     888
     889Void SEIReader::xParseSEIFramePacking(SEIFramePacking& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    919890{
    920891  UInt val;
    921   READ_UVLC( val, "frame_packing_arrangement_id" );                 sei.m_arrangementId = val;
    922   READ_FLAG( val, "frame_packing_arrangement_cancel_flag" );        sei.m_arrangementCancelFlag = val;
     892  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     893
     894  sei_read_uvlc( pDecodedMessageOutputStream, val, "frame_packing_arrangement_id" );                 sei.m_arrangementId = val;
     895  sei_read_flag( pDecodedMessageOutputStream, val, "frame_packing_arrangement_cancel_flag" );        sei.m_arrangementCancelFlag = val;
    923896
    924897  if ( !sei.m_arrangementCancelFlag )
    925898  {
    926     READ_CODE( 7, val, "frame_packing_arrangement_type" );          sei.m_arrangementType = val;
     899    sei_read_code( pDecodedMessageOutputStream, 7, val, "frame_packing_arrangement_type" );          sei.m_arrangementType = val;
    927900    assert((sei.m_arrangementType > 2) && (sei.m_arrangementType < 6) );
    928     READ_FLAG( val, "quincunx_sampling_flag" );                     sei.m_quincunxSamplingFlag = val;
    929 
    930     READ_CODE( 6, val, "content_interpretation_type" );             sei.m_contentInterpretationType = val;
    931     READ_FLAG( val, "spatial_flipping_flag" );                      sei.m_spatialFlippingFlag = val;
    932     READ_FLAG( val, "frame0_flipped_flag" );                        sei.m_frame0FlippedFlag = val;
    933     READ_FLAG( val, "field_views_flag" );                           sei.m_fieldViewsFlag = val;
    934     READ_FLAG( val, "current_frame_is_frame0_flag" );               sei.m_currentFrameIsFrame0Flag = val;
    935     READ_FLAG( val, "frame0_self_contained_flag" );                 sei.m_frame0SelfContainedFlag = val;
    936     READ_FLAG( val, "frame1_self_contained_flag" );                 sei.m_frame1SelfContainedFlag = val;
     901
     902    sei_read_flag( pDecodedMessageOutputStream, val, "quincunx_sampling_flag" );                     sei.m_quincunxSamplingFlag = val;
     903
     904    sei_read_code( pDecodedMessageOutputStream, 6, val, "content_interpretation_type" );             sei.m_contentInterpretationType = val;
     905    sei_read_flag( pDecodedMessageOutputStream, val, "spatial_flipping_flag" );                      sei.m_spatialFlippingFlag = val;
     906    sei_read_flag( pDecodedMessageOutputStream, val, "frame0_flipped_flag" );                        sei.m_frame0FlippedFlag = val;
     907    sei_read_flag( pDecodedMessageOutputStream, val, "field_views_flag" );                           sei.m_fieldViewsFlag = val;
     908    sei_read_flag( pDecodedMessageOutputStream, val, "current_frame_is_frame0_flag" );               sei.m_currentFrameIsFrame0Flag = val;
     909    sei_read_flag( pDecodedMessageOutputStream, val, "frame0_self_contained_flag" );                 sei.m_frame0SelfContainedFlag = val;
     910    sei_read_flag( pDecodedMessageOutputStream, val, "frame1_self_contained_flag" );                 sei.m_frame1SelfContainedFlag = val;
    937911
    938912    if ( sei.m_quincunxSamplingFlag == 0 && sei.m_arrangementType != 5)
    939913    {
    940       READ_CODE( 4, val, "frame0_grid_position_x" );                sei.m_frame0GridPositionX = val;
    941       READ_CODE( 4, val, "frame0_grid_position_y" );                sei.m_frame0GridPositionY = val;
    942       READ_CODE( 4, val, "frame1_grid_position_x" );                sei.m_frame1GridPositionX = val;
    943       READ_CODE( 4, val, "frame1_grid_position_y" );                sei.m_frame1GridPositionY = val;
    944     }
    945 
    946     READ_CODE( 8, val, "frame_packing_arrangement_reserved_byte" );   sei.m_arrangementReservedByte = val;
    947     READ_FLAG( val,  "frame_packing_arrangement_persistence_flag" );  sei.m_arrangementPersistenceFlag = val ? true : false;
    948   }
    949   READ_FLAG( val, "upsampled_aspect_ratio" );                       sei.m_upsampledAspectRatio = val;
    950 
    951   xParseByteAlign();
    952 }
    953 
    954 Void SEIReader::xParseSEIDisplayOrientation(SEIDisplayOrientation& sei, UInt /*payloadSize*/)
     914      sei_read_code( pDecodedMessageOutputStream, 4, val, "frame0_grid_position_x" );                sei.m_frame0GridPositionX = val;
     915      sei_read_code( pDecodedMessageOutputStream, 4, val, "frame0_grid_position_y" );                sei.m_frame0GridPositionY = val;
     916      sei_read_code( pDecodedMessageOutputStream, 4, val, "frame1_grid_position_x" );                sei.m_frame1GridPositionX = val;
     917      sei_read_code( pDecodedMessageOutputStream, 4, val, "frame1_grid_position_y" );                sei.m_frame1GridPositionY = val;
     918    }
     919
     920    sei_read_code( pDecodedMessageOutputStream, 8, val, "frame_packing_arrangement_reserved_byte" );   sei.m_arrangementReservedByte = val;
     921    sei_read_flag( pDecodedMessageOutputStream, val,  "frame_packing_arrangement_persistence_flag" );  sei.m_arrangementPersistenceFlag = (val != 0);
     922  }
     923  sei_read_flag( pDecodedMessageOutputStream, val, "upsampled_aspect_ratio_flag" );                  sei.m_upsampledAspectRatio = val;
     924}
     925
     926Void SEIReader::xParseSEISegmentedRectFramePacking(SEISegmentedRectFramePacking& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    955927{
    956928  UInt val;
    957   READ_FLAG( val,       "display_orientation_cancel_flag" );       sei.cancelFlag            = val;
    958   if( !sei.cancelFlag )
    959   {
    960     READ_FLAG( val,     "hor_flip" );                              sei.horFlip               = val;
    961     READ_FLAG( val,     "ver_flip" );                              sei.verFlip               = val;
    962     READ_CODE( 16, val, "anticlockwise_rotation" );                sei.anticlockwiseRotation = val;
    963     READ_FLAG( val,     "display_orientation_persistence_flag" );  sei.persistenceFlag       = val;
    964   }
    965   xParseByteAlign();
    966 }
    967 
    968 Void SEIReader::xParseSEITemporalLevel0Index(SEITemporalLevel0Index& sei, UInt /*payloadSize*/)
     929  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     930  sei_read_flag( pDecodedMessageOutputStream, val,       "segmented_rect_frame_packing_arrangement_cancel_flag" );       sei.m_arrangementCancelFlag            = val;
     931  if( !sei.m_arrangementCancelFlag )
     932  {
     933    sei_read_code( pDecodedMessageOutputStream, 2, val, "segmented_rect_content_interpretation_type" );                sei.m_contentInterpretationType = val;
     934    sei_read_flag( pDecodedMessageOutputStream, val,     "segmented_rect_frame_packing_arrangement_persistence" );                              sei.m_arrangementPersistenceFlag               = val;
     935  }
     936}
     937
     938Void SEIReader::xParseSEIDisplayOrientation(SEIDisplayOrientation& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    969939{
    970940  UInt val;
    971   READ_CODE ( 8, val, "tl0_idx" );  sei.tl0Idx = val;
    972   READ_CODE ( 8, val, "rap_idx" );  sei.rapIdx = val;
    973   xParseByteAlign();
    974 }
    975 
    976 Void SEIReader::xParseSEIGradualDecodingRefreshInfo(SEIGradualDecodingRefreshInfo& sei, UInt /*payloadSize*/)
     941  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     942  sei_read_flag( pDecodedMessageOutputStream, val,       "display_orientation_cancel_flag" );       sei.cancelFlag            = val;
     943  if( !sei.cancelFlag )
     944  {
     945    sei_read_flag( pDecodedMessageOutputStream, val,     "hor_flip" );                              sei.horFlip               = val;
     946    sei_read_flag( pDecodedMessageOutputStream, val,     "ver_flip" );                              sei.verFlip               = val;
     947    sei_read_code( pDecodedMessageOutputStream, 16, val, "anticlockwise_rotation" );                sei.anticlockwiseRotation = val;
     948    sei_read_flag( pDecodedMessageOutputStream, val,     "display_orientation_persistence_flag" );  sei.persistenceFlag       = val;
     949  }
     950}
     951
     952Void SEIReader::xParseSEITemporalLevel0Index(SEITemporalLevel0Index& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    977953{
    978954  UInt val;
    979   READ_FLAG( val, "gdr_foreground_flag" ); sei.m_gdrForegroundFlag = val ? 1 : 0;
    980   xParseByteAlign();
    981 }
    982 
    983 Void SEIReader::xParseSEIToneMappingInfo(SEIToneMappingInfo& sei, UInt /*payloadSize*/)
     955  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     956  sei_read_code( pDecodedMessageOutputStream, 8, val, "temporal_sub_layer_zero_idx" );  sei.tl0Idx = val;
     957  sei_read_code( pDecodedMessageOutputStream, 8, val, "irap_pic_id" );  sei.rapIdx = val;
     958}
     959
     960Void SEIReader::xParseSEIRegionRefreshInfo(SEIGradualDecodingRefreshInfo& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     961{
     962  UInt val;
     963  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     964  sei_read_flag( pDecodedMessageOutputStream, val, "refreshed_region_flag" ); sei.m_gdrForegroundFlag = val ? 1 : 0;
     965}
     966
     967Void SEIReader::xParseSEINoDisplay(SEINoDisplay& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     968{
     969  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     970  sei.m_noDisplay = true;
     971}
     972
     973Void SEIReader::xParseSEIToneMappingInfo(SEIToneMappingInfo& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    984974{
    985975  Int i;
    986976  UInt val;
    987   READ_UVLC( val, "tone_map_id" );                         sei.m_toneMapId = val;
    988   READ_FLAG( val, "tone_map_cancel_flag" );                sei.m_toneMapCancelFlag = val;
     977  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     978  sei_read_uvlc( pDecodedMessageOutputStream, val, "tone_map_id" );                         sei.m_toneMapId = val;
     979  sei_read_flag( pDecodedMessageOutputStream, val, "tone_map_cancel_flag" );                sei.m_toneMapCancelFlag = val;
    989980
    990981  if ( !sei.m_toneMapCancelFlag )
    991982  {
    992     READ_FLAG( val, "tone_map_persistence_flag" );         sei.m_toneMapPersistenceFlag = val;
    993     READ_CODE( 8, val, "coded_data_bit_depth" );           sei.m_codedDataBitDepth = val;
    994     READ_CODE( 8, val, "target_bit_depth" );               sei.m_targetBitDepth = val;
    995     READ_UVLC( val, "model_id" );                          sei.m_modelId = val;
     983    sei_read_flag( pDecodedMessageOutputStream, val, "tone_map_persistence_flag" );         sei.m_toneMapPersistenceFlag = val;
     984    sei_read_code( pDecodedMessageOutputStream, 8, val, "coded_data_bit_depth" );           sei.m_codedDataBitDepth = val;
     985    sei_read_code( pDecodedMessageOutputStream, 8, val, "target_bit_depth" );               sei.m_targetBitDepth = val;
     986    sei_read_uvlc( pDecodedMessageOutputStream, val, "tone_map_model_id" );                 sei.m_modelId = val;
    996987    switch(sei.m_modelId)
    997988    {
    998989    case 0:
    999990      {
    1000         READ_CODE( 32, val, "min_value" );                 sei.m_minValue = val;
    1001         READ_CODE( 32, val, "max_value" );                 sei.m_maxValue = val;
     991        sei_read_code( pDecodedMessageOutputStream, 32, val, "min_value" );                 sei.m_minValue = val;
     992        sei_read_code( pDecodedMessageOutputStream, 32, val, "max_value" );                 sei.m_maxValue = val;
    1002993        break;
    1003994      }
    1004995    case 1:
    1005996      {
    1006         READ_CODE( 32, val, "sigmoid_midpoint" );          sei.m_sigmoidMidpoint = val;
    1007         READ_CODE( 32, val, "sigmoid_width" );             sei.m_sigmoidWidth = val;
     997        sei_read_code( pDecodedMessageOutputStream, 32, val, "sigmoid_midpoint" );          sei.m_sigmoidMidpoint = val;
     998        sei_read_code( pDecodedMessageOutputStream, 32, val, "sigmoid_width" );             sei.m_sigmoidWidth = val;
    1008999        break;
    10091000      }
     
    10141005        for(i = 0; i < num; i++)
    10151006        {
    1016           READ_CODE( ((( sei.m_codedDataBitDepth + 7 ) >> 3 ) << 3), val, "start_of_coded_interval" );
     1007          sei_read_code( pDecodedMessageOutputStream, ((( sei.m_codedDataBitDepth + 7 ) >> 3 ) << 3), val, "start_of_coded_interval[i]" );
    10171008          sei.m_startOfCodedInterval[i] = val;
    10181009        }
     
    10221013    case 3:
    10231014      {
    1024         READ_CODE( 16, val,  "num_pivots" );                       sei.m_numPivots = val;
     1015        sei_read_code( pDecodedMessageOutputStream, 16, val,  "num_pivots" );                       sei.m_numPivots = val;
    10251016        sei.m_codedPivotValue.resize(sei.m_numPivots);
    10261017        sei.m_targetPivotValue.resize(sei.m_numPivots);
    10271018        for(i = 0; i < sei.m_numPivots; i++ )
    10281019        {
    1029           READ_CODE( ((( sei.m_codedDataBitDepth + 7 ) >> 3 ) << 3), val, "coded_pivot_value" );
     1020          sei_read_code( pDecodedMessageOutputStream, ((( sei.m_codedDataBitDepth + 7 ) >> 3 ) << 3), val, "coded_pivot_value[i]" );
    10301021          sei.m_codedPivotValue[i] = val;
    1031           READ_CODE( ((( sei.m_targetBitDepth + 7 ) >> 3 ) << 3),    val, "target_pivot_value" );
     1022          sei_read_code( pDecodedMessageOutputStream, ((( sei.m_targetBitDepth + 7 ) >> 3 ) << 3),    val, "target_pivot_value[i]" );
    10321023          sei.m_targetPivotValue[i] = val;
    10331024        }
     
    10361027    case 4:
    10371028      {
    1038         READ_CODE( 8, val, "camera_iso_speed_idc" );                     sei.m_cameraIsoSpeedIdc = val;
     1029        sei_read_code( pDecodedMessageOutputStream, 8, val, "camera_iso_speed_idc" );                     sei.m_cameraIsoSpeedIdc = val;
    10391030        if( sei.m_cameraIsoSpeedIdc == 255) //Extended_ISO
    10401031        {
    1041           READ_CODE( 32,   val,   "camera_iso_speed_value" );            sei.m_cameraIsoSpeedValue = val;
    1042         }
    1043         READ_CODE( 8, val, "exposure_index_idc" );                       sei.m_exposureIndexIdc = val;
     1032          sei_read_code( pDecodedMessageOutputStream, 32,   val,   "camera_iso_speed_value" );            sei.m_cameraIsoSpeedValue = val;
     1033        }
     1034        sei_read_code( pDecodedMessageOutputStream, 8, val, "exposure_index_idc" );                       sei.m_exposureIndexIdc = val;
    10441035        if( sei.m_exposureIndexIdc == 255) //Extended_ISO
    10451036        {
    1046           READ_CODE( 32,   val,   "exposure_index_value" );              sei.m_exposureIndexValue = val;
    1047         }
    1048         READ_FLAG( val, "exposure_compensation_value_sign_flag" );       sei.m_exposureCompensationValueSignFlag = val;
    1049         READ_CODE( 16, val, "exposure_compensation_value_numerator" );   sei.m_exposureCompensationValueNumerator = val;
    1050         READ_CODE( 16, val, "exposure_compensation_value_denom_idc" );   sei.m_exposureCompensationValueDenomIdc = val;
    1051         READ_CODE( 32, val, "ref_screen_luminance_white" );              sei.m_refScreenLuminanceWhite = val;
    1052         READ_CODE( 32, val, "extended_range_white_level" );              sei.m_extendedRangeWhiteLevel = val;
    1053         READ_CODE( 16, val, "nominal_black_level_luma_code_value" );     sei.m_nominalBlackLevelLumaCodeValue = val;
    1054         READ_CODE( 16, val, "nominal_white_level_luma_code_value" );     sei.m_nominalWhiteLevelLumaCodeValue= val;
    1055         READ_CODE( 16, val, "extended_white_level_luma_code_value" );    sei.m_extendedWhiteLevelLumaCodeValue = val;
     1037          sei_read_code( pDecodedMessageOutputStream, 32,   val,   "exposure_index_value" );              sei.m_exposureIndexValue = val;
     1038        }
     1039        sei_read_flag( pDecodedMessageOutputStream, val, "exposure_compensation_value_sign_flag" );       sei.m_exposureCompensationValueSignFlag = val;
     1040        sei_read_code( pDecodedMessageOutputStream, 16, val, "exposure_compensation_value_numerator" );   sei.m_exposureCompensationValueNumerator = val;
     1041        sei_read_code( pDecodedMessageOutputStream, 16, val, "exposure_compensation_value_denom_idc" );   sei.m_exposureCompensationValueDenomIdc = val;
     1042        sei_read_code( pDecodedMessageOutputStream, 32, val, "ref_screen_luminance_white" );              sei.m_refScreenLuminanceWhite = val;
     1043        sei_read_code( pDecodedMessageOutputStream, 32, val, "extended_range_white_level" );              sei.m_extendedRangeWhiteLevel = val;
     1044        sei_read_code( pDecodedMessageOutputStream, 16, val, "nominal_black_level_code_value" );          sei.m_nominalBlackLevelLumaCodeValue = val;
     1045        sei_read_code( pDecodedMessageOutputStream, 16, val, "nominal_white_level_code_value" );          sei.m_nominalWhiteLevelLumaCodeValue= val;
     1046        sei_read_code( pDecodedMessageOutputStream, 16, val, "extended_white_level_code_value" );         sei.m_extendedWhiteLevelLumaCodeValue = val;
    10561047        break;
    10571048      }
     
    10621053      }
    10631054    }//switch model id
    1064   }// if(!sei.m_toneMapCancelFlag)
    1065 
    1066   xParseByteAlign();
    1067 }
    1068 
    1069 #if P0050_KNEE_FUNCTION_SEI
    1070 Void SEIReader::xParseSEIKneeFunctionInfo(SEIKneeFunctionInfo& sei, UInt /*payloadSize*/){
     1055  }// if(!sei.m_toneMapCancelFlag)
     1056}
     1057
     1058Void SEIReader::xParseSEISOPDescription(SEISOPDescription &sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     1059{
     1060  Int iCode;
     1061  UInt uiCode;
     1062  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1063
     1064  sei_read_uvlc( pDecodedMessageOutputStream, uiCode,           "sop_seq_parameter_set_id"            ); sei.m_sopSeqParameterSetId = uiCode;
     1065  sei_read_uvlc( pDecodedMessageOutputStream, uiCode,           "num_pics_in_sop_minus1"              ); sei.m_numPicsInSopMinus1 = uiCode;
     1066  for (UInt i = 0; i <= sei.m_numPicsInSopMinus1; i++)
     1067  {
     1068    sei_read_code( pDecodedMessageOutputStream, 6, uiCode,                     "sop_vcl_nut[i]" );  sei.m_sopDescVclNaluType[i] = uiCode;
     1069    sei_read_code( pDecodedMessageOutputStream, 3, sei.m_sopDescTemporalId[i], "sop_temporal_id[i]"   );  sei.m_sopDescTemporalId[i] = uiCode;
     1070    if (sei.m_sopDescVclNaluType[i] != NAL_UNIT_CODED_SLICE_IDR_W_RADL && sei.m_sopDescVclNaluType[i] != NAL_UNIT_CODED_SLICE_IDR_N_LP)
     1071    {
     1072      sei_read_uvlc( pDecodedMessageOutputStream, sei.m_sopDescStRpsIdx[i],    "sop_short_term_rps_idx[i]"    ); sei.m_sopDescStRpsIdx[i] = uiCode;
     1073    }
     1074    if (i > 0)
     1075    {
     1076      sei_read_svlc( pDecodedMessageOutputStream, iCode,                       "sop_poc_delta[i]"     ); sei.m_sopDescPocDelta[i] = iCode;
     1077    }
     1078  }
     1079}
     1080
     1081#if LAYERS_NOT_PRESENT_SEI
     1082Void SEIReader::xParseSEIScalableNesting(SEIScalableNesting& sei, const NalUnitType nalUnitType, UInt payloadSize, TComVPS *vps, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
     1083#else
     1084Void SEIReader::xParseSEIScalableNesting(SEIScalableNesting& sei, const NalUnitType nalUnitType, UInt payloadSize, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
     1085#endif
     1086{
     1087  UInt uiCode;
     1088  SEIMessages seis;
     1089  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1090
     1091  sei_read_flag( pDecodedMessageOutputStream, uiCode,            "bitstream_subset_flag"         ); sei.m_bitStreamSubsetFlag = uiCode;
     1092  sei_read_flag( pDecodedMessageOutputStream, uiCode,            "nesting_op_flag"               ); sei.m_nestingOpFlag = uiCode;
     1093  if (sei.m_nestingOpFlag)
     1094  {
     1095    sei_read_flag( pDecodedMessageOutputStream, uiCode,            "default_op_flag"               ); sei.m_defaultOpFlag = uiCode;
     1096    sei_read_uvlc( pDecodedMessageOutputStream, uiCode,            "nesting_num_ops_minus1"        ); sei.m_nestingNumOpsMinus1 = uiCode;
     1097    for (UInt i = sei.m_defaultOpFlag; i <= sei.m_nestingNumOpsMinus1; i++)
     1098    {
     1099      sei_read_code( pDecodedMessageOutputStream, 3,        uiCode,  "nesting_max_temporal_id_plus1[i]"   ); sei.m_nestingMaxTemporalIdPlus1[i] = uiCode;
     1100      sei_read_uvlc( pDecodedMessageOutputStream, uiCode,            "nesting_op_idx[i]"                  ); sei.m_nestingOpIdx[i] = uiCode;
     1101    }
     1102  }
     1103  else
     1104  {
     1105    sei_read_flag( pDecodedMessageOutputStream, uiCode,            "all_layers_flag"               ); sei.m_allLayersFlag       = uiCode;
     1106    if (!sei.m_allLayersFlag)
     1107    {
     1108      sei_read_code( pDecodedMessageOutputStream, 3,        uiCode,  "nesting_no_op_max_temporal_id_plus1"  ); sei.m_nestingNoOpMaxTemporalIdPlus1 = uiCode;
     1109      sei_read_uvlc( pDecodedMessageOutputStream, uiCode,            "nesting_num_layers_minus1"            ); sei.m_nestingNumLayersMinus1        = uiCode;
     1110      for (UInt i = 0; i <= sei.m_nestingNumLayersMinus1; i++)
     1111      {
     1112        sei_read_code( pDecodedMessageOutputStream, 6,           uiCode,     "nesting_layer_id[i]"      ); sei.m_nestingLayerId[i]   = uiCode;
     1113      }
     1114    }
     1115  }
     1116
     1117  // byte alignment
     1118  while ( m_pcBitstream->getNumBitsRead() % 8 != 0 )
     1119  {
     1120    UInt code;
     1121    sei_read_flag( pDecodedMessageOutputStream, code, "nesting_zero_bit" );
     1122  }
     1123
     1124  sei.m_callerOwnsSEIs = false;
     1125
     1126  // read nested SEI messages
     1127  do {
     1128#if O0164_MULTI_LAYER_HRD
     1129#if LAYERS_NOT_PRESENT_SEI
     1130    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, pDecodedMessageOutputStream, &sei);
     1131#else
     1132    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, pDecodedMessageOutputStream, &sei);
     1133#endif
     1134#else
     1135#if LAYERS_NOT_PRESENT_SEI
     1136    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, pDecodedMessageOutputStream);
     1137#else
     1138    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, pDecodedMessageOutputStream);
     1139#endif
     1140#endif
     1141  } while (m_pcBitstream->getNumBitsLeft() > 8);
     1142
     1143  if (pDecodedMessageOutputStream) (*pDecodedMessageOutputStream) << "End of scalable nesting SEI message\n";
     1144}
     1145
     1146Void SEIReader::xParseSEITempMotionConstraintsTileSets(SEITempMotionConstrainedTileSets& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     1147{
     1148  UInt code;
     1149  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1150  sei_read_flag( pDecodedMessageOutputStream, code, "mc_all_tiles_exact_sample_value_match_flag");  sei.m_mc_all_tiles_exact_sample_value_match_flag = (code != 0);
     1151  sei_read_flag( pDecodedMessageOutputStream, code, "each_tile_one_tile_set_flag");                 sei.m_each_tile_one_tile_set_flag                = (code != 0);
     1152
     1153  if(!sei.m_each_tile_one_tile_set_flag)
     1154  {
     1155    sei_read_flag( pDecodedMessageOutputStream, code, "limited_tile_set_display_flag");  sei.m_limited_tile_set_display_flag = (code != 0);
     1156    sei_read_uvlc( pDecodedMessageOutputStream, code, "num_sets_in_message_minus1");     sei.setNumberOfTileSets(code + 1);
     1157
     1158    if(sei.getNumberOfTileSets() != 0)
     1159    {
     1160      for(Int i = 0; i < sei.getNumberOfTileSets(); i++)
     1161      {
     1162        sei_read_uvlc( pDecodedMessageOutputStream, code, "mcts_id");  sei.tileSetData(i).m_mcts_id = code;
     1163
     1164        if(sei.m_limited_tile_set_display_flag)
     1165        {
     1166          sei_read_flag( pDecodedMessageOutputStream, code, "display_tile_set_flag");  sei.tileSetData(i).m_display_tile_set_flag = (code != 1);
     1167        }
     1168
     1169        sei_read_uvlc( pDecodedMessageOutputStream, code, "num_tile_rects_in_set_minus1");  sei.tileSetData(i).setNumberOfTileRects(code + 1);
     1170
     1171        for(Int j=0; j<sei.tileSetData(i).getNumberOfTileRects(); j++)
     1172        {
     1173          sei_read_uvlc( pDecodedMessageOutputStream, code, "top_left_tile_index");      sei.tileSetData(i).topLeftTileIndex(j)     = code;
     1174          sei_read_uvlc( pDecodedMessageOutputStream, code, "bottom_right_tile_index");  sei.tileSetData(i).bottomRightTileIndex(j) = code;
     1175        }
     1176
     1177        if(!sei.m_mc_all_tiles_exact_sample_value_match_flag)
     1178        {
     1179          sei_read_flag( pDecodedMessageOutputStream, code, "exact_sample_value_match_flag");   sei.tileSetData(i).m_exact_sample_value_match_flag    = (code != 0);
     1180        }
     1181        sei_read_flag( pDecodedMessageOutputStream, code, "mcts_tier_level_idc_present_flag");  sei.tileSetData(i).m_mcts_tier_level_idc_present_flag = (code != 0);
     1182
     1183        if(sei.tileSetData(i).m_mcts_tier_level_idc_present_flag)
     1184        {
     1185          sei_read_flag( pDecodedMessageOutputStream, code,    "mcts_tier_flag"); sei.tileSetData(i).m_mcts_tier_flag = (code != 0);
     1186          sei_read_code( pDecodedMessageOutputStream, 8, code, "mcts_level_idc"); sei.tileSetData(i).m_mcts_level_idc =  code;
     1187        }
     1188      }
     1189    }
     1190  }
     1191  else
     1192  {
     1193    sei_read_flag( pDecodedMessageOutputStream, code, "max_mcs_tier_level_idc_present_flag");  sei.m_max_mcs_tier_level_idc_present_flag = code;
     1194    if(sei.m_max_mcs_tier_level_idc_present_flag)
     1195    {
     1196      sei_read_flag( pDecodedMessageOutputStream, code, "max_mcts_tier_flag");  sei.m_max_mcts_tier_flag = code;
     1197      sei_read_code( pDecodedMessageOutputStream, 8, code, "max_mcts_level_idc"); sei.m_max_mcts_level_idc = code;
     1198    }
     1199  }
     1200}
     1201
     1202Void SEIReader::xParseSEITimeCode(SEITimeCode& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     1203{
     1204  UInt code;
     1205  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1206  sei_read_code( pDecodedMessageOutputStream, 2, code, "num_clock_ts"); sei.numClockTs = code;
     1207  for(Int i = 0; i < sei.numClockTs; i++)
     1208  {
     1209    TComSEITimeSet currentTimeSet;
     1210    sei_read_flag( pDecodedMessageOutputStream, code, "clock_time_stamp_flag[i]"); currentTimeSet.clockTimeStampFlag = code;
     1211    if(currentTimeSet.clockTimeStampFlag)
     1212    {
     1213      sei_read_flag( pDecodedMessageOutputStream, code, "nuit_field_based_flag"); currentTimeSet.numUnitFieldBasedFlag = code;
     1214      sei_read_code( pDecodedMessageOutputStream, 5, code, "counting_type"); currentTimeSet.countingType = code;
     1215      sei_read_flag( pDecodedMessageOutputStream, code, "full_timestamp_flag"); currentTimeSet.fullTimeStampFlag = code;
     1216      sei_read_flag( pDecodedMessageOutputStream, code, "discontinuity_flag"); currentTimeSet.discontinuityFlag = code;
     1217      sei_read_flag( pDecodedMessageOutputStream, code, "cnt_dropped_flag"); currentTimeSet.cntDroppedFlag = code;
     1218      sei_read_code( pDecodedMessageOutputStream, 9, code, "n_frames"); currentTimeSet.numberOfFrames = code;
     1219      if(currentTimeSet.fullTimeStampFlag)
     1220      {
     1221        sei_read_code( pDecodedMessageOutputStream, 6, code, "seconds_value"); currentTimeSet.secondsValue = code;
     1222        sei_read_code( pDecodedMessageOutputStream, 6, code, "minutes_value"); currentTimeSet.minutesValue = code;
     1223        sei_read_code( pDecodedMessageOutputStream, 5, code, "hours_value"); currentTimeSet.hoursValue = code;
     1224      }
     1225      else
     1226      {
     1227        sei_read_flag( pDecodedMessageOutputStream, code, "seconds_flag"); currentTimeSet.secondsFlag = code;
     1228        if(currentTimeSet.secondsFlag)
     1229        {
     1230          sei_read_code( pDecodedMessageOutputStream, 6, code, "seconds_value"); currentTimeSet.secondsValue = code;
     1231          sei_read_flag( pDecodedMessageOutputStream, code, "minutes_flag"); currentTimeSet.minutesFlag = code;
     1232          if(currentTimeSet.minutesFlag)
     1233          {
     1234            sei_read_code( pDecodedMessageOutputStream, 6, code, "minutes_value"); currentTimeSet.minutesValue = code;
     1235            sei_read_flag( pDecodedMessageOutputStream, code, "hours_flag"); currentTimeSet.hoursFlag = code;
     1236            if(currentTimeSet.hoursFlag)
     1237              sei_read_code( pDecodedMessageOutputStream, 5, code, "hours_value"); currentTimeSet.hoursValue = code;
     1238          }
     1239        }
     1240      }
     1241      sei_read_code( pDecodedMessageOutputStream, 5, code, "time_offset_length"); currentTimeSet.timeOffsetLength = code;
     1242      if(currentTimeSet.timeOffsetLength > 0)
     1243      {
     1244        sei_read_code( pDecodedMessageOutputStream, currentTimeSet.timeOffsetLength, code, "time_offset_value");
     1245        if((code & (1 << (currentTimeSet.timeOffsetLength-1))) == 0)
     1246        {
     1247          currentTimeSet.timeOffsetValue = code;
     1248        }
     1249        else
     1250        {
     1251          code &= (1<< (currentTimeSet.timeOffsetLength-1)) - 1;
     1252          currentTimeSet.timeOffsetValue = ~code + 1;
     1253        }
     1254      }
     1255    }
     1256    sei.timeSetArray[i] = currentTimeSet;
     1257  }
     1258}
     1259
     1260Void SEIReader::xParseSEIChromaSamplingFilterHint(SEIChromaSamplingFilterHint& sei, UInt payloadSize/*, TComSPS* sps*/, std::ostream *pDecodedMessageOutputStream)
     1261{
     1262  UInt uiCode;
     1263  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1264
     1265  sei_read_code( pDecodedMessageOutputStream, 8, uiCode, "ver_chroma_filter_idc"); sei.m_verChromaFilterIdc = uiCode;
     1266  sei_read_code( pDecodedMessageOutputStream, 8, uiCode, "hor_chroma_filter_idc"); sei.m_horChromaFilterIdc = uiCode;
     1267  sei_read_flag( pDecodedMessageOutputStream, uiCode, "ver_filtering_process_flag"); sei.m_verFilteringProcessFlag = uiCode;
     1268  if(sei.m_verChromaFilterIdc == 1 || sei.m_horChromaFilterIdc == 1)
     1269  {
     1270    sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "target_format_idc"); sei.m_targetFormatIdc = uiCode;
     1271    if(sei.m_verChromaFilterIdc == 1)
     1272    {
     1273      sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "num_vertical_filters"); sei.m_numVerticalFilters = uiCode;
     1274      if(sei.m_numVerticalFilters > 0)
     1275      {
     1276        sei.m_verTapLengthMinus1 = (Int*)malloc(sei.m_numVerticalFilters * sizeof(Int));
     1277        sei.m_verFilterCoeff = (Int**)malloc(sei.m_numVerticalFilters * sizeof(Int*));
     1278        for(Int i = 0; i < sei.m_numVerticalFilters; i ++)
     1279        {
     1280          sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "ver_tap_length_minus_1"); sei.m_verTapLengthMinus1[i] = uiCode;
     1281          sei.m_verFilterCoeff[i] = (Int*)malloc(sei.m_verTapLengthMinus1[i] * sizeof(Int));
     1282          for(Int j = 0; j < sei.m_verTapLengthMinus1[i]; j ++)
     1283          {
     1284            sei_read_svlc( pDecodedMessageOutputStream, sei.m_verFilterCoeff[i][j], "ver_filter_coeff");
     1285          }
     1286        }
     1287      }
     1288    }
     1289    if(sei.m_horChromaFilterIdc == 1)
     1290    {
     1291      sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "num_horizontal_filters"); sei.m_numHorizontalFilters = uiCode;
     1292      if(sei.m_numHorizontalFilters  > 0)
     1293      {
     1294        sei.m_horTapLengthMinus1 = (Int*)malloc(sei.m_numHorizontalFilters * sizeof(Int));
     1295        sei.m_horFilterCoeff = (Int**)malloc(sei.m_numHorizontalFilters * sizeof(Int*));
     1296        for(Int i = 0; i < sei.m_numHorizontalFilters; i ++)
     1297        {
     1298          sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "hor_tap_length_minus_1"); sei.m_horTapLengthMinus1[i] = uiCode;
     1299          sei.m_horFilterCoeff[i] = (Int*)malloc(sei.m_horTapLengthMinus1[i] * sizeof(Int));
     1300          for(Int j = 0; j < sei.m_horTapLengthMinus1[i]; j ++)
     1301          {
     1302            sei_read_svlc( pDecodedMessageOutputStream, sei.m_horFilterCoeff[i][j], "hor_filter_coeff");
     1303          }
     1304        }
     1305      }
     1306    }
     1307  }
     1308}
     1309
     1310Void SEIReader::xParseSEIKneeFunctionInfo(SEIKneeFunctionInfo& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     1311{
    10711312  Int i;
    10721313  UInt val;
    1073   READ_UVLC( val, "knee_function_id" );                   sei.m_kneeId = val;
    1074   READ_FLAG( val, "knee_function_cancel_flag" );          sei.m_kneeCancelFlag = val;
     1314  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1315
     1316  sei_read_uvlc( pDecodedMessageOutputStream, val, "knee_function_id" );                   sei.m_kneeId = val;
     1317  sei_read_flag( pDecodedMessageOutputStream, val, "knee_function_cancel_flag" );          sei.m_kneeCancelFlag = val;
    10751318  if ( !sei.m_kneeCancelFlag )
    10761319  {
    1077     READ_FLAG( val, "knee_function_persistence_flag" );   sei.m_kneePersistenceFlag = val;
    1078     READ_FLAG( val, "mapping_flag" );                     sei.m_kneeMappingFlag = val;
    1079     READ_CODE( 32, val, "input_d_range" );                sei.m_kneeInputDrange = val;
    1080     READ_CODE( 32, val, "input_disp_luminance" );         sei.m_kneeInputDispLuminance = val;
    1081     READ_CODE( 32, val, "output_d_range" );               sei.m_kneeOutputDrange = val;
    1082     READ_CODE( 32, val, "output_disp_luminance" );        sei.m_kneeOutputDispLuminance = val;
    1083     READ_UVLC( val, "num_knee_points_minus1" );           sei.m_kneeNumKneePointsMinus1 = val;
     1320    sei_read_flag( pDecodedMessageOutputStream, val, "knee_function_persistence_flag" );   sei.m_kneePersistenceFlag = val;
     1321    sei_read_code( pDecodedMessageOutputStream, 32, val, "input_d_range" );                sei.m_kneeInputDrange = val;
     1322    sei_read_code( pDecodedMessageOutputStream, 32, val, "input_disp_luminance" );         sei.m_kneeInputDispLuminance = val;
     1323    sei_read_code( pDecodedMessageOutputStream, 32, val, "output_d_range" );               sei.m_kneeOutputDrange = val;
     1324    sei_read_code( pDecodedMessageOutputStream, 32, val, "output_disp_luminance" );        sei.m_kneeOutputDispLuminance = val;
     1325    sei_read_uvlc( pDecodedMessageOutputStream, val, "num_knee_points_minus1" );           sei.m_kneeNumKneePointsMinus1 = val;
    10841326    assert( sei.m_kneeNumKneePointsMinus1 > 0 );
    10851327    sei.m_kneeInputKneePoint.resize(sei.m_kneeNumKneePointsMinus1+1);
     
    10871329    for(i = 0; i <= sei.m_kneeNumKneePointsMinus1; i++ )
    10881330    {
    1089       READ_CODE( 10, val, "input_knee_point" );           sei.m_kneeInputKneePoint[i] = val;
    1090       READ_CODE( 10, val, "output_knee_point" );          sei.m_kneeOutputKneePoint[i] = val;
    1091     }
    1092   }
    1093 }
    1094 #endif
     1331      sei_read_code( pDecodedMessageOutputStream, 10, val, "input_knee_point" );           sei.m_kneeInputKneePoint[i] = val;
     1332      sei_read_code( pDecodedMessageOutputStream, 10, val, "output_knee_point" );          sei.m_kneeOutputKneePoint[i] = val;
     1333    }
     1334  }
     1335}
     1336
     1337Void SEIReader::xParseSEIMasteringDisplayColourVolume(SEIMasteringDisplayColourVolume& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     1338{
     1339  UInt code;
     1340  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
     1341
     1342  sei_read_code( pDecodedMessageOutputStream, 16, code, "display_primaries_x[0]" ); sei.values.primaries[0][0] = code;
     1343  sei_read_code( pDecodedMessageOutputStream, 16, code, "display_primaries_y[0]" ); sei.values.primaries[0][1] = code;
     1344
     1345  sei_read_code( pDecodedMessageOutputStream, 16, code, "display_primaries_x[1]" ); sei.values.primaries[1][0] = code;
     1346  sei_read_code( pDecodedMessageOutputStream, 16, code, "display_primaries_y[1]" ); sei.values.primaries[1][1] = code;
     1347
     1348  sei_read_code( pDecodedMessageOutputStream, 16, code, "display_primaries_x[2]" ); sei.values.primaries[2][0] = code;
     1349  sei_read_code( pDecodedMessageOutputStream, 16, code, "display_primaries_y[2]" ); sei.values.primaries[2][1] = code;
     1350
     1351
     1352  sei_read_code( pDecodedMessageOutputStream, 16, code, "white_point_x" ); sei.values.whitePoint[0] = code;
     1353  sei_read_code( pDecodedMessageOutputStream, 16, code, "white_point_y" ); sei.values.whitePoint[1] = code;
     1354
     1355  sei_read_code( pDecodedMessageOutputStream, 32, code, "max_display_mastering_luminance" ); sei.values.maxLuminance = code;
     1356  sei_read_code( pDecodedMessageOutputStream, 32, code, "min_display_mastering_luminance" ); sei.values.minLuminance = code;
     1357}
    10951358
    10961359#if Q0074_COLOUR_REMAPPING_SEI
    1097 Void SEIReader::xParseSEIColourRemappingInfo(SEIColourRemappingInfo& sei, UInt /*payloadSize*/)
     1360Void SEIReader::xParseSEIColourRemappingInfo(SEIColourRemappingInfo& sei, UInt /*payloadSize*/, std::ostream *pDecodedMessageOutputStream)
    10981361{
    10991362  UInt  uiVal;
    11001363  Int   iVal;
    11011364
    1102   READ_UVLC( uiVal, "colour_remap_id" );          sei.m_colourRemapId = uiVal;
    1103   READ_FLAG( uiVal, "colour_remap_cancel_flag" ); sei.m_colourRemapCancelFlag = uiVal;
     1365  sei_read_uvlc( pDecodedMessageOutputStream, uiVal, "colour_remap_id" );          sei.m_colourRemapId = uiVal;
     1366  sei_read_flag( pDecodedMessageOutputStream, uiVal, "colour_remap_cancel_flag" ); sei.m_colourRemapCancelFlag = uiVal;
    11041367  if( !sei.m_colourRemapCancelFlag )
    11051368  {
    1106     READ_FLAG( uiVal, "colour_remap_persistence_flag" );                sei.m_colourRemapPersistenceFlag = uiVal;
    1107     READ_FLAG( uiVal, "colour_remap_video_signal_info_present_flag" );  sei.m_colourRemapVideoSignalInfoPresentFlag = uiVal;
     1369    sei_read_flag( pDecodedMessageOutputStream, uiVal, "colour_remap_persistence_flag" );                sei.m_colourRemapPersistenceFlag = uiVal;
     1370    sei_read_flag( pDecodedMessageOutputStream, uiVal, "colour_remap_video_signal_info_present_flag" );  sei.m_colourRemapVideoSignalInfoPresentFlag = uiVal;
    11081371    if ( sei.m_colourRemapVideoSignalInfoPresentFlag )
    11091372    {
    1110       READ_FLAG( uiVal,    "colour_remap_full_range_flag" );           sei.m_colourRemapFullRangeFlag = uiVal;
    1111       READ_CODE( 8, uiVal, "colour_remap_primaries" );                 sei.m_colourRemapPrimaries = uiVal;
    1112       READ_CODE( 8, uiVal, "colour_remap_transfer_function" );         sei.m_colourRemapTransferFunction = uiVal;
    1113       READ_CODE( 8, uiVal, "colour_remap_matrix_coefficients" );       sei.m_colourRemapMatrixCoefficients = uiVal;
    1114     }
    1115     READ_CODE( 8, uiVal, "colour_remap_input_bit_depth" ); sei.m_colourRemapInputBitDepth = uiVal;
    1116     READ_CODE( 8, uiVal, "colour_remap_bit_depth" ); sei.m_colourRemapBitDepth = uiVal;
     1373      sei_read_flag( pDecodedMessageOutputStream, uiVal,    "colour_remap_full_range_flag" );           sei.m_colourRemapFullRangeFlag = uiVal;
     1374      sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "colour_remap_primaries" );                 sei.m_colourRemapPrimaries = uiVal;
     1375      sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "colour_remap_transfer_function" );         sei.m_colourRemapTransferFunction = uiVal;
     1376      sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "colour_remap_matrix_coefficients" );       sei.m_colourRemapMatrixCoefficients = uiVal;
     1377    }
     1378    sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "colour_remap_input_bit_depth" ); sei.m_colourRemapInputBitDepth = uiVal;
     1379    sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "colour_remap_bit_depth" ); sei.m_colourRemapBitDepth = uiVal;
    11171380 
    11181381    for( Int c=0 ; c<3 ; c++ )
    11191382    {
    1120       READ_CODE( 8, uiVal, "pre_lut_num_val_minus1[c]" ); sei.m_preLutNumValMinus1[c] = (uiVal==0) ? 1 : uiVal;
     1383      sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "pre_lut_num_val_minus1[c]" ); sei.m_preLutNumValMinus1[c] = (uiVal==0) ? 1 : uiVal;
    11211384      sei.m_preLutCodedValue[c].resize(sei.m_preLutNumValMinus1[c]+1);
    11221385      sei.m_preLutTargetValue[c].resize(sei.m_preLutNumValMinus1[c]+1);
     
    11241387        for ( Int i=0 ; i<=sei.m_preLutNumValMinus1[c] ; i++ )
    11251388        {
    1126           READ_CODE( (( sei.m_colourRemapInputBitDepth   + 7 ) >> 3 ) << 3, uiVal, "pre_lut_coded_value[c][i]" );  sei.m_preLutCodedValue[c][i]  = uiVal;
    1127           READ_CODE( (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, uiVal, "pre_lut_target_value[c][i]" ); sei.m_preLutTargetValue[c][i] = uiVal;
     1389          sei_read_code( pDecodedMessageOutputStream, (( sei.m_colourRemapInputBitDepth   + 7 ) >> 3 ) << 3, uiVal, "pre_lut_coded_value[c][i]" );  sei.m_preLutCodedValue[c][i]  = uiVal;
     1390          sei_read_code( pDecodedMessageOutputStream, (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, uiVal, "pre_lut_target_value[c][i]" ); sei.m_preLutTargetValue[c][i] = uiVal;
    11281391        }
    11291392      else // pre_lut_num_val_minus1[c] == 0
     
    11361399    }
    11371400
    1138     READ_FLAG( uiVal,      "colour_remap_matrix_present_flag" ); sei.m_colourRemapMatrixPresentFlag = uiVal;
     1401    sei_read_flag( pDecodedMessageOutputStream, uiVal,      "colour_remap_matrix_present_flag" ); sei.m_colourRemapMatrixPresentFlag = uiVal;
    11391402    if( sei.m_colourRemapMatrixPresentFlag )
    11401403    {
    1141       READ_CODE( 4, uiVal, "log2_matrix_denom" ); sei.m_log2MatrixDenom = uiVal;
     1404      sei_read_code( pDecodedMessageOutputStream, 4, uiVal, "log2_matrix_denom" ); sei.m_log2MatrixDenom = uiVal;
    11421405      for ( Int c=0 ; c<3 ; c++ )
    11431406        for ( Int i=0 ; i<3 ; i++ )
    11441407        {
    1145           READ_SVLC( iVal, "colour_remap_coeffs[c][i]" ); sei.m_colourRemapCoeffs[c][i] = iVal;
     1408          sei_read_svlc( pDecodedMessageOutputStream, iVal, "colour_remap_coeffs[c][i]" ); sei.m_colourRemapCoeffs[c][i] = iVal;
    11461409        }
    11471410    }
     
    11551418    for( Int c=0 ; c<3 ; c++ )
    11561419    {
    1157       READ_CODE( 8, uiVal, "post_lut_num_val_minus1[c]" ); sei.m_postLutNumValMinus1[c] = (uiVal==0) ? 1 : uiVal;
     1420      sei_read_code( pDecodedMessageOutputStream, 8, uiVal, "post_lut_num_val_minus1[c]" ); sei.m_postLutNumValMinus1[c] = (uiVal==0) ? 1 : uiVal;
    11581421      sei.m_postLutCodedValue[c].resize(sei.m_postLutNumValMinus1[c]+1);
    11591422      sei.m_postLutTargetValue[c].resize(sei.m_postLutNumValMinus1[c]+1);
     
    11611424        for ( Int i=0 ; i<=sei.m_postLutNumValMinus1[c] ; i++ )
    11621425        {
    1163           READ_CODE( (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, uiVal, "post_lut_coded_value[c][i]" );  sei.m_postLutCodedValue[c][i] = uiVal;
    1164           READ_CODE( (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, uiVal, "post_lut_target_value[c][i]" ); sei.m_postLutTargetValue[c][i] = uiVal;
     1426          sei_read_code( pDecodedMessageOutputStream, (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, uiVal, "post_lut_coded_value[c][i]" );  sei.m_postLutCodedValue[c][i] = uiVal;
     1427          sei_read_code( pDecodedMessageOutputStream, (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, uiVal, "post_lut_target_value[c][i]" ); sei.m_postLutTargetValue[c][i] = uiVal;
    11651428        }
    11661429      else
     
    11731436    }
    11741437  }
    1175 
    1176   xParseByteAlign();
    1177 }
    1178 #endif
    1179 
    1180 Void SEIReader::xParseSEISOPDescription(SEISOPDescription &sei, UInt payloadSize)
    1181 {
    1182   Int iCode;
    1183   UInt uiCode;
    1184 
    1185   READ_UVLC( uiCode,           "sop_seq_parameter_set_id"            ); sei.m_sopSeqParameterSetId = uiCode;
    1186   READ_UVLC( uiCode,           "num_pics_in_sop_minus1"              ); sei.m_numPicsInSopMinus1 = uiCode;
    1187   for (UInt i = 0; i <= sei.m_numPicsInSopMinus1; i++)
    1188   {
    1189     READ_CODE( 6, uiCode,                     "sop_desc_vcl_nalu_type" );  sei.m_sopDescVclNaluType[i] = uiCode;
    1190     READ_CODE( 3, sei.m_sopDescTemporalId[i], "sop_desc_temporal_id"   );  sei.m_sopDescTemporalId[i] = uiCode;
    1191     if (sei.m_sopDescVclNaluType[i] != NAL_UNIT_CODED_SLICE_IDR_W_RADL && sei.m_sopDescVclNaluType[i] != NAL_UNIT_CODED_SLICE_IDR_N_LP)
    1192     {
    1193       READ_UVLC( sei.m_sopDescStRpsIdx[i],    "sop_desc_st_rps_idx"    ); sei.m_sopDescStRpsIdx[i] = uiCode;
    1194     }
    1195     if (i > 0)
    1196     {
    1197       READ_SVLC( iCode,                       "sop_desc_poc_delta"     ); sei.m_sopDescPocDelta[i] = iCode;
    1198     }
    1199   }
    1200 
    1201   xParseByteAlign();
    1202 }
    1203 
    1204 #if Q0189_TMVP_CONSTRAINTS
    1205 Void SEIReader::xParseSEITMVPConstraints   (SEITMVPConstrains& sei, UInt payloadSize)
    1206 {
    1207   UInt uiCode;
    1208   READ_UVLC( uiCode,           "prev_pics_not_used_flag"              ); sei.prev_pics_not_used_flag = uiCode;
    1209   READ_UVLC( uiCode,           "no_intra_layer_col_pic_flag"            ); sei.no_intra_layer_col_pic_flag = uiCode;
    1210   xParseByteAlign();
    1211 }
    1212 #endif
    1213 
    1214 #if Q0247_FRAME_FIELD_INFO
    1215 Void SEIReader::xParseSEIFrameFieldInfo    (SEIFrameFieldInfo& sei, UInt payloadSize)
    1216 {
    1217   UInt code;
    1218   READ_CODE( 4, code, "ffinfo_pic_struct" );             sei.m_ffinfo_picStruct            = code;
    1219   READ_CODE( 2, code, "ffinfo_source_scan_type" );       sei.m_ffinfo_sourceScanType = code;
    1220   READ_FLAG(    code, "ffinfo_duplicate_flag" );         sei.m_ffinfo_duplicateFlag    = ( code == 1 ? true : false );
    1221   xParseByteAlign();
    1222 }
    1223 #endif
    1224 
    1225 #if LAYERS_NOT_PRESENT_SEI
    1226 Void SEIReader::xParseSEIScalableNesting(SEIScalableNesting& sei, const NalUnitType nalUnitType, UInt payloadSize, TComVPS *vps, TComSPS *sps)
    1227 #else
    1228 Void SEIReader::xParseSEIScalableNesting(SEIScalableNesting& sei, const NalUnitType nalUnitType, UInt payloadSize, TComSPS *sps)
    1229 #endif
    1230 {
    1231   UInt uiCode;
    1232   SEIMessages seis;
    1233 
    1234   READ_FLAG( uiCode,            "bitstream_subset_flag"         ); sei.m_bitStreamSubsetFlag = uiCode;
    1235   READ_FLAG( uiCode,            "nesting_op_flag"               ); sei.m_nestingOpFlag = uiCode;
    1236   if (sei.m_nestingOpFlag)
    1237   {
    1238     READ_FLAG( uiCode,            "default_op_flag"               ); sei.m_defaultOpFlag = uiCode;
    1239     READ_UVLC( uiCode,            "nesting_num_ops_minus1"        ); sei.m_nestingNumOpsMinus1 = uiCode;
    1240     for (UInt i = sei.m_defaultOpFlag; i <= sei.m_nestingNumOpsMinus1; i++)
    1241     {
    1242       READ_CODE( 3,        uiCode,  "nesting_max_temporal_id_plus1"   ); sei.m_nestingMaxTemporalIdPlus1[i] = uiCode;
    1243       READ_UVLC( uiCode,            "nesting_op_idx"                  ); sei.m_nestingOpIdx[i] = uiCode;
    1244     }
    1245   }
    1246   else
    1247   {
    1248     READ_FLAG( uiCode,            "all_layers_flag"               ); sei.m_allLayersFlag       = uiCode;
    1249     if (!sei.m_allLayersFlag)
    1250     {
    1251       READ_CODE( 3,        uiCode,  "nesting_no_op_max_temporal_id_plus1"  ); sei.m_nestingNoOpMaxTemporalIdPlus1 = uiCode;
    1252       READ_UVLC( uiCode,            "nesting_num_layers_minus1"            ); sei.m_nestingNumLayersMinus1        = uiCode;
    1253       for (UInt i = 0; i <= sei.m_nestingNumLayersMinus1; i++)
    1254       {
    1255         READ_CODE( 6,           uiCode,     "nesting_layer_id"      ); sei.m_nestingLayerId[i]   = uiCode;
    1256       }
    1257     }
    1258   }
    1259 
    1260   // byte alignment
    1261   while ( m_pcBitstream->getNumBitsRead() % 8 != 0 )
    1262   {
    1263     UInt code;
    1264     READ_FLAG( code, "nesting_zero_bit" );
    1265   }
    1266 
    1267   sei.m_callerOwnsSEIs = false;
    1268 
    1269   // read nested SEI messages
    1270   do {
    1271 #if O0164_MULTI_LAYER_HRD
    1272 #if LAYERS_NOT_PRESENT_SEI
    1273     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, &sei);
    1274 #else
    1275     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, &sei);
    1276 #endif
    1277 #else
    1278 #if LAYERS_NOT_PRESENT_SEI
    1279     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps);
    1280 #else
    1281     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps);
    1282 #endif
    1283 #endif
    1284   } while (m_pcBitstream->getNumBitsLeft() > 8);
    1285 
    1286 }
    1287 
    1288 Void SEIReader::xParseByteAlign()
    1289 {
    1290   UInt code;
    1291   if( m_pcBitstream->getNumBitsRead() % 8 != 0 )
    1292   {
    1293     READ_FLAG( code, "bit_equal_to_one" );          assert( code == 1 );
    1294   }
    1295   while( m_pcBitstream->getNumBitsRead() % 8 != 0 )
    1296   {
    1297     READ_FLAG( code, "bit_equal_to_zero" );         assert( code == 0 );
    1298   }
    1299 }
     1438}
     1439#endif
     1440
    13001441
    13011442#if SVC_EXTENSION
    13021443#if LAYERS_NOT_PRESENT_SEI
    1303 Void SEIReader::xParseSEILayersNotPresent(SEILayersNotPresent &sei, UInt payloadSize, TComVPS *vps)
     1444Void SEIReader::xParseSEILayersNotPresent(SEILayersNotPresent &sei, UInt payloadSize, TComVPS *vps, std::ostream *pDecodedMessageOutputStream)
    13041445{
    13051446  UInt uiCode;
    13061447  UInt i = 0;
    13071448
    1308   READ_UVLC( uiCode,           "lp_sei_active_vps_id" ); sei.m_activeVpsId = uiCode;
     1449  sei_read_uvlc( pDecodedMessageOutputStream, uiCode,           "lp_sei_active_vps_id" ); sei.m_activeVpsId = uiCode;
    13091450  assert(vps->getVPSId() == sei.m_activeVpsId);
    13101451  sei.m_vpsMaxLayers = vps->getMaxLayers();
    13111452  for (; i < sei.m_vpsMaxLayers; i++)
    13121453  {
    1313     READ_FLAG( uiCode,         "layer_not_present_flag"   ); sei.m_layerNotPresentFlag[i] = uiCode ? true : false;
     1454    sei_read_flag( pDecodedMessageOutputStream, uiCode,         "layer_not_present_flag"   ); sei.m_layerNotPresentFlag[i] = uiCode ? true : false;
    13141455  }
    13151456  for (; i < MAX_LAYERS; i++)
     
    13171458    sei.m_layerNotPresentFlag[i] = false;
    13181459  }
    1319   xParseByteAlign();
    1320 }
    1321 #endif
     1460}
     1461#endif
     1462
    13221463#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
    1323 Void SEIReader::xParseSEIInterLayerConstrainedTileSets (SEIInterLayerConstrainedTileSets &sei, UInt payloadSize)
     1464Void SEIReader::xParseSEIInterLayerConstrainedTileSets (SEIInterLayerConstrainedTileSets &sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
    13241465{
    13251466  UInt uiCode;
    13261467
    1327   READ_FLAG( uiCode, "il_all_tiles_exact_sample_value_match_flag"   ); sei.m_ilAllTilesExactSampleValueMatchFlag = uiCode;
    1328   READ_FLAG( uiCode, "il_one_tile_per_tile_set_flag"                ); sei.m_ilOneTilePerTileSetFlag = uiCode;
     1468  sei_read_flag( pDecodedMessageOutputStream, uiCode, "il_all_tiles_exact_sample_value_match_flag"   ); sei.m_ilAllTilesExactSampleValueMatchFlag = uiCode;
     1469  sei_read_flag( pDecodedMessageOutputStream, uiCode, "il_one_tile_per_tile_set_flag"                ); sei.m_ilOneTilePerTileSetFlag = uiCode;
    13291470  if( !sei.m_ilOneTilePerTileSetFlag )
    13301471  {
    1331     READ_UVLC( uiCode, "il_num_sets_in_message_minus1"                ); sei.m_ilNumSetsInMessageMinus1 = uiCode;
     1472    sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "il_num_sets_in_message_minus1"                ); sei.m_ilNumSetsInMessageMinus1 = uiCode;
    13321473    if( sei.m_ilNumSetsInMessageMinus1 )
    13331474    {
    1334       READ_FLAG( uiCode, "skipped_tile_set_present_flag"                ); sei.m_skippedTileSetPresentFlag = uiCode;
     1475      sei_read_flag( pDecodedMessageOutputStream, uiCode, "skipped_tile_set_present_flag"                ); sei.m_skippedTileSetPresentFlag = uiCode;
    13351476    }
    13361477    else
     
    13411482    for( UInt i = 0; i < numSignificantSets; i++ )
    13421483    {
    1343       READ_UVLC( uiCode, "ilcts_id"                                     ); sei.m_ilctsId[i] = uiCode;
    1344       READ_UVLC( uiCode, "il_num_tile_rects_in_set_minus1"              ) ;sei.m_ilNumTileRectsInSetMinus1[i] = uiCode;
     1484      sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "ilcts_id"                                     ); sei.m_ilctsId[i] = uiCode;
     1485      sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "il_num_tile_rects_in_set_minus1"              ) ;sei.m_ilNumTileRectsInSetMinus1[i] = uiCode;
    13451486      for( UInt j = 0; j <= sei.m_ilNumTileRectsInSetMinus1[i]; j++ )
    13461487      {
    1347         READ_UVLC( uiCode, "il_top_left_tile_index"                       ); sei.m_ilTopLeftTileIndex[i][j] = uiCode;
    1348         READ_UVLC( uiCode, "il_bottom_right_tile_index"                   ); sei.m_ilBottomRightTileIndex[i][j] = uiCode;
    1349       }
    1350       READ_CODE( 2, uiCode, "ilc_idc"                                   ); sei.m_ilcIdc[i] = uiCode;
     1488        sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "il_top_left_tile_index"                       ); sei.m_ilTopLeftTileIndex[i][j] = uiCode;
     1489        sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "il_bottom_right_tile_index"                   ); sei.m_ilBottomRightTileIndex[i][j] = uiCode;
     1490      }
     1491      sei_read_code( pDecodedMessageOutputStream, 2, uiCode, "ilc_idc"                                   ); sei.m_ilcIdc[i] = uiCode;
    13511492      if( sei.m_ilAllTilesExactSampleValueMatchFlag )
    13521493      {
    1353         READ_FLAG( uiCode, "il_exact_sample_value_match_flag"             ); sei.m_ilExactSampleValueMatchFlag[i] = uiCode;
     1494        sei_read_flag( pDecodedMessageOutputStream, uiCode, "il_exact_sample_value_match_flag"             ); sei.m_ilExactSampleValueMatchFlag[i] = uiCode;
    13541495      }
    13551496    }
     
    13571498  else
    13581499  {
    1359     READ_CODE( 2, uiCode, "all_tiles_ilc_idc"                         ); sei.m_allTilesIlcIdc = uiCode;
    1360   }
    1361 
    1362   xParseByteAlign();
    1363 }
    1364 #endif
     1500    sei_read_code( pDecodedMessageOutputStream, 2, uiCode, "all_tiles_ilc_idc"                         ); sei.m_allTilesIlcIdc = uiCode;
     1501  }
     1502}
     1503#endif
     1504
    13651505#if SUB_BITSTREAM_PROPERTY_SEI
    13661506#if OLS_IDX_CHK
    1367 Void SEIReader::xParseSEISubBitstreamProperty(SEISubBitstreamProperty &sei, TComVPS *vps)
    1368 #else
    1369 Void SEIReader::xParseSEISubBitstreamProperty(SEISubBitstreamProperty &sei)
     1507Void SEIReader::xParseSEISubBitstreamProperty(SEISubBitstreamProperty &sei, TComVPS *vps, std::ostream *pDecodedMessageOutputStream)
     1508#else
     1509Void SEIReader::xParseSEISubBitstreamProperty(SEISubBitstreamProperty &sei, std::ostream *pDecodedMessageOutputStream)
    13701510#endif
    13711511{
    13721512  UInt uiCode;
    1373   READ_CODE( 4, uiCode, "active_vps_id" );                      sei.m_activeVpsId = uiCode;
    1374   READ_UVLC(    uiCode, "num_additional_sub_streams_minus1" );  sei.m_numAdditionalSubStreams = uiCode + 1;
     1513  sei_read_code( pDecodedMessageOutputStream, 4, uiCode, "active_vps_id" );                      sei.m_activeVpsId = uiCode;
     1514  sei_read_uvlc( pDecodedMessageOutputStream,    uiCode, "num_additional_sub_streams_minus1" );  sei.m_numAdditionalSubStreams = uiCode + 1;
    13751515
    13761516  for( Int i = 0; i < sei.m_numAdditionalSubStreams; i++ )
    13771517  {
    1378     READ_CODE(  2, uiCode, "sub_bitstream_mode[i]"           ); sei.m_subBitstreamMode[i] = uiCode;
    1379     READ_UVLC(     uiCode, "output_layer_set_idx_to_vps[i]"  );
     1518    sei_read_code( pDecodedMessageOutputStream,  2, uiCode, "sub_bitstream_mode[i]"           ); sei.m_subBitstreamMode[i] = uiCode;
     1519    sei_read_uvlc( pDecodedMessageOutputStream,     uiCode, "output_layer_set_idx_to_vps[i]"  );
    13801520#if OLS_IDX_CHK
    13811521      // The value of output_layer_set_idx_to_vps[ i ]  shall be in the range of 0 to NumOutputLayerSets − 1, inclusive.
     
    13831523#endif
    13841524      sei.m_outputLayerSetIdxToVps[i] = uiCode;
    1385     READ_CODE(  3, uiCode, "highest_sub_layer_id[i]"         ); sei.m_highestSublayerId[i] = uiCode;
    1386     READ_CODE( 16, uiCode, "avg_bit_rate[i]"                 ); sei.m_avgBitRate[i] = uiCode;
    1387     READ_CODE( 16, uiCode, "max_bit_rate[i]"                 ); sei.m_maxBitRate[i] = uiCode;
    1388   }
    1389   xParseByteAlign();
     1525    sei_read_code( pDecodedMessageOutputStream,  3, uiCode, "highest_sub_layer_id[i]"         ); sei.m_highestSublayerId[i] = uiCode;
     1526    sei_read_code( pDecodedMessageOutputStream, 16, uiCode, "avg_bit_rate[i]"                 ); sei.m_avgBitRate[i] = uiCode;
     1527    sei_read_code( pDecodedMessageOutputStream, 16, uiCode, "max_bit_rate[i]"                 ); sei.m_maxBitRate[i] = uiCode;
     1528  } 
    13901529}
    13911530#endif
     
    13931532#if O0164_MULTI_LAYER_HRD
    13941533#if LAYERS_NOT_PRESENT_SEI
    1395 Void SEIReader::xParseSEIBspNesting(SEIBspNesting &sei, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, const SEIScalableNesting &nestingSei)
    1396 #else
    1397 Void SEIReader::xParseSEIBspNesting(SEIBspNesting &sei, const NalUnitType nalUnitType, TComSPS *sps, const SEIScalableNesting &nestingSei)
     1534Void SEIReader::xParseSEIBspNesting(SEIBspNesting &sei, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, const SEIScalableNesting &nestingSei, std::ostream *pDecodedMessageOutputStream)
     1535#else
     1536Void SEIReader::xParseSEIBspNesting(SEIBspNesting &sei, const NalUnitType nalUnitType, TComSPS *sps, const SEIScalableNesting &nestingSei, std::ostream *pDecodedMessageOutputStream)
    13981537#endif
    13991538{
    14001539  UInt uiCode;
    1401   READ_UVLC( uiCode, "bsp_idx" ); sei.m_bspIdx = uiCode;
     1540  sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "bsp_idx" ); sei.m_bspIdx = uiCode;
    14021541
    14031542  // byte alignment
     
    14051544  {
    14061545    UInt code;
    1407     READ_FLAG( code, "bsp_nesting_zero_bit" );
     1546    sei_read_flag( pDecodedMessageOutputStream, code, "bsp_nesting_zero_bit" );
    14081547  }
    14091548
     
    14131552#if NESTING_SEI_EXTENSIBILITY
    14141553  Int numSeiMessages = 0;
    1415   READ_UVLC( uiCode, "num_seis_in_bsp_minus1" );  assert( uiCode <= MAX_SEIS_IN_BSP_NESTING );
     1554  sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "num_seis_in_bsp_minus1" );  assert( uiCode <= MAX_SEIS_IN_BSP_NESTING );
    14161555  numSeiMessages = uiCode;
    14171556  for(Int i = 0; i < numSeiMessages; i++)
    14181557  {
    1419     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, &nestingSei, &sei);
     1558    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, pDecodedMessageOutputStream, &nestingSei, &sei);
    14201559  }
    14211560#else
    14221561  do {
    14231562#if LAYERS_NOT_PRESENT_SEI
    1424     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, &nestingSei, &sei);
    1425 #else
    1426     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, &nestingSei);
     1563    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, pDecodedMessageOutputStream, &nestingSei, &sei);
     1564#else
     1565    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, pDecodedMessageOutputStream, &nestingSei);
    14271566#endif
    14281567  } while (m_pcBitstream->getNumBitsLeft() > 8);
     
    14301569}
    14311570
    1432 Void SEIReader::xParseSEIBspInitialArrivalTime(SEIBspInitialArrivalTime &sei, TComVPS *vps, TComSPS *sps, const SEIScalableNesting &nestingSei, const SEIBspNesting &bspNestingSei)
     1571Void SEIReader::xParseSEIBspInitialArrivalTime(SEIBspInitialArrivalTime &sei, TComVPS *vps, TComSPS *sps, const SEIScalableNesting &nestingSei, const SEIBspNesting &bspNestingSei, std::ostream *pDecodedMessageOutputStream)
    14331572{
    14341573  assert(vps->getVpsVuiPresentFlag());
     
    14631602    for(UInt i = 0; i < maxValues; i++)
    14641603    {
    1465       READ_CODE( syntaxElemLen[i], uiCode, "nal_initial_arrival_delay[i]" ); sei.m_nalInitialArrivalDelay[i] = uiCode;
     1604      sei_read_code( pDecodedMessageOutputStream, syntaxElemLen[i], uiCode, "nal_initial_arrival_delay[i]" ); sei.m_nalInitialArrivalDelay[i] = uiCode;
    14661605    }
    14671606  }
     
    14701609    for(UInt i = 0; i < maxValues; i++)
    14711610    {
    1472       READ_CODE( syntaxElemLen[i], uiCode, "vcl_initial_arrival_delay[i]" ); sei.m_vclInitialArrivalDelay[i] = uiCode;
     1611      sei_read_code( pDecodedMessageOutputStream, syntaxElemLen[i], uiCode, "vcl_initial_arrival_delay[i]" ); sei.m_vclInitialArrivalDelay[i] = uiCode;
    14731612    }
    14741613  }
     
    15031642    for(UInt i = 0; i < schedCombCnt; i++)
    15041643    {
    1505       READ_CODE( len, uiCode, "nal_initial_arrival_delay" ); sei.m_nalInitialArrivalDelay[i] = uiCode;
     1644      sei_read_code( pDecodedMessageOutputStream, len, uiCode, "nal_initial_arrival_delay" ); sei.m_nalInitialArrivalDelay[i] = uiCode;
    15061645    }
    15071646  }
     
    15141653    for(UInt i = 0; i < schedCombCnt; i++)
    15151654    {
    1516       READ_CODE( len, uiCode, "vcl_initial_arrival_delay" ); sei.m_vclInitialArrivalDelay[i] = uiCode;
     1655      sei_read_code( pDecodedMessageOutputStream, len, uiCode, "vcl_initial_arrival_delay" ); sei.m_vclInitialArrivalDelay[i] = uiCode;
    15171656    }
    15181657  }
     
    15211660
    15221661#if !REMOVE_BSP_HRD_SEI
    1523 Void SEIReader::xParseSEIBspHrd(SEIBspHrd &sei, TComSPS *sps, const SEIScalableNesting &nestingSei)
     1662Void SEIReader::xParseSEIBspHrd(SEIBspHrd &sei, TComSPS *sps, const SEIScalableNesting &nestingSei, std::ostream *pDecodedMessageOutputStream)
    15241663{
    15251664  UInt uiCode;
    1526   READ_UVLC( uiCode, "sei_num_bsp_hrd_parameters_minus1" ); sei.m_seiNumBspHrdParametersMinus1 = uiCode;
     1665  sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "sei_num_bsp_hrd_parameters_minus1" ); sei.m_seiNumBspHrdParametersMinus1 = uiCode;
    15271666  for (UInt i = 0; i <= sei.m_seiNumBspHrdParametersMinus1; i++)
    15281667  {
    15291668    if (i > 0)
    15301669    {
    1531       READ_FLAG( uiCode, "sei_bsp_cprms_present_flag" ); sei.m_seiBspCprmsPresentFlag[i] = uiCode;
     1670      sei_read_flag( pDecodedMessageOutputStream, uiCode, "sei_bsp_cprms_present_flag" ); sei.m_seiBspCprmsPresentFlag[i] = uiCode;
    15321671    }
    15331672    xParseHrdParameters(sei.hrd, i==0 ? 1 : sei.m_seiBspCprmsPresentFlag[i], nestingSei.m_nestingMaxTemporalIdPlus1[0]-1);
     
    15361675  {
    15371676    UInt lsIdx = nestingSei.m_nestingOpIdx[h];
    1538     READ_UVLC( uiCode, "num_sei_bitstream_partitions_minus1[i]"); sei.m_seiNumBitstreamPartitionsMinus1[lsIdx] = uiCode;
     1677    sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "num_sei_bitstream_partitions_minus1[i]"); sei.m_seiNumBitstreamPartitionsMinus1[lsIdx] = uiCode;
    15391678#if HRD_BPB
    15401679    Int chkPart=0;
     
    15601699        {
    15611700#endif
    1562           READ_FLAG( uiCode, "sei_layer_in_bsp_flag[lsIdx][i][j]" ); sei.m_seiLayerInBspFlag[lsIdx][i][j] = uiCode;
     1701          sei_read_flag( pDecodedMessageOutputStream, uiCode, "sei_layer_in_bsp_flag[lsIdx][i][j]" ); sei.m_seiLayerInBspFlag[lsIdx][i][j] = uiCode;
    15631702        }
    15641703#if !HRD_BPB
     
    15881727#endif
    15891728     
    1590     READ_UVLC( uiCode, "sei_num_bsp_sched_combinations_minus1[i]"); sei.m_seiNumBspSchedCombinationsMinus1[lsIdx] = uiCode;
     1729    sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "sei_num_bsp_sched_combinations_minus1[i]"); sei.m_seiNumBspSchedCombinationsMinus1[lsIdx] = uiCode;
    15911730    for (i = 0; i <= sei.m_seiNumBspSchedCombinationsMinus1[lsIdx]; i++)
    15921731    {
    15931732      for (UInt j = 0; j <= sei.m_seiNumBitstreamPartitionsMinus1[lsIdx]; j++)
    15941733      {
    1595         READ_UVLC( uiCode, "sei_bsp_comb_hrd_idx[lsIdx][i][j]"); sei.m_seiBspCombHrdIdx[lsIdx][i][j] = uiCode;
     1734        sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "sei_bsp_comb_hrd_idx[lsIdx][i][j]"); sei.m_seiBspCombHrdIdx[lsIdx][i][j] = uiCode;
    15961735#if HRD_BPB
    15971736        assert(uiCode <= sei.m_seiNumBspHrdParametersMinus1);
    15981737#endif
    1599         READ_UVLC( uiCode, "sei_bsp_comb_sched_idx[lsIdx][i][j]"); sei.m_seiBspCombScheddx[lsIdx][i][j] = uiCode;
     1738        sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "sei_bsp_comb_sched_idx[lsIdx][i][j]"); sei.m_seiBspCombScheddx[lsIdx][i][j] = uiCode;
    16001739#if HRD_BPB
    16011740        assert(uiCode <= sei.hrd->getCpbCntMinus1( sps->getMaxTLayers()-1 ));
     
    16081747#endif
    16091748
    1610 Void SEIReader::xParseHrdParameters(TComHRD *hrd, Bool commonInfPresentFlag, UInt maxNumSubLayersMinus1)
     1749Void SEIReader::xParseHrdParameters(TComHRD *hrd, Bool commonInfPresentFlag, UInt maxNumSubLayersMinus1, std::ostream *pDecodedMessageOutputStream)
    16111750{
    16121751  UInt  uiCode;
    16131752  if( commonInfPresentFlag )
    16141753  {
    1615     READ_FLAG( uiCode, "nal_hrd_parameters_present_flag" );           hrd->setNalHrdParametersPresentFlag( uiCode == 1 ? true : false );
    1616     READ_FLAG( uiCode, "vcl_hrd_parameters_present_flag" );           hrd->setVclHrdParametersPresentFlag( uiCode == 1 ? true : false );
     1754    sei_read_flag( pDecodedMessageOutputStream, uiCode, "nal_hrd_parameters_present_flag" );           hrd->setNalHrdParametersPresentFlag( uiCode == 1 ? true : false );
     1755    sei_read_flag( pDecodedMessageOutputStream, uiCode, "vcl_hrd_parameters_present_flag" );           hrd->setVclHrdParametersPresentFlag( uiCode == 1 ? true : false );
    16171756    if( hrd->getNalHrdParametersPresentFlag() || hrd->getVclHrdParametersPresentFlag() )
    16181757    {
    1619       READ_FLAG( uiCode, "sub_pic_cpb_params_present_flag" );         hrd->setSubPicCpbParamsPresentFlag( uiCode == 1 ? true : false );
     1758      sei_read_flag( pDecodedMessageOutputStream, uiCode, "sub_pic_cpb_params_present_flag" );         hrd->setSubPicCpbParamsPresentFlag( uiCode == 1 ? true : false );
    16201759      if( hrd->getSubPicCpbParamsPresentFlag() )
    16211760      {
    1622         READ_CODE( 8, uiCode, "tick_divisor_minus2" );                hrd->setTickDivisorMinus2( uiCode );
    1623         READ_CODE( 5, uiCode, "du_cpb_removal_delay_length_minus1" ); hrd->setDuCpbRemovalDelayLengthMinus1( uiCode );
    1624         READ_FLAG( uiCode, "sub_pic_cpb_params_in_pic_timing_sei_flag" ); hrd->setSubPicCpbParamsInPicTimingSEIFlag( uiCode == 1 ? true : false );
    1625         READ_CODE( 5, uiCode, "dpb_output_delay_du_length_minus1"  ); hrd->setDpbOutputDelayDuLengthMinus1( uiCode );
    1626       }
    1627       READ_CODE( 4, uiCode, "bit_rate_scale" );                       hrd->setBitRateScale( uiCode );
    1628       READ_CODE( 4, uiCode, "cpb_size_scale" );                       hrd->setCpbSizeScale( uiCode );
     1761        sei_read_code( pDecodedMessageOutputStream, 8, uiCode, "tick_divisor_minus2" );                hrd->setTickDivisorMinus2( uiCode );
     1762        sei_read_code( pDecodedMessageOutputStream, 5, uiCode, "du_cpb_removal_delay_length_minus1" ); hrd->setDuCpbRemovalDelayLengthMinus1( uiCode );
     1763        sei_read_flag( pDecodedMessageOutputStream, uiCode, "sub_pic_cpb_params_in_pic_timing_sei_flag" ); hrd->setSubPicCpbParamsInPicTimingSEIFlag( uiCode == 1 ? true : false );
     1764        sei_read_code( pDecodedMessageOutputStream, 5, uiCode, "dpb_output_delay_du_length_minus1"  ); hrd->setDpbOutputDelayDuLengthMinus1( uiCode );
     1765      }
     1766      sei_read_code( pDecodedMessageOutputStream, 4, uiCode, "bit_rate_scale" );                       hrd->setBitRateScale( uiCode );
     1767      sei_read_code( pDecodedMessageOutputStream, 4, uiCode, "cpb_size_scale" );                       hrd->setCpbSizeScale( uiCode );
    16291768      if( hrd->getSubPicCpbParamsPresentFlag() )
    16301769      {
    1631         READ_CODE( 4, uiCode, "cpb_size_du_scale" );                  hrd->setDuCpbSizeScale( uiCode );
    1632       }
    1633       READ_CODE( 5, uiCode, "initial_cpb_removal_delay_length_minus1" ); hrd->setInitialCpbRemovalDelayLengthMinus1( uiCode );
    1634       READ_CODE( 5, uiCode, "au_cpb_removal_delay_length_minus1" );      hrd->setCpbRemovalDelayLengthMinus1( uiCode );
    1635       READ_CODE( 5, uiCode, "dpb_output_delay_length_minus1" );       hrd->setDpbOutputDelayLengthMinus1( uiCode );
     1770        sei_read_code( pDecodedMessageOutputStream, 4, uiCode, "cpb_size_du_scale" );                  hrd->setDuCpbSizeScale( uiCode );
     1771      }
     1772      sei_read_code( pDecodedMessageOutputStream, 5, uiCode, "initial_cpb_removal_delay_length_minus1" ); hrd->setInitialCpbRemovalDelayLengthMinus1( uiCode );
     1773      sei_read_code( pDecodedMessageOutputStream, 5, uiCode, "au_cpb_removal_delay_length_minus1" );      hrd->setCpbRemovalDelayLengthMinus1( uiCode );
     1774      sei_read_code( pDecodedMessageOutputStream, 5, uiCode, "dpb_output_delay_length_minus1" );       hrd->setDpbOutputDelayLengthMinus1( uiCode );
    16361775    }
    16371776  }
     
    16391778  for( i = 0; i <= maxNumSubLayersMinus1; i ++ )
    16401779  {
    1641     READ_FLAG( uiCode, "fixed_pic_rate_general_flag" );                     hrd->setFixedPicRateFlag( i, uiCode == 1 ? true : false  );
     1780    sei_read_flag( pDecodedMessageOutputStream, uiCode, "fixed_pic_rate_general_flag" );                     hrd->setFixedPicRateFlag( i, uiCode == 1 ? true : false  );
    16421781    if( !hrd->getFixedPicRateFlag( i ) )
    16431782    {
    1644       READ_FLAG( uiCode, "fixed_pic_rate_within_cvs_flag" );                hrd->setFixedPicRateWithinCvsFlag( i, uiCode == 1 ? true : false  );
     1783       sei_read_flag( pDecodedMessageOutputStream, uiCode, "fixed_pic_rate_within_cvs_flag" );                hrd->setFixedPicRateWithinCvsFlag( i, uiCode == 1 ? true : false  );
    16451784    }
    16461785    else
     
    16521791    if( hrd->getFixedPicRateWithinCvsFlag( i ) )
    16531792    {
    1654       READ_UVLC( uiCode, "elemental_duration_in_tc_minus1" );             hrd->setPicDurationInTcMinus1( i, uiCode );
     1793      sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "elemental_duration_in_tc_minus1" );             hrd->setPicDurationInTcMinus1( i, uiCode );
    16551794    }
    16561795    else
    16571796    {
    1658       READ_FLAG( uiCode, "low_delay_hrd_flag" );                      hrd->setLowDelayHrdFlag( i, uiCode == 1 ? true : false  );
     1797      sei_read_flag( pDecodedMessageOutputStream, uiCode, "low_delay_hrd_flag" );                      hrd->setLowDelayHrdFlag( i, uiCode == 1 ? true : false  );
    16591798    }
    16601799    if (!hrd->getLowDelayHrdFlag( i ))
    16611800    {
    1662       READ_UVLC( uiCode, "cpb_cnt_minus1" );                          hrd->setCpbCntMinus1( i, uiCode );
     1801      sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "cpb_cnt_minus1" );                          hrd->setCpbCntMinus1( i, uiCode );
    16631802    }
    16641803    for( nalOrVcl = 0; nalOrVcl < 2; nalOrVcl ++ )
     
    16691808        for( j = 0; j <= ( hrd->getCpbCntMinus1( i ) ); j ++ )
    16701809        {
    1671           READ_UVLC( uiCode, "bit_rate_value_minus1" );             hrd->setBitRateValueMinus1( i, j, nalOrVcl, uiCode );
    1672           READ_UVLC( uiCode, "cpb_size_value_minus1" );             hrd->setCpbSizeValueMinus1( i, j, nalOrVcl, uiCode );
     1810          sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "bit_rate_value_minus1" );             hrd->setBitRateValueMinus1( i, j, nalOrVcl, uiCode );
     1811          sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "cpb_size_value_minus1" );             hrd->setCpbSizeValueMinus1( i, j, nalOrVcl, uiCode );
    16731812          if( hrd->getSubPicCpbParamsPresentFlag() )
    16741813          {
    1675             READ_UVLC( uiCode, "cpb_size_du_value_minus1" );       hrd->setDuCpbSizeValueMinus1( i, j, nalOrVcl, uiCode );
    1676             READ_UVLC( uiCode, "bit_rate_du_value_minus1" );       hrd->setDuBitRateValueMinus1( i, j, nalOrVcl, uiCode );
     1814            sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "cpb_size_du_value_minus1" );       hrd->setDuCpbSizeValueMinus1( i, j, nalOrVcl, uiCode );
     1815            sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "bit_rate_du_value_minus1" );       hrd->setDuBitRateValueMinus1( i, j, nalOrVcl, uiCode );
    16771816          }
    1678           READ_FLAG( uiCode, "cbr_flag" );                          hrd->setCbrFlag( i, j, nalOrVcl, uiCode == 1 ? true : false  );
     1817           sei_read_flag( pDecodedMessageOutputStream, uiCode, "cbr_flag" );                          hrd->setCbrFlag( i, j, nalOrVcl, uiCode == 1 ? true : false  );
    16791818        }
    16801819      }
     
    16871826
    16881827#if LAYERS_NOT_PRESENT_SEI
    1689 Void SEIReader::xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps)
    1690 #else
    1691 Void SEIReader::xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComSPS *sps)
     1828Void SEIReader::xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
     1829#else
     1830Void SEIReader::xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComSPS *sps, std::ostream *pDecodedMessageOutputStream)
    16921831#endif
    16931832{
     
    16951834  SEIMessages seis;
    16961835
    1697   READ_FLAG(uiCode, "ols_flag"); sei.m_olsFlag = uiCode;
    1698   READ_UVLC(uiCode, "num_ols_indices_minus1"); sei.m_numOlsIndicesMinus1 = uiCode;
     1836  sei_read_flag( pDecodedMessageOutputStream, uiCode, "ols_flag"); sei.m_olsFlag = uiCode;
     1837  sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "num_ols_indices_minus1"); sei.m_numOlsIndicesMinus1 = uiCode;
    16991838
    17001839  for (Int i = 0; i <= sei.m_numOlsIndicesMinus1; i++)
    17011840  {
    1702     READ_UVLC(uiCode, "ols_idx[i]"); sei.m_olsIdx[i] = uiCode;
     1841    sei_read_uvlc( pDecodedMessageOutputStream, uiCode, "ols_idx[i]"); sei.m_olsIdx[i] = uiCode;
    17031842  }
    17041843
     
    17071846  {
    17081847    UInt code;
    1709     READ_FLAG(code, "ols_nesting_zero_bit");
     1848    sei_read_flag( pDecodedMessageOutputStream, code, "ols_nesting_zero_bit");
    17101849  }
    17111850
     
    17161855#if O0164_MULTI_LAYER_HRD
    17171856#if LAYERS_NOT_PRESENT_SEI
    1718     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps);
    1719 #else
    1720     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps);
     1857    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, pDecodedMessageOutputStream);
     1858#else
     1859    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, pDecodedMessageOutputStream);
    17211860#endif
    17221861#else
    17231862#if LAYERS_NOT_PRESENT_SEI
    1724     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps);
    1725 #else
    1726     xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps);
     1863    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps, pDecodedMessageOutputStream);
     1864#else
     1865    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps, pDecodedMessageOutputStream);
    17271866#endif
    17281867#endif
     
    17311870}
    17321871
    1733 Void SEIReader::xParseSEIVPSRewriting(SEIVPSRewriting &sei)
     1872Void SEIReader::xParseSEIVPSRewriting(SEIVPSRewriting &sei, std::ostream *pDecodedMessageOutputStream )
    17341873{
    17351874}
     
    17381877
    17391878#if Q0096_OVERLAY_SEI
    1740 Void SEIReader::xParseSEIOverlayInfo(SEIOverlayInfo& sei, UInt /*payloadSize*/){
     1879Void SEIReader::xParseSEIOverlayInfo(SEIOverlayInfo& sei, UInt /*payloadSize*/, std::ostream *pDecodedMessageOutputStream)
     1880{
    17411881  Int i, j;
    17421882  UInt val;
    1743   READ_FLAG( val, "overlay_info_cancel_flag" );                 sei.m_overlayInfoCancelFlag = val;
     1883  sei_read_flag( pDecodedMessageOutputStream, val, "overlay_info_cancel_flag" );                 sei.m_overlayInfoCancelFlag = val;
    17441884  if ( !sei.m_overlayInfoCancelFlag )
    17451885  {
    1746     READ_UVLC( val, "overlay_content_aux_id_minus128" );            sei.m_overlayContentAuxIdMinus128 = val;
    1747     READ_UVLC( val, "overlay_label_aux_id_minus128" );              sei.m_overlayLabelAuxIdMinus128 = val;
    1748     READ_UVLC( val, "overlay_alpha_aux_id_minus128" );              sei.m_overlayAlphaAuxIdMinus128 = val;
    1749     READ_UVLC( val, "overlay_element_label_value_length_minus8" );  sei.m_overlayElementLabelValueLengthMinus8 = val;
    1750     READ_UVLC( val, "num_overlays_minus1" );                        sei.m_numOverlaysMinus1 = val;
     1886    sei_read_uvlc( pDecodedMessageOutputStream, val, "overlay_content_aux_id_minus128" );            sei.m_overlayContentAuxIdMinus128 = val;
     1887    sei_read_uvlc( pDecodedMessageOutputStream, val, "overlay_label_aux_id_minus128" );              sei.m_overlayLabelAuxIdMinus128 = val;
     1888    sei_read_uvlc( pDecodedMessageOutputStream, val, "overlay_alpha_aux_id_minus128" );              sei.m_overlayAlphaAuxIdMinus128 = val;
     1889    sei_read_uvlc( pDecodedMessageOutputStream, val, "overlay_element_label_value_length_minus8" );  sei.m_overlayElementLabelValueLengthMinus8 = val;
     1890    sei_read_uvlc( pDecodedMessageOutputStream, val, "num_overlays_minus1" );                        sei.m_numOverlaysMinus1 = val;
    17511891
    17521892    assert( sei.m_numOverlaysMinus1 < MAX_OVERLAYS );
     
    17631903    for ( i=0 ; i<=sei.m_numOverlaysMinus1 ; i++ )
    17641904    {
    1765       READ_UVLC( val, "overlay_idx" );                      sei.m_overlayIdx[i] = val;
    1766       READ_FLAG( val, "language_overlay_present_flag" );    sei.m_languageOverlayPresentFlag[i] = val;
    1767       READ_CODE( 6, val, "overlay_content_layer_id");       sei.m_overlayContentLayerId[i] = val;
    1768       READ_FLAG( val, "overlay_label_present_flag" );       sei.m_overlayLabelPresentFlag[i] = val;
     1905      sei_read_uvlc( pDecodedMessageOutputStream, val, "overlay_idx" );                      sei.m_overlayIdx[i] = val;
     1906      sei_read_flag( pDecodedMessageOutputStream, val, "language_overlay_present_flag" );    sei.m_languageOverlayPresentFlag[i] = val;
     1907      sei_read_code( pDecodedMessageOutputStream, 6, val, "overlay_content_layer_id");       sei.m_overlayContentLayerId[i] = val;
     1908      sei_read_flag( pDecodedMessageOutputStream, val, "overlay_label_present_flag" );       sei.m_overlayLabelPresentFlag[i] = val;
    17691909      if ( sei.m_overlayLabelPresentFlag[i] )
    17701910      {
    1771         READ_CODE( 6, val, "overlay_label_layer_id");     sei.m_overlayLabelLayerId[i] = val;
    1772       }
    1773       READ_FLAG( val, "overlay_alpha_present_flag" );       sei.m_overlayAlphaPresentFlag[i] = val;
     1911        sei_read_code( pDecodedMessageOutputStream, 6, val, "overlay_label_layer_id");     sei.m_overlayLabelLayerId[i] = val;
     1912      }
     1913      sei_read_flag( pDecodedMessageOutputStream, val, "overlay_alpha_present_flag" );       sei.m_overlayAlphaPresentFlag[i] = val;
    17741914      if ( sei.m_overlayAlphaPresentFlag[i] )
    17751915      {
    1776         READ_CODE( 6, val, "overlay_alpha_layer_id");     sei.m_overlayAlphaLayerId[i] = val;
     1916        sei_read_code( pDecodedMessageOutputStream, 6, val, "overlay_alpha_layer_id");     sei.m_overlayAlphaLayerId[i] = val;
    17771917      }
    17781918      if ( sei.m_overlayLabelPresentFlag[i] )
    17791919      {
    1780         READ_UVLC( val, "num_overlay_elements_minus1");   sei.m_numOverlayElementsMinus1[i] = val;
     1920        sei_read_uvlc( pDecodedMessageOutputStream, val, "num_overlay_elements_minus1");   sei.m_numOverlayElementsMinus1[i] = val;
    17811921        assert( sei.m_numOverlayElementsMinus1[i] < MAX_OVERLAY_ELEMENTS );
    17821922        sei.m_overlayElementLabelMin[i].resize( sei.m_numOverlayElementsMinus1[i]+1 );
     
    17841924        for ( j=0 ; j<=sei.m_numOverlayElementsMinus1[i] ; j++ )
    17851925        {
    1786           READ_CODE(sei.m_overlayElementLabelValueLengthMinus8 + 8, val, "overlay_element_label_min"); sei.m_overlayElementLabelMin[i][j] = val;
    1787           READ_CODE(sei.m_overlayElementLabelValueLengthMinus8 + 8, val, "overlay_element_label_max"); sei.m_overlayElementLabelMax[i][j] = val;
     1926          sei_read_code( pDecodedMessageOutputStream, sei.m_overlayElementLabelValueLengthMinus8 + 8, val, "overlay_element_label_min"); sei.m_overlayElementLabelMin[i][j] = val;
     1927          sei_read_code( pDecodedMessageOutputStream, sei.m_overlayElementLabelValueLengthMinus8 + 8, val, "overlay_element_label_max"); sei.m_overlayElementLabelMax[i][j] = val;
    17881928        }     
    17891929      }
     
    17971937    while ( m_pcBitstream->getNumBitsRead() % 8 != 0 )
    17981938    {
    1799       READ_FLAG( val, "overlay_zero_bit" );
     1939      sei_read_flag( pDecodedMessageOutputStream, val, "overlay_zero_bit" );
    18001940      assert( val==0 );
    18011941    }
     
    18351975      }
    18361976    }
    1837     READ_FLAG( val, "overlay_info_persistence_flag" );        sei.m_overlayInfoPersistenceFlag = val;
    1838   }
    1839   xParseByteAlign();
    1840 }
    1841 #endif
     1977    sei_read_flag( pDecodedMessageOutputStream, val, "overlay_info_persistence_flag" );        sei.m_overlayInfoPersistenceFlag = val;
     1978  } 
     1979}
     1980#endif
     1981
     1982#if P0138_USE_ALT_CPB_PARAMS_FLAG
     1983/**
     1984 * Check if SEI message contains payload extension
     1985 */
     1986Bool SEIReader::xPayloadExtensionPresent()
     1987{
     1988  Int payloadBitsRemaining = getBitstream()->getNumBitsLeft();
     1989  Bool payloadExtensionPresent = false;
     1990
     1991  if (payloadBitsRemaining > 8)
     1992  {
     1993    payloadExtensionPresent = true;
     1994  }
     1995  else
     1996  {
     1997    Int finalBits = getBitstream()->peekBits(payloadBitsRemaining);
     1998    while (payloadBitsRemaining && (finalBits & 1) == 0)
     1999    {
     2000      payloadBitsRemaining--;
     2001      finalBits >>= 1;
     2002    }
     2003    payloadBitsRemaining--;
     2004    if (payloadBitsRemaining > 0)
     2005    {
     2006      payloadExtensionPresent = true;
     2007    }
     2008  }
     2009
     2010  return payloadExtensionPresent;
     2011}
     2012#endif
     2013
     2014#if Q0189_TMVP_CONSTRAINTS
     2015Void SEIReader::xParseSEITMVPConstraints   (SEITMVPConstrains& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     2016{
     2017  UInt uiCode;
     2018  sei_read_uvlc( pDecodedMessageOutputStream, uiCode,           "prev_pics_not_used_flag"              ); sei.prev_pics_not_used_flag = uiCode;
     2019  sei_read_uvlc( pDecodedMessageOutputStream, uiCode,           "no_intra_layer_col_pic_flag"          ); sei.no_intra_layer_col_pic_flag = uiCode;
     2020}
     2021#endif
     2022
     2023#if Q0247_FRAME_FIELD_INFO
     2024Void SEIReader::xParseSEIFrameFieldInfo    (SEIFrameFieldInfo& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
     2025{
     2026  UInt code;
     2027  sei_read_code( pDecodedMessageOutputStream, 4, code, "ffinfo_pic_struct"       );       sei.m_ffinfo_picStruct      = code;
     2028  sei_read_code( pDecodedMessageOutputStream, 2, code, "ffinfo_source_scan_type" );       sei.m_ffinfo_sourceScanType = code;
     2029  sei_read_flag( pDecodedMessageOutputStream,    code, "ffinfo_duplicate_flag"   );       sei.m_ffinfo_duplicateFlag  = ( code == 1 ? true : false );
     2030}
     2031#endif
     2032
    18422033
    18432034#endif //SVC_EXTENSION
Note: See TracChangeset for help on using the changeset viewer.