First video surface clears complete window.

This commit is contained in:
Johns 2013-01-05 15:41:57 +01:00
parent d89ada9aad
commit 7e96a292eb
1 changed files with 26 additions and 14 deletions

40
video.c
View File

@ -5990,16 +5990,19 @@ static void VdpauDelHwDecoder(VdpauDecoder * decoder)
for (i = 0; i < VdpauDecoderN; ++i) { for (i = 0; i < VdpauDecoderN; ++i) {
if (VdpauDecoders[i] == decoder) { if (VdpauDecoders[i] == decoder) {
VdpauDecoders[i] = NULL; VdpauDecoders[i] = NULL;
VdpauDecoderN--; // copy last slot into empty slot
// FIXME: must copy last slot into empty slot and -- if (i < --VdpauDecoderN) {
break; VdpauDecoders[i] = VdpauDecoders[VdpauDecoderN];
}
VdpauCleanup(decoder);
VdpauPrintFrames(decoder);
free(decoder);
return;
} }
} }
Error(_("video/vdpau: decoder not in decoder list.\n"));
VdpauCleanup(decoder);
VdpauPrintFrames(decoder);
free(decoder);
} }
/// ///
@ -7652,8 +7655,9 @@ static void VdpauMixOsd(void)
/// Render video surface to output surface. /// Render video surface to output surface.
/// ///
/// @param decoder VDPAU hw decoder /// @param decoder VDPAU hw decoder
/// @param level video surface level 0 = bottom
/// ///
static void VdpauMixVideo(VdpauDecoder * decoder) static void VdpauMixVideo(VdpauDecoder * decoder, int level)
{ {
VdpVideoSurface current; VdpVideoSurface current;
VdpRect video_src_rect; VdpRect video_src_rect;
@ -7666,10 +7670,17 @@ static void VdpauMixVideo(VdpauDecoder * decoder)
VdpauCheckAutoCrop(decoder); VdpauCheckAutoCrop(decoder);
#endif #endif
dst_rect.x0 = decoder->VideoX; // window output (clip) if (level) {
dst_rect.y0 = decoder->VideoY; dst_rect.x0 = decoder->VideoX; // video window output (clip)
dst_rect.x1 = decoder->VideoX + decoder->VideoWidth; dst_rect.y0 = decoder->VideoY;
dst_rect.y1 = decoder->VideoY + decoder->VideoHeight; dst_rect.x1 = decoder->VideoX + decoder->VideoWidth;
dst_rect.y1 = decoder->VideoY + decoder->VideoHeight;
} else {
dst_rect.x0 = 0; // complete window (clip)
dst_rect.y0 = 0;
dst_rect.x1 = VideoWindowWidth;
dst_rect.y1 = VideoWindowHeight;
}
video_src_rect.x0 = decoder->CropX; // video source (crop) video_src_rect.x0 = decoder->CropX; // video source (crop)
video_src_rect.y0 = decoder->CropY; video_src_rect.y0 = decoder->CropY;
@ -7813,6 +7824,7 @@ static void VdpauBlackSurface(VdpauDecoder * decoder)
source_rect.x1 = 0; source_rect.x1 = 0;
source_rect.y1 = 0; source_rect.y1 = 0;
// FIXME: what happens with PIP?
if (0) { if (0) {
// FIXME: wrong for radio channels // FIXME: wrong for radio channels
output_rect.x0 = decoder->OutputX; // video output (scale) output_rect.x0 = decoder->OutputX; // video output (scale)
@ -7938,7 +7950,7 @@ static void VdpauDisplayFrame(void)
continue; continue;
} }
VdpauMixVideo(decoder); VdpauMixVideo(decoder, i);
} }
// //