avcpp  2.0
Wrapper for the FFmpeg that simplify usage from C++ projects.
frame.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 
5 #include "avcompat.h"
6 #include "avcpp/buffer.h"
7 #include "avcpp/dictionary.h"
8 
9 #if AVCPP_CXX_STANDARD >= 20
10 #if __has_include(<span>)
11 #include <span>
12 #endif
13 #endif
14 
15 #include "ffmpeg.h"
16 #include "rational.h"
17 #include "timestamp.h"
18 #include "pixelformat.h"
19 #include "sampleformat.h"
20 
21 extern "C" {
22 #include <libavutil/imgutils.h>
23 #include <libavutil/attributes.h>
24 }
25 
26 namespace av
27 {
28 
29 namespace frame
30 {
31 int64_t get_best_effort_timestamp(const AVFrame* frame);
32 uint64_t get_channel_layout(const AVFrame* frame);
33 void set_channel_layout(AVFrame* frame, uint64_t layout);
34 } // ::av::frame
35 
36 #if AVCPP_HAS_FRAME_SIDE_DATA
40 class FrameSideData : public FFWrapperPtr<AVFrameSideData>
41 {
42 public:
44 
45  std::string_view name() const noexcept;
46  AVFrameSideDataType type() const noexcept;
47  std::span<const uint8_t> span() const noexcept;
48  std::span<uint8_t> span() noexcept;
49 
50  BufferRefView buffer() const noexcept;
51 
56  Dictionary metadata() const noexcept;
57 
58  static std::string_view name(AVFrameSideDataType type) noexcept;
59 
60 #if AVCPP_API_HAS_AVSIDEDATADESCRIPTOR
61  std::optional<AVSideDataDescriptor> descriptor() const noexcept;
62  static std::optional<AVSideDataDescriptor> descriptor(AVFrameSideDataType type) noexcept;
63 #endif // AVCPP_API_HAS_AVSIDEDATADESCRIPTOR
64 
65  bool empty() const noexcept;
66  operator bool() const noexcept;
67 };
68 #endif // AVCPP_HAS_PKT_SIDE_DATA
69 
70 class FrameCommon : public FFWrapperPtr<AVFrame>
71 {
72 public:
76  struct wrap_data {};
81  struct wrap_data_static {};
82 
83  FrameCommon();
84  FrameCommon(const AVFrame *frame);
85 
86  // Helper ctors to implement move/copy ctors
87  FrameCommon(const FrameCommon& other);
88  FrameCommon(FrameCommon&& other);
89 
90  ~FrameCommon();
91 
92  bool isReferenced() const;
93  int refCount() const;
94  AVFrame* makeRef() const;
95 
96  Timestamp pts() const;
97  attribute_deprecated void setPts(int64_t pts, Rational ptsTimeBase);
98  void setPts(const Timestamp &ts);
99 
100  const Rational& timeBase() const;
101  void setTimeBase(const Rational &value);
102 
103  int streamIndex() const;
104  void setStreamIndex(int streamIndex);
105 
106  void setComplete(bool isComplete);
107  bool isComplete() const;
108 
109  bool isValid() const;
110 
111  operator bool() const;
112 
113  bool isHwFrame() const;
114 
115  uint8_t *data(size_t plane = 0);
116  const uint8_t *data(size_t plane = 0) const;
117 
118  size_t size(size_t plane) const;
119  size_t size() const;
120 
121  void dump() const;
122 
123  // You must implement operators in deveritive classes using assignOperator() and moveOperator()
124  void operator=(const FrameCommon&) = delete;
125 
126  void swap(FrameCommon &other);
127 
128 #if AVCPP_HAS_FRAME_SIDE_DATA
135  const FrameSideData sideData(AVFrameSideDataType type) const;
136  FrameSideData sideData(AVFrameSideDataType type);
137 
142  std::size_t sideDataCount() const noexcept;
143 
149  FrameSideData sideDataIndex(std::size_t index) noexcept;
150 
158  ArrayView<AVFrameSideData*, FrameSideData, std::size_t> sideData() noexcept;
159  ArrayView<const AVFrameSideData*, FrameSideData, std::size_t> sideData() const noexcept;
160 
161 
166  void sideDataRemove(AVFrameSideDataType type) noexcept;
167 
174  FrameSideData addSideData(AVFrameSideDataType type, std::span<const uint8_t> data, OptionalErrorCode ec = throws());
175 
184  FrameSideData addSideData(AVFrameSideDataType type, std::span<uint8_t> data, wrap_data, OptionalErrorCode ec = throws());
185 
194  FrameSideData addSideData(AVFrameSideDataType type, std::span<uint8_t> data, wrap_data_static, OptionalErrorCode ec = throws());
195 
203  FrameSideData addSideData(AVFrameSideDataType type, BufferRef buf, OptionalErrorCode ec = throws());
204 
212  FrameSideData allocateSideData(AVFrameSideDataType type, std::size_t size, OptionalErrorCode ec = throws());
213 #endif
214 
215 protected:
216  void copyInfoFrom(const FrameCommon& other);
217  void clone(FrameCommon& dst, size_t align = 1) const;
218 
219 protected:
220  Rational m_timeBase{};
221  int m_streamIndex {-1};
222  bool m_isComplete {false};
223 };
224 
225 template<typename T>
226 class Frame : public FrameCommon
227 {
228 protected:
229  T& assignOperator(const T &rhs) {
230  if (this == &rhs)
231  return static_cast<T&>(*this);
232  T(rhs).swap(static_cast<T&>(*this));
233  return static_cast<T&>(*this);
234  }
235 
236  T& moveOperator(T &&rhs) {
237  if (this == &rhs)
238  return static_cast<T&>(*this);
239  T(std::move(rhs)).swap(static_cast<T&>(*this));
240  return static_cast<T&>(*this);
241  }
242 
243 public:
245 
246  static T null() {
247  return T(nullptr);
248  }
249 
250  T clone(size_t align = 1) const {
251  T result;
252  FrameCommon::clone(result, align);
253  return result;
254  }
255 };
256 
257 static_assert(std::is_copy_assignable_v<FrameCommon> == false);
258 static_assert(std::is_copy_constructible_v<FrameCommon> == true);
259 static_assert(std::is_move_assignable_v<FrameCommon> == false);
260 static_assert(std::is_move_constructible_v<FrameCommon> == true);
261 
262 class VideoFrame : public Frame<VideoFrame>
263 {
264 public:
266 
267  VideoFrame() = default;
268  VideoFrame(PixelFormat pixelFormat, int width, int height, int align = 1);
269  VideoFrame(const uint8_t *data, size_t size, PixelFormat pixelFormat, int width, int height, int align = 1);
270 
271  VideoFrame(const VideoFrame &other);
272  VideoFrame(VideoFrame &&other);
273 
274  VideoFrame& operator=(const VideoFrame &rhs);
275  VideoFrame& operator=(VideoFrame &&rhs);
276 
277  PixelFormat pixelFormat() const;
278  int width() const;
279  int height() const;
280 
289  PixelFormat adjustFromJpegPixelFormat();
298  PixelFormat adjustToJpegPixelFormat();
299 
300  bool isKeyFrame() const;
301  void setKeyFrame(bool isKey);
302 
303  int quality() const;
304  void setQuality(int quality);
305 
306  AVPictureType pictureType() const;
307  void setPictureType(AVPictureType type = AV_PICTURE_TYPE_NONE);
308 
309  Rational sampleAspectRatio() const;
310  void setSampleAspectRatio(const Rational& sampleAspectRatio);
311 
312  size_t bufferSize(int align = 1, OptionalErrorCode ec = throws()) const;
313  bool copyToBuffer(uint8_t *dst, size_t size, int align = 1, OptionalErrorCode ec = throws());
314  bool copyToBuffer(std::vector<uint8_t>& dst, int align = 1, OptionalErrorCode ec = throws());
315 
316 
331  static VideoFrame wrap(const void *data, size_t size, PixelFormat pixelFormat, int width, int height, int align = 1);
332 
333 #if AVCPP_CXX_STANDARD >= 20
346  static VideoFrame wrap(std::span<const std::byte> data, PixelFormat pixelFormat, int width, int height, int align = 1);
347 
362  static VideoFrame wrap(std::span<const std::byte> data, void (*deleter)(void *opaque, uint8_t *data),
363  void *opaque, PixelFormat pixelFormat, int width, int height, int align = 1);
364 #endif
365 };
366 
367 static_assert(std::is_copy_assignable_v<VideoFrame> == true);
368 static_assert(std::is_copy_constructible_v<VideoFrame> == true);
369 static_assert(std::is_move_assignable_v<VideoFrame> == true);
370 static_assert(std::is_move_constructible_v<VideoFrame> == true);
371 
372 class AudioSamples : public Frame<AudioSamples>
373 {
374 public:
376 
377  AudioSamples() = default;
378  AudioSamples(SampleFormat sampleFormat, int samplesCount, uint64_t channelLayout, int sampleRate, int align = SampleFormat::AlignDefault);
379  AudioSamples(const uint8_t *data, size_t size,
380  SampleFormat sampleFormat, int samplesCount, uint64_t channelLayout, int sampleRate, int align = SampleFormat::AlignDefault);
381 
382  AudioSamples(const AudioSamples &other);
383  AudioSamples(AudioSamples &&other);
384 
385  AudioSamples& operator=(const AudioSamples &rhs);
386  AudioSamples& operator=(AudioSamples &&rhs);
387 
388  int init(SampleFormat sampleFormat, int samplesCount, uint64_t channelLayout, int sampleRate, int align = SampleFormat::AlignDefault);
389 
390  SampleFormat sampleFormat() const;
391  int samplesCount() const;
392  int channelsCount() const;
393  uint64_t channelsLayout() const;
394  int sampleRate() const;
395  size_t sampleBitDepth(OptionalErrorCode ec = throws()) const;
396  bool isPlanar() const;
397 
398  std::string channelsLayoutString() const;
399 };
400 
401 static_assert(std::is_copy_assignable_v<AudioSamples> == true);
402 static_assert(std::is_copy_constructible_v<AudioSamples> == true);
403 static_assert(std::is_move_assignable_v<AudioSamples> == true);
404 static_assert(std::is_move_constructible_v<AudioSamples> == true);
405 
406 
407 } // ::av
408 
Definition: frame.h:373
AudioSamples()=default
Light weight wrapper for the FFmpeg AVBufferRef functionality.
Definition: buffer.h:119
Definition: frame.h:71
FrameCommon()
Definition: frame.cpp:538
void operator=(const FrameCommon &)=delete
void clone(FrameCommon &dst, size_t align=1) const
Definition: frame.cpp:849
Definition: frame.h:227
T & moveOperator(T &&rhs)
Definition: frame.h:236
T clone(size_t align=1) const
Definition: frame.h:250
T & assignOperator(const T &rhs)
Definition: frame.h:229
Definition: averror.h:66
The PixelFormat class is a simple wrapper for AVPixelFormat that allow to acces it it properties.
Definition: pixelformat.h:27
Definition: rational.h:26
The SampleFormat class is a simple proxy class for AVSampleFormat.
Definition: sampleformat.h:22
@ AlignDefault
Definition: sampleformat.h:26
The Timestamp class represents timestamp value and it timebase.
Definition: timestamp.h:18
Definition: frame.h:263
VideoFrame()=default
int64_t get_best_effort_timestamp(const AVFrame *frame)
Definition: frame.cpp:95
void set_channel_layout(AVFrame *frame, uint64_t layout)
Definition: frame.cpp:114
uint64_t get_channel_layout(const AVFrame *frame)
Definition: frame.cpp:104
Definition: audioresampler.cpp:8
OptionalErrorCode throws()
Helper to construct null OptionalErrorCode object.
Definition: averror.h:181
void init()
Init all subsustems needed by avcpp.
Definition: avutils.cpp:175
Definition: averror.h:230
Definition: ffmpeg.h:22
Wrap static data, do not owning and free.
Definition: frame.h:81
Wrap data and take owning.
Definition: frame.h:76