diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2005-07-19 14:26:41 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2005-07-19 14:26:41 +0000 |
commit | dd9f59160e4809fba631b555d4e6022e0b4340ec (patch) | |
tree | d09323d8b50195681958659e1a69e286c2df5a06 /libavformat/flvdec.c | |
parent | 2e8f2c20c9a0422975b708f9b9007f136e7ca504 (diff) | |
download | ffmpeg-dd9f59160e4809fba631b555d4e6022e0b4340ec.tar.gz |
extract duration if available
Originally committed as revision 4459 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/flvdec.c')
-rw-r--r-- | libavformat/flvdec.c | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index b309c5b55f..f316aa56d7 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -58,7 +58,7 @@ static int flv_read_header(AVFormatContext *s, 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 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) 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 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) ||(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 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) } } - ret= av_get_packet(&s->pb, pkt, size); + ret= av_get_packet(&s->pb, pkt, size - 1); if (ret <= 0) { return AVERROR_IO; } |