[FFmpeg-devel] [PATCH] avcodec/vc1dec: Re-order init to avoid initting hwaccel too early
Michael Niedermayer
michael at niedermayer.cc
Sun Aug 9 03:56:08 CEST 2015
On Sat, Aug 08, 2015 at 03:03:27PM -0700, Philip Langdale wrote:
> At least for vdpau, the hwaccel init code tries to check the video
> profile and ensure that there is a matching vdpau profile available.
>
> If it can't find a match, it will fail to initialise.
>
> In the case of wmv3/vc1, I observed initialisation to fail all the
> time. It turns out that this is due to the hwaccel being initialised
> very early in the codec init, before the profile has been extracted
> and set.
>
> Conceptually, it's a simple fix to reorder the init code, but it gets
> messy really fast because ff_get_format(), which is what implicitly
> trigger hwaccel init, is called multiple times through various shared
> init calls from h263, etc. It's incredibly hard to prove to my own
> satisfaction that it's safe to move the vc1 specific init code
> ahead of this generic code, but all the vc1 fate tests pass, and I've
> visually inspected a couple of samples and things seem correct.
>
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
> libavcodec/vc1dec.c | 47 ++++++++++++++++++++++++-----------------------
> 1 file changed, 24 insertions(+), 23 deletions(-)
>
> diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
> index abaa0b4..12257b8 100644
> --- a/libavcodec/vc1dec.c
> +++ b/libavcodec/vc1dec.c
> @@ -428,31 +428,8 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
>
> if (!avctx->extradata_size || !avctx->extradata)
> return -1;
> - if (!CONFIG_GRAY || !(avctx->flags & AV_CODEC_FLAG_GRAY))
> - avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
> - else {
> - avctx->pix_fmt = AV_PIX_FMT_GRAY8;
> - if (avctx->color_range == AVCOL_RANGE_UNSPECIFIED)
> - avctx->color_range = AVCOL_RANGE_MPEG;
> - }
> v->s.avctx = avctx;
>
> - if ((ret = ff_vc1_init_common(v)) < 0)
> - return ret;
> - // ensure static VLC tables are initialized
> - if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
> - return ret;
> - if ((ret = ff_vc1_decode_init_alloc_tables(v)) < 0)
> - return ret;
> - // Hack to ensure the above functions will be called
> - // again once we know all necessary settings.
> - // That this is necessary might indicate a bug.
> - ff_vc1_decode_end(avctx);
> -
> - ff_blockdsp_init(&s->bdsp, avctx);
> - ff_h264chroma_init(&v->h264chroma, 8);
> - ff_qpeldsp_init(&s->qdsp);
> -
> if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
> int count = 0;
>
> @@ -532,6 +509,30 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
> if (v->profile == PROFILE_ADVANCED)
> avctx->level = v->level;
>
> + if (!CONFIG_GRAY || !(avctx->flags & AV_CODEC_FLAG_GRAY))
> + avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
> + else {
> + avctx->pix_fmt = AV_PIX_FMT_GRAY8;
> + if (avctx->color_range == AVCOL_RANGE_UNSPECIFIED)
> + avctx->color_range = AVCOL_RANGE_MPEG;
> + }
> +
> + if ((ret = ff_vc1_init_common(v)) < 0)
> + return ret;
> + // ensure static VLC tables are initialized
> + if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
> + return ret;
> + if ((ret = ff_vc1_decode_init_alloc_tables(v)) < 0)
> + return ret;
> + // Hack to ensure the above functions will be called
> + // again once we know all necessary settings.
> + // That this is necessary might indicate a bug.
> + ff_vc1_decode_end(avctx);
this will dealocate sprite_output_frame and crash when its used later
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
If you think the mosad wants you dead since a long time then you are either
wrong or dead since a long time.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150809/6cc756e5/attachment.sig>
More information about the ffmpeg-devel
mailing list