int64_t samples;
} MPCContext;
+static inline int64_t bs_get_v(uint8_t **bs)
+{
+ int64_t v = 0;
+ int br = 0;
+ int c;
+
+ do {
+ c = **bs; (*bs)++;
+ v <<= 7;
+ v |= c & 0x7F;
+ br++;
+ if (br > 10)
+ return -1;
+ } while (c & 0x80);
+
+ return v - br;
+}
+
static int mpc8_probe(AVProbeData *p)
{
- if (AV_RL32(p->buf) == TAG_MPCK)
- return AVPROBE_SCORE_MAX;
+ uint8_t *bs = p->buf + 4;
+ uint8_t *bs_end = bs + p->buf_size;
+ int64_t size;
+
+ if (p->buf_size < 16)
+ return 0;
+ if (AV_RL32(p->buf) != TAG_MPCK)
+ return 0;
+ while (bs < bs_end + 3) {
+ int header_found = (bs[0] == 'S' && bs[1] == 'H');
+ if (bs[0] < 'A' || bs[0] > 'Z' || bs[1] < 'A' || bs[1] > 'Z')
+ return 0;
+ bs += 2;
+ size = bs_get_v(&bs);
+ if (size < 2)
+ return 0;
+ if (bs + size - 2 >= bs_end)
+ return AVPROBE_SCORE_MAX / 4 - 1; //seems to be valid MPC but no header yet
+ if (header_found) {
+ if (size < 11 || size > 28)
+ return 0;
+ if (!AV_RL32(bs)) //zero CRC is invalid
+ return 0;
+ return AVPROBE_SCORE_MAX;
+ } else {
+ bs += size - 2;
+ }
+ }
return 0;
}
while(!url_feof(s->pb)){
pos = url_ftell(s->pb);
mpc8_get_chunk_header(s->pb, &tag, &size);
+ if (size < 0)
+ return -1;
if(tag == TAG_AUDIOPACKET){
if(av_get_packet(s->pb, pkt, size) < 0)
return AVERROR(ENOMEM);