X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Favcodec%2Fvideo.c;h=2e05979bf513ed8cf0f8c7e61a42b9f8ae4ef85a;hb=b93941118c323e0b7898a2faa37f9e22001f1654;hp=33319fe1a481fc00234cd6d183233f7225ecb8f8;hpb=9478802c33408ea6afcb831c982eb512cf1cac2d;p=vlc diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c index 33319fe1a4..2e05979bf5 100644 --- a/modules/codec/avcodec/video.c +++ b/modules/codec/avcodec/video.c @@ -57,7 +57,6 @@ struct decoder_sys_t /* for frame skipping algo */ bool b_hurry_up; enum AVDiscard i_skip_frame; - enum AVDiscard i_skip_idct; /* how many decoded frames are late */ int i_late_frames; @@ -106,6 +105,7 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * ); #endif static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *, const enum PixelFormat * ); +static picture_t *DecodeVideo( decoder_t *, block_t ** ); static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc ) { @@ -202,11 +202,11 @@ static int OpenVideoCodec( decoder_t *p_dec ) if( p_sys->p_context->extradata_size <= 0 ) { - if( p_sys->i_codec_id == AV_CODEC_ID_VC1 || - p_sys->i_codec_id == AV_CODEC_ID_THEORA ) + if( p_sys->p_codec->id == AV_CODEC_ID_VC1 || + p_sys->p_codec->id == AV_CODEC_ID_THEORA ) { msg_Warn( p_dec, "waiting for extra data for codec %s", - p_sys->psz_namecodec ); + p_sys->p_codec->name ); return 1; } } @@ -258,7 +258,7 @@ static int OpenVideoCodec( decoder_t *p_dec ) * opened (done after the first decoded frame). *****************************************************************************/ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, - AVCodec *p_codec, int i_codec_id, const char *psz_namecodec ) + const AVCodec *p_codec ) { decoder_sys_t *p_sys; int i_val; @@ -267,77 +267,68 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, if( ( p_dec->p_sys = p_sys = calloc( 1, sizeof(decoder_sys_t) ) ) == NULL ) return VLC_ENOMEM; - p_codec->type = AVMEDIA_TYPE_VIDEO; - p_context->codec_type = AVMEDIA_TYPE_VIDEO; - p_context->codec_id = i_codec_id; p_sys->p_context = p_context; p_sys->p_codec = p_codec; - p_sys->i_codec_id = i_codec_id; - p_sys->psz_namecodec = psz_namecodec; p_sys->p_ff_pic = avcodec_alloc_frame(); p_sys->b_delayed_open = true; p_sys->p_va = NULL; vlc_sem_init( &p_sys->sem_mt, 0 ); /* ***** Fill p_context with init values ***** */ - p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_original_fourcc ?: p_dec->fmt_in.i_codec ); + p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_original_fourcc ?: p_dec->fmt_in.i_codec ); /* ***** Get configuration of ffmpeg plugin ***** */ - p_sys->p_context->workaround_bugs = + p_context->workaround_bugs = var_InheritInteger( p_dec, "avcodec-workaround-bugs" ); - p_sys->p_context->err_recognition = + p_context->err_recognition = var_InheritInteger( p_dec, "avcodec-error-resilience" ); if( var_CreateGetBool( p_dec, "grayscale" ) ) - p_sys->p_context->flags |= CODEC_FLAG_GRAY; + p_context->flags |= CODEC_FLAG_GRAY; /* ***** Output always the frames ***** */ #if LIBAVCODEC_VERSION_CHECK(55, 23, 1, 40, 101) - p_sys->p_context->flags |= CODEC_FLAG_OUTPUT_CORRUPT; + p_context->flags |= CODEC_FLAG_OUTPUT_CORRUPT; #endif - i_val = var_CreateGetInteger( p_dec, "avcodec-vismv" ); - if( i_val ) p_sys->p_context->debug_mv = i_val; - i_val = var_CreateGetInteger( p_dec, "avcodec-skiploopfilter" ); - if( i_val >= 4 ) p_sys->p_context->skip_loop_filter = AVDISCARD_ALL; - else if( i_val == 3 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONKEY; - else if( i_val == 2 ) p_sys->p_context->skip_loop_filter = AVDISCARD_BIDIR; - else if( i_val == 1 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONREF; + if( i_val >= 4 ) p_context->skip_loop_filter = AVDISCARD_ALL; + else if( i_val == 3 ) p_context->skip_loop_filter = AVDISCARD_NONKEY; + else if( i_val == 2 ) p_context->skip_loop_filter = AVDISCARD_BIDIR; + else if( i_val == 1 ) p_context->skip_loop_filter = AVDISCARD_NONREF; if( var_CreateGetBool( p_dec, "avcodec-fast" ) ) - p_sys->p_context->flags2 |= CODEC_FLAG2_FAST; + p_context->flags2 |= CODEC_FLAG2_FAST; /* ***** libavcodec frame skipping ***** */ p_sys->b_hurry_up = var_CreateGetBool( p_dec, "avcodec-hurry-up" ); i_val = var_CreateGetInteger( p_dec, "avcodec-skip-frame" ); - if( i_val >= 4 ) p_sys->p_context->skip_frame = AVDISCARD_ALL; - else if( i_val == 3 ) p_sys->p_context->skip_frame = AVDISCARD_NONKEY; - else if( i_val == 2 ) p_sys->p_context->skip_frame = AVDISCARD_BIDIR; - else if( i_val == 1 ) p_sys->p_context->skip_frame = AVDISCARD_NONREF; - else if( i_val == -1 ) p_sys->p_context->skip_frame = AVDISCARD_NONE; - else p_sys->p_context->skip_frame = AVDISCARD_DEFAULT; - p_sys->i_skip_frame = p_sys->p_context->skip_frame; + if( i_val >= 4 ) p_context->skip_frame = AVDISCARD_ALL; + else if( i_val == 3 ) p_context->skip_frame = AVDISCARD_NONKEY; + else if( i_val == 2 ) p_context->skip_frame = AVDISCARD_BIDIR; + else if( i_val == 1 ) p_context->skip_frame = AVDISCARD_NONREF; + else if( i_val == -1 ) p_context->skip_frame = AVDISCARD_NONE; + else p_context->skip_frame = AVDISCARD_DEFAULT; + p_sys->i_skip_frame = p_context->skip_frame; i_val = var_CreateGetInteger( p_dec, "avcodec-skip-idct" ); - if( i_val >= 4 ) p_sys->p_context->skip_idct = AVDISCARD_ALL; - else if( i_val == 3 ) p_sys->p_context->skip_idct = AVDISCARD_NONKEY; - else if( i_val == 2 ) p_sys->p_context->skip_idct = AVDISCARD_BIDIR; - else if( i_val == 1 ) p_sys->p_context->skip_idct = AVDISCARD_NONREF; - else if( i_val == -1 ) p_sys->p_context->skip_idct = AVDISCARD_NONE; - else p_sys->p_context->skip_idct = AVDISCARD_DEFAULT; - p_sys->i_skip_idct = p_sys->p_context->skip_idct; + if( i_val >= 4 ) p_context->skip_idct = AVDISCARD_ALL; + else if( i_val == 3 ) p_context->skip_idct = AVDISCARD_NONKEY; + else if( i_val == 2 ) p_context->skip_idct = AVDISCARD_BIDIR; + else if( i_val == 1 ) p_context->skip_idct = AVDISCARD_NONREF; + else if( i_val == -1 ) p_context->skip_idct = AVDISCARD_NONE; + else p_context->skip_idct = AVDISCARD_DEFAULT; /* ***** libavcodec direct rendering ***** */ p_sys->b_direct_rendering = false; p_sys->i_direct_rendering_used = -1; if( var_CreateGetBool( p_dec, "avcodec-dr" ) && - (p_sys->p_codec->capabilities & CODEC_CAP_DR1) && + (p_codec->capabilities & CODEC_CAP_DR1) && /* No idea why ... but this fixes flickering on some TSCC streams */ - p_sys->i_codec_id != AV_CODEC_ID_TSCC && p_sys->i_codec_id != AV_CODEC_ID_CSCD && - p_sys->i_codec_id != AV_CODEC_ID_CINEPAK && - !p_sys->p_context->debug_mv ) + p_sys->p_codec->id != AV_CODEC_ID_TSCC && + p_sys->p_codec->id != AV_CODEC_ID_CSCD && + p_sys->p_codec->id != AV_CODEC_ID_CINEPAK ) { /* Some codecs set pix_fmt only after the 1st frame has been decoded, * so we need to do another check in ffmpeg_GetFrameBuf() */ @@ -349,24 +340,24 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, if( p_sys->b_direct_rendering ) { msg_Dbg( p_dec, "trying to use direct rendering" ); - p_sys->p_context->flags |= CODEC_FLAG_EMU_EDGE; + p_context->flags |= CODEC_FLAG_EMU_EDGE; } else { msg_Dbg( p_dec, "direct rendering is disabled" ); } - p_sys->p_context->get_format = ffmpeg_GetFormat; + p_context->get_format = ffmpeg_GetFormat; /* Always use our get_buffer wrapper so we can calculate the * PTS correctly */ #if LIBAVCODEC_VERSION_MAJOR >= 55 - p_sys->p_context->get_buffer2 = lavc_GetFrame; + p_context->get_buffer2 = lavc_GetFrame; #else - p_sys->p_context->get_buffer = ffmpeg_GetFrameBuf; - p_sys->p_context->reget_buffer = avcodec_default_reget_buffer; - p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf; + p_context->get_buffer = ffmpeg_GetFrameBuf; + p_context->reget_buffer = avcodec_default_reget_buffer; + p_context->release_buffer = ffmpeg_ReleaseFrameBuf; #endif - p_sys->p_context->opaque = p_dec; + p_context->opaque = p_dec; #ifdef HAVE_AVCODEC_MT int i_thread_count = var_InheritInteger( p_dec, "avcodec-threads" ); @@ -381,25 +372,27 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, } i_thread_count = __MIN( i_thread_count, 16 ); msg_Dbg( p_dec, "allowing %d thread(s) for decoding", i_thread_count ); - p_sys->p_context->thread_count = i_thread_count; - p_sys->p_context->thread_safe_callbacks = true; + p_context->thread_count = i_thread_count; + p_context->thread_safe_callbacks = true; - switch( i_codec_id ) + switch( p_codec->id ) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_H263: - p_sys->p_context->thread_type = 0; + p_context->thread_type = 0; break; case AV_CODEC_ID_MPEG1VIDEO: case AV_CODEC_ID_MPEG2VIDEO: - p_sys->p_context->thread_type &= ~FF_THREAD_SLICE; + p_context->thread_type &= ~FF_THREAD_SLICE; /* fall through */ # if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 1, 0)) case AV_CODEC_ID_H264: case AV_CODEC_ID_VC1: case AV_CODEC_ID_WMV3: - p_sys->p_context->thread_type &= ~FF_THREAD_FRAME; + p_context->thread_type &= ~FF_THREAD_FRAME; # endif + default: + break; } /* Workaround: frame multithreading is not compatible with @@ -412,13 +405,13 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, if( avcodec_hw == NULL || strcasecmp( avcodec_hw, "none" ) ) { msg_Warn( p_dec, "threaded frame decoding is not compatible with DXVA2, disabled" ); - p_sys->p_context->thread_type &= ~FF_THREAD_FRAME; + p_context->thread_type &= ~FF_THREAD_FRAME; } free( avcodec_hw ); # endif - if( p_sys->p_context->thread_type & FF_THREAD_FRAME ) - p_dec->i_extra_picture_buffers = 2 * p_sys->p_context->thread_count; + if( p_context->thread_type & FF_THREAD_FRAME ) + p_dec->i_extra_picture_buffers = 2 * p_context->thread_count; #endif /* ***** misc init ***** */ @@ -459,13 +452,14 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, return VLC_EGENERIC; } + p_dec->pf_decode_video = DecodeVideo; return VLC_SUCCESS; } /***************************************************************************** * DecodeVideo: Called to decode one or more frames *****************************************************************************/ -picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) +static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; AVCodecContext *p_context = p_sys->p_context; @@ -844,7 +838,7 @@ static void ffmpeg_InitCodec( decoder_t *p_dec ) if( !i_size ) return; - if( p_sys->i_codec_id == AV_CODEC_ID_SVQ3 ) + if( p_sys->p_codec->id == AV_CODEC_ID_SVQ3 ) { uint8_t *p; @@ -1182,7 +1176,6 @@ static int ffmpeg_va_GetFrameBuf( struct AVCodecContext *p_context, AVFrame *p_f static picture_t *ffmpeg_dr_GetFrameBuf(struct AVCodecContext *p_context) { decoder_t *p_dec = (decoder_t *)p_context->opaque; - decoder_sys_t *p_sys = p_dec->p_sys; int i_width = p_context->width; int i_height = p_context->height; @@ -1208,7 +1201,7 @@ static picture_t *ffmpeg_dr_GetFrameBuf(struct AVCodecContext *p_context) for( int i = 0; i < p_pic->i_planes; i++ ) { unsigned i_align; - switch( p_sys->i_codec_id ) + switch( p_context->codec_id ) { case AV_CODEC_ID_SVQ1: case AV_CODEC_ID_VP5: