Commit 8c93269e authored by Michael Niedermayer's avatar Michael Niedermayer

asfdec: correctly parse payload extensions

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 2d8c76eb
...@@ -926,13 +926,16 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb) ...@@ -926,13 +926,16 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb)
*/ */
static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
ASFContext *asf = s->priv_data; ASFContext *asf = s->priv_data;
ASFStream *asfst;
int rsize = 1; int rsize = 1;
int num = avio_r8(pb); int num = avio_r8(pb);
int i;
int64_t ts0, ts1 av_unused; int64_t ts0, ts1 av_unused;
asf->packet_segments--; asf->packet_segments--;
asf->packet_key_frame = num >> 7; asf->packet_key_frame = num >> 7;
asf->stream_index = asf->asfid2avid[num & 0x7f]; asf->stream_index = asf->asfid2avid[num & 0x7f];
asfst = &asf->streams[num & 0x7f];
// sequence should be ignored! // sequence should be ignored!
DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0); DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);
DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0); DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);
...@@ -945,23 +948,48 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){ ...@@ -945,23 +948,48 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (asf->packet_replic_size >= 8) { if (asf->packet_replic_size >= 8) {
int64_t end = avio_tell(pb) + asf->packet_replic_size;
asf->packet_obj_size = avio_rl32(pb); asf->packet_obj_size = avio_rl32(pb);
if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){ if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){
av_log(s, AV_LOG_ERROR, "packet_obj_size invalid\n"); av_log(s, AV_LOG_ERROR, "packet_obj_size invalid\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
asf->packet_frag_timestamp = avio_rl32(pb); // timestamp asf->packet_frag_timestamp = avio_rl32(pb); // timestamp
if(asf->packet_replic_size >= 8+38+4){
avio_skip(pb, 10); for (i=0; i<asfst->payload_ext_ct; i++) {
ts0= avio_rl64(pb); ASFPayload *p = &asfst->payload[i];
ts1= avio_rl64(pb); int size = p->size;
avio_skip(pb, 12); int64_t payend;
avio_rl32(pb); if(size == 0xFFFF)
avio_skip(pb, asf->packet_replic_size - 8 - 38 - 4); size = avio_rl16(pb);
if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000; payend = avio_tell(pb) + size;
else asf->packet_frag_timestamp= AV_NOPTS_VALUE; if (payend > end) {
}else av_log(s, AV_LOG_ERROR, "too long payload\n");
avio_skip(pb, asf->packet_replic_size - 8); break;
}
switch(p->type) {
case 0x50:
// duration = avio_rl16(pb);
break;
case 0x2A:
avio_skip(pb, 8);
ts0= avio_rl64(pb);
ts1= avio_rl64(pb);
if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000;
else asf->packet_frag_timestamp= AV_NOPTS_VALUE;
break;
case 0x5B:
case 0xB7:
case 0xCC:
case 0xC0:
case 0xA0:
//unknown
break;
}
avio_seek(pb, payend, SEEK_SET);
}
avio_seek(pb, end, SEEK_SET);
rsize += asf->packet_replic_size; // FIXME - check validity rsize += asf->packet_replic_size; // FIXME - check validity
} else if (asf->packet_replic_size==1){ } else if (asf->packet_replic_size==1){
// multipacket - frag_offset is beginning timestamp // multipacket - frag_offset is beginning timestamp
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment