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 47 Vp8FrameHeader::Vp8FrameHeader() { 48 memset(this, 0, sizeof(*this)); 49 } 50 51 Vp8Parser::Vp8Parser() : stream_(nullptr), bytes_left_(0) { 52 } 53 54 Vp8Parser::~Vp8Parser() { 55 } 56 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 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 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 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 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 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 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 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 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 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 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 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