summaryrefslogtreecommitdiff
path: root/softhddevice.cpp
diff options
context:
space:
mode:
authorJohns <johns98@gmx.net>2012-04-15 22:59:52 +0200
committerJohns <johns98@gmx.net>2012-04-15 22:59:52 +0200
commit80db7c66564dbbbb567110790553b0f844193518 (patch)
treec4add864c7ef52260f93a27030033e54680e4355 /softhddevice.cpp
parent3ba18d87201a8ca14a72586a2e692f8d5a9a68b6 (diff)
downloadvdr-plugin-softhddevice-80db7c66564dbbbb567110790553b0f844193518.tar.gz
vdr-plugin-softhddevice-80db7c66564dbbbb567110790553b0f844193518.tar.bz2
Setup split into foldable sections.
Diffstat (limited to 'softhddevice.cpp')
-rw-r--r--softhddevice.cpp376
1 files changed, 266 insertions, 110 deletions
diff --git a/softhddevice.cpp b/softhddevice.cpp
index 793410a..ac022c6 100644
--- a/softhddevice.cpp
+++ b/softhddevice.cpp
@@ -75,6 +75,8 @@ static const char *const Resolution[RESOLUTIONS] = {
static char ConfigMakePrimary; ///< config primary wanted
static char ConfigHideMainMenuEntry; ///< config hide main menu entry
+static char ConfigSuspendClose; ///< suspend should close devices
+static char ConfigSuspendX11; ///< suspend should stop x11
static uint32_t ConfigVideoBackground; ///< config video background color
static char ConfigVideoStudioLevels; ///< config use studio levels
@@ -105,17 +107,20 @@ static int ConfigVideoCutTopBottom[RESOLUTIONS];
/// config cut left and right pixels
static int ConfigVideoCutLeftRight[RESOLUTIONS];
-static int ConfigVideoAudioDelay; ///< config audio delay
-static int ConfigAudioPassthrough; ///< config audio pass-through
-static int ConfigAudioDownmix; ///< config audio downmix
-
static int ConfigAutoCropEnabled; ///< auto crop detection enabled
static int ConfigAutoCropInterval; ///< auto crop detection interval
static int ConfigAutoCropDelay; ///< auto crop detection delay
static int ConfigAutoCropTolerance; ///< auto crop detection tolerance
-static char ConfigSuspendClose; ///< suspend should close devices
-static char ConfigSuspendX11; ///< suspend should stop x11
+static int ConfigVideoAudioDelay; ///< config audio delay
+static int ConfigAudioPassthrough; ///< config audio pass-through
+static int ConfigAudioDownmix; ///< config ffmpeg audio downmix
+static char ConfigAudioSoftvol; ///< config use software volume
+static char ConfigAudioNormalize; ///< config use normalize volume
+static int ConfigAudioMaxNormalize; ///< config max normalize factor
+static char ConfigAudioCompression; ///< config use volume compression
+static int ConfigAudioMaxCompression; ///< config max volume compression
+static int ConfigAudioStereoDescent; ///< config reduce stereo loudness
static volatile int DoMakePrimary; ///< switch primary device to this
@@ -470,13 +475,20 @@ class cMenuSetupSoft:public cMenuSetupPage
///
/// local copies of global setup variables:
/// @{
+ int General;
int MakePrimary;
int HideMainMenuEntry;
+ int SuspendClose;
+ int SuspendX11;
+
+ int Video;
uint32_t Background;
uint32_t BackgroundAlpha;
int StudioLevels;
int _60HzMode;
int SoftStartSync;
+
+ int ResolutionShown[RESOLUTIONS];
int Scaling[RESOLUTIONS];
int Deinterlace[RESOLUTIONS];
int SkipChromaDeinterlace[RESOLUTIONS];
@@ -485,19 +497,30 @@ class cMenuSetupSoft:public cMenuSetupPage
int Sharpen[RESOLUTIONS];
int CutTopBottom[RESOLUTIONS];
int CutLeftRight[RESOLUTIONS];
- int AudioDelay;
- int AudioPassthrough;
- int AudioDownmix;
+
int AutoCropInterval;
int AutoCropDelay;
int AutoCropTolerance;
- int SuspendClose;
- int SuspendX11;
+
+ int Audio;
+ int AudioDelay;
+ int AudioPassthrough;
+ int AudioDownmix;
+ int AudioSoftvol;
+ int AudioNormalize;
+ int AudioMaxNormalize;
+ int AudioCompression;
+ int AudioMaxCompression;
+ int AudioStereoDescent;
/// @}
+ private:
+ inline cOsdItem * CollapsedItem(const char *, int &, const char * = NULL);
+ void Create(void); // create sub-menu
protected:
virtual void Store(void);
public:
cMenuSetupSoft(void);
+ virtual eOSState ProcessKey(eKeys); // handle input
};
/**
@@ -516,9 +539,28 @@ static inline cOsdItem *SeparatorItem(const char *label)
}
/**
-** Constructor setup menu.
+** Create a collapsed item.
+**
+** @param label text inside collapsed
+** @param flag flag handling collapsed or opened
+** @param msg open message
*/
-cMenuSetupSoft::cMenuSetupSoft(void)
+inline cOsdItem *cMenuSetupSoft::CollapsedItem(const char *label, int &flag,
+ const char *msg)
+{
+ cOsdItem *item;
+
+ item =
+ new cMenuEditBoolItem(hk(cString::sprintf("* %s", label)), &flag,
+ msg ? msg : tr("show"), tr("hide"));
+
+ return item;
+}
+
+/**
+** Create setup menu.
+*/
+void cMenuSetupSoft::Create(void)
{
static const char *const deinterlace[] = {
"Bob", "Weave/None", "Temporal", "TemporalSpatial", "Software Bob",
@@ -533,101 +575,206 @@ cMenuSetupSoft::cMenuSetupSoft(void)
static const char *const resolution[RESOLUTIONS] = {
"576i", "720p", "fake 1080i", "1080i"
};
+ int current;
+ int i;
+
+ current = Current(); // get current menu item index
+ Clear(); // clear the menu
+
+ // FIXME: support this:
+ SetHasHotkeys();
+
+ //
+ // general
+ //
+ Add(CollapsedItem(tr("General"), General));
+
+ if (General) {
+ Add(new cMenuEditBoolItem(tr("Make primary device"), &MakePrimary,
+ trVDR("no"), trVDR("yes")));
+ Add(new cMenuEditBoolItem(tr("Hide main menu entry"),
+ &HideMainMenuEntry, trVDR("no"), trVDR("yes")));
+ //
+ // suspend
+ //
+ Add(SeparatorItem(tr("Suspend")));
+ Add(new cMenuEditBoolItem(tr("suspend closes video+audio"),
+ &SuspendClose, trVDR("no"), trVDR("yes")));
+ Add(new cMenuEditBoolItem(tr("suspend stops x11"), &SuspendX11,
+ trVDR("no"), trVDR("yes")));
+ }
+ //
+ // video
+ //
+ Add(CollapsedItem(tr("Video"), Video));
+
+ if (Video) {
+ Add(new cMenuEditIntItem(tr("video background color (RGB)"),
+ (int *)&Background, 0, 0x00FFFFFF));
+ Add(new cMenuEditIntItem(tr("video background color (Alpha)"),
+ (int *)&BackgroundAlpha, 0, 0xFF));
+ Add(new cMenuEditBoolItem(tr("Use studio levels (vdpau only)"),
+ &StudioLevels, trVDR("no"), trVDR("yes")));
+ Add(new cMenuEditBoolItem(tr("60hz display mode"), &_60HzMode,
+ trVDR("no"), trVDR("yes")));
+ Add(new cMenuEditBoolItem(tr("soft start a/v sync"), &SoftStartSync,
+ trVDR("no"), trVDR("yes")));
+
+ for (i = 0; i < RESOLUTIONS; ++i) {
+ Add(CollapsedItem(resolution[i], ResolutionShown[i]));
+
+ if (ResolutionShown[i]) {
+ Add(new cMenuEditStraItem(tr("Scaling"), &Scaling[i], 4,
+ scaling));
+ Add(new cMenuEditStraItem(tr("Deinterlace"), &Deinterlace[i],
+ 6, deinterlace));
+ Add(new cMenuEditBoolItem(tr("SkipChromaDeinterlace (vdpau)"),
+ &SkipChromaDeinterlace[i], trVDR("no"), trVDR("yes")));
+ Add(new cMenuEditBoolItem(tr("Inverse Telecine (vdpau)"),
+ &InverseTelecine[i], trVDR("no"), trVDR("yes")));
+ Add(new cMenuEditIntItem(tr("Denoise (0..1000) (vdpau)"),
+ &Denoise[i], 0, 1000, tr("off"), tr("max")));
+ Add(new cMenuEditIntItem(tr("Sharpen (-1000..1000) (vdpau)"),
+ &Sharpen[i], -1000, 1000, tr("blur max"),
+ tr("sharpen max")));
+
+ Add(new cMenuEditIntItem(tr("Cut top and bottom (pixel)"),
+ &CutTopBottom[i], 0, 250));
+ Add(new cMenuEditIntItem(tr("Cut left and right (pixel)"),
+ &CutLeftRight[i], 0, 250));
+ }
+ }
+ //
+ // auto-crop
+ //
+ Add(SeparatorItem(tr("Auto-crop")));
+ Add(new cMenuEditIntItem(tr("autocrop interval (frames)"),
+ &AutoCropInterval, 0, 200, tr("off")));
+ Add(new cMenuEditIntItem(tr("autocrop delay (n * interval)"),
+ &AutoCropDelay, 0, 200));
+ Add(new cMenuEditIntItem(tr("autocrop tolerance (pixel)"),
+ &AutoCropTolerance, 0, 32));
+ }
+ //
+ // audio
+ //
+ Add(CollapsedItem(tr("Audio"), Audio));
+
+ if (Audio) {
+ Add(new cMenuEditIntItem(tr("Audio/Video delay (ms)"), &AudioDelay,
+ -1000, 1000));
+ Add(new cMenuEditStraItem(tr("Audio pass-through"), &AudioPassthrough,
+ 2, passthrough));
+ Add(new cMenuEditBoolItem(tr("Enable AC-3 downmix"), &AudioDownmix,
+ trVDR("no"), trVDR("yes")));
+ }
+
+ SetCurrent(Get(current)); // restore selected menu entry
+ Display(); // display build menu
+}
+
+/**
+** Process key for setup menu.
+*/
+eOSState cMenuSetupSoft::ProcessKey(eKeys key)
+{
+ eOSState state;
+ int old_general;
+ int old_video;
+ int old_audio;
+ int old_resolution_shown[RESOLUTIONS];
int i;
- // cMenuEditBoolItem cMenuEditBitItem cMenuEditNumItem
- // cMenuEditStrItem cMenuEditStraItem cMenuEditIntItem
+ old_general = General;
+ old_video = Video;
+ old_audio = Audio;
+ memcpy(old_resolution_shown, ResolutionShown, sizeof(ResolutionShown));
+ state = cMenuSetupPage::ProcessKey(key);
+
+ if (key != kNone) {
+ // update menu only, if something on the structure has changed
+ // this needed because VDR menus are evil slow
+ if (old_general != General || old_video != Video || old_audio != Audio) {
+ Create(); // update menu
+ } else {
+ for (i = 0; i < RESOLUTIONS; ++i) {
+ if (old_resolution_shown[i] != ResolutionShown[i]) {
+ Create(); // update menu
+ break;
+ }
+ }
+ }
+ }
+
+ return state;
+}
+
+/**
+** Constructor setup menu.
+**
+** Import global config variables into setup.
+*/
+cMenuSetupSoft::cMenuSetupSoft(void)
+{
+ int i;
+
+ //
+ // general
+ //
+ General = 0;
MakePrimary = ConfigMakePrimary;
- Add(new cMenuEditBoolItem(tr("Make primary device"), &MakePrimary,
- trVDR("no"), trVDR("yes")));
HideMainMenuEntry = ConfigHideMainMenuEntry;
- Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &HideMainMenuEntry,
- trVDR("no"), trVDR("yes")));
//
- // video
+ // suspend
//
- Add(SeparatorItem(tr("Video")));
+ SuspendClose = ConfigSuspendClose;
+ SuspendX11 = ConfigSuspendX11;
+ //
+ // video
+ //
+ Video = 0;
// 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));
StudioLevels = ConfigVideoStudioLevels;
- Add(new cMenuEditBoolItem(tr("Use studio levels (vdpau only)"),
- &StudioLevels, trVDR("no"), trVDR("yes")));
_60HzMode = ConfigVideo60HzMode;
- Add(new cMenuEditBoolItem(tr("60hz display mode"), &_60HzMode, trVDR("no"),
- trVDR("yes")));
SoftStartSync = ConfigVideoSoftStartSync;
- Add(new cMenuEditBoolItem(tr("soft start a/v sync"), &SoftStartSync,
- trVDR("no"), trVDR("yes")));
for (i = 0; i < RESOLUTIONS; ++i) {
- Add(SeparatorItem(resolution[i]));
+ ResolutionShown[i] = 0;
Scaling[i] = ConfigVideoScaling[i];
- Add(new cMenuEditStraItem(tr("Scaling"), &Scaling[i], 4, scaling));
Deinterlace[i] = ConfigVideoDeinterlace[i];
- Add(new cMenuEditStraItem(tr("Deinterlace"), &Deinterlace[i], 6,
- deinterlace));
SkipChromaDeinterlace[i] = ConfigVideoSkipChromaDeinterlace[i];
- Add(new cMenuEditBoolItem(tr("SkipChromaDeinterlace (vdpau)"),
- &SkipChromaDeinterlace[i], trVDR("no"), trVDR("yes")));
InverseTelecine[i] = ConfigVideoInverseTelecine[i];
- Add(new cMenuEditBoolItem(tr("Inverse Telecine (vdpau)"),
- &InverseTelecine[i], trVDR("no"), trVDR("yes")));
Denoise[i] = ConfigVideoDenoise[i];
- Add(new cMenuEditIntItem(tr("Denoise (0..1000) (vdpau)"), &Denoise[i],
- 0, 1000, tr("off"), tr("max")));
Sharpen[i] = ConfigVideoSharpen[i];
- Add(new cMenuEditIntItem(tr("Sharpen (-1000..1000) (vdpau)"),
- &Sharpen[i], -1000, 1000, tr("blur max"), tr("sharpen max")));
CutTopBottom[i] = ConfigVideoCutTopBottom[i];
- Add(new cMenuEditIntItem(tr("Cut top and bottom (pixel)"),
- &CutTopBottom[i], 0, 250));
CutLeftRight[i] = ConfigVideoCutLeftRight[i];
- Add(new cMenuEditIntItem(tr("Cut left and right (pixel)"),
- &CutLeftRight[i], 0, 250));
}
//
- // audio
- //
- Add(SeparatorItem(tr("Audio")));
- AudioDelay = ConfigVideoAudioDelay;
- Add(new cMenuEditIntItem(tr("Audio delay (ms)"), &AudioDelay, -1000,
- 1000));
- AudioPassthrough = ConfigAudioPassthrough;
- Add(new cMenuEditStraItem(tr("Audio pass-through"), &AudioPassthrough, 2,
- passthrough));
- AudioDownmix = ConfigAudioDownmix;
- Add(new cMenuEditBoolItem(tr("Enable AC-3 downmix"), &AudioDownmix,
- trVDR("no"), trVDR("yes")));
- //
// auto-crop
//
- Add(SeparatorItem(tr("Auto-crop")));
AutoCropInterval = ConfigAutoCropInterval;
- Add(new cMenuEditIntItem(tr("autocrop interval (frames)"),
- &AutoCropInterval, 0, 200, tr("off")));
AutoCropDelay = ConfigAutoCropDelay;
- Add(new cMenuEditIntItem(tr("autocrop delay (n * interval)"),
- &AutoCropDelay, 0, 200));
AutoCropTolerance = ConfigAutoCropTolerance;
- Add(new cMenuEditIntItem(tr("autocrop tolerance (pixel)"),
- &AutoCropTolerance, 0, 32));
+
//
- // suspend
+ // audio
//
- Add(SeparatorItem(tr("Suspend")));
- SuspendClose = ConfigSuspendClose;
- Add(new cMenuEditBoolItem(tr("suspend closes video+audio"), &SuspendClose,
- trVDR("no"), trVDR("yes")));
- SuspendX11 = ConfigSuspendX11;
- Add(new cMenuEditBoolItem(tr("suspend stops x11"), &SuspendX11,
- trVDR("no"), trVDR("yes")));
+ Audio = 0;
+ AudioDelay = ConfigVideoAudioDelay;
+ AudioPassthrough = ConfigAudioPassthrough;
+ AudioDownmix = ConfigAudioDownmix;
+ AudioSoftvol = ConfigAudioSoftvol;
+ AudioNormalize = ConfigAudioNormalize;
+ AudioMaxNormalize = ConfigAudioMaxNormalize;
+ AudioCompression = ConfigAudioCompression;
+ AudioMaxCompression = ConfigAudioMaxCompression;
+ AudioStereoDescent = ConfigAudioStereoDescent;
+
+ Create();
}
/**
@@ -640,6 +787,8 @@ void cMenuSetupSoft::Store(void)
SetupStore("MakePrimary", ConfigMakePrimary = MakePrimary);
SetupStore("HideMainMenuEntry", ConfigHideMainMenuEntry =
HideMainMenuEntry);
+ SetupStore("Suspend.Close", ConfigSuspendClose = SuspendClose);
+ SetupStore("Suspend.X11", ConfigSuspendX11 = SuspendX11);
ConfigVideoBackground = Background << 8 | (BackgroundAlpha & 0xFF);
SetupStore("Background", ConfigVideoBackground);
@@ -683,13 +832,6 @@ void cMenuSetupSoft::Store(void)
VideoSetCutTopBottom(ConfigVideoCutTopBottom);
VideoSetCutLeftRight(ConfigVideoCutLeftRight);
- SetupStore("AudioDelay", ConfigVideoAudioDelay = AudioDelay);
- VideoSetAudioDelay(ConfigVideoAudioDelay);
- SetupStore("AudioPassthrough", ConfigAudioPassthrough = AudioPassthrough);
- CodecSetAudioPassthrough(ConfigAudioPassthrough);
- SetupStore("AudioDownmix", ConfigAudioDownmix = AudioDownmix);
- CodecSetAudioDownmix(ConfigAudioDownmix);
-
SetupStore("AutoCrop.Interval", ConfigAutoCropInterval = AutoCropInterval);
SetupStore("AutoCrop.Delay", ConfigAutoCropDelay = AutoCropDelay);
SetupStore("AutoCrop.Tolerance", ConfigAutoCropTolerance =
@@ -698,8 +840,13 @@ void cMenuSetupSoft::Store(void)
ConfigAutoCropTolerance);
ConfigAutoCropEnabled = ConfigAutoCropInterval;
- SetupStore("Suspend.Close", ConfigSuspendClose = SuspendClose);
- SetupStore("Suspend.X11", ConfigSuspendX11 = SuspendX11);
+ SetupStore("AudioDelay", ConfigVideoAudioDelay = AudioDelay);
+ VideoSetAudioDelay(ConfigVideoAudioDelay);
+ SetupStore("AudioPassthrough", ConfigAudioPassthrough = AudioPassthrough);
+ CodecSetAudioPassthrough(ConfigAudioPassthrough);
+ SetupStore("AudioDownmix", ConfigAudioDownmix = AudioDownmix);
+ CodecSetAudioDownmix(ConfigAudioDownmix);
+ // FIXME: new audio
}
//////////////////////////////////////////////////////////////////////////////
@@ -879,25 +1026,32 @@ static void HandleHotkey(int code)
break;
case 23: // disable auto-crop
ConfigAutoCropEnabled = 0;
- VideoSetAutoCrop(0, ConfigAutoCropDelay,
- ConfigAutoCropTolerance);
+ VideoSetAutoCrop(0, ConfigAutoCropDelay, ConfigAutoCropTolerance);
+ Skins.QueueMessage(mtInfo, tr("auto-crop disabled and freezed"));
break;
case 24: // enable auto-crop
ConfigAutoCropEnabled = 1;
- if ( !ConfigAutoCropInterval ) {
+ if (!ConfigAutoCropInterval) {
ConfigAutoCropInterval = 50;
}
VideoSetAutoCrop(ConfigAutoCropInterval, ConfigAutoCropDelay,
ConfigAutoCropTolerance);
+ Skins.QueueMessage(mtInfo, tr("auto-crop enabled"));
break;
case 25: // toggle auto-crop
ConfigAutoCropEnabled ^= 1;
// no interval configured, use some default
- if ( !ConfigAutoCropInterval ) {
+ if (!ConfigAutoCropInterval) {
ConfigAutoCropInterval = 50;
}
VideoSetAutoCrop(ConfigAutoCropEnabled * ConfigAutoCropInterval,
ConfigAutoCropDelay, ConfigAutoCropTolerance);
+ if (ConfigAutoCropEnabled) {
+ Skins.QueueMessage(mtInfo, tr("auto-crop enabled"));
+ } else {
+ Skins.QueueMessage(mtInfo,
+ tr("auto-crop disabled and freezed"));
+ }
break;
case 30: // change 4:3 -> 16:9 mode
case 31:
@@ -1679,6 +1833,15 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value)
ConfigHideMainMenuEntry = atoi(value);
return true;
}
+ if (!strcasecmp(name, "Suspend.Close")) {
+ ConfigSuspendClose = atoi(value);
+ return true;
+ }
+ if (!strcasecmp(name, "Suspend.X11")) {
+ ConfigSuspendX11 = atoi(value);
+ return true;
+ }
+
if (!strcasecmp(name, "Background")) {
VideoSetBackground(ConfigVideoBackground = strtoul(value, NULL, 0));
return true;
@@ -1750,19 +1913,6 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value)
}
}
- if (!strcasecmp(name, "AudioDelay")) {
- VideoSetAudioDelay(ConfigVideoAudioDelay = atoi(value));
- return true;
- }
- if (!strcasecmp(name, "AudioPassthrough")) {
- CodecSetAudioPassthrough(ConfigAudioPassthrough = atoi(value));
- return true;
- }
- if (!strcasecmp(name, "AudioDownmix")) {
- CodecSetAudioDownmix(ConfigAudioDownmix = atoi(value));
- return true;
- }
-
if (!strcasecmp(name, "AutoCrop.Interval")) {
VideoSetAutoCrop(ConfigAutoCropInterval =
atoi(value), ConfigAutoCropDelay, ConfigAutoCropTolerance);
@@ -1780,14 +1930,20 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value)
return true;
}
- if (!strcasecmp(name, "Suspend.Close")) {
- ConfigSuspendClose = atoi(value);
+ if (!strcasecmp(name, "AudioDelay")) {
+ VideoSetAudioDelay(ConfigVideoAudioDelay = atoi(value));
return true;
}
- if (!strcasecmp(name, "Suspend.X11")) {
- ConfigSuspendX11 = atoi(value);
+ if (!strcasecmp(name, "AudioPassthrough")) {
+ CodecSetAudioPassthrough(ConfigAudioPassthrough = atoi(value));
return true;
}
+ if (!strcasecmp(name, "AudioDownmix")) {
+ CodecSetAudioDownmix(ConfigAudioDownmix = atoi(value));
+ return true;
+ }
+ // FIXME: new audio
+
return false;
}
@@ -1842,11 +1998,11 @@ static const char *SVDRPHelpText[] = {
" 12: toggle audio pass-through\n"
" 13: decrease audio delay by 10ms\n"
" 14: increase audio delay by 10ms\n"
- " 20: disable fullscreen\n 21: enable fullscreen\n"
- " 22: toggle fullscreen\n",
- " 23: disable auto-crop\n 24: enable auto-crop\n"
- " 25: toggle auto-crop\n",
- " 30: stretch 4:3 to 16:9\n 31: letter box 4:3 in 16:9\n"
+ " 20: disable fullscreen\n 21: enable fullscreen\n"
+ " 22: toggle fullscreen\n"
+ " 23: disable auto-crop\n 24: enable auto-crop\n"
+ " 25: toggle auto-crop\n"
+ " 30: stretch 4:3 to 16:9\n 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",
NULL