Makes 4:3 and 16:9 display format configurable.

Don't use DVB display format.
This commit is contained in:
Johns 2013-01-01 14:48:51 +01:00
parent 87c1c7be84
commit acf377ec60
4 changed files with 137 additions and 62 deletions

View File

@ -1,3 +1,9 @@
User johns
Date:
Makes 4:3 and 16:9 display format configurable.
Don't use DVB display format.
User Zoolook
Date: Tue Jan 1 12:49:19 CET 2013

View File

@ -80,6 +80,8 @@ static char ConfigHideMainMenuEntry; ///< config hide main menu entry
static char ConfigSuspendClose; ///< suspend should close devices
static char ConfigSuspendX11; ///< suspend should stop x11
static char Config4to3DisplayFormat = 1; ///< config 4:3 display format
static char ConfigOtherDisplayFormat = 1; ///< config other display format
static uint32_t ConfigVideoBackground; ///< config video background color
static int ConfigOsdWidth; ///< config OSD width
static int ConfigOsdHeight; ///< config OSD height
@ -563,8 +565,8 @@ class cMenuSetupSoft:public cMenuSetupPage
int SuspendX11;
int Video;
int VideoFormat;
int VideoDisplayFormat;
int Video4to3DisplayFormat;
int VideoOtherDisplayFormat;
uint32_t Background;
uint32_t BackgroundAlpha;
int StudioLevels;
@ -656,14 +658,12 @@ void cMenuSetupSoft::Create(void)
static const char *const osd_size[] = {
"auto", "1920x1080", "1280x720", "custom",
};
#if 0
static const char *const video_display_formats_4_3[] = {
"pan&scan", "letterbox", "center cut-out",
};
static const char *const video_display_formats_16_9[] = {
"pan&scan", "pillarbox", "center cut-out",
};
#endif
static const char *const deinterlace[] = {
"Bob", "Weave/None", "Temporal", "TemporalSpatial", "Software Bob",
"Software Spatial",
@ -724,17 +724,10 @@ void cMenuSetupSoft::Create(void)
//
Add(CollapsedItem(tr("Video"), Video));
if (Video) {
#if 0 // disabled, not working as expected
Add(new cMenuEditBoolItem(trVDR("Setup.DVB$Video format"),
&VideoFormat, "4:3", "16:9"));
if (VideoFormat) {
Add(new cMenuEditStraItem(trVDR("Setup.DVB$Video display format"),
&VideoDisplayFormat, 3, video_display_formats_16_9));
} else {
Add(new cMenuEditStraItem(trVDR("Setup.DVB$Video display format"),
&VideoDisplayFormat, 3, video_display_formats_4_3));
}
#endif
Add(new cMenuEditStraItem(trVDR("4:3 video display format"),
&Video4to3DisplayFormat, 3, video_display_formats_4_3));
Add(new cMenuEditStraItem(trVDR("16:9 + other video display format"),
&VideoOtherDisplayFormat, 3, video_display_formats_16_9));
// FIXME: switch config gray/color configuration
Add(new cMenuEditIntItem(tr("Video background color (RGB)"),
@ -845,7 +838,6 @@ eOSState cMenuSetupSoft::ProcessKey(eKeys key)
int old_video;
int old_audio;
int old_osd_size;
int old_video_format;
int old_resolution_shown[RESOLUTIONS];
int i;
@ -853,7 +845,6 @@ eOSState cMenuSetupSoft::ProcessKey(eKeys key)
old_video = Video;
old_audio = Audio;
old_osd_size = OsdSize;
old_video_format = VideoFormat;
memcpy(old_resolution_shown, ResolutionShown, sizeof(ResolutionShown));
state = cMenuSetupPage::ProcessKey(key);
@ -861,7 +852,7 @@ eOSState cMenuSetupSoft::ProcessKey(eKeys key)
// update menu only, if something on the structure has changed
// this is needed because VDR menus are evil slow
if (old_general != General || old_video != Video || old_audio != Audio
|| old_osd_size != OsdSize || old_video_format != VideoFormat) {
|| old_osd_size != OsdSize) {
Create(); // update menu
} else {
for (i = 0; i < RESOLUTIONS; ++i) {
@ -915,8 +906,8 @@ cMenuSetupSoft::cMenuSetupSoft(void)
// video
//
Video = 0;
VideoFormat = Setup.VideoFormat;
VideoDisplayFormat = Setup.VideoDisplayFormat;
Video4to3DisplayFormat = Config4to3DisplayFormat;
VideoOtherDisplayFormat = ConfigOtherDisplayFormat;
// no unsigned int menu item supported, split background color/alpha
Background = ConfigVideoBackground >> 8;
BackgroundAlpha = ConfigVideoBackground & 0xFF;
@ -1003,19 +994,13 @@ void cMenuSetupSoft::Store(void)
SetupStore("Suspend.Close", ConfigSuspendClose = SuspendClose);
SetupStore("Suspend.X11", ConfigSuspendX11 = SuspendX11);
// FIXME: this is also in VDR-DVB setup
if (Setup.VideoFormat != VideoFormat) {
Setup.VideoFormat = VideoFormat;
cDevice::PrimaryDevice()->SetVideoFormat(Setup.VideoFormat);
}
//SetupStore("VideoFormat", Setup.VideoFormat);
if (Setup.VideoDisplayFormat != VideoDisplayFormat) {
Setup.VideoDisplayFormat = VideoDisplayFormat;
cDevice::PrimaryDevice()->
SetVideoDisplayFormat(eVideoDisplayFormat(Setup.
VideoDisplayFormat));
}
//SetupStore("VideoDisplayFormat", Setup.VideoDisplayFormat);
SetupStore("Video4to3DisplayFormat", Config4to3DisplayFormat =
Video4to3DisplayFormat);
VideoSet4to3DisplayFormat(Config4to3DisplayFormat);
SetupStore("VideoOtherDisplayFormat", ConfigOtherDisplayFormat =
VideoOtherDisplayFormat);
VideoSetOtherDisplayFormat(ConfigOtherDisplayFormat);
ConfigVideoBackground = Background << 8 | (BackgroundAlpha & 0xFF);
SetupStore("Background", ConfigVideoBackground);
@ -1335,13 +1320,21 @@ static void HandleHotkey(int code)
tr("auto-crop disabled and freezed"));
}
break;
case 30: // change 4:3 -> 16:9 mode
case 30: // change 4:3 -> window mode
case 31:
case 32:
VideoSetDisplayFormat(code - 30);
VideoSet4to3DisplayFormat(code - 30);
break;
case 39: // rortate 4:3 -> 16:9 mode
VideoSetDisplayFormat(-1);
case 39: // rotate 4:3 -> window mode
VideoSet4to3DisplayFormat(-1);
break;
case 40: // change 16:9 -> window mode
case 41:
case 42:
VideoSetOtherDisplayFormat(code - 40);
break;
case 49: // rotate 16:9 -> window mode
VideoSetOtherDisplayFormat(-1);
break;
default:
esyslog(tr("[softhddev]: hot key %d is not supported\n"), code);
@ -1717,11 +1710,11 @@ bool cSoftHdDevice::Flush(int timeout_ms)
void cSoftHdDevice::
SetVideoDisplayFormat(eVideoDisplayFormat video_display_format)
{
static int last = -1;
dsyslog("[softhddev]%s: %d\n", __FUNCTION__, video_display_format);
cDevice::SetVideoDisplayFormat(video_display_format);
#if 0
static int last = -1;
// called on every channel switch, no need to kill osd...
if (last != video_display_format) {
@ -1730,6 +1723,7 @@ SetVideoDisplayFormat(eVideoDisplayFormat video_display_format)
::VideoSetDisplayFormat(video_display_format);
cSoftOsd::Dirty = 1;
}
#endif
}
/**
@ -1916,9 +1910,8 @@ cRect cSoftHdDevice::CanScaleVideo(const cRect & rect,
void cSoftHdDevice::ScaleVideo(const cRect & rect)
{
#ifdef OSD_DEBUG
dsyslog("[softhddev]%s: %dx%d%+d%+d\n", __FUNCTION__,
VidWinRect.Width(), VidWinRect.Height(), VidWinRect.X(),
VidWinRect.Y());
dsyslog("[softhddev]%s: %dx%d%+d%+d\n", __FUNCTION__, VidWinRect.Width(),
VidWinRect.Height(), VidWinRect.X(), VidWinRect.Y());
#endif
VideoSetOutputPosition(rect.X(), rect.Y(), rect.Width(), rect.Height());
}
@ -2194,6 +2187,16 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value)
return true;
}
if (!strcasecmp(name, "Video4to3DisplayFormat")) {
Config4to3DisplayFormat = atoi(value);
VideoSet4to3DisplayFormat(Config4to3DisplayFormat);
return true;
}
if (!strcasecmp(name, "VideoOtherDisplayFormat")) {
ConfigOtherDisplayFormat = atoi(value);
VideoSetOtherDisplayFormat(ConfigOtherDisplayFormat);
return true;
}
if (!strcasecmp(name, "Background")) {
VideoSetBackground(ConfigVideoBackground = strtoul(value, NULL, 0));
return true;
@ -2455,9 +2458,13 @@ static const char *SVDRPHelpText[] = {
" 22: toggle fullscreen\n"
" 23: disable auto-crop\n\040 24: enable auto-crop\n"
" 25: toggle auto-crop\n"
" 30: stretch 4:3 to 16:9\n\040 31: pillar box 4:3 in 16:9\n"
" 32: center cut-out 4:3 to 16:9\n"
" 39: rotate 4:3 to 16:9 zoom mode\n",
" 30: stretch 4:3 to display\n\040 31: pillar box 4:3 in display\n"
" 32: center cut-out 4:3 to display\n"
" 39: rotate 4:3 to display zoom mode\n"
" 40: stretch other aspect ratios to display\n"
" 41: letter box other aspect ratios in display\n"
" 42: center cut-out other aspect ratios to display\n"
" 49: rotate other aspect ratios to display zoom mode\n",
"STAT\n" "\040 Display SuspendMode of the plugin.\n\n"
" reply code is 910 + SuspendMode\n"
" SUSPEND_EXTERNAL == -1 (909)\n"

87
video.c
View File

@ -1,7 +1,7 @@
///
/// @file video.c @brief Video module
///
/// Copyright (c) 2009 - 2012 by Johns. All Rights Reserved.
/// Copyright (c) 2009 - 2013 by Johns. All Rights Reserved.
///
/// Contributor(s):
///
@ -345,9 +345,12 @@ static VideoScalingModes VideoScaling[VideoResolutionMax];
/// Default audio/video delay
int VideoAudioDelay;
/// Default zoom mode
/// Default zoom mode for 4:3
static VideoZoomModes Video4to3ZoomMode;
/// Default zoom mode for 16:9 and others
static VideoZoomModes VideoOtherZoomMode;
static char Video60HzMode; ///< handle 60hz displays
static char VideoSoftStartSync; ///< soft start sync audio/video
static const int VideoSoftStartFrames = 100; ///< soft start frames
@ -494,11 +497,9 @@ static void VideoUpdateOutput(AVRational input_aspect_ratio, int input_width,
// FIXME: store different positions for the ratios
tmp_ratio.num = 4;
tmp_ratio.den = 3;
/*
fprintf(stderr, "ratio: %d:%d %d:%d\n", input_aspect_ratio.num,
input_aspect_ratio.den, display_aspect_ratio.num,
display_aspect_ratio.den);
*/
fprintf(stderr, "ratio: %d:%d %d:%d\n", input_aspect_ratio.num,
input_aspect_ratio.den, display_aspect_ratio.num,
display_aspect_ratio.den);
if (!av_cmp_q(input_aspect_ratio, tmp_ratio)) {
switch (Video4to3ZoomMode) {
case VideoNormal:
@ -512,7 +513,17 @@ static void VideoUpdateOutput(AVRational input_aspect_ratio, int input_width,
goto stretch;
}
}
// FIXME: this overwrites user choosen output position
switch (VideoOtherZoomMode) {
case VideoNormal:
goto normal;
case VideoStretch:
goto stretch;
case VideoCenterCutOut:
goto center_cut_out;
case VideoAnamorphic:
// FIXME: rest should be done by hardware
goto stretch;
}
normal:
*output_x = video_x;
@ -537,6 +548,8 @@ static void VideoUpdateOutput(AVRational input_aspect_ratio, int input_width,
*output_y = video_y;
*output_width = video_width;
*output_height = video_height;
Debug(3, "video: stretch output %dx%d%+d%+d\n", *output_width,
*output_height, *output_x, *output_y);
return;
center_cut_out:
@ -10309,34 +10322,80 @@ void VideoSetVideoMode( __attribute__ ((unused))
}
///
/// Set video display format.
/// Set 4:3 video display format.
///
/// @param format video format (stretch, normal, center cut-out)
///
void VideoSetDisplayFormat(int format)
void VideoSet4to3DisplayFormat(int format)
{
// convert api to internal format
switch (format) {
case -1: // rotate settings
format = (Video4to3ZoomMode + 1) % (VideoCenterCutOut + 1);
break;
case 0: // pan&scan (we have no pan&scan)
format = VideoStretch;
break;
case 1: // letter box
format = VideoNormal;
break;
case 2: // center cut-out
format = VideoCenterCutOut;
break;
}
if ((unsigned)format == Video4to3ZoomMode) {
return; // no change, no need to lock
}
VideoOsdExit();
// FIXME: must tell VDR that the OsdSize has been changed!
VideoThreadLock();
Video4to3ZoomMode = format;
// FIXME: need only VideoUsedModule->UpdateOutput();
VideoUsedModule->SetVideoMode();
VideoThreadUnlock();
VideoOsdInit();
}
///
/// Set other video display format.
///
/// @param format video format (stretch, normal, center cut-out)
///
void VideoSetOtherDisplayFormat(int format)
{
// convert api to internal format
switch (format) {
case -1: // rotate settings
Video4to3ZoomMode = (Video4to3ZoomMode + 1) % VideoCenterCutOut;
format = (VideoOtherZoomMode + 1) % (VideoCenterCutOut + 1);
break;
case 0: // pan&scan (we have no pan&scan)
Video4to3ZoomMode = VideoStretch;
format = VideoStretch;
break;
case 1: // letter box
Video4to3ZoomMode = VideoNormal;
format = VideoNormal;
break;
case 2: // center cut-out
Video4to3ZoomMode = VideoCenterCutOut;
format = VideoCenterCutOut;
break;
}
if ((unsigned)format == VideoOtherZoomMode) {
return; // no change, no need to lock
}
VideoOsdExit();
// FIXME: must tell VDR that the OsdSize has been changed!
VideoThreadLock();
VideoOtherZoomMode = format;
// FIXME: need only VideoUsedModule->UpdateOutput();
VideoUsedModule->SetVideoMode();
VideoThreadUnlock();
VideoOsdInit();
}

View File

@ -1,7 +1,7 @@
///
/// @file video.h @brief Video module header file
///
/// Copyright (c) 2009 - 2012 by Johns. All Rights Reserved.
/// Copyright (c) 2009 - 2013 by Johns. All Rights Reserved.
///
/// Contributor(s):
///
@ -115,8 +115,11 @@ extern void VideoSetOutputPosition(int, int, int, int);
/// Set video mode.
extern void VideoSetVideoMode(int, int, int, int);
/// Set display format.
extern void VideoSetDisplayFormat(int);
/// Set 4:3 display format.
extern void VideoSet4to3DisplayFormat(int);
/// Set other display format.
extern void VideoSetOtherDisplayFormat(int);
/// Set video fullscreen mode.
extern void VideoSetFullscreen(int);