FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac_ac3_parser.c
Date: 2025-04-25 22:50:00
Exec Total Coverage
Lines: 77 82 93.9%
Functions: 1 1 100.0%
Branches: 47 56 83.9%

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 18140 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 18140 AACAC3ParseContext *s = s1->priv_data;
38 18140 ParseContext *pc = &s->pc;
39 int len, i;
40 int new_frame_start;
41 18140 int got_frame = 0;
42
43 18140 s1->key_frame = -1;
44
45
2/2
✓ Branch 0 taken 17984 times.
✓ Branch 1 taken 156 times.
18140 if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) {
46 156 i = buf_size;
47 156 got_frame = 1;
48 } else {
49 17984 get_next:
50 23810 i=END_NOT_FOUND;
51
2/2
✓ Branch 0 taken 19791 times.
✓ Branch 1 taken 4019 times.
23810 if(s->remaining_size <= buf_size){
52
4/4
✓ Branch 0 taken 11923 times.
✓ Branch 1 taken 7868 times.
✓ Branch 2 taken 5444 times.
✓ Branch 3 taken 6479 times.
19791 if(s->remaining_size && !s->need_next_header){
53 5444 i= s->remaining_size;
54 5444 s->remaining_size = 0;
55 }else{ //we need a header first
56 14347 len=0;
57
2/2
✓ Branch 0 taken 85789 times.
✓ Branch 1 taken 2382 times.
88171 for(i=s->remaining_size; i<buf_size; i++){
58 85789 s->state = (s->state<<8) + buf[i];
59
2/2
✓ Branch 1 taken 11965 times.
✓ Branch 2 taken 73824 times.
85789 if((len=s->sync(s->state, &s->need_next_header, &new_frame_start)))
60 11965 break;
61 }
62
2/2
✓ Branch 0 taken 2382 times.
✓ Branch 1 taken 11965 times.
14347 if(len<=0){
63 2382 i=END_NOT_FOUND;
64 }else{
65 11965 got_frame = 1;
66 11965 s->state=0;
67 11965 i-= s->header_size -1;
68 11965 s->remaining_size = len;
69
4/4
✓ Branch 0 taken 11651 times.
✓ Branch 1 taken 314 times.
✓ Branch 2 taken 5512 times.
✓ Branch 3 taken 6139 times.
11965 if(!new_frame_start || pc->index+i<=0){
70 5826 s->remaining_size += i;
71 5826 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 11743 times.
17984 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 11899 *poutbuf = buf;
89 11899 *poutbuf_size = buf_size;
90
91
2/2
✓ Branch 0 taken 11739 times.
✓ Branch 1 taken 160 times.
11899 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 5531 times.
11739 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 5531 init_get_bits8(&gb, buf, buf_size);
153
3/4
✓ Branch 0 taken 5530 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5530 times.
11061 if (buf_size < AV_AAC_ADTS_HEADER_SIZE ||
154 5530 ff_adts_header_parse(&gb, &hdr) < 0)
155 1 return i;
156
157 5530 avctx->profile = hdr.object_type - 1;
158
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5530 times.
5530 s1->key_frame = (avctx->profile == AV_PROFILE_AAC_USAC) ? get_bits1(&gb) : 1;
159 5530 bit_rate = hdr.bit_rate;
160 #endif
161 }
162
163 /* Calculate the average bit rate */
164 11727 s->frame_number++;
165
2/2
✓ Branch 0 taken 7135 times.
✓ Branch 1 taken 4592 times.
11727 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
166 7135 avctx->bit_rate +=
167 7135 (bit_rate - avctx->bit_rate) / s->frame_number;
168 }
169 }
170
171 11887 return i;
172 }
173