annotate wv.c @ 2660:022174d849d5 libavformat

fix issue 225, instead of stoping when wrong atom size is found, limit atom size to what is left, assuming container atom has correct size.. cricket4.3g2 has incorrect moov atom size which indicates that file size should be 2 bytes bigger than it is and quicktime reads it correctly though.
author bcoudurier
date Mon, 22 Oct 2007 14:36:14 +0000
parents c226029c8df4
children d52c718e83f9
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
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
22 #include "avformat.h"
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
23 #include "bswap.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 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
138 ByteIOContext *pb = &s->pb;
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
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
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){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
170 if(wv_read_block_header(s, &s->pb) < 0)
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);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
177 ret = get_buffer(&s->pb, pkt->data + WV_EXTRA_SIZE, wc->blksize);
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
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
190 static int wv_read_close(AVFormatContext *s)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
191 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
192 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
193 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
194
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
195 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
196 {
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
197 AVStream *st = s->streams[stream_index];
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
198 WVContext *wc = s->priv_data;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
199 AVPacket pkt1, *pkt = &pkt1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
200 int ret;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
201 int index = av_index_search_timestamp(st, timestamp, flags);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
202 int64_t pos, pts;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
203
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
204 /* if found, seek there */
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
205 if (index >= 0){
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
206 wc->block_parsed = 1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
207 url_fseek(&s->pb, st->index_entries[index].pos, SEEK_SET);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
208 return 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
209 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
210 /* if timestamp is out of bounds, return error */
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
211 if(timestamp < 0 || timestamp >= s->duration)
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
212 return -1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
213
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
214 pos = url_ftell(&s->pb);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
215 do{
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
216 ret = av_read_frame(s, pkt);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
217 if (ret < 0){
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
218 url_fseek(&s->pb, pos, SEEK_SET);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
219 return -1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
220 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
221 pts = pkt->pts;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
222 av_free_packet(pkt);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
223 }while(pts < timestamp);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
224 return 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
225 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
226
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
227 AVInputFormat wv_demuxer = {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
228 "wv",
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
229 "WavPack",
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
230 sizeof(WVContext),
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
231 wv_probe,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
232 wv_read_header,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
233 wv_read_packet,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
234 wv_read_close,
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
235 wv_read_seek,
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
236 };