FFmpeg
Loading...
Searching...
No Matches
voc_packet.c
Go to the documentation of this file.
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
22#include "avformat.h"
23#include "internal.h"
24#include "voc.h"
25
26int
28{
29 VocDecContext *voc = s->priv_data;
30 AVCodecParameters *par = st->codecpar;
31 AVIOContext *pb = s->pb;
33 int size, tmp_codec=-1;
34 int sample_rate = 0;
35 int channels = 1;
37 int ret;
38
40 avio_tell(pb),
41 voc->pts,
42 voc->remaining_size,
43 0,
45
46 while (!voc->remaining_size) {
47 if (max_size < 4)
48 max_size = 0;
49 type = avio_r8(pb);
50 if (type == VOC_TYPE_EOF)
51 return AVERROR_EOF;
52 voc->remaining_size = avio_rl24(pb);
53 if (!voc->remaining_size) {
55 if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
56 return AVERROR(ENOSYS);
57 filesize = avio_size(pb);
58 if (filesize - avio_tell(pb) > INT_MAX)
61 }
62 max_size -= 4;
63
64 switch (type) {
66 if (voc->remaining_size < 2) {
67 voc->remaining_size = 0;
69 }
70 if (!par->sample_rate) {
71 par->sample_rate = 1000000 / (256 - avio_r8(pb));
72 if (sample_rate)
73 par->sample_rate = sample_rate;
74 avpriv_set_pts_info(st, 64, 1, par->sample_rate);
77 } else
78 avio_skip(pb, 1);
79 tmp_codec = avio_r8(pb);
80 voc->remaining_size -= 2;
81 max_size -= 2;
82 channels = 1;
83 break;
84
86 break;
87
89 sample_rate = avio_rl16(pb);
90 avio_r8(pb);
91 channels = avio_r8(pb) + 1;
92 sample_rate = 256000000 / (channels * (65536 - sample_rate));
93 voc->remaining_size = 0;
94 max_size -= 4;
95 break;
96
98 if (voc->remaining_size < 12) {
99 voc->remaining_size = 0;
100 return AVERROR_INVALIDDATA;
101 }
102 if (!par->sample_rate) {
103 par->sample_rate = avio_rl32(pb);
104 avpriv_set_pts_info(st, 64, 1, par->sample_rate);
106 channels = avio_r8(pb);
108 } else
109 avio_skip(pb, 6);
110 tmp_codec = avio_rl16(pb);
111 avio_skip(pb, 4);
112 voc->remaining_size -= 12;
113 max_size -= 12;
114 break;
115
116 default:
117 avio_skip(pb, voc->remaining_size);
118 max_size -= voc->remaining_size;
119 voc->remaining_size = 0;
120 break;
121 }
122 }
123
124 if (par->sample_rate <= 0) {
125 av_log(s, AV_LOG_ERROR, "Invalid sample rate %d\n", par->sample_rate);
126 return AVERROR_INVALIDDATA;
127 }
128
129 if (tmp_codec >= 0) {
130 tmp_codec = ff_codec_get_id(ff_voc_codec_tags, tmp_codec);
131 if (par->codec_id == AV_CODEC_ID_NONE)
132 par->codec_id = tmp_codec;
133 else if (par->codec_id != tmp_codec)
134 av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
135 if (par->codec_id == AV_CODEC_ID_NONE) {
136 if (s->audio_codec_id == AV_CODEC_ID_NONE) {
137 av_log(s, AV_LOG_ERROR, "unknown codec tag\n");
138 return AVERROR(EINVAL);
139 }
140 av_log(s, AV_LOG_WARNING, "unknown codec tag\n");
141 }
142 }
143
145
146 if (max_size <= 0)
147 max_size = 2048;
148 size = FFMIN(voc->remaining_size, max_size);
149 voc->remaining_size -= size;
150
151 ret = av_get_packet(pb, pkt, size);
152 pkt->dts = pkt->pts = voc->pts;
153
155 if (duration > 0 && voc->pts != AV_NOPTS_VALUE)
156 voc->pts += duration;
157 else
158 voc->pts = AV_NOPTS_VALUE;
159
160 return ret;
161}
channels
Definition aptx.h:31
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition avformat.c:834
Main libavformat public API header.
#define AVINDEX_KEYFRAME
Definition avformat.h:628
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition utils.c:98
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition avio.h:41
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition aviobuf.c:326
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition avio.h:494
unsigned int avio_rl16(AVIOContext *s)
Definition aviobuf.c:717
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition aviobuf.c:321
unsigned int avio_rl32(AVIOContext *s)
Definition aviobuf.c:733
unsigned int avio_rl24(AVIOContext *s)
Definition aviobuf.c:725
int avio_r8(AVIOContext *s)
Definition aviobuf.c:606
#define s(width, name)
Definition cbs_vp9.c:198
long long int64_t
Definition coverity.c:34
static AVPacket * pkt
static int64_t filesize(AVIOContext *pb)
Definition ffmpeg_mux.c:51
static int64_t duration
Definition ffplay.c:330
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
Definition utils.c:556
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition seek.c:122
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
cl_device_type type
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
Definition utils.c:823
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition utils.c:143
#define FFMIN(a, b)
Definition macros.h:49
int nb_channels
Number of channels in this layout.
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition codec_par.h:113
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition codec_par.h:207
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition codec_par.h:99
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
int sample_rate
The number of audio samples per second.
Definition codec_par.h:213
Format I/O context.
Definition avformat.h:1333
Bytestream IO Context.
Definition avio.h:160
This structure stores compressed data.
Definition packet.h:580
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
int64_t pts
Definition voc.h:30
int64_t remaining_size
Definition voc.h:29
#define av_log(a,...)
int size
const AVCodecTag ff_voc_codec_tags[]
Definition voc.c:28
VocType
Definition voc.h:33
@ VOC_TYPE_VOICE_DATA
Definition voc.h:35
@ VOC_TYPE_EXTENDED
Definition voc.h:42
@ VOC_TYPE_VOICE_DATA_CONT
Definition voc.h:36
@ VOC_TYPE_EOF
Definition voc.h:34
@ VOC_TYPE_NEW_VOICE_DATA
Definition voc.h:43
int ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
Definition voc_packet.c:27