00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "avformat.h"
00022 #include "bitstream.h"
00023
00024 #define MPC_FRAMESIZE 1152
00025 #define DELAY_FRAMES 32
00026
00027 static const int mpc_rate[4] = { 44100, 48000, 37800, 32000 };
00028 typedef struct {
00029 int64_t pos;
00030 int size, skip;
00031 }MPCFrame;
00032
00033 typedef struct {
00034 int ver;
00035 uint32_t curframe, lastframe;
00036 uint32_t fcount;
00037 MPCFrame *frames;
00038 int curbits;
00039 int frames_noted;
00040 } MPCContext;
00041
00042 static int mpc_probe(AVProbeData *p)
00043 {
00044 const uint8_t *d = p->buf;
00045 if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7))
00046 return AVPROBE_SCORE_MAX;
00047 if (d[0] == 'I' && d[1] == 'D' && d[2] == '3')
00048 return AVPROBE_SCORE_MAX / 2;
00049 return 0;
00050 }
00051
00052 static int mpc_read_header(AVFormatContext *s, AVFormatParameters *ap)
00053 {
00054 MPCContext *c = s->priv_data;
00055 AVStream *st;
00056 int t;
00057
00058 t = get_le24(s->pb);
00059 if(t != MKTAG('M', 'P', '+', 0)){
00060 if(t != MKTAG('I', 'D', '3', 0)){
00061 av_log(s, AV_LOG_ERROR, "Not a Musepack file\n");
00062 return -1;
00063 }
00064
00065 url_fskip(s->pb, 3);
00066 t = get_byte(s->pb) << 21;
00067 t |= get_byte(s->pb) << 14;
00068 t |= get_byte(s->pb) << 7;
00069 t |= get_byte(s->pb);
00070 av_log(s, AV_LOG_DEBUG, "Skipping %d(%X) bytes of ID3 data\n", t, t);
00071 url_fskip(s->pb, t);
00072 if(get_le24(s->pb) != MKTAG('M', 'P', '+', 0)){
00073 av_log(s, AV_LOG_ERROR, "Not a Musepack file\n");
00074 return -1;
00075 }
00076 }
00077 c->ver = get_byte(s->pb);
00078 if(c->ver != 0x07 && c->ver != 0x17){
00079 av_log(s, AV_LOG_ERROR, "Can demux Musepack SV7, got version %02X\n", c->ver);
00080 return -1;
00081 }
00082 c->fcount = get_le32(s->pb);
00083 if((int64_t)c->fcount * sizeof(MPCFrame) >= UINT_MAX){
00084 av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not possible\n");
00085 return -1;
00086 }
00087 c->frames = av_malloc(c->fcount * sizeof(MPCFrame));
00088 c->curframe = 0;
00089 c->lastframe = -1;
00090 c->curbits = 8;
00091 c->frames_noted = 0;
00092
00093 st = av_new_stream(s, 0);
00094 if (!st)
00095 return AVERROR(ENOMEM);
00096 st->codec->codec_type = CODEC_TYPE_AUDIO;
00097 st->codec->codec_id = CODEC_ID_MUSEPACK7;
00098 st->codec->channels = 2;
00099 st->codec->bits_per_sample = 16;
00100
00101 st->codec->extradata_size = 16;
00102 st->codec->extradata = av_mallocz(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE);
00103 get_buffer(s->pb, st->codec->extradata, 16);
00104 st->codec->sample_rate = mpc_rate[st->codec->extradata[2] & 3];
00105 av_set_pts_info(st, 32, MPC_FRAMESIZE, st->codec->sample_rate);
00106
00107 s->start_time = 0;
00108 s->duration = (int64_t)c->fcount * MPC_FRAMESIZE * AV_TIME_BASE / st->codec->sample_rate;
00109
00110 return 0;
00111 }
00112
00113 static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt)
00114 {
00115 MPCContext *c = s->priv_data;
00116 int ret, size, size2, curbits, cur = c->curframe;
00117 int64_t tmp, pos;
00118
00119 if (c->curframe >= c->fcount)
00120 return -1;
00121
00122 if(c->curframe != c->lastframe + 1){
00123 url_fseek(s->pb, c->frames[c->curframe].pos, SEEK_SET);
00124 c->curbits = c->frames[c->curframe].skip;
00125 }
00126 c->lastframe = c->curframe;
00127 c->curframe++;
00128 curbits = c->curbits;
00129 pos = url_ftell(s->pb);
00130 tmp = get_le32(s->pb);
00131 if(curbits <= 12){
00132 size2 = (tmp >> (12 - curbits)) & 0xFFFFF;
00133 }else{
00134 tmp = (tmp << 32) | get_le32(s->pb);
00135 size2 = (tmp >> (44 - curbits)) & 0xFFFFF;
00136 }
00137 curbits += 20;
00138 url_fseek(s->pb, pos, SEEK_SET);
00139
00140 size = ((size2 + curbits + 31) & ~31) >> 3;
00141 if(cur == c->frames_noted){
00142 c->frames[cur].pos = pos;
00143 c->frames[cur].size = size;
00144 c->frames[cur].skip = curbits - 20;
00145 av_add_index_entry(s->streams[0], cur, cur, size, 0, AVINDEX_KEYFRAME);
00146 c->frames_noted++;
00147 }
00148 c->curbits = (curbits + size2) & 0x1F;
00149
00150 if (av_new_packet(pkt, size) < 0)
00151 return AVERROR(EIO);
00152
00153 pkt->data[0] = curbits;
00154 pkt->data[1] = (c->curframe > c->fcount);
00155
00156 pkt->stream_index = 0;
00157 pkt->pts = cur;
00158 ret = get_buffer(s->pb, pkt->data + 4, size);
00159 if(c->curbits)
00160 url_fseek(s->pb, -4, SEEK_CUR);
00161 if(ret < size){
00162 av_free_packet(pkt);
00163 return AVERROR(EIO);
00164 }
00165 pkt->size = ret + 4;
00166
00167 return 0;
00168 }
00169
00170 static int mpc_read_close(AVFormatContext *s)
00171 {
00172 MPCContext *c = s->priv_data;
00173
00174 av_freep(&c->frames);
00175 return 0;
00176 }
00177
00185 static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
00186 {
00187 AVStream *st = s->streams[stream_index];
00188 MPCContext *c = s->priv_data;
00189 AVPacket pkt1, *pkt = &pkt1;
00190 int ret;
00191 int index = av_index_search_timestamp(st, timestamp - DELAY_FRAMES, flags);
00192 uint32_t lastframe;
00193
00194
00195 if (index >= 0){
00196 c->curframe = st->index_entries[index].pos;
00197 return 0;
00198 }
00199
00200 if(timestamp < 0 || timestamp >= c->fcount)
00201 return -1;
00202 timestamp -= DELAY_FRAMES;
00203
00204
00205 lastframe = c->curframe;
00206 if(c->frames_noted) c->curframe = c->frames_noted - 1;
00207 while(c->curframe < timestamp){
00208 ret = av_read_frame(s, pkt);
00209 if (ret < 0){
00210 c->curframe = lastframe;
00211 return -1;
00212 }
00213 av_free_packet(pkt);
00214 }
00215 return 0;
00216 }
00217
00218
00219 AVInputFormat mpc_demuxer = {
00220 "mpc",
00221 "musepack",
00222 sizeof(MPCContext),
00223 mpc_probe,
00224 mpc_read_header,
00225 mpc_read_packet,
00226 mpc_read_close,
00227 mpc_read_seek,
00228 .extensions = "mpc",
00229 };