summaryrefslogtreecommitdiff
path: root/libavcodec/mlpdec.c
diff options
context:
space:
mode:
authorRamiro Polla <ramiro.polla@gmail.com>2009-04-06 00:58:03 +0000
committerRamiro Polla <ramiro.polla@gmail.com>2009-04-06 00:58:03 +0000
commit75428fa44711944af54e2471d33bfd6a9a0336d3 (patch)
treeefd87f69a7837b38b0fa6b1f8936176669a7b9fb /libavcodec/mlpdec.c
parent89e39be3b647c5c04bf96a927fa2b355af4c53e7 (diff)
mlpdec: Filters and matrices may change only once per substream per access unit.
Originally committed as revision 18338 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mlpdec.c')
-rw-r--r--libavcodec/mlpdec.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c
index 9b36b2e5bb..9642104a5f 100644
--- a/libavcodec/mlpdec.c
+++ b/libavcodec/mlpdec.c
@@ -138,6 +138,9 @@ typedef struct MLPDecodeContext {
ChannelParams channel_params[MAX_CHANNELS];
+ int matrix_changed;
+ int filter_changed[MAX_CHANNELS][NUM_FILTERS];
+
int8_t noise_buffer[MAX_BLOCKSIZE_POW2];
int8_t bypassed_lsbs[MAX_BLOCKSIZE][MAX_CHANNELS];
int32_t sample_buffer[MAX_BLOCKSIZE][MAX_CHANNELS+2];
@@ -443,6 +446,8 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
// Filter is 0 for FIR, 1 for IIR.
assert(filter < 2);
+ m->filter_changed[channel][filter]++;
+
order = get_bits(gbp, 4);
if (order > max_order) {
av_log(m->avctx, AV_LOG_ERROR,
@@ -504,6 +509,7 @@ static int read_matrix_params(MLPDecodeContext *m, SubStream *s, GetBitContext *
unsigned int mat, ch;
s->num_primitive_matrices = get_bits(gbp, 4);
+ m->matrix_changed++;
for (mat = 0; mat < s->num_primitive_matrices; mat++) {
int frac_bits, max_chan;
@@ -1000,8 +1006,13 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
SubStream *s = &m->substream[substr];
init_get_bits(&gb, buf, substream_data_len[substr] * 8);
+ m->matrix_changed = 0;
+ memset(m->filter_changed, 0, sizeof(m->filter_changed));
+
s->blockpos = 0;
do {
+ unsigned int ch;
+
if (get_bits1(&gb)) {
if (get_bits1(&gb)) {
/* A restart header should be present. */
@@ -1018,6 +1029,17 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
goto next_substr;
}
+ if (m->matrix_changed > 1) {
+ av_log(m->avctx, AV_LOG_ERROR, "Matrices may change only once per access unit.\n");
+ goto next_substr;
+ }
+ for (ch = 0; ch < s->max_channel; ch++)
+ if (m->filter_changed[ch][FIR] > 1 ||
+ m->filter_changed[ch][IIR] > 1) {
+ av_log(m->avctx, AV_LOG_ERROR, "Filters may change only once per access unit.\n");
+ goto next_substr;
+ }
+
if (!s->restart_seen) {
goto next_substr;
}