FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavformat/ac3dec.c
Date: 2024-02-16 17:37:06
Exec Total Coverage
Lines: 49 51 96.1%
Functions: 3 3 100.0%
Branches: 49 54 90.7%

Line Branch Exec Source
1 /*
2 * RAW AC-3 and E-AC-3 demuxer
3 * Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include "config_components.h"
23
24 #include "libavutil/avassert.h"
25 #include "libavutil/crc.h"
26 #include "libavcodec/ac3_parser.h"
27 #include "avformat.h"
28 #include "rawdec.h"
29
30 14046 static int ac3_eac3_probe(const AVProbeData *p, enum AVCodecID expected_codec_id)
31 {
32 14046 int max_frames, first_frames = 0, frames;
33 const uint8_t *buf, *buf2, *end;
34 14046 enum AVCodecID codec_id = AV_CODEC_ID_AC3;
35
36 14046 max_frames = 0;
37 14046 buf = p->buf;
38 14046 end = buf + p->buf_size;
39
40
2/2
✓ Branch 0 taken 283603302 times.
✓ Branch 1 taken 14046 times.
283617348 for(; buf < end; buf++) {
41
6/6
✓ Branch 0 taken 283589256 times.
✓ Branch 1 taken 14046 times.
✓ Branch 2 taken 1711566 times.
✓ Branch 3 taken 281877690 times.
✓ Branch 4 taken 1707638 times.
✓ Branch 5 taken 3928 times.
283603302 if(buf > p->buf && !(buf[0] == 0x0B && buf[1] == 0x77)
42
4/4
✓ Branch 0 taken 497262 times.
✓ Branch 1 taken 283088066 times.
✓ Branch 2 taken 491092 times.
✓ Branch 3 taken 6170 times.
283585328 && !(buf[0] == 0x77 && buf[1] == 0x0B) )
43 283579158 continue;
44 24144 buf2 = buf;
45
46
2/2
✓ Branch 0 taken 113478 times.
✓ Branch 1 taken 104 times.
113582 for(frames = 0; buf2 < end; frames++) {
47 uint8_t buf3[4096];
48 uint8_t bitstream_id;
49 uint16_t frame_size;
50 int i, ret;
51
52
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 113478 times.
113478 if(!memcmp(buf2, "\x1\x10", 2)) {
53 if (buf2 + 16 > end)
54 24040 break;
55 buf2+=16;
56 }
57
4/4
✓ Branch 0 taken 6416 times.
✓ Branch 1 taken 107062 times.
✓ Branch 2 taken 6348 times.
✓ Branch 3 taken 68 times.
113478 if (buf[0] == 0x77 && buf[1] == 0x0B) {
58
2/2
✓ Branch 0 taken 25392 times.
✓ Branch 1 taken 6348 times.
31740 for(i=0; i<8; i+=2) {
59 25392 buf3[i ] = buf2[i+1];
60 25392 buf3[i+1] = buf2[i ];
61 }
62 6348 ret = av_ac3_parse_header(buf3, 8, &bitstream_id,
63 &frame_size);
64 }else
65 107130 ret = av_ac3_parse_header(buf2, end - buf2, &bitstream_id,
66 &frame_size);
67
2/2
✓ Branch 0 taken 17500 times.
✓ Branch 1 taken 95978 times.
113478 if (ret < 0)
68 17500 break;
69
2/2
✓ Branch 0 taken 1726 times.
✓ Branch 1 taken 94252 times.
95978 if(buf2 + frame_size > end)
70 1726 break;
71
3/4
✓ Branch 0 taken 3940 times.
✓ Branch 1 taken 90312 times.
✓ Branch 2 taken 3940 times.
✗ Branch 3 not taken.
94252 if (buf[0] == 0x77 && buf[1] == 0x0B) {
72
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3940 times.
3940 av_assert0(frame_size <= sizeof(buf3));
73
2/2
✓ Branch 0 taken 2178270 times.
✓ Branch 1 taken 3940 times.
2182210 for(i = 8; i < frame_size; i += 2) {
74 2178270 buf3[i ] = buf2[i+1];
75 2178270 buf3[i+1] = buf2[i ];
76 }
77
2/2
✓ Branch 1 taken 3762 times.
✓ Branch 2 taken 178 times.
3940 if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf3 + 2, frame_size - 2))
78 3762 break;
79 } else {
80
2/2
✓ Branch 1 taken 1052 times.
✓ Branch 2 taken 89260 times.
90312 if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, frame_size - 2))
81 1052 break;
82 }
83
2/2
✓ Branch 0 taken 87600 times.
✓ Branch 1 taken 1838 times.
89438 if (bitstream_id > 10)
84 87600 codec_id = AV_CODEC_ID_EAC3;
85 89438 buf2 += frame_size;
86 }
87 24144 max_frames = FFMAX(max_frames, frames);
88
2/2
✓ Branch 0 taken 14046 times.
✓ Branch 1 taken 10098 times.
24144 if(buf == p->buf)
89 14046 first_frames = frames;
90 }
91
2/2
✓ Branch 0 taken 7023 times.
✓ Branch 1 taken 7023 times.
14046 if(codec_id != expected_codec_id) return 0;
92 // keep this in sync with mp3 probe, both need to avoid
93 // issues with MPEG-files!
94
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 7003 times.
7023 if (first_frames>=7) return AVPROBE_SCORE_EXTENSION + 1;
95
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7002 times.
7003 else if(max_frames>200)return AVPROBE_SCORE_EXTENSION;
96
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 6980 times.
7002 else if(max_frames>=4) return AVPROBE_SCORE_EXTENSION/2;
97
2/2
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 6929 times.
6980 else if(max_frames>=1) return 1;
98 6929 else return 0;
99 }
100
101 #if CONFIG_AC3_DEMUXER
102 7023 static int ac3_probe(const AVProbeData *p)
103 {
104 7023 return ac3_eac3_probe(p, AV_CODEC_ID_AC3);
105 }
106
107 const AVInputFormat ff_ac3_demuxer = {
108 .name = "ac3",
109 .long_name = NULL_IF_CONFIG_SMALL("raw AC-3"),
110 .read_probe = ac3_probe,
111 .read_header = ff_raw_audio_read_header,
112 .read_packet = ff_raw_read_partial_packet,
113 .flags= AVFMT_GENERIC_INDEX,
114 .extensions = "ac3",
115 .raw_codec_id = AV_CODEC_ID_AC3,
116 .priv_data_size = sizeof(FFRawDemuxerContext),
117 .priv_class = &ff_raw_demuxer_class,
118 };
119 #endif
120
121 #if CONFIG_EAC3_DEMUXER
122 7023 static int eac3_probe(const AVProbeData *p)
123 {
124 7023 return ac3_eac3_probe(p, AV_CODEC_ID_EAC3);
125 }
126
127 const AVInputFormat ff_eac3_demuxer = {
128 .name = "eac3",
129 .long_name = NULL_IF_CONFIG_SMALL("raw E-AC-3"),
130 .read_probe = eac3_probe,
131 .read_header = ff_raw_audio_read_header,
132 .read_packet = ff_raw_read_partial_packet,
133 .flags = AVFMT_GENERIC_INDEX,
134 .extensions = "eac3,ec3",
135 .raw_codec_id = AV_CODEC_ID_EAC3,
136 .priv_data_size = sizeof(FFRawDemuxerContext),
137 .priv_class = &ff_raw_demuxer_class,
138 };
139 #endif
140