Support configuration and set of video background.

This commit is contained in:
Johns 2012-02-24 15:15:50 +01:00
parent 82f61de117
commit 668a6ec277
4 changed files with 108 additions and 16 deletions

View File

@ -1,6 +1,7 @@
User johns
Date:
Support configuration and set of video background.
Survive lost X11 display.
Fix bug: 100% cpu use with plugins like mp3.
Wakeup display thread on channel switch, osd can now be shown without

View File

@ -66,6 +66,7 @@ static const char *const Resolution[RESOLUTIONS] = {
static char ConfigMakePrimary; ///< config primary wanted
static char ConfigHideMainMenuEntry; ///< config hide main menu entry
static uint32_t ConfigVideoBackground; ///< config video background color
static int ConfigVideoSkipLines; ///< config skip lines top/bottom
static int ConfigVideoStudioLevels; ///< config use studio levels
static int ConfigVideo60HzMode; ///< config use 60Hz display mode
@ -411,6 +412,8 @@ class cMenuSetupSoft:public cMenuSetupPage
/// @{
int MakePrimary;
int HideMainMenuEntry;
uint32_t Background;
uint32_t BackgroundAlpha;
int SkipLines;
int StudioLevels;
int Scaling[RESOLUTIONS];
@ -482,6 +485,13 @@ cMenuSetupSoft::cMenuSetupSoft(void)
//
Add(SeparatorItem(tr("Video")));
// no unsigned int menu item supported, split background color/alpha
Background = ConfigVideoBackground >> 8;
BackgroundAlpha = ConfigVideoBackground & 0xFF;
Add(new cMenuEditIntItem(tr("video background color (RGB)"),
(int *)&Background, 0, 0x00FFFFFF));
Add(new cMenuEditIntItem(tr("video background color (Alpha)"),
(int *)&BackgroundAlpha, 0, 0xFF));
SkipLines = ConfigVideoSkipLines;
Add(new cMenuEditIntItem(tr("Skip lines top+bot (pixel)"), &SkipLines, 0,
64));
@ -504,10 +514,10 @@ cMenuSetupSoft::cMenuSetupSoft(void)
&InverseTelecine[i], trVDR("no"), trVDR("yes")));
Denoise[i] = ConfigVideoDenoise[i];
Add(new cMenuEditIntItem(tr("Denoise (0..1000) (vdpau)"), &Denoise[i],
0, 1000));
0, 1000, tr("off"), tr("max")));
Sharpen[i] = ConfigVideoSharpen[i];
Add(new cMenuEditIntItem(tr("Sharpen (-1000..1000) (vdpau)"),
&Sharpen[i], -1000, 1000));
&Sharpen[i], -1000, 1000, tr("blur max"), tr("sharpen max")));
}
//
// audio
@ -528,7 +538,7 @@ cMenuSetupSoft::cMenuSetupSoft(void)
Add(SeparatorItem(tr("Auto-crop")));
AutoCropInterval = ConfigAutoCropInterval;
Add(new cMenuEditIntItem(tr("autocrop interval (frames)"),
&AutoCropInterval, 0, 200));
&AutoCropInterval, 0, 200, tr("off")));
AutoCropDelay = ConfigAutoCropDelay;
Add(new cMenuEditIntItem(tr("autocrop delay (n * interval)"),
&AutoCropDelay, 0, 200));
@ -558,6 +568,9 @@ void cMenuSetupSoft::Store(void)
SetupStore("HideMainMenuEntry", ConfigHideMainMenuEntry =
HideMainMenuEntry);
ConfigVideoBackground = Background << 8 | (BackgroundAlpha & 0xFF);
SetupStore("Background", ConfigVideoBackground);
VideoSetBackground(ConfigVideoBackground);
SetupStore("SkipLines", ConfigVideoSkipLines = SkipLines);
VideoSetSkipLines(ConfigVideoSkipLines);
SetupStore("StudioLevels", ConfigVideoStudioLevels = StudioLevels);
@ -1080,8 +1093,8 @@ bool cSoftHdDevice::Flush(int timeout_ms)
** Sets the video display format to the given one (only useful if this
** device has an MPEG decoder).
*/
void cSoftHdDevice::
SetVideoDisplayFormat(eVideoDisplayFormat video_display_format)
void cSoftHdDevice:: SetVideoDisplayFormat(eVideoDisplayFormat
video_display_format)
{
static int last = -1;
@ -1487,6 +1500,10 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value)
ConfigHideMainMenuEntry = atoi(value);
return true;
}
if (!strcasecmp(name, "Background")) {
VideoSetBackground(ConfigVideoBackground = strtoul(value, NULL, 0));
return true;
}
if (!strcasecmp(name, "SkipLines")) {
VideoSetSkipLines(ConfigVideoSkipLines = atoi(value));
return true;

93
video.c
View File

@ -234,6 +234,7 @@ typedef struct _video_module_
void (*const RenderFrame) (VideoHwDecoder *, const AVCodecContext *,
const AVFrame *);
uint8_t *(*const GrabOutput)(int *, int *, int *);
void (*const SetBackground) (uint32_t);
void (*const SetVideoMode) (void);
void (*const ResetAutoCrop) (void);
@ -293,6 +294,7 @@ static char VideoSurfaceModesChanged; ///< flag surface modes changed
/// flag use transparent OSD.
static const char VideoTransparentOsd = 1;
static uint32_t VideoBackground; ///< video background color
static int VideoSkipLines; ///< skip video lines top/bottom
static char VideoStudioLevels; ///< flag use studio levels
@ -2069,6 +2071,17 @@ static int VaapiInit(const char *display_name)
attr.value ? _("direct mapped") : _("copied"));
// FIXME: handle the cases: new liba: Don't use it.
attr.type = VADisplayAttribBackgroundColor;
attr.flags = VA_DISPLAY_ATTRIB_SETTABLE;
if (vaGetDisplayAttributes(VaDisplay, &attr, 1) != VA_STATUS_SUCCESS) {
Error(_("video/vaapi: Can't get background-color attribute\n"));
attr.value = 1;
}
Info(_("video/vaapi: background-color is %s\n"),
attr.value ? _("supported") : _("unsupported"));
// FIXME: VaapiSetBackground(VideoBackground);
#if 0
//
// check the chroma format
@ -4490,6 +4503,16 @@ static int64_t VaapiGetClock(const VaapiDecoder * decoder)
2);
}
///
/// Set VA-API background color.
///
/// @param rgba 32 bit RGBA color.
///
static void VaapiSetBackground( __attribute__ ((unused)) uint32_t rgba)
{
Error(_("video/vaapi: FIXME: SetBackground not supported\n"));
}
///
/// Set VA-API video mode.
///
@ -4787,6 +4810,7 @@ static const VideoModule VaapiModule = {
.RenderFrame = (void (*const) (VideoHwDecoder *,
const AVCodecContext *, const AVFrame *))VaapiSyncRenderFrame,
.GrabOutput = NULL,
.SetBackground = VaapiSetBackground,
.SetVideoMode = VaapiSetVideoMode,
.ResetAutoCrop = VaapiResetAutoCrop,
.Thread = VaapiDisplayHandlerThread,
@ -4886,8 +4910,9 @@ static VdpGetProcAddress *VdpauGetProcAddress; ///< entry point to use
/// presentation queue target
static VdpPresentationQueueTarget VdpauQueueTarget;
static VdpPresentationQueue VdpauQueue; ///< presentation queue
static VdpColor VdpauBackgroundColor[1]; ///< queue background color
static VdpColor VdpauQueueBackgroundColor[1]; ///< queue background color
static int VdpauBackground; ///< background supported
static int VdpauHqScalingMax; ///< highest supported scaling level
static int VdpauTemporal; ///< temporal deinterlacer supported
static int VdpauTemporalSpatial; ///< temporal spatial deint. supported
@ -5157,9 +5182,10 @@ static void VdpauMixerSetup(VdpauDecoder * decoder)
VdpVideoMixerFeature features[15];
VdpBool enables[15];
int feature_n;
VdpVideoMixerAttribute attributes[4];
void const *attribute_value_ptrs[4];
VdpVideoMixerAttribute attributes[5];
void const *attribute_value_ptrs[5];
int attribute_n;
VdpColor background_color[1];
uint8_t skip_chroma_value;
float noise_reduction_level;
float sharpness_level;
@ -5235,7 +5261,20 @@ static void VdpauMixerSetup(VdpauDecoder * decoder)
VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA
VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA
*/
attribute_n = 0;
// none video-area background color
if (VdpauBackground) {
background_color->red = (VideoBackground >> 24) / 255.0;
background_color->green = ((VideoBackground >> 16) & 0xFF) / 255.0;
background_color->blue = ((VideoBackground >> 8) & 0xFF) / 255.0;
background_color->alpha = (VideoBackground & 0xFF) / 255.0;
attributes[attribute_n] = VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR;
attribute_value_ptrs[attribute_n++] = background_color;
Debug(3, "video/vdpau: background color %f/%f/%f/%f\n",
background_color->red, background_color->green,
background_color->blue, background_color->alpha);
}
if (VdpauSkipChroma) {
skip_chroma_value = VideoSkipChromaDeinterlace[decoder->Resolution];
attributes[attribute_n]
@ -5606,11 +5645,12 @@ static void VdpauInitOutputQueue(void)
return;
}
VdpauBackgroundColor->red = 0.01;
VdpauBackgroundColor->green = 0.02;
VdpauBackgroundColor->blue = 0.03;
VdpauBackgroundColor->alpha = 1.00;
VdpauPresentationQueueSetBackgroundColor(VdpauQueue, VdpauBackgroundColor);
VdpauQueueBackgroundColor->red = 0.01;
VdpauQueueBackgroundColor->green = 0.02;
VdpauQueueBackgroundColor->blue = 0.03;
VdpauQueueBackgroundColor->alpha = 1.00;
VdpauPresentationQueueSetBackgroundColor(VdpauQueue,
VdpauQueueBackgroundColor);
//
// Create display output surfaces
@ -5906,6 +5946,16 @@ static int VdpauInit(const char *display_name)
//
// Cache some features
//
status =
VdpauVideoMixerQueryFeatureSupport(VdpauDevice,
VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR, &flag);
if (status != VDP_STATUS_OK) {
Error(_("video/vdpau: can't query feature '%s': %s\n"),
"background-color", VdpauGetErrorString(status));
} else {
VdpauBackground = flag;
}
status =
VdpauVideoMixerQueryFeatureSupport(VdpauDevice,
VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, &flag);
@ -5966,8 +6016,6 @@ static int VdpauInit(const char *display_name)
VdpauSkipChroma = flag;
}
// VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR
if (VdpauHqScalingMax) {
Info(_("video/vdpau: highest supported high quality scaling %d\n"),
VdpauHqScalingMax -
@ -7562,7 +7610,16 @@ static int VdpauPreemptionRecover(void)
}
///
/// Set VA-API video mode.
/// Set VDPAU background color.
///
/// @param rgba 32 bit RGBA color.
///
static void VdpauSetBackground( __attribute__ ((unused)) uint32_t rgba)
{
}
///
/// Set VDPAU video mode.
///
static void VdpauSetVideoMode(void)
{
@ -7902,6 +7959,7 @@ static const VideoModule VdpauModule = {
.RenderFrame = (void (*const) (VideoHwDecoder *,
const AVCodecContext *, const AVFrame *))VdpauSyncRenderFrame,
.GrabOutput = VdpauGrabOutputSurface,
.SetBackground = VdpauSetBackground,
.SetVideoMode = VdpauSetVideoMode,
.ResetAutoCrop = VdpauResetAutoCrop,
.Thread = VdpauDisplayHandlerThread,
@ -9202,6 +9260,19 @@ void VideoSetStudioLevels(int onoff)
VideoStudioLevels = onoff;
}
///
/// Set background color.
///
/// @param rgba 32 bit RGBA color.
///
void VideoSetBackground(uint32_t rgba)
{
VideoBackground = rgba; // save for later start
if (VideoUsedModule) {
VideoUsedModule->SetBackground(rgba);
}
}
///
/// Set audio delay.
///

View File

@ -119,6 +119,9 @@ extern void VideoSetSkipLines(int);
/// Set studio levels.
extern void VideoSetStudioLevels(int);
/// Set background.
extern void VideoSetBackground(uint32_t);
/// Set audio delay.
extern void VideoSetAudioDelay(int);