Qt: Clean up video recording for GB
@@ -16,7 +16,6 @@ struct NoIntroDB;
extern "C" { #include "core/log.h" -#include "gba/sio.h" } mLOG_DECLARE_CATEGORY(QT);
@@ -12,6 +12,12 @@ #include "LogController.h"
#include <QMap> +#ifdef M_CORE_GB +extern "C" { +#include "gb/video.h" +} +#endif + using namespace QGBA; QMap<QString, QString> VideoView::s_acodecMap;@@ -34,10 +40,10 @@ }
if (other.vbr && vbr && other.vbr != vbr) { return false; } - if (other.width && width && other.width != width) { + if (other.dims.width() && dims.width() && other.dims.width() != dims.width()) { return false; } - if (other.height && height && other.height != height) { + if (other.dims.height() && dims.height() && other.dims.height() != dims.height()) { return false; } return true;@@ -48,6 +54,10 @@ : QWidget(parent)
, m_audioCodecCstr(nullptr) , m_videoCodecCstr(nullptr) , m_containerCstr(nullptr) + , m_nativeWidth(0) + , m_nativeHeight(0) + , m_width(1) + , m_height(1) { m_ui.setupUi(this);@@ -96,67 +106,80 @@ connect(m_ui.showAdvanced, SIGNAL(clicked(bool)), this, SLOT(showAdvanced(bool)));
FFmpegEncoderInit(&m_encoder); - addPreset(m_ui.preset1080, (Preset) { - .container = QString(), - .vcodec = QString(), - .acodec = QString(), + updatePresets(); + + setPreset({ + .container = "MKV", + .vcodec = "PNG", + .acodec = "FLAC", .vbr = 0, .abr = 0, - .width = 1620, - .height = 1080 + .dims = QSize(), }); + showAdvanced(false); +} - addPreset(m_ui.preset720, (Preset) { +void VideoView::updatePresets() { + m_presets.clear(); + + addPreset(m_ui.preset1080, { .container = QString(), .vcodec = QString(), .acodec = QString(), .vbr = 0, .abr = 0, - .width = 1080, - .height = 720 + .dims = maintainAspect(QSize(1920, 1080)) }); - addPreset(m_ui.preset480, (Preset) { + addPreset(m_ui.preset720, { .container = QString(), .vcodec = QString(), .acodec = QString(), .vbr = 0, .abr = 0, - .width = 720, - .height = 480 + .dims = maintainAspect(QSize(1280, 720)) }); - addPreset(m_ui.preset160, (Preset) { + addPreset(m_ui.preset480, { .container = QString(), .vcodec = QString(), .acodec = QString(), .vbr = 0, .abr = 0, - .width = VIDEO_HORIZONTAL_PIXELS, - .height = VIDEO_VERTICAL_PIXELS + .dims = maintainAspect(QSize(720, 480)) }); - addPreset(m_ui.presetHQ, (Preset) { + if (m_nativeWidth && m_nativeHeight) { + addPreset(m_ui.presetNative, { + .container = QString(), + .vcodec = QString(), + .acodec = QString(), + .vbr = 0, + .abr = 0, + .dims = QSize(m_nativeWidth, m_nativeHeight) + }); + m_ui.presetNative->setEnabled(true); + } + + addPreset(m_ui.presetHQ, { .container = "MP4", .vcodec = "h.264", .acodec = "AAC", .vbr = 8000, .abr = 384, - .width = 1620, - .height = 1080 + .dims = maintainAspect(QSize(1920, 1080)) }); - addPreset(m_ui.presetYoutube, (Preset) { + addPreset(m_ui.presetYoutube, { .container = "MP4", .vcodec = "h.264", .acodec = "AAC", .vbr = 5000, .abr = 256, - .width = 1080, - .height = 720 + .dims = maintainAspect(QSize(1280, 720)) }); - addPreset(m_ui.presetWebM, (Preset) { + addPreset(m_ui.presetWebM, { .container = "WebM", .vcodec = "VP8", .acodec = "Vorbis",@@ -164,27 +187,16 @@ .vbr = 800,
.abr = 128 }); - addPreset(m_ui.presetLossless, (Preset) { - .container = "MKV", - .vcodec = "PNG", - .acodec = "FLAC", - .vbr = 0, - .abr = 0, - .width = VIDEO_HORIZONTAL_PIXELS, - .height = VIDEO_VERTICAL_PIXELS, - }); - - setPreset((Preset) { - .container = "MKV", - .vcodec = "PNG", - .acodec = "FLAC", - .vbr = 0, - .abr = 0, - .width = VIDEO_HORIZONTAL_PIXELS, - .height = VIDEO_VERTICAL_PIXELS, - }); - - showAdvanced(false); + if (m_nativeWidth && m_nativeHeight) { + addPreset(m_ui.presetLossless, { + .container = "MKV", + .vcodec = "PNG", + .acodec = "FLAC", + .vbr = 0, + .abr = 0, + .dims = QSize(m_nativeWidth, m_nativeHeight) + }); + } } VideoView::~VideoView() {@@ -214,6 +226,23 @@ m_ui.stop->setEnabled(false);
validateSettings(); } +void VideoView::setNativeResolution(const QSize& dims) { + m_nativeWidth = dims.width(); + m_nativeHeight = dims.height(); + m_ui.presetNative->setText(tr("Native (%0x%1)").arg(m_nativeWidth).arg(m_nativeHeight)); + QSize newSize = maintainAspect(QSize(m_width, m_height)); + m_width = newSize.width(); + m_height = newSize.height(); + updateAspectRatio(m_nativeWidth, m_nativeHeight, false); + updatePresets(); + for (auto iterator = m_presets.constBegin(); iterator != m_presets.constEnd(); ++iterator) { + if (iterator.key()->isChecked()) { + setPreset(*iterator); + break; + } + } +} + void VideoView::selectFile() { QString filename = GBAApp::app()->getSaveFileName(this, tr("Select output file")); if (!filename.isEmpty()) {@@ -295,7 +324,7 @@ }
void VideoView::setWidth(int width, bool manual) { m_width = width; - updateAspectRatio(width, 0); + updateAspectRatio(width, 0, false); FFmpegEncoderSetDimensions(&m_encoder, m_width, m_height); if (manual) { uncheckIncompatible();@@ -304,7 +333,7 @@ }
void VideoView::setHeight(int height, bool manual) { m_height = height; - updateAspectRatio(0, height); + updateAspectRatio(0, height, false); FFmpegEncoderSetDimensions(&m_encoder, m_width, m_height); if (manual) { uncheckIncompatible();@@ -401,8 +430,7 @@ .vcodec = m_videoCodec,
.acodec = m_audioCodec, .vbr = m_vbr / 1000, .abr = m_abr / 1000, - .width = m_width, - .height = m_height + .dims = QSize(m_width, m_height) }; m_ui.presets->setExclusive(false);@@ -419,8 +447,8 @@ }
m_ui.presets->setExclusive(true); m_ui.resolutions->setExclusive(true); - if (current.compatible(m_presets[m_ui.preset160])) { - safelyCheck(m_ui.preset160); + if (current.compatible(m_presets[m_ui.presetNative])) { + safelyCheck(m_ui.presetNative); } if (current.compatible(m_presets[m_ui.preset480])) { safelyCheck(m_ui.preset480);@@ -465,6 +493,7 @@ }
void VideoView::addPreset(QAbstractButton* button, const Preset& preset) { m_presets[button] = preset; + button->disconnect(); connect(button, &QAbstractButton::pressed, [this, preset]() { setPreset(preset); });@@ -491,17 +520,27 @@ if (preset.vbr) {
setVideoBitrate(preset.vbr, false); safelySet(m_ui.vbr, preset.vbr); } - if (preset.width) { - setWidth(preset.width, false); - safelySet(m_ui.width, preset.width); + if (preset.dims.width() > 0) { + setWidth(preset.dims.width(), false); + safelySet(m_ui.width, preset.dims.width()); } - if (preset.height) { - setHeight(preset.height, false); - safelySet(m_ui.height, preset.height); + if (preset.dims.height() > 0) { + setHeight(preset.dims.height(), false); + safelySet(m_ui.height, preset.dims.height()); } uncheckIncompatible(); validateSettings(); +} + +QSize VideoView::maintainAspect(const QSize& size) { + QSize ds = size; + if (ds.width() * m_nativeHeight > ds.height() * m_nativeWidth) { + ds.setWidth(ds.height() * m_nativeWidth / m_nativeHeight); + } else if (ds.width() * m_nativeHeight < ds.height() * m_nativeWidth) { + ds.setHeight(ds.width() * m_nativeHeight / m_nativeWidth); + } + return ds; } #endif
@@ -22,18 +22,6 @@ class VideoView : public QWidget {
Q_OBJECT public: - struct Preset { - QString container; - QString vcodec; - QString acodec; - int vbr; - int abr; - int width; - int height; - - bool compatible(const Preset&) const; - }; - VideoView(QWidget* parent = nullptr); virtual ~VideoView();@@ -42,6 +30,7 @@
public slots: void startRecording(); void stopRecording(); + void setNativeResolution(const QSize&); signals: void recordingStarted(mAVStream*);@@ -65,8 +54,20 @@
void showAdvanced(bool); void uncheckIncompatible(); + void updatePresets(); private: + struct Preset { + QString container; + QString vcodec; + QString acodec; + int vbr; + int abr; + QSize dims; + + bool compatible(const Preset&) const; + }; + bool validateSettings(); void updateAspectRatio(int width, int height, bool force = false); static QString sanitizeCodec(const QString&, const QMap<QString, QString>& mapping);@@ -76,6 +77,8 @@ static void safelySet(QComboBox*, const QString& value);
void addPreset(QAbstractButton*, const Preset&); void setPreset(const Preset&); + + QSize maintainAspect(const QSize&); Ui::VideoView m_ui;@@ -94,6 +97,9 @@ int m_vbr;
int m_width; int m_height; + + int m_nativeWidth; + int m_nativeHeight; QMap<QAbstractButton*, Preset> m_presets;
@@ -181,9 +181,12 @@ </attribute>
</widget> </item> <item> - <widget class="QRadioButton" name="preset160"> + <widget class="QRadioButton" name="presetNative"> + <property name="enabled"> + <bool>false</bool> + </property> <property name="text"> - <string>GBA (240x160)</string> + <string>Native</string> </property> <property name="checked"> <bool>true</bool>@@ -417,7 +420,7 @@ </item>
<item row="0" column="3"> <widget class="QSpinBox" name="height"> <property name="minimum"> - <number>160</number> + <number>1</number> </property> <property name="maximum"> <number>3160</number>@@ -427,7 +430,7 @@ </item>
<item row="0" column="1"> <widget class="QSpinBox" name="width"> <property name="minimum"> - <number>240</number> + <number>1</number> </property> <property name="maximum"> <number>3840</number>@@ -442,9 +445,6 @@ </property>
<property name="maximum"> <number>9999</number> </property> - <property name="value"> - <number>2</number> - </property> </widget> </item> <item row="1" column="1">@@ -454,9 +454,6 @@ <number>1</number>
</property> <property name="maximum"> <number>9999</number> - </property> - <property name="value"> - <number>3</number> </property> </widget> </item>@@ -505,7 +502,7 @@ <tabstop>presetLossless</tabstop>
<tabstop>preset1080</tabstop> <tabstop>preset720</tabstop> <tabstop>preset480</tabstop> - <tabstop>preset160</tabstop> + <tabstop>presetNative</tabstop> <tabstop>container</tabstop> <tabstop>video</tabstop> <tabstop>audio</tabstop>
@@ -492,6 +492,12 @@ connect(m_videoView, SIGNAL(recordingStarted(mAVStream*)), m_controller, SLOT(setAVStream(mAVStream*)));
connect(m_videoView, SIGNAL(recordingStopped()), m_controller, SLOT(clearAVStream()), Qt::DirectConnection); connect(m_controller, SIGNAL(gameStopped(mCoreThread*)), m_videoView, SLOT(stopRecording())); connect(m_controller, SIGNAL(gameStopped(mCoreThread*)), m_videoView, SLOT(close())); + connect(m_controller, &GameController::gameStarted, [this]() { + m_videoView->setNativeResolution(m_controller->screenDimensions()); + }); + if (m_controller->isLoaded()) { + m_videoView->setNativeResolution(m_controller->screenDimensions()); + } connect(this, SIGNAL(shutdown()), m_videoView, SLOT(close())); } m_videoView->show();@@ -1253,6 +1259,7 @@ #ifdef USE_FFMPEG
QAction* recordOutput = new QAction(tr("Record output..."), avMenu); connect(recordOutput, SIGNAL(triggered()), this, SLOT(openVideoWindow())); addControlledAction(avMenu, recordOutput, "recordOutput"); + m_gameActions.append(recordOutput); #endif #ifdef USE_MAGICK
@@ -2304,12 +2304,17 @@ </context>
<context> <name>QGBA::VideoView</name> <message> - <location filename="../VideoView.cpp" line="202"/> + <location filename="../VideoView.cpp" line="214"/> <source>Failed to open output video file: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.cpp" line="218"/> + <location filename="../VideoView.cpp" line="232"/> + <source>Native (%0x%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.cpp" line="247"/> <source>Select output file</source> <translation type="unfinished"></translation> </message>@@ -2317,690 +2322,690 @@ </context>
<context> <name>QGBA::Window</name> <message> - <location filename="../Window.cpp" line="303"/> + <location filename="../Window.cpp" line="302"/> <source>Game Boy Advance ROMs (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="319"/> + <location filename="../Window.cpp" line="318"/> <source>Game Boy ROMs (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="323"/> + <location filename="../Window.cpp" line="322"/> <source>All ROMs (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="338"/> + <location filename="../Window.cpp" line="337"/> <source>Archives (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="343"/> - <location filename="../Window.cpp" line="350"/> - <location filename="../Window.cpp" line="367"/> + <location filename="../Window.cpp" line="342"/> + <location filename="../Window.cpp" line="349"/> + <location filename="../Window.cpp" line="366"/> <source>Select ROM</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="375"/> + <location filename="../Window.cpp" line="374"/> <source>Game Boy Advance save files (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="376"/> - <location filename="../Window.cpp" line="425"/> - <location filename="../Window.cpp" line="432"/> + <location filename="../Window.cpp" line="375"/> + <location filename="../Window.cpp" line="420"/> + <location filename="../Window.cpp" line="427"/> <source>Select save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="400"/> + <location filename="../Window.cpp" line="395"/> <source>Select BIOS</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="412"/> + <location filename="../Window.cpp" line="407"/> <source>Select patch</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="412"/> + <location filename="../Window.cpp" line="407"/> <source>Patches (*.ips *.ups *.bps)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="425"/> - <location filename="../Window.cpp" line="432"/> + <location filename="../Window.cpp" line="420"/> + <location filename="../Window.cpp" line="427"/> <source>GameShark saves (*.sps *.xps)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="741"/> + <location filename="../Window.cpp" line="742"/> <source>Crash</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="742"/> + <location filename="../Window.cpp" line="743"/> <source>The game has crashed with the following error: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="749"/> + <location filename="../Window.cpp" line="750"/> <source>Couldn't Load</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="750"/> + <location filename="../Window.cpp" line="751"/> <source>Could not load game. Are you sure it's in the correct format?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="763"/> + <location filename="../Window.cpp" line="764"/> <source>Unimplemented BIOS call</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="764"/> + <location filename="../Window.cpp" line="765"/> <source>This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="771"/> + <location filename="../Window.cpp" line="772"/> <source>Really make portable?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="772"/> + <location filename="../Window.cpp" line="773"/> <source>This will make the emulator load its configuration from the same directory as the executable. Do you want to continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="780"/> + <location filename="../Window.cpp" line="781"/> <source>Restart needed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="781"/> + <location filename="../Window.cpp" line="782"/> <source>Some changes will not take effect until the emulator is restarted.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="845"/> + <location filename="../Window.cpp" line="846"/> <source> - Player %1 of %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="849"/> + <location filename="../Window.cpp" line="857"/> <source>%1 - %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="851"/> + <location filename="../Window.cpp" line="859"/> <source>%1 - %2 - %3</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="853"/> + <location filename="../Window.cpp" line="861"/> <source>%1 - %2 (%3 fps) - %4</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="885"/> + <location filename="../Window.cpp" line="893"/> <source>&File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="888"/> + <location filename="../Window.cpp" line="896"/> <source>Load &ROM...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="890"/> + <location filename="../Window.cpp" line="898"/> <source>Load ROM in archive...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="893"/> + <location filename="../Window.cpp" line="901"/> <source>Load &BIOS...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="895"/> + <location filename="../Window.cpp" line="903"/> <source>Load temporary save...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="900"/> + <location filename="../Window.cpp" line="908"/> <source>Load &patch...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="901"/> + <location filename="../Window.cpp" line="909"/> <source>Boot BIOS</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="903"/> + <location filename="../Window.cpp" line="911"/> <source>Replace ROM...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="905"/> + <location filename="../Window.cpp" line="913"/> <source>ROM &info...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="910"/> + <location filename="../Window.cpp" line="918"/> <source>Recent</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="914"/> + <location filename="../Window.cpp" line="922"/> <source>Make portable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="918"/> + <location filename="../Window.cpp" line="926"/> <source>&Load state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="919"/> + <location filename="../Window.cpp" line="927"/> <source>F10</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="925"/> + <location filename="../Window.cpp" line="933"/> <source>&Save state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="926"/> + <location filename="../Window.cpp" line="934"/> <source>Shift+F10</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="932"/> + <location filename="../Window.cpp" line="940"/> <source>Quick load</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="933"/> + <location filename="../Window.cpp" line="941"/> <source>Quick save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="937"/> + <location filename="../Window.cpp" line="945"/> <source>Load recent</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="943"/> + <location filename="../Window.cpp" line="951"/> <source>Save recent</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="952"/> + <location filename="../Window.cpp" line="960"/> <source>Undo load state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="953"/> + <location filename="../Window.cpp" line="961"/> <source>F11</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="959"/> + <location filename="../Window.cpp" line="967"/> <source>Undo save state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="960"/> + <location filename="../Window.cpp" line="968"/> <source>Shift+F11</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="971"/> - <location filename="../Window.cpp" line="978"/> + <location filename="../Window.cpp" line="979"/> + <location filename="../Window.cpp" line="986"/> <source>State &%1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="972"/> + <location filename="../Window.cpp" line="980"/> <source>F%1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="979"/> + <location filename="../Window.cpp" line="987"/> <source>Shift+F%1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="988"/> + <location filename="../Window.cpp" line="996"/> <source>Import GameShark Save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="994"/> + <location filename="../Window.cpp" line="1002"/> <source>Export GameShark Save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1002"/> + <location filename="../Window.cpp" line="1010"/> <source>New multiplayer window</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1012"/> + <location filename="../Window.cpp" line="1020"/> <source>About</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1017"/> + <location filename="../Window.cpp" line="1025"/> <source>E&xit</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1020"/> + <location filename="../Window.cpp" line="1028"/> <source>&Emulation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1022"/> + <location filename="../Window.cpp" line="1030"/> <source>&Reset</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1023"/> + <location filename="../Window.cpp" line="1031"/> <source>Ctrl+R</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1028"/> + <location filename="../Window.cpp" line="1036"/> <source>Sh&utdown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1034"/> + <location filename="../Window.cpp" line="1042"/> <source>Yank game pak</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1042"/> + <location filename="../Window.cpp" line="1050"/> <source>&Pause</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1045"/> + <location filename="../Window.cpp" line="1053"/> <source>Ctrl+P</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1054"/> + <location filename="../Window.cpp" line="1062"/> <source>&Next frame</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1055"/> + <location filename="../Window.cpp" line="1063"/> <source>Ctrl+N</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1067"/> + <location filename="../Window.cpp" line="1074"/> <source>Fast forward (held)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1069"/> + <location filename="../Window.cpp" line="1076"/> <source>&Fast forward</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1072"/> + <location filename="../Window.cpp" line="1079"/> <source>Shift+Tab</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1076"/> + <location filename="../Window.cpp" line="1083"/> <source>Fast forward speed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1081"/> + <location filename="../Window.cpp" line="1088"/> <source>Unbounded</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1085"/> + <location filename="../Window.cpp" line="1092"/> <source>%0x</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1093"/> + <location filename="../Window.cpp" line="1100"/> <source>Rewind (held)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1095"/> + <location filename="../Window.cpp" line="1102"/> <source>Re&wind</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1096"/> + <location filename="../Window.cpp" line="1103"/> <source>`</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1102"/> + <location filename="../Window.cpp" line="1109"/> <source>Step backwards</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1103"/> + <location filename="../Window.cpp" line="1110"/> <source>Ctrl+B</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1112"/> + <location filename="../Window.cpp" line="1119"/> <source>Sync to &video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1119"/> + <location filename="../Window.cpp" line="1126"/> <source>Sync to &audio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1127"/> + <location filename="../Window.cpp" line="1134"/> <source>Solar sensor</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1129"/> + <location filename="../Window.cpp" line="1136"/> <source>Increase solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1133"/> + <location filename="../Window.cpp" line="1140"/> <source>Decrease solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1137"/> + <location filename="../Window.cpp" line="1144"/> <source>Brightest solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1141"/> + <location filename="../Window.cpp" line="1148"/> <source>Darkest solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1147"/> + <location filename="../Window.cpp" line="1154"/> <source>Brightness %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1154"/> + <location filename="../Window.cpp" line="1161"/> <source>Audio/&Video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1156"/> + <location filename="../Window.cpp" line="1163"/> <source>Frame size</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1159"/> + <location filename="../Window.cpp" line="1166"/> <source>%1x</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1182"/> + <location filename="../Window.cpp" line="1189"/> <source>Toggle fullscreen</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1185"/> + <location filename="../Window.cpp" line="1192"/> <source>Lock aspect ratio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1192"/> + <location filename="../Window.cpp" line="1199"/> <source>Resample video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1198"/> + <location filename="../Window.cpp" line="1205"/> <source>Frame&skip</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1208"/> + <location filename="../Window.cpp" line="1215"/> <source>Shader options...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1218"/> + <location filename="../Window.cpp" line="1225"/> <source>Mute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1224"/> + <location filename="../Window.cpp" line="1231"/> <source>FPS target</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1229"/> + <location filename="../Window.cpp" line="1236"/> <source>15</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1230"/> + <location filename="../Window.cpp" line="1237"/> <source>30</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1231"/> + <location filename="../Window.cpp" line="1238"/> <source>45</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1232"/> + <location filename="../Window.cpp" line="1239"/> <source>Native (59.7)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1233"/> + <location filename="../Window.cpp" line="1240"/> <source>60</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1234"/> + <location filename="../Window.cpp" line="1241"/> <source>90</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1235"/> + <location filename="../Window.cpp" line="1242"/> <source>120</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1236"/> + <location filename="../Window.cpp" line="1243"/> <source>240</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1244"/> + <location filename="../Window.cpp" line="1251"/> <source>Take &screenshot</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1245"/> + <location filename="../Window.cpp" line="1252"/> <source>F12</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1252"/> + <location filename="../Window.cpp" line="1259"/> <source>Record output...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1258"/> + <location filename="../Window.cpp" line="1266"/> <source>Record GIF...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1264"/> + <location filename="../Window.cpp" line="1272"/> <source>Video layers</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1268"/> + <location filename="../Window.cpp" line="1276"/> <source>Background %0</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1275"/> + <location filename="../Window.cpp" line="1283"/> <source>OBJ (sprites)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1281"/> + <location filename="../Window.cpp" line="1289"/> <source>Audio channels</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1285"/> + <location filename="../Window.cpp" line="1293"/> <source>Channel %0</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1292"/> + <location filename="../Window.cpp" line="1300"/> <source>Channel A</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1298"/> + <location filename="../Window.cpp" line="1306"/> <source>Channel B</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1304"/> + <location filename="../Window.cpp" line="1312"/> <source>&Tools</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1306"/> + <location filename="../Window.cpp" line="1314"/> <source>View &logs...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1311"/> + <location filename="../Window.cpp" line="1319"/> <source>Game &overrides...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1317"/> + <location filename="../Window.cpp" line="1325"/> <source>Game &Pak sensors...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1321"/> + <location filename="../Window.cpp" line="1329"/> <source>&Cheats...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1327"/> + <location filename="../Window.cpp" line="1335"/> <source>Start &GDB server...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1334"/> + <location filename="../Window.cpp" line="1342"/> <source>Settings...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1339"/> + <location filename="../Window.cpp" line="1347"/> <source>View &palette...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1345"/> + <location filename="../Window.cpp" line="1353"/> <source>View &tiles...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1352"/> + <location filename="../Window.cpp" line="1360"/> <source>View memory...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1358"/> + <location filename="../Window.cpp" line="1366"/> <source>View &I/O registers...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1415"/> + <location filename="../Window.cpp" line="1423"/> <source>Exit fullscreen</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1420"/> + <location filename="../Window.cpp" line="1428"/> <source>Autofire</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1427"/> + <location filename="../Window.cpp" line="1435"/> <source>Autofire A</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1433"/> + <location filename="../Window.cpp" line="1441"/> <source>Autofire B</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1439"/> + <location filename="../Window.cpp" line="1447"/> <source>Autofire L</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1445"/> + <location filename="../Window.cpp" line="1453"/> <source>Autofire R</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1451"/> + <location filename="../Window.cpp" line="1459"/> <source>Autofire Start</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1457"/> + <location filename="../Window.cpp" line="1465"/> <source>Autofire Select</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1463"/> + <location filename="../Window.cpp" line="1471"/> <source>Autofire Up</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1469"/> + <location filename="../Window.cpp" line="1477"/> <source>Autofire Right</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1475"/> + <location filename="../Window.cpp" line="1483"/> <source>Autofire Down</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1481"/> + <location filename="../Window.cpp" line="1489"/> <source>Autofire Left</source> <translation type="unfinished"></translation> </message>@@ -3597,7 +3602,7 @@ <translation type="unfinished"></translation>
</message> <message> <location filename="../VideoView.ui" line="129"/> - <location filename="../VideoView.ui" line="234"/> + <location filename="../VideoView.ui" line="237"/> <source>WebM</source> <translation type="unfinished"></translation> </message>@@ -3622,122 +3627,122 @@ <source>480p</source>
<translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="186"/> - <source>GBA (240x160)</source> + <location filename="../VideoView.ui" line="189"/> + <source>Native</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="219"/> + <location filename="../VideoView.ui" line="222"/> <source>Format</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="229"/> + <location filename="../VideoView.ui" line="232"/> <source>MKV</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="239"/> + <location filename="../VideoView.ui" line="242"/> <source>AVI</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="244"/> + <location filename="../VideoView.ui" line="247"/> <source>MP4</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="256"/> + <location filename="../VideoView.ui" line="259"/> <source>PNG</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="261"/> + <location filename="../VideoView.ui" line="264"/> <source>h.264</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="266"/> + <location filename="../VideoView.ui" line="269"/> <source>VP8</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="271"/> + <location filename="../VideoView.ui" line="274"/> <source>Xvid</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="276"/> + <location filename="../VideoView.ui" line="279"/> <source>FFV1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="288"/> + <location filename="../VideoView.ui" line="291"/> <source>FLAC</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="293"/> + <location filename="../VideoView.ui" line="296"/> <source>Opus</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="298"/> + <location filename="../VideoView.ui" line="301"/> <source>Vorbis</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="303"/> + <location filename="../VideoView.ui" line="306"/> <source>MP3</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="308"/> + <location filename="../VideoView.ui" line="311"/> <source>AAC</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="313"/> + <location filename="../VideoView.ui" line="316"/> <source>Uncompressed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="324"/> + <location filename="../VideoView.ui" line="327"/> <source> Bitrate (kbps)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="330"/> + <location filename="../VideoView.ui" line="333"/> <source>VBR </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="378"/> + <location filename="../VideoView.ui" line="381"/> <source>ABR</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="394"/> + <location filename="../VideoView.ui" line="397"/> <source>Dimensions</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="400"/> + <location filename="../VideoView.ui" line="403"/> <source>:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="410"/> + <location filename="../VideoView.ui" line="413"/> <source>×</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="466"/> + <location filename="../VideoView.ui" line="463"/> <source>Lock aspect ratio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.ui" line="481"/> + <location filename="../VideoView.ui" line="478"/> <source>Show advanced</source> <translation type="unfinished"></translation> </message>