Files
2026-02-21 17:11:31 +09:00

176 lines
6.1 KiB
C++

/******************************************************************************
VideoRendererTypes: type id and manually id register function
Copyright (C) 2012-2016 Wang Bin <wbsecg1@gmail.com>
* This file is part of QtAV (from 2015)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
******************************************************************************/
#include "global.h"
#include <QApplication>
#include <QBoxLayout>
#include <QMessageBox>
#include <QPushButton>
#include <QTableWidget>
#include <QTextBrowser>
#include "WidgetRenderer.h"
#include "GraphicsItemRenderer.h"
#if QTAV_HAVE(GL)
#include "GLWidgetRenderer2.h"
#endif //QTAV_HAVE(GL)
#if QTAV_HAVE(GL1)
#include "GLWidgetRenderer.h"
#endif //QTAV_HAVE(GL1)
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#ifndef QT_NO_OPENGL
#include "OpenGLWidgetRenderer.h"
#endif //QT_NO_OPENGL
#endif
#include "../factory.h"
#include "../mkid.h"
namespace FAV {
VideoRendererId VideoRendererId_Widget = mkid::id32base36_6<'W', 'i', 'd', 'g', 'e', 't'>::value;
VideoRendererId VideoRendererId_OpenGLWidget = mkid::id32base36_6<'Q', 'O', 'G', 'L', 'W', 't'>::value;
#if (TEST_GRAPHIC_ACCEL)
VideoRendererId VideoRendererId_GLWidget = mkid::id32base36_6<'Q', 'G', 'L', 'W', 't', '1'>::value;
VideoRendererId VideoRendererId_GLWidget2 = mkid::id32base36_6<'Q', 'G', 'L', 'W', 't', '2'>::value;
#endif
//VideoRendererId VideoRendererId_GraphicsItem = mkid::id32base36_6<'Q', 'G', 'r', 'a', 'p', 'h'>::value;
//VideoRendererId VideoRendererId_GDI = mkid::id32base36_3<'G', 'D', 'I'>::value;
//VideoRendererId VideoRendererId_Direct2D = mkid::id32base36_3<'D', '2', 'D'>::value;
//VideoRendererId VideoRendererId_XV = mkid::id32base36_6<'X', 'V', 'i', 'd', 'e', 'o'>::value;
//VideoRendererId VideoRendererId_X11 = mkid::id32base36_3<'X', '1', '1'>::value;
//QPainterRenderer is abstract. So can not register(operator new will needed)
#if AUTO_REGISTER
FACTORY_REGISTER(VideoRenderer, Widget, "QWidegt")
FACTORY_REGISTER(VideoRenderer, GraphicsItem, "QGraphicsItem")
#if QTAV_HAVE(GL)
#if QTAV_HAVE(GL1)
FACTORY_REGISTER(VideoRenderer, GLWidget, "QGLWidegt")
#endif //QTAV_HAVE(GL1)
FACTORY_REGISTER(VideoRenderer, GLWidget2, "QGLWidegt2")
#endif //QTAV_HAVE(GL)
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#ifndef QT_NO_OPENGL
FACTORY_REGISTER(VideoRenderer, OpenGLWidget, "OpenGLWidget")
#endif //QT_NO_OPENGL
#endif
#endif
//extern void RegisterVideoRendererGDI_Man();
//extern void RegisterVideoRendererDirect2D_Man();
//extern void RegisterVideoRendererXV_Man();
//extern void RegisterVideoRendererX11_Man();
namespace Widgets {
void registerRenderers()
{
#if !defined(QT_NO_DEBUG)
#if !(OFF_OTHER_DEBUG)
qDebug("registerRenderers...........");
#endif
#endif
// check whether it is called
static bool initialized = false;
if (initialized)
return;
initialized = true;
// factory.h does not check whether an id is registered
if (VideoRenderer::name(VideoRendererId_Widget))
return;
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
#ifndef QT_NO_OPENGL
VideoRenderer::Register<OpenGLWidgetRenderer>(VideoRendererId_OpenGLWidget, "OpenGLWidget");
#endif //QT_NO_OPENGL
#endif
#if QTAV_HAVE(GL)
VideoRenderer::Register<GLWidgetRenderer2>(VideoRendererId_GLWidget2, "QGLWidget2");
#endif //QTAV_HAVE(GL)
#if QTAV_HAVE(GL1)
VideoRenderer::Register<GLWidgetRenderer>(VideoRendererId_GLWidget, "QGLWidget");
#endif //QTAV_HAVE(GL1)
VideoRenderer::Register<WidgetRenderer>(VideoRendererId_Widget, "Widget");
#if QTAV_HAVE(GDIPLUS)
RegisterVideoRendererGDI_Man();
#endif //QTAV_HAVE(GDIPLUS)
#if QTAV_HAVE(DIRECT2D)
RegisterVideoRendererDirect2D_Man();
#endif //QTAV_HAVE(DIRECT2D)
#if QTAV_HAVE(XV)
RegisterVideoRendererXV_Man();
#endif //QTAV_HAVE(XV)
#if QTAV_HAVE(X11)
RegisterVideoRendererX11_Man();
#endif //QTAV_HAVE(XV)
#if !(REMOVE_GRAPHIC_ITEM_RENDERER)
VideoRenderer::Register<GraphicsItemRenderer>(VideoRendererId_GraphicsItem, "GraphicsItem");
#endif
}
} //namespace Widgets
namespace {
static const struct register_renderers {
inline register_renderers() {
FAV::Widgets::registerRenderers();
}
} sRegisterVO;
}
void about() {
//we should use new because a qobject will delete it's children
QTextBrowser *viewQtAV = new QTextBrowser;
QTextBrowser *viewFFmpeg = new QTextBrowser;
viewQtAV->setOpenExternalLinks(true);
viewFFmpeg->setOpenExternalLinks(true);
viewQtAV->setHtml(aboutQtAV_HTML());
viewFFmpeg->setHtml(aboutFFmpeg_HTML());
QTabWidget *tab = new QTabWidget;
tab->addTab(viewQtAV, QStringLiteral("QtAV"));
tab->addTab(viewFFmpeg, QStringLiteral("FFmpeg"));
QPushButton *qbtn = new QPushButton("About Qt");
QPushButton *btn = new QPushButton("Ok");
QHBoxLayout *btnLayout = new QHBoxLayout;
btnLayout->addWidget(btn);
btnLayout->addStretch();
btnLayout->addWidget(qbtn);
btn->setFocus();
QDialog dialog;
dialog.setWindowTitle("About" + QStringLiteral(" FAV"));
QVBoxLayout *layout = new QVBoxLayout;
dialog.setLayout(layout);
layout->addWidget(tab);
layout->addLayout(btnLayout);
QObject::connect(qbtn, SIGNAL(clicked()), qApp, SLOT(aboutQt()));
QObject::connect(btn, SIGNAL(clicked()), &dialog, SLOT(accept()));
dialog.exec();
}
void aboutFFmpeg()
{
QMessageBox::about(0, "About FFmpeg", aboutFFmpeg_HTML());
}
void aboutQtAV()
{
QMessageBox::about(0, "About QtAV", aboutQtAV_HTML());
}
}//namespace FAV