[FFmpeg-devel] [PATCH 4/7] aacdec: refactor the actual aac decoding code into its own function

Janne Grunau janne-ffmpeg
Fri Oct 29 00:44:55 CEST 2010


aac_decode_frame() remains as AVPacket handling a wrapper. The 	actual
decoding function takes a GetBitContext as input and will be used be the
AAC LATM decoder to avoid copying the unaligned AAC bitstream.
---
 libavcodec/aacdec.c |   59 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 36 insertions(+), 23 deletions(-)

diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index 5e290e6..f592266 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -1922,24 +1922,17 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
     return size;
 }
 
-static int aac_decode_frame(AVCodecContext *avctx, void *data,
-                            int *data_size, AVPacket *avpkt)
+static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
+                                int *data_size, GetBitContext *gb)
 {
-    const uint8_t *buf = avpkt->data;
-    int buf_size = avpkt->size;
     AACContext *ac = avctx->priv_data;
     ChannelElement *che = NULL, *che_prev = NULL;
-    GetBitContext gb;
     enum RawDataBlockType elem_type, elem_type_prev = TYPE_END;
     int err, elem_id, data_size_tmp;
-    int buf_consumed;
     int samples = 0, multiplier;
-    int buf_offset;
 
-    init_get_bits(&gb, buf, buf_size * 8);
-
-    if (show_bits(&gb, 12) == 0xfff) {
-        if (parse_adts_frame_header(ac, &gb) < 0) {
+    if (show_bits(gb, 12) == 0xfff) {
+        if (parse_adts_frame_header(ac, gb) < 0) {
             av_log(avctx, AV_LOG_ERROR, "Error decoding AAC frame header.\n");
             return -1;
         }
@@ -1951,8 +1944,8 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
 
     ac->tags_mapped = 0;
     // parse
-    while ((elem_type = get_bits(&gb, 3)) != TYPE_END) {
-        elem_id = get_bits(&gb, 4);
+    while ((elem_type = get_bits(gb, 3)) != TYPE_END) {
+        elem_id = get_bits(gb, 4);
 
         if (elem_type < TYPE_DSE) {
             if (!(che=get_che(ac, elem_type, elem_id))) {
@@ -1966,29 +1959,29 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
         switch (elem_type) {
 
         case TYPE_SCE:
-            err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
+            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
             break;
 
         case TYPE_CPE:
-            err = decode_cpe(ac, &gb, che);
+            err = decode_cpe(ac, gb, che);
             break;
 
         case TYPE_CCE:
-            err = decode_cce(ac, &gb, che);
+            err = decode_cce(ac, gb, che);
             break;
 
         case TYPE_LFE:
-            err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
+            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
             break;
 
         case TYPE_DSE:
-            err = skip_data_stream_element(ac, &gb);
+            err = skip_data_stream_element(ac, gb);
             break;
 
         case TYPE_PCE: {
             enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
             memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
-            if ((err = decode_pce(ac, new_che_pos, &gb)))
+            if ((err = decode_pce(ac, new_che_pos, gb)))
                 break;
             if (ac->output_configured > OC_TRIAL_PCE)
                 av_log(avctx, AV_LOG_ERROR,
@@ -2000,13 +1993,13 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
 
         case TYPE_FIL:
             if (elem_id == 15)
-                elem_id += get_bits(&gb, 8) - 1;
-            if (get_bits_left(&gb) < 8 * elem_id) {
+                elem_id += get_bits(gb, 8) - 1;
+            if (get_bits_left(gb) < 8 * elem_id) {
                     av_log(avctx, AV_LOG_ERROR, overread_err);
                     return -1;
             }
             while (elem_id > 0)
-                elem_id -= decode_extension_payload(ac, &gb, elem_id, che_prev, elem_type_prev);
+                elem_id -= decode_extension_payload(ac, gb, elem_id, che_prev, elem_type_prev);
             err = 0; /* FIXME */
             break;
 
@@ -2021,7 +2014,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
         if (err)
             return err;
 
-        if (get_bits_left(&gb) < 3) {
+        if (get_bits_left(gb) < 3) {
             av_log(avctx, AV_LOG_ERROR, overread_err);
             return -1;
         }
@@ -2051,6 +2044,26 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
     if (ac->output_configured)
         ac->output_configured = OC_LOCKED;
 
+    return 0;
+}
+
+static int aac_decode_frame(AVCodecContext *avctx, void *data,
+                            int *data_size, AVPacket *avpkt)
+{
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
+    GetBitContext gb;
+    int buf_consumed;
+    int buf_offset;
+    int err;
+
+    init_get_bits(&gb, buf, buf_size * 8);
+
+    err = aac_decode_frame_int(avctx, data, data_size, &gb);
+
+    if (err < 0)
+        return err;
+
     buf_consumed = (get_bits_count(&gb) + 7) >> 3;
     for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
         if (buf[buf_offset])
-- 
1.7.3.2




More information about the ffmpeg-devel mailing list