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 FFmpeg. 6 * 7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 "aac_parser.h" 24#include "put_bits.h" 25#include "get_bits.h" 26#include "mpeg4audio.h" 27#include "internal.h" 28 29typedef 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 */ 37static 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 110AVBitStreamFilter aac_adtstoasc_bsf = { 111 "aac_adtstoasc", 112 sizeof(AACBSFContext), 113 aac_adtstoasc_filter, 114}; 115