00001 #ifndef LB_STREAM_HEADER_H
00002 #define LB_STREAM_HEADER_H
00003
00004 #include<string>
00005 #include<vector>
00006
00007 #pragma GCC visibility push(default)
00008
00009
00010
00011
00012 namespace GRASP
00013 {
00014 namespace Ladybug
00015 {
00016 enum LadybugStippledFormat
00017 {
00018 LADYBUG_BGGR,
00019 LADYBUG_GBRG,
00020 LADYBUG_GRBG,
00021 LADYBUG_RGGB
00022 };
00023
00025 void VerifySignature(const uint8_t *data);
00026
00032 class StreamHeader
00033 {
00034 public:
00036 StreamHeader(const uint8_t *data);
00037 StreamHeader();
00039 virtual ~StreamHeader() {};
00040
00042 void InitHeader(const uint8_t *data);
00043
00045 void Print() const;
00046 uint32_t GetVersionNumber() const { return version_number_; }
00047 uint32_t GetFrameRate() const { return frame_rate_;}
00048 uint32_t GetBaseSerialNumber() const { return base_serial_number_;}
00049 uint32_t GetHeadSerialNumber() const { return head_serial_number_;}
00050 uint32_t GetPaddingBlockSize() const { return padding_block_size_;}
00051 uint32_t GetDataFormat() const { return data_format_;}
00052 uint32_t GetResolution() const { return resolution_;}
00053 uint32_t GetStippledFormat() const { return stippled_format_;}
00054 uint32_t GetConfigurationDataSize() const { return configuration_data_size_;}
00055 uint32_t GetNumberOfImages() const { return number_of_images_;}
00056 uint32_t GetNumberOfIndexEntried() const { return number_of_index_entries_;}
00057 uint32_t GetIncrement() const { return increment_;}
00058 uint32_t GetStreamDataOffset() const { return stream_data_offset_;}
00059 uint32_t GetGpsSummaryDataOffset() const { return gps_summary_data_offset_;}
00060 uint32_t GetGpsSummaryDataSize() const { return gps_summary_data_size_;}
00061 protected:
00062 uint32_t version_number_;
00063 uint32_t frame_rate_;
00064 uint32_t base_serial_number_;
00065 uint32_t head_serial_number_;
00066 uint32_t padding_block_size_;
00067 uint32_t data_format_;
00068 uint32_t resolution_;
00069 uint32_t stippled_format_;
00070 uint32_t configuration_data_size_;
00071 uint32_t number_of_images_;
00072 uint32_t number_of_index_entries_;
00073 uint32_t increment_;
00074 uint32_t stream_data_offset_;
00075 uint32_t gps_summary_data_offset_;
00076 uint32_t gps_summary_data_size_;
00077 std::vector<uint32_t> index_;
00078 };
00079
00085 class ImageHeader
00086 {
00087 public:
00088 ImageHeader();
00089 ImageHeader(const uint8_t *,fpos_t offset_in_file);
00090 ~ImageHeader() {};
00091
00093 void Init(const uint8_t *,fpos_t offset_in_file);
00094
00096 void Print() const;
00097
00098 uint32_t GetDataSize() const { return data_size_; }
00099 uint32_t GetFingerprint() const { return fingerprint_; }
00100 uint32_t GetVersionNumber() const { return version_number_; }
00101 uint32_t GetTimeSeconds() const { return time_s_; }
00102 uint32_t GetTimeMicroseconds() const { return time_us_; }
00103 uint32_t GetSequenceId() const { return sequence_id_; }
00104 uint32_t GetRefreshRate() const { return refresh_rate_; }
00105 uint32_t GetGain(uint32_t camera) const { if (camera<6) return gain_[camera]; else throw "Bad camera number"; }
00106 uint32_t GetWhiteBalance() const { return white_balance_; }
00107 uint32_t GetBayerGain() const { return bayer_gain_; }
00108 uint32_t GetBayerMap() const { return bayer_map_; }
00109 uint32_t GetBrightness() const { return brightness_; }
00110 uint32_t GetGamma() const { return gamma_; }
00111 uint32_t GetHeadSerialNumber() const { return head_serial_number_; }
00112 uint32_t GetShutter(uint32_t camera) const { if (camera<6) return shutter_[camera]; else throw "Bad camera number"; }
00114 uint32_t GetJpegDataOffset(int plane) const{ return jpeg_data_offset[plane]; }
00116 uint32_t GetJpegDataSize(int plane) const { return jpeg_data_size[plane]; }
00117
00118 fpos_t GetImageOffset() const { return offset_in_file_; }
00119 protected:
00120 uint32_t timestamp_;
00121 uint32_t data_size_;
00122 uint32_t fingerprint_;
00123 uint32_t version_number_;
00124 uint32_t time_s_;
00125 uint32_t time_us_;
00126 uint32_t sequence_id_;
00127 uint32_t refresh_rate_;
00128 uint32_t gain_[6];
00129 uint32_t white_balance_;
00130 uint32_t bayer_gain_;
00131 uint32_t bayer_map_;
00132 uint32_t brightness_;
00133 uint32_t gamma_;
00134 uint32_t head_serial_number_;
00135 uint32_t shutter_[6];
00136 uint32_t jpeg_data_offset[24];
00137 uint32_t jpeg_data_size[24];
00138 fpos_t offset_in_file_;
00139 };
00140
00141 class GpsSummaryData
00142 {
00143 public:
00144 GpsSummaryData(uint32_t number_of_items);
00145 GpsSummaryData(const std::vector<uint8_t> &data);
00146
00147 double GetLatitude(uint32_t image_number) const { return latitude_[image_number]; }
00148
00149 double GetLongitude(uint32_t image_number) const { return longitude_[image_number]; }
00150 double GetAltitude(uint32_t image_number) const { return altitude_[image_number]; }
00151
00152 uint32_t GetNumberOfItems() const { return number_of_items_; }
00153 uint32_t GetItemSize() const { return item_data_size_; }
00154
00155 uint32_t GetSizeBytes() const { return data_.size(); }
00156
00157 void SetGpsImage(uint32_t image_number,
00158 double lat,
00159 double lng,
00160 double alt);
00161
00162 void SetLatitude(uint32_t image_number);
00163 void SetLongitude(uint32_t image_number);
00164 void SetAltitude(uint32_t image_number);
00165
00166 protected:
00167 uint32_t number_of_items_;
00168 uint32_t item_data_size_;
00169 std::vector<double> latitude_;
00170 std::vector<double> longitude_;
00171 std::vector<double> altitude_;
00172 std::vector<uint8_t> data_;
00173 };
00174
00180 class StreamFile : public StreamHeader
00181 {
00182 public:
00188 StreamFile(std::string &file_name, bool read_calibration=true);
00189 StreamFile();
00190
00191 virtual ~StreamFile();
00192
00194 void InitStream(std::string &file_name,bool read_calibration);
00195
00199 std::string GetCalibrationData() const { return calibration_data_;}
00200
00212 ImageHeader GetImagePlanesJpeg(uint32_t image_number,uint32_t camera_number,
00213 std::vector<uint8_t> &C0,
00214 std::vector<uint8_t> &C1,
00215 std::vector<uint8_t> &C2,
00216 std::vector<uint8_t> &C3) const;
00218 void GetCalibrationData(std::string &calib_str) const { calib_str=calibration_data_; }
00219
00221 void CopyInsertGps(GpsSummaryData &gps, std::string &pgr_file_name) const;
00222 protected:
00224 void GetFrame(ImageHeader &image,uint32_t image_number) const;
00225
00231 void GetBayerPlaneJpeg(const GRASP::Ladybug::ImageHeader &image,
00232 uint32_t camera_number,uint32_t plane_number,
00233 std::vector<uint8_t> &plane) const;
00234
00235 std::string calibration_data_;
00236 FILE * stream_p_;
00237 uint8_t * header_p_;
00238 std::vector<uint8_t> image_header_;
00239
00240 GpsSummaryData *gps_summary_data_;
00241 };
00242
00243 }
00244
00245 }
00246 #pragma GCC visibility pop
00247 #endif
00248