15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/decrypt_config.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/filters/h264_parser.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264SliceHeader::IsPSlice() const { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (slice_type % 5 == kPSlice); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264SliceHeader::IsBSlice() const { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (slice_type % 5 == kBSlice); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264SliceHeader::IsISlice() const { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (slice_type % 5 == kISlice); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264SliceHeader::IsSPSlice() const { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (slice_type % 5 == kSPSlice); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264SliceHeader::IsSISlice() const { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (slice_type % 5 == kSISlice); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264NALU::H264NALU() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(this, 0, sizeof(*this)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264SPS::H264SPS() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(this, 0, sizeof(*this)); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264PPS::H264PPS() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(this, 0, sizeof(*this)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264SliceHeader::H264SliceHeader() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(this, 0, sizeof(*this)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264SEIMessage::H264SEIMessage() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(this, 0, sizeof(*this)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define READ_BITS_OR_RETURN(num_bits, out) \ 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) do { \ 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int _out; \ 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!br_.ReadBits(num_bits, &_out)) { \ 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) \ 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Error in stream: unexpected EOS while trying to read " #out; \ 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kInvalidStream; \ 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out = _out; \ 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define READ_BOOL_OR_RETURN(out) \ 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) do { \ 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int _out; \ 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!br_.ReadBits(1, &_out)) { \ 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) \ 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Error in stream: unexpected EOS while trying to read " #out; \ 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kInvalidStream; \ 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out = _out != 0; \ 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define READ_UE_OR_RETURN(out) \ 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) do { \ 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ReadUE(out) != kOk) { \ 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \ 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kInvalidStream; \ 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define READ_SE_OR_RETURN(out) \ 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) do { \ 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ReadSE(out) != kOk) { \ 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \ 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kInvalidStream; \ 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IN_RANGE_OR_RETURN(val, min, max) \ 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) do { \ 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((val) < (min) || (val) > (max)) { \ 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "Error in stream: invalid value, expected " #val " to be" \ 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " in range [" << (min) << ":" << (max) << "]" \ 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " found " << (val) << " instead"; \ 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kInvalidStream; \ 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define TRUE_OR_RETURN(a) \ 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) do { \ 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!(a)) { \ 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "Error in stream: invalid value, expected " << #a; \ 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kInvalidStream; \ 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ISO 14496 part 10 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// VUI parameters: Table E-1 "Meaning of sample aspect ratio indicator" 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const int kTableSarWidth[] = { 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const int kTableSarHeight[] = { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)COMPILE_ASSERT(arraysize(kTableSarWidth) == arraysize(kTableSarHeight), 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sar_tables_must_have_same_size); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::H264Parser() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::~H264Parser() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteValues(&active_SPSes_); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteValues(&active_PPSes_); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264Parser::Reset() { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_ = NULL; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_left_ = 0; 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) encrypted_ranges_.clear(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264Parser::SetStream(const uint8* stream, off_t stream_size) { 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<SubsampleEntry> subsamples; 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetEncryptedStream(stream, stream_size, subsamples); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void H264Parser::SetEncryptedStream( 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* stream, off_t stream_size, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<SubsampleEntry>& subsamples) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stream); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(stream_size, 0); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_ = stream; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_left_ = stream_size; 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) encrypted_ranges_.clear(); 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* start = stream; 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* stream_end = stream_ + bytes_left_; 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < subsamples.size() && start < stream_end; ++i) { 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) start += subsamples[i].clear_bytes; 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* end = std::min(start + subsamples[i].cypher_bytes, stream_end); 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) encrypted_ranges_.Add(start, end); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) start = end; 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const H264PPS* H264Parser::GetPPS(int pps_id) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return active_PPSes_[pps_id]; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const H264SPS* H264Parser::GetSPS(int sps_id) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return active_SPSes_[sps_id]; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool IsStartCode(const uint8* data) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool H264Parser::FindStartCode(const uint8* data, off_t data_size, 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t* offset, off_t* start_code_size) { 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GE(data_size, 0); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_t bytes_left = data_size; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (bytes_left >= 3) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsStartCode(data)) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Found three-byte start code, set pointer at its beginning. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = data_size - bytes_left; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_code_size = 3; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a zero byte before this start code, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then it's actually a four-byte start code, so backtrack one byte. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*offset > 0 && *(data - 1) == 0x00) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --(*offset); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++(*start_code_size); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++data; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --bytes_left; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // End of data: offset is pointing to the first byte that was not considered 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // as a possible start of a start code. 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: there is no security issue when receiving a negative |data_size| 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // since in this case, |bytes_left| is equal to |data_size| and thus 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |*offset| is equal to 0 (valid offset). 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *offset = data_size - bytes_left; 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *start_code_size = 0; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool H264Parser::LocateNALU(off_t* nalu_size, off_t* start_code_size) { 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Find the start code of next NALU. 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t nalu_start_off = 0; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t annexb_start_code_size = 0; 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!FindStartCodeInClearRanges(stream_, bytes_left_, 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &nalu_start_off, &annexb_start_code_size)) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "Could not find start code, end of stream?"; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Move the stream to the beginning of the NALU (pointing at the start code). 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stream_ += nalu_start_off; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bytes_left_ -= nalu_start_off; 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* nalu_data = stream_ + annexb_start_code_size; 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t max_nalu_data_size = bytes_left_ - annexb_start_code_size; 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (max_nalu_data_size <= 0) { 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(3) << "End of stream"; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Find the start code of next NALU; 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if successful, |nalu_size_without_start_code| is the number of bytes from 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // after previous start code to before this one; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if next start code is not found, it is still a valid NALU since there 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // are some bytes left after the first start code: all the remaining bytes 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // belong to the current NALU. 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t next_start_code_size = 0; 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t nalu_size_without_start_code = 0; 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!FindStartCodeInClearRanges(nalu_data, max_nalu_data_size, 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &nalu_size_without_start_code, 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &next_start_code_size)) { 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nalu_size_without_start_code = max_nalu_data_size; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *nalu_size = nalu_size_without_start_code + annexb_start_code_size; 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *start_code_size = annexb_start_code_size; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool H264Parser::FindStartCodeInClearRanges( 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* data, 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) off_t data_size, 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) off_t* offset, 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) off_t* start_code_size) { 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (encrypted_ranges_.size() == 0) 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return FindStartCode(data, data_size, offset, start_code_size); 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_GE(data_size, 0); 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* start = data; 2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) do { 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) off_t bytes_left = data_size - (start - data); 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!FindStartCode(start, bytes_left, offset, start_code_size)) 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Construct a Ranges object that represents the region occupied 2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // by the start code and the 1 byte needed to read the NAL unit type. 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* start_code = start + *offset; 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const uint8* start_code_end = start_code + *start_code_size; 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Ranges<const uint8*> start_code_range; 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) start_code_range.Add(start_code, start_code_end + 1); 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (encrypted_ranges_.IntersectionWith(start_code_range).size() > 0) { 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The start code is inside an encrypted section so we need to scan 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // for another start code. 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *start_code_size = 0; 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) start += std::min(*offset + 1, bytes_left); 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } while (*start_code_size == 0); 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Update |*offset| to include the data we skipped over. 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *offset += start - data; 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ReadUE(int* val) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_bits = -1; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bit; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rest; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Count the number of contiguous zero bits. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(1, &bit); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_bits++; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (bit == 0); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_bits > 31) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kInvalidStream; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate exp-Golomb code value of size num_bits. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *val = (1 << num_bits) - 1; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_bits > 0) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(num_bits, &rest); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *val += rest; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ReadSE(int* val) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ue; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See Chapter 9 in the spec. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ReadUE(&ue); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ue % 2 == 0) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *val = -(ue / 2); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *val = ue / 2 + 1; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)H264Parser::Result H264Parser::AdvanceToNextNALU(H264NALU* nalu) { 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t start_code_size; 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) off_t nalu_size_with_start_code; 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!LocateNALU(&nalu_size_with_start_code, &start_code_size)) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "Could not find next NALU, bytes left in stream: " 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << bytes_left_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kEOStream; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nalu->data = stream_ + start_code_size; 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nalu->size = nalu_size_with_start_code - start_code_size; 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(4) << "NALU found: size=" << nalu_size_with_start_code; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize bit reader at the start of found NALU. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!br_.Initialize(nalu->data, nalu->size)) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kEOStream; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move parser state to after this NALU, so next time AdvanceToNextNALU 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is called, we will effectively be skipping it; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // other parsing functions will use the position saved 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in bit reader for parsing, so we don't have to remember it here. 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stream_ += nalu_size_with_start_code; 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bytes_left_ -= nalu_size_with_start_code; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read NALU header, skip the forbidden_zero_bit, but check for it. 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int data; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(1, &data); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(data == 0); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(2, &nalu->nal_ref_idc); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(5, &nalu->nal_unit_type); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "NALU type: " << static_cast<int>(nalu->nal_unit_type) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " at: " << reinterpret_cast<const void*>(nalu->data) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " size: " << nalu->size 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " ref: " << static_cast<int>(nalu->nal_ref_idc); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default scaling lists (per spec). 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDefault4x4Intra[kH264ScalingList4x4Length] = { 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42, }; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDefault4x4Inter[kH264ScalingList4x4Length] = { 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34, }; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDefault8x8Intra[kH264ScalingList8x8Length] = { 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23, 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31, 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42, }; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDefault8x8Inter[kH264ScalingList8x8Length] = { 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21, 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35, }; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void DefaultScalingList4x4( 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int scaling_list4x4[][kH264ScalingList4x4Length]) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(i, 6); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < 3) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list4x4[i], kDefault4x4Intra, sizeof(kDefault4x4Intra)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (i < 6) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list4x4[i], kDefault4x4Inter, sizeof(kDefault4x4Inter)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void DefaultScalingList8x8( 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int scaling_list8x8[][kH264ScalingList8x8Length]) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(i, 6); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i % 2 == 0) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list8x8[i], kDefault8x8Intra, sizeof(kDefault8x8Intra)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list8x8[i], kDefault8x8Inter, sizeof(kDefault8x8Inter)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void FallbackScalingList4x4( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int default_scaling_list_intra[], 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int default_scaling_list_inter[], 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int scaling_list4x4[][kH264ScalingList4x4Length]) { 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const int kScalingList4x4ByteSize = 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sizeof(scaling_list4x4[0][0]) * kH264ScalingList4x4Length; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (i) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list4x4[i], default_scaling_list_intra, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScalingList4x4ByteSize); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list4x4[i], scaling_list4x4[0], kScalingList4x4ByteSize); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list4x4[i], scaling_list4x4[1], kScalingList4x4ByteSize); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list4x4[i], default_scaling_list_inter, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScalingList4x4ByteSize); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4: 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list4x4[i], scaling_list4x4[3], kScalingList4x4ByteSize); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 5: 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list4x4[i], scaling_list4x4[4], kScalingList4x4ByteSize); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void FallbackScalingList8x8( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int default_scaling_list_intra[], 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int default_scaling_list_inter[], 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int scaling_list8x8[][kH264ScalingList8x8Length]) { 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const int kScalingList8x8ByteSize = 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sizeof(scaling_list8x8[0][0]) * kH264ScalingList8x8Length; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (i) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list8x8[i], default_scaling_list_intra, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScalingList8x8ByteSize); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scaling_list8x8[i], default_scaling_list_inter, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScalingList8x8ByteSize); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list8x8[i], scaling_list8x8[0], kScalingList8x8ByteSize); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list8x8[i], scaling_list8x8[1], kScalingList8x8ByteSize); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4: 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list8x8[i], scaling_list8x8[2], kScalingList8x8ByteSize); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 5: 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memcpy(scaling_list8x8[i], scaling_list8x8[3], kScalingList8x8ByteSize); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseScalingList(int size, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* scaling_list, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* use_default) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See chapter 7.3.2.1.1.1. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_scale = 8; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next_scale = 8; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_scale; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *use_default = false; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < size; ++j) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next_scale != 0) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&delta_scale); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(delta_scale, -128, 127); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_scale = (last_scale + delta_scale + 256) & 0xff; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (j == 0 && next_scale == 0) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *use_default = true; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scaling_list[j] = (next_scale == 0) ? last_scale : next_scale; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_scale = scaling_list[j]; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseSPSScalingLists(H264SPS* sps) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See 7.4.2.1.1. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool seq_scaling_list_present_flag; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_default; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse scaling_list4x4. 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 6; ++i) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (seq_scaling_list_present_flag) { 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) res = ParseScalingList(arraysize(sps->scaling_list4x4[i]), 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps->scaling_list4x4[i], 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &use_default); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_default) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultScalingList4x4(i, sps->scaling_list4x4); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FallbackScalingList4x4( 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i, kDefault4x4Intra, kDefault4x4Inter, sps->scaling_list4x4); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse scaling_list8x8. 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < ((sps->chroma_format_idc != 3) ? 2 : 6); ++i) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (seq_scaling_list_present_flag) { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) res = ParseScalingList(arraysize(sps->scaling_list8x8[i]), 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps->scaling_list8x8[i], 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &use_default); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_default) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultScalingList8x8(i, sps->scaling_list8x8); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FallbackScalingList8x8( 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i, kDefault8x8Intra, kDefault8x8Inter, sps->scaling_list8x8); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParsePPSScalingLists(const H264SPS& sps, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264PPS* pps) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See 7.4.2.2. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pic_scaling_list_present_flag; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_default; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 6; ++i) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pic_scaling_list_present_flag) { 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) res = ParseScalingList(arraysize(pps->scaling_list4x4[i]), 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pps->scaling_list4x4[i], 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &use_default); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_default) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultScalingList4x4(i, pps->scaling_list4x4); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps.seq_scaling_matrix_present_flag) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Table 7-2 fallback rule A in spec. 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FallbackScalingList4x4( 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i, kDefault4x4Intra, kDefault4x4Inter, pps->scaling_list4x4); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Table 7-2 fallback rule B in spec. 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FallbackScalingList4x4(i, 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps.scaling_list4x4[0], 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps.scaling_list4x4[3], 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pps->scaling_list4x4); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->transform_8x8_mode_flag) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < ((sps.chroma_format_idc != 3) ? 2 : 6); ++i) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pic_scaling_list_present_flag) { 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) res = ParseScalingList(arraysize(pps->scaling_list8x8[i]), 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pps->scaling_list8x8[i], 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &use_default); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_default) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultScalingList8x8(i, pps->scaling_list8x8); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps.seq_scaling_matrix_present_flag) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Table 7-2 fallback rule A in spec. 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FallbackScalingList8x8( 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i, kDefault8x8Intra, kDefault8x8Inter, pps->scaling_list8x8); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Table 7-2 fallback rule B in spec. 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FallbackScalingList8x8(i, 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps.scaling_list8x8[0], 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps.scaling_list8x8[1], 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pps->scaling_list8x8); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)H264Parser::Result H264Parser::ParseAndIgnoreHRDParameters( 637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* hrd_parameters_present) { 638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int data; 639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // {nal,vcl}_hrd_parameters_present_flag 640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!data) 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kOk; 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *hrd_parameters_present = true; 644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int cpb_cnt_minus1; 646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&cpb_cnt_minus1); 647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IN_RANGE_OR_RETURN(cpb_cnt_minus1, 0, 31); 648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(8, &data); // bit_rate_scale, cpb_size_scale 649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = 0; i <= cpb_cnt_minus1; ++i) { 650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // bit_rate_value_minus1[i] 651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // cpb_size_value_minus1[i] 652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // cbr_flag 653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(20, &data); // cpb/dpb delays, etc. 655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kOk; 657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)H264Parser::Result H264Parser::ParseVUIParameters(H264SPS* sps) { 660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool aspect_ratio_info_present_flag; 661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&aspect_ratio_info_present_flag); 662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (aspect_ratio_info_present_flag) { 663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int aspect_ratio_idc; 664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(8, &aspect_ratio_idc); 665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (aspect_ratio_idc == H264SPS::kExtendedSar) { 666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(16, &sps->sar_width); 667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(16, &sps->sar_height); 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const int max_aspect_ratio_idc = arraysize(kTableSarWidth) - 1; 670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IN_RANGE_OR_RETURN(aspect_ratio_idc, 0, max_aspect_ratio_idc); 671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sps->sar_width = kTableSarWidth[aspect_ratio_idc]; 672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sps->sar_height = kTableSarHeight[aspect_ratio_idc]; 673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int data; 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Read and ignore overscan and video signal type info. 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // overscan_info_present_flag 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data) 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // overscan_appropriate_flag 681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // video_signal_type_present_flag 683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data) { 684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(3, &data); // video_format 685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // video_full_range_flag 686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // colour_description_present_flag 687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data) 688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(24, &data); // color description syntax elements 689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // chroma_loc_info_present_flag 692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data) { 693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // chroma_sample_loc_type_top_field 694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // chroma_sample_loc_type_bottom_field 695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Read and ignore timing info. 698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // timing_info_present_flag 699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data) { 700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(16, &data); // num_units_in_tick 701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(16, &data); // num_units_in_tick 702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(16, &data); // time_scale 703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(16, &data); // time_scale 704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // fixed_frame_rate_flag 705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Read and ignore NAL HRD parameters, if present. 708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool hrd_parameters_present = false; 709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Result res = ParseAndIgnoreHRDParameters(&hrd_parameters_present); 710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (res != kOk) 711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return res; 712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Read and ignore VCL HRD parameters, if present. 714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) res = ParseAndIgnoreHRDParameters(&hrd_parameters_present); 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (res != kOk) 716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return res; 717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (hrd_parameters_present) // One of NAL or VCL params present is enough. 719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // low_delay_hrd_flag 720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // pic_struct_present_flag 722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->bitstream_restriction_flag); 723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (sps->bitstream_restriction_flag) { 724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&data); // motion_vectors_over_pic_boundaries_flag 725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // max_bytes_per_pic_denom 726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // max_bits_per_mb_denom 727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // log2_max_mv_length_horizontal 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&data); // log2_max_mv_length_vertical 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&sps->max_num_reorder_frames); 730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_UE_OR_RETURN(&sps->max_dec_frame_buffering); 731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRUE_OR_RETURN(sps->max_dec_frame_buffering >= sps->max_num_ref_frames); 732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IN_RANGE_OR_RETURN( 733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sps->max_num_reorder_frames, 0, sps->max_dec_frame_buffering); 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kOk; 737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void FillDefaultSeqScalingLists(H264SPS* sps) { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 6; ++i) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < kH264ScalingList4x4Length; ++j) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->scaling_list4x4[i][j] = 16; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 6; ++i) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < kH264ScalingList8x8Length; ++j) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->scaling_list8x8[i][j] = 16; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseSPS(int* sps_id) { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See 7.4.2.1. 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *sps_id = -1; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<H264SPS> sps(new H264SPS()); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(8, &sps->profile_idc); 759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->constraint_set0_flag); 760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->constraint_set1_flag); 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->constraint_set2_flag); 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->constraint_set3_flag); 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->constraint_set4_flag); 764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->constraint_set5_flag); 765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) READ_BITS_OR_RETURN(2, &data); // reserved_zero_2bits 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(8, &sps->level_idc); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->seq_parameter_set_id); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->seq_parameter_set_id < 32); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->profile_idc == 100 || sps->profile_idc == 110 || 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->profile_idc == 122 || sps->profile_idc == 244 || 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps->profile_idc == 44 || sps->profile_idc == 83 || 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sps->profile_idc == 86 || sps->profile_idc == 118 || 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->profile_idc == 128) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->chroma_format_idc); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->chroma_format_idc < 4); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->chroma_format_idc == 3) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->separate_colour_plane_flag); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->bit_depth_luma_minus8); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->bit_depth_luma_minus8 < 7); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->bit_depth_chroma_minus8); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->bit_depth_chroma_minus8 < 7); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->qpprime_y_zero_transform_bypass_flag); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->seq_scaling_matrix_present_flag); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->seq_scaling_matrix_present_flag) { 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "Scaling matrix present"; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParseSPSScalingLists(sps.get()); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillDefaultSeqScalingLists(sps.get()); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->chroma_format_idc = 1; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillDefaultSeqScalingLists(sps.get()); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->separate_colour_plane_flag) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->chroma_array_type = 0; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->chroma_array_type = sps->chroma_format_idc; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->log2_max_frame_num_minus4); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->log2_max_frame_num_minus4 < 13); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->pic_order_cnt_type); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->pic_order_cnt_type < 3); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->expected_delta_per_pic_order_cnt_cycle = 0; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->pic_order_cnt_type == 0) { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->log2_max_pic_order_cnt_lsb_minus4); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 < 13); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (sps->pic_order_cnt_type == 1) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->delta_pic_order_always_zero_flag); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&sps->offset_for_non_ref_pic); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&sps->offset_for_top_to_bottom_field); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->num_ref_frames_in_pic_order_cnt_cycle); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps->num_ref_frames_in_pic_order_cnt_cycle < 255); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&sps->offset_for_ref_frame[i]); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->expected_delta_per_pic_order_cnt_cycle += 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps->offset_for_ref_frame[i]; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->max_num_ref_frames); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->gaps_in_frame_num_value_allowed_flag); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->gaps_in_frame_num_value_allowed_flag) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->pic_width_in_mbs_minus1); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->pic_height_in_map_units_minus1); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->frame_mbs_only_flag); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sps->frame_mbs_only_flag) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->mb_adaptive_frame_field_flag); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->direct_8x8_inference_flag); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->frame_cropping_flag); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->frame_cropping_flag) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->frame_crop_left_offset); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->frame_crop_right_offset); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->frame_crop_top_offset); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sps->frame_crop_bottom_offset); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sps->vui_parameters_present_flag); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->vui_parameters_present_flag) { 857a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DVLOG(4) << "VUI parameters present"; 858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) res = ParseVUIParameters(sps.get()); 859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (res != kOk) 860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return res; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If an SPS with the same id already exists, replace it. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *sps_id = sps->seq_parameter_set_id; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete active_SPSes_[*sps_id]; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_SPSes_[*sps_id] = sps.release(); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParsePPS(int* pps_id) { 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See 7.4.2.2. 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const H264SPS* sps; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pps_id = -1; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<H264PPS> pps(new H264PPS()); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pps->pic_parameter_set_id); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pps->seq_parameter_set_id); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(pps->seq_parameter_set_id < 32); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps = GetSPS(pps->seq_parameter_set_id); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->entropy_coding_mode_flag); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->bottom_field_pic_order_in_frame_present_flag); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pps->num_slice_groups_minus1); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->num_slice_groups_minus1 > 1) { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Slice groups not supported"; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pps->num_ref_idx_l0_default_active_minus1); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(pps->num_ref_idx_l0_default_active_minus1 < 32); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pps->num_ref_idx_l1_default_active_minus1); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(pps->num_ref_idx_l1_default_active_minus1 < 32); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->weighted_pred_flag); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(2, &pps->weighted_bipred_idc); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(pps->weighted_bipred_idc < 3); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&pps->pic_init_qp_minus26); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(pps->pic_init_qp_minus26, -26, 25); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&pps->pic_init_qs_minus26); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(pps->pic_init_qs_minus26, -26, 25); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&pps->chroma_qp_index_offset); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(pps->chroma_qp_index_offset, -12, 12); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pps->second_chroma_qp_index_offset = pps->chroma_qp_index_offset; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->deblocking_filter_control_present_flag); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->constrained_intra_pred_flag); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->redundant_pic_cnt_present_flag); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (br_.HasMoreRBSPData()) { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->transform_8x8_mode_flag); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&pps->pic_scaling_matrix_present_flag); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->pic_scaling_matrix_present_flag) { 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "Picture scaling matrix present"; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParsePPSScalingLists(*sps, pps.get()); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&pps->second_chroma_qp_index_offset); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a PPS with the same id already exists, replace it. 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pps_id = pps->pic_parameter_set_id; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete active_PPSes_[*pps_id]; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_PPSes_[*pps_id] = pps.release(); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseRefPicListModification( 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_ref_idx_active_minus1, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264ModificationOfPicNum* ref_list_mods) { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264ModificationOfPicNum* pic_num_mod; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_ref_idx_active_minus1 >= 32) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kInvalidStream; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 32; ++i) { 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pic_num_mod = &ref_list_mods[i]; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pic_num_mod->modification_of_pic_nums_idc); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(pic_num_mod->modification_of_pic_nums_idc < 4); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pic_num_mod->modification_of_pic_nums_idc) { 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pic_num_mod->abs_diff_pic_num_minus1); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&pic_num_mod->long_term_pic_num); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Per spec, list cannot be empty. 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == 0) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kInvalidStream; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kInvalidStream; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we got here, we didn't get loop end marker prematurely, 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so make sure it is there for our client. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int modification_of_pic_nums_idc; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&modification_of_pic_nums_idc); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(modification_of_pic_nums_idc == 3); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseRefPicListModifications( 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264SliceHeader* shdr) { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shdr->IsISlice() && !shdr->IsSISlice()) { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l0); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->ref_pic_list_modification_flag_l0) { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParseRefPicListModification(shdr->num_ref_idx_l0_active_minus1, 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->ref_list_l0_modifications); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsBSlice()) { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l1); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->ref_pic_list_modification_flag_l1) { 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParseRefPicListModification(shdr->num_ref_idx_l1_active_minus1, 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->ref_list_l1_modifications); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseWeightingFactors( 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_ref_idx_active_minus1, 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int chroma_array_type, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int luma_log2_weight_denom, 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int chroma_log2_weight_denom, 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264WeightingFactors* w_facts) { 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int def_luma_weight = 1 << luma_log2_weight_denom; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int def_chroma_weight = 1 << chroma_log2_weight_denom; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_ref_idx_active_minus1 + 1; ++i) { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&w_facts->luma_weight_flag); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (w_facts->luma_weight_flag) { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&w_facts->luma_weight[i]); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(w_facts->luma_weight[i], -128, 127); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&w_facts->luma_offset[i]); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(w_facts->luma_offset[i], -128, 127); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w_facts->luma_weight[i] = def_luma_weight; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w_facts->luma_offset[i] = 0; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chroma_array_type != 0) { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&w_facts->chroma_weight_flag); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (w_facts->chroma_weight_flag) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < 2; ++j) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&w_facts->chroma_weight[i][j]); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(w_facts->chroma_weight[i][j], -128, 127); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&w_facts->chroma_offset[i][j]); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(w_facts->chroma_offset[i][j], -128, 127); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < 2; ++j) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w_facts->chroma_weight[i][j] = def_chroma_weight; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w_facts->chroma_offset[i][j] = 0; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParsePredWeightTable(const H264SPS& sps, 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264SliceHeader* shdr) { 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->luma_log2_weight_denom); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->luma_log2_weight_denom < 8); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps.chroma_array_type != 0) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->chroma_log2_weight_denom); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->chroma_log2_weight_denom < 8); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res = ParseWeightingFactors(shdr->num_ref_idx_l0_active_minus1, 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps.chroma_array_type, 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->luma_log2_weight_denom, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->chroma_log2_weight_denom, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &shdr->pred_weight_table_l0); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsBSlice()) { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParseWeightingFactors(shdr->num_ref_idx_l1_active_minus1, 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps.chroma_array_type, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->luma_log2_weight_denom, 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->chroma_log2_weight_denom, 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &shdr->pred_weight_table_l1); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)H264Parser::Result H264Parser::ParseDecRefPicMarking(H264SliceHeader* shdr) { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->idr_pic_flag) { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->no_output_of_prior_pics_flag); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->long_term_reference_flag); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->adaptive_ref_pic_marking_mode_flag); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264DecRefPicMarking* marking; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->adaptive_ref_pic_marking_mode_flag) { 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t i; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < arraysize(shdr->ref_pic_marking); ++i) { 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) marking = &shdr->ref_pic_marking[i]; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&marking->memory_mgmnt_control_operation); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (marking->memory_mgmnt_control_operation == 0) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (marking->memory_mgmnt_control_operation == 1 || 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) marking->memory_mgmnt_control_operation == 3) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&marking->difference_of_pic_nums_minus1); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (marking->memory_mgmnt_control_operation == 2) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&marking->long_term_pic_num); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (marking->memory_mgmnt_control_operation == 3 || 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) marking->memory_mgmnt_control_operation == 6) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&marking->long_term_frame_idx); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (marking->memory_mgmnt_control_operation == 4) 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&marking->max_long_term_frame_idx_plus1); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (marking->memory_mgmnt_control_operation > 6) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kInvalidStream; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == arraysize(shdr->ref_pic_marking)) { 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Ran out of dec ref pic marking fields"; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseSliceHeader(const H264NALU& nalu, 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264SliceHeader* shdr) { 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See 7.4.3. 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const H264SPS* sps; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const H264PPS* pps; 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result res; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(shdr, 0, sizeof(*shdr)); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->idr_pic_flag = (nalu.nal_unit_type == 5); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->nal_ref_idc = nalu.nal_ref_idc; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->nalu_data = nalu.data; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->nalu_size = nalu.size; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->first_mb_in_slice); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->slice_type); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->slice_type < 10); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->pic_parameter_set_id); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pps = GetPPS(shdr->pic_parameter_set_id); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(pps); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sps = GetSPS(pps->seq_parameter_set_id); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(sps); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->separate_colour_plane_flag) { 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Interlaced streams not supported"; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) READ_BITS_OR_RETURN(sps->log2_max_frame_num_minus4 + 4, &shdr->frame_num); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sps->frame_mbs_only_flag) { 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->field_pic_flag); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->field_pic_flag) { 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Interlaced streams not supported"; 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->idr_pic_flag) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->idr_pic_id); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->pic_order_cnt_type == 0) { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &shdr->pic_order_cnt_lsb); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->bottom_field_pic_order_in_frame_present_flag && 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !shdr->field_pic_flag) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt_bottom); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sps->pic_order_cnt_type == 1 && !sps->delta_pic_order_always_zero_flag) { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[0]); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->bottom_field_pic_order_in_frame_present_flag && 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !shdr->field_pic_flag) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt[1]); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->redundant_pic_cnt_present_flag) { 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->redundant_pic_cnt); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->redundant_pic_cnt < 128); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsBSlice()) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->direct_spatial_mv_pred_flag); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsPSlice() || shdr->IsSPSlice() || shdr->IsBSlice()) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->num_ref_idx_active_override_flag); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->num_ref_idx_active_override_flag) { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->num_ref_idx_l0_active_minus1); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsBSlice()) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->num_ref_idx_l1_active_minus1); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->num_ref_idx_l0_active_minus1 = 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pps->num_ref_idx_l0_default_active_minus1; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsBSlice()) { 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shdr->num_ref_idx_l1_active_minus1 = 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pps->num_ref_idx_l1_default_active_minus1; 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->field_pic_flag) { 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 32); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 32); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 16); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 16); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nalu.nal_unit_type == H264NALU::kCodedSliceExtension) { 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParseRefPicListModifications(shdr); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pps->weighted_pred_flag && (shdr->IsPSlice() || shdr->IsSPSlice())) || 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pps->weighted_bipred_idc == 1 && shdr->IsBSlice())) { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParsePredWeightTable(*sps, shdr); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nalu.nal_ref_idc != 0) { 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = ParseDecRefPicMarking(shdr); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != kOk) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (pps->entropy_coding_mode_flag && !shdr->IsISlice() && 12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !shdr->IsSISlice()) { 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->cabac_init_idc); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->cabac_init_idc < 3); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->slice_qp_delta); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsSPSlice() || shdr->IsSISlice()) { 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->IsSPSlice()) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&shdr->sp_for_switch_flag); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->slice_qs_delta); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->deblocking_filter_control_present_flag) { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&shdr->disable_deblocking_filter_idc); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE_OR_RETURN(shdr->disable_deblocking_filter_idc < 3); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shdr->disable_deblocking_filter_idc != 1) { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->slice_alpha_c0_offset_div2); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(shdr->slice_alpha_c0_offset_div2, -6, 6); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_SE_OR_RETURN(&shdr->slice_beta_offset_div2); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN_RANGE_OR_RETURN(shdr->slice_beta_offset_div2, -6, 6); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pps->num_slice_groups_minus1 > 0) { 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Slice groups not supported"; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnsupportedStream; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t epb = br_.NumEmulationPreventionBytesRead(); 12754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shdr->header_bit_size = (shdr->nalu_size - epb) * 8 - br_.NumBitsLeft(); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Parser::Result H264Parser::ParseSEI(H264SEIMessage* sei_msg) { 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int byte; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(sei_msg, 0, sizeof(*sei_msg)); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(8, &byte); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (byte == 0xff) { 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sei_msg->type += 255; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(8, &byte); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sei_msg->type += byte; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(8, &byte); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (byte == 0xff) { 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sei_msg->payload_size += 255; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BITS_OR_RETURN(8, &byte); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sei_msg->payload_size += byte; 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "Found SEI message type: " << sei_msg->type 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " payload size: " << sei_msg->payload_size; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (sei_msg->type) { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case H264SEIMessage::kSEIRecoveryPoint: 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_UE_OR_RETURN(&sei_msg->recovery_point.recovery_frame_cnt); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sei_msg->recovery_point.exact_match_flag); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_BOOL_OR_RETURN(&sei_msg->recovery_point.broken_link_flag); 13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) READ_BITS_OR_RETURN(2, &sei_msg->recovery_point.changing_slice_group_idc); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(4) << "Unsupported SEI message"; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kOk; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 1319