Coverage Report

Created: 2026-01-16 07:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavformat/voc_packet.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2006  Aurelien Jacobs <aurel@gnuage.org>
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
21
#include "libavutil/intreadwrite.h"
22
#include "avformat.h"
23
#include "internal.h"
24
#include "voc.h"
25
26
int
27
ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
28
1.38M
{
29
1.38M
    VocDecContext *voc = s->priv_data;
30
1.38M
    AVCodecParameters *par = st->codecpar;
31
1.38M
    AVIOContext *pb = s->pb;
32
1.38M
    VocType type;
33
1.38M
    int size, tmp_codec=-1;
34
1.38M
    int sample_rate = 0;
35
1.38M
    int channels = 1;
36
1.38M
    int64_t duration;
37
1.38M
    int ret;
38
39
1.38M
    av_add_index_entry(st,
40
1.38M
                       avio_tell(pb),
41
1.38M
                       voc->pts,
42
1.38M
                       voc->remaining_size,
43
1.38M
                       0,
44
1.38M
                       AVINDEX_KEYFRAME);
45
46
3.40M
    while (!voc->remaining_size) {
47
2.04M
        if (max_size < 4)
48
1.90M
            max_size = 0;
49
2.04M
        type = avio_r8(pb);
50
2.04M
        if (type == VOC_TYPE_EOF)
51
18.1k
            return AVERROR_EOF;
52
2.02M
        voc->remaining_size = avio_rl24(pb);
53
2.02M
        if (!voc->remaining_size) {
54
5.34k
            int64_t filesize;
55
5.34k
            if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
56
1.29k
                return AVERROR(ENOSYS);
57
4.05k
            filesize = avio_size(pb);
58
4.05k
            if (filesize - avio_tell(pb) > INT_MAX)
59
1.41k
                return AVERROR_INVALIDDATA;
60
2.64k
            voc->remaining_size = filesize - avio_tell(pb);
61
2.64k
        }
62
2.01M
        max_size -= 4;
63
64
2.01M
        switch (type) {
65
26.2k
        case VOC_TYPE_VOICE_DATA:
66
26.2k
            if (voc->remaining_size < 2) {
67
435
                voc->remaining_size = 0;
68
435
                return AVERROR_INVALIDDATA;
69
435
            }
70
25.8k
            if (!par->sample_rate) {
71
2.60k
                par->sample_rate = 1000000 / (256 - avio_r8(pb));
72
2.60k
                if (sample_rate)
73
136
                    par->sample_rate = sample_rate;
74
2.60k
                avpriv_set_pts_info(st, 64, 1, par->sample_rate);
75
2.60k
                par->ch_layout.nb_channels = channels;
76
2.60k
                par->bits_per_coded_sample = av_get_bits_per_sample(par->codec_id);
77
2.60k
            } else
78
23.2k
                avio_skip(pb, 1);
79
25.8k
            tmp_codec = avio_r8(pb);
80
25.8k
            voc->remaining_size -= 2;
81
25.8k
            max_size -= 2;
82
25.8k
            channels = 1;
83
25.8k
            break;
84
85
1.29M
        case VOC_TYPE_VOICE_DATA_CONT:
86
1.29M
            break;
87
88
1.53k
        case VOC_TYPE_EXTENDED:
89
1.53k
            sample_rate = avio_rl16(pb);
90
1.53k
            avio_r8(pb);
91
1.53k
            channels = avio_r8(pb) + 1;
92
1.53k
            sample_rate = 256000000 / (channels * (65536 - sample_rate));
93
1.53k
            voc->remaining_size = 0;
94
1.53k
            max_size -= 4;
95
1.53k
            break;
96
97
15.8k
        case VOC_TYPE_NEW_VOICE_DATA:
98
15.8k
            if (voc->remaining_size < 12) {
99
429
                voc->remaining_size = 0;
100
429
                return AVERROR_INVALIDDATA;
101
429
            }
102
15.3k
            if (!par->sample_rate) {
103
6.01k
                par->sample_rate = avio_rl32(pb);
104
6.01k
                avpriv_set_pts_info(st, 64, 1, par->sample_rate);
105
6.01k
                par->bits_per_coded_sample = avio_r8(pb);
106
6.01k
                channels = avio_r8(pb);
107
6.01k
                par->ch_layout.nb_channels = channels;
108
6.01k
            } else
109
9.36k
                avio_skip(pb, 6);
110
15.3k
            tmp_codec = avio_rl16(pb);
111
15.3k
            avio_skip(pb, 4);
112
15.3k
            voc->remaining_size -= 12;
113
15.3k
            max_size -= 12;
114
15.3k
            break;
115
116
681k
        default:
117
681k
            avio_skip(pb, voc->remaining_size);
118
681k
            max_size -= voc->remaining_size;
119
681k
            voc->remaining_size = 0;
120
681k
            break;
121
2.01M
        }
122
2.01M
    }
123
124
1.35M
    if (par->sample_rate <= 0) {
125
2.96k
        av_log(s, AV_LOG_ERROR, "Invalid sample rate %d\n", par->sample_rate);
126
2.96k
        return AVERROR_INVALIDDATA;
127
2.96k
    }
128
129
1.35M
    if (tmp_codec >= 0) {
130
37.1k
        tmp_codec = ff_codec_get_id(ff_voc_codec_tags, tmp_codec);
131
37.1k
        if (par->codec_id == AV_CODEC_ID_NONE)
132
5.99k
            par->codec_id = tmp_codec;
133
31.1k
        else if (par->codec_id != tmp_codec)
134
9.85k
            av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
135
37.1k
        if (par->codec_id == AV_CODEC_ID_NONE) {
136
1.52k
            if (s->audio_codec_id == AV_CODEC_ID_NONE) {
137
1.52k
                av_log(s, AV_LOG_ERROR, "unknown codec tag\n");
138
1.52k
                return AVERROR(EINVAL);
139
1.52k
            }
140
0
            av_log(s, AV_LOG_WARNING, "unknown codec tag\n");
141
0
        }
142
37.1k
    }
143
144
1.35M
    par->bit_rate = (int64_t)par->sample_rate * par->ch_layout.nb_channels * par->bits_per_coded_sample;
145
146
1.35M
    if (max_size <= 0)
147
1.24M
        max_size = 2048;
148
1.35M
    size = FFMIN(voc->remaining_size, max_size);
149
1.35M
    voc->remaining_size -= size;
150
151
1.35M
    ret = av_get_packet(pb, pkt, size);
152
1.35M
    pkt->dts = pkt->pts = voc->pts;
153
154
1.35M
    duration = av_get_audio_frame_duration2(st->codecpar, size);
155
1.35M
    if (duration > 0 && voc->pts != AV_NOPTS_VALUE)
156
1.27M
        voc->pts += duration;
157
84.5k
    else
158
84.5k
        voc->pts = AV_NOPTS_VALUE;
159
160
1.35M
    return ret;
161
1.35M
}