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