libavcodec/aac_parser.c
99ff31dc
 /*
  * Audio and Video frame extraction
406792e7
  * Copyright (c) 2003 Fabrice Bellard
  * Copyright (c) 2003 Michael Niedermayer
99ff31dc
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include "parser.h"
 #include "aac_ac3_parser.h"
3cac899a
 #include "aacadtsdec.h"
9106a698
 #include "get_bits.h"
bac47ae6
 #include "mpeg4audio.h"
99ff31dc
 
133ac890
 static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
         int *need_next_header, int *new_frame_start)
99ff31dc
 {
     GetBitContext bits;
158b3912
     AACADTSHeaderInfo hdr;
     int size;
cb56b440
     union {
         uint64_t u64;
         uint8_t  u8[8];
     } tmp;
99ff31dc
 
8fc0162a
     tmp.u64 = av_be2ne64(state);
ee373ddf
     init_get_bits(&bits, tmp.u8+8-AAC_ADTS_HEADER_SIZE, AAC_ADTS_HEADER_SIZE * 8);
99ff31dc
 
158b3912
     if ((size = ff_aac_parse_header(&bits, &hdr)) < 0)
99ff31dc
         return 0;
133ac890
     *need_next_header = 0;
     *new_frame_start  = 1;
158b3912
     hdr_info->sample_rate = hdr.sample_rate;
     hdr_info->channels    = ff_mpeg4audio_channels[hdr.chan_config];
     hdr_info->samples     = hdr.samples;
     hdr_info->bit_rate    = hdr.bit_rate;
99ff31dc
     return size;
 }
 
98a6fff9
 static av_cold int aac_parse_init(AVCodecParserContext *s1)
99ff31dc
 {
679c2294
     AACAC3ParseContext *s = s1->priv_data;
ee373ddf
     s->header_size = AAC_ADTS_HEADER_SIZE;
99ff31dc
     s->sync = aac_sync;
     return 0;
 }
 
 
e7e2df27
 AVCodecParser ff_aac_parser = {
99ff31dc
     { CODEC_ID_AAC },
679c2294
     sizeof(AACAC3ParseContext),
99ff31dc
     aac_parse_init,
679c2294
     ff_aac_ac3_parse,
7ac15917
     ff_parse_close,
99ff31dc
 };