diff options
-rw-r--r-- | Changelog | 2 | ||||
-rw-r--r-- | libavcodec/Makefile | 2 | ||||
-rw-r--r-- | libavcodec/libdcadec.c | 14 |
3 files changed, 14 insertions, 4 deletions
@@ -6,7 +6,7 @@ version <next>: - TDSC decoder - DTS lossless extension (XLL) decoding (not lossless, disabled by default) - showwavespic filter -- libdcadec wrapper +- DTS decoding through libdcadec - Drop support for nvenc API before 5.0 - nvenc H265 encoder - Detelecine filter diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 91a40ad049..6aa0208d4f 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -736,7 +736,7 @@ OBJS-$(CONFIG_ELBG_FILTER) += elbg.o # external codec libraries OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o -OBJS-$(CONFIG_LIBDCADEC_DECODER) += libdcadec.o +OBJS-$(CONFIG_LIBDCADEC_DECODER) += libdcadec.o dca.o OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o OBJS-$(CONFIG_LIBFDK_AAC_DECODER) += libfdk-aacdec.o OBJS-$(CONFIG_LIBFDK_AAC_ENCODER) += libfdk-aacenc.o diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c index a28b983f7e..6e8926258d 100644 --- a/libavcodec/libdcadec.c +++ b/libavcodec/libdcadec.c @@ -25,6 +25,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/common.h" #include "libavutil/opt.h" + #include "avcodec.h" #include "dca.h" #include "dca_syncwords.h" @@ -48,6 +49,10 @@ static int dcadec_decode_frame(AVCodecContext *avctx, void *data, int input_size = avpkt->size; /* convert bytestream syntax to RAW BE format if required */ + if (input_size < 8) { + av_log(avctx, AV_LOG_ERROR, "Input size too small\n"); + return AVERROR_INVALIDDATA; + } mrk = AV_RB32(input); if (mrk != DCA_SYNCWORD_CORE_BE && mrk != DCA_SYNCWORD_SUBSTREAM) { s->buffer = av_fast_realloc(s->buffer, &s->buffer_size, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE); @@ -75,11 +80,16 @@ static int dcadec_decode_frame(AVCodecContext *avctx, void *data, avctx->channel_layout = channel_mask; avctx->sample_rate = sample_rate; - av_assert0(bits_per_sample >= 16 && bits_per_sample <= 24); + av_assert0(bits_per_sample >= 16); if (bits_per_sample == 16) avctx->sample_fmt = AV_SAMPLE_FMT_S16P; - else + else if (bits_per_sample <= 24) avctx->sample_fmt = AV_SAMPLE_FMT_S32P; + else { + av_log(avctx, AV_LOG_ERROR, "Unsupported number of bits per sample: %d\n", + bits_per_sample); + return AVERROR(ENOSYS); + } avctx->bits_per_raw_sample = bits_per_sample; |