Relax requirement on reserved bits when parsing AVCC

Issue #44

Change-Id: I84235a4d94225e2bf1777443611ad19429b958d4
This commit is contained in:
KongQun Yang 2015-10-22 10:24:53 -07:00
parent e276a9de2d
commit 00ff04ffad
2 changed files with 5 additions and 19 deletions

View File

@ -32,25 +32,12 @@ bool ExtractResolutionFromDecoderConfig(const uint8_t* avc_decoder_config_data,
RCHECK(reader.Read1(&value));
RCHECK(value == 1);
// avc profile. No value check.
RCHECK(reader.Read1(&value));
// Skip avc profile, profile compatibility, avc level, and length size.
RCHECK(reader.SkipBytes(4));
// profile compatibility. No value check.
// Reserved and num sps.
RCHECK(reader.Read1(&value));
// avc level indication. No value check.
RCHECK(reader.Read1(&value));
// reserved and length sized minus one.
RCHECK(reader.Read1(&value));
// upper 6 bits are reserved and must be 111111.
RCHECK((value & 0xFC) == 0xFC);
// reserved and num sps.
RCHECK(reader.Read1(&value));
// upper 3 bits are reserved for 0b111.
RCHECK((value & 0xE0) == 0xE0);
const uint8_t num_sps = value & 0x1F;
if (num_sps < 1) {
LOG(ERROR) << "No SPS found.";

View File

@ -902,12 +902,11 @@ bool AVCDecoderConfigurationRecord::ParseData(BufferReader* reader) {
reader->Read1(&avc_level));
uint8_t length_size_minus_one;
RCHECK(reader->Read1(&length_size_minus_one) &&
(length_size_minus_one & 0xfc) == 0xfc);
RCHECK(reader->Read1(&length_size_minus_one));
length_size = (length_size_minus_one & 0x3) + 1;
uint8_t num_sps;
RCHECK(reader->Read1(&num_sps) && (num_sps & 0xe0) == 0xe0);
RCHECK(reader->Read1(&num_sps));
num_sps &= 0x1f;
sps_list.resize(num_sps);