Home | History | Annotate | Download | only in filters
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/logging.h"
      6 #include "base/memory/scoped_ptr.h"
      7 #include "base/stl_util.h"
      8 
      9 #include "media/filters/h264_parser.h"
     10 
     11 namespace media {
     12 
     13 bool H264SliceHeader::IsPSlice() const {
     14   return (slice_type % 5 == kPSlice);
     15 }
     16 
     17 bool H264SliceHeader::IsBSlice() const {
     18   return (slice_type % 5 == kBSlice);
     19 }
     20 
     21 bool H264SliceHeader::IsISlice() const {
     22   return (slice_type % 5 == kISlice);
     23 }
     24 
     25 bool H264SliceHeader::IsSPSlice() const {
     26   return (slice_type % 5 == kSPSlice);
     27 }
     28 
     29 bool H264SliceHeader::IsSISlice() const {
     30   return (slice_type % 5 == kSISlice);
     31 }
     32 
     33 H264NALU::H264NALU() {
     34   memset(this, 0, sizeof(*this));
     35 }
     36 
     37 H264SPS::H264SPS() {
     38   memset(this, 0, sizeof(*this));
     39 }
     40 
     41 H264PPS::H264PPS() {
     42   memset(this, 0, sizeof(*this));
     43 }
     44 
     45 H264SliceHeader::H264SliceHeader() {
     46   memset(this, 0, sizeof(*this));
     47 }
     48 
     49 H264SEIMessage::H264SEIMessage() {
     50   memset(this, 0, sizeof(*this));
     51 }
     52 
     53 #define READ_BITS_OR_RETURN(num_bits, out)                                 \
     54   do {                                                                     \
     55     int _out;                                                              \
     56     if (!br_.ReadBits(num_bits, &_out)) {                                  \
     57       DVLOG(1)                                                             \
     58           << "Error in stream: unexpected EOS while trying to read " #out; \
     59       return kInvalidStream;                                               \
     60     }                                                                      \
     61     *out = _out;                                                           \
     62   } while (0)
     63 
     64 #define READ_BOOL_OR_RETURN(out)                                           \
     65   do {                                                                     \
     66     int _out;                                                              \
     67     if (!br_.ReadBits(1, &_out)) {                                         \
     68       DVLOG(1)                                                             \
     69           << "Error in stream: unexpected EOS while trying to read " #out; \
     70       return kInvalidStream;                                               \
     71     }                                                                      \
     72     *out = _out != 0;                                                      \
     73   } while (0)
     74 
     75 #define READ_UE_OR_RETURN(out)                                                 \
     76   do {                                                                         \
     77     if (ReadUE(out) != kOk) {                                                  \
     78       DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \
     79       return kInvalidStream;                                                   \
     80     }                                                                          \
     81   } while (0)
     82 
     83 #define READ_SE_OR_RETURN(out)                                                 \
     84   do {                                                                         \
     85     if (ReadSE(out) != kOk) {                                                  \
     86       DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \
     87       return kInvalidStream;                                                   \
     88     }                                                                          \
     89   } while (0)
     90 
     91 #define IN_RANGE_OR_RETURN(val, min, max)                                   \
     92   do {                                                                      \
     93     if ((val) < (min) || (val) > (max)) {                                   \
     94       DVLOG(1) << "Error in stream: invalid value, expected " #val " to be" \
     95                << " in range [" << (min) << ":" << (max) << "]"             \
     96                << " found " << (val) << " instead";                         \
     97       return kInvalidStream;                                                \
     98     }                                                                       \
     99   } while (0)
    100 
    101 #define TRUE_OR_RETURN(a)                                            \
    102   do {                                                               \
    103     if (!(a)) {                                                      \
    104       DVLOG(1) << "Error in stream: invalid value, expected " << #a; \
    105       return kInvalidStream;                                         \
    106     }                                                                \
    107   } while (0)
    108 
    109 enum AspectRatioIdc {
    110   kExtendedSar = 255,
    111 };
    112 
    113 // ISO 14496 part 10
    114 // VUI parameters: Table E-1 "Meaning of sample aspect ratio indicator"
    115 static const int kTableSarWidth[] = {
    116   0, 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2
    117 };
    118 static const int kTableSarHeight[] = {
    119   0, 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1
    120 };
    121 COMPILE_ASSERT(arraysize(kTableSarWidth) == arraysize(kTableSarHeight),
    122                sar_tables_must_have_same_size);
    123 
    124 H264Parser::H264Parser() {
    125   Reset();
    126 }
    127 
    128 H264Parser::~H264Parser() {
    129   STLDeleteValues(&active_SPSes_);
    130   STLDeleteValues(&active_PPSes_);
    131 }
    132 
    133 void H264Parser::Reset() {
    134   stream_ = NULL;
    135   bytes_left_ = 0;
    136 }
    137 
    138 void H264Parser::SetStream(const uint8* stream, off_t stream_size) {
    139   DCHECK(stream);
    140   DCHECK_GT(stream_size, 0);
    141 
    142   stream_ = stream;
    143   bytes_left_ = stream_size;
    144 }
    145 
    146 const H264PPS* H264Parser::GetPPS(int pps_id) {
    147   return active_PPSes_[pps_id];
    148 }
    149 
    150 const H264SPS* H264Parser::GetSPS(int sps_id) {
    151   return active_SPSes_[sps_id];
    152 }
    153 
    154 static inline bool IsStartCode(const uint8* data) {
    155   return data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01;
    156 }
    157 
    158 // static
    159 bool H264Parser::FindStartCode(const uint8* data, off_t data_size,
    160                                off_t* offset, off_t* start_code_size) {
    161   DCHECK_GE(data_size, 0);
    162   off_t bytes_left = data_size;
    163 
    164   while (bytes_left >= 3) {
    165     if (IsStartCode(data)) {
    166       // Found three-byte start code, set pointer at its beginning.
    167       *offset = data_size - bytes_left;
    168       *start_code_size = 3;
    169 
    170       // If there is a zero byte before this start code,
    171       // then it's actually a four-byte start code, so backtrack one byte.
    172       if (*offset > 0 && *(data - 1) == 0x00) {
    173         --(*offset);
    174         ++(*start_code_size);
    175       }
    176 
    177       return true;
    178     }
    179 
    180     ++data;
    181     --bytes_left;
    182   }
    183 
    184   // End of data: offset is pointing to the first byte that was not considered
    185   // as a possible start of a start code.
    186   // Note: there is no security issue when receiving a negative |data_size|
    187   // since in this case, |bytes_left| is equal to |data_size| and thus
    188   // |*offset| is equal to 0 (valid offset).
    189   *offset = data_size - bytes_left;
    190   *start_code_size = 0;
    191   return false;
    192 }
    193 
    194 bool H264Parser::LocateNALU(off_t* nalu_size, off_t* start_code_size) {
    195   // Find the start code of next NALU.
    196   off_t nalu_start_off = 0;
    197   off_t annexb_start_code_size = 0;
    198   if (!FindStartCode(stream_, bytes_left_,
    199                      &nalu_start_off, &annexb_start_code_size)) {
    200     DVLOG(4) << "Could not find start code, end of stream?";
    201     return false;
    202   }
    203 
    204   // Move the stream to the beginning of the NALU (pointing at the start code).
    205   stream_ += nalu_start_off;
    206   bytes_left_ -= nalu_start_off;
    207 
    208   const uint8* nalu_data = stream_ + annexb_start_code_size;
    209   off_t max_nalu_data_size = bytes_left_ - annexb_start_code_size;
    210   if (max_nalu_data_size <= 0) {
    211     DVLOG(3) << "End of stream";
    212     return false;
    213   }
    214 
    215   // Find the start code of next NALU;
    216   // if successful, |nalu_size_without_start_code| is the number of bytes from
    217   // after previous start code to before this one;
    218   // if next start code is not found, it is still a valid NALU since there
    219   // are some bytes left after the first start code: all the remaining bytes
    220   // belong to the current NALU.
    221   off_t next_start_code_size = 0;
    222   off_t nalu_size_without_start_code = 0;
    223   if (!FindStartCode(nalu_data, max_nalu_data_size,
    224                      &nalu_size_without_start_code, &next_start_code_size)) {
    225     nalu_size_without_start_code = max_nalu_data_size;
    226   }
    227   *nalu_size = nalu_size_without_start_code + annexb_start_code_size;
    228   *start_code_size = annexb_start_code_size;
    229   return true;
    230 }
    231 
    232 H264Parser::Result H264Parser::ReadUE(int* val) {
    233   int num_bits = -1;
    234   int bit;
    235   int rest;
    236 
    237   // Count the number of contiguous zero bits.
    238   do {
    239     READ_BITS_OR_RETURN(1, &bit);
    240     num_bits++;
    241   } while (bit == 0);
    242 
    243   if (num_bits > 31)
    244     return kInvalidStream;
    245 
    246   // Calculate exp-Golomb code value of size num_bits.
    247   *val = (1 << num_bits) - 1;
    248 
    249   if (num_bits > 0) {
    250     READ_BITS_OR_RETURN(num_bits, &rest);
    251     *val += rest;
    252   }
    253 
    254   return kOk;
    255 }
    256 
    257 H264Parser::Result H264Parser::ReadSE(int* val) {
    258   int ue;
    259   Result res;
    260 
    261   // See Chapter 9 in the spec.
    262   res = ReadUE(&ue);
    263   if (res != kOk)
    264     return res;
    265 
    266   if (ue % 2 == 0)
    267     *val = -(ue / 2);
    268   else
    269     *val = ue / 2 + 1;
    270 
    271   return kOk;
    272 }
    273 
    274 H264Parser::Result H264Parser::AdvanceToNextNALU(H264NALU* nalu) {
    275   off_t start_code_size;
    276   off_t nalu_size_with_start_code;
    277   if (!LocateNALU(&nalu_size_with_start_code, &start_code_size)) {
    278     DVLOG(4) << "Could not find next NALU, bytes left in stream: "
    279              << bytes_left_;
    280     return kEOStream;
    281   }
    282 
    283   nalu->data = stream_ + start_code_size;
    284   nalu->size = nalu_size_with_start_code - start_code_size;
    285   DVLOG(4) << "NALU found: size=" << nalu_size_with_start_code;
    286 
    287   // Initialize bit reader at the start of found NALU.
    288   if (!br_.Initialize(nalu->data, nalu->size))
    289     return kEOStream;
    290 
    291   // Move parser state to after this NALU, so next time AdvanceToNextNALU
    292   // is called, we will effectively be skipping it;
    293   // other parsing functions will use the position saved
    294   // in bit reader for parsing, so we don't have to remember it here.
    295   stream_ += nalu_size_with_start_code;
    296   bytes_left_ -= nalu_size_with_start_code;
    297 
    298   // Read NALU header, skip the forbidden_zero_bit, but check for it.
    299   int data;
    300   READ_BITS_OR_RETURN(1, &data);
    301   TRUE_OR_RETURN(data == 0);
    302 
    303   READ_BITS_OR_RETURN(2, &nalu->nal_ref_idc);
    304   READ_BITS_OR_RETURN(5, &nalu->nal_unit_type);
    305 
    306   DVLOG(4) << "NALU type: " << static_cast<int>(nalu->nal_unit_type)
    307            << " at: " << reinterpret_cast<const void*>(nalu->data)
    308            << " size: " << nalu->size
    309            << " ref: " << static_cast<int>(nalu->nal_ref_idc);
    310 
    311   return kOk;
    312 }
    313 
    314 // Default scaling lists (per spec).
    315 static const int kDefault4x4Intra[kH264ScalingList4x4Length] = {
    316     6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42, };
    317 
    318 static const int kDefault4x4Inter[kH264ScalingList4x4Length] = {
    319     10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34, };
    320 
    321 static const int kDefault8x8Intra[kH264ScalingList8x8Length] = {
    322     6,  10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23,
    323     23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27,
    324     27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
    325     31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42, };
    326 
    327 static const int kDefault8x8Inter[kH264ScalingList8x8Length] = {
    328     9,  13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21,
    329     21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24,
    330     24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27,
    331     27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35, };
    332 
    333 static inline void DefaultScalingList4x4(
    334     int i,
    335     int scaling_list4x4[][kH264ScalingList4x4Length]) {
    336   DCHECK_LT(i, 6);
    337 
    338   if (i < 3)
    339     memcpy(scaling_list4x4[i], kDefault4x4Intra, sizeof(kDefault4x4Intra));
    340   else if (i < 6)
    341     memcpy(scaling_list4x4[i], kDefault4x4Inter, sizeof(kDefault4x4Inter));
    342 }
    343 
    344 static inline void DefaultScalingList8x8(
    345     int i,
    346     int scaling_list8x8[][kH264ScalingList8x8Length]) {
    347   DCHECK_LT(i, 6);
    348 
    349   if (i % 2 == 0)
    350     memcpy(scaling_list8x8[i], kDefault8x8Intra, sizeof(kDefault8x8Intra));
    351   else
    352     memcpy(scaling_list8x8[i], kDefault8x8Inter, sizeof(kDefault8x8Inter));
    353 }
    354 
    355 static void FallbackScalingList4x4(
    356     int i,
    357     const int default_scaling_list_intra[],
    358     const int default_scaling_list_inter[],
    359     int scaling_list4x4[][kH264ScalingList4x4Length]) {
    360   static const int kScalingList4x4ByteSize =
    361       sizeof(scaling_list4x4[0][0]) * kH264ScalingList4x4Length;
    362 
    363   switch (i) {
    364     case 0:
    365       memcpy(scaling_list4x4[i], default_scaling_list_intra,
    366              kScalingList4x4ByteSize);
    367       break;
    368 
    369     case 1:
    370       memcpy(scaling_list4x4[i], scaling_list4x4[0], kScalingList4x4ByteSize);
    371       break;
    372 
    373     case 2:
    374       memcpy(scaling_list4x4[i], scaling_list4x4[1], kScalingList4x4ByteSize);
    375       break;
    376 
    377     case 3:
    378       memcpy(scaling_list4x4[i], default_scaling_list_inter,
    379              kScalingList4x4ByteSize);
    380       break;
    381 
    382     case 4:
    383       memcpy(scaling_list4x4[i], scaling_list4x4[3], kScalingList4x4ByteSize);
    384       break;
    385 
    386     case 5:
    387       memcpy(scaling_list4x4[i], scaling_list4x4[4], kScalingList4x4ByteSize);
    388       break;
    389 
    390     default:
    391       NOTREACHED();
    392       break;
    393   }
    394 }
    395 
    396 static void FallbackScalingList8x8(
    397     int i,
    398     const int default_scaling_list_intra[],
    399     const int default_scaling_list_inter[],
    400     int scaling_list8x8[][kH264ScalingList8x8Length]) {
    401   static const int kScalingList8x8ByteSize =
    402       sizeof(scaling_list8x8[0][0]) * kH264ScalingList8x8Length;
    403 
    404   switch (i) {
    405     case 0:
    406       memcpy(scaling_list8x8[i], default_scaling_list_intra,
    407              kScalingList8x8ByteSize);
    408       break;
    409 
    410     case 1:
    411       memcpy(scaling_list8x8[i], default_scaling_list_inter,
    412              kScalingList8x8ByteSize);
    413       break;
    414 
    415     case 2:
    416       memcpy(scaling_list8x8[i], scaling_list8x8[0], kScalingList8x8ByteSize);
    417       break;
    418 
    419     case 3:
    420       memcpy(scaling_list8x8[i], scaling_list8x8[1], kScalingList8x8ByteSize);
    421       break;
    422 
    423     case 4:
    424       memcpy(scaling_list8x8[i], scaling_list8x8[2], kScalingList8x8ByteSize);
    425       break;
    426 
    427     case 5:
    428       memcpy(scaling_list8x8[i], scaling_list8x8[3], kScalingList8x8ByteSize);
    429       break;
    430 
    431     default:
    432       NOTREACHED();
    433       break;
    434   }
    435 }
    436 
    437 H264Parser::Result H264Parser::ParseScalingList(int size,
    438                                                 int* scaling_list,
    439                                                 bool* use_default) {
    440   // See chapter 7.3.2.1.1.1.
    441   int last_scale = 8;
    442   int next_scale = 8;
    443   int delta_scale;
    444 
    445   *use_default = false;
    446 
    447   for (int j = 0; j < size; ++j) {
    448     if (next_scale != 0) {
    449       READ_SE_OR_RETURN(&delta_scale);
    450       IN_RANGE_OR_RETURN(delta_scale, -128, 127);
    451       next_scale = (last_scale + delta_scale + 256) & 0xff;
    452 
    453       if (j == 0 && next_scale == 0) {
    454         *use_default = true;
    455         return kOk;
    456       }
    457     }
    458 
    459     scaling_list[j] = (next_scale == 0) ? last_scale : next_scale;
    460     last_scale = scaling_list[j];
    461   }
    462 
    463   return kOk;
    464 }
    465 
    466 H264Parser::Result H264Parser::ParseSPSScalingLists(H264SPS* sps) {
    467   // See 7.4.2.1.1.
    468   bool seq_scaling_list_present_flag;
    469   bool use_default;
    470   Result res;
    471 
    472   // Parse scaling_list4x4.
    473   for (int i = 0; i < 6; ++i) {
    474     READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
    475 
    476     if (seq_scaling_list_present_flag) {
    477       res = ParseScalingList(arraysize(sps->scaling_list4x4[i]),
    478                              sps->scaling_list4x4[i],
    479                              &use_default);
    480       if (res != kOk)
    481         return res;
    482 
    483       if (use_default)
    484         DefaultScalingList4x4(i, sps->scaling_list4x4);
    485 
    486     } else {
    487       FallbackScalingList4x4(
    488           i, kDefault4x4Intra, kDefault4x4Inter, sps->scaling_list4x4);
    489     }
    490   }
    491 
    492   // Parse scaling_list8x8.
    493   for (int i = 0; i < ((sps->chroma_format_idc != 3) ? 2 : 6); ++i) {
    494     READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
    495 
    496     if (seq_scaling_list_present_flag) {
    497       res = ParseScalingList(arraysize(sps->scaling_list8x8[i]),
    498                              sps->scaling_list8x8[i],
    499                              &use_default);
    500       if (res != kOk)
    501         return res;
    502 
    503       if (use_default)
    504         DefaultScalingList8x8(i, sps->scaling_list8x8);
    505 
    506     } else {
    507       FallbackScalingList8x8(
    508           i, kDefault8x8Intra, kDefault8x8Inter, sps->scaling_list8x8);
    509     }
    510   }
    511 
    512   return kOk;
    513 }
    514 
    515 H264Parser::Result H264Parser::ParsePPSScalingLists(const H264SPS& sps,
    516                                                     H264PPS* pps) {
    517   // See 7.4.2.2.
    518   bool pic_scaling_list_present_flag;
    519   bool use_default;
    520   Result res;
    521 
    522   for (int i = 0; i < 6; ++i) {
    523     READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
    524 
    525     if (pic_scaling_list_present_flag) {
    526       res = ParseScalingList(arraysize(pps->scaling_list4x4[i]),
    527                              pps->scaling_list4x4[i],
    528                              &use_default);
    529       if (res != kOk)
    530         return res;
    531 
    532       if (use_default)
    533         DefaultScalingList4x4(i, pps->scaling_list4x4);
    534 
    535     } else {
    536       if (sps.seq_scaling_matrix_present_flag) {
    537         // Table 7-2 fallback rule A in spec.
    538         FallbackScalingList4x4(
    539             i, kDefault4x4Intra, kDefault4x4Inter, pps->scaling_list4x4);
    540       } else {
    541         // Table 7-2 fallback rule B in spec.
    542         FallbackScalingList4x4(i,
    543                                sps.scaling_list4x4[0],
    544                                sps.scaling_list4x4[3],
    545                                pps->scaling_list4x4);
    546       }
    547     }
    548   }
    549 
    550   if (pps->transform_8x8_mode_flag) {
    551     for (int i = 0; i < ((sps.chroma_format_idc != 3) ? 2 : 6); ++i) {
    552       READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
    553 
    554       if (pic_scaling_list_present_flag) {
    555         res = ParseScalingList(arraysize(pps->scaling_list8x8[i]),
    556                                pps->scaling_list8x8[i],
    557                                &use_default);
    558         if (res != kOk)
    559           return res;
    560 
    561         if (use_default)
    562           DefaultScalingList8x8(i, pps->scaling_list8x8);
    563 
    564       } else {
    565         if (sps.seq_scaling_matrix_present_flag) {
    566           // Table 7-2 fallback rule A in spec.
    567           FallbackScalingList8x8(
    568               i, kDefault8x8Intra, kDefault8x8Inter, pps->scaling_list8x8);
    569         } else {
    570           // Table 7-2 fallback rule B in spec.
    571           FallbackScalingList8x8(i,
    572                                  sps.scaling_list8x8[0],
    573                                  sps.scaling_list8x8[1],
    574                                  pps->scaling_list8x8);
    575         }
    576       }
    577     }
    578   }
    579   return kOk;
    580 }
    581 
    582 H264Parser::Result H264Parser::ParseAndIgnoreHRDParameters(
    583     bool* hrd_parameters_present) {
    584   int data;
    585   READ_BOOL_OR_RETURN(&data);  // {nal,vcl}_hrd_parameters_present_flag
    586   if (!data)
    587     return kOk;
    588 
    589   *hrd_parameters_present = true;
    590 
    591   int cpb_cnt_minus1;
    592   READ_UE_OR_RETURN(&cpb_cnt_minus1);
    593   IN_RANGE_OR_RETURN(cpb_cnt_minus1, 0, 31);
    594   READ_BITS_OR_RETURN(8, &data);  // bit_rate_scale, cpb_size_scale
    595   for (int i = 0; i <= cpb_cnt_minus1; ++i) {
    596     READ_UE_OR_RETURN(&data);  // bit_rate_value_minus1[i]
    597     READ_UE_OR_RETURN(&data);  // cpb_size_value_minus1[i]
    598     READ_BOOL_OR_RETURN(&data);  // cbr_flag
    599   }
    600   READ_BITS_OR_RETURN(20, &data);  // cpb/dpb delays, etc.
    601 
    602   return kOk;
    603 }
    604 
    605 H264Parser::Result H264Parser::ParseVUIParameters(H264SPS* sps) {
    606   bool aspect_ratio_info_present_flag;
    607   READ_BOOL_OR_RETURN(&aspect_ratio_info_present_flag);
    608   if (aspect_ratio_info_present_flag) {
    609     int aspect_ratio_idc;
    610     READ_BITS_OR_RETURN(8, &aspect_ratio_idc);
    611     if (aspect_ratio_idc == kExtendedSar) {
    612       READ_BITS_OR_RETURN(16, &sps->sar_width);
    613       READ_BITS_OR_RETURN(16, &sps->sar_height);
    614     } else {
    615       const int max_aspect_ratio_idc = arraysize(kTableSarWidth) - 1;
    616       IN_RANGE_OR_RETURN(aspect_ratio_idc, 0, max_aspect_ratio_idc);
    617       sps->sar_width = kTableSarWidth[aspect_ratio_idc];
    618       sps->sar_height = kTableSarHeight[aspect_ratio_idc];
    619     }
    620   }
    621 
    622   int data;
    623   // Read and ignore overscan and video signal type info.
    624   READ_BOOL_OR_RETURN(&data);  // overscan_info_present_flag
    625   if (data)
    626     READ_BOOL_OR_RETURN(&data);  // overscan_appropriate_flag
    627 
    628   READ_BOOL_OR_RETURN(&data);  // video_signal_type_present_flag
    629   if (data) {
    630     READ_BITS_OR_RETURN(3, &data);  // video_format
    631     READ_BOOL_OR_RETURN(&data);  // video_full_range_flag
    632     READ_BOOL_OR_RETURN(&data);  // colour_description_present_flag
    633     if (data)
    634       READ_BITS_OR_RETURN(24, &data);  // color description syntax elements
    635   }
    636 
    637   READ_BOOL_OR_RETURN(&data);  // chroma_loc_info_present_flag
    638   if (data) {
    639     READ_UE_OR_RETURN(&data);  // chroma_sample_loc_type_top_field
    640     READ_UE_OR_RETURN(&data);  // chroma_sample_loc_type_bottom_field
    641   }
    642 
    643   // Read and ignore timing info.
    644   READ_BOOL_OR_RETURN(&data);  // timing_info_present_flag
    645   if (data) {
    646     READ_BITS_OR_RETURN(16, &data);  // num_units_in_tick
    647     READ_BITS_OR_RETURN(16, &data);  // num_units_in_tick
    648     READ_BITS_OR_RETURN(16, &data);  // time_scale
    649     READ_BITS_OR_RETURN(16, &data);  // time_scale
    650     READ_BOOL_OR_RETURN(&data);  // fixed_frame_rate_flag
    651   }
    652 
    653   // Read and ignore NAL HRD parameters, if present.
    654   bool hrd_parameters_present = false;
    655   Result res = ParseAndIgnoreHRDParameters(&hrd_parameters_present);
    656   if (res != kOk)
    657     return res;
    658 
    659   // Read and ignore VCL HRD parameters, if present.
    660   res = ParseAndIgnoreHRDParameters(&hrd_parameters_present);
    661   if (res != kOk)
    662     return res;
    663 
    664   if (hrd_parameters_present)  // One of NAL or VCL params present is enough.
    665     READ_BOOL_OR_RETURN(&data);  // low_delay_hrd_flag
    666 
    667   READ_BOOL_OR_RETURN(&data);  // pic_struct_present_flag
    668   READ_BOOL_OR_RETURN(&sps->bitstream_restriction_flag);
    669   if (sps->bitstream_restriction_flag) {
    670     READ_BOOL_OR_RETURN(&data);  // motion_vectors_over_pic_boundaries_flag
    671     READ_UE_OR_RETURN(&data);  // max_bytes_per_pic_denom
    672     READ_UE_OR_RETURN(&data);  // max_bits_per_mb_denom
    673     READ_UE_OR_RETURN(&data);  // log2_max_mv_length_horizontal
    674     READ_UE_OR_RETURN(&data);  // log2_max_mv_length_vertical
    675     READ_UE_OR_RETURN(&sps->max_num_reorder_frames);
    676     READ_UE_OR_RETURN(&sps->max_dec_frame_buffering);
    677     TRUE_OR_RETURN(sps->max_dec_frame_buffering >= sps->max_num_ref_frames);
    678     IN_RANGE_OR_RETURN(
    679         sps->max_num_reorder_frames, 0, sps->max_dec_frame_buffering);
    680   }
    681 
    682   return kOk;
    683 }
    684 
    685 static void FillDefaultSeqScalingLists(H264SPS* sps) {
    686   for (int i = 0; i < 6; ++i)
    687     for (int j = 0; j < kH264ScalingList4x4Length; ++j)
    688       sps->scaling_list4x4[i][j] = 16;
    689 
    690   for (int i = 0; i < 6; ++i)
    691     for (int j = 0; j < kH264ScalingList8x8Length; ++j)
    692       sps->scaling_list8x8[i][j] = 16;
    693 }
    694 
    695 H264Parser::Result H264Parser::ParseSPS(int* sps_id) {
    696   // See 7.4.2.1.
    697   int data;
    698   Result res;
    699 
    700   *sps_id = -1;
    701 
    702   scoped_ptr<H264SPS> sps(new H264SPS());
    703 
    704   READ_BITS_OR_RETURN(8, &sps->profile_idc);
    705   READ_BOOL_OR_RETURN(&sps->constraint_set0_flag);
    706   READ_BOOL_OR_RETURN(&sps->constraint_set1_flag);
    707   READ_BOOL_OR_RETURN(&sps->constraint_set2_flag);
    708   READ_BOOL_OR_RETURN(&sps->constraint_set3_flag);
    709   READ_BOOL_OR_RETURN(&sps->constraint_set4_flag);
    710   READ_BOOL_OR_RETURN(&sps->constraint_set5_flag);
    711   READ_BITS_OR_RETURN(2, &data);  // reserved_zero_2bits
    712   READ_BITS_OR_RETURN(8, &sps->level_idc);
    713   READ_UE_OR_RETURN(&sps->seq_parameter_set_id);
    714   TRUE_OR_RETURN(sps->seq_parameter_set_id < 32);
    715 
    716   if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
    717       sps->profile_idc == 122 || sps->profile_idc == 244 ||
    718       sps->profile_idc == 44 || sps->profile_idc == 83 ||
    719       sps->profile_idc == 86 || sps->profile_idc == 118 ||
    720       sps->profile_idc == 128) {
    721     READ_UE_OR_RETURN(&sps->chroma_format_idc);
    722     TRUE_OR_RETURN(sps->chroma_format_idc < 4);
    723 
    724     if (sps->chroma_format_idc == 3)
    725       READ_BOOL_OR_RETURN(&sps->separate_colour_plane_flag);
    726 
    727     READ_UE_OR_RETURN(&sps->bit_depth_luma_minus8);
    728     TRUE_OR_RETURN(sps->bit_depth_luma_minus8 < 7);
    729 
    730     READ_UE_OR_RETURN(&sps->bit_depth_chroma_minus8);
    731     TRUE_OR_RETURN(sps->bit_depth_chroma_minus8 < 7);
    732 
    733     READ_BOOL_OR_RETURN(&sps->qpprime_y_zero_transform_bypass_flag);
    734     READ_BOOL_OR_RETURN(&sps->seq_scaling_matrix_present_flag);
    735 
    736     if (sps->seq_scaling_matrix_present_flag) {
    737       DVLOG(4) << "Scaling matrix present";
    738       res = ParseSPSScalingLists(sps.get());
    739       if (res != kOk)
    740         return res;
    741     } else {
    742       FillDefaultSeqScalingLists(sps.get());
    743     }
    744   } else {
    745     sps->chroma_format_idc = 1;
    746     FillDefaultSeqScalingLists(sps.get());
    747   }
    748 
    749   if (sps->separate_colour_plane_flag)
    750     sps->chroma_array_type = 0;
    751   else
    752     sps->chroma_array_type = sps->chroma_format_idc;
    753 
    754   READ_UE_OR_RETURN(&sps->log2_max_frame_num_minus4);
    755   TRUE_OR_RETURN(sps->log2_max_frame_num_minus4 < 13);
    756 
    757   READ_UE_OR_RETURN(&sps->pic_order_cnt_type);
    758   TRUE_OR_RETURN(sps->pic_order_cnt_type < 3);
    759 
    760   sps->expected_delta_per_pic_order_cnt_cycle = 0;
    761   if (sps->pic_order_cnt_type == 0) {
    762     READ_UE_OR_RETURN(&sps->log2_max_pic_order_cnt_lsb_minus4);
    763     TRUE_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 < 13);
    764   } else if (sps->pic_order_cnt_type == 1) {
    765     READ_BOOL_OR_RETURN(&sps->delta_pic_order_always_zero_flag);
    766     READ_SE_OR_RETURN(&sps->offset_for_non_ref_pic);
    767     READ_SE_OR_RETURN(&sps->offset_for_top_to_bottom_field);
    768     READ_UE_OR_RETURN(&sps->num_ref_frames_in_pic_order_cnt_cycle);
    769     TRUE_OR_RETURN(sps->num_ref_frames_in_pic_order_cnt_cycle < 255);
    770 
    771     for (int i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) {
    772       READ_SE_OR_RETURN(&sps->offset_for_ref_frame[i]);
    773       sps->expected_delta_per_pic_order_cnt_cycle +=
    774           sps->offset_for_ref_frame[i];
    775     }
    776   }
    777 
    778   READ_UE_OR_RETURN(&sps->max_num_ref_frames);
    779   READ_BOOL_OR_RETURN(&sps->gaps_in_frame_num_value_allowed_flag);
    780 
    781   if (sps->gaps_in_frame_num_value_allowed_flag)
    782     return kUnsupportedStream;
    783 
    784   READ_UE_OR_RETURN(&sps->pic_width_in_mbs_minus1);
    785   READ_UE_OR_RETURN(&sps->pic_height_in_map_units_minus1);
    786 
    787   READ_BOOL_OR_RETURN(&sps->frame_mbs_only_flag);
    788   if (!sps->frame_mbs_only_flag)
    789     READ_BOOL_OR_RETURN(&sps->mb_adaptive_frame_field_flag);
    790 
    791   READ_BOOL_OR_RETURN(&sps->direct_8x8_inference_flag);
    792 
    793   READ_BOOL_OR_RETURN(&sps->frame_cropping_flag);
    794   if (sps->frame_cropping_flag) {
    795     READ_UE_OR_RETURN(&sps->frame_crop_left_offset);
    796     READ_UE_OR_RETURN(&sps->frame_crop_right_offset);
    797     READ_UE_OR_RETURN(&sps->frame_crop_top_offset);
    798     READ_UE_OR_RETURN(&sps->frame_crop_bottom_offset);
    799   }
    800 
    801   READ_BOOL_OR_RETURN(&sps->vui_parameters_present_flag);
    802   if (sps->vui_parameters_present_flag) {
    803     DVLOG(4) << "VUI parameters present";
    804     res = ParseVUIParameters(sps.get());
    805     if (res != kOk)
    806       return res;
    807   }
    808 
    809   // If an SPS with the same id already exists, replace it.
    810   *sps_id = sps->seq_parameter_set_id;
    811   delete active_SPSes_[*sps_id];
    812   active_SPSes_[*sps_id] = sps.release();
    813 
    814   return kOk;
    815 }
    816 
    817 H264Parser::Result H264Parser::ParsePPS(int* pps_id) {
    818   // See 7.4.2.2.
    819   const H264SPS* sps;
    820   Result res;
    821 
    822   *pps_id = -1;
    823 
    824   scoped_ptr<H264PPS> pps(new H264PPS());
    825 
    826   READ_UE_OR_RETURN(&pps->pic_parameter_set_id);
    827   READ_UE_OR_RETURN(&pps->seq_parameter_set_id);
    828   TRUE_OR_RETURN(pps->seq_parameter_set_id < 32);
    829 
    830   sps = GetSPS(pps->seq_parameter_set_id);
    831   TRUE_OR_RETURN(sps);
    832 
    833   READ_BOOL_OR_RETURN(&pps->entropy_coding_mode_flag);
    834   READ_BOOL_OR_RETURN(&pps->bottom_field_pic_order_in_frame_present_flag);
    835 
    836   READ_UE_OR_RETURN(&pps->num_slice_groups_minus1);
    837   if (pps->num_slice_groups_minus1 > 1) {
    838     DVLOG(1) << "Slice groups not supported";
    839     return kUnsupportedStream;
    840   }
    841 
    842   READ_UE_OR_RETURN(&pps->num_ref_idx_l0_default_active_minus1);
    843   TRUE_OR_RETURN(pps->num_ref_idx_l0_default_active_minus1 < 32);
    844 
    845   READ_UE_OR_RETURN(&pps->num_ref_idx_l1_default_active_minus1);
    846   TRUE_OR_RETURN(pps->num_ref_idx_l1_default_active_minus1 < 32);
    847 
    848   READ_BOOL_OR_RETURN(&pps->weighted_pred_flag);
    849   READ_BITS_OR_RETURN(2, &pps->weighted_bipred_idc);
    850   TRUE_OR_RETURN(pps->weighted_bipred_idc < 3);
    851 
    852   READ_SE_OR_RETURN(&pps->pic_init_qp_minus26);
    853   IN_RANGE_OR_RETURN(pps->pic_init_qp_minus26, -26, 25);
    854 
    855   READ_SE_OR_RETURN(&pps->pic_init_qs_minus26);
    856   IN_RANGE_OR_RETURN(pps->pic_init_qs_minus26, -26, 25);
    857 
    858   READ_SE_OR_RETURN(&pps->chroma_qp_index_offset);
    859   IN_RANGE_OR_RETURN(pps->chroma_qp_index_offset, -12, 12);
    860   pps->second_chroma_qp_index_offset = pps->chroma_qp_index_offset;
    861 
    862   READ_BOOL_OR_RETURN(&pps->deblocking_filter_control_present_flag);
    863   READ_BOOL_OR_RETURN(&pps->constrained_intra_pred_flag);
    864   READ_BOOL_OR_RETURN(&pps->redundant_pic_cnt_present_flag);
    865 
    866   if (br_.HasMoreRBSPData()) {
    867     READ_BOOL_OR_RETURN(&pps->transform_8x8_mode_flag);
    868     READ_BOOL_OR_RETURN(&pps->pic_scaling_matrix_present_flag);
    869 
    870     if (pps->pic_scaling_matrix_present_flag) {
    871       DVLOG(4) << "Picture scaling matrix present";
    872       res = ParsePPSScalingLists(*sps, pps.get());
    873       if (res != kOk)
    874         return res;
    875     }
    876 
    877     READ_SE_OR_RETURN(&pps->second_chroma_qp_index_offset);
    878   }
    879 
    880   // If a PPS with the same id already exists, replace it.
    881   *pps_id = pps->pic_parameter_set_id;
    882   delete active_PPSes_[*pps_id];
    883   active_PPSes_[*pps_id] = pps.release();
    884 
    885   return kOk;
    886 }
    887 
    888 H264Parser::Result H264Parser::ParseRefPicListModification(
    889     int num_ref_idx_active_minus1,
    890     H264ModificationOfPicNum* ref_list_mods) {
    891   H264ModificationOfPicNum* pic_num_mod;
    892 
    893   if (num_ref_idx_active_minus1 >= 32)
    894     return kInvalidStream;
    895 
    896   for (int i = 0; i < 32; ++i) {
    897     pic_num_mod = &ref_list_mods[i];
    898     READ_UE_OR_RETURN(&pic_num_mod->modification_of_pic_nums_idc);
    899     TRUE_OR_RETURN(pic_num_mod->modification_of_pic_nums_idc < 4);
    900 
    901     switch (pic_num_mod->modification_of_pic_nums_idc) {
    902       case 0:
    903       case 1:
    904         READ_UE_OR_RETURN(&pic_num_mod->abs_diff_pic_num_minus1);
    905         break;
    906 
    907       case 2:
    908         READ_UE_OR_RETURN(&pic_num_mod->long_term_pic_num);
    909         break;
    910 
    911       case 3:
    912         // Per spec, list cannot be empty.
    913         if (i == 0)
    914           return kInvalidStream;
    915         return kOk;
    916 
    917       default:
    918         return kInvalidStream;
    919     }
    920   }
    921 
    922   // If we got here, we didn't get loop end marker prematurely,
    923   // so make sure it is there for our client.
    924   int modification_of_pic_nums_idc;
    925   READ_UE_OR_RETURN(&modification_of_pic_nums_idc);
    926   TRUE_OR_RETURN(modification_of_pic_nums_idc == 3);
    927 
    928   return kOk;
    929 }
    930 
    931 H264Parser::Result H264Parser::ParseRefPicListModifications(
    932     H264SliceHeader* shdr) {
    933   Result res;
    934 
    935   if (!shdr->IsISlice() && !shdr->IsSISlice()) {
    936     READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l0);
    937     if (shdr->ref_pic_list_modification_flag_l0) {
    938       res = ParseRefPicListModification(shdr->num_ref_idx_l0_active_minus1,
    939                                         shdr->ref_list_l0_modifications);
    940       if (res != kOk)
    941         return res;
    942     }
    943   }
    944 
    945   if (shdr->IsBSlice()) {
    946     READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l1);
    947     if (shdr->ref_pic_list_modification_flag_l1) {
    948       res = ParseRefPicListModification(shdr->num_ref_idx_l1_active_minus1,
    949                                         shdr->ref_list_l1_modifications);
    950       if (res != kOk)
    951         return res;
    952     }
    953   }
    954 
    955   return kOk;
    956 }
    957 
    958 H264Parser::Result H264Parser::ParseWeightingFactors(
    959     int num_ref_idx_active_minus1,
    960     int chroma_array_type,
    961     int luma_log2_weight_denom,
    962     int chroma_log2_weight_denom,
    963     H264WeightingFactors* w_facts) {
    964 
    965   int def_luma_weight = 1 << luma_log2_weight_denom;
    966   int def_chroma_weight = 1 << chroma_log2_weight_denom;
    967 
    968   for (int i = 0; i < num_ref_idx_active_minus1 + 1; ++i) {
    969     READ_BOOL_OR_RETURN(&w_facts->luma_weight_flag);
    970     if (w_facts->luma_weight_flag) {
    971       READ_SE_OR_RETURN(&w_facts->luma_weight[i]);
    972       IN_RANGE_OR_RETURN(w_facts->luma_weight[i], -128, 127);
    973 
    974       READ_SE_OR_RETURN(&w_facts->luma_offset[i]);
    975       IN_RANGE_OR_RETURN(w_facts->luma_offset[i], -128, 127);
    976     } else {
    977       w_facts->luma_weight[i] = def_luma_weight;
    978       w_facts->luma_offset[i] = 0;
    979     }
    980 
    981     if (chroma_array_type != 0) {
    982       READ_BOOL_OR_RETURN(&w_facts->chroma_weight_flag);
    983       if (w_facts->chroma_weight_flag) {
    984         for (int j = 0; j < 2; ++j) {
    985           READ_SE_OR_RETURN(&w_facts->chroma_weight[i][j]);
    986           IN_RANGE_OR_RETURN(w_facts->chroma_weight[i][j], -128, 127);
    987 
    988           READ_SE_OR_RETURN(&w_facts->chroma_offset[i][j]);
    989           IN_RANGE_OR_RETURN(w_facts->chroma_offset[i][j], -128, 127);
    990         }
    991       } else {
    992         for (int j = 0; j < 2; ++j) {
    993           w_facts->chroma_weight[i][j] = def_chroma_weight;
    994           w_facts->chroma_offset[i][j] = 0;
    995         }
    996       }
    997     }
    998   }
    999 
   1000   return kOk;
   1001 }
   1002 
   1003 H264Parser::Result H264Parser::ParsePredWeightTable(const H264SPS& sps,
   1004                                                     H264SliceHeader* shdr) {
   1005   READ_UE_OR_RETURN(&shdr->luma_log2_weight_denom);
   1006   TRUE_OR_RETURN(shdr->luma_log2_weight_denom < 8);
   1007 
   1008   if (sps.chroma_array_type != 0)
   1009     READ_UE_OR_RETURN(&shdr->chroma_log2_weight_denom);
   1010   TRUE_OR_RETURN(shdr->chroma_log2_weight_denom < 8);
   1011 
   1012   Result res = ParseWeightingFactors(shdr->num_ref_idx_l0_active_minus1,
   1013                                      sps.chroma_array_type,
   1014                                      shdr->luma_log2_weight_denom,
   1015                                      shdr->chroma_log2_weight_denom,
   1016                                      &shdr->pred_weight_table_l0);
   1017   if (res != kOk)
   1018     return res;
   1019 
   1020   if (shdr->IsBSlice()) {
   1021     res = ParseWeightingFactors(shdr->num_ref_idx_l1_active_minus1,
   1022                                 sps.chroma_array_type,
   1023                                 shdr->luma_log2_weight_denom,
   1024                                 shdr->chroma_log2_weight_denom,
   1025                                 &shdr->pred_weight_table_l1);
   1026     if (res != kOk)
   1027       return res;
   1028   }
   1029 
   1030   return kOk;
   1031 }
   1032 
   1033 H264Parser::Result H264Parser::ParseDecRefPicMarking(H264SliceHeader* shdr) {
   1034   if (shdr->idr_pic_flag) {
   1035     READ_BOOL_OR_RETURN(&shdr->no_output_of_prior_pics_flag);
   1036     READ_BOOL_OR_RETURN(&shdr->long_term_reference_flag);
   1037   } else {
   1038     READ_BOOL_OR_RETURN(&shdr->adaptive_ref_pic_marking_mode_flag);
   1039 
   1040     H264DecRefPicMarking* marking;
   1041     if (shdr->adaptive_ref_pic_marking_mode_flag) {
   1042       size_t i;
   1043       for (i = 0; i < arraysize(shdr->ref_pic_marking); ++i) {
   1044         marking = &shdr->ref_pic_marking[i];
   1045 
   1046         READ_UE_OR_RETURN(&marking->memory_mgmnt_control_operation);
   1047         if (marking->memory_mgmnt_control_operation == 0)
   1048           break;
   1049 
   1050         if (marking->memory_mgmnt_control_operation == 1 ||
   1051             marking->memory_mgmnt_control_operation == 3)
   1052           READ_UE_OR_RETURN(&marking->difference_of_pic_nums_minus1);
   1053 
   1054         if (marking->memory_mgmnt_control_operation == 2)
   1055           READ_UE_OR_RETURN(&marking->long_term_pic_num);
   1056 
   1057         if (marking->memory_mgmnt_control_operation == 3 ||
   1058             marking->memory_mgmnt_control_operation == 6)
   1059           READ_UE_OR_RETURN(&marking->long_term_frame_idx);
   1060 
   1061         if (marking->memory_mgmnt_control_operation == 4)
   1062           READ_UE_OR_RETURN(&marking->max_long_term_frame_idx_plus1);
   1063 
   1064         if (marking->memory_mgmnt_control_operation > 6)
   1065           return kInvalidStream;
   1066       }
   1067 
   1068       if (i == arraysize(shdr->ref_pic_marking)) {
   1069         DVLOG(1) << "Ran out of dec ref pic marking fields";
   1070         return kUnsupportedStream;
   1071       }
   1072     }
   1073   }
   1074 
   1075   return kOk;
   1076 }
   1077 
   1078 H264Parser::Result H264Parser::ParseSliceHeader(const H264NALU& nalu,
   1079                                                 H264SliceHeader* shdr) {
   1080   // See 7.4.3.
   1081   const H264SPS* sps;
   1082   const H264PPS* pps;
   1083   Result res;
   1084 
   1085   memset(shdr, 0, sizeof(*shdr));
   1086 
   1087   shdr->idr_pic_flag = (nalu.nal_unit_type == 5);
   1088   shdr->nal_ref_idc = nalu.nal_ref_idc;
   1089   shdr->nalu_data = nalu.data;
   1090   shdr->nalu_size = nalu.size;
   1091 
   1092   READ_UE_OR_RETURN(&shdr->first_mb_in_slice);
   1093   READ_UE_OR_RETURN(&shdr->slice_type);
   1094   TRUE_OR_RETURN(shdr->slice_type < 10);
   1095 
   1096   READ_UE_OR_RETURN(&shdr->pic_parameter_set_id);
   1097 
   1098   pps = GetPPS(shdr->pic_parameter_set_id);
   1099   TRUE_OR_RETURN(pps);
   1100 
   1101   sps = GetSPS(pps->seq_parameter_set_id);
   1102   TRUE_OR_RETURN(sps);
   1103 
   1104   if (sps->separate_colour_plane_flag) {
   1105     DVLOG(1) << "Interlaced streams not supported";
   1106     return kUnsupportedStream;
   1107   }
   1108 
   1109   READ_BITS_OR_RETURN(sps->log2_max_frame_num_minus4 + 4, &shdr->frame_num);
   1110   if (!sps->frame_mbs_only_flag) {
   1111     READ_BOOL_OR_RETURN(&shdr->field_pic_flag);
   1112     if (shdr->field_pic_flag) {
   1113       DVLOG(1) << "Interlaced streams not supported";
   1114       return kUnsupportedStream;
   1115     }
   1116   }
   1117 
   1118   if (shdr->idr_pic_flag)
   1119     READ_UE_OR_RETURN(&shdr->idr_pic_id);
   1120 
   1121   if (sps->pic_order_cnt_type == 0) {
   1122     READ_BITS_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
   1123                         &shdr->pic_order_cnt_lsb);
   1124     if (pps->bottom_field_pic_order_in_frame_present_flag &&
   1125         !shdr->field_pic_flag)
   1126       READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt_bottom);
   1127   }
   1128 
   1129   if (sps->pic_order_cnt_type == 1 && !sps->delta_pic_order_always_zero_flag) {
   1130     READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[0]);
   1131     if (pps->bottom_field_pic_order_in_frame_present_flag &&
   1132         !shdr->field_pic_flag)
   1133       READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[1]);
   1134   }
   1135 
   1136   if (pps->redundant_pic_cnt_present_flag) {
   1137     READ_UE_OR_RETURN(&shdr->redundant_pic_cnt);
   1138     TRUE_OR_RETURN(shdr->redundant_pic_cnt < 128);
   1139   }
   1140 
   1141   if (shdr->IsBSlice())
   1142     READ_BOOL_OR_RETURN(&shdr->direct_spatial_mv_pred_flag);
   1143 
   1144   if (shdr->IsPSlice() || shdr->IsSPSlice() || shdr->IsBSlice()) {
   1145     READ_BOOL_OR_RETURN(&shdr->num_ref_idx_active_override_flag);
   1146     if (shdr->num_ref_idx_active_override_flag) {
   1147       READ_UE_OR_RETURN(&shdr->num_ref_idx_l0_active_minus1);
   1148       if (shdr->IsBSlice())
   1149         READ_UE_OR_RETURN(&shdr->num_ref_idx_l1_active_minus1);
   1150     } else {
   1151       shdr->num_ref_idx_l0_active_minus1 =
   1152           pps->num_ref_idx_l0_default_active_minus1;
   1153       if (shdr->IsBSlice()) {
   1154         shdr->num_ref_idx_l1_active_minus1 =
   1155             pps->num_ref_idx_l1_default_active_minus1;
   1156       }
   1157     }
   1158   }
   1159   if (shdr->field_pic_flag) {
   1160     TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 32);
   1161     TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 32);
   1162   } else {
   1163     TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 16);
   1164     TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 16);
   1165   }
   1166 
   1167   if (nalu.nal_unit_type == H264NALU::kCodedSliceExtension) {
   1168     return kUnsupportedStream;
   1169   } else {
   1170     res = ParseRefPicListModifications(shdr);
   1171     if (res != kOk)
   1172       return res;
   1173   }
   1174 
   1175   if ((pps->weighted_pred_flag && (shdr->IsPSlice() || shdr->IsSPSlice())) ||
   1176       (pps->weighted_bipred_idc == 1 && shdr->IsBSlice())) {
   1177     res = ParsePredWeightTable(*sps, shdr);
   1178     if (res != kOk)
   1179       return res;
   1180   }
   1181 
   1182   if (nalu.nal_ref_idc != 0) {
   1183     res = ParseDecRefPicMarking(shdr);
   1184     if (res != kOk)
   1185       return res;
   1186   }
   1187 
   1188   if (pps->entropy_coding_mode_flag && !shdr->IsISlice() &&
   1189       !shdr->IsSISlice()) {
   1190     READ_UE_OR_RETURN(&shdr->cabac_init_idc);
   1191     TRUE_OR_RETURN(shdr->cabac_init_idc < 3);
   1192   }
   1193 
   1194   READ_SE_OR_RETURN(&shdr->slice_qp_delta);
   1195 
   1196   if (shdr->IsSPSlice() || shdr->IsSISlice()) {
   1197     if (shdr->IsSPSlice())
   1198       READ_BOOL_OR_RETURN(&shdr->sp_for_switch_flag);
   1199     READ_SE_OR_RETURN(&shdr->slice_qs_delta);
   1200   }
   1201 
   1202   if (pps->deblocking_filter_control_present_flag) {
   1203     READ_UE_OR_RETURN(&shdr->disable_deblocking_filter_idc);
   1204     TRUE_OR_RETURN(shdr->disable_deblocking_filter_idc < 3);
   1205 
   1206     if (shdr->disable_deblocking_filter_idc != 1) {
   1207       READ_SE_OR_RETURN(&shdr->slice_alpha_c0_offset_div2);
   1208       IN_RANGE_OR_RETURN(shdr->slice_alpha_c0_offset_div2, -6, 6);
   1209 
   1210       READ_SE_OR_RETURN(&shdr->slice_beta_offset_div2);
   1211       IN_RANGE_OR_RETURN(shdr->slice_beta_offset_div2, -6, 6);
   1212     }
   1213   }
   1214 
   1215   if (pps->num_slice_groups_minus1 > 0) {
   1216     DVLOG(1) << "Slice groups not supported";
   1217     return kUnsupportedStream;
   1218   }
   1219 
   1220   size_t epb = br_.NumEmulationPreventionBytesRead();
   1221   shdr->header_bit_size = (shdr->nalu_size - epb) * 8 - br_.NumBitsLeft();
   1222 
   1223   return kOk;
   1224 }
   1225 
   1226 H264Parser::Result H264Parser::ParseSEI(H264SEIMessage* sei_msg) {
   1227   int byte;
   1228 
   1229   memset(sei_msg, 0, sizeof(*sei_msg));
   1230 
   1231   READ_BITS_OR_RETURN(8, &byte);
   1232   while (byte == 0xff) {
   1233     sei_msg->type += 255;
   1234     READ_BITS_OR_RETURN(8, &byte);
   1235   }
   1236   sei_msg->type += byte;
   1237 
   1238   READ_BITS_OR_RETURN(8, &byte);
   1239   while (byte == 0xff) {
   1240     sei_msg->payload_size += 255;
   1241     READ_BITS_OR_RETURN(8, &byte);
   1242   }
   1243   sei_msg->payload_size += byte;
   1244 
   1245   DVLOG(4) << "Found SEI message type: " << sei_msg->type
   1246            << " payload size: " << sei_msg->payload_size;
   1247 
   1248   switch (sei_msg->type) {
   1249     case H264SEIMessage::kSEIRecoveryPoint:
   1250       READ_UE_OR_RETURN(&sei_msg->recovery_point.recovery_frame_cnt);
   1251       READ_BOOL_OR_RETURN(&sei_msg->recovery_point.exact_match_flag);
   1252       READ_BOOL_OR_RETURN(&sei_msg->recovery_point.broken_link_flag);
   1253       READ_BITS_OR_RETURN(2, &sei_msg->recovery_point.changing_slice_group_idc);
   1254       break;
   1255 
   1256     default:
   1257       DVLOG(4) << "Unsupported SEI message";
   1258       break;
   1259   }
   1260 
   1261   return kOk;
   1262 }
   1263 
   1264 }  // namespace media
   1265