Coverage Report

Created: 2025-11-16 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavformat/afc.c
Line
Count
Source
1
/*
2
 * AFC demuxer
3
 * Copyright (c) 2012 Paul B Mahol
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 "libavutil/channel_layout.h"
23
#include "avformat.h"
24
#include "demux.h"
25
#include "internal.h"
26
27
typedef struct AFCDemuxContext {
28
    int64_t    data_end;
29
} AFCDemuxContext;
30
31
static int afc_read_header(AVFormatContext *s)
32
1.02k
{
33
1.02k
    AFCDemuxContext *c = s->priv_data;
34
1.02k
    AVStream *st;
35
1.02k
    int ret;
36
37
1.02k
    st = avformat_new_stream(s, NULL);
38
1.02k
    if (!st)
39
0
        return AVERROR(ENOMEM);
40
1.02k
    st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
41
1.02k
    st->codecpar->codec_id   = AV_CODEC_ID_ADPCM_AFC;
42
1.02k
    st->codecpar->ch_layout  = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
43
44
1.02k
    if ((ret = ff_alloc_extradata(st->codecpar, 1)) < 0)
45
0
        return ret;
46
1.02k
    st->codecpar->extradata[0] = 8 * st->codecpar->ch_layout.nb_channels;
47
48
1.02k
    c->data_end = avio_rb32(s->pb) + 32LL;
49
1.02k
    st->duration = avio_rb32(s->pb);
50
1.02k
    st->codecpar->sample_rate = avio_rb16(s->pb);
51
1.02k
    avio_skip(s->pb, 22);
52
1.02k
    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
53
54
1.02k
    return 0;
55
1.02k
}
56
57
static int afc_read_packet(AVFormatContext *s, AVPacket *pkt)
58
24.5k
{
59
24.5k
    AFCDemuxContext *c = s->priv_data;
60
24.5k
    int64_t size = c->data_end - avio_tell(s->pb);
61
24.5k
    int ret;
62
63
24.5k
    size = FFMIN(size, 18 * 128);
64
24.5k
    if (size <= 0)
65
163
        return AVERROR_EOF;
66
67
24.3k
    ret = av_get_packet(s->pb, pkt, size);
68
24.3k
    pkt->stream_index = 0;
69
24.3k
    return ret;
70
24.5k
}
71
72
const FFInputFormat ff_afc_demuxer = {
73
    .p.name         = "afc",
74
    .p.long_name    = NULL_IF_CONFIG_SMALL("AFC"),
75
    .p.extensions   = "afc",
76
    .p.flags        = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK,
77
    .priv_data_size = sizeof(AFCDemuxContext),
78
    .read_header    = afc_read_header,
79
    .read_packet    = afc_read_packet,
80
};