Bug 1143516: Ignore SPS's aspect ratio if value is nonsensical. r=cpearce

This commit is contained in:
Jean-Yves Avenard 2015-03-17 16:42:02 +11:00
parent a34aebf3b8
commit a7306ad85c
3 changed files with 27 additions and 0 deletions

View File

@ -238,6 +238,7 @@ AVCCMediaDataDecoder::UpdateConfigFromExtraData(mp4_demuxer::ByteBuffer* aExtraD
mp4_demuxer::SPSData spsdata;
if (mp4_demuxer::H264::DecodeSPSFromExtraData(aExtraData, spsdata) &&
spsdata.pic_width > 0 && spsdata.pic_height > 0) {
mp4_demuxer::H264::EnsureSPSIsSane(spsdata);
mCurrentConfig.image_width = spsdata.pic_width;
mCurrentConfig.image_height = spsdata.pic_height;
mCurrentConfig.display_width = spsdata.display_width;

View File

@ -480,4 +480,27 @@ H264::DecodeSPSFromExtraData(const ByteBuffer* aExtraData, SPSData& aDest)
return DecodeSPS(sps, aDest);
}
/* static */ bool
H264::EnsureSPSIsSane(SPSData& aSPS)
{
bool valid = true;
static const float default_aspect = 4.0f / 3.0f;
if (aSPS.sample_ratio <= 0.0f || aSPS.sample_ratio > 6.0f) {
if (aSPS.pic_width && aSPS.pic_height) {
aSPS.sample_ratio =
(float) aSPS.pic_width / (float) aSPS.pic_height;
} else {
aSPS.sample_ratio = default_aspect;
}
aSPS.display_width = aSPS.pic_width;
aSPS.display_height = aSPS.pic_height;
valid = false;
}
if (aSPS.max_num_ref_frames > 16) {
aSPS.max_num_ref_frames = 16;
valid = false;
}
return valid;
}
} // namespace mp4_demuxer

View File

@ -325,6 +325,9 @@ public:
static already_AddRefed<ByteBuffer> DecodeNALUnit(const ByteBuffer* aNAL);
/* Decode SPS NAL RBSP and fill SPSData structure */
static bool DecodeSPS(const ByteBuffer* aSPS, SPSData& aDest);
// Ensure that SPS data makes sense, Return true if SPS data was, and false
// otherwise. If false, then content will be adjusted accordingly.
static bool EnsureSPSIsSane(SPSData& aSPS);
private:
static void vui_parameters(BitReader& aBr, SPSData& aDest);