CVB++ 15.0
input_container.hpp
1#pragma once
2
3#include "codec_bridge.hpp"
4#include "../global.hpp"
5#include "../utilities/system_info.hpp"
6
7#include "packet.hpp"
8#include "decoder.hpp"
9
10namespace Cvb
11{
12
13 CVB_BEGIN_INLINE_NS
14
15 template <>
16 inline HandleGuard<CodecBridge::InputContainer>::HandleGuard(void *handle) noexcept
17 : HandleGuard<CodecBridge::InputContainer>(handle, [](void *handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
18 {
19 }
20
21 namespace CodecBridge
22 {
23
29 class InputContainer final
30 {
31
32 public:
34
45 {
46 return Internal::DoResCallObjectOut<InputContainer>(
47 [&](void *&handle) { return CVB_CALL_CAPI(CVCBCreateInputContainerTyped(fileName.c_str(), handle)); });
48 }
49
50 static std::unique_ptr<InputContainer> FromHandle(HandleGuard<InputContainer> &&guard)
51 {
52 if (!guard.Handle())
53 throw std::runtime_error("handle must not be null");
54
55 return std::make_unique<InputContainer>(std::move(guard));
56 }
57
58 explicit InputContainer(HandleGuard<InputContainer> &&guard) noexcept
59 : handle_(std::move(guard))
60 {
61 }
62
63 InputContainer(const InputContainer &other) = delete;
64 InputContainer &operator=(const InputContainer &other) = delete;
65 InputContainer(InputContainer &&other) = delete;
66 InputContainer &operator=(InputContainer &&other) = delete;
67
68 ~InputContainer() = default;
69
70 void *Handle() const noexcept
71 {
72 return handle_.Handle();
73 }
74
76
88 {
89 // we can be sure that decoder names are ASCII only
90 std::string asciiName;
91 asciiName.reserve(name.size());
92 for (const auto &c : name)
93 asciiName.push_back(static_cast<char>(c));
94 return Internal::DoResCallObjectOut<Decoder>([&](void *&handle) {
95 return CVB_CALL_CAPI(CVCBInputContainerCreateDecoder(
96 Handle(), asciiName.c_str(), static_cast<CExports::CVCBPixelFormat>(pixelFormat), handle));
97 });
98 }
99
101
111 {
112 return Internal::DoResCallObjectOut<Decoder>([&](void *&handle) {
113 return CVB_CALL_CAPI(CVCBInputContainerCreateDecoder(
114 Handle(), nullptr, static_cast<CExports::CVCBPixelFormat>(pixelFormat), handle));
115 });
116 }
117
119
127 {
128 CExports::CVCBPACKET handle = nullptr;
129 CVB_CALL_CAPI_CHECKED(CVCBInputContainerNextPacket(Handle(), handle));
130 if (!handle)
131 return {};
132 HandleGuard<Packet> guard(handle);
133 return Packet::FromHandle(std::move(guard));
134 }
135
136 private:
137 HandleGuard<InputContainer> handle_;
138 };
139
140 } // namespace CodecBridge
141
142 CVB_END_INLINE_NS
143} // namespace Cvb
std::unique_ptr< Decoder > VideoDecoder(const Cvb::String &name, CodecBridge::PixelFormat pixelFormat=CodecBridge::PixelFormat::None)
Get or create a video decoder for this container file.
Definition input_container.hpp:86
static std::unique_ptr< InputContainer > Create(const Cvb::String &fileName)
Creates an input container based on a file name.
Definition input_container.hpp:44
std::unique_ptr< Packet > NextPacket()
Get the next packet from the container.
Definition input_container.hpp:126
std::unique_ptr< Decoder > VideoDecoder(CodecBridge::PixelFormat pixelFormat=CodecBridge::PixelFormat::None)
Get or create a video decoder for this container file.
Definition input_container.hpp:110
cvbbool_t ReleaseObject(OBJ &Object)
T move(T... args)
Namespace for encoding and decoding videos.
Definition codec_bridge.hpp:24
PixelFormat
Subset of FFmpeg pixel formats.
Definition codec_bridge.hpp:91
@ None
Ivalid format. Equal to PIX_FMT_NONE. Corresponds to PfncFormat::InvalidPixelFormat.
Definition codec_bridge.hpp:93
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49