/****************************************************************************** VideoRendererTypes: type id and manually id register function Copyright (C) 2015 Wang Bin * This file is part of QtAV 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 "QtAVWidgets/global.h" #include //std::find #include #include #include #include #include #include #include "QtAV/VideoRendererTypes.h" #include "QtAV/private/prepost.h" #include "QtAVWidgets/WidgetRenderer.h" #include "QtAVWidgets/GraphicsItemRenderer.h" #if QTAV_HAVE(GL) #include "QtAVWidgets/GLWidgetRenderer2.h" #endif //QTAV_HAVE(GL) #if QTAV_HAVE(GL1) #include "QtAVWidgets/GLWidgetRenderer.h" #endif //QTAV_HAVE(GL1) #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include "QtAVWidgets/OpenGLWidgetRenderer.h" #endif #include "QtAV/private/factory.h" #include "QtAV/private/mkid.h" namespace QtAV { 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; VideoRendererId VideoRendererId_GLWidget2 = mkid::id32base36_6<'Q', 'G', 'L', 'W', 't', '2'>::value; VideoRendererId VideoRendererId_GLWidget = mkid::id32base36_6<'Q', 'G', 'L', 'W', 't', '1'>::value; 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; //QPainterRenderer is abstract. So can not register(operator new will needed) #if AUTO_REGISTER FACTORY_REGISTER_ID_AUTO(VideoRenderer, Widget, "QWidegt") #else VideoRenderer* __create_VideoRendererWidget() { return new VideoRendererWidget();} #endif void RegisterVideoRendererWidget_Man() { FACTORY_REGISTER_ID_MAN(VideoRenderer, Widget, "QWidegt") } #if AUTO_REGISTER FACTORY_REGISTER_ID_AUTO(VideoRenderer, GraphicsItem, "QGraphicsItem") #else VideoRenderer* __create_VideoRendererGraphicsItem() { return new VideoRendererGraphicsItem();} #endif void RegisterVideoRendererGraphicsItem_Man() { FACTORY_REGISTER_ID_MAN(VideoRenderer, GraphicsItem, "QGraphicsItem") } #if QTAV_HAVE(GL) #if QTAV_HAVE(GL1) #if AUTO_REGISTER FACTORY_REGISTER_ID_AUTO(VideoRenderer, GLWidget, "QGLWidegt") #else VideoRenderer* __create_VideoRendererGLWidget() { return new VideoRendererGLWidget();} #endif void RegisterVideoRendererGLWidget_Man() { FACTORY_REGISTER_ID_MAN(VideoRenderer, GLWidget, "QGLWidegt") } #endif //QTAV_HAVE(GL1) #if AUTO_REGISTER FACTORY_REGISTER_ID_AUTO(VideoRenderer, GLWidget2, "QGLWidegt2") #else VideoRenderer* __create_VideoRendererGLWidget2() { return new VideoRendererGLWidget2();} #endif void RegisterVideoRendererGLWidget2_Man() { FACTORY_REGISTER_ID_MAN(VideoRenderer, GLWidget2, "QGLWidegt2") } #endif //QTAV_HAVE(GL) #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #if AUTO_REGISTER FACTORY_REGISTER_ID_AUTO(VideoRenderer, OpenGLWidget, "OpenGLWidget") #else VideoRenderer* __create_VideoRendererOpenGLWidget() { return new VideoRendererOpenGLWidget();} #endif void RegisterVideoRendererOpenGLWidget_Man() { FACTORY_REGISTER_ID_MAN(VideoRenderer, OpenGLWidget, "OpenGLWidget") } #endif extern void RegisterVideoRendererGDI_Man(); extern void RegisterVideoRendererDirect2D_Man(); extern void RegisterVideoRendererXV_Man(); namespace Widgets { void registerRenderers() { // check whether it is called static bool initialized = false; if (initialized) return; initialized = true; // factory.h does not check whether an id is registered const std::vector ids(VideoRendererFactory::registeredIds()); if (std::find(ids.begin(), ids.end(), VideoRendererId_Widget) != ids.end()) return; #if QTAV_HAVE(GL) RegisterVideoRendererGLWidget2_Man(); #endif //QTAV_HAVE(GL) #if QTAV_HAVE(GL1) RegisterVideoRendererGLWidget_Man(); #endif //QTAV_HAVE(GL1) RegisterVideoRendererWidget_Man(); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) RegisterVideoRendererOpenGLWidget_Man(); #endif #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) RegisterVideoRendererGraphicsItem_Man(); } PRE_FUNC_ADD(registerRenderers) } //namespace Widgets 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, "QtAV"); tab->addTab(viewFFmpeg, "FFmpeg"); QPushButton *qbtn = new QPushButton(QObject::tr("About Qt")); QPushButton *btn = new QPushButton(QObject::tr("Ok")); QHBoxLayout *btnLayout = new QHBoxLayout; btnLayout->addWidget(btn); btnLayout->addStretch(); btnLayout->addWidget(qbtn); btn->setFocus(); QDialog dialog; dialog.setWindowTitle(QObject::tr("About") + " QtAV"); 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, QObject::tr("About FFmpeg"), aboutFFmpeg_HTML()); } void aboutQtAV() { QMessageBox::about(0, QObject::tr("About QtAV"), aboutQtAV_HTML()); } }//namespace QtAV