annotate mpc.c @ 5163:01514407ab35 libavformat

Use all 32 bits of the timestamp when calculating flv duration. At the moment, duration is mainly set from the metadata packet. If that is not available, the fallback is checking the low 24 bits of the last packet. This is not enough for files over 4,6 hours in length, so read all 32 bits instead. patch by Martin Storsj, martin martin st
author diego
date Mon, 07 Sep 2009 10:49:51 +0000
parents e56e03b13237
children 28094e9bd013
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
2217
06083249909c license header consistency cosmetics
diego
parents: 2001
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2771
diff changeset
21
4872
304a0ea063f0 Rename bitstream.h to get_bits.h.
stefano
parents: 4254
diff changeset
22 #include "libavcodec/get_bits.h"
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
23 #include "avformat.h"
4254
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 3908
diff changeset
24 #include "id3v2.h"
5135
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
25 #include "apetag.h"
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
26
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
27 #define MPC_FRAMESIZE 1152
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
28 #define DELAY_FRAMES 32
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
29
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
30 static const int mpc_rate[4] = { 44100, 48000, 37800, 32000 };
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
31 typedef struct {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
32 int64_t pos;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
33 int size, skip;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
34 }MPCFrame;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
35
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
36 typedef struct {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
37 int ver;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
38 uint32_t curframe, lastframe;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
39 uint32_t fcount;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
40 MPCFrame *frames;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
41 int curbits;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
42 int frames_noted;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
43 } MPCContext;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
44
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
45 static int mpc_probe(AVProbeData *p)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
46 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
47 const uint8_t *d = p->buf;
4254
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 3908
diff changeset
48 if (ff_id3v2_match(d)) {
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 3908
diff changeset
49 d += ff_id3v2_tag_len(d);
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 3908
diff changeset
50 }
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 3908
diff changeset
51 if (d+3 < p->buf+p->buf_size)
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
52 if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7))
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
53 return AVPROBE_SCORE_MAX;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
54 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
55 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
56
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
57 static int mpc_read_header(AVFormatContext *s, AVFormatParameters *ap)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
58 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
59 MPCContext *c = s->priv_data;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
60 AVStream *st;
5136
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
61 int t, ret;
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
62 int64_t pos = url_ftell(s->pb);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
63
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
64 t = get_le24(s->pb);
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
65 if(t != MKTAG('M', 'P', '+', 0)){
5136
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
66 uint8_t buf[ID3v2_HEADER_SIZE];
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
67 if (url_fseek(s->pb, pos, SEEK_SET) < 0)
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
68 return -1;
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
69 ret = get_buffer(s->pb, buf, ID3v2_HEADER_SIZE);
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
70 if (ret != ID3v2_HEADER_SIZE || !ff_id3v2_match(buf)) {
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
71 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
72 return -1;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
73 }
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
74 /* skip ID3 tags and try again */
5136
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
75 t = ff_id3v2_tag_len(buf) - ID3v2_HEADER_SIZE;
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
76 av_log(s, AV_LOG_DEBUG, "Skipping %d(%X) bytes of ID3 data\n", t, t);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
77 url_fskip(s->pb, t);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
78 if(get_le24(s->pb) != MKTAG('M', 'P', '+', 0)){
1609
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
79 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
80 return -1;
9adbec516265 Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents: 1605
diff changeset
81 }
5136
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
82 /* read ID3 tags */
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
83 if (url_fseek(s->pb, pos, SEEK_SET) < 0)
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
84 return -1;
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
85 ff_id3v2_read(s);
e56e03b13237 Parse ID3 tags in Musepack SV7 files
kostya
parents: 5135
diff changeset
86 get_le24(s->pb);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
87 }
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
88 c->ver = get_byte(s->pb);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
89 if(c->ver != 0x07 && c->ver != 0x17){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
90 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
91 return -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
92 }
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
93 c->fcount = get_le32(s->pb);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
94 if((int64_t)c->fcount * sizeof(MPCFrame) >= UINT_MAX){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
95 av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not possible\n");
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
96 return -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
97 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
98 c->frames = av_malloc(c->fcount * sizeof(MPCFrame));
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
99 c->curframe = 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
100 c->lastframe = -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
101 c->curbits = 8;
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
102 c->frames_noted = 0;
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
103
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
104 st = av_new_stream(s, 0);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
105 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2217
diff changeset
106 return AVERROR(ENOMEM);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
107 st->codec->codec_type = CODEC_TYPE_AUDIO;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
108 st->codec->codec_id = CODEC_ID_MUSEPACK7;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
109 st->codec->channels = 2;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
110 st->codec->bits_per_coded_sample = 16;
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
111
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
112 st->codec->extradata_size = 16;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
113 st->codec->extradata = av_mallocz(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
114 get_buffer(s->pb, st->codec->extradata, 16);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
115 st->codec->sample_rate = mpc_rate[st->codec->extradata[2] & 3];
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
116 av_set_pts_info(st, 32, MPC_FRAMESIZE, st->codec->sample_rate);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
117 /* scan for seekpoints */
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
118 s->start_time = 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
119 s->duration = (int64_t)c->fcount * MPC_FRAMESIZE * AV_TIME_BASE / st->codec->sample_rate;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
120
5135
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
121 /* try to read APE tags */
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
122 if (!url_is_streamed(s->pb)) {
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
123 int64_t pos = url_ftell(s->pb);
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
124 ff_ape_parse_tag(s);
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
125 url_fseek(s->pb, pos, SEEK_SET);
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
126 }
cdaab3d9f0d6 Parse APE metadata tags in Musepack SV7 files
kostya
parents: 4872
diff changeset
127
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
128 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
129 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
130
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
131 static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
132 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
133 MPCContext *c = s->priv_data;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
134 int ret, size, size2, curbits, cur = c->curframe;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
135 int64_t tmp, pos;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
136
1645
9aa27a785d1f 10l, > vs. >= typo, caused crashes on last mpc frame
reimar
parents: 1610
diff changeset
137 if (c->curframe >= c->fcount)
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
138 return -1;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
139
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
140 if(c->curframe != c->lastframe + 1){
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
141 url_fseek(s->pb, c->frames[c->curframe].pos, SEEK_SET);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
142 c->curbits = c->frames[c->curframe].skip;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
143 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
144 c->lastframe = c->curframe;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
145 c->curframe++;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
146 curbits = c->curbits;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
147 pos = url_ftell(s->pb);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
148 tmp = get_le32(s->pb);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
149 if(curbits <= 12){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
150 size2 = (tmp >> (12 - curbits)) & 0xFFFFF;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
151 }else{
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
152 tmp = (tmp << 32) | get_le32(s->pb);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
153 size2 = (tmp >> (44 - curbits)) & 0xFFFFF;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
154 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
155 curbits += 20;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
156 url_fseek(s->pb, pos, SEEK_SET);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
157
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
158 size = ((size2 + curbits + 31) & ~31) >> 3;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
159 if(cur == c->frames_noted){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
160 c->frames[cur].pos = pos;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
161 c->frames[cur].size = size;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
162 c->frames[cur].skip = curbits - 20;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
163 av_add_index_entry(s->streams[0], cur, cur, size, 0, AVINDEX_KEYFRAME);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
164 c->frames_noted++;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
165 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
166 c->curbits = (curbits + size2) & 0x1F;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
167
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
168 if (av_new_packet(pkt, size) < 0)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
169 return AVERROR(EIO);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
170
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
171 pkt->data[0] = curbits;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
172 pkt->data[1] = (c->curframe > c->fcount);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
173
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
174 pkt->stream_index = 0;
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
175 pkt->pts = cur;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
176 ret = get_buffer(s->pb, pkt->data + 4, size);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
177 if(c->curbits)
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
178 url_fseek(s->pb, -4, SEEK_CUR);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
179 if(ret < size){
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
180 av_free_packet(pkt);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
181 return AVERROR(EIO);
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
182 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
183 pkt->size = ret + 4;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
184
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
185 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
186 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
187
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
188 static int mpc_read_close(AVFormatContext *s)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
189 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
190 MPCContext *c = s->priv_data;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
191
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
192 av_freep(&c->frames);
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
193 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
194 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
195
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
196 /**
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
197 * Seek to the given position
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
198 * If position is unknown but is within the limits of file
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
199 * then packets are skipped unless desired position is reached
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
200 *
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
201 * Also this function makes use of the fact that timestamp == frameno
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
202 */
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
203 static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
204 {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
205 AVStream *st = s->streams[stream_index];
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
206 MPCContext *c = s->priv_data;
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
207 AVPacket pkt1, *pkt = &pkt1;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
208 int ret;
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
209 int index = av_index_search_timestamp(st, timestamp - DELAY_FRAMES, flags);
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
210 uint32_t lastframe;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
211
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
212 /* if found, seek there */
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
213 if (index >= 0){
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
214 c->curframe = st->index_entries[index].pos;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
215 return 0;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
216 }
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
217 /* if timestamp is out of bounds, return error */
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
218 if(timestamp < 0 || timestamp >= c->fcount)
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
219 return -1;
1610
cde17266ad08 Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents: 1609
diff changeset
220 timestamp -= DELAY_FRAMES;
1605
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
221 /* seek to the furthest known position and read packets until
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
222 we reach desired position */
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
223 lastframe = c->curframe;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
224 if(c->frames_noted) c->curframe = c->frames_noted - 1;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
225 while(c->curframe < timestamp){
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
226 ret = av_read_frame(s, pkt);
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
227 if (ret < 0){
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
228 c->curframe = lastframe;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
229 return -1;
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
230 }
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
231 av_free_packet(pkt);
6d66c6325e0d Enable forward seek in Musepack demuxer
kostya
parents: 1602
diff changeset
232 }
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
233 return 0;
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
234 }
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
235
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
236
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
237 AVInputFormat mpc_demuxer = {
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
238 "mpc",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
239 NULL_IF_CONFIG_SMALL("Musepack"),
1602
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
240 sizeof(MPCContext),
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
241 mpc_probe,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
242 mpc_read_header,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
243 mpc_read_packet,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
244 mpc_read_close,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
245 mpc_read_seek,
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
246 .extensions = "mpc",
6238b40b7aef Musepack SV7 decoding support
kostya
parents:
diff changeset
247 };