videocapturedlg.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:10k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /***************************************************************************
  2.                           kdeapp.cpp  -  description
  3.                              -------------------
  4.     begin                : Fri Jul 21 22:28:19 CEST 2006
  5.     copyright            : (C) 2002 by Christophe Teyssier
  6.     email                : chris@teyssier.org
  7.  ***************************************************************************/
  8. /***************************************************************************
  9.  *                                                                         *
  10.  *   This program is free software; you can redistribute it and/or modify  *
  11.  *   it under the terms of the GNU General Public License as published by  *
  12.  *   the Free Software Foundation; either version 2 of the License, or     *
  13.  *   (at your option) any later version.                                   *
  14.  *                                                                         *
  15.  ***************************************************************************/
  16. #include "videocapturedlg.h"
  17. #include "celestia/celestiacore.h"
  18. #include <klocale.h>
  19. #include <qcombobox.h>
  20. #include <qcheckbox.h>
  21. #include <qspinbox.h>
  22. #include <qwidget.h>
  23. #include <qlayout.h>
  24. #include <qlabel.h>
  25. #include <kmainwindow.h>
  26. #include <kactioncollection.h>
  27. #include <kurlrequester.h>
  28. #include <kfiledialog.h>
  29. #include <qurl.h>
  30. #include <kmessagebox.h>
  31. #include <krun.h>
  32. #include <kstatusbar.h>
  33. #include <kapp.h>
  34. #include "kdeapp.h"
  35. VideoCaptureDlg::VideoCaptureDlg(QWidget* p, const QString &dir):
  36.     accepted(false)
  37. {
  38.     fileUrl->fileDialog()->setURL(dir);
  39.     KGlobal::config()->setGroup("Preferences");
  40.     if (KGlobal::config()->hasKey("CaptureVideoFrameRate")) {
  41.         frameRate->setValue(KGlobal::config()->readNumEntry("CaptureVideoFrameRate"));
  42.     }
  43.     if (KGlobal::config()->hasKey("CaptureVideoQuality")) {
  44.         videoQuality->setValue(KGlobal::config()->readNumEntry("CaptureVideoQuality"));
  45.     }
  46.     parent = static_cast<KdeApp*>(p);
  47.     statusBar = parent->statusBar();
  48.     statusBar->show();
  49.     kapp->processEvents();
  50.     currentWidth = parent->getGlWidth();
  51.     currentHeight = parent->getGlHeight();
  52.     newAspectRatioSlot(0);
  53.     statusBar->insertItem("", 4); // filename
  54.     char dim[30];
  55.     snprintf(dim, 30, "%d x %d", currentWidth, currentHeight);
  56.     statusBar->insertItem(dim, 1);
  57.     statusBar->insertItem(i18n("Duration: %1").arg("0:00"), 2, 1);
  58.     statusBar->insertItem(i18n("Size: %1 MB").arg("0"), 3, 1);
  59.     statusBar->insertItem(i18n("  Paused"), 0);
  60.     connect(parent, SIGNAL(resized(int, int)), this, SLOT(newMainWindowSizeSlot(int, int)));
  61. }
  62. VideoCaptureDlg::~VideoCaptureDlg()
  63. {
  64.     statusBar->removeItem(0);
  65.     statusBar->removeItem(1);
  66.     statusBar->removeItem(2);
  67.     statusBar->removeItem(3);
  68.     statusBar->removeItem(4);
  69.     statusBar->hide();
  70.     if (result() == QDialog::Accepted) {
  71.         parent->layout()->setResizeMode(QLayout::Auto);
  72.         parent->setMaximumSize(32767, 32767);
  73.         static_cast<KMainWindow*>(parent)->actionCollection()->action("captureVideo")->setEnabled(true);
  74.         parent->resize(mainWindowInitialWidth, mainWindowInitialHeight);
  75.         if (playVideo->isChecked() && getFrameCount() > 0) KRun::runURL(fileUrl->url(), "application/ogg");
  76.     }
  77. }
  78. void VideoCaptureDlg::newAspectRatioSlot(int idx) {
  79.     imageSize->clear();
  80.     widths.clear();
  81.     heights.clear();
  82.     int d;
  83.     switch(idx) {
  84.     case 0: // currect window aspect ratio
  85.         imageSize->insertItem(i18n("Current size: %1 x %2").arg(currentWidth).arg(currentHeight));
  86.         widths.push_back(currentWidth);
  87.         heights.push_back(currentHeight);
  88.         break;
  89.     case 1: // 11:9
  90.         d = currentWidth * 9 / 11;
  91.         imageSize->insertItem(i18n("Current width: %1 x %2").arg(currentWidth).arg(d));
  92.         widths.push_back(currentWidth);
  93.         heights.push_back(d);
  94.         d = currentHeight * 11 / 9;
  95.         imageSize->insertItem(i18n("Current height: %1 x %2").arg(d).arg(currentHeight));
  96.         widths.push_back(d);
  97.         heights.push_back(currentHeight);
  98.         imageSize->insertItem("QCIF: 176 x 144");
  99.         widths.push_back(176);
  100.         heights.push_back(144);
  101.         imageSize->insertItem("CIF: 352 x 288");
  102.         widths.push_back(352);
  103.         heights.push_back(288);
  104.         imageSize->insertItem("4CIF: 704 x 576");
  105.         widths.push_back(704);
  106.         heights.push_back(576);
  107.         imageSize->insertItem("9CIF: 1056 x 864");
  108.         widths.push_back(1056);
  109.         heights.push_back(864);
  110.         imageSize->insertItem("16CIF: 1408 x 1152");
  111.         widths.push_back(1408);
  112.         heights.push_back(1152);
  113.         break;
  114.     case 2: // 4:3
  115.         d = currentWidth * 3 / 4;
  116.         imageSize->insertItem(i18n("Current width: %1 x %2").arg(currentWidth).arg(d));
  117.         widths.push_back(currentWidth);
  118.         heights.push_back(d);
  119.         d = currentHeight * 4 / 3;
  120.         imageSize->insertItem(i18n("Current height: %1 x %2").arg(d).arg(currentHeight));
  121.         widths.push_back(d);
  122.         heights.push_back(currentHeight);
  123.         imageSize->insertItem("SQCIF: 128 x 96");
  124.         widths.push_back(128);
  125.         heights.push_back(96);
  126.         imageSize->insertItem("QVGA: 320 x 240");
  127.         widths.push_back(320);
  128.         heights.push_back(240);
  129.         imageSize->insertItem("VGA/NTSC: 640 x 480");
  130.         widths.push_back(640);
  131.         heights.push_back(480);
  132.         imageSize->insertItem("PAL: 768 x 576");
  133.         widths.push_back(768);
  134.         heights.push_back(576);
  135.         imageSize->insertItem("SVGA: 800 x 600");
  136.         widths.push_back(800);
  137.         heights.push_back(600);
  138.         imageSize->insertItem("XGA: 1024 x 768");
  139.         widths.push_back(1024);
  140.         heights.push_back(768);
  141.         imageSize->insertItem("1280 x 960");
  142.         widths.push_back(1280);
  143.         heights.push_back(960);
  144.         imageSize->insertItem("SXGA+: 1400 x 1050");
  145.         widths.push_back(1400);
  146.         heights.push_back(1050);
  147.         imageSize->insertItem("UXGA: 1600 x 1200");
  148.         widths.push_back(1600);
  149.         heights.push_back(1200);
  150.         imageSize->insertItem("QXGA: 2048 x 1536");
  151.         widths.push_back(2048);
  152.         heights.push_back(1536);
  153.         break;
  154.     case 3: // 16:9
  155.         d = currentWidth * 9 / 16;
  156.         imageSize->insertItem(i18n("Current width: %1 x %2").arg(currentWidth).arg(d));
  157.         widths.push_back(currentWidth);
  158.         heights.push_back(d);
  159.         d = currentHeight * 16 / 9;
  160.         imageSize->insertItem(i18n("Current height: %1 x %2").arg(d).arg(currentHeight));
  161.         widths.push_back(d);
  162.         heights.push_back(currentHeight);
  163.         imageSize->insertItem("WVGA/NTSC: 854 x 480");
  164.         widths.push_back(854);
  165.         heights.push_back(480);
  166.         imageSize->insertItem("PAL: 1024 x 576");
  167.         widths.push_back(1024);
  168.         heights.push_back(576);
  169.         imageSize->insertItem("HD-720: 1280 x 720");
  170.         widths.push_back(1280);
  171.         heights.push_back(720);
  172.         imageSize->insertItem("HD-1080: 1920 x 1080");
  173.         widths.push_back(1920);
  174.         heights.push_back(1080);
  175.         break;
  176.     default:
  177.         break;
  178.     }
  179. }
  180. int VideoCaptureDlg::getWidth() const {
  181.     return widths[imageSize->currentItem()];
  182. }
  183. int VideoCaptureDlg::getHeight() const {
  184.     return heights[imageSize->currentItem()];
  185. }
  186. QString VideoCaptureDlg::getDir() const {
  187.     QUrl file(fileUrl->url());
  188.     return file.dirPath();
  189. }
  190. void VideoCaptureDlg::okSlot() {
  191.     accepted = true;
  192.     if (fileUrl->url() == "") {
  193.         KMessageBox::queuedMessageBox(this, KMessageBox::Error, i18n("You must specify a file name."));
  194.         return;
  195.     }
  196.     mainWindowInitialWidth = parent->width();
  197.     mainWindowInitialHeight = parent->height();
  198.     parent->layout()->setResizeMode(QLayout::FreeResize);
  199.     parent->setFixedSize(getWidth() + parent->width() - parent->getGlWidth(), getHeight() + parent->height() - parent->getGlHeight());
  200.     kapp->processEvents();
  201.     parent->setFixedSize(getWidth() + parent->width() - parent->getGlWidth(), getHeight() + parent->height() - parent->getGlHeight());
  202.     kapp->processEvents();
  203.     KGlobal::config()->setGroup("Preferences");
  204.     KGlobal::config()->writeEntry("CaptureVideoFrameRate", frameRate->value());
  205.     KGlobal::config()->writeEntry("CaptureVideoQuality", videoQuality->value());
  206.     setAspectRatio(1, 1);
  207.     setQuality(videoQuality->value());
  208.     bool success = start(fileUrl->url().latin1(), getWidth(), getHeight(), frameRate->value());
  209.     char dim[30];
  210.     snprintf(dim, 30, "%d x %d", getWidth(), getHeight());
  211.     statusBar->changeItem(dim, 1);
  212.     if (success) {
  213.         accept();
  214.     } else {
  215.         KMessageBox::queuedMessageBox(parent, KMessageBox::Error, i18n("Error initializing movie capture."));
  216.         reject();
  217.     }
  218. }
  219. void VideoCaptureDlg::cancelSlot() {
  220.     reject();
  221. }
  222. void VideoCaptureDlg::frameCaptured() {
  223.     char duration[30];
  224.     if (getFrameCount() % int(getFrameRate()) == 0) {
  225.         float sec = getFrameCount() / getFrameRate();
  226.         int min = (int) (sec / 60);
  227.         sec -= min * 60.0f;
  228.         snprintf(duration, 30, "%3d:%02d", min, (int)sec);
  229.         statusBar->changeItem(i18n("Duration: %1").arg(duration), 2);
  230.         float mb_out = getBytesOut() / 1024 / 1024;
  231.         statusBar->changeItem(i18n("Size: %1 MB").arg(mb_out), 3);
  232.     }
  233. }
  234. void VideoCaptureDlg::recordingStatus(bool started) {
  235.     statusBar->changeItem(started?i18n("  Recording"):i18n("  Paused"), 0);
  236. }
  237. void VideoCaptureDlg::filenameSlot(const QString& name) {
  238.     statusBar->changeItem(name, 4);
  239. }
  240. void VideoCaptureDlg::newMainWindowSizeSlot(int, int) {
  241.     if (accepted) return;
  242.     currentWidth = parent->getGlWidth();
  243.     currentHeight = parent->getGlHeight();
  244.     char dim[30];
  245.     snprintf(dim, 30, "%d x %d", currentWidth, currentHeight);
  246.     statusBar->changeItem(dim, 1);
  247.     newAspectRatioSlot(imageSize->currentItem());
  248. }