X-Git-Url: http://cgit.sxemacs.org/?p=harmattan%2Fcameraplus;a=blobdiff_plain;f=declarative%2Fvideoplayer.cpp;h=ce311a279b1ef13fe0120c6b165067973a7328c8;hp=29cfea400cba123fba47809268494a817415f762;hb=0d3123d710b1210e952ebac85e05ac115de11ee3;hpb=40393bf9e36aac18cb907a71dee9e826577c73c3 diff --git a/declarative/videoplayer.cpp b/declarative/videoplayer.cpp index 29cfea4..ce311a2 100644 --- a/declarative/videoplayer.cpp +++ b/declarative/videoplayer.cpp @@ -19,15 +19,26 @@ */ #include "videoplayer.h" +#if defined(QT4) #include -#include "qtcamgraphicsviewfinder.h" +#elif defined(QT5) +#include +#endif #include "cameraconfig.h" #include +#include "qtcamviewfinderrenderer.h" +#include +#include +#if defined(QT4) VideoPlayer::VideoPlayer(QDeclarativeItem *parent) : QDeclarativeItem(parent), +#elif defined(QT5) +VideoPlayer::VideoPlayer(QQuickItem *parent) : + QQuickPaintedItem(parent), +#endif m_config(0), - m_vf(0), + m_renderer(0), m_bin(0), m_state(VideoPlayer::StateStopped), m_timer(new QTimer(this)), @@ -36,6 +47,16 @@ VideoPlayer::VideoPlayer(QDeclarativeItem *parent) : m_timer->setSingleShot(false); m_timer->setInterval(500); QObject::connect(m_timer, SIGNAL(timeout()), this, SIGNAL(positionChanged())); + +#if defined(QT4) + setFlag(QGraphicsItem::ItemHasNoContents, false); +#endif + +#if defined(QT5) + setRenderTarget(QQuickPaintedItem::FramebufferObject); + setSmooth(false); + setAntialiasing(false); +#endif } VideoPlayer::~VideoPlayer() { @@ -48,7 +69,29 @@ VideoPlayer::~VideoPlayer() { } void VideoPlayer::componentComplete() { +#if defined(QT4) + QDeclarativeItem::componentComplete(); +#elif defined(QT5) + QQuickPaintedItem::componentComplete(); +#endif + + if (!m_config) { + qmlInfo(this) << "CameraConfig not set"; + return; + } + + m_renderer = QtCamViewfinderRenderer::create(m_config->config(), this); + if (!m_renderer) { + qmlInfo(this) << "Failed to create viewfinder renderer"; + return; + } + + m_renderer->resize(QSizeF(width(), height())); + QObject::connect(m_renderer, SIGNAL(updateRequested()), this, SLOT(updateRequested())); + if (m_bin) { + g_object_set(m_bin, "video-sink", m_renderer->sinkElement(), NULL); + } } void VideoPlayer::classBegin() { @@ -102,15 +145,8 @@ void VideoPlayer::setCameraConfig(CameraConfig *config) { if (m_config != config) { m_config = config; - // TODO: We need fence sync here. - m_vf = new QtCamGraphicsViewfinder(m_config->config(), this); - m_vf->resize(QSizeF(width(), height())); emit cameraConfigChanged(); } - - if (m_bin) { - g_object_set(m_bin, "video-sink", m_vf->sinkElement(), NULL); - } } qint64 VideoPlayer::duration() const { @@ -199,10 +235,46 @@ bool VideoPlayer::stop() { } void VideoPlayer::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) { +#if defined(QT4) QDeclarativeItem::geometryChanged(newGeometry, oldGeometry); +#elif defined(QT5) + QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry); +#endif + + if (m_renderer) { + m_renderer->resize(newGeometry.size()); + } +} + +#if defined(QT4) +void VideoPlayer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget) { + + Q_UNUSED(widget); + Q_UNUSED(option); + + painter->fillRect(boundingRect(), Qt::black); - if (m_vf) { - m_vf->resize(newGeometry.size()); +#elif defined(QT5) +void VideoPlayer::paint(QPainter *painter) { + painter->fillRect(contentsBoundingRect(), Qt::black); + +#endif + + if (!m_renderer) { + return; + } + + bool needsNativePainting = m_renderer->needsNativePainting(); + + if (needsNativePainting) { + painter->beginNativePainting(); + } + + m_renderer->paint(QMatrix4x4(painter->combinedTransform()), painter->viewport()); + + if (needsNativePainting) { + painter->endNativePainting(); } } @@ -349,3 +421,7 @@ gboolean VideoPlayer::bus_call(GstBus *bus, GstMessage *msg, gpointer data) { return TRUE; } + +void VideoPlayer::updateRequested() { + update(); +}