2 * Common AAC and AC-3 parser
3 * Copyright (c) 2003 Fabrice Bellard
4 * Copyright (c) 2003 Michael Niedermayer
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "aac_ac3_parser.h"
26 int ff_aac_ac3_parse(AVCodecParserContext
*s1
,
27 AVCodecContext
*avctx
,
28 const uint8_t **poutbuf
, int *poutbuf_size
,
29 const uint8_t *buf
, int buf_size
)
31 AACAC3ParseContext
*s
= s1
->priv_data
;
32 ParseContext
*pc
= &s
->pc
;
38 if(s
->remaining_size
<= buf_size
){
39 if(s
->remaining_size
&& !s
->need_next_header
){
41 s
->remaining_size
= 0;
42 }else{ //we need a header first
44 for(i
=s
->remaining_size
; i
<buf_size
; i
++){
45 s
->state
= (s
->state
<<8) + buf
[i
];
46 if((len
=s
->sync(s
->state
, s
, &s
->need_next_header
, &new_frame_start
)))
53 i
-= s
->header_size
-1;
54 s
->remaining_size
= len
;
55 if(!new_frame_start
|| pc
->index
+i
<=0){
56 s
->remaining_size
+= i
;
63 if(ff_combine_frame(pc
, i
, &buf
, &buf_size
)<0){
64 s
->remaining_size
-= FFMIN(s
->remaining_size
, buf_size
);
71 *poutbuf_size
= buf_size
;
73 /* update codec info */
74 avctx
->sample_rate
= s
->sample_rate
;
76 avctx
->codec_id
= s
->codec_id
;
78 /* allow downmixing to stereo (or mono for AC-3) */
79 if(avctx
->request_channels
> 0 &&
80 avctx
->request_channels
< s
->channels
&&
81 (avctx
->request_channels
<= 2 ||
82 (avctx
->request_channels
== 1 &&
83 (avctx
->codec_id
== CODEC_ID_AC3
||
84 avctx
->codec_id
== CODEC_ID_EAC3
)))) {
85 avctx
->channels
= avctx
->request_channels
;
86 } else if (avctx
->codec_id
!= CODEC_ID_AAC
|| s
->channels
) {
87 avctx
->channels
= s
->channels
;
88 avctx
->channel_layout
= s
->channel_layout
;
90 avctx
->bit_rate
= s
->bit_rate
;
91 avctx
->frame_size
= s
->samples
;