vlc | branch: master | Steve Lhomme <[email protected]> | Mon Aug 7 12:46:22 2017 +0200| [ac5124e403f1ea3f499956f1c9ee90ce7a3a0db8] | committer: Rémi Denis-Courmont
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 -- replaces https://patches.videolan.org/patch/17586/ - remove unnecessary extra indirection Signed-off-by: Rémi Denis-Courmont <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ac5124e403f1ea3f499956f1c9ee90ce7a3a0db8 --- modules/video_output/win32/d3d11_deinterlace.c | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/modules/video_output/win32/d3d11_deinterlace.c b/modules/video_output/win32/d3d11_deinterlace.c index 63a087f7c1..828231852e 100644 --- a/modules/video_output/win32/d3d11_deinterlace.c +++ b/modules/video_output/win32/d3d11_deinterlace.c @@ -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; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
