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