Skip to content
This repository has been archived by the owner on Feb 12, 2023. It is now read-only.

Commit

Permalink
fix(avform): Added restoring selected region
Browse files Browse the repository at this point in the history
  • Loading branch information
Diadlo committed Jun 25, 2016
1 parent 1ddc137 commit 1c51582
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 14 deletions.
30 changes: 28 additions & 2 deletions src/persistence/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,8 @@ void Settings::loadGlobal()
s.beginGroup("Video");
videoDev = s.value("videoDev", "").toString();
camVideoRes = s.value("camVideoRes", QRect()).toRect();
screenRegion = s.value("screenRegion", QRect()).toRect();
screenGrabbed = s.value("screenGrabbed", false).toBool();
camVideoFPS = s.value("camVideoFPS", 0).toUInt();
s.endGroup();

Expand Down Expand Up @@ -472,8 +474,10 @@ void Settings::saveGlobal()

s.beginGroup("Video");
s.setValue("videoDev", videoDev);
s.setValue("camVideoRes",camVideoRes);
s.setValue("camVideoFPS",camVideoFPS);
s.setValue("camVideoRes", camVideoRes);
s.setValue("camVideoFPS", camVideoFPS);
s.setValue("screenRegion", screenRegion);
s.setValue("screenGrabbed", screenGrabbed);
s.endGroup();
}

Expand Down Expand Up @@ -1412,6 +1416,28 @@ void Settings::setOutVolume(int volume)
outVolume = volume;
}

QRect Settings::getScreenRegion() const
{
return screenRegion;
}

void Settings::setScreenRegion(const QRect &value)
{
QMutexLocker locker{&bigLock};
screenRegion = value;
}

bool Settings::getScreenGrabbed() const
{
return screenGrabbed;
}

void Settings::setScreenGrabbed(bool value)
{
QMutexLocker locker{&bigLock};
screenGrabbed = value;
}

QRect Settings::getCamVideoRes() const
{
QMutexLocker locker{&bigLock};
Expand Down
8 changes: 8 additions & 0 deletions src/persistence/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,12 @@ public slots:
QString getVideoDev() const;
void setVideoDev(const QString& deviceSpecifier);

QRect getScreenRegion() const;
void setScreenRegion(const QRect &value);

bool getScreenGrabbed() const;
void setScreenGrabbed(bool value);

QRect getCamVideoRes() const;
void setCamVideoRes(QRect newValue);

Expand Down Expand Up @@ -435,6 +441,8 @@ private slots:
// Video
QString videoDev;
QRect camVideoRes;
QRect screenRegion;
bool screenGrabbed;
unsigned short camVideoFPS;

struct friendProp
Expand Down
57 changes: 45 additions & 12 deletions src/widget/form/settings/avform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@

AVForm::AVForm() :
GenericForm(QPixmap(":/img/settings/av.png"))
, subscribedToAudioIn{false}
, camVideoSurface{nullptr}
, subscribedToAudioIn(false)
, camVideoSurface(nullptr)
, camera(CameraSource::getInstance())
{
bodyUI = new Ui::AVSettings;
Expand Down Expand Up @@ -136,6 +136,14 @@ void AVForm::showEvent(QShowEvent* event)
GenericForm::showEvent(event);
}

void AVForm::open(const QString &devName, const VideoMode &mode)
{
QRect rect = mode.toRect();
Settings::getInstance().setCamVideoRes(rect);
Settings::getInstance().setCamVideoFPS(mode.FPS);
camera.open(devName, mode);
}

void AVForm::onVideoModesIndexChanged(int index)
{
if (index < 0 || index >= videoModes.size())
Expand All @@ -152,28 +160,37 @@ void AVForm::onVideoModesIndexChanged(int index)
QString devName = videoDeviceList[devIndex].first;
VideoMode mode = videoModes[index];

if (CameraDevice::isScreen(devName) && !mode.height && !mode.width)
if (CameraDevice::isScreen(devName) && mode == VideoMode())
{
if (Settings::getInstance().getScreenGrabbed())
{
VideoMode mode(Settings::getInstance().getScreenRegion());
open(devName, mode);
return;
}

ScreenshotGrabber* screenshotGrabber = new ScreenshotGrabber(this);

auto onGrabbed = [screenshotGrabber, devName, this] (QRect region)
{
VideoMode mode(region);
mode.width = mode.width / 2 * 2;
mode.height = mode.height / 2 * 2;
camera.open(devName, mode);

Settings::getInstance().setScreenRegion(mode.toRect());
Settings::getInstance().setScreenGrabbed(true);

open(devName, mode);
delete screenshotGrabber;
};

connect(screenshotGrabber, &ScreenshotGrabber::regionChosen, this, onGrabbed, Qt::QueuedConnection);

screenshotGrabber->showGrabber();
return;
}

Settings::getInstance().setCamVideoRes(mode.toRect());
Settings::getInstance().setCamVideoFPS(mode.FPS);
camera.open(devName, mode);
Settings::getInstance().setScreenGrabbed(false);
open(devName, mode);
}

void AVForm::selectBestModes(QVector<VideoMode> &allVideoModes)
Expand Down Expand Up @@ -326,7 +343,8 @@ void AVForm::updateVideoModes(int curIndex)
QVector<VideoMode> allVideoModes = CameraDevice::getVideoModes(devName);

qDebug("available Modes:");
if (CameraDevice::isScreen(devName))
bool isScreen = CameraDevice::isScreen(devName);
if (isScreen)
{
// Add extra video mode to region selection
allVideoModes.push_back(VideoMode());
Expand All @@ -343,18 +361,29 @@ void AVForm::updateVideoModes(int curIndex)
}

int preferedIndex = searchPreferredIndex();
if (preferedIndex!= -1)
if (preferedIndex != -1)
{
bodyUI->videoModescomboBox->setCurrentIndex(preferedIndex);
return;
}

if (isScreen)
{
QRect rect = Settings::getInstance().getScreenRegion();
VideoMode mode(rect);

Settings::getInstance().setScreenGrabbed(true);
bodyUI->videoModescomboBox->setCurrentIndex(videoModes.size() - 1);
open(devName, mode);
return;
}

// If the user hasn't set a preferred resolution yet,
// we'll pick the resolution in the middle of the list,
// and the best FPS for that resolution.
// If we picked the lowest resolution, the quality would be awful
// but if we picked the largest, FPS would be bad and thus quality bad too.
int mid = videoModes.size() / 2;
int mid = (videoModes.size() - 1) / 2;
bodyUI->videoModescomboBox->setCurrentIndex(mid);
}

Expand All @@ -366,15 +395,19 @@ void AVForm::onVideoDevChanged(int index)
return;
}

Settings::getInstance().setScreenGrabbed(false);
QString dev = videoDeviceList[index].first;
Settings::getInstance().setVideoDev(dev);
bool previouslyBlocked = bodyUI->videoModescomboBox->blockSignals(true);
updateVideoModes(index);
bodyUI->videoModescomboBox->blockSignals(previouslyBlocked);

if (Settings::getInstance().getScreenGrabbed())
return;

int modeIndex = bodyUI->videoModescomboBox->currentIndex();
VideoMode mode = VideoMode();
if (0 < modeIndex || modeIndex < videoModes.size())
if (0 < modeIndex && modeIndex < videoModes.size())
mode = videoModes[modeIndex];

camera.open(dev, mode);
Expand Down
1 change: 1 addition & 0 deletions src/widget/form/settings/avform.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ private slots:
bool eventFilter(QObject *o, QEvent *e) final override;
void hideEvent(QHideEvent* event) final override;
void showEvent(QShowEvent*event) final override;
void open(const QString &devName, const VideoMode &mode);

private:
Ui::AVSettings *bodyUI;
Expand Down

0 comments on commit 1c51582

Please sign in to comment.