Vpdau displays black, when no video available.

This commit is contained in:
Johns 2011-12-29 17:47:21 +01:00
parent f179264468
commit 1f2d1d235e
3 changed files with 42 additions and 3 deletions

View File

@ -1,6 +1,7 @@
User johns User johns
Date: Date:
Vdpau also displays a black surface, when no video is available.
Fix bug: CodecVideoDecode destroys avpkt. Fix bug: CodecVideoDecode destroys avpkt.
Date: Thu Dec 29 00:55:57 CET 2011 Date: Thu Dec 29 00:55:57 CET 2011

View File

@ -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 = static const char *const DESCRIPTION =
trNOOP("A software and GPU emulated HD device"); trNOOP("A software and GPU emulated HD device");

42
video.c
View File

@ -4660,6 +4660,44 @@ static void VdpauMixVideo(VdpauDecoder * decoder)
decoder->SurfaceRead); 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. /// Advance displayed frame.
/// ///
@ -4755,8 +4793,8 @@ static void VdpauDisplayFrame(void)
filled = atomic_read(&decoder->SurfacesFilled); filled = atomic_read(&decoder->SurfacesFilled);
// need 1 frame for progressive, 3 frames for interlaced // need 1 frame for progressive, 3 frames for interlaced
if (filled < 1 + 2 * decoder->Interlaced) { if (filled < 1 + 2 * decoder->Interlaced) {
// FIXME: render black surface // FIXME: rewrite MixVideo to support less surfaces
// FIXME: or rewrite MixVideo to support less surfaces VdpauBlackSurface(decoder);
continue; continue;
} }