X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpeg12dec.c;h=c4d89e10cee3957f67a6ca46ecf125ac9a050226;hb=420cedd49745b284c35d97b936b71ff79b43bdf7;hp=1cccfd17421848304138d729387df0c9e0bd83ae;hpb=fe9bc1cc45e2bebba1efa7b9a20b0d66679bf2d5;p=ffmpeg diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 1cccfd17421..c4d89e10cee 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -31,7 +31,9 @@ #include "libavutil/attributes.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" +#include "libavutil/mem_internal.h" #include "libavutil/stereo3d.h" +#include "libavutil/video_enc_params.h" #include "avcodec.h" #include "bytestream.h" @@ -47,9 +49,10 @@ #include "mpegvideodata.h" #include "profiles.h" #include "thread.h" -#include "version.h" #include "xvmc_internal.h" +#define A53_MAX_CC_COUNT 2000 + typedef struct Mpeg1Context { MpegEncContext mpeg_enc_ctx; int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ @@ -490,8 +493,6 @@ static inline int mpeg2_decode_block_intra(MpegEncContext *s, component = (n & 1) + 1; } diff = decode_dc(&s->gb, component); - if (diff >= 0xffff) - return AVERROR_INVALIDDATA; dc = s->last_dc[component]; dc += diff; s->last_dc[component] = dc; @@ -577,8 +578,6 @@ static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, component = (n & 1) + 1; } diff = decode_dc(&s->gb, component); - if (diff >= 0xffff) - return AVERROR_INVALIDDATA; dc = s->last_dc[component]; dc += diff; s->last_dc[component] = dc; @@ -1052,15 +1051,11 @@ static av_cold int mpeg_decode_init(AVCodecContext *avctx) Mpeg1Context *s = avctx->priv_data; MpegEncContext *s2 = &s->mpeg_enc_ctx; - ff_mpv_decode_defaults(s2); - if ( avctx->codec_tag != AV_RL32("VCR2") && avctx->codec_tag != AV_RL32("BW10")) avctx->coded_width = avctx->coded_height = 0; // do not trust dimensions from input ff_mpv_decode_init(s2, avctx); - s->mpeg_enc_ctx.avctx = avctx; - /* we need some permutation to store matrices, * until the decoder sets the real permutation. */ ff_mpv_idct_init(s2); @@ -1071,7 +1066,6 @@ static av_cold int mpeg_decode_init(AVCodecContext *avctx) s->mpeg_enc_ctx_allocated = 0; s->mpeg_enc_ctx.picture_number = 0; s->repeat_field = 0; - s->mpeg_enc_ctx.codec_id = avctx->codec->id; avctx->color_range = AVCOL_RANGE_MPEG; return 0; } @@ -2244,7 +2238,7 @@ static int mpeg_decode_a53_cc(AVCodecContext *avctx, * UINT64_C(3)); int ret; - if (new_size > INT_MAX) + if (new_size > 3*A53_MAX_CC_COUNT) return AVERROR(EINVAL); ret = av_buffer_realloc(&s1->a53_buf_ref, new_size); @@ -2267,7 +2261,7 @@ static int mpeg_decode_a53_cc(AVCodecContext *avctx, int old_size = s1->a53_buf_ref ? s1->a53_buf_ref->size : 0; const uint64_t new_size = (old_size + cc_count * UINT64_C(3)); - if (new_size > INT_MAX) + if (new_size > 3*A53_MAX_CC_COUNT) return AVERROR(EINVAL); ret = av_buffer_realloc(&s1->a53_buf_ref, new_size); @@ -2337,7 +2331,7 @@ static int mpeg_decode_a53_cc(AVCodecContext *avctx, int old_size = s1->a53_buf_ref ? s1->a53_buf_ref->size : 0; const uint64_t new_size = (old_size + cc_count * UINT64_C(6)); - if (new_size > INT_MAX) + if (new_size > 3*A53_MAX_CC_COUNT) return AVERROR(EINVAL); ret = av_buffer_realloc(&s1->a53_buf_ref, new_size); @@ -2445,12 +2439,6 @@ static void mpeg_decode_gop(AVCodecContext *avctx, tc = s-> timecode_frame_start = get_bits(&s->gb, 25); -#if FF_API_PRIVATE_OPT -FF_DISABLE_DEPRECATION_WARNINGS - avctx->timecode_frame_start = tc; -FF_ENABLE_DEPRECATION_WARNINGS -#endif - s->closed_gop = get_bits1(&s->gb); /* broken_link indicates that after editing the * reference frames of the first B-Frames after GOP I-Frame @@ -2884,7 +2872,8 @@ static av_cold int mpeg_decode_end(AVCodecContext *avctx) { Mpeg1Context *s = avctx->priv_data; - ff_mpv_common_end(&s->mpeg_enc_ctx); + if (s->mpeg_enc_ctx_allocated) + ff_mpv_common_end(&s->mpeg_enc_ctx); av_buffer_unref(&s->a53_buf_ref); return 0; } @@ -2901,11 +2890,12 @@ AVCodec ff_mpeg1video_decoder = { .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS, - .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | + FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, .flush = flush, .max_lowres = 3, .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context), - .hw_configs = (const AVCodecHWConfigInternal*[]) { + .hw_configs = (const AVCodecHWConfigInternal *const []) { #if CONFIG_MPEG1_NVDEC_HWACCEL HWACCEL_NVDEC(mpeg1), #endif @@ -2934,11 +2924,12 @@ AVCodec ff_mpeg2video_decoder = { .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS, - .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | + FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, .flush = flush, .max_lowres = 3, .profiles = NULL_IF_CONFIG_SMALL(ff_mpeg2_video_profiles), - .hw_configs = (const AVCodecHWConfigInternal*[]) { + .hw_configs = (const AVCodecHWConfigInternal *const []) { #if CONFIG_MPEG2_DXVA2_HWACCEL HWACCEL_DXVA2(mpeg2), #endif @@ -2978,7 +2969,8 @@ AVCodec ff_mpegvideo_decoder = { .close = mpeg_decode_end, .decode = mpeg_decode_frame, .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS, - .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | + FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, .flush = flush, .max_lowres = 3, }; @@ -3098,9 +3090,7 @@ static av_cold int ipu_decode_init(AVCodecContext *avctx) avctx->pix_fmt = AV_PIX_FMT_YUV420P; - ff_mpv_decode_defaults(m); ff_mpv_decode_init(m, avctx); - s->m.avctx = avctx; ff_mpv_idct_init(m); ff_mpeg12_common_init(m); ff_mpeg12_init_vlcs(); @@ -3141,5 +3131,5 @@ AVCodec ff_ipu_decoder = { .decode = ipu_decode_frame, .close = ipu_decode_end, .capabilities = AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, };