X-Git-Url: http://cgit.sxemacs.org/?p=harmattan%2Fcameraplus;a=blobdiff_plain;f=lib%2Fqtcamdevice.cpp;h=38da29ba4eb7ab18d3cf7b247b2249dc2d10ef12;hp=bf9dd54be02b30e0b68e8967ed1c0bbe6eab3d15;hb=f15b7b41a0fd2cade6cd0bb3771c2c0da14db3c8;hpb=7f34c4d6943b458ebac8b8f5bfc38520d730c9bc diff --git a/lib/qtcamdevice.cpp b/lib/qtcamdevice.cpp index bf9dd54..38da29b 100644 --- a/lib/qtcamdevice.cpp +++ b/lib/qtcamdevice.cpp @@ -1,7 +1,7 @@ /*! * This file is part of CameraPlus. * - * Copyright (C) 2012 Mohammed Sameer + * Copyright (C) 2012-2013 Mohammed Sameer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -28,13 +28,21 @@ #include "qtcammode.h" #include "qtcamimagemode.h" #include "qtcamvideomode.h" - -// TODO: we want the ability to change the image and video gep from the app. +#include "qtcamnotifications.h" +#include "gst/gstcopy.h" +#include "qtcampropertysetter.h" +#include "qtcamanalysisbin.h" QtCamDevice::QtCamDevice(QtCamConfig *config, const QString& name, const QVariant& id, QObject *parent) : QObject(parent), d_ptr(new QtCamDevicePrivate) { + static gboolean register_copy = TRUE; + if (register_copy) { + qt_cam_copy_register(); + register_copy = FALSE; + } + d_ptr->q_ptr = this; d_ptr->name = name; d_ptr->id = id; @@ -46,8 +54,18 @@ QtCamDevice::QtCamDevice(QtCamConfig *config, const QString& name, return; } + d_ptr->propertySetter = new QtCamPropertySetter(d_ptr); + d_ptr->createAndAddElement(d_ptr->conf->audioSource(), "audio-source", "QtCameraAudioSrc"); - d_ptr->createAndAddVideoSource(); + if (!d_ptr->conf->wrapperVideoSource().isEmpty() && + !d_ptr->conf->wrapperVideoSourceProperty().isEmpty()) { + d_ptr->createAndAddVideoSourceAndWrapper(); + } + else { + d_ptr->createAndAddVideoSource(); + } + + d_ptr->setDevicePoperty(); int flags = 0x00000001 /* no-audio-conversion - Do not use audio conversion elements */ @@ -59,11 +77,19 @@ QtCamDevice::QtCamDevice(QtCamConfig *config, const QString& name, d_ptr->setAudioCaptureCaps(); - // TODO: audio bitrate - // TODO: video bitrate - // TODO: filters - // TODO: capabilities - // TODO: custom properties for jifmux, mp4mux, audio encoder, video encoder, sink & video source + QStringList viewfinderFilters = d_ptr->conf->viewfinderFilters(); + if (!viewfinderFilters.isEmpty()) { + d_ptr->viewfinderFilters = + QtCamAnalysisBin::create(viewfinderFilters, "QtCamViewfinderFilters"); + + if (!d_ptr->viewfinderFilters) { + qWarning() << "Failed to create viewfinder filters"; + } + else { + g_object_set(d_ptr->cameraBin, "viewfinder-filter", d_ptr->viewfinderFilters->bin(), NULL); + } + } + d_ptr->listener = new QtCamGStreamerMessageListener(gst_element_get_bus(d_ptr->cameraBin), d_ptr, this); @@ -76,21 +102,38 @@ QtCamDevice::QtCamDevice(QtCamConfig *config, const QString& name, g_signal_connect(d_ptr->cameraBin, "notify::idle", G_CALLBACK(QtCamDevicePrivate::on_idle_changed), d_ptr); - g_signal_connect(d_ptr->wrapperVideoSource, "notify::ready-for-capture", - G_CALLBACK(QtCamDevicePrivate::on_ready_for_capture_changed), d_ptr); + if (d_ptr->wrapperVideoSource) { + g_signal_connect(d_ptr->wrapperVideoSource, "notify::ready-for-capture", + G_CALLBACK(QtCamDevicePrivate::on_ready_for_capture_changed), d_ptr); + } + else { + g_signal_connect(d_ptr->videoSource, "notify::ready-for-capture", + G_CALLBACK(QtCamDevicePrivate::on_ready_for_capture_changed), d_ptr); + } d_ptr->image = new QtCamImageMode(d_ptr, this); d_ptr->video = new QtCamVideoMode(d_ptr, this); + + d_ptr->notifications = new QtCamNotifications(this, this); } QtCamDevice::~QtCamDevice() { - stop(); + stop(true); d_ptr->image->deactivate(); d_ptr->video->deactivate(); delete d_ptr->image; d_ptr->image = 0; delete d_ptr->video; d_ptr->video = 0; + + delete d_ptr->propertySetter; + + delete d_ptr->viewfinderFilters; + + if (d_ptr->cameraBin) { + gst_object_unref(d_ptr->cameraBin); + } + delete d_ptr; d_ptr = 0; } @@ -105,24 +148,26 @@ bool QtCamDevice::setViewfinder(QtCamViewfinder *viewfinder) { } if (!viewfinder) { - qWarning() << "QtCamDevice: viewfinder cannot be unset."; - return false; - } + if (d_ptr->cameraBin) { + g_object_set(d_ptr->cameraBin, "viewfinder-sink", NULL, NULL); + } - if (d_ptr->viewfinder) { - qWarning() << "QtCamDevice: viewfinder cannot be replaced."; - return false; - } + d_ptr->sink = 0; - if (!viewfinder->setDevice(this)) { - return false; + d_ptr->viewfinder = 0; + return true; } d_ptr->viewfinder = viewfinder; + d_ptr->sink = 0; return true; } +QtCamViewfinder *QtCamDevice::viewfinder() const { + return d_ptr->viewfinder; +} + bool QtCamDevice::start() { if (d_ptr->error) { qWarning() << "Pipeline must be stopped first because of an error."; @@ -184,7 +229,7 @@ bool QtCamDevice::start() { return true; } -bool QtCamDevice::stop() { +bool QtCamDevice::stop(bool force) { if (!d_ptr->cameraBin) { return true; } @@ -192,6 +237,9 @@ bool QtCamDevice::stop() { if (d_ptr->error) { gst_element_set_state(d_ptr->cameraBin, GST_STATE_NULL); d_ptr->error = false; + + d_ptr->viewfinder->stop(); + return true; } @@ -204,11 +252,11 @@ bool QtCamDevice::stop() { } if (!isIdle()) { - return false; + if (!force) { + return false; + } } - d_ptr->viewfinder->stop(); - // First we go to ready: GstStateChangeReturn st = gst_element_set_state(d_ptr->cameraBin, GST_STATE_READY); if (st != GST_STATE_CHANGE_FAILURE) { @@ -219,6 +267,8 @@ bool QtCamDevice::stop() { // Now to NULL gst_element_set_state(d_ptr->cameraBin, GST_STATE_NULL); + d_ptr->viewfinder->stop(); + return true; } @@ -277,4 +327,8 @@ QtCamGStreamerMessageListener *QtCamDevice::listener() const { return d_ptr->listener; } +QtCamNotifications *QtCamDevice::notifications() const { + return d_ptr->notifications; +} + #include "moc_qtcamdevice.cpp"