|
|
|
@@ -1980,15 +1980,15 @@ static int mpeg4_decode_gop_header(MpegEncContext *s, GetBitContext *gb) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int mpeg4_decode_profile_level(MpegEncContext *s, GetBitContext *gb) |
|
|
|
static int mpeg4_decode_profile_level(MpegEncContext *s, GetBitContext *gb, int *profile, int *level) |
|
|
|
{ |
|
|
|
|
|
|
|
s->avctx->profile = get_bits(gb, 4); |
|
|
|
s->avctx->level = get_bits(gb, 4); |
|
|
|
*profile = get_bits(gb, 4); |
|
|
|
*level = get_bits(gb, 4); |
|
|
|
|
|
|
|
// for Simple profile, level 0 |
|
|
|
if (s->avctx->profile == 0 && s->avctx->level == 8) { |
|
|
|
s->avctx->level = 0; |
|
|
|
if (*profile == 0 && *level == 8) { |
|
|
|
*level = 0; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
@@ -3211,13 +3211,19 @@ int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb) |
|
|
|
} else if (startcode == GOP_STARTCODE) { |
|
|
|
mpeg4_decode_gop_header(s, gb); |
|
|
|
} else if (startcode == VOS_STARTCODE) { |
|
|
|
mpeg4_decode_profile_level(s, gb); |
|
|
|
if (s->avctx->profile == FF_PROFILE_MPEG4_SIMPLE_STUDIO && |
|
|
|
(s->avctx->level > 0 && s->avctx->level < 9)) { |
|
|
|
int profile, level; |
|
|
|
mpeg4_decode_profile_level(s, gb, &profile, &level); |
|
|
|
if (profile == FF_PROFILE_MPEG4_SIMPLE_STUDIO && |
|
|
|
(level > 0 && level < 9)) { |
|
|
|
s->studio_profile = 1; |
|
|
|
next_start_code_studio(gb); |
|
|
|
extension_and_user_data(s, gb, 0); |
|
|
|
} else if (s->studio_profile) { |
|
|
|
avpriv_request_sample(s->avctx, "Mixes studio and non studio profile\n"); |
|
|
|
return AVERROR_PATCHWELCOME; |
|
|
|
} |
|
|
|
s->avctx->profile = profile; |
|
|
|
s->avctx->level = level; |
|
|
|
} else if (startcode == VISUAL_OBJ_STARTCODE) { |
|
|
|
if (s->studio_profile) { |
|
|
|
if ((ret = decode_studiovisualobject(ctx, gb)) < 0) |
|
|
|
@@ -3238,6 +3244,7 @@ end: |
|
|
|
s->avctx->has_b_frames = !s->low_delay; |
|
|
|
|
|
|
|
if (s->studio_profile) { |
|
|
|
av_assert0(s->avctx->profile == FF_PROFILE_MPEG4_SIMPLE_STUDIO); |
|
|
|
if (!s->avctx->bits_per_raw_sample) { |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Missing VOL header\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|