diff mpegaudiodec.c @ 6694:a2319e5d8bd3 libavcodec

use mpeg4audio common code
author bcoudurier
date Sat, 26 Apr 2008 13:56:52 +0000
parents 25413354a79a
children c3182ffe1689
line wrap: on
line diff
--- a/mpegaudiodec.c	Sat Apr 26 13:09:36 2008 +0000
+++ b/mpegaudiodec.c	Sat Apr 26 13:56:52 2008 +0000
@@ -2475,9 +2475,11 @@
 #endif /* CONFIG_MP3ADU_DECODER */
 
 #ifdef CONFIG_MP3ON4_DECODER
+
+#include "mpeg4audio.h"
+
 /* Next 3 arrays are indexed by channel config number (passed via codecdata) */
 static const uint8_t mp3Frames[16] = {0,1,1,2,3,3,4,5,2};   /* number of mp3 decoder instances */
-static const uint8_t mp3Channels[16] = {0,1,2,3,4,5,6,8,4}; /* total output channels */
 /* offsets into output buffer, assume output order is FL FR BL BR C LFE */
 static const uint8_t chan_offset[9][5] = {
     {0},
@@ -2495,6 +2497,7 @@
 static int decode_init_mp3on4(AVCodecContext * avctx)
 {
     MP3On4DecodeContext *s = avctx->priv_data;
+    MPEG4AudioConfig cfg;
     int i;
 
     if ((avctx->extradata_size < 2) || (avctx->extradata == NULL)) {
@@ -2502,13 +2505,14 @@
         return -1;
     }
 
-    s->chan_cfg = (((unsigned char *)avctx->extradata)[1] >> 3) & 0x0f;
-    s->frames = mp3Frames[s->chan_cfg];
-    if(!s->frames) {
+    ff_mpeg4audio_get_config(&cfg, avctx->extradata, avctx->extradata_size);
+    if (!cfg.chan_config || cfg.chan_config > 7) {
         av_log(avctx, AV_LOG_ERROR, "Invalid channel config number.\n");
         return -1;
     }
-    avctx->channels = mp3Channels[s->chan_cfg];
+    s->chan_cfg = cfg.chan_config;
+    s->frames = mp3Frames[s->chan_cfg];
+    avctx->channels = ff_mpeg4audio_channels[s->chan_cfg];
 
     /* Init the first mp3 decoder in standard way, so that all tables get builded
      * We replace avctx->priv_data with the context of the first decoder so that