Statistics
| Branch: | Revision:

ffmpeg / libavcodec / aac_adtstoasc_bsf.c @ 2912e87a

History | View | Annotate | Download (3.75 KB)

1
/*
2
 * MPEG-2/4 AAC ADTS to MPEG-4 Audio Specific Configuration bitstream filter
3
 * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com>
4
 *
5
 * This file is part of Libav.
6
 *
7
 * Libav is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * Libav is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with Libav; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21

    
22
#include "avcodec.h"
23
#include "aacadtsdec.h"
24
#include "put_bits.h"
25
#include "get_bits.h"
26
#include "mpeg4audio.h"
27
#include "internal.h"
28

    
29
typedef struct AACBSFContext {
30
    int first_frame_done;
31
} AACBSFContext;
32

    
33
/**
34
 * This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4
35
 * ADTS header and removes the ADTS header.
36
 */
37
static int aac_adtstoasc_filter(AVBitStreamFilterContext *bsfc,
38
                                AVCodecContext *avctx, const char *args,
39
                                uint8_t  **poutbuf, int *poutbuf_size,
40
                                const uint8_t *buf, int      buf_size,
41
                                int keyframe)
42
{
43
    GetBitContext gb;
44
    PutBitContext pb;
45
    AACADTSHeaderInfo hdr;
46

    
47
    AACBSFContext *ctx = bsfc->priv_data;
48

    
49
    init_get_bits(&gb, buf, AAC_ADTS_HEADER_SIZE*8);
50

    
51
    *poutbuf = (uint8_t*) buf;
52
    *poutbuf_size = buf_size;
53

    
54
    if (avctx->extradata)
55
        if (show_bits(&gb, 12) != 0xfff)
56
            return 0;
57

    
58
    if (ff_aac_parse_header(&gb, &hdr) < 0) {
59
        av_log(avctx, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
60
        return -1;
61
    }
62

    
63
    if (!hdr.crc_absent && hdr.num_aac_frames > 1) {
64
        av_log_missing_feature(avctx, "Multiple RDBs per frame with CRC is", 0);
65
        return -1;
66
    }
67

    
68
    buf      += AAC_ADTS_HEADER_SIZE + 2*!hdr.crc_absent;
69
    buf_size -= AAC_ADTS_HEADER_SIZE + 2*!hdr.crc_absent;
70

    
71
    if (!ctx->first_frame_done) {
72
        int            pce_size = 0;
73
        uint8_t        pce_data[MAX_PCE_SIZE];
74
        if (!hdr.chan_config) {
75
            init_get_bits(&gb, buf, buf_size);
76
            if (get_bits(&gb, 3) != 5) {
77
                av_log_missing_feature(avctx, "PCE based channel configuration, where the PCE is not the first syntax element is", 0);
78
                return -1;
79
            }
80
            init_put_bits(&pb, pce_data, MAX_PCE_SIZE);
81
            pce_size = ff_copy_pce_data(&pb, &gb)/8;
82
            flush_put_bits(&pb);
83
            buf_size -= get_bits_count(&gb)/8;
84
            buf      += get_bits_count(&gb)/8;
85
        }
86
        avctx->extradata_size = 2 + pce_size;
87
        avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
88

    
89
        init_put_bits(&pb, avctx->extradata, avctx->extradata_size);
90
        put_bits(&pb, 5, hdr.object_type);
91
        put_bits(&pb, 4, hdr.sampling_index);
92
        put_bits(&pb, 4, hdr.chan_config);
93
        put_bits(&pb, 1, 0); //frame length - 1024 samples
94
        put_bits(&pb, 1, 0); //does not depend on core coder
95
        put_bits(&pb, 1, 0); //is not extension
96
        flush_put_bits(&pb);
97
        if (pce_size) {
98
            memcpy(avctx->extradata + 2, pce_data, pce_size);
99
        }
100

    
101
        ctx->first_frame_done = 1;
102
    }
103

    
104
    *poutbuf = (uint8_t*) buf;
105
    *poutbuf_size = buf_size;
106

    
107
    return 0;
108
}
109

    
110
AVBitStreamFilter ff_aac_adtstoasc_bsf = {
111
    "aac_adtstoasc",
112
    sizeof(AACBSFContext),
113
    aac_adtstoasc_filter,
114
};