X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lib%2Fqtcamdevice.cpp;h=38da29ba4eb7ab18d3cf7b247b2249dc2d10ef12;hb=f15b7b41a0fd2cade6cd0bb3771c2c0da14db3c8;hp=4aa1c19f8db4b755e81bf825a42c76f66406eacb;hpb=047babdd446e6490a5402070fb113e5c537ab6bc;p=harmattan%2Fcameraplus diff --git a/lib/qtcamdevice.cpp b/lib/qtcamdevice.cpp index 4aa1c19..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 @@ -30,6 +30,8 @@ #include "qtcamvideomode.h" #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) : @@ -52,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 */ @@ -65,10 +77,19 @@ QtCamDevice::QtCamDevice(QtCamConfig *config, const QString& name, d_ptr->setAudioCaptureCaps(); - // TODO: audio bitrate - // TODO: video bitrate - // TODO: filters - // 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); @@ -81,8 +102,14 @@ 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); @@ -99,6 +126,10 @@ QtCamDevice::~QtCamDevice() { 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); } @@ -117,20 +148,18 @@ 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; }