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.
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"
13 #define ERROR_RETURN(what) \
15 DVLOG(1) << "Error while trying to read " #what; \
19 #define BD_READ_BOOL_OR_RETURN(out) \
21 if (!bd_.ReadBool(out)) \
25 #define BD_READ_BOOL_WITH_PROB_OR_RETURN(out, prob) \
27 if (!bd_.ReadBool(out, prob)) \
31 #define BD_READ_UNSIGNED_OR_RETURN(num_bits, out) \
34 if (!bd_.ReadLiteral(num_bits, &_out)) \
39 #define BD_READ_SIGNED_OR_RETURN(num_bits, out) \
42 if (!bd_.ReadLiteralWithSign(num_bits, &_out)) \
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
,
59 Vp8FrameHeader
* fhdr
) {
61 bytes_left_
= frame_size
;
63 memset(fhdr
, 0, sizeof(*fhdr
));
65 fhdr
->frame_size
= bytes_left_
;
67 if (!ParseFrameTag(fhdr
))
70 fhdr
->first_part_offset
= stream_
- fhdr
->data
;
72 if (!ParseFrameHeader(fhdr
))
75 if (!ParsePartitions(fhdr
))
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
;
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
)
95 uint32_t frame_tag
= (stream_
[2] << 16) | (stream_
[1] << 8) | stream_
[0];
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
)
111 static const uint8_t kVp8StartCode
[] = {0x9d, 0x01, 0x2a};
112 if (memcmp(stream_
, kVp8StartCode
, sizeof(kVp8StartCode
)) != 0)
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;
133 bool Vp8Parser::ParseFrameHeader(Vp8FrameHeader
* fhdr
) {
134 if (!bd_
.Initialize(stream_
, bytes_left_
))
137 bool keyframe
= fhdr
->IsKeyframe();
140 BD_READ_UNSIGNED_OR_RETURN(1, &data
); // color_space
141 BD_READ_UNSIGNED_OR_RETURN(1, &data
); // clamping_type
144 if (!ParseSegmentationHeader(keyframe
))
147 fhdr
->segmentation_hdr
= curr_segmentation_hdr_
;
149 if (!ParseLoopFilterHeader(keyframe
))
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
))
163 BD_READ_BOOL_OR_RETURN(&fhdr
->refresh_entropy_probs
);
165 BD_READ_BOOL_OR_RETURN(&fhdr
->refresh_golden_frame
);
166 BD_READ_BOOL_OR_RETURN(&fhdr
->refresh_alternate_frame
);
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
);
190 fhdr
->entropy_hdr
= curr_entropy_hdr_
;
192 if (!ParseTokenProbs(&fhdr
->entropy_hdr
, fhdr
->refresh_entropy_probs
))
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
);
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
,
210 if (!ParseMVProbs(&fhdr
->entropy_hdr
, fhdr
->refresh_entropy_probs
))
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;
222 bool Vp8Parser::ParseSegmentationHeader(bool keyframe
) {
223 Vp8SegmentationHeader
* shdr
= &curr_segmentation_hdr_
;
226 memset(shdr
, 0, sizeof(*shdr
));
228 BD_READ_BOOL_OR_RETURN(&shdr
->segmentation_enabled
);
229 if (!shdr
->segmentation_enabled
)
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
) {
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
]);
262 shdr
->segment_prob
[i
] = Vp8SegmentationHeader::kDefaultSegmentProb
;
269 bool Vp8Parser::ParseLoopFilterHeader(bool keyframe
) {
270 Vp8LoopFilterHeader
* lfhdr
= &curr_loopfilter_hdr_
;
273 memset(lfhdr
, 0, sizeof(*lfhdr
));
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
]);
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
);
312 BD_READ_BOOL_OR_RETURN(&delta_present
);
314 BD_READ_SIGNED_OR_RETURN(4, &qhdr
->y_dc_delta
);
316 BD_READ_BOOL_OR_RETURN(&delta_present
);
318 BD_READ_SIGNED_OR_RETURN(4, &qhdr
->y2_dc_delta
);
320 BD_READ_BOOL_OR_RETURN(&delta_present
);
322 BD_READ_SIGNED_OR_RETURN(4, &qhdr
->y2_ac_delta
);
324 BD_READ_BOOL_OR_RETURN(&delta_present
);
326 BD_READ_SIGNED_OR_RETURN(4, &qhdr
->uv_dc_delta
);
328 BD_READ_BOOL_OR_RETURN(&delta_present
);
330 BD_READ_SIGNED_OR_RETURN(4, &qhdr
->uv_ac_delta
);
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() {
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
));
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
));
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
));
758 bool Vp8Parser::ParseIntraProbs(Vp8EntropyHeader
* ehdr
,
759 bool update_curr_probs
,
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
));
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
));
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
));
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
) {
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
));
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
)
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.
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
])
856 bytes_left
-= fhdr
->dct_partition_sizes
[i
];
858 // Move to the position of the next partition size value.
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
];