Update of /cvsroot/playerstage/code/player/server/drivers/camera/compress
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29456/compress

Modified Files:
        cameracompress.cc camerauncompress.cc 
Log Message:
refactored camera compress drivers to remove unnecessary locking etc


Index: cameracompress.cc
===================================================================
RCS file: 
/cvsroot/playerstage/code/player/server/drivers/camera/compress/cameracompress.cc,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** cameracompress.cc   10 Feb 2007 17:46:18 -0000      1.14
--- cameracompress.cc   31 Jul 2007 03:53:40 -0000      1.15
***************
*** 108,114 ****
    private: virtual void Main();
    
!   //private: int UpdateCamera();
!   private: void WriteData();
!   private: void SaveFrame(const char *filename);
  
    // Input camera device
--- 108,112 ----
    private: virtual void Main();
    
!   private: void ProcessImage(player_camera_data_t & rawdata);
  
    // Input camera device
***************
*** 120,127 ****
      double camera_time;
      bool camera_subscribed;
-     bool NewCamData;
        
!     // Acquired camera data
!     player_camera_data_t camera_data;
      char converted[PLAYER_CAMERA_IMAGE_SIZE];
  
--- 118,123 ----
      double camera_time;
      bool camera_subscribed;
        
!     // scratch for converted data camera data
      char converted[PLAYER_CAMERA_IMAGE_SIZE];
  
***************
*** 166,172 ****
    this->quality = cf->ReadFloat(section, "image_quality", 0.8);
  
-   // camera settings
-   this->NewCamData = false;
- 
    return;
  }
--- 162,165 ----
***************
*** 217,236 ****
    if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_DATA, 
PLAYER_CAMERA_DATA_STATE, camera_id))
    {
!     assert(hdr->size >= sizeof(this->camera_data)-sizeof(camera_data.image));
!     Lock();
      player_camera_data_t * recv = reinterpret_cast<player_camera_data_t * > 
(data);
!     camera_data.width = recv->width;
!     camera_data.height = recv->height;
!     camera_data.bpp = recv->bpp;
!     camera_data.format = recv->format;
!     camera_data.fdiv = recv->fdiv;
!     camera_data.compression = recv->compression;
!     camera_data.image_count = recv->image_count;
!     memcpy(camera_data.image, recv->image, recv->image_count);
!     this->NewCamData=true;
!     Unlock();
!     if (this->camera_data.compression != PLAYER_CAMERA_COMPRESS_RAW)
        PLAYER_WARN("compressing already compressed camera images (not good)");
!       
      return 0;
    }
--- 210,221 ----
    if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_DATA, 
PLAYER_CAMERA_DATA_STATE, camera_id))
    {
!     assert(hdr->size >= sizeof(player_camera_data_t));
      player_camera_data_t * recv = reinterpret_cast<player_camera_data_t * > 
(data);
!     if (recv->compression != PLAYER_CAMERA_COMPRESS_RAW)
!     {
        PLAYER_WARN("compressing already compressed camera images (not good)");
!       return -1;
!     }
!     ProcessImage(*recv);
      return 0;
    }
***************
*** 241,253 ****
  void CameraCompress::Main()
  {
-   size_t size;
-   char filename[256];
-   char * ptr, * ptr1;
-   int i, l;
- 
    while (true)
    {
      // Let the camera driver update this thread
-     //this->camera->Wait();
      InQueue->Wait();
  
--- 226,232 ----
***************
*** 255,345 ****
      pthread_testcancel();
  
!       ProcessMessages();
! 
!     // Get the latest camera data
!     if (NewCamData)
!     {
!       switch (this->camera_data.bpp)
!       {
!       case 8:
!         l = (this->camera_data.width) * (this->camera_data.height);
!       ptr = this->converted; ptr1 = (char *)(this->camera_data.image);
!       for (i = 0; i < l; i++)
!       {
!         ptr[0] = *ptr1;
!         ptr[1] = *ptr1;
!         ptr[2] = *ptr1;
!         ptr += 3; ptr1++;
!       }
!       ptr = this->converted;
!       break;
!       case 24:
!         ptr = (char *)(this->camera_data.image);
!       break;
!       case 32:
!         l = (this->camera_data.width) * (this->camera_data.height);
!       ptr = this->converted; ptr1 = (char *)(this->camera_data.image);
!       for (i = 0; i < l; i++)
!       {
!           ptr[0] = ptr1[0];
!           ptr[1] = ptr1[1];
!         ptr[2] = ptr1[2];
!         ptr += 3; ptr1 += 4;
!         }
!         ptr = this->converted;
!       break;
!       default:
!         PLAYER_WARN("unsupported image depth (not good)");
!         return;
!       }
!       this->data.image_count = jpeg_compress( (char*)this->data.image, 
!                                              ptr,
!                                              this->camera_data.width, 
!                                              this->camera_data.height,
!                                              PLAYER_CAMERA_IMAGE_SIZE, 
!                                              (int)(this->quality*100));
! 
!       if (this->save)
!       {
!         snprintf(filename, sizeof(filename), 
"click-%04d.ppm",this->frameno++);
!         FILE *fp = fopen(filename, "w+");
!         fwrite (this->data.image, 1, this->data.image_count, fp);
!         fclose(fp);
!       }
! 
!       size = sizeof(this->data) - sizeof(this->data.image) + 
this->data.image_count;
! 
!       this->data.width = (this->camera_data.width);
!       this->data.height = (this->camera_data.height);
!       this->data.bpp = 24;
!       this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
!       this->data.compression = PLAYER_CAMERA_COMPRESS_JPEG;
!       this->data.image_count = (this->data.image_count);
!       
!       Publish(device_addr, NULL, PLAYER_MSGTYPE_DATA, 
PLAYER_CAMERA_DATA_STATE, (void*) &this->data, size, &this->camera_time);
!     }
    }
    return;
  }
! /*
! int CameraCompress::UpdateCamera()
  {
    size_t size;
  
!   // Get the camera data.
!   size = this->camera->GetData(this->camera_id, 
!                                &this->camera_data,
!                                sizeof(this->camera_data), &this->camera_time);
!   
!   // Do some byte swapping
!   this->camera_data.width = ntohs(this->camera_data.width);
!   this->camera_data.height = ntohs(this->camera_data.height); 
!   this->camera_data.bpp = this->camera_data.bpp;
!   this->camera_data.format = this->camera_data.format;
!   this->camera_data.image_size = ntohl(this->camera_data.image_size);
  
!   if (this->camera_data.compression != PLAYER_CAMERA_COMPRESS_RAW)
!     PLAYER_WARN("compressing already compressed camera images (not good)");
  
!   return 1;
! }*/
--- 234,309 ----
      pthread_testcancel();
  
!     ProcessMessages();
    }
    return;
  }
! 
! void CameraCompress::ProcessImage(player_camera_data_t & rawdata)
  {
    size_t size;
+   char filename[256];
+   char * ptr, * ptr1;
+   int i, l;
  
!   switch (rawdata.bpp)
!   {
!   case 8:
!     l = (rawdata.width) * (rawdata.height);
!     ptr = this->converted; 
!     ptr1 = (char *)(rawdata.image);
!     for (i = 0; i < l; i++)
!     {
!       ptr[0] = *ptr1;
!       ptr[1] = *ptr1;
!       ptr[2] = *ptr1;
!       ptr += 3; ptr1++;
!     }
!     ptr = this->converted;
!     break;
!   case 24:
!     ptr = (char *)(rawdata.image);
!     break;
!   case 32:
!     l = (rawdata.width) * (rawdata.height);
!     ptr = this->converted; 
!     ptr1 = (char *)(rawdata.image);
!     for (i = 0; i < l; i++)
!     {
!       ptr[0] = ptr1[0];
!       ptr[1] = ptr1[1];
!       ptr[2] = ptr1[2];
!       ptr += 3; ptr1 += 4;
!     }
!     ptr = this->converted;
!     break;
!   default:
!     PLAYER_WARN("unsupported image depth (not good)");
!     return;
!   }
!   this->data.image_count = jpeg_compress( (char*)this->data.image, 
!                                           ptr,
!                                           rawdata.width, 
!                                           rawdata.height,
!                                           PLAYER_CAMERA_IMAGE_SIZE, 
!                                           (int)(this->quality*100));
  
!   if (this->save)
!   {
!     snprintf(filename, sizeof(filename), "click-%04d.ppm",this->frameno++);
!     FILE *fp = fopen(filename, "w+");
!     fwrite (this->data.image, 1, this->data.image_count, fp);
!     fclose(fp);
!   }
  
!   size = sizeof(this->data) - sizeof(this->data.image) + 
this->data.image_count;
! 
!   this->data.width = (rawdata.width);
!   this->data.height = (rawdata.height);
!   this->data.bpp = 24;
!   this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
!   this->data.compression = PLAYER_CAMERA_COMPRESS_JPEG;
!   this->data.image_count = (this->data.image_count);
!   
!   Publish(device_addr, NULL, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, 
(void*) &this->data, size, &this->camera_time);
! 
! }

Index: camerauncompress.cc
===================================================================
RCS file: 
/cvsroot/playerstage/code/player/server/drivers/camera/compress/camerauncompress.cc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** camerauncompress.cc 2 May 2006 10:26:28 -0000       1.1
--- camerauncompress.cc 31 Jul 2007 03:53:40 -0000      1.2
***************
*** 104,110 ****
    private: virtual void Main();
    
!   //private: int UpdateCamera();
!   private: void WriteData();
!   private: void SaveFrame(const char *filename);
  
    // Input camera device
--- 104,108 ----
    private: virtual void Main();
    
!   private: void ProcessImage(player_camera_data_t & compdata);
  
    // Input camera device
***************
*** 119,126 ****
        
      // Acquired camera data
-     player_camera_data_t camera_data;
      char converted[PLAYER_CAMERA_IMAGE_SIZE];
  
!     // Output (compressed) camera data
      private: player_camera_data_t data;
  
--- 117,123 ----
        
      // Acquired camera data
      char converted[PLAYER_CAMERA_IMAGE_SIZE];
  
!     // Output (uncompressed) camera data
      private: player_camera_data_t data;
  
***************
*** 158,164 ****
    this->save = cf->ReadInt(section,"save",0);
  
-   // camera settings
-   this->NewCamData = false;
- 
    return;
  }
--- 155,158 ----
***************
*** 209,227 ****
    if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_DATA, 
PLAYER_CAMERA_DATA_STATE, camera_id))
    {
!     assert(hdr->size >= sizeof(this->camera_data)-sizeof(camera_data.image));
!     if (this->camera_data.compression != PLAYER_CAMERA_COMPRESS_JPEG)
!       PLAYER_WARN("uncompressing raw camera images (not good)");
!     Lock();
!     if (this->NewCamData)
!     {
!       Unlock();
!       return 0;
!     }
!     else
      {
!         memcpy(&camera_data, data, hdr->size);
!       this->NewCamData=true;
!           Unlock();
      }
      return 0;
    }
--- 203,214 ----
    if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_DATA, 
PLAYER_CAMERA_DATA_STATE, camera_id))
    {
!     assert(hdr->size >= sizeof(player_camera_data_t));
!     player_camera_data_t * camera_data = 
reinterpret_cast<player_camera_data_t *> (data);
!     if (camera_data->compression != PLAYER_CAMERA_COMPRESS_JPEG)
      {
!       PLAYER_WARN("uncompressing raw camera images (not good)");
!       return -1;
      }
+     ProcessImage(*camera_data);
      return 0;
    }
***************
*** 232,242 ****
  void CameraUncompress::Main()
  {
-   size_t size;
-   char filename[256];
- 
    while (true)
    {
      // Let the camera driver update this thread
-     //this->camera->Wait();
      InQueue->Wait();
  
--- 219,225 ----
***************
*** 244,283 ****
      pthread_testcancel();
  
!       ProcessMessages();
  
-     // Get the latest camera data
-     Lock();
-     if (NewCamData)
-     {
-       Unlock();
-       jpeg_decompress( (unsigned char*)this->data.image, 
-                                                                               
        PLAYER_CAMERA_IMAGE_SIZE,
-                                              this->camera_data.image,
-                                              this->camera_data.image_count);
  
!       if (this->save)
!       {
!         snprintf(filename, sizeof(filename), 
"click-%04d.ppm",this->frameno++);
!         FILE *fp = fopen(filename, "w+");
!         fwrite (this->data.image, 1, this->data.image_count, fp);
!         fclose(fp);
!       }
  
!       size = sizeof(this->data) - sizeof(this->data.image) + 
this->data.image_count;
  
!       this->data.width = (this->camera_data.width);
!       this->data.height = (this->camera_data.height);
!       this->data.image_count = data.width*data.height*3;
!       this->data.bpp = 24;
!       this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
!       this->data.compression = PLAYER_CAMERA_COMPRESS_RAW;
!       
!       Publish(device_addr, NULL, PLAYER_MSGTYPE_DATA, 
PLAYER_CAMERA_DATA_STATE, (void*) &this->data, size, &this->camera_time);
!       Lock();
!       NewCamData = false;
!     }
!     Unlock();
    }
-   return;
- }
  
--- 227,264 ----
      pthread_testcancel();
  
!     ProcessMessages();
!   }
!   return;
! }
  
  
! void CameraUncompress::ProcessImage(player_camera_data_t & compdata)
! {
!   size_t size;
!   char filename[256];
  
!   jpeg_decompress( (unsigned char*)this->data.image, 
!                     PLAYER_CAMERA_IMAGE_SIZE,
!                     compdata.image,
!                     compdata.image_count);
  
!   if (this->save)
!   {
!     snprintf(filename, sizeof(filename), "click-%04d.ppm",this->frameno++);
!     FILE *fp = fopen(filename, "w+");
!     fwrite (this->data.image, 1, this->data.image_count, fp);
!     fclose(fp);
    }
  
+   size = sizeof(this->data) - sizeof(this->data.image) + 
this->data.image_count;
+ 
+   this->data.width = (compdata.width);
+   this->data.height = (compdata.height);
+   this->data.image_count = data.width*data.height*3;
+   this->data.bpp = 24;
+   this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
+   this->data.compression = PLAYER_CAMERA_COMPRESS_RAW;
+   
+   Publish(device_addr, NULL, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, 
(void*) &this->data, size, &this->camera_time);
+ 
+ }


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to