Commit 6ffb7537 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vdpau: simplify surface copy when deinterlacing

parent 59ab278d
...@@ -45,9 +45,9 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src) ...@@ -45,9 +45,9 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src)
vlc_vdp_video_field_t *f1 = src->context; vlc_vdp_video_field_t *f1 = src->context;
if (unlikely(f1 == NULL)) if (unlikely(f1 == NULL))
return src; return src;
if (f1->structure != VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) if (f1->structure != VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME)
return src; /* cannot deinterlace twice */ return src; /* cannot deinterlace twice */
#ifdef VOUT_CORE_GETS_A_CLUE #ifdef VOUT_CORE_GETS_A_CLUE
picture_t *dst = filter_NewPicture(filter); picture_t *dst = filter_NewPicture(filter);
#else #else
...@@ -55,12 +55,16 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src) ...@@ -55,12 +55,16 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src)
#endif #endif
if (dst == NULL) if (dst == NULL)
return src; /* cannot deinterlace without copying fields */ return src; /* cannot deinterlace without copying fields */
if (vlc_vdp_video_copy(dst, src) != VDP_STATUS_OK) // shallow copy
vlc_vdp_video_field_t *f2 = vlc_vdp_video_copy(f1); // shallow copy
if (unlikely(f2 == NULL))
{ {
picture_Release(dst); picture_Release(dst);
return src; return src;
} }
picture_CopyProperties(dst, src); picture_CopyProperties(dst, src);
dst->context = f2;
if (last_pts != VLC_TS_INVALID) if (last_pts != VLC_TS_INVALID)
dst->date = (3 * src->date - last_pts) / 2; dst->date = (3 * src->date - last_pts) / 2;
...@@ -75,7 +79,6 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src) ...@@ -75,7 +79,6 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src)
assert(src->p_next == NULL); assert(src->p_next == NULL);
src->p_next = dst; src->p_next = dst;
vlc_vdp_video_field_t *f2 = dst->context;
if (src->b_progressive || src->b_top_field_first) if (src->b_progressive || src->b_top_field_first)
{ {
f1->structure = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; f1->structure = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
......
...@@ -94,21 +94,12 @@ VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface, ...@@ -94,21 +94,12 @@ VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface,
return VDP_STATUS_OK; return VDP_STATUS_OK;
} }
VdpStatus vlc_vdp_video_copy(picture_t *restrict dst, picture_t *restrict src) vlc_vdp_video_field_t *vlc_vdp_video_copy(vlc_vdp_video_field_t *fold)
{ {
vlc_vdp_video_field_t *fold = src->context;
vlc_vdp_video_frame_t *frame = fold->frame; vlc_vdp_video_frame_t *frame = fold->frame;
vlc_vdp_video_field_t *fnew = malloc(sizeof (*fnew)); vlc_vdp_video_field_t *fnew = malloc(sizeof (*fnew));
if (unlikely(fnew == NULL)) if (unlikely(fnew == NULL))
return VDP_STATUS_RESOURCES; return NULL;
assert(src->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_420
|| src->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_422);
assert(dst->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_420
|| dst->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_422);
assert(!picture_IsReferenced(dst));
assert(dst->context == NULL);
dst->context = fnew;
fnew->destroy = SurfaceDestroy; fnew->destroy = SurfaceDestroy;
fnew->frame = frame; fnew->frame = frame;
...@@ -117,7 +108,7 @@ VdpStatus vlc_vdp_video_copy(picture_t *restrict dst, picture_t *restrict src) ...@@ -117,7 +108,7 @@ VdpStatus vlc_vdp_video_copy(picture_t *restrict dst, picture_t *restrict src)
fnew->sharpen = fold->sharpen; fnew->sharpen = fold->sharpen;
atomic_fetch_add(&frame->refs, 1); atomic_fetch_add(&frame->refs, 1);
return VDP_STATUS_OK; return fnew;
} }
vlc_vdp_video_field_t *vlc_vdp_video_detach(picture_t *pic) vlc_vdp_video_field_t *vlc_vdp_video_detach(picture_t *pic)
......
...@@ -271,9 +271,10 @@ typedef struct vlc_vdp_video_field ...@@ -271,9 +271,10 @@ typedef struct vlc_vdp_video_field
VdpStatus vlc_vdp_video_attach(vdp_t *, VdpVideoSurface, picture_t *); VdpStatus vlc_vdp_video_attach(vdp_t *, VdpVideoSurface, picture_t *);
/** /**
* Copies the VDPAU video surface from a VLC picture into another VLC picture. * Performs a shallow copy of a VDPAU video surface context
* (the underlying VDPAU video surface is shared).
*/ */
VdpStatus vlc_vdp_video_copy(picture_t *dst, picture_t *src); vlc_vdp_video_field_t *vlc_vdp_video_copy(vlc_vdp_video_field_t *);
/** /**
* Detaches a VDPAU video surface as context from a VLC picture. * Detaches a VDPAU video surface as context from a VLC picture.
......
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