Skip to content

Commit

Permalink
Recorder and CameraGrabber changes
Browse files Browse the repository at this point in the history
  • Loading branch information
kibsoft committed Jun 3, 2013
1 parent 19874c5 commit 4885d74
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 39 deletions.
17 changes: 15 additions & 2 deletions src/grabbers/image/cameragrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,20 @@ QStringList CameraGrabber::availableDeviceNames()
return names;
}

QSize CameraGrabber::maximumFrameSize(int deviceIndex)
{
if (deviceIndex < 0 || deviceIndex > CameraGrabber::availableDeviceNames().count())
return QSize();

CvCapture *capture = cvCreateCameraCapture(deviceIndex);
QSize size;
size.setWidth(cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH));
size.setHeight(cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));
cvReleaseCapture(&capture);

return size;
}

bool CameraGrabber::start()
{
if (!createCamera())
Expand All @@ -109,8 +123,7 @@ bool CameraGrabber::start()

void CameraGrabber::onStateChanged(AbstractGrabber::State state)
{
if (state == AbstractGrabber::StoppedState
|| state == AbstractGrabber::SuspendedState) {
if (state == AbstractGrabber::StoppedState) {
releaseCamera();
}
}
Expand Down
1 change: 1 addition & 0 deletions src/grabbers/image/cameragrabber.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class QTMELSHARED_EXPORT CameraGrabber : public AbstractImageGrabber
QSize size() const;

static QStringList availableDeviceNames();
static QSize maximumFrameSize(int deviceIndex);

public Q_SLOTS:
bool start();
Expand Down
107 changes: 70 additions & 37 deletions src/helpers/recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,31 @@

#include <QTimer>
#include <QEventLoop>
#include <QDebug>
#include <QMetaType>

Recorder::Recorder(QObject *parent) :
QObject(parent)
, m_screenGrabber(0)
, m_cameraGrabber(0)
, m_audioGrabber(0)
, m_encoder(new Encoder(this))
, m_state(Recorder::StoppedState)
{
qRegisterMetaType<AbstractGrabber::State>("Recorder::State");

connect(m_encoder, SIGNAL(started()), this, SLOT(startGrabbers()));
}

void Recorder::setImageGrabber(AbstractImageGrabber *grabber)
{
if (dynamic_cast<ScreenGrabber *>(grabber)) {
m_screenGrabber = dynamic_cast<ScreenGrabber *>(grabber);
m_cameraGrabber = 0;
} else if (dynamic_cast<CameraGrabber *>(grabber)) {
m_cameraGrabber = dynamic_cast<CameraGrabber *>(grabber);
m_screenGrabber = 0;
if (state() == Recorder::StoppedState) {
if (dynamic_cast<ScreenGrabber *>(grabber)) {
m_screenGrabber = dynamic_cast<ScreenGrabber *>(grabber);
m_cameraGrabber = 0;
} else if (dynamic_cast<CameraGrabber *>(grabber)) {
m_cameraGrabber = dynamic_cast<CameraGrabber *>(grabber);
m_screenGrabber = 0;
}
}
}

Expand All @@ -39,7 +44,8 @@ AbstractImageGrabber *Recorder::imageGrabber() const

void Recorder::setAudioGrabber(AudioGrabber *grabber)
{
m_audioGrabber = grabber;
if (state() == Recorder::StoppedState)
m_audioGrabber = grabber;
}

AudioGrabber *Recorder::audioGrabber() const
Expand All @@ -52,57 +58,72 @@ Encoder *Recorder::encoder() const
return m_encoder;
}

Recorder::State Recorder::state() const
{
return m_state;
}

void Recorder::start()
{
if (!m_screenGrabber && !m_cameraGrabber && !m_audioGrabber) {
setError(tr("There are no any grabbers."));
return;
}
if (state() == Recorder::StoppedState) {
if (!m_screenGrabber && !m_cameraGrabber && !m_audioGrabber) {
setError(tr("There are no any grabbers."));
return;
}

m_encoder->start();
m_encoder->start();
}
}

void Recorder::pause()
{
AbstractImageGrabber *grabber = castImageGrabber();
if (state() == Recorder::ActiveState) {
AbstractImageGrabber *grabber = castImageGrabber();

if (grabber)
grabber->suspend();
if (grabber)
grabber->suspend();

if (m_audioGrabber)
m_audioGrabber->suspend();
if (m_audioGrabber)
m_audioGrabber->suspend();

setState(Recorder::SuspendedState);
}
}

void Recorder::resume()
{
AbstractImageGrabber *grabber = castImageGrabber();
if (state() == Recorder::SuspendedState) {
AbstractImageGrabber *grabber = castImageGrabber();

if (grabber)
grabber->resume();

if (grabber)
grabber->resume();
if (m_audioGrabber)
m_audioGrabber->resume();

if (m_audioGrabber)
m_audioGrabber->resume();
setState(Recorder::ActiveState);
}
}

void Recorder::stop()
{
AbstractImageGrabber *grabber = castImageGrabber();
if (state() != Recorder::StoppedState) {
AbstractImageGrabber *grabber = castImageGrabber();

if (grabber) {
qDebug()<<"Grabbed frames:"<<grabber->grabbedFrameCount();
grabber->stop();
}

if (m_audioGrabber) {
qDebug()<<"Grabbed audio data:"<<m_audioGrabber->grabbedAudioDataSize();
m_audioGrabber->stop();
}
if (grabber) {
grabber->stop();
}

qDebug()<<"Encoded frame count: "<<m_encoder->encodedFrameCount();
qDebug()<<"Encoded audio data: "<<m_encoder->encodedAudioDataSize();
if (m_audioGrabber) {
m_audioGrabber->stop();
grabber->setTimer(0);
delete m_timer;
}

m_encoder->stop();
m_encoder->stop();

setState(Recorder::StoppedState);
}
}

void Recorder::startGrabbers()
Expand All @@ -116,7 +137,8 @@ void Recorder::startGrabbers()
connect(m_cameraGrabber, SIGNAL(initialized()), m_audioGrabber, SLOT(start()));

if (m_audioGrabber) {
grabber->setTimer(new AudioTimer(m_audioGrabber, this));
m_timer = new AudioTimer(m_audioGrabber, this);
grabber->setTimer(m_timer);
}
}

Expand All @@ -139,6 +161,17 @@ void Recorder::startGrabbers()
return;
}
}

setState(Recorder::ActiveState);
}

void Recorder::setState(Recorder::State state)
{
if (m_state != state) {
m_state = state;

Q_EMIT stateChanged(state);
}
}

void Recorder::setError(const QString &errorString)
Expand Down
7 changes: 7 additions & 0 deletions src/helpers/recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class ScreenGrabber;
class CameraGrabber;
class AudioGrabber;
class Encoder;
class AudioTimer;

class QTMELSHARED_EXPORT Recorder : public QObject
{
Expand All @@ -33,19 +34,23 @@ class QTMELSHARED_EXPORT Recorder : public QObject

Encoder* encoder() const;

Recorder::State state() const;

public Q_SLOTS:
void start();
void pause();
void resume();
void stop();

Q_SIGNALS:
void stateChanged(Recorder::State state);
void error(const QString &errorString);

private Q_SLOTS:
void startGrabbers();

private:
void setState(Recorder::State state);
void setError(const QString &errorString);
void onGrabbersError();
AbstractImageGrabber* castImageGrabber() const;
Expand All @@ -54,6 +59,8 @@ private Q_SLOTS:
CameraGrabber *m_cameraGrabber;
AudioGrabber *m_audioGrabber;
Encoder *m_encoder;
AudioTimer *m_timer;
Recorder::State m_state;
};

#endif // RECORDER_H

0 comments on commit 4885d74

Please sign in to comment.