vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sat Jun 7 18:04:03 2014 +0300| [b87f8983bd37ee186b7a86c1ebae6bcac316911f] | committer: Rémi Denis-Courmont
vdpau/chroma: remove one callback > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b87f8983bd37ee186b7a86c1ebae6bcac316911f --- modules/hw/vdpau/chroma.c | 84 ++++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/modules/hw/vdpau/chroma.c b/modules/hw/vdpau/chroma.c index 947bdcd..85b57aa 100644 --- a/modules/hw/vdpau/chroma.c +++ b/modules/hw/vdpau/chroma.c @@ -42,7 +42,6 @@ struct filter_sys_t VdpVideoMixer mixer; VdpChromaType chroma; VdpYCbCrFormat format; - picture_t *(*import)(filter_t *, picture_t *); struct { @@ -420,21 +419,29 @@ drop: return NULL; } -static picture_t *VideoPassthrough(filter_t *filter, picture_t *src) +static inline VdpVideoSurface picture_GetVideoSurface(const picture_t *pic) +{ + vlc_vdp_video_field_t *field = pic->context; + return field->frame->surface; +} + +static picture_t *VideoRender(filter_t *filter, picture_t *src) { filter_sys_t *sys = filter->p_sys; - vlc_vdp_video_field_t *field = src->context; + VdpStatus err; - if (unlikely(field == NULL)) + if (unlikely(src->context == NULL)) { msg_Err(filter, "corrupt VDPAU video surface"); - goto error; + picture_Release(src); + return NULL; } - vlc_vdp_video_frame_t *psys = field->frame; + picture_t *dst = OutputAllocate(filter); /* Corner case: different VDPAU instances decoding and rendering */ - if (psys->vdp != sys->vdp) + vlc_vdp_video_field_t *field = src->context; + if (field->frame->vdp != sys->vdp) { video_format_t fmt = src->format; switch (sys->chroma) @@ -446,35 +453,21 @@ static picture_t *VideoPassthrough(filter_t *filter, picture_t *src) } picture_t *pic = picture_NewFromFormat(&fmt); - if (unlikely(pic == NULL)) - goto error; - - pic = VideoExport(filter, src, pic); - if (pic == NULL) - return NULL; - - src = VideoImport(filter, pic); + if (likely(pic != NULL)) + { + pic = VideoExport(filter, src, pic); + if (pic != NULL) + src = VideoImport(filter, pic); + else + src = NULL; + } + else + { + picture_Release(src); + src = NULL; + } } - return src; -error: - picture_Release(src); - return NULL; -} - -static inline VdpVideoSurface picture_GetVideoSurface(const picture_t *pic) -{ - vlc_vdp_video_field_t *field = pic->context; - return field->frame->surface; -} - -static picture_t *MixerRender(filter_t *filter, picture_t *src) -{ - filter_sys_t *sys = filter->p_sys; - VdpStatus err; - picture_t *dst = OutputAllocate(filter); - - src = sys->import(filter, src); /* Update history and take "present" picture field */ if (likely(src != NULL)) { @@ -592,6 +585,20 @@ skip: return dst; } +static picture_t *YCbCrRender(filter_t *filter, picture_t *src) +{ + /* FIXME: Define a way to initialize the mixer in Open() instead. */ + if (unlikely(filter->p_sys->vdp == NULL)) + { + picture_t *dummy = OutputAllocate(filter); + if (dummy != NULL) + picture_Release(dummy); + } + + src = VideoImport(filter, src); + return (src != NULL) ? VideoRender(filter, src) : NULL; +} + static int OutputOpen(vlc_object_t *obj) { filter_t *filter = (filter_t *)obj; @@ -609,7 +616,7 @@ static int OutputOpen(vlc_object_t *obj) { sys->chroma = VDP_CHROMA_TYPE_444; sys->format = VDP_YCBCR_FORMAT_NV12; - sys->import = VideoPassthrough; + filter->pf_video_filter = VideoRender; } else if (filter->fmt_in.video.i_chroma == VLC_CODEC_VDPAU_VIDEO_422) @@ -617,19 +624,19 @@ static int OutputOpen(vlc_object_t *obj) sys->chroma = VDP_CHROMA_TYPE_422; /* TODO: check if the drivery supports NV12 or UYVY */ sys->format = VDP_YCBCR_FORMAT_UYVY; - sys->import = VideoPassthrough; + filter->pf_video_filter = VideoRender; } else if (filter->fmt_in.video.i_chroma == VLC_CODEC_VDPAU_VIDEO_420) { sys->chroma = VDP_CHROMA_TYPE_420; sys->format = VDP_YCBCR_FORMAT_NV12; - sys->import = VideoPassthrough; + filter->pf_video_filter = VideoRender; } else if (vlc_fourcc_to_vdp_ycc(filter->fmt_in.video.i_chroma, &sys->chroma, &sys->format)) - sys->import = VideoImport; + filter->pf_video_filter = YCbCrRender; else { free(sys); @@ -651,7 +658,6 @@ static int OutputOpen(vlc_object_t *obj) sys->procamp.saturation = 1.f; sys->procamp.hue = 0.f; - filter->pf_video_filter = MixerRender; filter->pf_video_flush = Flush; filter->p_sys = sys; return VLC_SUCCESS; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
