Line | Branch | Exec | Source |
---|---|---|---|
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 "config_components.h" | ||
24 | |||
25 | #include "libavutil/channel_layout.h" | ||
26 | #include "libavutil/common.h" | ||
27 | #include "parser.h" | ||
28 | #include "aac_ac3_parser.h" | ||
29 | #include "ac3_parser_internal.h" | ||
30 | #include "adts_header.h" | ||
31 | |||
32 | 18552 | int ff_aac_ac3_parse(AVCodecParserContext *s1, | |
33 | AVCodecContext *avctx, | ||
34 | const uint8_t **poutbuf, int *poutbuf_size, | ||
35 | const uint8_t *buf, int buf_size) | ||
36 | { | ||
37 | 18552 | AACAC3ParseContext *s = s1->priv_data; | |
38 | 18552 | ParseContext *pc = &s->pc; | |
39 | int len, i; | ||
40 | int new_frame_start; | ||
41 | 18552 | int got_frame = 0; | |
42 | |||
43 | 18552 | s1->key_frame = -1; | |
44 | |||
45 |
2/2✓ Branch 0 taken 18396 times.
✓ Branch 1 taken 156 times.
|
18552 | if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) { |
46 | 156 | i = buf_size; | |
47 | 156 | got_frame = 1; | |
48 | } else { | ||
49 | 18396 | get_next: | |
50 | 24633 | i=END_NOT_FOUND; | |
51 |
2/2✓ Branch 0 taken 20614 times.
✓ Branch 1 taken 4019 times.
|
24633 | if(s->remaining_size <= buf_size){ |
52 |
4/4✓ Branch 0 taken 12334 times.
✓ Branch 1 taken 8280 times.
✓ Branch 2 taken 5855 times.
✓ Branch 3 taken 6479 times.
|
20614 | if(s->remaining_size && !s->need_next_header){ |
53 | 5855 | i= s->remaining_size; | |
54 | 5855 | s->remaining_size = 0; | |
55 | }else{ //we need a header first | ||
56 | 14759 | len=0; | |
57 |
2/2✓ Branch 0 taken 88666 times.
✓ Branch 1 taken 2383 times.
|
91049 | for(i=s->remaining_size; i<buf_size; i++){ |
58 | 88666 | s->state = (s->state<<8) + buf[i]; | |
59 |
2/2✓ Branch 1 taken 12376 times.
✓ Branch 2 taken 76290 times.
|
88666 | if((len=s->sync(s->state, &s->need_next_header, &new_frame_start))) |
60 | 12376 | break; | |
61 | } | ||
62 |
2/2✓ Branch 0 taken 2383 times.
✓ Branch 1 taken 12376 times.
|
14759 | if(len<=0){ |
63 | 2383 | i=END_NOT_FOUND; | |
64 | }else{ | ||
65 | 12376 | got_frame = 1; | |
66 | 12376 | s->state=0; | |
67 | 12376 | i-= s->header_size -1; | |
68 | 12376 | s->remaining_size = len; | |
69 |
4/4✓ Branch 0 taken 12062 times.
✓ Branch 1 taken 314 times.
✓ Branch 2 taken 5923 times.
✓ Branch 3 taken 6139 times.
|
12376 | if(!new_frame_start || pc->index+i<=0){ |
70 | 6237 | s->remaining_size += i; | |
71 | 6237 | goto get_next; | |
72 | } | ||
73 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6139 times.
|
6139 | else if (i < 0) { |
74 | ✗ | s->remaining_size += i; | |
75 | } | ||
76 | } | ||
77 | } | ||
78 | } | ||
79 | |||
80 |
2/2✓ Branch 1 taken 6241 times.
✓ Branch 2 taken 12155 times.
|
18396 | if(ff_combine_frame(pc, i, &buf, &buf_size)<0){ |
81 | 6241 | s->remaining_size -= FFMIN(s->remaining_size, buf_size); | |
82 | 6241 | *poutbuf = NULL; | |
83 | 6241 | *poutbuf_size = 0; | |
84 | 6241 | return buf_size; | |
85 | } | ||
86 | } | ||
87 | |||
88 | 12311 | *poutbuf = buf; | |
89 | 12311 | *poutbuf_size = buf_size; | |
90 | |||
91 |
2/2✓ Branch 0 taken 12150 times.
✓ Branch 1 taken 161 times.
|
12311 | if (got_frame) { |
92 | int bit_rate; | ||
93 | |||
94 | /* Due to backwards compatible HE-AAC the sample rate, channel count, | ||
95 | and total number of samples found in an AAC ADTS header are not | ||
96 | reliable. Bit rate is still accurate because the total frame | ||
97 | duration in seconds is still correct (as is the number of bits in | ||
98 | the frame). */ | ||
99 |
2/2✓ Branch 0 taken 6208 times.
✓ Branch 1 taken 5942 times.
|
12150 | if (avctx->codec_id != AV_CODEC_ID_AAC) { |
100 | #if CONFIG_AC3_PARSER | ||
101 | 6208 | AC3HeaderInfo hdr, *phrd = &hdr; | |
102 | 6208 | int offset = ff_ac3_find_syncword(buf, buf_size); | |
103 | |||
104 |
2/2✓ Branch 0 taken 7 times.
✓ Branch 1 taken 6201 times.
|
6208 | if (offset < 0) |
105 | 11 | return i; | |
106 | |||
107 | 6201 | buf += offset; | |
108 | 6201 | buf_size -= offset; | |
109 |
1/2✓ Branch 0 taken 6514 times.
✗ Branch 1 not taken.
|
6514 | while (buf_size > 0) { |
110 | 6514 | int ret = avpriv_ac3_parse_header(&phrd, buf, buf_size); | |
111 | |||
112 |
4/4✓ Branch 0 taken 6513 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 6510 times.
|
6514 | if (ret < 0 || hdr.frame_size > buf_size) |
113 | 4 | return i; | |
114 | |||
115 |
2/2✓ Branch 0 taken 313 times.
✓ Branch 1 taken 6197 times.
|
6510 | if (buf_size > hdr.frame_size) { |
116 | 313 | buf += hdr.frame_size; | |
117 | 313 | buf_size -= hdr.frame_size; | |
118 | 313 | continue; | |
119 | } | ||
120 | /* Check for false positives since the syncword is not enough. | ||
121 | See section 6.1.2 of A/52. */ | ||
122 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6197 times.
|
6197 | if (av_crc(s->crc_ctx, 0, buf + 2, hdr.frame_size - 2)) |
123 | ✗ | return i; | |
124 | 6197 | break; | |
125 | } | ||
126 | |||
127 | 6197 | avctx->sample_rate = hdr.sample_rate; | |
128 | |||
129 |
2/2✓ Branch 0 taken 4592 times.
✓ Branch 1 taken 1605 times.
|
6197 | if (hdr.bitstream_id > 10) |
130 | 4592 | avctx->codec_id = AV_CODEC_ID_EAC3; | |
131 | |||
132 |
2/2✓ Branch 0 taken 1605 times.
✓ Branch 1 taken 4592 times.
|
6197 | if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) { |
133 | 1605 | av_channel_layout_uninit(&avctx->ch_layout); | |
134 |
1/2✓ Branch 0 taken 1605 times.
✗ Branch 1 not taken.
|
1605 | if (hdr.channel_layout) { |
135 | 1605 | av_channel_layout_from_mask(&avctx->ch_layout, hdr.channel_layout); | |
136 | } else { | ||
137 | ✗ | avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; | |
138 | ✗ | avctx->ch_layout.nb_channels = hdr.channels; | |
139 | } | ||
140 | } | ||
141 | 6197 | s1->duration = hdr.num_blocks * 256; | |
142 | 6197 | avctx->audio_service_type = hdr.bitstream_mode; | |
143 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 6197 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6197 | if (hdr.bitstream_mode == 0x7 && hdr.channels > 1) |
144 | ✗ | avctx->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE; | |
145 | 6197 | bit_rate = hdr.bit_rate; | |
146 | #endif | ||
147 | } else { | ||
148 | #if CONFIG_AAC_PARSER | ||
149 | AACADTSHeaderInfo hdr; | ||
150 | GetBitContext gb; | ||
151 | |||
152 | 5942 | init_get_bits8(&gb, buf, buf_size); | |
153 |
3/4✓ Branch 0 taken 5941 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5941 times.
|
11883 | if (buf_size < AV_AAC_ADTS_HEADER_SIZE || |
154 | 5941 | ff_adts_header_parse(&gb, &hdr) < 0) | |
155 | 1 | return i; | |
156 | |||
157 | 5941 | avctx->profile = hdr.object_type - 1; | |
158 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5941 times.
|
5941 | s1->key_frame = (avctx->profile == AV_PROFILE_AAC_USAC) ? get_bits1(&gb) : 1; |
159 | 5941 | bit_rate = hdr.bit_rate; | |
160 | #endif | ||
161 | } | ||
162 | |||
163 | /* Calculate the average bit rate */ | ||
164 | 12138 | s->frame_number++; | |
165 |
2/2✓ Branch 0 taken 7546 times.
✓ Branch 1 taken 4592 times.
|
12138 | if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) { |
166 | 7546 | avctx->bit_rate += | |
167 | 7546 | (bit_rate - avctx->bit_rate) / s->frame_number; | |
168 | } | ||
169 | } | ||
170 | |||
171 | 12299 | return i; | |
172 | } | ||
173 |