CVB++ 15.0
encoder.hpp
1#pragma once
2
3#include "codec_bridge.hpp"
4#include "../global.hpp"
5#include "../utilities/system_info.hpp"
6
7#include "codec_config.hpp"
8#include "frame.hpp"
9#include "packet.hpp"
10
11namespace Cvb
12{
13
14 CVB_BEGIN_INLINE_NS
15
16 template <>
17 inline HandleGuard<CodecBridge::Encoder>::HandleGuard(void *handle) noexcept
18 : HandleGuard<CodecBridge::Encoder>(handle, [](void *handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
19 {
20 }
21
22 namespace CodecBridge
23 {
24
31 class Encoder final
32 {
33
34 public:
36
44 static std::unique_ptr<Encoder> Create(const CodecConfig &codecConfig)
45 {
46 return Internal::DoResCallObjectOut<Encoder>(
47 [&](void *&handle) { return CVB_CALL_CAPI(CVCBCreateEncoder(codecConfig.Handle(), handle)); });
48 }
49
50 static std::unique_ptr<Encoder> FromHandle(HandleGuard<Encoder> &&guard)
51 {
52 if (!guard.Handle())
53 throw std::runtime_error("handle must not be null");
54
55 return std::make_unique<Encoder>(std::move(guard));
56 }
57
58 explicit Encoder(HandleGuard<Encoder> &&guard) noexcept
59 : handle_(std::move(guard))
60 {
61 }
62
63 Encoder(const Encoder &other) = delete;
64 Encoder &operator=(const Encoder &other) = delete;
65 Encoder(Encoder &&other) = delete;
66 Encoder &operator=(Encoder &&other) = delete;
67
68 ~Encoder() = default;
69
70 void *Handle() const noexcept
71 {
72 return handle_.Handle();
73 }
74
76
84 CodecStatus Encode(const Frame &frame)
85 {
86 CExports::CVCBCodecStatus status = CExports::CVCBCS_ReadoutRequired;
87 CVB_CALL_CAPI_CHECKED(CVCBEncoderSendFrame(Handle(), frame.Handle(), status));
88 return static_cast<CodecStatus>(status);
89 }
90
92
98 void Flush()
99 {
100 CExports::CVCBCodecStatus status = CExports::CVCBCS_ReadoutRequired;
101 CVB_CALL_CAPI_CHECKED(CVCBEncoderSendFrame(Handle(), nullptr, status));
102 }
103
105
113 {
114 CExports::CVCBPACKET handle = nullptr;
115 CVB_CALL_CAPI_CHECKED(CVCBEncoderReceivePacket(Handle(), handle));
116 if (!handle)
117 return {};
118 HandleGuard<Packet> guard(handle);
119 return Packet::FromHandle(std::move(guard));
120 }
121
122 private:
123 HandleGuard<Encoder> handle_;
124 };
125
126 } // namespace CodecBridge
127
128 CVB_END_INLINE_NS
129} // namespace Cvb
A configuration defining a codec.
Definition codec_config.hpp:32
void Flush()
Flush the encoder and finish encoding.
Definition encoder.hpp:98
static std::unique_ptr< Encoder > Create(const CodecConfig &codecConfig)
Creates an encoder with a given configuration.
Definition encoder.hpp:44
CodecStatus Encode(const Frame &frame)
Encode a video frame.
Definition encoder.hpp:84
std::unique_ptr< Packet > ReceivePacket()
Receive an encoded packet.
Definition encoder.hpp:112
A video frame for encoding and decoding.
Definition frame.hpp:30
cvbbool_t ReleaseObject(OBJ &Object)
T move(T... args)
Namespace for encoding and decoding videos.
Definition codec_bridge.hpp:24
CodecStatus
Status of the encoder/decoder after sending data.
Definition codec_bridge.hpp:186
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17