mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1143516: Ignore SPS's aspect ratio if value is nonsensical. r=cpearce
This commit is contained in:
parent
a34aebf3b8
commit
a7306ad85c
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user