[AndroidWebViewShell] Replace rebaseline script with a new version using test_runner.py
[chromium-blink-merge.git] / media / filters / vp8_parser.cc
blob5b49673d86e88b42450f4e849c608bf6c844e95a
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.
8 #include "base/logging.h"
9 #include "media/filters/vp8_parser.h"
11 namespace media {
13 #define ERROR_RETURN(what) \
14 do { \
15 DVLOG(1) << "Error while trying to read " #what; \
16 return false; \
17 } while (0)
19 #define BD_READ_BOOL_OR_RETURN(out) \
20 do { \
21 if (!bd_.ReadBool(out)) \
22 ERROR_RETURN(out); \
23 } while (0)
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)
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)
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)
47 Vp8FrameHeader::Vp8FrameHeader() {
48 memset(this, 0, sizeof(*this));
51 Vp8Parser::Vp8Parser() : stream_(nullptr), bytes_left_(0) {
54 Vp8Parser::~Vp8Parser() {
57 bool Vp8Parser::ParseFrame(const uint8_t* ptr,
58 size_t frame_size,
59 Vp8FrameHeader* fhdr) {
60 stream_ = ptr;
61 bytes_left_ = frame_size;
63 memset(fhdr, 0, sizeof(*fhdr));
64 fhdr->data = stream_;
65 fhdr->frame_size = bytes_left_;
67 if (!ParseFrameTag(fhdr))
68 return false;
70 fhdr->first_part_offset = stream_ - fhdr->data;
72 if (!ParseFrameHeader(fhdr))
73 return false;
75 if (!ParsePartitions(fhdr))
76 return false;
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;
83 return true;
86 static inline uint32_t GetBitsAt(uint32_t data, size_t shift, size_t num_bits) {
87 return ((data >> shift) & ((1 << num_bits) - 1));
90 bool Vp8Parser::ParseFrameTag(Vp8FrameHeader* fhdr) {
91 const size_t kFrameTagSize = 3;
92 if (bytes_left_ < kFrameTagSize)
93 return false;
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);
103 stream_ += kFrameTagSize;
104 bytes_left_ -= kFrameTagSize;
106 if (fhdr->IsKeyframe()) {
107 const size_t kKeyframeTagSize = 7;
108 if (bytes_left_ < kKeyframeTagSize)
109 return false;
111 static const uint8_t kVp8StartCode[] = {0x9d, 0x01, 0x2a};
112 if (memcmp(stream_, kVp8StartCode, sizeof(kVp8StartCode)) != 0)
113 return false;
115 stream_ += sizeof(kVp8StartCode);
116 bytes_left_ -= sizeof(kVp8StartCode);
118 uint16_t data = (stream_[1] << 8) | stream_[0];
119 fhdr->width = data & 0x3fff;
120 fhdr->horizontal_scale = data >> 14;
122 data = (stream_[3] << 8) | stream_[2];
123 fhdr->height = data & 0x3fff;
124 fhdr->vertical_scale = data >> 14;
126 stream_ += 4;
127 bytes_left_ -= 4;
130 return true;
133 bool Vp8Parser::ParseFrameHeader(Vp8FrameHeader* fhdr) {
134 if (!bd_.Initialize(stream_, bytes_left_))
135 return false;
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
144 if (!ParseSegmentationHeader(keyframe))
145 return false;
147 fhdr->segmentation_hdr = curr_segmentation_hdr_;
149 if (!ParseLoopFilterHeader(keyframe))
150 return false;
152 fhdr->loopfilter_hdr = curr_loopfilter_hdr_;
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 =
157 static_cast<size_t>(1 << log2_nbr_of_dct_partitions);
159 if (!ParseQuantizationHeader(&fhdr->quantization_hdr))
160 return false;
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);
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);
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);
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);
187 if (keyframe)
188 ResetProbs();
190 fhdr->entropy_hdr = curr_entropy_hdr_;
192 if (!ParseTokenProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
193 return false;
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);
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);
205 if (!ParseIntraProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs,
206 keyframe))
207 return false;
209 if (!keyframe) {
210 if (!ParseMVProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
211 return false;
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;
219 return true;
222 bool Vp8Parser::ParseSegmentationHeader(bool keyframe) {
223 Vp8SegmentationHeader* shdr = &curr_segmentation_hdr_;
225 if (keyframe)
226 memset(shdr, 0, sizeof(*shdr));
228 BD_READ_BOOL_OR_RETURN(&shdr->segmentation_enabled);
229 if (!shdr->segmentation_enabled)
230 return true;
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);
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]);
247 for (size_t i = 0; i < kMaxMBSegments; ++i) {
248 bool loop_filter_update;
249 BD_READ_BOOL_OR_RETURN(&loop_filter_update);
250 if (loop_filter_update)
251 BD_READ_SIGNED_OR_RETURN(6, &shdr->lf_update_value[i]);
255 if (shdr->update_mb_segmentation_map) {
256 for (size_t i = 0; i < kNumMBFeatureTreeProbs; ++i) {
257 bool segment_prob_update;
258 BD_READ_BOOL_OR_RETURN(&segment_prob_update);
259 if (segment_prob_update)
260 BD_READ_UNSIGNED_OR_RETURN(8, &shdr->segment_prob[i]);
261 else
262 shdr->segment_prob[i] = Vp8SegmentationHeader::kDefaultSegmentProb;
266 return true;
269 bool Vp8Parser::ParseLoopFilterHeader(bool keyframe) {
270 Vp8LoopFilterHeader* lfhdr = &curr_loopfilter_hdr_;
272 if (keyframe)
273 memset(lfhdr, 0, sizeof(*lfhdr));
275 int type;
276 BD_READ_UNSIGNED_OR_RETURN(1, &type);
277 lfhdr->type = static_cast<Vp8LoopFilterHeader::Type>(type);
278 BD_READ_UNSIGNED_OR_RETURN(6, &lfhdr->level);
279 BD_READ_UNSIGNED_OR_RETURN(3, &lfhdr->sharpness_level);
280 BD_READ_BOOL_OR_RETURN(&lfhdr->loop_filter_adj_enable);
282 if (lfhdr->loop_filter_adj_enable) {
283 BD_READ_BOOL_OR_RETURN(&lfhdr->mode_ref_lf_delta_update);
284 if (lfhdr->mode_ref_lf_delta_update) {
285 for (size_t i = 0; i < kNumBlockContexts; ++i) {
286 bool ref_frame_delta_update_flag;
287 BD_READ_BOOL_OR_RETURN(&ref_frame_delta_update_flag);
288 if (ref_frame_delta_update_flag)
289 BD_READ_SIGNED_OR_RETURN(6, &lfhdr->ref_frame_delta[i]);
292 for (size_t i = 0; i < kNumBlockContexts; ++i) {
293 bool mb_mode_delta_update_flag;
294 BD_READ_BOOL_OR_RETURN(&mb_mode_delta_update_flag);
295 if (mb_mode_delta_update_flag)
296 BD_READ_SIGNED_OR_RETURN(6, &lfhdr->mb_mode_delta[i]);
301 return true;
304 bool Vp8Parser::ParseQuantizationHeader(Vp8QuantizationHeader* qhdr) {
305 // If any of the delta values is not present, the delta should be zero.
306 memset(qhdr, 0, sizeof(*qhdr));
308 BD_READ_UNSIGNED_OR_RETURN(7, &qhdr->y_ac_qi);
310 bool delta_present;
312 BD_READ_BOOL_OR_RETURN(&delta_present);
313 if (delta_present)
314 BD_READ_SIGNED_OR_RETURN(4, &qhdr->y_dc_delta);
316 BD_READ_BOOL_OR_RETURN(&delta_present);
317 if (delta_present)
318 BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_dc_delta);
320 BD_READ_BOOL_OR_RETURN(&delta_present);
321 if (delta_present)
322 BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_ac_delta);
324 BD_READ_BOOL_OR_RETURN(&delta_present);
325 if (delta_present)
326 BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_dc_delta);
328 BD_READ_BOOL_OR_RETURN(&delta_present);
329 if (delta_present)
330 BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_ac_delta);
332 return true;
335 // See spec for details on these values.
336 const uint8_t kCoeffUpdateProbs[kNumBlockTypes][kNumCoeffBands]
337 [kNumPrevCoeffContexts][kNumEntropyNodes] = {
340 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
341 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
342 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
345 {176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255},
346 {223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255},
347 {249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
350 {255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255},
351 {234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
352 {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
355 {255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255},
356 {239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
357 {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
360 {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
361 {251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
362 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
365 {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
366 {251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
367 {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
370 {255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255},
371 {250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255},
372 {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
375 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
376 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
377 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
382 {217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
383 {225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255},
384 {234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255},
387 {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
388 {223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
389 {238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255},
392 {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
393 {249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
394 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
397 {255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255},
398 {247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
399 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
402 {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
403 {252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
404 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
407 {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
408 {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
409 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
412 {255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
413 {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
414 {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
417 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
418 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
419 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
424 {186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255},
425 {234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255},
426 {251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255},
429 {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
430 {236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
431 {251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255},
434 {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
435 {254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
436 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
439 {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
440 {254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
441 {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
444 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
445 {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
446 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
449 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
450 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
451 {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 {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 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
466 {248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
467 {250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255},
468 {248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255},
471 {255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
472 {246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
473 {252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255},
476 {255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255},
477 {248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
478 {253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255},
481 {255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
482 {245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
483 {253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
486 {255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255},
487 {252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
488 {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
491 {255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255},
492 {249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
493 {255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
496 {255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255},
497 {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
498 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
501 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
502 {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
503 {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
508 const uint8_t kKeyframeYModeProbs[kNumYModeProbs] = {145, 156, 163, 128};
509 const uint8_t kKeyframeUVModeProbs[kNumUVModeProbs] = {142, 114, 183};
511 const uint8_t kDefaultYModeProbs[kNumYModeProbs] = {112, 86, 140, 37};
512 const uint8_t kDefaultUVModeProbs[kNumUVModeProbs] = {162, 101, 204};
514 const uint8_t kDefaultCoeffProbs[kNumBlockTypes][kNumCoeffBands]
515 [kNumPrevCoeffContexts][kNumEntropyNodes] = {
518 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
519 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
520 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
523 {253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128},
524 {189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128},
525 {106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128},
528 { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128},
529 {181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128},
530 { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128},
533 { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128},
534 {184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128},
535 { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128},
538 { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128},
539 {170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128},
540 { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128},
543 { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128},
544 {207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128},
545 {102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128},
548 { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128},
549 {177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128},
550 { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128},
553 { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
554 {246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
555 {255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
560 {198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62},
561 {131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1},
562 { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128},
565 { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128},
566 {184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128},
567 { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128},
570 { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128},
571 { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128},
572 { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128},
575 { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128},
576 {109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128},
577 { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128},
580 { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128},
581 { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128},
582 { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128},
585 { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128},
586 {124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128},
587 { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128},
590 { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128},
591 {121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128},
592 { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128},
595 { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128},
596 {203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128},
597 {137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128},
602 {253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128},
603 {175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128},
604 { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128},
607 { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128},
608 {239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128},
609 {155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128},
612 { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128},
613 {201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128},
614 { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128},
617 { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128},
618 {223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128},
619 {141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128},
622 { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128},
623 {190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128},
624 {149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
627 { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128},
628 {247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128},
629 {240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128},
632 { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128},
633 {213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128},
634 { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128},
637 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
638 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
639 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
644 {202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255},
645 {126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128},
646 { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128},
649 { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128},
650 {166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128},
651 { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128},
654 { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128},
655 {124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128},
656 { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128},
659 { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128},
660 {149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128},
661 { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128}
664 { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128},
665 {123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128},
666 { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128},
669 { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128},
670 {168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128},
671 { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128},
674 { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128},
675 {141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128},
676 { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128},
679 { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
680 {244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
681 {238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
686 const uint8_t kMVUpdateProbs[kNumMVContexts][kNumMVProbs] =
689 237, 246, 253, 253, 254, 254, 254, 254, 254,
690 254, 254, 254, 254, 254, 250, 250, 252, 254, 254,
693 231, 243, 245, 253, 254, 254, 254, 254, 254,
694 254, 254, 254, 254, 254, 251, 251, 254, 254, 254,
698 const uint8_t kDefaultMVProbs[kNumMVContexts][kNumMVProbs] = {
700 162, 128, 225, 146, 172, 147, 214, 39, 156,
701 128, 129, 132, 75, 145, 178, 206, 239, 254, 254,
704 164, 128, 204, 170, 119, 235, 140, 230, 228,
705 128, 130, 130, 74, 148, 180, 203, 236, 254, 254,
709 void Vp8Parser::ResetProbs() {
710 static_assert(
711 sizeof(curr_entropy_hdr_.coeff_probs) == sizeof(kDefaultCoeffProbs),
712 "coeff_probs_arrays_must_be_of_correct_size");
713 memcpy(curr_entropy_hdr_.coeff_probs, kDefaultCoeffProbs,
714 sizeof(curr_entropy_hdr_.coeff_probs));
716 static_assert(sizeof(curr_entropy_hdr_.mv_probs) == sizeof(kDefaultMVProbs),
717 "mv_probs_arrays_must_be_of_correct_size");
718 memcpy(curr_entropy_hdr_.mv_probs, kDefaultMVProbs,
719 sizeof(curr_entropy_hdr_.mv_probs));
721 static_assert(
722 sizeof(curr_entropy_hdr_.y_mode_probs) == sizeof(kDefaultYModeProbs),
723 "y_probs_arrays_must_be_of_correct_size");
724 memcpy(curr_entropy_hdr_.y_mode_probs, kDefaultYModeProbs,
725 sizeof(curr_entropy_hdr_.y_mode_probs));
727 static_assert(
728 sizeof(curr_entropy_hdr_.uv_mode_probs) == sizeof(kDefaultUVModeProbs),
729 "uv_probs_arrays_must_be_of_correct_size");
730 memcpy(curr_entropy_hdr_.uv_mode_probs, kDefaultUVModeProbs,
731 sizeof(curr_entropy_hdr_.uv_mode_probs));
734 bool Vp8Parser::ParseTokenProbs(Vp8EntropyHeader* ehdr,
735 bool update_curr_probs) {
736 for (size_t i = 0; i < kNumBlockTypes; ++i) {
737 for (size_t j = 0; j < kNumCoeffBands; ++j) {
738 for (size_t k = 0; k < kNumPrevCoeffContexts; ++k) {
739 for (size_t l = 0; l < kNumEntropyNodes; ++l) {
740 bool coeff_prob_update_flag;
741 BD_READ_BOOL_WITH_PROB_OR_RETURN(&coeff_prob_update_flag,
742 kCoeffUpdateProbs[i][j][k][l]);
743 if (coeff_prob_update_flag)
744 BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->coeff_probs[i][j][k][l]);
750 if (update_curr_probs) {
751 memcpy(curr_entropy_hdr_.coeff_probs, ehdr->coeff_probs,
752 sizeof(curr_entropy_hdr_.coeff_probs));
755 return true;
758 bool Vp8Parser::ParseIntraProbs(Vp8EntropyHeader* ehdr,
759 bool update_curr_probs,
760 bool keyframe) {
761 if (keyframe) {
762 static_assert(
763 sizeof(ehdr->y_mode_probs) == sizeof(kKeyframeYModeProbs),
764 "y_probs_arrays_must_be_of_correct_size");
765 memcpy(ehdr->y_mode_probs, kKeyframeYModeProbs,
766 sizeof(ehdr->y_mode_probs));
768 static_assert(
769 sizeof(ehdr->uv_mode_probs) == sizeof(kKeyframeUVModeProbs),
770 "uv_probs_arrays_must_be_of_correct_size");
771 memcpy(ehdr->uv_mode_probs, kKeyframeUVModeProbs,
772 sizeof(ehdr->uv_mode_probs));
773 } else {
774 bool intra_16x16_prob_update_flag;
775 BD_READ_BOOL_OR_RETURN(&intra_16x16_prob_update_flag);
776 if (intra_16x16_prob_update_flag) {
777 for (size_t i = 0; i < kNumYModeProbs; ++i)
778 BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->y_mode_probs[i]);
780 if (update_curr_probs) {
781 memcpy(curr_entropy_hdr_.y_mode_probs, ehdr->y_mode_probs,
782 sizeof(curr_entropy_hdr_.y_mode_probs));
786 bool intra_chroma_prob_update_flag;
787 BD_READ_BOOL_OR_RETURN(&intra_chroma_prob_update_flag);
788 if (intra_chroma_prob_update_flag) {
789 for (size_t i = 0; i < kNumUVModeProbs; ++i)
790 BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->uv_mode_probs[i]);
792 if (update_curr_probs) {
793 memcpy(curr_entropy_hdr_.uv_mode_probs, ehdr->uv_mode_probs,
794 sizeof(curr_entropy_hdr_.uv_mode_probs));
799 return true;
802 bool Vp8Parser::ParseMVProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs) {
803 for (size_t mv_ctx = 0; mv_ctx < kNumMVContexts; ++mv_ctx) {
804 for (size_t p = 0; p < kNumMVProbs; ++p) {
805 bool mv_prob_update_flag;
806 BD_READ_BOOL_WITH_PROB_OR_RETURN(&mv_prob_update_flag,
807 kMVUpdateProbs[mv_ctx][p]);
808 if (mv_prob_update_flag) {
809 uint8_t prob;
810 BD_READ_UNSIGNED_OR_RETURN(7, &prob);
811 ehdr->mv_probs[mv_ctx][p] = prob ? (prob << 1) : 1;
816 if (update_curr_probs) {
817 memcpy(curr_entropy_hdr_.mv_probs, ehdr->mv_probs,
818 sizeof(curr_entropy_hdr_.mv_probs));
821 return true;
824 bool Vp8Parser::ParsePartitions(Vp8FrameHeader* fhdr) {
825 CHECK_GE(fhdr->num_of_dct_partitions, 1u);
826 CHECK_LE(fhdr->num_of_dct_partitions, kMaxDCTPartitions);
828 // DCT partitions start after the first partition and partition size values
829 // that follow it. There are num_of_dct_partitions - 1 sizes stored in the
830 // stream after the first partition, each 3 bytes long. The size of last
831 // DCT partition is not stored in the stream, but is instead calculated by
832 // taking the remainder of the frame size after the penultimate DCT partition.
833 size_t first_dct_pos = fhdr->first_part_offset + fhdr->first_part_size +
834 (fhdr->num_of_dct_partitions - 1) * 3;
836 // Make sure we have enough data for the first partition and partition sizes.
837 if (fhdr->frame_size < first_dct_pos)
838 return false;
840 // Total size of all DCT partitions.
841 size_t bytes_left = fhdr->frame_size - first_dct_pos;
843 // Position ourselves at the beginning of partition size values.
844 const uint8_t* ptr =
845 fhdr->data + fhdr->first_part_offset + fhdr->first_part_size;
847 // Read sizes from the stream (if present).
848 for (size_t i = 0; i < fhdr->num_of_dct_partitions - 1; ++i) {
849 fhdr->dct_partition_sizes[i] = (ptr[2] << 16) | (ptr[1] << 8) | ptr[0];
851 // Make sure we have enough data in the stream for ith partition and
852 // subtract its size from total.
853 if (bytes_left < fhdr->dct_partition_sizes[i])
854 return false;
856 bytes_left -= fhdr->dct_partition_sizes[i];
858 // Move to the position of the next partition size value.
859 ptr += 3;
862 // The remainder of the data belongs to the last DCT partition.
863 fhdr->dct_partition_sizes[fhdr->num_of_dct_partitions - 1] = bytes_left;
865 DVLOG(4) << "Control part size: " << fhdr->first_part_size;
866 for (size_t i = 0; i < fhdr->num_of_dct_partitions; ++i)
867 DVLOG(4) << "DCT part " << i << " size: " << fhdr->dct_partition_sizes[i];
869 return true;
872 } // namespace media