summaryrefslogtreecommitdiff
path: root/src/camera.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera.cc')
-rw-r--r--src/camera.cc131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/camera.cc b/src/camera.cc
new file mode 100644
index 0000000..574caf3
--- /dev/null
+++ b/src/camera.cc
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * camera.cc
+ *
+ * Fri Oct 29 12:46:38 CEST 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#include "camera.h"
+
+Camera::Camera(const char *ip, const int port)
+{
+ pthread_mutex_init (&mutex, NULL);
+ //mutex = PTHREAD_MUTEX_INITIALIZER;
+
+ AVFormatContext *ifmtctx;
+ AVFormatContext *ofmtctx;
+
+ running = 1;
+
+ int channel = 0;
+ char *device = "/dev/dv1394";
+
+ av_register_all();
+
+ encode_queue = new Queue<DVFrame>(); // infinite size
+ player_queue = new Queue<FFFrame>(1); // fixed size of 1
+
+ sem_init(&encode_sem, 0, 0);
+ sem_init(&player_sem, 0, 0);
+
+ decoder = new Decoder(device,
+ channel,
+ &encode_sem,
+ &player_sem,
+ encode_queue,
+ player_queue,
+ &mutex,
+ &running);
+ // ifmtctx = decoder->fc;
+ if(!decoder->fc) return;
+
+ encoder = new Encoder(ip, port,
+ &encode_sem,
+ encode_queue,
+ &mutex,
+ &running);
+ ofmtctx = encoder->fc;
+
+ player = new Player(&running,
+ &player_sem,
+ player_queue,
+ &mutex);
+
+ pthread_create (&decodetid, NULL, thread_run, decoder);
+ pthread_create (&encodetid, NULL, thread_run, encoder);
+ pthread_create (&playertid, NULL, thread_run, player);
+}
+
+Camera::~Camera()
+{
+ // Signal to the threads to stop
+ running = 0;
+
+ pthread_join(decodetid, NULL);
+ pthread_join(playertid, NULL);
+ pthread_join(encodetid, NULL);
+
+ delete decoder;
+ delete encoder;
+ delete player;
+
+ sem_destroy(&encode_sem);
+ sem_destroy(&player_sem);
+
+ delete player_queue;
+ delete encode_queue;
+}
+
+void Camera::setCpr(char *newcpr)
+{
+ encoder->setCpr(newcpr);
+}
+
+
+void Camera::start()
+{
+ encoder->stop();
+}
+
+void Camera::stop()
+{
+ encoder->start();
+}
+
+void Camera::freeze()
+{
+ player->stop();
+ encoder->freeze();
+}
+
+void Camera::unfreeze()
+{
+ player->start();
+}
+
+void Camera::snapshot()
+{
+ encoder->shoot();
+}
+
+#endif/* USE_GUI */