annotate mpc.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 1a3c9056982a
children 06083249909c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
1 /*
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
2 * Musepack demuxer
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
4 *
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
6 *
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
11 *
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
16 *
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
20 */
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
21 #include "avformat.h"
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
22 #include "bitstream.h"
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
23
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
24 #define MPC_FRAMESIZE 1152
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
25 #define DELAY_FRAMES 32
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
26
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
27 static const int mpc_rate[4] = { 44100, 48000, 37800, 32000 };
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
28 typedef struct {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
29 int64_t pos;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
30 int size, skip;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
31 }MPCFrame;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
32
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
33 typedef struct {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
34 int ver;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
35 uint32_t curframe, lastframe;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
36 uint32_t fcount;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
37 MPCFrame *frames;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
38 int curbits;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
39 int frames_noted;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
40 } MPCContext;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
41
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
42 static int mpc_probe(AVProbeData *p)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
43 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
44 const uint8_t *d = p->buf;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
45 if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7))
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
46 return AVPROBE_SCORE_MAX;
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
47 if (d[0] == 'I' && d[1] == 'D' && d[2] == '3')
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
48 return AVPROBE_SCORE_MAX / 2;
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
49 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
50 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
51
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
52 static int mpc_read_header(AVFormatContext *s, AVFormatParameters *ap)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
53 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
54 MPCContext *c = s->priv_data;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
55 AVStream *st;
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
56 int t;
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
57
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
58 t = get_le24(&s->pb);
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
59 if(t != MKTAG('M', 'P', '+', 0)){
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
60 if(t != MKTAG('I', 'D', '3', 0)){
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
61 av_log(s, AV_LOG_ERROR, "Not a Musepack file\n");
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
62 return -1;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
63 }
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
64 /* skip ID3 tags and try again */
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
65 url_fskip(&s->pb, 3);
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
66 t = get_byte(&s->pb) << 21;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
67 t |= get_byte(&s->pb) << 14;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
68 t |= get_byte(&s->pb) << 7;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
69 t |= get_byte(&s->pb);
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
70 av_log(s, AV_LOG_DEBUG, "Skipping %d(%X) bytes of ID3 data\n", t, t);
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
71 url_fskip(&s->pb, t);
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
72 if(get_le24(&s->pb) != MKTAG('M', 'P', '+', 0)){
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
73 av_log(s, AV_LOG_ERROR, "Not a Musepack file\n");
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
74 return -1;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
75 }
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
76 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
77 c->ver = get_byte(&s->pb);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
78 if(c->ver != 0x07 && c->ver != 0x17){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
79 av_log(s, AV_LOG_ERROR, "Can demux Musepack SV7, got version %02X\n", c->ver);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
80 return -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
81 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
82 c->fcount = get_le32(&s->pb);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
83 if((int64_t)c->fcount * sizeof(MPCFrame) >= UINT_MAX){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
84 av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not possible\n");
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
85 return -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
86 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
87 c->frames = av_malloc(c->fcount * sizeof(MPCFrame));
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
88 c->curframe = 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
89 c->lastframe = -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
90 c->curbits = 8;
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
91 c->frames_noted = 0;
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
92
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
93 st = av_new_stream(s, 0);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
94 if (!st)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
95 return AVERROR_NOMEM;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
96 st->codec->codec_type = CODEC_TYPE_AUDIO;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
97 st->codec->codec_id = CODEC_ID_MUSEPACK7;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
98 st->codec->channels = 2;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
99 st->codec->bits_per_sample = 16;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
100
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
101 st->codec->extradata_size = 16;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
102 st->codec->extradata = av_mallocz(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
103 get_buffer(&s->pb, st->codec->extradata, 16);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
104 st->codec->sample_rate = mpc_rate[st->codec->extradata[2] & 3];
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
105 av_set_pts_info(st, 32, MPC_FRAMESIZE, st->codec->sample_rate);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
106 /* scan for seekpoints */
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
107 s->start_time = 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
108 s->duration = (int64_t)c->fcount * MPC_FRAMESIZE * AV_TIME_BASE / st->codec->sample_rate;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
109
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
110 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
111 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
112
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
113 static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
114 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
115 MPCContext *c = s->priv_data;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
116 int ret, size, size2, curbits, cur = c->curframe;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
117 int64_t tmp, pos;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
118
1645
9aa27a785d1f 10l, > vs. >= typo, caused crashes on last mpc frame
reimar
parents: 1610
diff changeset
119 if (c->curframe >= c->fcount)
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
120 return -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
121
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
122 if(c->curframe != c->lastframe + 1){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
123 url_fseek(&s->pb, c->frames[c->curframe].pos, SEEK_SET);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
124 c->curbits = c->frames[c->curframe].skip;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
125 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
126 c->lastframe = c->curframe;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
127 c->curframe++;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
128 curbits = c->curbits;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
129 pos = url_ftell(&s->pb);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
130 tmp = get_le32(&s->pb);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
131 if(curbits <= 12){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
132 size2 = (tmp >> (12 - curbits)) & 0xFFFFF;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
133 }else{
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
134 tmp = (tmp << 32) | get_le32(&s->pb);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
135 size2 = (tmp >> (44 - curbits)) & 0xFFFFF;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
136 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
137 curbits += 20;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
138 url_fseek(&s->pb, pos, SEEK_SET);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
139
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
140 size = ((size2 + curbits + 31) & ~31) >> 3;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
141 if(cur == c->frames_noted){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
142 c->frames[cur].pos = pos;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
143 c->frames[cur].size = size;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
144 c->frames[cur].skip = curbits - 20;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
145 av_add_index_entry(s->streams[0], cur, cur, size, 0, AVINDEX_KEYFRAME);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
146 c->frames_noted++;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
147 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
148 c->curbits = (curbits + size2) & 0x1F;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
149
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
150 if (av_new_packet(pkt, size) < 0)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
151 return AVERROR_IO;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
152
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
153 pkt->data[0] = curbits;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
154 pkt->data[1] = (c->curframe > c->fcount);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
155
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
156 pkt->stream_index = 0;
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
157 pkt->pts = cur;
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
158 ret = get_buffer(&s->pb, pkt->data + 4, size);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
159 if(c->curbits)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
160 url_fseek(&s->pb, -4, SEEK_CUR);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
161 if(ret < size){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
162 av_free_packet(pkt);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
163 return AVERROR_IO;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
164 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
165 pkt->size = ret + 4;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
166
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
167 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
168 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
169
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
170 static int mpc_read_close(AVFormatContext *s)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
171 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
172 MPCContext *c = s->priv_data;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
173
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
174 av_freep(&c->frames);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
175 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
176 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
177
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
178 /**
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
179 * Seek to the given position
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
180 * If position is unknown but is within the limits of file
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
181 * then packets are skipped unless desired position is reached
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
182 *
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
183 * Also this function makes use of the fact that timestamp == frameno
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
184 */
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
185 static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
186 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
187 AVStream *st = s->streams[stream_index];
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
188 MPCContext *c = s->priv_data;
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
189 AVPacket pkt1, *pkt = &pkt1;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
190 int ret;
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
191 int index = av_index_search_timestamp(st, timestamp - DELAY_FRAMES, flags);
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
192 uint32_t lastframe;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
193
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
194 /* if found, seek there */
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
195 if (index >= 0){
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
196 c->curframe = st->index_entries[index].pos;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
197 return 0;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
198 }
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
199 /* if timestamp is out of bounds, return error */
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
200 if(timestamp < 0 || timestamp >= c->fcount)
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
201 return -1;
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
202 timestamp -= DELAY_FRAMES;
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
203 /* seek to the furthest known position and read packets until
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
204 we reach desired position */
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
205 lastframe = c->curframe;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
206 if(c->frames_noted) c->curframe = c->frames_noted - 1;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
207 while(c->curframe < timestamp){
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
208 ret = av_read_frame(s, pkt);
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
209 if (ret < 0){
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
210 c->curframe = lastframe;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
211 return -1;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
212 }
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
213 av_free_packet(pkt);
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
214 }
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
215 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
216 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
217
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
218
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
219 AVInputFormat mpc_demuxer = {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
220 "mpc",
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
221 "musepack",
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
222 sizeof(MPCContext),
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
223 mpc_probe,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
224 mpc_read_header,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
225 mpc_read_packet,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
226 mpc_read_close,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
227 mpc_read_seek,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
228 .extensions = "mpc",
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
229 };