ffmpeg / libavcodec / aac_ac3_parser.c @ bfeca7be
History | View | Annotate | Download (3 KB)
1 |
/*
|
---|---|
2 |
* Common AAC and AC-3 parser
|
3 |
* Copyright (c) 2003 Fabrice Bellard
|
4 |
* Copyright (c) 2003 Michael Niedermayer
|
5 |
*
|
6 |
* This file is part of FFmpeg.
|
7 |
*
|
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.
|
12 |
*
|
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.
|
17 |
*
|
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
|
21 |
*/
|
22 |
|
23 |
#include "parser.h" |
24 |
#include "aac_ac3_parser.h" |
25 |
|
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) |
30 |
{ |
31 |
AACAC3ParseContext *s = s1->priv_data; |
32 |
ParseContext *pc = &s->pc; |
33 |
int len, i;
|
34 |
int new_frame_start;
|
35 |
|
36 |
get_next:
|
37 |
i=END_NOT_FOUND; |
38 |
if(s->remaining_size <= buf_size){
|
39 |
if(s->remaining_size && !s->need_next_header){
|
40 |
i= s->remaining_size; |
41 |
s->remaining_size = 0;
|
42 |
}else{ //we need a header first |
43 |
len=0;
|
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)))
|
47 |
break;
|
48 |
} |
49 |
if(len<=0){ |
50 |
i=END_NOT_FOUND; |
51 |
}else{
|
52 |
s->state=0;
|
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; |
57 |
goto get_next;
|
58 |
} |
59 |
} |
60 |
} |
61 |
} |
62 |
|
63 |
if(ff_combine_frame(pc, i, &buf, &buf_size)<0){ |
64 |
s->remaining_size -= FFMIN(s->remaining_size, buf_size); |
65 |
*poutbuf = NULL;
|
66 |
*poutbuf_size = 0;
|
67 |
return buf_size;
|
68 |
} |
69 |
|
70 |
*poutbuf = buf; |
71 |
*poutbuf_size = buf_size; |
72 |
|
73 |
/* update codec info */
|
74 |
avctx->sample_rate = s->sample_rate; |
75 |
if(s->codec_id)
|
76 |
avctx->codec_id = s->codec_id; |
77 |
|
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 {
|
87 |
avctx->channels = s->channels; |
88 |
avctx->channel_layout = s->channel_layout; |
89 |
} |
90 |
avctx->bit_rate = s->bit_rate; |
91 |
avctx->frame_size = s->samples; |
92 |
|
93 |
return i;
|
94 |
} |