annotate wv.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents 17c0ce4cc314
children 1d3d17de20ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
1 /*
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
2 * WavPack demuxer
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov.
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1324
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1324
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1324
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1324
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1324
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
16 *
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1324
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
20 */
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
21
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2771
diff changeset
22 #include "libavutil/bswap.h"
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
23 #include "avformat.h"
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
24
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
25 // specs say that maximum block size is 1Mb
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
26 #define WV_BLOCK_LIMIT 1047576
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
27
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
28 #define WV_EXTRA_SIZE 12
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
29
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
30 enum WV_FLAGS{
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
31 WV_MONO = 0x0004,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
32 WV_HYBRID = 0x0008,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
33 WV_JOINT = 0x0010,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
34 WV_CROSSD = 0x0020,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
35 WV_HSHAPE = 0x0040,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
36 WV_FLOAT = 0x0080,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
37 WV_INT32 = 0x0100,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
38 WV_HBR = 0x0200,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
39 WV_HBAL = 0x0400,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
40 WV_MCINIT = 0x0800,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
41 WV_MCEND = 0x1000,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
42 };
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
43
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
44 static const int wv_rates[16] = {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
45 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
46 32000, 44100, 48000, 64000, 88200, 96000, 192000, -1
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
47 };
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
48
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
49 typedef struct{
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
50 uint32_t blksize, flags;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
51 int rate, chan, bpp;
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
52 uint32_t samples, soff;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
53 int block_parsed;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
54 uint8_t extra[WV_EXTRA_SIZE];
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
55 int64_t pos;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
56 }WVContext;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
57
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
58 static int wv_probe(AVProbeData *p)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
59 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
60 /* check file header */
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
61 if (p->buf_size <= 32)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
62 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
63 if (p->buf[0] == 'w' && p->buf[1] == 'v' &&
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
64 p->buf[2] == 'p' && p->buf[3] == 'k')
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
65 return AVPROBE_SCORE_MAX;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
66 else
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
67 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
68 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
69
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
70 static int wv_read_block_header(AVFormatContext *ctx, ByteIOContext *pb)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
71 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
72 WVContext *wc = ctx->priv_data;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
73 uint32_t tag, ver;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
74 int size;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
75 int rate, bpp, chan;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
76
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
77 wc->pos = url_ftell(pb);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
78 tag = get_le32(pb);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
79 if (tag != MKTAG('w', 'v', 'p', 'k'))
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
80 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
81 size = get_le32(pb);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
82 if(size < 24 || size > WV_BLOCK_LIMIT){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
83 av_log(ctx, AV_LOG_ERROR, "Incorrect block size %i\n", size);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
84 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
85 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
86 wc->blksize = size;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
87 ver = get_le16(pb);
2380
41c9871ea3c4 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 2314
diff changeset
88 if(ver < 0x402 || ver > 0x410){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
89 av_log(ctx, AV_LOG_ERROR, "Unsupported version %03X\n", ver);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
90 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
91 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
92 get_byte(pb); // track no
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
93 get_byte(pb); // track sub index
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
94 wc->samples = get_le32(pb); // total samples in file
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
95 wc->soff = get_le32(pb); // offset in samples of current block
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
96 get_buffer(pb, wc->extra, WV_EXTRA_SIZE);
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1391
diff changeset
97 wc->flags = AV_RL32(wc->extra + 4);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
98 //parse flags
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
99 if(wc->flags & WV_FLOAT){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
100 av_log(ctx, AV_LOG_ERROR, "Floating point data is not supported\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
101 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
102 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
103 if(wc->flags & WV_HYBRID){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
104 av_log(ctx, AV_LOG_ERROR, "Hybrid coding mode is not supported\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
105 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
106 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
107
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
108 bpp = ((wc->flags & 3) + 1) << 3;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
109 chan = 1 + !(wc->flags & WV_MONO);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
110 rate = wv_rates[(wc->flags >> 23) & 0xF];
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
111 if(rate == -1){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
112 av_log(ctx, AV_LOG_ERROR, "Unknown sampling rate\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
113 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
114 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
115 if(!wc->bpp) wc->bpp = bpp;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
116 if(!wc->chan) wc->chan = chan;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
117 if(!wc->rate) wc->rate = rate;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
118
1389
9ed80abc8eb7 Ignore blocks with no samples and flags (but usually with MD5 sum)
kostya
parents: 1387
diff changeset
119 if(wc->flags && bpp != wc->bpp){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
120 av_log(ctx, AV_LOG_ERROR, "Bits per sample differ, this block: %i, header block: %i\n", bpp, wc->bpp);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
121 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
122 }
1389
9ed80abc8eb7 Ignore blocks with no samples and flags (but usually with MD5 sum)
kostya
parents: 1387
diff changeset
123 if(wc->flags && chan != wc->chan){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
124 av_log(ctx, AV_LOG_ERROR, "Channels differ, this block: %i, header block: %i\n", chan, wc->chan);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
125 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
126 }
1389
9ed80abc8eb7 Ignore blocks with no samples and flags (but usually with MD5 sum)
kostya
parents: 1387
diff changeset
127 if(wc->flags && rate != wc->rate){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
128 av_log(ctx, AV_LOG_ERROR, "Sampling rate differ, this block: %i, header block: %i\n", rate, wc->rate);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
129 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
130 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
131 wc->blksize = size - 24;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
132 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
133 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
134
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
135 static int wv_read_header(AVFormatContext *s,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
136 AVFormatParameters *ap)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
137 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
138 ByteIOContext *pb = s->pb;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
139 WVContext *wc = s->priv_data;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
140 AVStream *st;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
141
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
142 if(wv_read_block_header(s, pb) < 0)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
143 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
144
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
145 wc->block_parsed = 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
146 /* now we are ready: build format streams */
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
147 st = av_new_stream(s, 0);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
148 if (!st)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
149 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
150 st->codec->codec_type = CODEC_TYPE_AUDIO;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
151 st->codec->codec_id = CODEC_ID_WAVPACK;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
152 st->codec->channels = wc->chan;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
153 st->codec->sample_rate = wc->rate;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
154 st->codec->bits_per_sample = wc->bpp;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
155 av_set_pts_info(st, 64, 1, wc->rate);
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
156 s->start_time = 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
157 s->duration = (int64_t)wc->samples * AV_TIME_BASE / st->codec->sample_rate;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
158 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
159 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
160
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
161 static int wv_read_packet(AVFormatContext *s,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
162 AVPacket *pkt)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
163 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
164 WVContext *wc = s->priv_data;
1391
669d33f6dde5 Remove unused variable.
diego
parents: 1389
diff changeset
165 int ret;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
166
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
167 if (url_feof(s->pb))
1787
eb16c64144ee This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents: 1743
diff changeset
168 return AVERROR(EIO);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
169 if(wc->block_parsed){
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
170 if(wv_read_block_header(s, s->pb) < 0)
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
171 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
172 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
173
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
174 if(av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE) < 0)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 1787
diff changeset
175 return AVERROR(ENOMEM);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
176 memcpy(pkt->data, wc->extra, WV_EXTRA_SIZE);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
177 ret = get_buffer(s->pb, pkt->data + WV_EXTRA_SIZE, wc->blksize);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
178 if(ret != wc->blksize){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
179 av_free_packet(pkt);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
180 return AVERROR(EIO);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
181 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
182 pkt->stream_index = 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
183 wc->block_parsed = 1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
184 pkt->size = ret + WV_EXTRA_SIZE;
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
185 pkt->pts = wc->soff;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
186 av_add_index_entry(s->streams[0], wc->pos, pkt->pts, 0, 0, AVINDEX_KEYFRAME);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
187 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
188 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
189
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
190 static int wv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
191 {
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
192 AVStream *st = s->streams[stream_index];
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
193 WVContext *wc = s->priv_data;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
194 AVPacket pkt1, *pkt = &pkt1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
195 int ret;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
196 int index = av_index_search_timestamp(st, timestamp, flags);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
197 int64_t pos, pts;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
198
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
199 /* if found, seek there */
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
200 if (index >= 0){
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
201 wc->block_parsed = 1;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
202 url_fseek(s->pb, st->index_entries[index].pos, SEEK_SET);
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
203 return 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
204 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
205 /* if timestamp is out of bounds, return error */
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
206 if(timestamp < 0 || timestamp >= s->duration)
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
207 return -1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
208
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
209 pos = url_ftell(s->pb);
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
210 do{
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
211 ret = av_read_frame(s, pkt);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
212 if (ret < 0){
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2555
diff changeset
213 url_fseek(s->pb, pos, SEEK_SET);
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
214 return -1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
215 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
216 pts = pkt->pts;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
217 av_free_packet(pkt);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
218 }while(pts < timestamp);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
219 return 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
220 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
221
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
222 AVInputFormat wv_demuxer = {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
223 "wv",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
224 NULL_IF_CONFIG_SMALL("WavPack"),
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
225 sizeof(WVContext),
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
226 wv_probe,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
227 wv_read_header,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
228 wv_read_packet,
3482
17c0ce4cc314 remove useless close func
bcoudurier
parents: 3424
diff changeset
229 NULL,
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
230 wv_read_seek,
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
231 };