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