summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog2
-rw-r--r--libavcodec/Makefile2
-rw-r--r--libavcodec/libdcadec.c14
3 files changed, 14 insertions, 4 deletions
diff --git a/Changelog b/Changelog
index dcddca479e..75da156607 100644
--- a/Changelog
+++ b/Changelog
@@ -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;