From 837ca942fafaf9a4a1f69c6d595616a92ebeb203 Mon Sep 17 00:00:00 2001
From: deva <deva>
Date: Mon, 2 May 2005 09:50:22 +0000
Subject: Rewrote freeze, shoot and record flags, from encoder to frame.

---
 TODO           |  5 +++--
 src/camera.cc  | 32 ++++++++++++++++++++++---------
 src/decoder.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/decoder.h  | 12 ++++++++++++
 src/encoder.cc | 40 ++++++++++++++++++++++++---------------
 src/encoder.h  | 13 ++++++++-----
 src/frame.h    |  7 +++++++
 7 files changed, 136 insertions(+), 32 deletions(-)

diff --git a/TODO b/TODO
index 8b7ce4c..a14cf28 100644
--- a/TODO
+++ b/TODO
@@ -5,7 +5,7 @@
 
 MessageBox:
  [x]	- Make it.
- [/]	- Make icons.
+ [x]	- Make icons.
  [ ]	- Test it.
 
 SplashScreen:
@@ -20,7 +20,7 @@ Mainwindow:
  [ ]	- Show network connection status in statusbar.
  [ ]	- Show camera connection status in statusbar.
  [x]	- Save movie messagebox (yes/no/dunno)
- [ ]	- Create snapshot thumbnails from dv stream instead of the widget.
+ [x]	- Create snapshot thumbnails from dv stream instead of the widget.
  [ ]	- Test it.
 
 CPRQueryDialog:
@@ -42,6 +42,7 @@ Decoder:
  [ ]	- Enable sound decoding for the network stream.
  [x]	- Remove ffmpeg code.
  [x]	- Make use of 2.6 kernel (through raw1394)
+ [ ]	- Set flags on frame objects.
 
 Camera:
  [x]	- Add initialize method (constructor should do nothing).
diff --git a/src/camera.cc b/src/camera.cc
index 6300946..e7994f6 100644
--- a/src/camera.cc
+++ b/src/camera.cc
@@ -27,6 +27,9 @@
  */
 /*
  * $Log$
+ * Revision 1.10  2005/05/02 09:50:22  deva
+ * Rewrote freeze, shoot and record flags, from encoder to frame.
+ *
  * Revision 1.9  2005/05/01 11:25:56  deva
  * Added code to read screenshot from frame queue, decode it to rgb and put it into a qimage.
  *
@@ -149,23 +152,30 @@ void Camera::setCpr(char *newcpr)
 
 void Camera::start()
 {
-  if(initialized) encoder->start();
-  else errorstatus->pushError("Camera not initialized.");
+  if(initialized) {
+    decoder->start();
+    encoder->start();
+  } else {
+    errorstatus->pushError("Camera not initialized.");
+  }
 }
 
 void Camera::stop(n_savestate save)
 {
-  if(initialized) encoder->stop(save);
-  else errorstatus->pushError("Camera not initialized.");
+  if(initialized) {
+    decoder->stop(save);
+    encoder->stop(save);
+  } else {
+    errorstatus->pushError("Camera not initialized.");
+  }
 }
 
 void Camera::freeze()
 {
-  // FIXME: Ensure they freeze the same frame, i.e. the player 
-  //        shows the same frame that is actually frozen on the server.
   if(initialized) {
     player->stop();
-    encoder->freeze();
+    //    encoder->freeze();
+    decoder->freeze();
   } else {
     errorstatus->pushError("Camera not initialized.");
   }
@@ -179,8 +189,12 @@ void Camera::unfreeze()
 
 void Camera::snapshot(unsigned char *rgb)
 {
-  if(initialized) encoder->shoot(rgb);
-  else errorstatus->pushError("Camera not initialized.");
+  if(initialized) {
+    decoder->shoot(rgb);
+    encoder->shoot(rgb);
+  } else {
+    errorstatus->pushError("Camera not initialized.");
+  }
 }
 
 Error *Camera::errorObject()
diff --git a/src/decoder.cc b/src/decoder.cc
index 2ab3b6b..4707c90 100644
--- a/src/decoder.cc
+++ b/src/decoder.cc
@@ -25,6 +25,9 @@
  */
 /*
  * $Log$
+ * Revision 1.22  2005/05/02 09:50:22  deva
+ * Rewrote freeze, shoot and record flags, from encoder to frame.
+ *
  * Revision 1.21  2005/05/01 09:56:26  deva
  * Added Id and Log tags to all files
  *
@@ -60,6 +63,7 @@ Decoder::Decoder(Error* err,
   player_queue = gplayer_queue;
   mutex = gmutex;
   running = grunning;
+  b_record = false; // Initially no recording is done.
 }
 
 Decoder::~Decoder()
@@ -68,6 +72,10 @@ Decoder::~Decoder()
 
 void Decoder::decode()
 {
+  bool local_shoot;
+  bool local_freeze;
+  bool local_record;
+
   dv1394 dv_stream = dv1394(errobj); // Use default port and channel.
 
   while(*running) {
@@ -78,10 +86,25 @@ void Decoder::decode()
     // Read a dvframe
     ptr = dv_stream.readFrame();
     if(!ptr) return; // No frame read. (Due to firewire error)
+
+    local_shoot = b_shoot;
+    b_shoot = false;
+    local_freeze = b_freeze;
+    b_freeze = false;
+    local_record = b_record;
+
     Frame *eframe = new Frame(ptr, DVPACKAGE_SIZE);
+    eframe->shoot = local_shoot;
+    eframe->freeze = local_freeze;
+    eframe->record = local_record;
+    
     Frame *pframe = new Frame(ptr, DVPACKAGE_SIZE);
-    free(ptr);
+    pframe->shoot = local_shoot;
+    pframe->freeze = local_freeze;
+    pframe->record = local_record;
 
+    free(ptr);
+    
     encode_queue->push(eframe);
     player_queue->push(pframe);
     
@@ -104,4 +127,38 @@ void Decoder::run() {
   fprintf(stderr, "Decoder thread stopped.\n"); fflush(stderr);
 }
 
+/*
+ * Set freeze bit on current frame.
+ */
+void Decoder::freeze()
+{  
+  b_freeze = true;
+}
+
+
+/*
+ * Set shoot bit on current frame.
+ */
+void Decoder::shoot(unsigned char *rgb)
+{
+  b_shoot = true;
+}
+
+/*
+ * Set the record bit to true in all following frames.
+ */
+void Decoder::start()
+{
+  b_record = true;
+}
+
+/*
+ * Set the record bit to false in all following frames.
+ */
+void Decoder::stop(n_savestate save)
+{
+  b_record = false;
+}
+
+
 #endif /*USE_GUI*/
diff --git a/src/decoder.h b/src/decoder.h
index a7e2b76..cc1ac22 100644
--- a/src/decoder.h
+++ b/src/decoder.h
@@ -24,6 +24,9 @@
  */
 /*
  * $Log$
+ * Revision 1.9  2005/05/02 09:50:22  deva
+ * Rewrote freeze, shoot and record flags, from encoder to frame.
+ *
  * Revision 1.8  2005/05/01 09:56:26  deva
  * Added Id and Log tags to all files
  *
@@ -59,7 +62,16 @@ public:
   ~Decoder();
   void run();
 
+  void freeze();
+  void shoot(unsigned char *rgb);
+  void start();
+  void stop(n_savestate save);
+
 private:
+  volatile bool b_freeze;
+  volatile bool b_shoot;
+  volatile bool b_record;
+
   Error *errobj;
   AVCodecContext dvcodec;
 
diff --git a/src/encoder.cc b/src/encoder.cc
index d1d9362..cbafb99 100644
--- a/src/encoder.cc
+++ b/src/encoder.cc
@@ -25,6 +25,9 @@
  */
 /*
  * $Log$
+ * Revision 1.21  2005/05/02 09:50:22  deva
+ * Rewrote freeze, shoot and record flags, from encoder to frame.
+ *
  * Revision 1.20  2005/05/02 09:18:13  deva
  *
  * Fixed decoding problem in snapshot thumbnails.
@@ -70,17 +73,17 @@ Encoder::Encoder(Error* err,
   mutex = gmutex;
   running = grunning;
 
-  record = 0;
+  //  record = 0;
 
  	sem_init(&record_sem, 0, 0);
 
   s = NULL;
   n = NULL;
 
-  shoot_request = 0;
-  shoot_value = 0;
-  freeze_request = 0;
-  freeze_value = 0;
+  //  shoot_request = 0;
+  //  shoot_value = 0;
+  //  freeze_request = 0;
+  //  freeze_value = 0;
 }
 
 
@@ -101,20 +104,25 @@ void Encoder::encode()
     frame = queue->pop();
     
     if(frame) {
+      /*
       if(record || 
          (freeze_request != freeze_value) || 
          (shoot_request != shoot_value)) {
+      */
+      if(frame->record || 
+         frame->freeze || 
+         frame->shoot) {
         n_header h;
       
         h.header_type = DATA_HEADER;
         sprintf(h.header.h_data.cpr, cpr);
-        h.header.h_data.freeze = (freeze_request != freeze_value);
-        h.header.h_data.snapshot = (shoot_request != shoot_value);
-        h.header.h_data.record = record;
+        h.header.h_data.freeze = frame->freeze;
+        h.header.h_data.snapshot = frame->shoot;
+        h.header.h_data.record = frame->record;
         h.header.h_data.savestate = NO_CHANGE;
         
-        if(freeze_request != freeze_value) freeze_value = freeze_request;
-        if(shoot_request != shoot_value) shoot_value = shoot_request;
+        //        if(freeze_request != freeze_value) freeze_value = freeze_request;
+        //        if(shoot_request != shoot_value) shoot_value = shoot_request;
         
         n->sendPackage(&h, frame->data, frame->size);
       }
@@ -137,7 +145,7 @@ void Encoder::freeze()
     s->sconnect(ip);
     n = new Network(s, errobj);
   }
-  if(!errobj->hasError()) freeze_request = 1 - freeze_request;
+  //  if(!errobj->hasError()) freeze_request = 1 - freeze_request;
 }
 
 
@@ -153,7 +161,7 @@ void Encoder::shoot(unsigned char *rgb)
     s->sconnect(ip);
     n = new Network(s, errobj);
   }
-  if(!errobj->hasError()) shoot_request = 1 - shoot_request;
+  //  if(!errobj->hasError()) shoot_request = 1 - shoot_request;
   getScreenshot(rgb);
 }
 
@@ -170,11 +178,12 @@ void Encoder::start() {
     s->sconnect(ip);
     n = new Network(s, errobj);
   }
-  if(!errobj->hasError()) record = 1;
+  //  if(!errobj->hasError()) record = 1;
 }
 
 
 void Encoder::stop(n_savestate save) {
+/*
   struct timespec ts;
   // TODO: set save state in package header.
 
@@ -182,8 +191,8 @@ void Encoder::stop(n_savestate save) {
   queue->lock();
   fprintf(stderr, "Emptying queue"); fflush(stderr);
   while(queue->peek()) {
-    /* Remove any late buffer */
-    /* We don't care, the encoder finishes them all */
+    // Remove any late buffer
+    // We don't care, the encoder finishes them all
     ts.tv_sec = 0;
     ts.tv_nsec = 500000000L;	// 100ms
     fprintf(stderr, "."); fflush(stderr);
@@ -194,6 +203,7 @@ void Encoder::stop(n_savestate save) {
   record = 0;
 
   queue->unlock();
+*/
   if(s) {
     if(n) delete n;
     delete s;
diff --git a/src/encoder.h b/src/encoder.h
index 31aec20..0d84825 100644
--- a/src/encoder.h
+++ b/src/encoder.h
@@ -24,6 +24,9 @@
  */
 /*
  * $Log$
+ * Revision 1.9  2005/05/02 09:50:22  deva
+ * Rewrote freeze, shoot and record flags, from encoder to frame.
+ *
  * Revision 1.8  2005/05/01 11:25:56  deva
  * Added code to read screenshot from frame queue, decode it to rgb and put it into a qimage.
  *
@@ -95,12 +98,12 @@ private:
   char ip[32];
   char cpr[32];
 
-  volatile int record;
+  //  volatile int record;
 
-  volatile int shoot_request;
-  int shoot_value;
-  volatile int freeze_request;
-  int freeze_value;
+  //  volatile int shoot_request;
+  //  int shoot_value;
+  //  volatile int freeze_request;
+  //  int freeze_value;
   
   sem_t	record_sem;
   void encode();
diff --git a/src/frame.h b/src/frame.h
index a10a934..2ef53ff 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -27,6 +27,9 @@
  */
 /*
  * $Log$
+ * Revision 1.4  2005/05/02 09:50:22  deva
+ * Rewrote freeze, shoot and record flags, from encoder to frame.
+ *
  * Revision 1.3  2005/05/01 09:56:26  deva
  * Added Id and Log tags to all files
  *
@@ -42,6 +45,10 @@ public:
   
   unsigned char *data;
   int size;
+
+  bool shoot;
+  bool freeze;
+  bool record;
 };
 
 #endif/*__FRAME_H__*/
-- 
cgit v1.2.3