From 1f2d1d235e162b8913f381e426ce40540460485a Mon Sep 17 00:00:00 2001 From: Johns Date: Thu, 29 Dec 2011 17:47:21 +0100 Subject: [PATCH] Vpdau displays black, when no video available. --- ChangeLog | 1 + softhddevice.cpp | 2 +- video.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0677169..7927942 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ User johns Date: + Vdpau also displays a black surface, when no video is available. Fix bug: CodecVideoDecode destroys avpkt. Date: Thu Dec 29 00:55:57 CET 2011 diff --git a/softhddevice.cpp b/softhddevice.cpp index e8b9679..1dbff5f 100644 --- a/softhddevice.cpp +++ b/softhddevice.cpp @@ -39,7 +39,7 @@ extern "C" { ////////////////////////////////////////////////////////////////////////////// -static const char *const VERSION = "0.1.3"; +static const char *const VERSION = "0.1.4"; static const char *const DESCRIPTION = trNOOP("A software and GPU emulated HD device"); diff --git a/video.c b/video.c index fad0f57..accab80 100644 --- a/video.c +++ b/video.c @@ -4660,6 +4660,44 @@ static void VdpauMixVideo(VdpauDecoder * decoder) decoder->SurfaceRead); } +/// +/// Create and display a black empty surface. +/// +/// @param decoder VDPAU hw decoder +/// +static void VdpauBlackSurface(VdpauDecoder * decoder) +{ + VdpStatus status; + void *image; + void const *data[1]; + uint32_t pitches[1]; + VdpRect dst_rect; + + Debug(3, "video/vdpau: black surface\n"); + + // FIXME: clear video window area + (void)decoder; + + image = calloc(4, VideoWindowWidth * VideoWindowHeight); + + dst_rect.x0 = 0; + dst_rect.y0 = 0; + dst_rect.x1 = dst_rect.x0 + VideoWindowWidth; + dst_rect.y1 = dst_rect.y0 + VideoWindowHeight; + data[0] = image; + pitches[0] = VideoWindowWidth * 4; + + status = + VdpauOutputSurfacePutBitsNative(VdpauSurfacesRb[VdpauSurfaceIndex], + data, pitches, &dst_rect); + if (status != VDP_STATUS_OK) { + Error(_("video/vdpau: output surface put bits failed: %s\n"), + VdpauGetErrorString(status)); + } + + free(image); +} + /// /// Advance displayed frame. /// @@ -4755,8 +4793,8 @@ static void VdpauDisplayFrame(void) filled = atomic_read(&decoder->SurfacesFilled); // need 1 frame for progressive, 3 frames for interlaced if (filled < 1 + 2 * decoder->Interlaced) { - // FIXME: render black surface - // FIXME: or rewrite MixVideo to support less surfaces + // FIXME: rewrite MixVideo to support less surfaces + VdpauBlackSurface(decoder); continue; }