imagebase.cc
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00022
00023
00024
00025
00026
00027
00029
00030 #include <stddef.h>
00031 #include <string.h>
00032 #include <assert.h>
00033 #include "imagebase.h"
00034 #include <libplayerxdr/playerxdr.h>
00035 #if HAVE_JPEGLIB_H
00036 #include <libplayerjpeg/playerjpeg.h>
00037 #endif
00038
00040
00041
00042 ImageBase::ImageBase(ConfigFile *cf, int section, bool overwrite_cmds, size_t queue_maxlen, int interf)
00043 : Driver(cf, section, overwrite_cmds, queue_maxlen, interf)
00044 {
00045 memset(&this->camera_addr, 0, sizeof(player_devaddr_t));
00046 stored_data.image = NULL;
00047 stored_data.image_count = 0;
00048 HaveData = false;
00049
00050
00051 if (cf->ReadDeviceAddr(&this->camera_addr, section, "requires",
00052 PLAYER_CAMERA_CODE, -1, NULL) != 0)
00053 {
00054 this->SetError(-1);
00055 return;
00056 }
00057
00058 }
00059
00060
00061 ImageBase::ImageBase(ConfigFile *cf, int section, bool overwrite_cmds, size_t queue_maxlen)
00062 : Driver(cf, section, overwrite_cmds, queue_maxlen)
00063 {
00064 memset(&this->camera_addr, 0, sizeof(player_devaddr_t));
00065 stored_data.image = NULL;
00066 stored_data.image_count = 0;
00067 HaveData = false;
00068
00069
00070 if (cf->ReadDeviceAddr(&this->camera_addr, section, "requires",
00071 PLAYER_CAMERA_CODE, -1, NULL) != 0)
00072 {
00073 this->SetError(-1);
00074 return;
00075 }
00076
00077 }
00078
00079
00081
00082 int ImageBase::Setup()
00083 {
00084
00085 if (Device::MatchDeviceAddress (camera_addr, device_addr))
00086 {
00087 PLAYER_ERROR ("attempt to subscribe to self");
00088 return -1;
00089 }
00090 if (!(camera_driver = deviceTable->GetDevice (camera_addr)))
00091 {
00092 PLAYER_ERROR ("unable to locate suitable camera device");
00093 return -1;
00094 }
00095 if (camera_driver->Subscribe (InQueue) != 0)
00096 {
00097 PLAYER_ERROR ("unable to subscribe to camera device");
00098 return -1;
00099 }
00100
00101 StartThread();
00102
00103 return 0;
00104 }
00105
00107
00108 int ImageBase::Shutdown()
00109 {
00110 StopThread();
00111
00112 camera_driver->Unsubscribe(InQueue);
00113
00114 return 0;
00115 }
00116
00118
00119 int ImageBase::ProcessMessage (QueuePointer &resp_queue, player_msghdr * hdr, void * data)
00120 {
00121 uint32_t new_image_count;
00122 player_camera_data_t * compdata = reinterpret_cast<player_camera_data_t *>(data);
00123
00124 assert(hdr);
00125 assert(compdata);
00126
00127 if(Message::MatchMessage (hdr, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, camera_addr))
00128 {
00129 Lock();
00130 if (!HaveData)
00131 {
00132 this->stored_data.width = (compdata->width);
00133 this->stored_data.height = (compdata->height);
00134 this->stored_data.fdiv = (compdata->fdiv);
00135 #if HAVE_JPEGLIB_H
00136 if (compdata->compression != PLAYER_CAMERA_COMPRESS_JPEG)
00137 {
00138 #endif
00139 this->stored_data.compression = (compdata->compression);
00140 this->stored_data.format = (compdata->format);
00141 this->stored_data.bpp = (compdata->bpp);
00142 if ((this->stored_data.image_count) != (compdata->image_count))
00143 {
00144 this->stored_data.image_count = (compdata->image_count);
00145 if (this->stored_data.image) delete [](this->stored_data.image);
00146 this->stored_data.image = NULL;
00147 if (this->stored_data.image_count)
00148 {
00149 this->stored_data.image = new uint8_t[this->stored_data.image_count];
00150 assert(this->stored_data.image);
00151 }
00152 }
00153 if (this->stored_data.image_count)
00154 {
00155 assert(this->stored_data.image);
00156 memcpy(this->stored_data.image, compdata->image, this->stored_data.image_count);
00157 }
00158 #if HAVE_JPEGLIB_H
00159 } else
00160 {
00161 this->stored_data.compression = PLAYER_CAMERA_COMPRESS_RAW;
00162 this->stored_data.format = PLAYER_CAMERA_FORMAT_RGB888;
00163 this->stored_data.bpp = 24;
00164 new_image_count = (this->stored_data.width) * (this->stored_data.height) * 3;
00165 if ((this->stored_data.image_count) != new_image_count)
00166 {
00167 this->stored_data.image_count = new_image_count;
00168 if (this->stored_data.image) delete [](this->stored_data.image);
00169 this->stored_data.image = NULL;
00170 if (this->stored_data.image_count)
00171 {
00172 this->stored_data.image = new uint8_t[this->stored_data.image_count];
00173 assert(this->stored_data.image);
00174 }
00175 }
00176 if (this->stored_data.image_count)
00177 {
00178 assert(this->stored_data.image);
00179 jpeg_decompress(reinterpret_cast<unsigned char *>(this->stored_data.image),
00180 this->stored_data.image_count,
00181 reinterpret_cast<unsigned char *>(compdata->image),
00182 compdata->image_count);
00183 }
00184 }
00185 #endif
00186 HaveData = true;
00187 }
00188 Unlock();
00189 return 0;
00190 }
00191 return -1;
00192 }
00193
00194 void ImageBase::Main()
00195 {
00196 for(;;)
00197 {
00198 pthread_testcancel();
00199
00200 InQueue->Wait();
00201
00202 ProcessMessages();
00203
00204 Lock();
00205 if (HaveData)
00206 {
00207 Unlock();
00208 ProcessFrame();
00209 Lock();
00210 HaveData = false;
00211 }
00212 Unlock();
00213 }
00214
00215 }
Last updated 12 September 2005 21:38:45
|