annotate wv.c @ 2065:64bd1b09cef2 libavformat

patch so that the deprecated items show up correctly when building doxygen docs patch by mark cox melbournemark plus ffmpeg minus devel chez gmail dot com
author benoit
date Wed, 02 May 2007 09:13:47 +0000
parents eb16c64144ee
children 7eb456c4ed8a
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 "allformats.h"
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
24 #include "bswap.h"
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
25
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
26 // specs say that maximum block size is 1Mb
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
27 #define WV_BLOCK_LIMIT 1047576
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
28
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
29 #define WV_EXTRA_SIZE 12
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
30
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
31 enum WV_FLAGS{
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
32 WV_MONO = 0x0004,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
33 WV_HYBRID = 0x0008,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
34 WV_JOINT = 0x0010,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
35 WV_CROSSD = 0x0020,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
36 WV_HSHAPE = 0x0040,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
37 WV_FLOAT = 0x0080,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
38 WV_INT32 = 0x0100,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
39 WV_HBR = 0x0200,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
40 WV_HBAL = 0x0400,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
41 WV_MCINIT = 0x0800,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
42 WV_MCEND = 0x1000,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
43 };
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
44
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
45 static const int wv_rates[16] = {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
46 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
47 32000, 44100, 48000, 64000, 88200, 96000, 192000, -1
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
48 };
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
49
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
50 typedef struct{
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
51 uint32_t blksize, flags;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
52 int rate, chan, bpp;
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
53 uint32_t samples, soff;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
54 int block_parsed;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
55 uint8_t extra[WV_EXTRA_SIZE];
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
56 int64_t pos;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
57 }WVContext;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
58
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
59 static int wv_probe(AVProbeData *p)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
60 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
61 /* check file header */
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
62 if (p->buf_size <= 32)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
63 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
64 if (p->buf[0] == 'w' && p->buf[1] == 'v' &&
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
65 p->buf[2] == 'p' && p->buf[3] == 'k')
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
66 return AVPROBE_SCORE_MAX;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
67 else
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
68 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
69 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
70
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
71 static int wv_read_block_header(AVFormatContext *ctx, ByteIOContext *pb)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
72 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
73 WVContext *wc = ctx->priv_data;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
74 uint32_t tag, ver;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
75 int size;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
76 int rate, bpp, chan;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
77
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
78 wc->pos = url_ftell(pb);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
79 tag = get_le32(pb);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
80 if (tag != MKTAG('w', 'v', 'p', 'k'))
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
81 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
82 size = get_le32(pb);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
83 if(size < 24 || size > WV_BLOCK_LIMIT){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
84 av_log(ctx, AV_LOG_ERROR, "Incorrect block size %i\n", size);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
85 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
86 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
87 wc->blksize = size;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
88 ver = get_le16(pb);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
89 if(ver < 0x402 || ver > 0x40F){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
90 av_log(ctx, AV_LOG_ERROR, "Unsupported version %03X\n", ver);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
91 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
92 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
93 get_byte(pb); // track no
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
94 get_byte(pb); // track sub index
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
95 wc->samples = get_le32(pb); // total samples in file
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
96 wc->soff = get_le32(pb); // offset in samples of current block
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
97 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
98 wc->flags = AV_RL32(wc->extra + 4);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
99 //parse flags
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
100 if(wc->flags & WV_FLOAT){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
101 av_log(ctx, AV_LOG_ERROR, "Floating point data is not supported\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
102 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
103 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
104 if(wc->flags & WV_HYBRID){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
105 av_log(ctx, AV_LOG_ERROR, "Hybrid coding mode is not supported\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
106 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
107 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
108 if(wc->flags & WV_INT32){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
109 av_log(ctx, AV_LOG_ERROR, "Integer point data is not supported\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
110 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
111 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
112
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
113 bpp = ((wc->flags & 3) + 1) << 3;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
114 chan = 1 + !(wc->flags & WV_MONO);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
115 rate = wv_rates[(wc->flags >> 23) & 0xF];
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
116 if(rate == -1){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
117 av_log(ctx, AV_LOG_ERROR, "Unknown sampling rate\n");
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
118 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
119 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
120 if(!wc->bpp) wc->bpp = bpp;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
121 if(!wc->chan) wc->chan = chan;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
122 if(!wc->rate) wc->rate = rate;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
123
1389
9ed80abc8eb7 Ignore blocks with no samples and flags (but usually with MD5 sum)
kostya
parents: 1387
diff changeset
124 if(wc->flags && bpp != wc->bpp){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
125 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
126 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
127 }
1389
9ed80abc8eb7 Ignore blocks with no samples and flags (but usually with MD5 sum)
kostya
parents: 1387
diff changeset
128 if(wc->flags && chan != wc->chan){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
129 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
130 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
131 }
1389
9ed80abc8eb7 Ignore blocks with no samples and flags (but usually with MD5 sum)
kostya
parents: 1387
diff changeset
132 if(wc->flags && rate != wc->rate){
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
133 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
134 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
135 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
136 wc->blksize = size - 24;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
137 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
138 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
139
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
140 static int wv_read_header(AVFormatContext *s,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
141 AVFormatParameters *ap)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
142 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
143 ByteIOContext *pb = &s->pb;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
144 WVContext *wc = s->priv_data;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
145 AVStream *st;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
146
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
147 if(wv_read_block_header(s, pb) < 0)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
148 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
149
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
150 wc->block_parsed = 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
151 /* now we are ready: build format streams */
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
152 st = av_new_stream(s, 0);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
153 if (!st)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
154 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
155 st->codec->codec_type = CODEC_TYPE_AUDIO;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
156 st->codec->codec_id = CODEC_ID_WAVPACK;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
157 st->codec->channels = wc->chan;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
158 st->codec->sample_rate = wc->rate;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
159 st->codec->bits_per_sample = wc->bpp;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
160 av_set_pts_info(st, 64, 1, wc->rate);
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
161 s->start_time = 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
162 s->duration = (int64_t)wc->samples * AV_TIME_BASE / st->codec->sample_rate;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
163 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
164 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
165
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
166 static int wv_read_packet(AVFormatContext *s,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
167 AVPacket *pkt)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
168 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
169 WVContext *wc = s->priv_data;
1391
669d33f6dde5 Remove unused variable.
diego
parents: 1389
diff changeset
170 int ret;
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
171
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
172 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
173 return AVERROR(EIO);
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
174 if(wc->block_parsed){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
175 if(wv_read_block_header(s, &s->pb) < 0)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
176 return -1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
177 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
178
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
179 if(av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE) < 0)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
180 return AVERROR_NOMEM;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
181 memcpy(pkt->data, wc->extra, WV_EXTRA_SIZE);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
182 ret = get_buffer(&s->pb, pkt->data + WV_EXTRA_SIZE, wc->blksize);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
183 if(ret != wc->blksize){
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
184 av_free_packet(pkt);
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
185 return AVERROR_IO;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
186 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
187 pkt->stream_index = 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
188 wc->block_parsed = 1;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
189 pkt->size = ret + WV_EXTRA_SIZE;
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
190 pkt->pts = wc->soff;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
191 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
192 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
193 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
194
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
195 static int wv_read_close(AVFormatContext *s)
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
196 {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
197 return 0;
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
198 }
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
199
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
200 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
201 {
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
202 AVStream *st = s->streams[stream_index];
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
203 WVContext *wc = s->priv_data;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
204 AVPacket pkt1, *pkt = &pkt1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
205 int ret;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
206 int index = av_index_search_timestamp(st, timestamp, flags);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
207 int64_t pos, pts;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
208
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
209 /* if found, seek there */
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
210 if (index >= 0){
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
211 wc->block_parsed = 1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
212 url_fseek(&s->pb, st->index_entries[index].pos, SEEK_SET);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
213 return 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
214 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
215 /* if timestamp is out of bounds, return error */
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
216 if(timestamp < 0 || timestamp >= s->duration)
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
217 return -1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
218
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
219 pos = url_ftell(&s->pb);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
220 do{
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
221 ret = av_read_frame(s, pkt);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
222 if (ret < 0){
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
223 url_fseek(&s->pb, pos, SEEK_SET);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
224 return -1;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
225 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
226 pts = pkt->pts;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
227 av_free_packet(pkt);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
228 }while(pts < timestamp);
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
229 return 0;
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
230 }
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
231
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
232 AVInputFormat wv_demuxer = {
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
233 "wv",
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
234 "WavPack",
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
235 sizeof(WVContext),
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
236 wv_probe,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
237 wv_read_header,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
238 wv_read_packet,
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
239 wv_read_close,
1743
75909fc5b5a9 Seeking support in WavPack
kostya
parents: 1673
diff changeset
240 wv_read_seek,
1324
024cf76ac4d1 WavPack lossless audio decoder
kostya
parents:
diff changeset
241 };