Load the codec before video seek and only load it once.
This commit is contained in:
		@@ -29,7 +29,7 @@
 | 
			
		||||
AVDecoder::AvInit init;
 | 
			
		||||
 | 
			
		||||
AVDecoder::AVDecoder() :
 | 
			
		||||
    pFormatCtx(NULL), pCodecCtx(NULL), av_stream(NULL), av_codec(NULL), stream_index(-1)
 | 
			
		||||
    pFormatCtx(NULL), pCodecCtx(NULL), av_stream(NULL), av_codec(NULL), stream_index(-1), codec_loaded(false)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -59,6 +59,10 @@ bool AVDecoder::open(const QString filename)
 | 
			
		||||
 | 
			
		||||
bool AVDecoder::loadCodec(codec_type codec)
 | 
			
		||||
{
 | 
			
		||||
    if(codec_loaded) {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    AVDictionary *opts = NULL;
 | 
			
		||||
 | 
			
		||||
    if((stream_index = av_find_best_stream(pFormatCtx, (AVMediaType)codec, -1, -1, &av_codec, 0)) < 0) {
 | 
			
		||||
@@ -69,9 +73,11 @@ bool AVDecoder::loadCodec(codec_type codec)
 | 
			
		||||
    pCodecCtx = av_stream->codec;
 | 
			
		||||
 | 
			
		||||
    if(avcodec_open2(pCodecCtx, av_codec, &opts) < 0) {
 | 
			
		||||
        codec_loaded = false;
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    codec_loaded = true;
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -153,6 +159,10 @@ AVFrame *AVDecoder::getDecodedFrame(AVCodecContext *codec_ctx, int frame_stream_
 | 
			
		||||
 | 
			
		||||
bool AVDecoder::seekVideo(int percentage)
 | 
			
		||||
{
 | 
			
		||||
    if(!loadCodec(CODEC_VIDEO)) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qint64 seek_pos = pFormatCtx->duration * percentage / (AV_TIME_BASE * 100);
 | 
			
		||||
    qint64 frame = av_rescale(seek_pos, av_stream->time_base.den, av_stream->time_base.num);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -87,6 +87,7 @@ private:
 | 
			
		||||
    AVStream *av_stream;
 | 
			
		||||
    AVCodec *av_codec;
 | 
			
		||||
    int stream_index;
 | 
			
		||||
    bool codec_loaded;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // AVDECODER_H
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user