FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac_ac3_parser.c
Date: 2025-03-08 20:38:41
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 18144 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 18144 AACAC3ParseContext *s = s1->priv_data;
38 18144 ParseContext *pc = &s->pc;
39 int len, i;
40 int new_frame_start;
41 18144 int got_frame = 0;
42
43 18144 s1->key_frame = -1;
44
45
2/2
✓ Branch 0 taken 17988 times.
✓ Branch 1 taken 156 times.
18144 if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) {
46 156 i = buf_size;
47 156 got_frame = 1;
48 } else {
49 17988 get_next:
50 23814 i=END_NOT_FOUND;
51
2/2
✓ Branch 0 taken 19795 times.
✓ Branch 1 taken 4019 times.
23814 if(s->remaining_size <= buf_size){
52
4/4
✓ Branch 0 taken 11925 times.
✓ Branch 1 taken 7870 times.
✓ Branch 2 taken 5444 times.
✓ Branch 3 taken 6481 times.
19795 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 14351 len=0;
57
2/2
✓ Branch 0 taken 85803 times.
✓ Branch 1 taken 2384 times.
88187 for(i=s->remaining_size; i<buf_size; i++){
58 85803 s->state = (s->state<<8) + buf[i];
59
2/2
✓ Branch 1 taken 11967 times.
✓ Branch 2 taken 73836 times.
85803 if((len=s->sync(s->state, &s->need_next_header, &new_frame_start)))
60 11967 break;
61 }
62
2/2
✓ Branch 0 taken 2384 times.
✓ Branch 1 taken 11967 times.
14351 if(len<=0){
63 2384 i=END_NOT_FOUND;
64 }else{
65 11967 got_frame = 1;
66 11967 s->state=0;
67 11967 i-= s->header_size -1;
68 11967 s->remaining_size = len;
69
4/4
✓ Branch 0 taken 11653 times.
✓ Branch 1 taken 314 times.
✓ Branch 2 taken 5512 times.
✓ Branch 3 taken 6141 times.
11967 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 6141 times.
6141 else if (i < 0) {
74 s->remaining_size += i;
75 }
76 }
77 }
78 }
79
80
2/2
✓ Branch 1 taken 6243 times.
✓ Branch 2 taken 11745 times.
17988 if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
81 6243 s->remaining_size -= FFMIN(s->remaining_size, buf_size);
82 6243 *poutbuf = NULL;
83 6243 *poutbuf_size = 0;
84 6243 return buf_size;
85 }
86 }
87
88 11901 *poutbuf = buf;
89 11901 *poutbuf_size = buf_size;
90
91
2/2
✓ Branch 0 taken 11741 times.
✓ Branch 1 taken 160 times.
11901 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 6210 times.
✓ Branch 1 taken 5531 times.
11741 if (avctx->codec_id != AV_CODEC_ID_AAC) {
100 #if CONFIG_AC3_PARSER
101 6210 AC3HeaderInfo hdr, *phrd = &hdr;
102 6210 int offset = ff_ac3_find_syncword(buf, buf_size);
103
104
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 6203 times.
6210 if (offset < 0)
105 11 return i;
106
107 6203 buf += offset;
108 6203 buf_size -= offset;
109
1/2
✓ Branch 0 taken 6516 times.
✗ Branch 1 not taken.
6516 while (buf_size > 0) {
110 6516 int ret = avpriv_ac3_parse_header(&phrd, buf, buf_size);
111
112
4/4
✓ Branch 0 taken 6515 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 6512 times.
6516 if (ret < 0 || hdr.frame_size > buf_size)
113 4 return i;
114
115
2/2
✓ Branch 0 taken 313 times.
✓ Branch 1 taken 6199 times.
6512 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 6199 times.
6199 if (av_crc(s->crc_ctx, 0, buf + 2, hdr.frame_size - 2))
123 return i;
124 6199 break;
125 }
126
127 6199 avctx->sample_rate = hdr.sample_rate;
128
129
2/2
✓ Branch 0 taken 4592 times.
✓ Branch 1 taken 1607 times.
6199 if (hdr.bitstream_id > 10)
130 4592 avctx->codec_id = AV_CODEC_ID_EAC3;
131
132
2/2
✓ Branch 0 taken 1607 times.
✓ Branch 1 taken 4592 times.
6199 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
133 1607 av_channel_layout_uninit(&avctx->ch_layout);
134
1/2
✓ Branch 0 taken 1607 times.
✗ Branch 1 not taken.
1607 if (hdr.channel_layout) {
135 1607 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 6199 s1->duration = hdr.num_blocks * 256;
142 6199 avctx->audio_service_type = hdr.bitstream_mode;
143
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6199 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6199 if (hdr.bitstream_mode == 0x7 && hdr.channels > 1)
144 avctx->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
145 6199 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 11729 s->frame_number++;
165
2/2
✓ Branch 0 taken 7137 times.
✓ Branch 1 taken 4592 times.
11729 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
166 7137 avctx->bit_rate +=
167 7137 (bit_rate - avctx->bit_rate) / s->frame_number;
168 }
169 }
170
171 11889 return i;
172 }
173