diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2005-06-27 20:54:36 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2005-06-27 20:54:36 +0000 |
commit | 43c0040a6569334d4cebdcc26603bbf3a3d71c26 (patch) | |
tree | 1d4d9c132377c4756499162531e0611cb8454527 /libavformat/utils.c | |
parent | 3d15acf27bb57d61ae555d4b2c7bed5053a47c20 (diff) | |
download | ffmpeg-43c0040a6569334d4cebdcc26603bbf3a3d71c26.tar.gz |
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
Originally committed as revision 4400 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index caad4a00b9..5c81265185 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1675,15 +1675,17 @@ static int try_decode_frame(AVStream *st, const uint8_t *data, int size) { 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 @@ static int try_decode_frame(AVStream *st, const uint8_t *data, int size) } } fail: - avcodec_close(&st->codec); return ret; } @@ -1842,7 +1843,7 @@ int av_find_stream_info(AVFormatContext *ic) 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 @@ int av_find_stream_info(AVFormatContext *ic) 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) { |