From 664eb77dc3cb63dcb82d27d62540058a78bdab48 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 27 Oct 2011 13:28:33 -0400 Subject: cin audio: remove unneeded AVCodecContext pointer from CinAudioContext --- libavcodec/dsicinav.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'libavcodec/dsicinav.c') diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index 3b545e7b8f..953d232d9b 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -43,7 +43,6 @@ typedef struct CinVideoContext { } CinVideoContext; typedef struct CinAudioContext { - AVCodecContext *avctx; int initial_decode_frame; int delta; } CinAudioContext; @@ -308,7 +307,6 @@ static av_cold int cinaudio_decode_init(AVCodecContext *avctx) { CinAudioContext *cin = avctx->priv_data; - cin->avctx = avctx; cin->initial_decode_frame = 1; cin->delta = 0; avctx->sample_fmt = AV_SAMPLE_FMT_S16; -- cgit v1.2.3 From 03381c12b3a45200918dea877e970c5705f7cf5a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 27 Oct 2011 13:33:57 -0400 Subject: cin audio: validate the channel count --- libavcodec/dsicinav.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'libavcodec/dsicinav.c') diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index 953d232d9b..832efab056 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -307,6 +307,11 @@ static av_cold int cinaudio_decode_init(AVCodecContext *avctx) { CinAudioContext *cin = avctx->priv_data; + if (avctx->channels != 1) { + av_log_ask_for_sample(avctx, "Number of channels is not supported\n"); + return AVERROR_PATCHWELCOME; + } + cin->initial_decode_frame = 1; cin->delta = 0; avctx->sample_fmt = AV_SAMPLE_FMT_S16; -- cgit v1.2.3 From 64e19ba48b6240828680a0a1cc506bdba7d98ad7 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 27 Oct 2011 13:35:25 -0400 Subject: cin audio: remove unneeded cast from void* --- libavcodec/dsicinav.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libavcodec/dsicinav.c') diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index 832efab056..cafcaa7719 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -327,7 +327,7 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, int buf_size = avpkt->size; CinAudioContext *cin = avctx->priv_data; const uint8_t *src = buf; - int16_t *samples = (int16_t *)data; + int16_t *samples = data; buf_size = FFMIN(buf_size, *data_size/2); -- cgit v1.2.3 From 859bdc33e4c7b0bbb7a549df484b99e341dec074 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 27 Oct 2011 13:41:02 -0400 Subject: cin audio: use local variable for delta value --- libavcodec/dsicinav.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'libavcodec/dsicinav.c') diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index cafcaa7719..245b569433 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -328,21 +328,24 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, CinAudioContext *cin = avctx->priv_data; const uint8_t *src = buf; int16_t *samples = data; + int delta; buf_size = FFMIN(buf_size, *data_size/2); + delta = cin->delta; if (cin->initial_decode_frame) { cin->initial_decode_frame = 0; - cin->delta = (int16_t)AV_RL16(src); src += 2; - *samples++ = cin->delta; + delta = (int16_t)AV_RL16(src); src += 2; + *samples++ = delta; buf_size -= 2; } while (buf_size > 0) { - cin->delta += cinaudio_delta16_table[*src++]; - cin->delta = av_clip_int16(cin->delta); - *samples++ = cin->delta; + delta += cinaudio_delta16_table[*src++]; + delta = av_clip_int16(delta); + *samples++ = delta; --buf_size; } + cin->delta = delta; *data_size = (uint8_t *)samples - (uint8_t *)data; -- cgit v1.2.3 From 405af431040a57c630716b3940d7240021e8b80c Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 27 Oct 2011 13:50:02 -0400 Subject: cin audio: restructure decoding loop to avoid a separate counter variable Also check output buffer size instead of truncating output. --- libavcodec/dsicinav.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'libavcodec/dsicinav.c') diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index 245b569433..a6a4ff1c6e 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -324,32 +324,35 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; - int buf_size = avpkt->size; CinAudioContext *cin = avctx->priv_data; - const uint8_t *src = buf; + const uint8_t *buf_end = buf + avpkt->size; int16_t *samples = data; - int delta; + int delta, out_size; - buf_size = FFMIN(buf_size, *data_size/2); + out_size = (avpkt->size - cin->initial_decode_frame) * + av_get_bytes_per_sample(avctx->sample_fmt); + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); + return AVERROR(EINVAL); + } delta = cin->delta; if (cin->initial_decode_frame) { cin->initial_decode_frame = 0; - delta = (int16_t)AV_RL16(src); src += 2; + delta = (int16_t)AV_RL16(buf); + buf += 2; *samples++ = delta; - buf_size -= 2; } - while (buf_size > 0) { - delta += cinaudio_delta16_table[*src++]; + while (buf < buf_end) { + delta += cinaudio_delta16_table[*buf++]; delta = av_clip_int16(delta); *samples++ = delta; - --buf_size; } cin->delta = delta; - *data_size = (uint8_t *)samples - (uint8_t *)data; + *data_size = out_size; - return src - buf; + return avpkt->size; } -- cgit v1.2.3 From 7d1b17b83330aefe2f32a66fe84effe46ae51014 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 27 Oct 2011 13:58:05 -0400 Subject: cin audio: use sign_extend() instead of casting to int16_t --- libavcodec/dsicinav.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libavcodec/dsicinav.c') diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index a6a4ff1c6e..cbf7c4a6f8 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -26,6 +26,7 @@ #include "avcodec.h" #include "bytestream.h" +#include "mathops.h" typedef enum CinVideoBitmapIndex { @@ -339,7 +340,7 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, delta = cin->delta; if (cin->initial_decode_frame) { cin->initial_decode_frame = 0; - delta = (int16_t)AV_RL16(buf); + delta = sign_extend(AV_RL16(buf), 16); buf += 2; *samples++ = delta; } -- cgit v1.2.3