FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac_ac3_parser.c
Date: 2025-01-20 09:27:23
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 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