all repos — mgba @ f5f1cbf037e94c665a698eaa21be7311a75f3f83

mGBA Game Boy Advance Emulator

src/platform/qt/GIFView.cpp (view raw)

 1/* Copyright (c) 2013-2014 Jeffrey Pfau
 2 *
 3 * This Source Code Form is subject to the terms of the Mozilla Public
 4 * License, v. 2.0. If a copy of the MPL was not distributed with this
 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 6#include "GIFView.h"
 7
 8#ifdef USE_FFMPEG
 9
10#include "CoreController.h"
11#include "GBAApp.h"
12#include "LogController.h"
13
14#include <QMap>
15
16using namespace QGBA;
17
18GIFView::GIFView(QWidget* parent)
19	: QWidget(parent)
20{
21	m_ui.setupUi(this);
22
23	connect(m_ui.start, &QAbstractButton::clicked, this, &GIFView::startRecording);
24	connect(m_ui.stop, &QAbstractButton::clicked, this, &GIFView::stopRecording);
25
26	connect(m_ui.selectFile, &QAbstractButton::clicked, this, &GIFView::selectFile);
27	connect(m_ui.filename, &QLineEdit::textChanged, this, &GIFView::setFilename);
28
29	FFmpegEncoderInit(&m_encoder);
30	FFmpegEncoderSetAudio(&m_encoder, nullptr, 0);
31}
32
33GIFView::~GIFView() {
34	stopRecording();
35}
36
37void GIFView::setController(std::shared_ptr<CoreController> controller) {
38	connect(controller.get(), &CoreController::stopping, this, &GIFView::stopRecording);
39	connect(this, &GIFView::recordingStarted, controller.get(), &CoreController::setAVStream);
40	connect(this, &GIFView::recordingStopped, controller.get(), &CoreController::clearAVStream, Qt::DirectConnection);
41	QSize size(controller->screenDimensions());
42	FFmpegEncoderSetDimensions(&m_encoder, size.width(), size.height());
43}
44
45void GIFView::startRecording() {
46	if (m_ui.fmtApng->isChecked()) {
47		FFmpegEncoderSetContainer(&m_encoder, "apng");
48		FFmpegEncoderSetVideo(&m_encoder, "apng", 0, m_ui.frameskip->value());
49	} else {
50		FFmpegEncoderSetContainer(&m_encoder, "gif");
51		FFmpegEncoderSetVideo(&m_encoder, "gif", 0, m_ui.frameskip->value());
52	}
53	FFmpegEncoderSetLooping(&m_encoder, m_ui.loop->isChecked());
54	if (!FFmpegEncoderOpen(&m_encoder, m_filename.toUtf8().constData())) {
55		LOG(QT, ERROR) << tr("Failed to open output GIF or APNG file: %1").arg(m_filename);
56		return;
57	}
58	m_ui.start->setEnabled(false);
59	m_ui.stop->setEnabled(true);
60	m_ui.frameskip->setEnabled(false);
61	m_ui.loop->setEnabled(false);
62	m_ui.fmtApng->setEnabled(false);
63	m_ui.fmtGif->setEnabled(false);
64	emit recordingStarted(&m_encoder.d);
65}
66
67void GIFView::stopRecording() {
68	emit recordingStopped();
69	FFmpegEncoderClose(&m_encoder);
70	m_ui.stop->setEnabled(false);
71	m_ui.start->setEnabled(!m_filename.isEmpty());
72	m_ui.frameskip->setEnabled(true);
73	m_ui.loop->setEnabled(true);
74	m_ui.fmtApng->setEnabled(true);
75	m_ui.fmtGif->setEnabled(true);
76}
77
78void GIFView::selectFile() {
79	QString filename = GBAApp::app()->getSaveFileName(this, tr("Select output file"), tr("Graphics Interchange Format (*.gif);;Animated Portable Network Graphics (*.png *.apng)"));
80	m_ui.filename->setText(filename);
81}
82
83void GIFView::setFilename(const QString& filename) {
84	m_filename = filename;
85	if (!FFmpegEncoderIsOpen(&m_encoder)) {
86		m_ui.start->setEnabled(!filename.isEmpty());
87	}
88}
89
90#endif