changeset 801:bca2334ff177 libavformat

dont open and close codec at every call of try_decode_frame() as this is not only slow but also fails if the previous frame is needed for setting some parameters correctly
author michael
date Mon, 27 Jun 2005 20:54:36 +0000
parents e979dcad0d2f
children ea0e995ac4a8
files utils.c
diffstat 1 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/utils.c	Mon Jun 27 07:09:48 2005 +0000
+++ b/utils.c	Mon Jun 27 20:54:36 2005 +0000
@@ -1675,15 +1675,17 @@
 {
     int16_t *samples;
     AVCodec *codec;
-    int got_picture, ret;
+    int got_picture, ret=0;
     AVFrame picture;
     
+  if(!st->codec.codec){
     codec = avcodec_find_decoder(st->codec.codec_id);
     if (!codec)
         return -1;
     ret = avcodec_open(&st->codec, codec);
     if (ret < 0)
         return ret;
+  }
 
   if(!has_codec_parameters(&st->codec)){
     switch(st->codec.codec_type) {
@@ -1704,7 +1706,6 @@
     }
   }
  fail:
-    avcodec_close(&st->codec);
     return ret;
 }
 
@@ -1842,7 +1843,7 @@
                     duration_sum[index] += duration;
                     duration_count[index]+= factor;
                 }
-                if(st->codec_info_nb_frames == 0)
+                if(st->codec_info_nb_frames == 0 && 0)
                     st->codec_info_duration += duration;
             }
             last_dts[pkt->stream_index]= pkt->dts;
@@ -1883,6 +1884,12 @@
         count++;
     }
 
+    // close codecs which where opened in try_decode_frame()
+    for(i=0;i<ic->nb_streams;i++) {
+        st = ic->streams[i];
+        if(st->codec.codec)
+            avcodec_close(&st->codec);
+    }
     for(i=0;i<ic->nb_streams;i++) {
         st = ic->streams[i];
         if (st->codec.codec_type == CODEC_TYPE_VIDEO) {