# HG changeset patch # User michael # Date 1121783201 0 # Node ID 92dfb26763e4cc2e3cd677c9e27c647f405c26d9 # Parent feca73904e67885b0fd3fd8435b42543e1ca75a1 extract duration if available diff -r feca73904e67 -r 92dfb26763e4 flvdec.c --- a/flvdec.c Sun Jul 17 22:24:36 2005 +0000 +++ b/flvdec.c Tue Jul 19 14:26:41 2005 +0000 @@ -58,7 +58,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) { - int ret, i, type, size, pts, flags, is_audio; + int ret, i, type, size, pts, flags, is_audio, next; AVStream *st = NULL; for(;;){ @@ -74,19 +74,59 @@ if(size == 0) continue; - + + next= size + url_ftell(&s->pb); + if (type == 8) { is_audio=1; flags = get_byte(&s->pb); - size--; } else if (type == 9) { is_audio=0; flags = get_byte(&s->pb); - size--; + } else if (type == 18 && size > 13+1+4) { + url_fskip(&s->pb, 13); //onMetaData blah + if(get_byte(&s->pb) == 8){ + url_fskip(&s->pb, 4); + } + while(url_ftell(&s->pb) + 5 < next){ + char tmp[128]; + int type, len; + double d= 0; + + len= get_be16(&s->pb); + if(len >= sizeof(tmp) || !len) + break; + get_buffer(&s->pb, tmp, len); + tmp[len]=0; + + type= get_byte(&s->pb); + if(type==0){ + d= av_int2dbl(get_be64(&s->pb)); + }else if(type==2){ + len= get_be16(&s->pb); + if(len >= sizeof(tmp)) + break; + url_fskip(&s->pb, len); + }else if(type==8){ + //array + break; + }else if(type==11){ + d= av_int2dbl(get_be64(&s->pb)); + get_be16(&s->pb); + } + + if(!strcmp(tmp, "duration")){ + s->duration = d*AV_TIME_BASE; + }else if(!strcmp(tmp, "videodatarate")){ + }else if(!strcmp(tmp, "audiodatarate")){ + } + } + url_fseek(&s->pb, next, SEEK_SET); + continue; } else { /* skip packet */ av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags); - url_fskip(&s->pb, size); + url_fseek(&s->pb, next, SEEK_SET); continue; } @@ -109,7 +149,7 @@ ||(st->discard >= AVDISCARD_BIDIR && ((flags >> 4)==3 && !is_audio)) || st->discard >= AVDISCARD_ALL ){ - url_fskip(&s->pb, size); + url_fseek(&s->pb, next, SEEK_SET); continue; } break; @@ -147,7 +187,7 @@ } } - ret= av_get_packet(&s->pb, pkt, size); + ret= av_get_packet(&s->pb, pkt, size - 1); if (ret <= 0) { return AVERROR_IO; }