Mercurial > libavformat.hg
annotate mpc.c @ 3068:9cc9ff5aff9c libavformat
set bps to uncompressed original sound data for compressed audio
according to aiff specs, qt set it to 16 for mace and ima4,
fail if block align is not set.
author | bcoudurier |
---|---|
date | Mon, 25 Feb 2008 12:00:31 +0000 |
parents | d52c718e83f9 |
children | 6f61c3b36632 |
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 */ |
21 #include "avformat.h" | |
22 #include "bitstream.h" | |
23 | |
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 | 26 |
27 static const int mpc_rate[4] = { 44100, 48000, 37800, 32000 }; | |
28 typedef struct { | |
29 int64_t pos; | |
30 int size, skip; | |
31 }MPCFrame; | |
32 | |
33 typedef struct { | |
34 int ver; | |
35 uint32_t curframe, lastframe; | |
36 uint32_t fcount; | |
37 MPCFrame *frames; | |
38 int curbits; | |
39 int frames_noted; | |
40 } MPCContext; | |
41 | |
42 static int mpc_probe(AVProbeData *p) | |
43 { | |
44 const uint8_t *d = p->buf; | |
45 if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7)) | |
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 | 49 return 0; |
50 } | |
51 | |
52 static int mpc_read_header(AVFormatContext *s, AVFormatParameters *ap) | |
53 { | |
54 MPCContext *c = s->priv_data; | |
55 AVStream *st; | |
1609
9adbec516265
Make MPC demuxer deal with ID3 tags at the beginning
kostya
parents:
1605
diff
changeset
|
56 int t; |
1602 | 57 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
58 t = get_le24(s->pb); |
1609
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 */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
65 url_fskip(s->pb, 3); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
66 t = get_byte(s->pb) << 21; |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
67 t |= get_byte(s->pb) << 14; |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
68 t |= get_byte(s->pb) << 7; |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
69 t |= get_byte(s->pb); |
1609
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); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
71 url_fskip(s->pb, t); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
72 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
|
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 | 76 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
77 c->ver = get_byte(s->pb); |
1602 | 78 if(c->ver != 0x07 && c->ver != 0x17){ |
79 av_log(s, AV_LOG_ERROR, "Can demux Musepack SV7, got version %02X\n", c->ver); | |
80 return -1; | |
81 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
82 c->fcount = get_le32(s->pb); |
1602 | 83 if((int64_t)c->fcount * sizeof(MPCFrame) >= UINT_MAX){ |
84 av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not possible\n"); | |
85 return -1; | |
86 } | |
87 c->frames = av_malloc(c->fcount * sizeof(MPCFrame)); | |
88 c->curframe = 0; | |
89 c->lastframe = -1; | |
90 c->curbits = 8; | |
1605 | 91 c->frames_noted = 0; |
1602 | 92 |
93 st = av_new_stream(s, 0); | |
94 if (!st) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2217
diff
changeset
|
95 return AVERROR(ENOMEM); |
1602 | 96 st->codec->codec_type = CODEC_TYPE_AUDIO; |
97 st->codec->codec_id = CODEC_ID_MUSEPACK7; | |
98 st->codec->channels = 2; | |
99 st->codec->bits_per_sample = 16; | |
100 | |
101 st->codec->extradata_size = 16; | |
102 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
|
103 get_buffer(s->pb, st->codec->extradata, 16); |
1602 | 104 st->codec->sample_rate = mpc_rate[st->codec->extradata[2] & 3]; |
105 av_set_pts_info(st, 32, MPC_FRAMESIZE, st->codec->sample_rate); | |
106 /* scan for seekpoints */ | |
107 s->start_time = 0; | |
108 s->duration = (int64_t)c->fcount * MPC_FRAMESIZE * AV_TIME_BASE / st->codec->sample_rate; | |
109 | |
110 return 0; | |
111 } | |
112 | |
113 static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt) | |
114 { | |
115 MPCContext *c = s->priv_data; | |
116 int ret, size, size2, curbits, cur = c->curframe; | |
117 int64_t tmp, pos; | |
118 | |
1645
9aa27a785d1f
10l, > vs. >= typo, caused crashes on last mpc frame
reimar
parents:
1610
diff
changeset
|
119 if (c->curframe >= c->fcount) |
1602 | 120 return -1; |
121 | |
122 if(c->curframe != c->lastframe + 1){ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
123 url_fseek(s->pb, c->frames[c->curframe].pos, SEEK_SET); |
1602 | 124 c->curbits = c->frames[c->curframe].skip; |
125 } | |
126 c->lastframe = c->curframe; | |
127 c->curframe++; | |
128 curbits = c->curbits; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
129 pos = url_ftell(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
130 tmp = get_le32(s->pb); |
1602 | 131 if(curbits <= 12){ |
132 size2 = (tmp >> (12 - curbits)) & 0xFFFFF; | |
133 }else{ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
134 tmp = (tmp << 32) | get_le32(s->pb); |
1602 | 135 size2 = (tmp >> (44 - curbits)) & 0xFFFFF; |
136 } | |
137 curbits += 20; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
138 url_fseek(s->pb, pos, SEEK_SET); |
1602 | 139 |
140 size = ((size2 + curbits + 31) & ~31) >> 3; | |
141 if(cur == c->frames_noted){ | |
142 c->frames[cur].pos = pos; | |
143 c->frames[cur].size = size; | |
144 c->frames[cur].skip = curbits - 20; | |
145 av_add_index_entry(s->streams[0], cur, cur, size, 0, AVINDEX_KEYFRAME); | |
146 c->frames_noted++; | |
147 } | |
148 c->curbits = (curbits + size2) & 0x1F; | |
149 | |
150 if (av_new_packet(pkt, size) < 0) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
151 return AVERROR(EIO); |
1602 | 152 |
153 pkt->data[0] = curbits; | |
154 pkt->data[1] = (c->curframe > c->fcount); | |
155 | |
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; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
158 ret = get_buffer(s->pb, pkt->data + 4, size); |
1602 | 159 if(c->curbits) |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
160 url_fseek(s->pb, -4, SEEK_CUR); |
1602 | 161 if(ret < size){ |
162 av_free_packet(pkt); | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
163 return AVERROR(EIO); |
1602 | 164 } |
165 pkt->size = ret + 4; | |
166 | |
167 return 0; | |
168 } | |
169 | |
170 static int mpc_read_close(AVFormatContext *s) | |
171 { | |
172 MPCContext *c = s->priv_data; | |
173 | |
174 av_freep(&c->frames); | |
175 return 0; | |
176 } | |
177 | |
1605 | 178 /** |
179 * Seek to the given position | |
180 * If position is unknown but is within the limits of file | |
181 * then packets are skipped unless desired position is reached | |
182 * | |
183 * Also this function makes use of the fact that timestamp == frameno | |
184 */ | |
1602 | 185 static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) |
186 { | |
187 AVStream *st = s->streams[stream_index]; | |
188 MPCContext *c = s->priv_data; | |
1605 | 189 AVPacket pkt1, *pkt = &pkt1; |
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 | 192 uint32_t lastframe; |
193 | |
194 /* if found, seek there */ | |
195 if (index >= 0){ | |
196 c->curframe = st->index_entries[index].pos; | |
197 return 0; | |
198 } | |
199 /* if timestamp is out of bounds, return error */ | |
200 if(timestamp < 0 || timestamp >= c->fcount) | |
1602 | 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 | 203 /* seek to the furthest known position and read packets until |
204 we reach desired position */ | |
205 lastframe = c->curframe; | |
206 if(c->frames_noted) c->curframe = c->frames_noted - 1; | |
207 while(c->curframe < timestamp){ | |
208 ret = av_read_frame(s, pkt); | |
209 if (ret < 0){ | |
210 c->curframe = lastframe; | |
211 return -1; | |
212 } | |
213 av_free_packet(pkt); | |
214 } | |
1602 | 215 return 0; |
216 } | |
217 | |
218 | |
219 AVInputFormat mpc_demuxer = { | |
220 "mpc", | |
221 "musepack", | |
222 sizeof(MPCContext), | |
223 mpc_probe, | |
224 mpc_read_header, | |
225 mpc_read_packet, | |
226 mpc_read_close, | |
227 mpc_read_seek, | |
228 .extensions = "mpc", | |
229 }; |