Home | History | Annotate | Download | only in vda
      1 // Copyright 2015 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 // This file contains an implementation of a VP8 raw stream parser,
      6 // as defined in RFC 6386.
      7 // Note: ported from Chromium commit head: 2de6929
      8 
      9 
     10 #include "base/logging.h"
     11 #include "vp8_parser.h"
     12 
     13 namespace media {
     14 
     15 #define ERROR_RETURN(what)                           \
     16   do {                                               \
     17     DVLOG(1) << "Error while trying to read " #what; \
     18     return false;                                    \
     19   } while (0)
     20 
     21 #define BD_READ_BOOL_OR_RETURN(out) \
     22   do {                              \
     23     if (!bd_.ReadBool(out))         \
     24       ERROR_RETURN(out);            \
     25   } while (0)
     26 
     27 #define BD_READ_BOOL_WITH_PROB_OR_RETURN(out, prob) \
     28   do {                                              \
     29     if (!bd_.ReadBool(out, prob))                   \
     30       ERROR_RETURN(out);                            \
     31   } while (0)
     32 
     33 #define BD_READ_UNSIGNED_OR_RETURN(num_bits, out) \
     34   do {                                            \
     35     int _out;                                     \
     36     if (!bd_.ReadLiteral(num_bits, &_out))        \
     37       ERROR_RETURN(out);                          \
     38     *out = _out;                                  \
     39   } while (0)
     40 
     41 #define BD_READ_SIGNED_OR_RETURN(num_bits, out)    \
     42   do {                                             \
     43     int _out;                                      \
     44     if (!bd_.ReadLiteralWithSign(num_bits, &_out)) \
     45       ERROR_RETURN(out);                           \
     46     *out = _out;                                   \
     47   } while (0)
     48 
     49 Vp8FrameHeader::Vp8FrameHeader() {
     50   memset(this, 0, sizeof(*this));
     51 }
     52 
     53 Vp8Parser::Vp8Parser() : stream_(nullptr), bytes_left_(0) {
     54 }
     55 
     56 Vp8Parser::~Vp8Parser() = default;
     57 
     58 bool Vp8Parser::ParseFrame(const uint8_t* ptr,
     59                            size_t frame_size,
     60                            Vp8FrameHeader* fhdr) {
     61   stream_ = ptr;
     62   bytes_left_ = frame_size;
     63 
     64   memset(fhdr, 0, sizeof(*fhdr));
     65   fhdr->data = stream_;
     66   fhdr->frame_size = bytes_left_;
     67 
     68   if (!ParseFrameTag(fhdr))
     69     return false;
     70 
     71   fhdr->first_part_offset = stream_ - fhdr->data;
     72 
     73   if (!ParseFrameHeader(fhdr))
     74     return false;
     75 
     76   if (!ParsePartitions(fhdr))
     77     return false;
     78 
     79   DVLOG(4) << "Frame parsed, start: " << static_cast<const void*>(ptr)
     80            << ", size: " << frame_size
     81            << ", offsets: to first_part=" << fhdr->first_part_offset
     82            << ", to macroblock data (in bits)=" << fhdr->macroblock_bit_offset;
     83 
     84   return true;
     85 }
     86 
     87 static inline uint32_t GetBitsAt(uint32_t data, size_t shift, size_t num_bits) {
     88   return ((data >> shift) & ((1 << num_bits) - 1));
     89 }
     90 
     91 bool Vp8Parser::ParseFrameTag(Vp8FrameHeader* fhdr) {
     92   const size_t kFrameTagSize = 3;
     93   if (bytes_left_ < kFrameTagSize)
     94     return false;
     95 
     96   uint32_t frame_tag = (stream_[2] << 16) | (stream_[1] << 8) | stream_[0];
     97   fhdr->key_frame =
     98       static_cast<Vp8FrameHeader::FrameType>(GetBitsAt(frame_tag, 0, 1));
     99   fhdr->version = GetBitsAt(frame_tag, 1, 2);
    100   fhdr->is_experimental = !!GetBitsAt(frame_tag, 3, 1);
    101   fhdr->show_frame =!!GetBitsAt(frame_tag, 4, 1);
    102   fhdr->first_part_size = GetBitsAt(frame_tag, 5, 19);
    103 
    104   stream_ += kFrameTagSize;
    105   bytes_left_ -= kFrameTagSize;
    106 
    107   if (fhdr->IsKeyframe()) {
    108     const size_t kKeyframeTagSize = 7;
    109     if (bytes_left_ < kKeyframeTagSize)
    110       return false;
    111 
    112     static const uint8_t kVp8StartCode[] = {0x9d, 0x01, 0x2a};
    113     if (memcmp(stream_, kVp8StartCode, sizeof(kVp8StartCode)) != 0)
    114         return false;
    115 
    116     stream_ += sizeof(kVp8StartCode);
    117     bytes_left_ -= sizeof(kVp8StartCode);
    118 
    119     uint16_t data = (stream_[1] << 8) | stream_[0];
    120     fhdr->width = data & 0x3fff;
    121     fhdr->horizontal_scale = data >> 14;
    122 
    123     data = (stream_[3] << 8) | stream_[2];
    124     fhdr->height = data & 0x3fff;
    125     fhdr->vertical_scale = data >> 14;
    126 
    127     stream_ += 4;
    128     bytes_left_ -= 4;
    129   }
    130 
    131   return true;
    132 }
    133 
    134 bool Vp8Parser::ParseFrameHeader(Vp8FrameHeader* fhdr) {
    135   if (!bd_.Initialize(stream_, bytes_left_))
    136     return false;
    137 
    138   bool keyframe = fhdr->IsKeyframe();
    139   if (keyframe) {
    140     unsigned int data;
    141     BD_READ_UNSIGNED_OR_RETURN(1, &data);  // color_space
    142     BD_READ_UNSIGNED_OR_RETURN(1, &data);  // clamping_type
    143   }
    144 
    145   if (!ParseSegmentationHeader(keyframe))
    146     return false;
    147 
    148   fhdr->segmentation_hdr = curr_segmentation_hdr_;
    149 
    150   if (!ParseLoopFilterHeader(keyframe))
    151     return false;
    152 
    153   fhdr->loopfilter_hdr = curr_loopfilter_hdr_;
    154 
    155   int log2_nbr_of_dct_partitions;
    156   BD_READ_UNSIGNED_OR_RETURN(2, &log2_nbr_of_dct_partitions);
    157   fhdr->num_of_dct_partitions = static_cast<size_t>(1)
    158                                 << log2_nbr_of_dct_partitions;
    159 
    160   if (!ParseQuantizationHeader(&fhdr->quantization_hdr))
    161     return false;
    162 
    163   if (keyframe) {
    164     BD_READ_BOOL_OR_RETURN(&fhdr->refresh_entropy_probs);
    165   } else {
    166     BD_READ_BOOL_OR_RETURN(&fhdr->refresh_golden_frame);
    167     BD_READ_BOOL_OR_RETURN(&fhdr->refresh_alternate_frame);
    168 
    169     int refresh_mode;
    170     if (!fhdr->refresh_golden_frame) {
    171       BD_READ_UNSIGNED_OR_RETURN(2, &refresh_mode);
    172       fhdr->copy_buffer_to_golden =
    173           static_cast<Vp8FrameHeader::GoldenRefreshMode>(refresh_mode);
    174     }
    175 
    176     if (!fhdr->refresh_alternate_frame) {
    177       BD_READ_UNSIGNED_OR_RETURN(2, &refresh_mode);
    178       fhdr->copy_buffer_to_alternate =
    179           static_cast<Vp8FrameHeader::AltRefreshMode>(refresh_mode);
    180     }
    181 
    182     BD_READ_UNSIGNED_OR_RETURN(1, &fhdr->sign_bias_golden);
    183     BD_READ_UNSIGNED_OR_RETURN(1, &fhdr->sign_bias_alternate);
    184     BD_READ_BOOL_OR_RETURN(&fhdr->refresh_entropy_probs);
    185     BD_READ_BOOL_OR_RETURN(&fhdr->refresh_last);
    186   }
    187 
    188   if (keyframe)
    189     ResetProbs();
    190 
    191   fhdr->entropy_hdr = curr_entropy_hdr_;
    192 
    193   if (!ParseTokenProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
    194     return false;
    195 
    196   BD_READ_BOOL_OR_RETURN(&fhdr->mb_no_skip_coeff);
    197   if (fhdr->mb_no_skip_coeff)
    198     BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_skip_false);
    199 
    200   if (!keyframe) {
    201     BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_intra);
    202     BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_last);
    203     BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_gf);
    204   }
    205 
    206   if (!ParseIntraProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs,
    207                        keyframe))
    208     return false;
    209 
    210   if (!keyframe) {
    211     if (!ParseMVProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
    212       return false;
    213   }
    214 
    215   fhdr->macroblock_bit_offset = bd_.BitOffset();
    216   fhdr->bool_dec_range = bd_.GetRange();
    217   fhdr->bool_dec_value = bd_.GetBottom();
    218   fhdr->bool_dec_count = 7 - (bd_.BitOffset() + 7) % 8;
    219 
    220   return true;
    221 }
    222 
    223 bool Vp8Parser::ParseSegmentationHeader(bool keyframe) {
    224   Vp8SegmentationHeader* shdr = &curr_segmentation_hdr_;
    225 
    226   if (keyframe)
    227     memset(shdr, 0, sizeof(*shdr));
    228 
    229   BD_READ_BOOL_OR_RETURN(&shdr->segmentation_enabled);
    230   if (!shdr->segmentation_enabled)
    231     return true;
    232 
    233   BD_READ_BOOL_OR_RETURN(&shdr->update_mb_segmentation_map);
    234   BD_READ_BOOL_OR_RETURN(&shdr->update_segment_feature_data);
    235   if (shdr->update_segment_feature_data) {
    236     int mode;
    237     BD_READ_UNSIGNED_OR_RETURN(1, &mode);
    238     shdr->segment_feature_mode =
    239         static_cast<Vp8SegmentationHeader::SegmentFeatureMode>(mode);
    240 
    241     for (size_t i = 0; i < kMaxMBSegments; ++i) {
    242       bool quantizer_update;
    243       BD_READ_BOOL_OR_RETURN(&quantizer_update);
    244       if (quantizer_update)
    245         BD_READ_SIGNED_OR_RETURN(7, &shdr->quantizer_update_value[i]);
    246       else
    247         shdr->quantizer_update_value[i] = 0;
    248     }
    249 
    250     for (size_t i = 0; i < kMaxMBSegments; ++i) {
    251       bool loop_filter_update;
    252       BD_READ_BOOL_OR_RETURN(&loop_filter_update);
    253       if (loop_filter_update)
    254         BD_READ_SIGNED_OR_RETURN(6, &shdr->lf_update_value[i]);
    255       else
    256         shdr->lf_update_value[i] = 0;
    257     }
    258   }
    259 
    260   if (shdr->update_mb_segmentation_map) {
    261     for (size_t i = 0; i < kNumMBFeatureTreeProbs; ++i) {
    262       bool segment_prob_update;
    263       BD_READ_BOOL_OR_RETURN(&segment_prob_update);
    264       if (segment_prob_update)
    265         BD_READ_UNSIGNED_OR_RETURN(8, &shdr->segment_prob[i]);
    266       else
    267         shdr->segment_prob[i] = Vp8SegmentationHeader::kDefaultSegmentProb;
    268     }
    269   }
    270 
    271   return true;
    272 }
    273 
    274 bool Vp8Parser::ParseLoopFilterHeader(bool keyframe) {
    275   Vp8LoopFilterHeader* lfhdr = &curr_loopfilter_hdr_;
    276 
    277   if (keyframe)
    278     memset(lfhdr, 0, sizeof(*lfhdr));
    279 
    280   int type;
    281   BD_READ_UNSIGNED_OR_RETURN(1, &type);
    282   lfhdr->type = static_cast<Vp8LoopFilterHeader::Type>(type);
    283   BD_READ_UNSIGNED_OR_RETURN(6, &lfhdr->level);
    284   BD_READ_UNSIGNED_OR_RETURN(3, &lfhdr->sharpness_level);
    285   BD_READ_BOOL_OR_RETURN(&lfhdr->loop_filter_adj_enable);
    286 
    287   if (lfhdr->loop_filter_adj_enable) {
    288     BD_READ_BOOL_OR_RETURN(&lfhdr->mode_ref_lf_delta_update);
    289     if (lfhdr->mode_ref_lf_delta_update) {
    290       for (size_t i = 0; i < kNumBlockContexts; ++i) {
    291         bool ref_frame_delta_update_flag;
    292         BD_READ_BOOL_OR_RETURN(&ref_frame_delta_update_flag);
    293         if (ref_frame_delta_update_flag)
    294           BD_READ_SIGNED_OR_RETURN(6, &lfhdr->ref_frame_delta[i]);
    295       }
    296 
    297       for (size_t i = 0; i < kNumBlockContexts; ++i) {
    298         bool mb_mode_delta_update_flag;
    299         BD_READ_BOOL_OR_RETURN(&mb_mode_delta_update_flag);
    300         if (mb_mode_delta_update_flag)
    301           BD_READ_SIGNED_OR_RETURN(6, &lfhdr->mb_mode_delta[i]);
    302       }
    303     }
    304   }
    305 
    306   return true;
    307 }
    308 
    309 bool Vp8Parser::ParseQuantizationHeader(Vp8QuantizationHeader* qhdr) {
    310   // If any of the delta values is not present, the delta should be zero.
    311   memset(qhdr, 0, sizeof(*qhdr));
    312 
    313   BD_READ_UNSIGNED_OR_RETURN(7, &qhdr->y_ac_qi);
    314 
    315   bool delta_present;
    316 
    317   BD_READ_BOOL_OR_RETURN(&delta_present);
    318   if (delta_present)
    319     BD_READ_SIGNED_OR_RETURN(4, &qhdr->y_dc_delta);
    320 
    321   BD_READ_BOOL_OR_RETURN(&delta_present);
    322   if (delta_present)
    323     BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_dc_delta);
    324 
    325   BD_READ_BOOL_OR_RETURN(&delta_present);
    326   if (delta_present)
    327     BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_ac_delta);
    328 
    329   BD_READ_BOOL_OR_RETURN(&delta_present);
    330   if (delta_present)
    331     BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_dc_delta);
    332 
    333   BD_READ_BOOL_OR_RETURN(&delta_present);
    334   if (delta_present)
    335     BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_ac_delta);
    336 
    337   return true;
    338 }
    339 
    340 // See spec for details on these values.
    341 const uint8_t kCoeffUpdateProbs[kNumBlockTypes][kNumCoeffBands]
    342     [kNumPrevCoeffContexts][kNumEntropyNodes] = {
    343   {
    344     {
    345       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    346       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    347       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    348     },
    349     {
    350       {176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    351       {223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255},
    352       {249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    353     },
    354     {
    355       {255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255},
    356       {234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    357       {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    358     },
    359     {
    360       {255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    361       {239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    362       {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    363     },
    364     {
    365       {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    366       {251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    367       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    368     },
    369     {
    370       {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    371       {251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    372       {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    373     },
    374     {
    375       {255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255},
    376       {250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255},
    377       {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    378     },
    379     {
    380       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    381       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    382       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    383     },
    384   },
    385   {
    386     {
    387       {217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    388       {225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255},
    389       {234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255},
    390     },
    391     {
    392       {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    393       {223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    394       {238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255},
    395     },
    396     {
    397       {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    398       {249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    399       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    400     },
    401     {
    402       {255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    403       {247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    404       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    405     },
    406     {
    407       {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    408       {252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    409       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    410     },
    411     {
    412       {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    413       {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    414       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    415     },
    416     {
    417       {255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    418       {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    419       {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    420     },
    421     {
    422       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    423       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    424       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    425     },
    426   },
    427   {
    428     {
    429       {186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255},
    430       {234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255},
    431       {251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255},
    432     },
    433     {
    434       {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    435       {236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    436       {251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255},
    437     },
    438     {
    439       {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    440       {254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    441       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    442     },
    443     {
    444       {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    445       {254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    446       {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    447     },
    448     {
    449       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    450       {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    451       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    452     },
    453     {
    454       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    455       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    456       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    457     },
    458     {
    459       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    460       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    461       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    462     },
    463     {
    464       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    465       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    466       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    467     },
    468   },
    469   {
    470     {
    471       {248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    472       {250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255},
    473       {248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255},
    474     },
    475     {
    476       {255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    477       {246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    478       {252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255},
    479     },
    480     {
    481       {255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255},
    482       {248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    483       {253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255},
    484     },
    485     {
    486       {255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    487       {245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    488       {253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    489     },
    490     {
    491       {255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    492       {252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    493       {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    494     },
    495     {
    496       {255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    497       {249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    498       {255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
    499     },
    500     {
    501       {255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255},
    502       {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    503       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    504     },
    505     {
    506       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    507       {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    508       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    509     },
    510   },
    511 };
    512 
    513 const uint8_t kKeyframeYModeProbs[kNumYModeProbs] = {145, 156, 163, 128};
    514 const uint8_t kKeyframeUVModeProbs[kNumUVModeProbs] = {142, 114, 183};
    515 
    516 const uint8_t kDefaultYModeProbs[kNumYModeProbs] = {112, 86, 140, 37};
    517 const uint8_t kDefaultUVModeProbs[kNumUVModeProbs] = {162, 101, 204};
    518 
    519 const uint8_t kDefaultCoeffProbs[kNumBlockTypes][kNumCoeffBands]
    520     [kNumPrevCoeffContexts][kNumEntropyNodes] = {
    521   {
    522     {
    523       {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    524       {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    525       {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    526     },
    527     {
    528       {253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128},
    529       {189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128},
    530       {106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128},
    531     },
    532     {
    533       {  1,  98, 248, 255, 236, 226, 255, 255, 128, 128, 128},
    534       {181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128},
    535       { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128},
    536     },
    537     {
    538       {  1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128},
    539       {184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128},
    540       { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128},
    541     },
    542     {
    543       {  1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128},
    544       {170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128},
    545       { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128},
    546     },
    547     {
    548       {  1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128},
    549       {207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128},
    550       {102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128},
    551     },
    552     {
    553       {  1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128},
    554       {177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128},
    555       { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128},
    556     },
    557     {
    558       {  1,   1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    559       {246,   1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    560       {255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    561     }
    562   },
    563   {
    564     {
    565       {198,  35, 237, 223, 193, 187, 162, 160, 145, 155,  62},
    566       {131,  45, 198, 221, 172, 176, 220, 157, 252, 221,   1},
    567       { 68,  47, 146, 208, 149, 167, 221, 162, 255, 223, 128},
    568     },
    569     {
    570       {  1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128},
    571       {184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128},
    572       { 81,  99, 181, 242, 176, 190, 249, 202, 255, 255, 128},
    573     },
    574     {
    575       {  1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128},
    576       { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128},
    577       { 23,  91, 163, 242, 170, 187, 247, 210, 255, 255, 128},
    578     },
    579     {
    580       {  1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128},
    581       {109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128},
    582       { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128},
    583     },
    584     {
    585       {  1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128},
    586       { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128},
    587       { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128},
    588     },
    589     {
    590       {  1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128},
    591       {124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128},
    592       { 35,  77, 181, 251, 193, 211, 255, 205, 128, 128, 128},
    593     },
    594     {
    595       {  1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128},
    596       {121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128},
    597       { 45,  99, 188, 251, 195, 217, 255, 224, 128, 128, 128},
    598     },
    599     {
    600       {  1,   1, 251, 255, 213, 255, 128, 128, 128, 128, 128},
    601       {203,   1, 248, 255, 255, 128, 128, 128, 128, 128, 128},
    602       {137,   1, 177, 255, 224, 255, 128, 128, 128, 128, 128},
    603     }
    604   },
    605   {
    606     {
    607       {253,   9, 248, 251, 207, 208, 255, 192, 128, 128, 128},
    608       {175,  13, 224, 243, 193, 185, 249, 198, 255, 255, 128},
    609       { 73,  17, 171, 221, 161, 179, 236, 167, 255, 234, 128},
    610     },
    611     {
    612       {  1,  95, 247, 253, 212, 183, 255, 255, 128, 128, 128},
    613       {239,  90, 244, 250, 211, 209, 255, 255, 128, 128, 128},
    614       {155,  77, 195, 248, 188, 195, 255, 255, 128, 128, 128},
    615     },
    616     {
    617       {  1,  24, 239, 251, 218, 219, 255, 205, 128, 128, 128},
    618       {201,  51, 219, 255, 196, 186, 128, 128, 128, 128, 128},
    619       { 69,  46, 190, 239, 201, 218, 255, 228, 128, 128, 128},
    620     },
    621     {
    622       {  1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128},
    623       {223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128},
    624       {141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128},
    625     },
    626     {
    627       {  1,  16, 248, 255, 255, 128, 128, 128, 128, 128, 128},
    628       {190,  36, 230, 255, 236, 255, 128, 128, 128, 128, 128},
    629       {149,   1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    630     },
    631     {
    632       {  1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    633       {247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    634       {240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    635     },
    636     {
    637       {  1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128},
    638       {213,  62, 250, 255, 255, 128, 128, 128, 128, 128, 128},
    639       { 55,  93, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    640     },
    641     {
    642       {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    643       {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    644       {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
    645     }
    646   },
    647   {
    648     {
    649       {202,  24, 213, 235, 186, 191, 220, 160, 240, 175, 255},
    650       {126,  38, 182, 232, 169, 184, 228, 174, 255, 187, 128},
    651       { 61,  46, 138, 219, 151, 178, 240, 170, 255, 216, 128},
    652     },
    653     {
    654       {  1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128},
    655       {166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128},
    656       { 39,  77, 162, 232, 172, 180, 245, 178, 255, 255, 128},
    657     },
    658     {
    659       {  1,  52, 220, 246, 198, 199, 249, 220, 255, 255, 128},
    660       {124,  74, 191, 243, 183, 193, 250, 221, 255, 255, 128},
    661       { 24,  71, 130, 219, 154, 170, 243, 182, 255, 255, 128},
    662     },
    663     {
    664       {  1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128},
    665       {149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128},
    666       { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128}
    667     },
    668     {
    669       {  1,  81, 230, 252, 204, 203, 255, 192, 128, 128, 128},
    670       {123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128},
    671       { 20,  95, 153, 243, 164, 173, 255, 203, 128, 128, 128},
    672     },
    673     {
    674       {  1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128},
    675       {168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128},
    676       { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128},
    677     },
    678     {
    679       {  1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128},
    680       {141,  84, 213, 252, 201, 202, 255, 219, 128, 128, 128},
    681       { 42,  80, 160, 240, 162, 185, 255, 205, 128, 128, 128},
    682     },
    683     {
    684       {  1,   1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    685       {244,   1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    686       {238,   1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
    687     },
    688   },
    689 };
    690 
    691 const uint8_t kMVUpdateProbs[kNumMVContexts][kNumMVProbs] =
    692 {
    693   {
    694     237, 246, 253, 253, 254, 254, 254, 254, 254,
    695     254, 254, 254, 254, 254, 250, 250, 252, 254, 254,
    696   },
    697   {
    698     231, 243, 245, 253, 254, 254, 254, 254, 254,
    699     254, 254, 254, 254, 254, 251, 251, 254, 254, 254,
    700   },
    701 };
    702 
    703 const uint8_t kDefaultMVProbs[kNumMVContexts][kNumMVProbs] = {
    704   {
    705     162, 128, 225, 146, 172, 147, 214,  39, 156,
    706     128, 129, 132,  75, 145, 178, 206, 239, 254, 254,
    707   },
    708   {
    709     164, 128, 204, 170, 119, 235, 140, 230, 228,
    710     128, 130, 130,  74, 148, 180, 203, 236, 254, 254,
    711   },
    712 };
    713 
    714 void Vp8Parser::ResetProbs() {
    715   static_assert(
    716       sizeof(curr_entropy_hdr_.coeff_probs) == sizeof(kDefaultCoeffProbs),
    717       "coeff_probs_arrays_must_be_of_correct_size");
    718   memcpy(curr_entropy_hdr_.coeff_probs, kDefaultCoeffProbs,
    719          sizeof(curr_entropy_hdr_.coeff_probs));
    720 
    721   static_assert(sizeof(curr_entropy_hdr_.mv_probs) == sizeof(kDefaultMVProbs),
    722                 "mv_probs_arrays_must_be_of_correct_size");
    723   memcpy(curr_entropy_hdr_.mv_probs, kDefaultMVProbs,
    724          sizeof(curr_entropy_hdr_.mv_probs));
    725 
    726   static_assert(
    727       sizeof(curr_entropy_hdr_.y_mode_probs) == sizeof(kDefaultYModeProbs),
    728       "y_probs_arrays_must_be_of_correct_size");
    729   memcpy(curr_entropy_hdr_.y_mode_probs, kDefaultYModeProbs,
    730          sizeof(curr_entropy_hdr_.y_mode_probs));
    731 
    732   static_assert(
    733       sizeof(curr_entropy_hdr_.uv_mode_probs) == sizeof(kDefaultUVModeProbs),
    734       "uv_probs_arrays_must_be_of_correct_size");
    735   memcpy(curr_entropy_hdr_.uv_mode_probs, kDefaultUVModeProbs,
    736          sizeof(curr_entropy_hdr_.uv_mode_probs));
    737 }
    738 
    739 bool Vp8Parser::ParseTokenProbs(Vp8EntropyHeader* ehdr,
    740                                 bool update_curr_probs) {
    741   for (size_t i = 0; i < kNumBlockTypes; ++i) {
    742     for (size_t j = 0; j < kNumCoeffBands; ++j) {
    743       for (size_t k = 0; k < kNumPrevCoeffContexts; ++k) {
    744         for (size_t l = 0; l < kNumEntropyNodes; ++l) {
    745           bool coeff_prob_update_flag;
    746           BD_READ_BOOL_WITH_PROB_OR_RETURN(&coeff_prob_update_flag,
    747                                            kCoeffUpdateProbs[i][j][k][l]);
    748           if (coeff_prob_update_flag)
    749             BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->coeff_probs[i][j][k][l]);
    750         }
    751       }
    752     }
    753   }
    754 
    755   if (update_curr_probs) {
    756     memcpy(curr_entropy_hdr_.coeff_probs, ehdr->coeff_probs,
    757            sizeof(curr_entropy_hdr_.coeff_probs));
    758   }
    759 
    760   return true;
    761 }
    762 
    763 bool Vp8Parser::ParseIntraProbs(Vp8EntropyHeader* ehdr,
    764                                 bool update_curr_probs,
    765                                 bool keyframe) {
    766   if (keyframe) {
    767     static_assert(
    768         sizeof(ehdr->y_mode_probs) == sizeof(kKeyframeYModeProbs),
    769         "y_probs_arrays_must_be_of_correct_size");
    770     memcpy(ehdr->y_mode_probs, kKeyframeYModeProbs,
    771            sizeof(ehdr->y_mode_probs));
    772 
    773     static_assert(
    774         sizeof(ehdr->uv_mode_probs) == sizeof(kKeyframeUVModeProbs),
    775         "uv_probs_arrays_must_be_of_correct_size");
    776     memcpy(ehdr->uv_mode_probs, kKeyframeUVModeProbs,
    777            sizeof(ehdr->uv_mode_probs));
    778   } else {
    779     bool intra_16x16_prob_update_flag;
    780     BD_READ_BOOL_OR_RETURN(&intra_16x16_prob_update_flag);
    781     if (intra_16x16_prob_update_flag) {
    782       for (size_t i = 0; i < kNumYModeProbs; ++i)
    783         BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->y_mode_probs[i]);
    784 
    785       if (update_curr_probs) {
    786         memcpy(curr_entropy_hdr_.y_mode_probs, ehdr->y_mode_probs,
    787                sizeof(curr_entropy_hdr_.y_mode_probs));
    788       }
    789     }
    790 
    791     bool intra_chroma_prob_update_flag;
    792     BD_READ_BOOL_OR_RETURN(&intra_chroma_prob_update_flag);
    793     if (intra_chroma_prob_update_flag) {
    794       for (size_t i = 0; i < kNumUVModeProbs; ++i)
    795         BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->uv_mode_probs[i]);
    796 
    797       if (update_curr_probs) {
    798         memcpy(curr_entropy_hdr_.uv_mode_probs, ehdr->uv_mode_probs,
    799                sizeof(curr_entropy_hdr_.uv_mode_probs));
    800       }
    801     }
    802   }
    803 
    804   return true;
    805 }
    806 
    807 bool Vp8Parser::ParseMVProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs) {
    808   for (size_t mv_ctx = 0; mv_ctx < kNumMVContexts; ++mv_ctx) {
    809     for (size_t p = 0; p < kNumMVProbs; ++p) {
    810       bool mv_prob_update_flag;
    811       BD_READ_BOOL_WITH_PROB_OR_RETURN(&mv_prob_update_flag,
    812                                        kMVUpdateProbs[mv_ctx][p]);
    813       if (mv_prob_update_flag) {
    814         uint8_t prob;
    815         BD_READ_UNSIGNED_OR_RETURN(7, &prob);
    816         ehdr->mv_probs[mv_ctx][p] = prob ? (prob << 1) : 1;
    817       }
    818     }
    819   }
    820 
    821   if (update_curr_probs) {
    822     memcpy(curr_entropy_hdr_.mv_probs, ehdr->mv_probs,
    823            sizeof(curr_entropy_hdr_.mv_probs));
    824   }
    825 
    826   return true;
    827 }
    828 
    829 bool Vp8Parser::ParsePartitions(Vp8FrameHeader* fhdr) {
    830   CHECK_GE(fhdr->num_of_dct_partitions, 1u);
    831   CHECK_LE(fhdr->num_of_dct_partitions, kMaxDCTPartitions);
    832 
    833   // DCT partitions start after the first partition and partition size values
    834   // that follow it. There are num_of_dct_partitions - 1 sizes stored in the
    835   // stream after the first partition, each 3 bytes long. The size of last
    836   // DCT partition is not stored in the stream, but is instead calculated by
    837   // taking the remainder of the frame size after the penultimate DCT partition.
    838   size_t first_dct_pos = fhdr->first_part_offset + fhdr->first_part_size +
    839                          (fhdr->num_of_dct_partitions - 1) * 3;
    840 
    841   // Make sure we have enough data for the first partition and partition sizes.
    842   if (fhdr->frame_size < first_dct_pos)
    843     return false;
    844 
    845   // Total size of all DCT partitions.
    846   size_t bytes_left = fhdr->frame_size - first_dct_pos;
    847 
    848   // Position ourselves at the beginning of partition size values.
    849   const uint8_t* ptr =
    850       fhdr->data + fhdr->first_part_offset + fhdr->first_part_size;
    851 
    852   // Read sizes from the stream (if present).
    853   for (size_t i = 0; i < fhdr->num_of_dct_partitions - 1; ++i) {
    854     fhdr->dct_partition_sizes[i] = (ptr[2] << 16) | (ptr[1] << 8) | ptr[0];
    855 
    856     // Make sure we have enough data in the stream for ith partition and
    857     // subtract its size from total.
    858     if (bytes_left < fhdr->dct_partition_sizes[i])
    859       return false;
    860 
    861     bytes_left -= fhdr->dct_partition_sizes[i];
    862 
    863     // Move to the position of the next partition size value.
    864     ptr += 3;
    865   }
    866 
    867   // The remainder of the data belongs to the last DCT partition.
    868   fhdr->dct_partition_sizes[fhdr->num_of_dct_partitions - 1] = bytes_left;
    869 
    870   DVLOG(4) << "Control part size: " << fhdr->first_part_size;
    871   for (size_t i = 0; i < fhdr->num_of_dct_partitions; ++i)
    872     DVLOG(4) << "DCT part " << i << " size: " << fhdr->dct_partition_sizes[i];
    873 
    874   return true;
    875 }
    876 
    877 }  // namespace media
    878