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

Commit

Permalink
fix(video): don't use pointers to temporary objects
Browse files Browse the repository at this point in the history
fixes #4764
  • Loading branch information
sudden6 committed Nov 12, 2017
1 parent 8a9c34d commit 5d6ae9a
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 53 deletions.
11 changes: 6 additions & 5 deletions src/net/autoupdate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,13 +595,14 @@ void AutoUpdater::installLocalUpdate()
// Workaround QTBUG-7645
// QProcess fails silently when elevation is required instead of showing a UAC prompt on Win7/Vista
#ifdef Q_OS_WIN
QString modulePath = qApp->applicationDirPath().replace('/', '\\');
HINSTANCE result = ::ShellExecuteW(0, L"open", updaterBin.toStdWString().c_str(), 0,
modulePath.toStdWString().c_str(), SW_SHOWNORMAL);
const std::wstring modulePath = qApp->applicationDirPath().replace('/', '\\').toStdWString();
const std::wstring updaterBinPath = updaterBin.toStdWString();
HINSTANCE result = ::ShellExecuteW(0, L"open", updaterBinPath.c_str(), 0,
modulePath.c_str(), SW_SHOWNORMAL);
if (result == (HINSTANCE)SE_ERR_ACCESSDENIED) {
// Requesting elevation
result = ::ShellExecuteW(0, L"runas", updaterBin.toStdWString().c_str(), 0,
modulePath.toStdWString().c_str(), SW_SHOWNORMAL);
result = ::ShellExecuteW(0, L"runas", updaterBinPath.c_str(), 0,
modulePath.c_str(), SW_SHOWNORMAL);
}
if (result <= (HINSTANCE)32)
failExit();
Expand Down
9 changes: 6 additions & 3 deletions src/platform/camera/v4l2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ static int deviceOpen(QString devName, int* error)
struct v4l2_capability cap;
int fd;

fd = open(devName.toStdString().c_str(), O_RDWR, 0);
const std::string devNameString = devName.toStdString();
fd = open(devNameString.c_str(), O_RDWR, 0);
if (fd < 0) {
*error = errno;
return fd;
Expand Down Expand Up @@ -183,9 +184,11 @@ QVector<QPair<QString, QString>> v4l2::getDeviceList()
closedir(dir);

for (QString file : deviceFiles) {
int fd = open(file.toStdString().c_str(), O_RDWR);
if (fd < 0)
const std::string filePath = file.toStdString();
int fd = open(filePath.c_str(), O_RDWR);
if (fd < 0) {
continue;
}

v4l2_capability caps;
ioctl(fd, VIDIOC_QUERYCAP, &caps);
Expand Down
59 changes: 33 additions & 26 deletions src/video/cameradevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,10 @@ CameraDevice* CameraDevice::open(QString devName, AVDictionary** options)
AVFormatContext* fctx = nullptr;
CameraDevice* dev = openDevices.value(devName);
int aduration;
if (dev)
std::string devString;
if (dev) {
goto out;
}

AVInputFormat* format;
if (devName.startsWith("x11grab#")) {
Expand All @@ -98,8 +100,10 @@ CameraDevice* CameraDevice::open(QString devName, AVDictionary** options)
format = iformat;
}

if (avformat_open_input(&fctx, devName.toStdString().c_str(), format, options) < 0)
devString = devName.toStdString();
if (avformat_open_input(&fctx, devString.c_str(), format, options) < 0) {
goto out;
}

// Fix avformat_find_stream_info hanging on garbage input
#if FF_API_PROBESIZE_32
Expand Down Expand Up @@ -149,6 +153,14 @@ CameraDevice* CameraDevice::open(QString devName, VideoMode mode)
return nullptr;
}

int FPS = 5;
if (mode.FPS) {
FPS = mode.FPS;
}

const std::string videoSize = QStringLiteral("%1x%2").arg(mode.width).arg(mode.height).toStdString();
const std::string framerate = QString{}.setNum(FPS).toStdString();

AVDictionary* options = nullptr;
if (!iformat)
;
Expand All @@ -168,20 +180,14 @@ CameraDevice* CameraDevice::open(QString devName, VideoMode mode)
screen.setWidth((screen.width() * pixRatio) - 2);
screen.setHeight((screen.height() * pixRatio) - 2);
}
av_dict_set(&options, "video_size",
QString("%1x%2").arg(screen.width()).arg(screen.height()).toStdString().c_str(),
0);
const std::string screenVideoSize = QStringLiteral("%1x%2").arg(screen.width()).arg(screen.height()).toStdString();
av_dict_set(&options, "video_size", screenVideoSize.c_str(), 0);
devName += QString("+%1,%2").arg(QString().setNum(mode.x), QString().setNum(mode.y));

int FPS = 5;
if (mode.FPS)
FPS = mode.FPS;

av_dict_set(&options, "framerate", QString().setNum(FPS).toStdString().c_str(), 0);
av_dict_set(&options, "framerate", framerate.c_str(), 0);
} else if (iformat->name == QString("video4linux2,v4l2") && mode) {
av_dict_set(&options, "video_size",
QString("%1x%2").arg(mode.width).arg(mode.height).toStdString().c_str(), 0);
av_dict_set(&options, "framerate", QString().setNum(mode.FPS).toStdString().c_str(), 0);
av_dict_set(&options, "video_size", videoSize.c_str(), 0);
av_dict_set(&options, "framerate", framerate.c_str(), 0);
const std::string pixelFormatStr = v4l2::getPixelFormatString(mode.pixel_format).toStdString();
const char* pixel_format = pixelFormatStr.c_str();
if (strncmp(pixel_format, "unknown", 7) != 0) {
Expand All @@ -191,25 +197,25 @@ CameraDevice* CameraDevice::open(QString devName, VideoMode mode)
#endif
#ifdef Q_OS_WIN
else if (devName.startsWith("gdigrab#")) {
av_dict_set(&options, "framerate", QString().setNum(5).toStdString().c_str(), 0);
av_dict_set(&options, "offset_x", QString().setNum(mode.x).toStdString().c_str(), 0);
av_dict_set(&options, "offset_y", QString().setNum(mode.y).toStdString().c_str(), 0);
av_dict_set(&options, "video_size",
QString("%1x%2").arg(mode.width).arg(mode.height).toStdString().c_str(), 0);

const std::string offsetX = QString().setNum(mode.x).toStdString();
const std::string offsetY = QString().setNum(mode.y).toStdString();
av_dict_set(&options, "framerate", framerate.c_str(), 0);
av_dict_set(&options, "offset_x", offsetX.c_str(), 0);
av_dict_set(&options, "offset_y", offsetY.c_str(), 0);
av_dict_set(&options, "video_size", videoSize.c_str(), 0);
} else if (iformat->name == QString("dshow") && mode) {
av_dict_set(&options, "video_size",
QString("%1x%2").arg(mode.width).arg(mode.height).toStdString().c_str(), 0);
av_dict_set(&options, "framerate", QString().setNum(mode.FPS).toStdString().c_str(), 0);
av_dict_set(&options, "video_size", videoSize.c_str(), 0);
av_dict_set(&options, "framerate", framerate.c_str(), 0);
}
#endif
#ifdef Q_OS_OSX
else if (iformat->name == QString("avfoundation")) {
if (mode) {
av_dict_set(&options, "video_size",
QString("%1x%2").arg(mode.width).arg(mode.height).toStdString().c_str(), 0);
av_dict_set(&options, "framerate", QString().setNum(mode.FPS).toStdString().c_str(), 0);
av_dict_set(&options, "video_size", videoSize.c_str(), 0);
av_dict_set(&options, "framerate", framerate.c_str(), 0);
} else if (devName.startsWith(avfoundation::CAPTURE_SCREEN)) {
av_dict_set(&options, "framerate", QString().setNum(5).toStdString().c_str(), 0);
av_dict_set(&options, "framerate", framerate.c_str(), 0);
av_dict_set_int(&options, "capture_cursor", 1, 0);
av_dict_set_int(&options, "capture_mouse_clicks", 1, 0);
}
Expand All @@ -221,8 +227,9 @@ CameraDevice* CameraDevice::open(QString devName, VideoMode mode)
}

CameraDevice* dev = open(devName, &options);
if (options)
if (options) {
av_dict_free(&options);
}

return dev;
}
Expand Down
13 changes: 7 additions & 6 deletions src/widget/form/settings/avform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,14 +280,15 @@ void AVForm::fillCameraModesComboBox()
VideoMode mode = videoModes[i];

QString str;
QString pixelFormat = CameraDevice::getPixelFormatString(mode.pixel_format);
std::string pixelFormat = CameraDevice::getPixelFormatString(mode.pixel_format).toStdString();
qDebug("width: %d, height: %d, FPS: %f, pixel format: %s\n", mode.width, mode.height,
mode.FPS, pixelFormat.toStdString().c_str());
mode.FPS, pixelFormat.c_str());

if (mode.height && mode.width)
if (mode.height && mode.width) {
str += QString("%1p").arg(mode.height);
else
} else {
str += tr("Default resolution");
}

videoModescomboBox->addItem(str);
}
Expand Down Expand Up @@ -320,9 +321,9 @@ void AVForm::fillScreenModesComboBox()

for (int i = 0; i < videoModes.size(); ++i) {
VideoMode mode = videoModes[i];
QString pixelFormat = CameraDevice::getPixelFormatString(mode.pixel_format);
std::string pixelFormat = CameraDevice::getPixelFormatString(mode.pixel_format).toStdString();
qDebug("%dx%d+%d,%d FPS: %f, pixel format: %s\n", mode.width, mode.height, mode.x, mode.y,
mode.FPS, pixelFormat.toStdString().c_str());
mode.FPS, pixelFormat.c_str());

QString name;
if (mode.width && mode.height)
Expand Down
3 changes: 2 additions & 1 deletion src/widget/qrwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ void QRWidget::paintImage()
// https://fukuchi.org/works/qrencode/manual/qrencode_8h.html#a4cebc3c670efe1b8866b14c42737fc8f
// any mode other than QR_MODE_8 or QR_MODE_KANJI results in EINVAL. First 1 is version, second
// is case sensitivity
QRcode* qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_M, QR_MODE_8, 1);
const std::string dataString = data.toStdString();
QRcode* qr = QRcode_encodeString(dataString.c_str(), 1, QR_ECLEVEL_M, QR_MODE_8, 1);

if (qr != nullptr) {
QColor fg("black");
Expand Down
26 changes: 14 additions & 12 deletions src/widget/systemtrayicon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,10 @@ SystemTrayIcon::SystemTrayIcon()
}
backendType = SystrayBackendType::Unity;
unityMenu = gtk_menu_new();
const std::string settingsDirString = settingsDir.toStdString();
unityIndicator =
app_indicator_new_with_path("qTox", "icon", APP_INDICATOR_CATEGORY_APPLICATION_STATUS,
settingsDir.toStdString().c_str());
settingsDirString.c_str());
app_indicator_set_menu(unityIndicator, GTK_MENU(unityMenu));
}
#endif
Expand Down Expand Up @@ -141,15 +142,15 @@ void SystemTrayIcon::setContextMenu(QMenu* menu)
g_signal_connect(statusNotifier, "secondary_activate", G_CALLBACK(callbackMiddleClick), this);

for (QAction* a : menu->actions()) {
QString aText = a->text().replace('&', "");
const std::string aText = a->text().replace('&', "").toStdString();
GtkWidget* item;
if (a->isSeparator())
item = gtk_menu_item_new();
else if (a->icon().isNull())
item = gtk_menu_item_new_with_label(aText.toStdString().c_str());
item = gtk_menu_item_new_with_label(aText.c_str());
else {
GdkPixbuf* pixbuf = convertQIconToPixbuf(a->icon());
item = gtk_image_menu_item_new_with_label(aText.toStdString().c_str());
item = gtk_image_menu_item_new_with_label(aText.c_str());
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
gtk_image_new_from_pixbuf(pixbuf));
gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(item), TRUE);
Expand All @@ -174,15 +175,15 @@ void SystemTrayIcon::setContextMenu(QMenu* menu)
#ifdef ENABLE_SYSTRAY_GTK_BACKEND
else if (backendType == SystrayBackendType::GTK) {
for (QAction* a : menu->actions()) {
QString aText = a->text().replace('&', "");
const std::string aText = a->text().replace('&', "").toStdString();
GtkWidget* item;
if (a->isSeparator())
item = gtk_menu_item_new();
else if (a->icon().isNull())
item = gtk_menu_item_new_with_label(aText.toStdString().c_str());
item = gtk_menu_item_new_with_label(aText.c_str());
else {
GdkPixbuf* pixbuf = convertQIconToPixbuf(a->icon());
item = gtk_image_menu_item_new_with_label(aText.toStdString().c_str());
item = gtk_image_menu_item_new_with_label(aText.c_str());
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
gtk_image_new_from_pixbuf(pixbuf));
gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(item), TRUE);
Expand All @@ -206,16 +207,17 @@ void SystemTrayIcon::setContextMenu(QMenu* menu)
#ifdef ENABLE_SYSTRAY_UNITY_BACKEND
else if (backendType == SystrayBackendType::Unity) {
for (QAction* a : menu->actions()) {
QString aText = a->text().replace('&', "");
const std::string aText = a->text().replace('&', "").toStdString();
GtkWidget* item;
if (a->isSeparator())
item = gtk_menu_item_new();
else if (a->icon().isNull())
item = gtk_menu_item_new_with_label(aText.toStdString().c_str());
item = gtk_menu_item_new_with_label(aText.c_str());
else {
QString iconPath = extractIconToFile(a->icon(), "iconmenu" + a->icon().name());
GtkWidget* image = gtk_image_new_from_file(iconPath.toStdString().c_str());
item = gtk_image_menu_item_new_with_label(aText.toStdString().c_str());
const std::string iconPath = extractIconToFile(a->icon(),
"iconmenu" + a->icon().name()).toStdString();
GtkWidget* image = gtk_image_new_from_file(iconPath.c_str());
item = gtk_image_menu_item_new_with_label(aText.c_str());
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(item), TRUE);
}
Expand Down

0 comments on commit 5d6ae9a

Please sign in to comment.