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