avcodec/aacdec_template: Allow duplicated elements
authorMichael Niedermayer <michael@niedermayer.cc>
Sun, 7 Oct 2018 11:03:00 +0000 (13:03 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Thu, 11 Oct 2018 22:53:14 +0000 (00:53 +0200)
Such streams are invalid according to
4.5.2.1 Top level payloads for the audio object types AAC main, AAC SSR, AAC LC and AAC LTP
4.5.2.1.1 Definitions
...cIn the raw_data_block(), several instances of the
same syntactic element may occur, but must have a different 4 bit
element_instance_tag, except for data_stream_element()'s and
fill_element()'s.

Fixes: Ticket7477

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavcodec/aacdec_template.c

index b60b31a..dce6035 100644 (file)
@@ -3161,12 +3161,15 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
 
         if (elem_type < TYPE_DSE) {
             if (che_presence[elem_type][elem_id]) {
-                av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d duplicate\n",
+                int error = che_presence[elem_type][elem_id] > 1;
+                av_log(ac->avctx, error ? AV_LOG_ERROR : AV_LOG_DEBUG, "channel element %d.%d duplicate\n",
                        elem_type, elem_id);
-                err = AVERROR_INVALIDDATA;
-                goto fail;
+                if (error) {
+                    err = AVERROR_INVALIDDATA;
+                    goto fail;
+                }
             }
-            che_presence[elem_type][elem_id] = 1;
+            che_presence[elem_type][elem_id]++;
 
             if (!(che=get_che(ac, elem_type, elem_id))) {
                 av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n",