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 "libavutil/channel_layout.h" |
24 |
|
|
#include "libavutil/common.h" |
25 |
|
|
#include "parser.h" |
26 |
|
|
#include "aac_ac3_parser.h" |
27 |
|
|
|
28 |
|
14748 |
int ff_aac_ac3_parse(AVCodecParserContext *s1, |
29 |
|
|
AVCodecContext *avctx, |
30 |
|
|
const uint8_t **poutbuf, int *poutbuf_size, |
31 |
|
|
const uint8_t *buf, int buf_size) |
32 |
|
|
{ |
33 |
|
14748 |
AACAC3ParseContext *s = s1->priv_data; |
34 |
|
14748 |
ParseContext *pc = &s->pc; |
35 |
|
|
int len, i; |
36 |
|
|
int new_frame_start; |
37 |
|
14748 |
int got_frame = 0; |
38 |
|
|
|
39 |
|
20875 |
get_next: |
40 |
|
20875 |
i=END_NOT_FOUND; |
41 |
✓✓ |
20875 |
if(s->remaining_size <= buf_size){ |
42 |
✓✓✓✓
|
17654 |
if(s->remaining_size && !s->need_next_header){ |
43 |
|
5770 |
i= s->remaining_size; |
44 |
|
5770 |
s->remaining_size = 0; |
45 |
|
|
}else{ //we need a header first |
46 |
|
11884 |
len=0; |
47 |
✓✓ |
74080 |
for(i=s->remaining_size; i<buf_size; i++){ |
48 |
|
72399 |
s->state = (s->state<<8) + buf[i]; |
49 |
✓✓ |
72399 |
if((len=s->sync(s->state, s, &s->need_next_header, &new_frame_start))) |
50 |
|
10203 |
break; |
51 |
|
|
} |
52 |
✓✓ |
11884 |
if(len<=0){ |
53 |
|
1681 |
i=END_NOT_FOUND; |
54 |
|
|
}else{ |
55 |
|
10203 |
got_frame = 1; |
56 |
|
10203 |
s->state=0; |
57 |
|
10203 |
i-= s->header_size -1; |
58 |
|
10203 |
s->remaining_size = len; |
59 |
✓✓✓✓
|
10203 |
if(!new_frame_start || pc->index+i<=0){ |
60 |
|
6127 |
s->remaining_size += i; |
61 |
|
6127 |
goto get_next; |
62 |
|
|
} |
63 |
✗✓ |
4076 |
else if (i < 0) { |
64 |
|
|
s->remaining_size += i; |
65 |
|
|
} |
66 |
|
|
} |
67 |
|
|
} |
68 |
|
|
} |
69 |
|
|
|
70 |
✓✓ |
14748 |
if(ff_combine_frame(pc, i, &buf, &buf_size)<0){ |
71 |
|
4789 |
s->remaining_size -= FFMIN(s->remaining_size, buf_size); |
72 |
|
4789 |
*poutbuf = NULL; |
73 |
|
4789 |
*poutbuf_size = 0; |
74 |
|
4789 |
return buf_size; |
75 |
|
|
} |
76 |
|
|
|
77 |
|
9959 |
*poutbuf = buf; |
78 |
|
9959 |
*poutbuf_size = buf_size; |
79 |
|
|
|
80 |
|
|
/* update codec info */ |
81 |
✓✓ |
9959 |
if(s->codec_id) |
82 |
|
4156 |
avctx->codec_id = s->codec_id; |
83 |
|
|
|
84 |
✓✓ |
9959 |
if (got_frame) { |
85 |
|
|
/* Due to backwards compatible HE-AAC the sample rate, channel count, |
86 |
|
|
and total number of samples found in an AAC ADTS header are not |
87 |
|
|
reliable. Bit rate is still accurate because the total frame |
88 |
|
|
duration in seconds is still correct (as is the number of bits in |
89 |
|
|
the frame). */ |
90 |
✓✓ |
9846 |
if (avctx->codec_id != AV_CODEC_ID_AAC) { |
91 |
|
4076 |
avctx->sample_rate = s->sample_rate; |
92 |
✓✓ |
4076 |
if (avctx->codec_id != AV_CODEC_ID_EAC3) { |
93 |
|
1433 |
avctx->channels = s->channels; |
94 |
|
1433 |
avctx->channel_layout = s->channel_layout; |
95 |
|
|
} |
96 |
|
4076 |
s1->duration = s->samples; |
97 |
|
4076 |
avctx->audio_service_type = s->service_type; |
98 |
|
|
} |
99 |
|
|
|
100 |
|
|
/* Calculate the average bit rate */ |
101 |
|
9846 |
s->frame_number++; |
102 |
✓✓ |
9846 |
if (avctx->codec_id != AV_CODEC_ID_EAC3) { |
103 |
|
7203 |
avctx->bit_rate += |
104 |
|
7203 |
(s->bit_rate - avctx->bit_rate) / s->frame_number; |
105 |
|
|
} |
106 |
|
|
} |
107 |
|
|
|
108 |
|
9959 |
return i; |
109 |
|
|
} |