|
|
|
@ -1808,15 +1808,31 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, |
|
|
|
|
if (!track->audio.pkt_cnt) { |
|
|
|
|
if (track->audio.sub_packet_cnt == 0) |
|
|
|
|
track->audio.buf_timecode = timecode; |
|
|
|
|
if (st->codec->codec_id == CODEC_ID_RA_288) |
|
|
|
|
if (st->codec->codec_id == CODEC_ID_RA_288) { |
|
|
|
|
if (size < cfs * h / 2) { |
|
|
|
|
av_log(matroska->ctx, AV_LOG_ERROR, |
|
|
|
|
"Corrupt int4 RM-style audio packet size\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
for (x=0; x<h/2; x++) |
|
|
|
|
memcpy(track->audio.buf+x*2*w+y*cfs, |
|
|
|
|
data+x*cfs, cfs); |
|
|
|
|
else if (st->codec->codec_id == CODEC_ID_SIPR) |
|
|
|
|
} else if (st->codec->codec_id == CODEC_ID_SIPR) { |
|
|
|
|
if (size < w) { |
|
|
|
|
av_log(matroska->ctx, AV_LOG_ERROR, |
|
|
|
|
"Corrupt sipr RM-style audio packet size\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
memcpy(track->audio.buf + y*w, data, w); |
|
|
|
|
else |
|
|
|
|
} else { |
|
|
|
|
if (size < sps * w / sps) { |
|
|
|
|
av_log(matroska->ctx, AV_LOG_ERROR, |
|
|
|
|
"Corrupt generic RM-style audio packet size\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
for (x=0; x<w/sps; x++) |
|
|
|
|
memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (++track->audio.sub_packet_cnt >= h) { |
|
|
|
|
if (st->codec->codec_id == CODEC_ID_SIPR) |
|
|
|
|