vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Thu Sep 15 13:38:47 2016 +0300| [489835e12c124a421ccb3cb7c0a5e38155ad7a55] | committer: Rémi Denis-Courmont
vmem: fix callback usage (fixes #17187) This matches the documentation and behaviour expected by some existing applications, but it is inefficient. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=489835e12c124a421ccb3cb7c0a5e38155ad7a55 --- modules/video_output/vmem.c | 91 ++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 63 deletions(-) diff --git a/modules/video_output/vmem.c b/modules/video_output/vmem.c index 64aefa1..25d8a86 100644 --- a/modules/video_output/vmem.c +++ b/modules/video_output/vmem.c @@ -88,9 +88,9 @@ struct picture_sys_t { /* NOTE: the callback prototypes must match those of LibVLC */ struct vout_display_sys_t { picture_pool_t *pool; - unsigned count; void *opaque; + void *pic_opaque; void *(*lock)(void *sys, void **plane); void (*unlock)(void *sys, void *id, void *const *plane); void (*display)(void *sys, void *id); @@ -104,23 +104,10 @@ typedef unsigned (*vlc_format_cb)(void **, char *, unsigned *, unsigned *, unsigned *, unsigned *); static picture_pool_t *Pool (vout_display_t *, unsigned); +static void Prepare(vout_display_t *, picture_t *, subpicture_t *); static void Display(vout_display_t *, picture_t *, subpicture_t *); static int Control(vout_display_t *, int, va_list); -static void Unlock(void *data, picture_t *pic) -{ - vout_display_sys_t *sys = data; - picture_sys_t *picsys = pic->p_sys; - void *planes[PICTURE_PLANE_MAX]; - - assert(!picture_IsReferenced(pic)); - - for (int i = 0; i < pic->i_planes; i++) - planes[i] = pic->p[i].p_pixels; - - sys->unlock(sys->opaque, picsys->id, planes); -} - /***************************************************************************** * Open: allocates video thread ***************************************************************************** @@ -160,9 +147,8 @@ static int Open(vlc_object_t *object) memset(sys->pitches, 0, sizeof(sys->pitches)); memset(sys->lines, 0, sizeof(sys->lines)); - sys->count = setup(&sys->opaque, chroma, &fmt.i_width, &fmt.i_height, - sys->pitches, sys->lines); - if (sys->count == 0) { + if (setup(&sys->opaque, chroma, &fmt.i_width, &fmt.i_height, + sys->pitches, sys->lines) == 0) { msg_Err(vd, "video format setup failure (no pictures)"); free(sys); return VLC_EGENERIC; @@ -183,7 +169,6 @@ static int Open(vlc_object_t *object) sys->pitches[i] = sys->pitches[0]; sys->lines[i] = sys->lines[0]; } - sys->count = 1; sys->cleanup = NULL; } fmt.i_x_offset = fmt.i_y_offset = 0; @@ -231,7 +216,7 @@ static int Open(vlc_object_t *object) vd->fmt = fmt; vd->info = info; vd->pool = Pool; - vd->prepare = NULL; + vd->prepare = Prepare; vd->display = Display; vd->control = Control; vd->manage = NULL; @@ -250,13 +235,8 @@ static void Close(vlc_object_t *object) if (sys->cleanup) sys->cleanup(sys->opaque); - if (sys->pool) - { - if (sys->unlock != NULL) - picture_pool_Enum(sys->pool, Unlock, sys); picture_pool_Release(sys->pool); - } free(sys); } @@ -264,50 +244,35 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) { vout_display_sys_t *sys = vd->sys; - if (sys->pool) - return sys->pool; - - if (count > sys->count) - count = sys->count; - - picture_t *pictures[count]; - - for (unsigned i = 0; i < count; i++) { - picture_sys_t *picsys = malloc(sizeof (*picsys)); - if (unlikely(picsys == NULL)) - { - count = i; - break; - } - picsys->id = NULL; - - picture_resource_t rsc = { .p_sys = picsys }; - void *planes[PICTURE_PLANE_MAX]; + if (sys->pool == NULL) + sys->pool = picture_pool_NewFromFormat(&vd->fmt, count); + return sys->pool; +} - picsys->id = sys->lock(sys->opaque, planes); +static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic) +{ + vout_display_sys_t *sys = vd->sys; + picture_resource_t rsc = { .p_sys = NULL }; + void *planes[PICTURE_PLANE_MAX]; - for (unsigned i = 0; i < PICTURE_PLANE_MAX; i++) { - rsc.p[i].p_pixels = planes[i]; - rsc.p[i].i_lines = sys->lines[i]; - rsc.p[i].i_pitch = sys->pitches[i]; - } + sys->pic_opaque = sys->lock(sys->opaque, planes); - pictures[i] = picture_NewFromResource(&vd->fmt, &rsc); - if (!pictures[i]) { - free(rsc.p_sys); - count = i; - break; - } + for (unsigned i = 0; i < PICTURE_PLANE_MAX; i++) { + rsc.p[i].p_pixels = planes[i]; + rsc.p[i].i_lines = sys->lines[i]; + rsc.p[i].i_pitch = sys->pitches[i]; } - /* */ - sys->pool = picture_pool_New(count, pictures); - if (!sys->pool) { - for (unsigned i = 0; i < count; i++) - picture_Release(pictures[i]); + picture_t *locked = picture_NewFromResource(&vd->fmt, &rsc); + if (likely(locked != NULL)) { + picture_CopyPixels(locked, pic); + picture_Release(locked); } - return sys->pool; + if (sys->unlock != NULL) + sys->unlock(sys->opaque, sys->pic_opaque, planes); + + (void) subpic; } static void Display(vout_display_t *vd, picture_t *pic, subpicture_t *subpic) @@ -315,7 +280,7 @@ static void Display(vout_display_t *vd, picture_t *pic, subpicture_t *subpic) vout_display_sys_t *sys = vd->sys; if (sys->display != NULL) - sys->display(sys->opaque, pic->p_sys->id); + sys->display(sys->opaque, sys->pic_opaque); picture_Release(pic); VLC_UNUSED(subpic); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits