Mercurial > libavformat.hg
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 |
rev | line source |
---|---|
1602 | 1 /* |
2 * Musepack demuxer | |
3 * Copyright (c) 2006 Konstantin Shishkov | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
2217 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1602 | 20 */ |
3286 | 21 |
4872 | 22 #include "libavcodec/get_bits.h" |
1602 | 23 #include "avformat.h" |
4254 | 24 #include "id3v2.h" |
5135 | 25 #include "apetag.h" |
1602 | 26 |
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 | 29 |
30 static const int mpc_rate[4] = { 44100, 48000, 37800, 32000 }; | |
31 typedef struct { | |
32 int64_t pos; | |
33 int size, skip; | |
34 }MPCFrame; | |
35 | |
36 typedef struct { | |
37 int ver; | |
38 uint32_t curframe, lastframe; | |
39 uint32_t fcount; | |
40 MPCFrame *frames; | |
41 int curbits; | |
42 int frames_noted; | |
43 } MPCContext; | |
44 | |
45 static int mpc_probe(AVProbeData *p) | |
46 { | |
47 const uint8_t *d = p->buf; | |
4254 | 48 if (ff_id3v2_match(d)) { |
49 d += ff_id3v2_tag_len(d); | |
50 } | |
51 if (d+3 < p->buf+p->buf_size) | |
1602 | 52 if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7)) |
53 return AVPROBE_SCORE_MAX; | |
54 return 0; | |
55 } | |
56 | |
57 static int mpc_read_header(AVFormatContext *s, AVFormatParameters *ap) | |
58 { | |
59 MPCContext *c = s->priv_data; | |
60 AVStream *st; | |
5136 | 61 int t, ret; |
62 int64_t pos = url_ftell(s->pb); | |
1602 | 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 | 66 uint8_t buf[ID3v2_HEADER_SIZE]; |
67 if (url_fseek(s->pb, pos, SEEK_SET) < 0) | |
68 return -1; | |
69 ret = get_buffer(s->pb, buf, ID3v2_HEADER_SIZE); | |
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 | 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 | 82 /* read ID3 tags */ |
83 if (url_fseek(s->pb, pos, SEEK_SET) < 0) | |
84 return -1; | |
85 ff_id3v2_read(s); | |
86 get_le24(s->pb); | |
1602 | 87 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
88 c->ver = get_byte(s->pb); |
1602 | 89 if(c->ver != 0x07 && c->ver != 0x17){ |
90 av_log(s, AV_LOG_ERROR, "Can demux Musepack SV7, got version %02X\n", c->ver); | |
91 return -1; | |
92 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
93 c->fcount = get_le32(s->pb); |
1602 | 94 if((int64_t)c->fcount * sizeof(MPCFrame) >= UINT_MAX){ |
95 av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not possible\n"); | |
96 return -1; | |
97 } | |
98 c->frames = av_malloc(c->fcount * sizeof(MPCFrame)); | |
99 c->curframe = 0; | |
100 c->lastframe = -1; | |
101 c->curbits = 8; | |
1605 | 102 c->frames_noted = 0; |
1602 | 103 |
104 st = av_new_stream(s, 0); | |
105 if (!st) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2217
diff
changeset
|
106 return AVERROR(ENOMEM); |
1602 | 107 st->codec->codec_type = CODEC_TYPE_AUDIO; |
108 st->codec->codec_id = CODEC_ID_MUSEPACK7; | |
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 | 111 |
112 st->codec->extradata_size = 16; | |
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 | 115 st->codec->sample_rate = mpc_rate[st->codec->extradata[2] & 3]; |
116 av_set_pts_info(st, 32, MPC_FRAMESIZE, st->codec->sample_rate); | |
117 /* scan for seekpoints */ | |
118 s->start_time = 0; | |
119 s->duration = (int64_t)c->fcount * MPC_FRAMESIZE * AV_TIME_BASE / st->codec->sample_rate; | |
120 | |
5135 | 121 /* try to read APE tags */ |
122 if (!url_is_streamed(s->pb)) { | |
123 int64_t pos = url_ftell(s->pb); | |
124 ff_ape_parse_tag(s); | |
125 url_fseek(s->pb, pos, SEEK_SET); | |
126 } | |
127 | |
1602 | 128 return 0; |
129 } | |
130 | |
131 static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt) | |
132 { | |
133 MPCContext *c = s->priv_data; | |
134 int ret, size, size2, curbits, cur = c->curframe; | |
135 int64_t tmp, pos; | |
136 | |
1645
9aa27a785d1f
10l, > vs. >= typo, caused crashes on last mpc frame
reimar
parents:
1610
diff
changeset
|
137 if (c->curframe >= c->fcount) |
1602 | 138 return -1; |
139 | |
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 | 142 c->curbits = c->frames[c->curframe].skip; |
143 } | |
144 c->lastframe = c->curframe; | |
145 c->curframe++; | |
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 | 149 if(curbits <= 12){ |
150 size2 = (tmp >> (12 - curbits)) & 0xFFFFF; | |
151 }else{ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
152 tmp = (tmp << 32) | get_le32(s->pb); |
1602 | 153 size2 = (tmp >> (44 - curbits)) & 0xFFFFF; |
154 } | |
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 | 157 |
158 size = ((size2 + curbits + 31) & ~31) >> 3; | |
159 if(cur == c->frames_noted){ | |
160 c->frames[cur].pos = pos; | |
161 c->frames[cur].size = size; | |
162 c->frames[cur].skip = curbits - 20; | |
163 av_add_index_entry(s->streams[0], cur, cur, size, 0, AVINDEX_KEYFRAME); | |
164 c->frames_noted++; | |
165 } | |
166 c->curbits = (curbits + size2) & 0x1F; | |
167 | |
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 | 170 |
171 pkt->data[0] = curbits; | |
172 pkt->data[1] = (c->curframe > c->fcount); | |
173 | |
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 | 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 | 179 if(ret < size){ |
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 | 182 } |
183 pkt->size = ret + 4; | |
184 | |
185 return 0; | |
186 } | |
187 | |
188 static int mpc_read_close(AVFormatContext *s) | |
189 { | |
190 MPCContext *c = s->priv_data; | |
191 | |
192 av_freep(&c->frames); | |
193 return 0; | |
194 } | |
195 | |
1605 | 196 /** |
197 * Seek to the given position | |
198 * If position is unknown but is within the limits of file | |
199 * then packets are skipped unless desired position is reached | |
200 * | |
201 * Also this function makes use of the fact that timestamp == frameno | |
202 */ | |
1602 | 203 static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) |
204 { | |
205 AVStream *st = s->streams[stream_index]; | |
206 MPCContext *c = s->priv_data; | |
1605 | 207 AVPacket pkt1, *pkt = &pkt1; |
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 | 210 uint32_t lastframe; |
211 | |
212 /* if found, seek there */ | |
213 if (index >= 0){ | |
214 c->curframe = st->index_entries[index].pos; | |
215 return 0; | |
216 } | |
217 /* if timestamp is out of bounds, return error */ | |
218 if(timestamp < 0 || timestamp >= c->fcount) | |
1602 | 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 | 221 /* seek to the furthest known position and read packets until |
222 we reach desired position */ | |
223 lastframe = c->curframe; | |
224 if(c->frames_noted) c->curframe = c->frames_noted - 1; | |
225 while(c->curframe < timestamp){ | |
226 ret = av_read_frame(s, pkt); | |
227 if (ret < 0){ | |
228 c->curframe = lastframe; | |
229 return -1; | |
230 } | |
231 av_free_packet(pkt); | |
232 } | |
1602 | 233 return 0; |
234 } | |
235 | |
236 | |
237 AVInputFormat mpc_demuxer = { | |
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 | 240 sizeof(MPCContext), |
241 mpc_probe, | |
242 mpc_read_header, | |
243 mpc_read_packet, | |
244 mpc_read_close, | |
245 mpc_read_seek, | |
246 .extensions = "mpc", | |
247 }; |