Commit 4f26258f authored by Uoti Urpala's avatar Uoti Urpala Committed by Roberto Togni

dtsdec.c copies one input packet at a time to a (static) buffer of size

4096 bytes while the packet can be up to 18726 bytes.
The code also keeps decoding until all input data has been used up,
not respecting AVCODEC_MAX_AUDIO_FRAME_SIZE.

The patch increases the buffer size and return after decoding one frame.
Also fixes dts_decode_init to return -1, not 1, on failure.

Patch by Uoti Urpala  ||| uoti : urpala |!| pp1 : inet : fi |||

Originally committed as revision 5307 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent c3f11d19
...@@ -33,8 +33,7 @@ ...@@ -33,8 +33,7 @@
#include <malloc.h> #include <malloc.h>
#endif #endif
#define INBUF_SIZE 4096 #define BUFFER_SIZE 18726
#define BUFFER_SIZE 4096
#define HEADER_SIZE 14 #define HEADER_SIZE 14
#ifdef LIBDTS_FIXED #ifdef LIBDTS_FIXED
...@@ -231,9 +230,11 @@ dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size, ...@@ -231,9 +230,11 @@ dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size,
memcpy (bufptr, start, len); memcpy (bufptr, start, len);
bufptr += len; bufptr += len;
start += len; start += len;
if (bufptr == bufpos) if (bufptr != bufpos)
{ return start - buff;
if (bufpos == buf + HEADER_SIZE) if (bufpos != buf + HEADER_SIZE)
break;
{ {
int length; int length;
...@@ -248,7 +249,8 @@ dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size, ...@@ -248,7 +249,8 @@ dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size,
} }
bufpos = buf + length; bufpos = buf + length;
} }
else }
{ {
level_t level; level_t level;
sample_t bias; sample_t bias;
...@@ -280,16 +282,14 @@ dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size, ...@@ -280,16 +282,14 @@ dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size,
} }
bufptr = buf; bufptr = buf;
bufpos = buf + HEADER_SIZE; bufpos = buf + HEADER_SIZE;
continue; return start-buff;
error: error:
av_log (NULL, AV_LOG_ERROR, "error\n"); av_log (NULL, AV_LOG_ERROR, "error\n");
bufptr = buf; bufptr = buf;
bufpos = buf + HEADER_SIZE; bufpos = buf + HEADER_SIZE;
} }
}
}
return buff_size; return start-buff;
} }
static int static int
...@@ -297,7 +297,7 @@ dts_decode_init (AVCodecContext *avctx) ...@@ -297,7 +297,7 @@ dts_decode_init (AVCodecContext *avctx)
{ {
avctx->priv_data = dts_init (0); avctx->priv_data = dts_init (0);
if (avctx->priv_data == NULL) if (avctx->priv_data == NULL)
return 1; return -1;
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment