diff options
author | Johns <johns98@gmx.net> | 2013-01-05 15:41:57 +0100 |
---|---|---|
committer | Johns <johns98@gmx.net> | 2013-01-05 15:41:57 +0100 |
commit | 7e96a292eb4ec440e599d4f27aac4afcd4788369 (patch) | |
tree | 5c5eb29763821fbdcfa07a05b84f19cd2e8ea2bc /video.c | |
parent | d89ada9aad29870ad08b503aac3e85d8bc36c2ff (diff) | |
download | vdr-plugin-softhddevice-7e96a292eb4ec440e599d4f27aac4afcd4788369.tar.gz vdr-plugin-softhddevice-7e96a292eb4ec440e599d4f27aac4afcd4788369.tar.bz2 |
First video surface clears complete window.
Diffstat (limited to 'video.c')
-rw-r--r-- | video.c | 40 |
1 files changed, 26 insertions, 14 deletions
@@ -5990,16 +5990,19 @@ static void VdpauDelHwDecoder(VdpauDecoder * decoder) for (i = 0; i < VdpauDecoderN; ++i) { if (VdpauDecoders[i] == decoder) { VdpauDecoders[i] = NULL; - VdpauDecoderN--; - // FIXME: must copy last slot into empty slot and -- - break; - } - } + // copy last slot into empty slot + if (i < --VdpauDecoderN) { + VdpauDecoders[i] = VdpauDecoders[VdpauDecoderN]; + } - VdpauCleanup(decoder); - VdpauPrintFrames(decoder); + VdpauCleanup(decoder); + VdpauPrintFrames(decoder); + free(decoder); - free(decoder); + return; + } + } + Error(_("video/vdpau: decoder not in decoder list.\n")); } /// @@ -7652,8 +7655,9 @@ static void VdpauMixOsd(void) /// Render video surface to output surface. /// /// @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; VdpRect video_src_rect; @@ -7666,10 +7670,17 @@ static void VdpauMixVideo(VdpauDecoder * decoder) VdpauCheckAutoCrop(decoder); #endif - dst_rect.x0 = decoder->VideoX; // window output (clip) - dst_rect.y0 = decoder->VideoY; - dst_rect.x1 = decoder->VideoX + decoder->VideoWidth; - dst_rect.y1 = decoder->VideoY + decoder->VideoHeight; + if (level) { + dst_rect.x0 = decoder->VideoX; // video window output (clip) + dst_rect.y0 = decoder->VideoY; + 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.y0 = decoder->CropY; @@ -7813,6 +7824,7 @@ static void VdpauBlackSurface(VdpauDecoder * decoder) source_rect.x1 = 0; source_rect.y1 = 0; + // FIXME: what happens with PIP? if (0) { // FIXME: wrong for radio channels output_rect.x0 = decoder->OutputX; // video output (scale) @@ -7938,7 +7950,7 @@ static void VdpauDisplayFrame(void) continue; } - VdpauMixVideo(decoder); + VdpauMixVideo(decoder, i); } // |