CVB++ 15.0
decl_video_device.hpp
1#pragma once
2
3#include <cassert>
4#include <chrono>
5#include <memory>
6
7#include "../../_cexports/c_dc_avi.h"
8
9#include "../../global.hpp"
10#include "../../string.hpp"
11
12#include "../_decl/decl_indexed_stream.hpp"
13
14#include "../../_decl/decl_device.hpp"
15
16namespace Cvb
17{
18
19 CVB_BEGIN_INLINE_NS
20
21 namespace Driver
22 {
23
25
26 class VideoDevice : public Device
27 {
29 friend Cvb::Driver::VideoImage;
31
32 public:
33 VideoDevice(HandleGuard<Device> &&guard, const String &fileName)
34 : Device(std::move(guard), fileName)
36 {
37 AnnounceStreams(1);
38 }
39
41
46
48
53
54 protected:
55 void ChangeHandle(HandleGuard<Device> &&, DeviceUpdateMode) override
56 {
57 throw std::runtime_error("handle change not supported");
58 }
59
60 DeviceImagePtr CreateDeviceImage() const override;
61
62 StreamBasePtr CreateStream(int, StreamType) const override;
63
64 private:
65 std::chrono::milliseconds FrameTime() const;
66
67 class VideoStream : public IndexedStream
68 {
69 public:
70 explicit VideoStream(const DevicePtr &device);
71
72 StreamImagePtr MakeStreamImage() override
73 {
74 return MakeSnapshotImage();
75 }
76
77 StreamImagePtr MakeSnapshotImage() override
78 {
79 // TODO VideoBuffer
80 auto frameTime = std::dynamic_pointer_cast<const Driver::VideoDevice>(Parent())->FrameTime();
81 return Driver::BufferImage::Create(Parent(), *layout_, static_cast<double>(ImageIndex() * frameTime.count()));
82 }
83
84 int ImageCount() const noexcept override
85 {
86 return imageCount_;
87 }
88
89 int ImageIndex() const override;
90
91 void SetImageIndex(int index) override;
92
93 private:
95
96 int imageCount_;
97 };
98
99 AcquisitionInterface AcquisitionInterfaceForPlaybackMode(Cvb::Driver::PlaybackMode playbackmode) const
100 {
101 switch (playbackmode)
102 {
105
108
109 default:
110 throw std::runtime_error("unsupported playback mode");
111 }
112 }
113
114 // mutable to keep const correctness and stay in sync
115 mutable Cvb::Driver::PlaybackMode playbackMode_;
116 };
117
118 } // namespace Driver
119
121
122 CVB_END_INLINE_NS
123
124} // namespace Cvb
A stream with a finite number of images, which can also be accessed via an index.
Definition decl_indexed_stream.hpp:20
DevicePtr Parent() const noexcept
Gets the parent device of this stream.
Definition stream_base.hpp:42
A device representing a video stream from the hard disk.
Definition decl_video_device.hpp:27
Cvb::Driver::PlaybackMode PlaybackMode() const noexcept
Gets how images are delivered by the stream.
Definition detail_video_device.hpp:20
void SetPlaybackMode(Cvb::Driver::PlaybackMode playbackMode)
Sets how images are delivered by the stream.
Definition detail_video_device.hpp:42
T move(T... args)
Namespace for driver or device related operations.
Definition decl_composite.hpp:28
PlaybackMode
Defines how frames are acquired by this video device.
Definition driver.hpp:421
@ FrameByFrame
The Stream::Wait() method always returns the next image in the video stream.
Definition driver.hpp:423
@ Stream
Definition driver.hpp:430
std::shared_ptr< StreamImage > StreamImagePtr
Convenience shared pointer for StreamImage.
Definition driver.hpp:93
@ String
String value.
Definition driver.hpp:366
std::shared_ptr< DeviceImage > DeviceImagePtr
Convenience shared pointer for DeviceImage.
Definition driver.hpp:61
std::shared_ptr< StreamBase > StreamBasePtr
Convenience shared pointer for StreamBase.
Definition driver.hpp:113
AcquisitionInterface
Known acquisition CVB interfaces.
Definition driver.hpp:435
@ Grab2
Ring buffer / queue based acquisition.
Definition driver.hpp:439
@ Grabber
Basic grabber interface for single image acquisition.
Definition driver.hpp:437
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::shared_ptr< Device > DevicePtr
Convenience shared pointer for Device.
Definition global.hpp:98
DeviceUpdateMode
Defines how to treat the optional device image, when the device itself is updated.
Definition global.hpp:252
T dynamic_pointer_cast(T... args)