IDS peak IPL  v1.6.0
peak_ipl_video_writer.hpp
Go to the documentation of this file.
1 
11 #pragma once
12 
18 
19 #include <cstdint>
20 #include <memory>
21 #include <string>
22 #include <utility>
23 
24 namespace peak
25 {
26 namespace ipl
27 {
28 
29 class VideoWriter;
30 
31 namespace encoder
32 {
33 
37 class IEncoder
38 {
39  friend class peak::ipl::VideoWriter;
40 
41 protected:
43 
45  {
46  this->m_handle = handle;
47  }
48 
49 public:
50  IEncoder() = default;
51  virtual ~IEncoder() = default;
52  virtual PEAK_IPL_VIDEO_ENCODER Id() = 0;
53 
65  void SetOption(PEAK_IPL_VIDEO_ENCODER_OPTION option, const void* value, size_t count)
66  {
68  [&] { return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_VideoWriter_Encoder_SetOption(m_handle, option, value, count); });
69  }
70 
83  void GetOption(PEAK_IPL_VIDEO_ENCODER_OPTION option, void* value, size_t count, size_t* outCount)
84  {
86  return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_VideoWriter_Encoder_GetOption(m_handle, option, value, count, outCount);
87  });
88  }
89 
102  void OptionRange(PEAK_IPL_VIDEO_ENCODER_OPTION option, void* min, void* max, void* inc)
103  {
106  });
107  }
108 };
109 
110 static std::unique_ptr<IEncoder> Create(PEAK_IPL_VIDEO_ENCODER encoder);
111 
116 class MJPEGEncoder : public IEncoder
117 {
118  friend std::unique_ptr<IEncoder> Create(PEAK_IPL_VIDEO_ENCODER encoder);
119 
120  MJPEGEncoder() = default;
121 
122 public:
123  MJPEGEncoder(const MJPEGEncoder&) = delete;
124  MJPEGEncoder(MJPEGEncoder&&) = default;
125 
126  MJPEGEncoder& operator=(const MJPEGEncoder&) = delete;
127  MJPEGEncoder& operator=(MJPEGEncoder&&) = default;
128 
134  {
136  }
137 
147  void SetQuality(uint32_t quality)
148  {
149  SetOption(PEAK_IPL_VIDEO_ENCODER_OPTION_QUALITY, &quality, sizeof(quality));
150  }
151 
159  uint32_t GetQuality()
160  {
161  uint32_t quality = 0;
162  GetOption(PEAK_IPL_VIDEO_ENCODER_OPTION_QUALITY, &quality, sizeof(quality), nullptr);
163  return quality;
164  }
165 
174  {
175  double min = 0, max = 0, inc = 0;
177  return { min, max, inc };
178  }
179 };
180 
189 static inline std::vector<PEAK_IPL_VIDEO_ENCODER> GetSupportedEncodersForAContainer(PEAK_IPL_VIDEO_CONTAINER container)
190 {
191  size_t length{};
194  });
195  std::vector<PEAK_IPL_VIDEO_ENCODER> encoders(length);
198  container, encoders.data(), &length);
199  });
200  return encoders;
201 }
202 
211 static inline std::vector<PixelFormatName> GetSupportedPixelFormats(PEAK_IPL_VIDEO_ENCODER encoder)
212 {
213  size_t sizeOfData{};
216  });
217  std::vector<PixelFormatName> formats(sizeOfData);
220  encoder, reinterpret_cast<PEAK_IPL_PIXEL_FORMAT*>(formats.data()), &sizeOfData);
221  });
222  return formats;
223 }
224 
234 static inline std::unique_ptr<IEncoder> Create(PEAK_IPL_VIDEO_ENCODER encoder)
235 {
236  switch (encoder)
237  {
239  return std::unique_ptr<MJPEGEncoder>(new MJPEGEncoder());
240  default:
241  throw InvalidArgumentException("The supplied encoder is not a valid value!");
242  }
243 
244 }
245 
246 } // namespace encoder
247 
248 namespace container
249 {
250 
255 {
257 
258 protected:
261  {
262  this->m_handle = handle;
263  }
264 
265 public:
266  IContainer() = default;
267  virtual ~IContainer() = default;
268  virtual PEAK_IPL_VIDEO_CONTAINER Id() = 0;
269 
281  void SetOption(PEAK_IPL_VIDEO_CONTAINER_OPTION option, const void* value, size_t count)
282  {
285  });
286  }
287 
300  void GetOption(PEAK_IPL_VIDEO_CONTAINER_OPTION option, void* value, size_t count, size_t* outCount)
301  {
304  m_handle, option, value, count, outCount);
305  });
306  }
307 
320  void OptionRange(PEAK_IPL_VIDEO_CONTAINER_OPTION option, void* min, void* max, void* inc)
321  {
324  });
325  }
326 };
327 
328 static std::unique_ptr<IContainer> Create(PEAK_IPL_VIDEO_CONTAINER container);
329 
334 class AVIContainer : public IContainer
335 {
336  friend std::unique_ptr<IContainer> Create(PEAK_IPL_VIDEO_CONTAINER container);
337  AVIContainer() = default;
338 
339 public:
340  AVIContainer(const AVIContainer&) = delete;
341  AVIContainer(AVIContainer&&) = default;
342 
343  AVIContainer& operator=(const AVIContainer&) = delete;
344  AVIContainer& operator=(AVIContainer&&) = default;
345 
351  {
353  }
354 
364  void SetFramerate(double fps)
365  {
367  }
368 
376  double GetFramerate()
377  {
378  double fps = 0;
379  GetOption(PEAK_IPL_VIDEO_CONTAINER_OPTION_FRAMERATE, &fps, sizeof(fps), nullptr);
380  return fps;
381  }
382 };
383 
388 static inline std::vector<PEAK_IPL_VIDEO_CONTAINER> GetSupportedContainersForAnEncoder(PEAK_IPL_VIDEO_ENCODER encoder)
389 {
390  size_t length{};
393  });
394  std::vector<PEAK_IPL_VIDEO_CONTAINER> containers(length);
397  encoder, containers.data(), &length);
398  });
399  return containers;
400 }
401 
411 static std::unique_ptr<IContainer> Create(PEAK_IPL_VIDEO_CONTAINER container)
412 {
413  switch (container)
414  {
416  return std::unique_ptr<AVIContainer>(new AVIContainer());
417  default:
418  throw InvalidArgumentException("The supplied container is not a valid value!");
419  }
420 }
421 
422 } // namespace container
423 
424 class Image;
425 
429 class VideoWriter final
430 {
431 public:
432  VideoWriter() = default;
434  {
435  if(IsOpen())
436  {
437  Close();
438  }
439  }
440  VideoWriter(const VideoWriter&) = delete;
441  VideoWriter(VideoWriter&& other) noexcept
442  {
443  m_handle = other.m_handle;
444  other.m_handle = nullptr;
445  m_encoder = std::move(other.m_encoder);
446  m_container = std::move(other.m_container);
447  }
448  VideoWriter& operator=(const VideoWriter&) = delete;
449  VideoWriter& operator=(VideoWriter&& other) noexcept
450  {
451  m_handle = other.m_handle;
452  other.m_handle = nullptr;
453  m_encoder = std::move(other.m_encoder);
454  m_container = std::move(other.m_container);
455 
456  return *this;
457  }
458 
471  void Open(const std::string& fileName, std::shared_ptr<container::IContainer> container,
472  std::shared_ptr<encoder::IEncoder> encoder)
473  {
474  if (!container || !encoder)
475  {
476  throw InvalidArgumentException("The given pointer is a null pointer!");
477  }
478 
481  &m_handle, fileName.c_str(), container->Id(), encoder->Id());
482  });
483  m_encoder = encoder;
484  m_container = container;
485 
486  m_encoder->SetHandle(m_handle);
487  m_container->SetHandle(m_handle);
488  }
489 
500  void Open(const std::string& fileName)
501  {
502  auto container = container::Create(PEAK_IPL_VIDEO_CONTAINER_AVI);
503  auto encoder = encoder::Create(PEAK_IPL_VIDEO_ENCODER_MJPEG);
504  Open(fileName, std::move(container), std::move(encoder));
505  }
506 
516  bool IsOpen() const
517  {
518  PEAK_IPL_BOOL8 isOpen = false;
521  return isOpen;
522  }
523 
531  void Close()
532  {
534 
535  m_handle = nullptr;
536  }
537 
551  void Append(const Image& image)
552  {
553  if (m_encoder == nullptr)
554  {
555  throw InvalidArgumentException("The open method must be called before append!");
556  }
559  m_handle, ImageBackendAccessor::BackendHandle(image));
560  });
561  }
562 
564  VideoWriter& operator<<(const Image& image)
565  {
566  Append(image);
567  return *this;
568  }
569 
574  std::shared_ptr<encoder::IEncoder> Encoder() const
575  {
576  return m_encoder;
577  }
578 
583  std::shared_ptr<container::IContainer> Container() const
584  {
585  return m_container;
586  }
587 
592  uint64_t NumFramesEncoded() const
593  {
594  uint64_t numFramesEncoded{};
597  return numFramesEncoded;
598  }
599 
604  uint64_t NumFramesDropped() const
605  {
606  uint64_t numFramesDropped{};
609  return numFramesDropped;
610  }
611 
616  uint64_t FileSize() const
617  {
618  uint64_t s{};
621  return s;
622  }
623 
628  {
631  });
632  }
633 
638  void SetQueueSize(int32_t queueSize)
639  {
642  });
643  }
644 
649  int32_t QueueSize()
650  {
651  int32_t queueSize{};
654  });
655 
656  return queueSize;
657  }
658 
664  {
665  int32_t minQueueSize{}, maxQueueSize{};
667  return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_VideoWriter_Queue_GetRange(m_handle, &minQueueSize, &maxQueueSize);
668  });
669 
670  return {minQueueSize, maxQueueSize, 1};
671  }
672 
678  {
679  int32_t queued{};
682  });
683 
684  return queued;
685  }
686 
691  void WaitUntilFrameDone(int32_t timeout_ms)
692  {
695  });
696  }
697 
702  void WaitUntilQueueEmpty(int32_t timeout_ms)
703  {
706  });
707  }
708 
709 private:
711  std::shared_ptr<encoder::IEncoder> m_encoder{};
712  std::shared_ptr<container::IContainer> m_container{};
713 };
714 
715 } /* namespace ipl */
716 } /* namespace peak */
void SetOption(PEAK_IPL_VIDEO_CONTAINER_OPTION option, const void *value, size_t count)
Sets an option on the container.
Definition: peak_ipl_video_writer.hpp:281
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Container_OptionRange(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_VIDEO_ENCODER_OPTION option, void *min, void *max, void *inc)
Receive the range for an option of the container.
void SetQuality(uint32_t quality)
Sets the quality for the jpeg encoder.
Definition: peak_ipl_video_writer.hpp:147
std::shared_ptr< encoder::IEncoder > Encoder() const
Get the used encoder.
Definition: peak_ipl_video_writer.hpp:574
VideoWriter & operator<<(const Image &image)
Append an image to the opened video.
Definition: peak_ipl_video_writer.hpp:564
Writes images to a file in form of a video.
Definition: peak_ipl_video_writer.hpp:429
Encoder Interface Class.
Definition: peak_ipl_video_writer.hpp:37
void SetHandle(PEAK_IPL_VIDEO_HANDLE handle)
Definition: peak_ipl_video_writer.hpp:44
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_Open(PEAK_IPL_VIDEO_HANDLE *videoHandle, const char *filePath, PEAK_IPL_VIDEO_CONTAINER container, PEAK_IPL_VIDEO_ENCODER encoder)
Open a video stream.
#define PEAK_IPL_C_ABI_PREFIX
Definition: peak_ipl_dll_defines.h:16
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_GetFileSize(PEAK_IPL_VIDEO_HANDLE videoHandle, uint64_t *fileSize)
Gets the file size of the video.
struct PEAK_IPL_VIDEO * PEAK_IPL_VIDEO_HANDLE
Definition: peak_ipl_backend.h:319
virtual PEAK_IPL_VIDEO_ENCODER Id()=0
void SetHandle(PEAK_IPL_VIDEO_HANDLE handle)
Definition: peak_ipl_video_writer.hpp:260
uint64_t NumFramesEncoded() const
Get the encoded frames in the video stream.
Definition: peak_ipl_video_writer.hpp:592
JPEG encoder specialization of IEncoder. Create the encoder with the according Create function...
Definition: peak_ipl_video_writer.hpp:116
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_GetDroppedFrames(PEAK_IPL_VIDEO_HANDLE videoHandle, uint64_t *numFrames)
Gets the number of dropped frames in the video stream.
The "peak::ipl" namespace contains the whole image processing library.
Definition: peak_ipl_binning.hpp:16
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_IsOpen(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_BOOL8 *isOpen)
Check if the video stream is open.
std::shared_ptr< container::IContainer > Container() const
Get the used container.
Definition: peak_ipl_video_writer.hpp:583
void GetOption(PEAK_IPL_VIDEO_ENCODER_OPTION option, void *value, size_t count, size_t *outCount)
Gets an option of the encoder.
Definition: peak_ipl_video_writer.hpp:83
~VideoWriter()
Definition: peak_ipl_video_writer.hpp:433
Definition: peak_ipl_backend.h:219
int32_t NumBuffersQueued()
Get the count of the currently queued buffers, which are waiting to be processed. ...
Definition: peak_ipl_video_writer.hpp:677
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_GetEncodedFrames(PEAK_IPL_VIDEO_HANDLE videoHandle, uint64_t *numFrames)
Gets the number of encoded frames in the video stream.
uint16_t PEAK_IPL_VIDEO_ENCODER
Definition: peak_ipl_backend.h:215
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
Definition: peak_ipl_exception.hpp:182
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_ResetFrameCounters(PEAK_IPL_VIDEO_HANDLE videoHandle)
Reset compressed and dropped frame counters.
Stores the pixel format, width and height of an image and the pointer to the image buffer...
Definition: peak_ipl_image.hpp:37
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Queue_GetSize(PEAK_IPL_VIDEO_HANDLE videoHandle, int32_t *size)
Get the internal queue size of the video writer.
Range< int32_t > QueueSizeRange()
Get the range of the queue size.
Definition: peak_ipl_video_writer.hpp:663
PEAK_IPL_VIDEO_ENCODER Id() override
Get the current type of the encoder.
Definition: peak_ipl_video_writer.hpp:133
uint64_t FileSize() const
Get the file size of the video in bytes.
Definition: peak_ipl_video_writer.hpp:616
void OptionRange(PEAK_IPL_VIDEO_CONTAINER_OPTION option, void *min, void *max, void *inc)
Receive the range for an option of the container.
Definition: peak_ipl_video_writer.hpp:320
void Append(const Image &image)
Append an image to the opened video.
Definition: peak_ipl_video_writer.hpp:551
void WaitUntilFrameDone(int32_t timeout_ms)
Wait until frame processing is done.
Definition: peak_ipl_video_writer.hpp:691
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Encoder_OptionRange(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_VIDEO_ENCODER_OPTION option, void *min, void *max, void *inc)
Receive the range for an option of the encoder.
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_WaitUntilFrameDone(PEAK_IPL_VIDEO_HANDLE videoHandle, int32_t timeout_ms)
Wait until frame processing is done.
The exception thrown when passing an invalid parameter to a function.
Definition: peak_ipl_exception.hpp:58
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Queue_GetRange(PEAK_IPL_VIDEO_HANDLE videoHandle, int32_t *minSize, int32_t *maxSize)
Get the possible range of the internal queue size.
PEAK_IPL_C_API PEAK_IPL_VideoWriter_GetSupportedContainersForAnEncoder(PEAK_IPL_VIDEO_ENCODER encoder, PEAK_IPL_VIDEO_CONTAINER *containers, size_t *size)
Get the supported containers for an encoder.
void SetOption(PEAK_IPL_VIDEO_ENCODER_OPTION option, const void *value, size_t count)
Sets an option on the encoder.
Definition: peak_ipl_video_writer.hpp:65
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Encoder_GetOption(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_VIDEO_ENCODER_OPTION option, void *value, size_t count, size_t *outCount)
Sets an option of the encoder.
Range< double > QualityRange()
Gets the quality range for the jpeg encoder.
Definition: peak_ipl_video_writer.hpp:173
void SetQueueSize(int32_t queueSize)
Set the internal queue size of the video writer.
Definition: peak_ipl_video_writer.hpp:638
double GetFramerate()
Get the frame rate for the opened video.
Definition: peak_ipl_video_writer.hpp:376
Definition: peak_ipl_backend.h:225
Range.
Definition: peak_ipl_range.hpp:30
Container Interface Class.
Definition: peak_ipl_video_writer.hpp:254
void OptionRange(PEAK_IPL_VIDEO_ENCODER_OPTION option, void *min, void *max, void *inc)
Receive the range for an option of the encoder.
Definition: peak_ipl_video_writer.hpp:102
VideoWriter(VideoWriter &&other) noexcept
Definition: peak_ipl_video_writer.hpp:441
int8_t PEAK_IPL_BOOL8
Definition: peak_ipl_backend.h:25
VideoWriter & operator=(VideoWriter &&other) noexcept
Definition: peak_ipl_video_writer.hpp:449
void Open(const std::string &fileName)
Open the VideoWriter with AVI container and mjpeg encoder. The file is created upon receiving the fir...
Definition: peak_ipl_video_writer.hpp:500
void Close()
Close the opened VideoWriter.
Definition: peak_ipl_video_writer.hpp:531
uint16_t PEAK_IPL_VIDEO_ENCODER_OPTION
Definition: peak_ipl_backend.h:221
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_Append(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_IMAGE_HANDLE imageHandle)
Append an image to the video stream.
void SetFramerate(double fps)
Set the frame rate for the opened video.
Definition: peak_ipl_video_writer.hpp:364
bool IsOpen() const
Check if the VideoWriter is already open.
Definition: peak_ipl_video_writer.hpp:516
void ResetFrameCounters()
Reset compressed and dropped frame counters.
Definition: peak_ipl_video_writer.hpp:627
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_WaitUntilQueueEmpty(PEAK_IPL_VIDEO_HANDLE videoHandle, int32_t timeout_ms)
Wait until queue is empty.
PEAK_IPL_C_API PEAK_IPL_VideoWriter_GetSupportedEncodersForAContainer(PEAK_IPL_VIDEO_CONTAINER container, PEAK_IPL_VIDEO_ENCODER *encoders, size_t *size)
Get the supported encoders for a container.
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Encoder_SetOption(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_VIDEO_ENCODER_OPTION option, const void *value, size_t count)
Sets an option on the encoder.
void GetOption(PEAK_IPL_VIDEO_CONTAINER_OPTION option, void *value, size_t count, size_t *outCount)
Gets an option of the container.
Definition: peak_ipl_video_writer.hpp:300
void WaitUntilQueueEmpty(int32_t timeout_ms)
Wait until the queue is empty.
Definition: peak_ipl_video_writer.hpp:702
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Queue_SetSize(PEAK_IPL_VIDEO_HANDLE videoHandle, int32_t size)
Set the internal queue size of the video writer.
uint16_t PEAK_IPL_VIDEO_CONTAINER_OPTION
Definition: peak_ipl_backend.h:227
void Open(const std::string &fileName, std::shared_ptr< container::IContainer > container, std::shared_ptr< encoder::IEncoder > encoder)
Open the VideoWriter and setup a container and an encoder. The file is created upon receiving the fir...
Definition: peak_ipl_video_writer.hpp:471
uint16_t PEAK_IPL_VIDEO_CONTAINER
Definition: peak_ipl_backend.h:208
virtual ~IEncoder()=default
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Queue_GetQueued(PEAK_IPL_VIDEO_HANDLE videoHandle, int32_t *queued)
Get the count of the currently queued buffers.
Definition: peak_ipl_backend.h:206
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Encoder_GetSupportedPixelFormats(PEAK_IPL_VIDEO_ENCODER encoder, PEAK_IPL_PIXEL_FORMAT *pixelFormatList, size_t *pixelFormatListSize)
Get the supported pixelformats for an encoder.
uint64_t NumFramesDropped() const
Get the dropped frames in the video stream.
Definition: peak_ipl_video_writer.hpp:604
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Container_SetOption(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_VIDEO_CONTAINER_OPTION option, const void *value, size_t count)
Sets an option on the container.
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Container_GetOption(PEAK_IPL_VIDEO_HANDLE videoHandle, PEAK_IPL_VIDEO_ENCODER_OPTION option, void *value, size_t count, size_t *outCount)
Gets an option of the container.
AVI container specialization of IContainer. Create the container with the according Create function...
Definition: peak_ipl_video_writer.hpp:334
int32_t QueueSize()
Get the internal queue size of the video writer.
Definition: peak_ipl_video_writer.hpp:649
Definition: peak_ipl_backend.h:213
PEAK_IPL_C_API PEAK_IPL_VideoWriter_Video_Close(PEAK_IPL_VIDEO_HANDLE videoHandle)
Close the video stream.
PEAK_IPL_VIDEO_HANDLE m_handle
Definition: peak_ipl_video_writer.hpp:42
uint32_t GetQuality()
Gets the quality for the jpeg encoder.
Definition: peak_ipl_video_writer.hpp:159
PEAK_IPL_VIDEO_CONTAINER Id() override
Get the current type of the container.
Definition: peak_ipl_video_writer.hpp:350