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  uint8_t *data(size_t plane = 0);
114  const uint8_t *data(size_t plane = 0) const;
115 
116  size_t size(size_t plane) const;
117  size_t size() const;
118 
119  void dump() const;
120 
121  // You must implement operators in deveritive classes using assignOperator() and moveOperator()
122  void operator=(const FrameCommon&) = delete;
123 
124  void swap(FrameCommon &other);
125 
126 #if AVCPP_HAS_FRAME_SIDE_DATA
133  const FrameSideData sideData(AVFrameSideDataType type) const;
134  FrameSideData sideData(AVFrameSideDataType type);
135 
140  std::size_t sideDataCount() const noexcept;
141 
147  FrameSideData sideDataIndex(std::size_t index) noexcept;
148 
156  ArrayView<AVFrameSideData*, FrameSideData, std::size_t> sideData() noexcept;
157  ArrayView<const AVFrameSideData*, FrameSideData, std::size_t> sideData() const noexcept;
158 
159 
164  void sideDataRemove(AVFrameSideDataType type) noexcept;
165 
172  FrameSideData addSideData(AVFrameSideDataType type, std::span<const uint8_t> data, OptionalErrorCode ec = throws());
173 
182  FrameSideData addSideData(AVFrameSideDataType type, std::span<uint8_t> data, wrap_data, OptionalErrorCode ec = throws());
183 
192  FrameSideData addSideData(AVFrameSideDataType type, std::span<uint8_t> data, wrap_data_static, OptionalErrorCode ec = throws());
193 
201  FrameSideData addSideData(AVFrameSideDataType type, BufferRef buf, OptionalErrorCode ec = throws());
202 
210  FrameSideData allocateSideData(AVFrameSideDataType type, std::size_t size, OptionalErrorCode ec = throws());
211 #endif
212 
213 protected:
214  void copyInfoFrom(const FrameCommon& other);
215  void clone(FrameCommon& dst, size_t align = 1) const;
216 
217 protected:
218  Rational m_timeBase{};
219  int m_streamIndex {-1};
220  bool m_isComplete {false};
221 };
222 
223 template<typename T>
224 class Frame : public FrameCommon
225 {
226 protected:
227  T& assignOperator(const T &rhs) {
228  if (this == &rhs)
229  return static_cast<T&>(*this);
230  T(rhs).swap(static_cast<T&>(*this));
231  return static_cast<T&>(*this);
232  }
233 
234  T& moveOperator(T &&rhs) {
235  if (this == &rhs)
236  return static_cast<T&>(*this);
237  T(std::move(rhs)).swap(static_cast<T&>(*this));
238  return static_cast<T&>(*this);
239  }
240 
241 public:
243 
244  static T null() {
245  return T(nullptr);
246  }
247 
248  T clone(size_t align = 1) const {
249  T result;
250  FrameCommon::clone(result, align);
251  return result;
252  }
253 };
254 
255 static_assert(std::is_copy_assignable_v<FrameCommon> == false);
256 static_assert(std::is_copy_constructible_v<FrameCommon> == true);
257 static_assert(std::is_move_assignable_v<FrameCommon> == false);
258 static_assert(std::is_move_constructible_v<FrameCommon> == true);
259 
260 class VideoFrame : public Frame<VideoFrame>
261 {
262 public:
264 
265  VideoFrame() = default;
266  VideoFrame(PixelFormat pixelFormat, int width, int height, int align = 1);
267  VideoFrame(const uint8_t *data, size_t size, PixelFormat pixelFormat, int width, int height, int align = 1);
268 
269  VideoFrame(const VideoFrame &other);
270  VideoFrame(VideoFrame &&other);
271 
272  VideoFrame& operator=(const VideoFrame &rhs);
273  VideoFrame& operator=(VideoFrame &&rhs);
274 
275  PixelFormat pixelFormat() const;
276  int width() const;
277  int height() const;
278 
287  PixelFormat adjustFromJpegPixelFormat();
296  PixelFormat adjustToJpegPixelFormat();
297 
298  bool isKeyFrame() const;
299  void setKeyFrame(bool isKey);
300 
301  int quality() const;
302  void setQuality(int quality);
303 
304  AVPictureType pictureType() const;
305  void setPictureType(AVPictureType type = AV_PICTURE_TYPE_NONE);
306 
307  Rational sampleAspectRatio() const;
308  void setSampleAspectRatio(const Rational& sampleAspectRatio);
309 
310  size_t bufferSize(int align = 1, OptionalErrorCode ec = throws()) const;
311  bool copyToBuffer(uint8_t *dst, size_t size, int align = 1, OptionalErrorCode ec = throws());
312  bool copyToBuffer(std::vector<uint8_t>& dst, int align = 1, OptionalErrorCode ec = throws());
313 
314 
329  static VideoFrame wrap(const void *data, size_t size, PixelFormat pixelFormat, int width, int height, int align = 1);
330 
331 #if AVCPP_CXX_STANDARD >= 20
344  static VideoFrame wrap(std::span<const std::byte> data, PixelFormat pixelFormat, int width, int height, int align = 1);
345 
360  static VideoFrame wrap(std::span<const std::byte> data, void (*deleter)(void *opaque, uint8_t *data),
361  void *opaque, PixelFormat pixelFormat, int width, int height, int align = 1);
362 #endif
363 };
364 
365 static_assert(std::is_copy_assignable_v<VideoFrame> == true);
366 static_assert(std::is_copy_constructible_v<VideoFrame> == true);
367 static_assert(std::is_move_assignable_v<VideoFrame> == true);
368 static_assert(std::is_move_constructible_v<VideoFrame> == true);
369 
370 class AudioSamples : public Frame<AudioSamples>
371 {
372 public:
374 
375  AudioSamples() = default;
376  AudioSamples(SampleFormat sampleFormat, int samplesCount, uint64_t channelLayout, int sampleRate, int align = SampleFormat::AlignDefault);
377  AudioSamples(const uint8_t *data, size_t size,
378  SampleFormat sampleFormat, int samplesCount, uint64_t channelLayout, int sampleRate, int align = SampleFormat::AlignDefault);
379 
380  AudioSamples(const AudioSamples &other);
381  AudioSamples(AudioSamples &&other);
382 
383  AudioSamples& operator=(const AudioSamples &rhs);
384  AudioSamples& operator=(AudioSamples &&rhs);
385 
386  int init(SampleFormat sampleFormat, int samplesCount, uint64_t channelLayout, int sampleRate, int align = SampleFormat::AlignDefault);
387 
388  SampleFormat sampleFormat() const;
389  int samplesCount() const;
390  int channelsCount() const;
391  uint64_t channelsLayout() const;
392  int sampleRate() const;
393  size_t sampleBitDepth(OptionalErrorCode ec = throws()) const;
394  bool isPlanar() const;
395 
396  std::string channelsLayoutString() const;
397 };
398 
399 static_assert(std::is_copy_assignable_v<AudioSamples> == true);
400 static_assert(std::is_copy_constructible_v<AudioSamples> == true);
401 static_assert(std::is_move_assignable_v<AudioSamples> == true);
402 static_assert(std::is_move_constructible_v<AudioSamples> == true);
403 
404 
405 } // ::av
406 
Definition: frame.h:371
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:845
Definition: frame.h:225
T & moveOperator(T &&rhs)
Definition: frame.h:234
T clone(size_t align=1) const
Definition: frame.h:248
T & assignOperator(const T &rhs)
Definition: frame.h:227
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:14
Definition: frame.h:261
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