extract duration if available
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Jul 2005 14:26:41 +0000 (14:26 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Jul 2005 14:26:41 +0000 (14:26 +0000)
Originally committed as revision 4459 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/flvdec.c

index b309c5b..f316aa5 100644 (file)
@@ -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;
     }