FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac_ac3_parser.c
Date: 2026-01-23 14:02:51
Exec Total Coverage
Lines: 77 82 93.9%
Functions: 1 1 100.0%
Branches: 48 56 85.7%

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 18150 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 18150 AACAC3ParseContext *s = s1->priv_data;
38 18150 ParseContext *pc = &s->pc;
39 int len, i;
40 int new_frame_start;
41 18150 int got_frame = 0;
42
43 18150 s1->key_frame = -1;
44
45
2/2
✓ Branch 0 taken 17994 times.
✓ Branch 1 taken 156 times.
18150 if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) {
46 156 i = buf_size;
47 156 got_frame = 1;
48 } else {
49 17994 get_next:
50 23820 i=END_NOT_FOUND;
51
2/2
✓ Branch 0 taken 19801 times.
✓ Branch 1 taken 4019 times.
23820 if(s->remaining_size <= buf_size){
52
4/4
✓ Branch 0 taken 11928 times.
✓ Branch 1 taken 7873 times.
✓ Branch 2 taken 5444 times.
✓ Branch 3 taken 6484 times.
19801 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 14357 len=0;
57
2/2
✓ Branch 0 taken 85824 times.
✓ Branch 1 taken 2387 times.
88211 for(i=s->remaining_size; i<buf_size; i++){
58 85824 s->state = (s->state<<8) + buf[i];
59
2/2
✓ Branch 1 taken 11970 times.
✓ Branch 2 taken 73854 times.
85824 if((len=s->sync(s->state, &s->need_next_header, &new_frame_start)))
60 11970 break;
61 }
62
2/2
✓ Branch 0 taken 2387 times.
✓ Branch 1 taken 11970 times.
14357 if(len<=0){
63 2387 i=END_NOT_FOUND;
64 }else{
65 11970 got_frame = 1;
66 11970 s->state=0;
67 11970 i-= s->header_size -1;
68 11970 s->remaining_size = len;
69
4/4
✓ Branch 0 taken 11656 times.
✓ Branch 1 taken 314 times.
✓ Branch 2 taken 5512 times.
✓ Branch 3 taken 6144 times.
11970 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 6144 times.
6144 else if (i < 0) {
74 s->remaining_size += i;
75 }
76 }
77 }
78 }
79
80
2/2
✓ Branch 1 taken 6246 times.
✓ Branch 2 taken 11748 times.
17994 if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
81 6246 s->remaining_size -= FFMIN(s->remaining_size, buf_size);
82 6246 *poutbuf = NULL;
83 6246 *poutbuf_size = 0;
84 6246 return buf_size;
85 }
86 }
87
88 11904 *poutbuf = buf;
89 11904 *poutbuf_size = buf_size;
90
91
2/2
✓ Branch 0 taken 11744 times.
✓ Branch 1 taken 160 times.
11904 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 6213 times.
✓ Branch 1 taken 5531 times.
11744 if (avctx->codec_id != AV_CODEC_ID_AAC) {
100 #if CONFIG_AC3_PARSER
101 6213 AC3HeaderInfo hdr, *phrd = &hdr;
102 6213 int offset = ff_ac3_find_syncword(buf, buf_size);
103
104
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 6206 times.
6213 if (offset < 0)
105 11 return i;
106
107 6206 buf += offset;
108 6206 buf_size -= offset;
109
1/2
✓ Branch 0 taken 6519 times.
✗ Branch 1 not taken.
6519 while (buf_size > 0) {
110 6519 int ret = avpriv_ac3_parse_header(&phrd, buf, buf_size);
111
112
4/4
✓ Branch 0 taken 6518 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 6515 times.
6519 if (ret < 0 || hdr.frame_size > buf_size)
113 4 return i;
114
115
2/2
✓ Branch 0 taken 313 times.
✓ Branch 1 taken 6202 times.
6515 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 6202 times.
6202 if (av_crc(s->crc_ctx, 0, buf + 2, hdr.frame_size - 2))
123 return i;
124 6202 break;
125 }
126
127 6202 avctx->sample_rate = hdr.sample_rate;
128
129
2/2
✓ Branch 0 taken 4592 times.
✓ Branch 1 taken 1610 times.
6202 if (hdr.bitstream_id > 10)
130 4592 avctx->codec_id = AV_CODEC_ID_EAC3;
131
132
2/2
✓ Branch 0 taken 1610 times.
✓ Branch 1 taken 4592 times.
6202 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
133 1610 av_channel_layout_uninit(&avctx->ch_layout);
134
1/2
✓ Branch 0 taken 1610 times.
✗ Branch 1 not taken.
1610 if (hdr.channel_layout) {
135 1610 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 6202 s1->duration = hdr.num_blocks * 256;
142 6202 avctx->audio_service_type = hdr.bitstream_mode;
143
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6202 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6202 if (hdr.bitstream_mode == 0x7 && hdr.channels > 1)
144 avctx->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
145 6202 bit_rate = hdr.bit_rate;
146 #endif
147 } else {
148 #if CONFIG_AAC_PARSER
149 AACADTSHeaderInfo hdr;
150
151
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 ||
152 5530 ff_adts_header_parse_buf(buf, &hdr) < 0)
153 1 return i;
154
155
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 5499 times.
5530 if (avctx->profile == AV_PROFILE_UNKNOWN)
156 31 avctx->profile = hdr.object_type - 1;
157 /* ADTS does not support USAC */
158 5530 s1->key_frame = 1;
159 5530 bit_rate = hdr.bit_rate;
160 #endif
161 }
162
163 /* Calculate the average bit rate */
164 11732 s->frame_number++;
165
2/2
✓ Branch 0 taken 7140 times.
✓ Branch 1 taken 4592 times.
11732 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
166 7140 avctx->bit_rate +=
167 7140 (bit_rate - avctx->bit_rate) / s->frame_number;
168 }
169 }
170
171 11892 return i;
172 }
173