• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Vp8FrameHeader()47 Vp8FrameHeader::Vp8FrameHeader() {
48   memset(this, 0, sizeof(*this));
49 }
50 
Vp8Parser()51 Vp8Parser::Vp8Parser() : stream_(nullptr), bytes_left_(0) {
52 }
53 
~Vp8Parser()54 Vp8Parser::~Vp8Parser() {
55 }
56 
ParseFrame(const uint8_t * ptr,size_t frame_size,Vp8FrameHeader * fhdr)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 
GetBitsAt(uint32_t data,size_t shift,size_t num_bits)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 
ParseFrameTag(Vp8FrameHeader * fhdr)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 
ParseFrameHeader(Vp8FrameHeader * fhdr)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 
ParseSegmentationHeader(bool keyframe)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 
ParseLoopFilterHeader(bool keyframe)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 
ParseQuantizationHeader(Vp8QuantizationHeader * qhdr)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 
ResetProbs()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 
ParseTokenProbs(Vp8EntropyHeader * ehdr,bool update_curr_probs)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 
ParseIntraProbs(Vp8EntropyHeader * ehdr,bool update_curr_probs,bool keyframe)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 
ParseMVProbs(Vp8EntropyHeader * ehdr,bool update_curr_probs)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 
ParsePartitions(Vp8FrameHeader * fhdr)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