X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdiracdec.c;h=30a5b1340b784b57c17d1689019f39c390c6569a;hb=a247ac640df3da573cd661065bf53f37863e2b46;hp=7b9e0099dfc992afba5d1ab9f6d6d2356951aef0;hpb=a99ffb5bb4454c625748972d9389cfaa5433a342;p=ffmpeg diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index 7b9e0099dfc..30a5b1340b7 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -26,6 +26,7 @@ * @author Marco Gerards , David Conrad, Jordi Ortiz */ +#include "libavutil/mem_internal.h" #include "libavutil/pixdesc.h" #include "libavutil/thread.h" #include "avcodec.h" @@ -136,7 +137,6 @@ typedef struct DiracContext { MpegvideoEncDSPContext mpvencdsp; VideoDSPContext vdsp; DiracDSPContext diracdsp; - DiracGolombLUT *reader_ctx; DiracVersionInfo version; GetBitContext gb; AVDiracSeqHeader seq; @@ -395,7 +395,6 @@ static av_cold int dirac_decode_init(AVCodecContext *avctx) s->threads_num_buf = -1; s->thread_buf_size = -1; - ff_dirac_golomb_reader_init(&s->reader_ctx); ff_diracdsp_init(&s->diracdsp); ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx); ff_videodsp_init(&s->vdsp, 8); @@ -428,8 +427,6 @@ static av_cold int dirac_decode_end(AVCodecContext *avctx) DiracContext *s = avctx->priv_data; int i; - ff_dirac_golomb_reader_end(&s->reader_ctx); - dirac_decode_flush(avctx); for (i = 0; i < MAX_FRAMES; i++) av_frame_free(&s->all_frames[i].avframe); @@ -881,11 +878,11 @@ static int decode_hq_slice(DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf) coef_num = subband_coeffs(s, slice->slice_x, slice->slice_y, i, coeffs_num); if (s->pshift) - coef_par = ff_dirac_golomb_read_32bit(s->reader_ctx, addr, - length, tmp_buf, coef_num); + coef_par = ff_dirac_golomb_read_32bit(addr, length, + tmp_buf, coef_num); else - coef_par = ff_dirac_golomb_read_16bit(s->reader_ctx, addr, - length, tmp_buf, coef_num); + coef_par = ff_dirac_golomb_read_16bit(addr, length, + tmp_buf, coef_num); if (coef_num > coef_par) { const int start_b = coef_par * (1 << (s->pshift + 1)); @@ -1276,7 +1273,9 @@ static int dirac_unpack_idwt_params(DiracContext *s) s->num_y = get_interleaved_ue_golomb(gb); if (s->num_x * s->num_y == 0 || s->num_x * (uint64_t)s->num_y > INT_MAX || s->num_x * (uint64_t)s->avctx->width > INT_MAX || - s->num_y * (uint64_t)s->avctx->height > INT_MAX + s->num_y * (uint64_t)s->avctx->height > INT_MAX || + s->num_x > s->avctx->width || + s->num_y > s->avctx->height ) { av_log(s->avctx,AV_LOG_ERROR,"Invalid numx/y\n"); s->num_x = s->num_y = 0; @@ -2356,7 +2355,7 @@ static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return buf_idx; } -AVCodec ff_dirac_decoder = { +const AVCodec ff_dirac_decoder = { .name = "dirac", .long_name = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"), .type = AVMEDIA_TYPE_VIDEO,