changeset 821:92dfb26763e4 libavformat

extract duration if available
author michael
date Tue, 19 Jul 2005 14:26:41 +0000
parents feca73904e67
children 2614d3c1f415
files flvdec.c
diffstat 1 files changed, 47 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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;
     }