Commit 13d4a89e authored by Steve Lhomme's avatar Steve Lhomme Committed by Jean-Baptiste Kempf

d3d11_deinterlace: always fill the output picture->context

It is necessary for snapshots which create a picture from scratch and then copy
"pixels" using the planes or the context callback.

Fixes #18533
Signed-off-by: Rémi Denis-Courmont's avatarRémi Denis-Courmont <remi@remlab.net>
parent bf018153
......@@ -64,6 +64,7 @@ struct filter_sys_t
ID3D11VideoProcessorOutputView *processorOutput;
struct deinterlace_ctx context;
picture_t * (*buffer_new)( filter_t * );
};
struct filter_mode_t
......@@ -230,6 +231,46 @@ static const struct filter_mode_t *GetFilterMode(const char *mode)
return NULL;
}
static void d3d11_pic_context_destroy(struct picture_context_t *opaque)
{
struct va_pic_context *pic_ctx = (struct va_pic_context*)opaque;
ReleasePictureSys(&pic_ctx->picsys);
free(pic_ctx);
}
static struct picture_context_t *d3d11_pic_context_copy(struct picture_context_t *ctx)
{
struct va_pic_context *src_ctx = (struct va_pic_context*)ctx;
struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx));
if (unlikely(pic_ctx==NULL))
return NULL;
pic_ctx->s.destroy = d3d11_pic_context_destroy;
pic_ctx->s.copy = d3d11_pic_context_copy;
pic_ctx->picsys = src_ctx->picsys;
AcquirePictureSys(&pic_ctx->picsys);
return &pic_ctx->s;
}
static picture_t *NewOutputPicture( filter_t *p_filter )
{
picture_t *pic = p_filter->p_sys->buffer_new( p_filter );
if ( !pic->context )
{
/* the picture might be duplicated for snapshots so it needs a context */
assert( pic->p_sys != NULL ); /* this opaque picture is wrong */
struct va_pic_context *pic_ctx = calloc(1, sizeof(*pic_ctx));
if (likely(pic_ctx!=NULL))
{
pic_ctx->s.destroy = d3d11_pic_context_destroy;
pic_ctx->s.copy = d3d11_pic_context_copy;
pic_ctx->picsys = *pic->p_sys;
AcquirePictureSys( &pic_ctx->picsys );
pic->context = &pic_ctx->s;
}
}
return pic;
}
static int Open(vlc_object_t *obj)
{
filter_t *filter = (filter_t *)obj;
......@@ -437,6 +478,8 @@ static int Open(vlc_object_t *obj)
goto error;
}
sys->buffer_new = filter->owner.video.buffer_new;
filter->owner.video.buffer_new = NewOutputPicture;
filter->fmt_out.video = out_fmt;
filter->pf_video_filter = Deinterlace;
filter->pf_flush = Flush;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment