avcpp  2.0
Wrapper for the FFmpeg that simplify usage from C++ projects.
codeccontext.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "avconfig.h"
4 #include "avcompat.h"
5 
6 #include "ffmpeg.h"
7 #include "stream.h"
8 #include "avutils.h"
9 #include "averror.h"
10 #include "pixelformat.h"
11 #include "sampleformat.h"
12 #include "avlog.h"
13 #include "frame.h"
14 #include "codec.h"
15 #include "channellayout.h"
16 
17 extern "C" {
18 #include <libavcodec/avcodec.h>
19 }
20 
21 namespace av {
22 
23 namespace codec_context::audio {
24 void set_channels(AVCodecContext *obj, int channels);
25 void set_channel_layout_mask(AVCodecContext *obj, uint64_t mask);
26 int get_channels(const AVCodecContext *obj);
27 uint64_t get_channel_layout_mask(const AVCodecContext *obj);
28 }
29 
30 namespace codec_context::internal {
31 const int *get_supported_samplerates(const struct AVCodec *codec);
32 }
33 
34 class CodecContext2 : public FFWrapperPtr<AVCodecContext>, public noncopyable
35 {
36 protected:
37  void swap(CodecContext2 &other);
38 
39  //
40  // No directly created
41  //
42 
44  using BaseWrapper::BaseWrapper;
45 
46  CodecContext2();
47 
48  // Stream decoding/encoding
49 #if AVCPP_HAS_AVFORMAT
50  CodecContext2(const class Stream &st,
51  const class Codec& codec,
52  Direction direction,
53  AVMediaType type);
54 #endif // if AVCPP_HAS_AVFORMAT
55 
56  // Stream independ decoding/encoding
57  CodecContext2(const class Codec &codec, Direction direction, AVMediaType type);
58 
60 
61  void setCodec(const class Codec &codec, bool resetDefaults, Direction direction, AVMediaType type, OptionalErrorCode ec = throws());
62 
63  AVMediaType codecType(AVMediaType contextType) const noexcept;
64 
65 public:
66 
67  using BaseWrapper::_log;
68 
69  //
70  // Common
71  //
72 
73  void open(OptionalErrorCode ec = throws());
74  void open(const Codec &codec, OptionalErrorCode ec = throws());
75  void open(class Dictionary &options, OptionalErrorCode ec = throws());
76  void open(class Dictionary &&options, OptionalErrorCode ec = throws());
77  void open(class Dictionary &options, const Codec &codec, OptionalErrorCode ec = throws());
78  void open(class Dictionary &&options, const Codec &codec, OptionalErrorCode ec = throws());
79 
80  [[deprecated("Start from FFmpeg 4.0 it is recommended to destroy and recreate codec context insted of close")]]
81  void close(OptionalErrorCode ec = throws());
82 
83  bool isOpened() const noexcept;
84  bool isValid() const noexcept;
85 
94  void copyContextFrom(const CodecContext2 &other, OptionalErrorCode ec = throws());
96 
97  Rational timeBase() const noexcept;
98  void setTimeBase(const Rational &value) noexcept;
99 
100 #if AVCPP_HAS_AVFORMAT
101  const Stream& stream() const noexcept;
102 #endif // if AVCPP_HAS_AVFORMAT
103  Codec codec() const noexcept;
104 
105  void setOption(const std::string &key, const std::string &val, OptionalErrorCode ec = throws());
106  void setOption(const std::string &key, const std::string &val, int flags, OptionalErrorCode ec = throws());
107 
108  int frameSize() const noexcept;
109  int64_t frameNumber() const noexcept;
110 
111  // Note, set ref counted to enable for multithreaded processing
112  bool isRefCountedFrames() const noexcept;
113  void setRefCountedFrames(bool refcounted) const noexcept;
114 
115  int strict() const noexcept;
116  void setStrict(int strict) noexcept;
117 
118  int64_t bitRate() const noexcept;
119  std::pair<int64_t, int64_t> bitRateRange() const noexcept;
120  void setBitRate(int64_t bitRate) noexcept;
121  void setBitRateRange(const std::pair<int64_t, int64_t> &bitRateRange) noexcept;
122 
123  // Flags
126  void setFlags(int flags) noexcept;
127  void addFlags(int flags) noexcept;
128  void clearFlags(int flags) noexcept;
129  int flags() noexcept;
130  bool isFlags(int flags) noexcept;
132 
133  // Flags 2
136  void setFlags2(int flags) noexcept;
137  void addFlags2(int flags) noexcept;
138  void clearFlags2(int flags) noexcept;
139  int flags2() noexcept;
140  bool isFlags2(int flags) noexcept;
142 
143 
144 protected:
145 
146  bool isValidForEncode(Direction direction, AVMediaType type) const noexcept;
147 
148  bool checkCodec(const Codec& codec, Direction direction, AVMediaType type, OptionalErrorCode ec);
149 
150  void open(const Codec &codec, AVDictionary **options, OptionalErrorCode ec);
151 
152 
153  std::pair<int, const std::error_category*>
154  decodeCommon(AVFrame *outFrame, const class Packet &inPacket, size_t offset, int &frameFinished,
155  int (*decodeProc)(AVCodecContext*, AVFrame*,int *, const AVPacket *)) noexcept;
156 
157  std::pair<int, const std::error_category*>
158  encodeCommon(class Packet &outPacket, const AVFrame *inFrame, int &gotPacket,
159  int (*encodeProc)(AVCodecContext*, AVPacket*,const AVFrame*, int*)) noexcept;
160 
161 public:
162  template<typename T>
163  std::pair<int, const std::error_category*>
164  decodeCommon(T &outFrame,
165  const class Packet &inPacket,
166  size_t offset,
167  int &frameFinished,
168  int (*decodeProc)(AVCodecContext *, AVFrame *, int *, const AVPacket *));
169 
170  template<typename T>
171  std::pair<int, const std::error_category*>
172  encodeCommon(class Packet &outPacket,
173  const T &inFrame,
174  int &gotPacket,
175  int (*encodeProc)(AVCodecContext *, AVPacket *, const AVFrame *, int *));
176 
177 private:
178 #if AVCPP_HAS_AVFORMAT
179  Stream m_stream;
180 #endif // if AVCPP_HAS_AVFORMAT
181 };
182 
183 
192 {
193 protected:
195 
196 public:
197  GenericCodecContext() = default;
198 
199 #if AVCPP_HAS_AVFORMAT
200  GenericCodecContext(Stream st);
201 #endif // if AVCPP_HAS_AVFORMAT
202 
204 
206 
207  AVMediaType codecType() const noexcept;
208 };
209 
210 
211 template<typename Clazz, Direction _direction, AVMediaType _type>
213 {
214 protected:
215  Clazz& moveOperator(Clazz &&rhs)
216  {
217  if (this == &rhs)
218  return static_cast<Clazz&>(*this);
219  Clazz(std::forward<Clazz>(rhs)).swap(static_cast<Clazz&>(*this));
220  return static_cast<Clazz&>(*this);
221  }
222 
224 
225 public:
226 
227  using CodecContext2::_log;
228 
230  : CodecContext2()
231  {
232  }
233 
234  // Stream decoding/encoding
235 #if AVCPP_HAS_AVFORMAT
236  explicit CodecContextBase(const class Stream &st, const class Codec& codec = Codec())
237  : CodecContext2(st, codec, _direction, _type)
238  {
239  }
240 #endif // if AVCPP_HAS_AVFORMAT
241 
242  // Stream independ decoding/encoding
243  explicit CodecContextBase(const Codec &codec)
244  : CodecContext2(codec, _direction, _type)
245  {
246  }
247 
248  //
249  // Disable copy/Activate move
250  //
252  : CodecContextBase()
253  {
254  swap(other);
255  }
256  //
257 
258 
259  void setCodec(const Codec &codec, OptionalErrorCode ec = throws())
260  {
261  setCodec(codec, false, _direction, _type, ec);
262  }
263 
264  void setCodec(const Codec &codec, bool resetDefaults, OptionalErrorCode ec = throws())
265  {
266  setCodec(codec, resetDefaults, _direction, _type, ec);
267  }
268 
269  AVMediaType codecType() const noexcept
270  {
271  return CodecContext2::codecType(_type);
272  }
273 };
274 
275 
276 template<typename Clazz, Direction _direction>
277 class VideoCodecContext : public CodecContextBase<Clazz, _direction, AVMEDIA_TYPE_VIDEO>
278 {
279 public:
281  using Parent::Parent;
282  using Parent::isValid;
283  using Parent::isOpened;
284 
285  int width() const
286  {
287  return RAW_GET2(isValid(), width, 0);
288  }
289 
290  int height() const
291  {
292  return RAW_GET2(isValid(), height, 0);
293  }
294 
295  int codedWidth() const
296  {
297  return RAW_GET2(isValid(), coded_width, 0);
298  }
299 
300  int codedHeight() const
301  {
302  return RAW_GET2(isValid(), coded_height, 0);
303  }
304 
306  {
307  return RAW_GET2(isValid(), pix_fmt, AV_PIX_FMT_NONE);
308  }
309 
310  int32_t globalQuality() const
311  {
312  return RAW_GET2(isValid(), global_quality, FF_LAMBDA_MAX);
313  }
314 
315  int32_t gopSize() const
316  {
317  return RAW_GET2(isValid(), gop_size, 0);
318  }
319 
320  int bitRateTolerance() const
321  {
322  return RAW_GET2(isValid(), bit_rate_tolerance, 0);
323  }
324 
325  int maxBFrames() const
326  {
327  return RAW_GET2(isValid(), max_b_frames, 0);
328  }
329 
331  {
332  return RAW_GET(sample_aspect_ratio, AVRational());
333  }
334 
335  void setWidth(int w) // Note, it also sets coded_width
336  {
337  if (isValid() && !isOpened())
338  {
339  m_raw->width = w;
340  m_raw->coded_width = w;
341  }
342  }
343 
344  void setHeight(int h) // Note, it also sets coded_height
345  {
346  if (isValid() && !isOpened())
347  {
348  m_raw->height = h;
349  m_raw->coded_height = h;
350  }
351  }
352 
353  void setCodedWidth(int w)
354  {
355  RAW_SET2(isValid() && !isOpened(), coded_width, w);
356  }
357 
358  void setCodedHeight(int h)
359  {
360  RAW_SET2(isValid() && !isOpened(), coded_height, h);
361  }
362 
363  void setPixelFormat(PixelFormat pixelFormat)
364  {
365  RAW_SET2(isValid(), pix_fmt, pixelFormat);
366  }
367 
368  void setGlobalQuality(int32_t quality)
369  {
370  if (quality < 0 || quality > FF_LAMBDA_MAX)
371  quality = FF_LAMBDA_MAX;
372 
373  RAW_SET2(isValid(), global_quality, quality);
374  }
375 
376  void setGopSize(int32_t size)
377  {
378  RAW_SET2(isValid(), gop_size, size);
379  }
380 
381  void setBitRateTolerance(int bitRateTolerance)
382  {
383  RAW_SET2(isValid(), bit_rate_tolerance, bitRateTolerance);
384  }
385 
386  void setMaxBFrames(int maxBFrames)
387  {
388  RAW_SET2(isValid(), max_b_frames, maxBFrames);
389  }
390 
391  void setSampleAspectRatio(const Rational& sampleAspectRatio)
392  {
393  RAW_SET(sample_aspect_ratio, sampleAspectRatio);
394  }
395 
396 protected:
397  using Parent::moveOperator;
398  using Parent::m_raw;
399 };
400 
401 
402 class VideoDecoderContext : public VideoCodecContext<VideoDecoderContext, Direction::Decoding>
403 {
404 public:
406  using Parent::Parent;
407 
408  VideoDecoderContext() = default;
410 
412 
424  VideoFrame decode(const Packet &packet,
425  OptionalErrorCode ec = throws(),
426  bool autoAllocateFrame = true);
427 
441  VideoFrame decode(const Packet &packet,
442  size_t offset,
443  size_t &decodedBytes,
444  OptionalErrorCode ec = throws(),
445  bool autoAllocateFrame = true);
446 
447 
448 private:
449  VideoFrame decodeVideo(OptionalErrorCode ec,
450  const Packet &packet,
451  size_t offset,
452  size_t *decodedBytes,
453  bool autoAllocateFrame);
454 
455 };
456 
457 
458 class VideoEncoderContext : public VideoCodecContext<VideoEncoderContext, Direction::Encoding>
459 {
460 public:
462  using Parent::Parent;
463 
464  VideoEncoderContext() = default;
466 
468 
478  Packet encode(OptionalErrorCode ec = throws());
479 
491  Packet encode(const VideoFrame &inFrame, OptionalErrorCode ec = throws());
492 
493 };
494 
495 
496 template<typename Clazz, Direction _direction>
497 class AudioCodecContext : public CodecContextBase<Clazz, _direction, AVMEDIA_TYPE_AUDIO>
498 {
499 public:
501  using Parent::Parent;
502  using Parent::isValid;
503  using Parent::isOpened;
504  using Parent::_log;
505 
506  int sampleRate() const noexcept
507  {
508  return RAW_GET2(isValid(), sample_rate, 0);
509  }
510 
511  int channels() const noexcept
512  {
513  if (!isValid())
514  return 0;
516  }
517 
518  SampleFormat sampleFormat() const noexcept
519  {
520  return RAW_GET2(isValid(), sample_fmt, AV_SAMPLE_FMT_NONE);
521  }
522 
523  uint64_t channelLayout() const noexcept
524  {
525  if (!isValid())
526  return 0;
528  }
529 
530 #if AVCPP_API_NEW_CHANNEL_LAYOUT
531  ChannelLayoutView channelLayout2() const noexcept
532  {
533  if (!isValid())
534  return ChannelLayoutView{};
535  return ChannelLayoutView{m_raw->ch_layout};
536  }
537 #endif
538 
539  void setSampleRate(int sampleRate) noexcept
540  {
541  if (!isValid())
542  return;
543 #if AVCPP_CXX_STANDARD >= 20
544  int sr = guessValue(sampleRate, make_array_view_until<const int>(codec_context::internal::get_supported_samplerates(m_raw->codec), 0));
545 #else
547 #endif
548  if (sr != sampleRate)
549  {
550  fflog(AV_LOG_INFO, "Guess sample rate %d instead unsupported %d\n", sr, sampleRate);
551  }
552  if (sr > 0)
553  m_raw->sample_rate = sr;
554  }
555 
556  void setChannels(int channels) noexcept
557  {
558  if (!isValid() || channels <= 0)
559  return;
561  }
562 
563  void setSampleFormat(SampleFormat sampleFormat) noexcept
564  {
565  RAW_SET2(isValid(), sample_fmt, sampleFormat);
566  }
567 
568  void setChannelLayout(uint64_t layout) noexcept
569  {
570  if (!isValid() || layout == 0)
571  return;
573  }
574 
575 #if AVCPP_API_NEW_CHANNEL_LAYOUT
576  void setChannelLayout(ChannelLayout layout) noexcept
577  {
578  if (!isValid() || !layout.isValid())
579  return;
580  m_raw->ch_layout = *layout.raw();
581  layout.release(); // is controlled by the CodecContext
582  }
583 #endif
584 
585 protected:
586  using Parent::moveOperator;
587  using Parent::m_raw;
588 };
589 
590 
591 class AudioDecoderContext : public AudioCodecContext<AudioDecoderContext, Direction::Decoding>
592 {
593 public:
595  using Parent::Parent;
596 
597  AudioDecoderContext() = default;
599 
601 
602  AudioSamples decode(const Packet &inPacket, OptionalErrorCode ec = throws());
603  AudioSamples decode(const Packet &inPacket, size_t offset, OptionalErrorCode ec = throws());
604 
605 };
606 
607 
608 class AudioEncoderContext : public AudioCodecContext<AudioEncoderContext, Direction::Encoding>
609 {
610 public:
612  using Parent::Parent;
613 
614  AudioEncoderContext() = default;
616 
618 
619  Packet encode(OptionalErrorCode ec = throws());
620  Packet encode(const AudioSamples &inSamples, OptionalErrorCode ec = throws());
621 
622 };
623 
624 
625 } // namespace av
#define fflog(level, format,...)
Default in-class logger.
Definition: avlog.h:27
Definition: codeccontext.h:498
void setChannels(int channels) noexcept
Definition: codeccontext.h:556
uint64_t channelLayout() const noexcept
Definition: codeccontext.h:523
SampleFormat sampleFormat() const noexcept
Definition: codeccontext.h:518
void setChannelLayout(uint64_t layout) noexcept
Definition: codeccontext.h:568
int channels() const noexcept
Definition: codeccontext.h:511
void setSampleRate(int sampleRate) noexcept
Definition: codeccontext.h:539
void setSampleFormat(SampleFormat sampleFormat) noexcept
Definition: codeccontext.h:563
int sampleRate() const noexcept
Definition: codeccontext.h:506
Definition: codeccontext.h:592
Definition: codeccontext.h:609
Definition: frame.h:450
Definition: codeccontext.h:35
bool isValidForEncode(Direction direction, AVMediaType type) const noexcept
Definition: codeccontext.cpp:804
Codec codec() const noexcept
Definition: codeccontext.cpp:645
bool isValid() const noexcept
Definition: codeccontext.cpp:572
int64_t bitRate() const noexcept
Definition: codeccontext.cpp:719
void clearFlags(int flags) noexcept
Definition: codeccontext.cpp:757
AVMediaType codecType(AVMediaType contextType) const noexcept
Definition: codeccontext.cpp:453
std::pair< int, const std::error_category * > decodeCommon(AVFrame *outFrame, const class Packet &inPacket, size_t offset, int &frameFinished, int(*decodeProc)(AVCodecContext *, AVFrame *, int *, const AVPacket *)) noexcept
void addFlags2(int flags) noexcept
Definition: codeccontext.cpp:780
void setOption(const std::string &key, const std::string &val, OptionalErrorCode ec=throws())
bool checkCodec(const Codec &codec, Direction direction, AVMediaType type, OptionalErrorCode ec)
Definition: codeccontext.cpp:845
Rational timeBase() const noexcept
Definition: codeccontext.cpp:628
void setBitRate(int64_t bitRate) noexcept
Definition: codeccontext.cpp:732
CodecContext2(const class Codec &codec, Direction direction, AVMediaType type)
int64_t frameNumber() const noexcept
Definition: codeccontext.cpp:679
void swap(CodecContext2 &other)
Definition: codeccontext.cpp:292
bool isOpened() const noexcept
Definition: codeccontext.cpp:567
~CodecContext2()
Definition: codeccontext.cpp:356
int flags() noexcept
Definition: codeccontext.cpp:763
void setBitRateRange(const std::pair< int64_t, int64_t > &bitRateRange) noexcept
Definition: codeccontext.cpp:737
void copyContextFrom(const CodecContext2 &other, OptionalErrorCode ec=throws())
Copy codec context from codec context associated with given stream or other codec context.
Definition: codeccontext.cpp:582
bool isFlags2(int flags) noexcept
Definition: codeccontext.cpp:797
std::pair< int, const std::error_category * > encodeCommon(class Packet &outPacket, const AVFrame *inFrame, int &gotPacket, int(*encodeProc)(AVCodecContext *, AVPacket *, const AVFrame *, int *)) noexcept
Definition: codeccontext.cpp:909
void open(OptionalErrorCode ec=throws())
Definition: codeccontext.cpp:465
CodecContext2()
Definition: codeccontext.cpp:301
bool isRefCountedFrames() const noexcept
Definition: codeccontext.cpp:688
std::pair< int64_t, int64_t > bitRateRange() const noexcept
Definition: codeccontext.cpp:724
int strict() const noexcept
Definition: codeccontext.cpp:704
bool isFlags(int flags) noexcept
Definition: codeccontext.cpp:768
void setFlags2(int flags) noexcept
Access to CODEC_FLAG2_* flags.
Definition: codeccontext.cpp:775
void setStrict(int strict) noexcept
Definition: codeccontext.cpp:709
void setRefCountedFrames(bool refcounted) const noexcept
Definition: codeccontext.cpp:697
void addFlags(int flags) noexcept
Definition: codeccontext.cpp:751
void setTimeBase(const Rational &value) noexcept
Definition: codeccontext.cpp:633
int frameSize() const noexcept
Definition: codeccontext.cpp:674
void clearFlags2(int flags) noexcept
Definition: codeccontext.cpp:786
void close(OptionalErrorCode ec=throws())
Definition: codeccontext.cpp:554
void setFlags(int flags) noexcept
Access to CODEC_FLAG_* flags.
Definition: codeccontext.cpp:746
int flags2() noexcept
Definition: codeccontext.cpp:792
void setCodec(const class Codec &codec, bool resetDefaults, Direction direction, AVMediaType type, OptionalErrorCode ec=throws())
Definition: codeccontext.cpp:379
Definition: codeccontext.h:213
Clazz & moveOperator(Clazz &&rhs)
Definition: codeccontext.h:215
CodecContextBase()
Definition: codeccontext.h:229
void setCodec(const Codec &codec, OptionalErrorCode ec=throws())
Definition: codeccontext.h:259
void setCodec(const Codec &codec, bool resetDefaults, OptionalErrorCode ec=throws())
Definition: codeccontext.h:264
CodecContextBase(CodecContextBase &&other)
Definition: codeccontext.h:251
CodecContextBase(const Codec &codec)
Definition: codeccontext.h:243
AVMediaType codecType() const noexcept
Definition: codeccontext.h:269
Definition: codec.h:18
Implements interface to access to the AVDictionary entity.
Definition: dictionary.h:31
The GenericCodecContext class to copy contexts from input streams to output one.
Definition: codeccontext.h:192
AVMediaType codecType() const noexcept
Definition: codeccontext.cpp:59
GenericCodecContext & operator=(GenericCodecContext &&rhs)
Definition: codeccontext.cpp:51
Definition: averror.h:64
Definition: packet.h:53
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
Definition: codeccontext.h:278
int bitRateTolerance() const
Definition: codeccontext.h:320
void setGopSize(int32_t size)
Definition: codeccontext.h:376
void setCodedHeight(int h)
Definition: codeccontext.h:358
int height() const
Definition: codeccontext.h:290
void setGlobalQuality(int32_t quality)
Definition: codeccontext.h:368
void setPixelFormat(PixelFormat pixelFormat)
Definition: codeccontext.h:363
PixelFormat pixelFormat() const
Definition: codeccontext.h:305
int codedHeight() const
Definition: codeccontext.h:300
void setCodedWidth(int w)
Definition: codeccontext.h:353
int codedWidth() const
Definition: codeccontext.h:295
void setSampleAspectRatio(const Rational &sampleAspectRatio)
Definition: codeccontext.h:391
void setWidth(int w)
Definition: codeccontext.h:335
void setBitRateTolerance(int bitRateTolerance)
Definition: codeccontext.h:381
void setMaxBFrames(int maxBFrames)
Definition: codeccontext.h:386
int maxBFrames() const
Definition: codeccontext.h:325
void setHeight(int h)
Definition: codeccontext.h:344
int32_t globalQuality() const
Definition: codeccontext.h:310
Rational sampleAspectRatio() const
Definition: codeccontext.h:330
int32_t gopSize() const
Definition: codeccontext.h:315
int width() const
Definition: codeccontext.h:285
Definition: codeccontext.h:403
Definition: codeccontext.h:459
Definition: frame.h:363
Definition: avutils.h:51
#define RAW_GET(field, def)
Definition: ffmpeg.h:47
#define RAW_SET(field, val)
Definition: ffmpeg.h:48
#define RAW_GET2(cond, field, def)
Definition: ffmpeg.h:50
#define RAW_SET2(cond, field, val)
Definition: ffmpeg.h:51
void set_channels(AVCodecContext *obj, int channels)
Definition: codeccontext.cpp:1122
int get_channels(const AVCodecContext *obj)
Definition: codeccontext.cpp:1158
uint64_t get_channel_layout_mask(const AVCodecContext *obj)
Definition: codeccontext.cpp:1174
void set_channel_layout_mask(AVCodecContext *obj, uint64_t mask)
Definition: codeccontext.cpp:1137
const int * get_supported_samplerates(const struct AVCodec *codec)
Definition: codeccontext.cpp:179
Definition: audioresampler.cpp:8
OptionalErrorCode throws()
Helper to construct null OptionalErrorCode object.
Definition: averror.h:179
Direction
Definition: codecparameters.h:16
T guessValue(const T &value, const L *list, C endListComparator)
Select more approptiate value from given value list.
Definition: avutils.h:562
Definition: averror.h:228
Definition: ffmpeg.h:22
void _log(int level, const char *fmt) const
Definition: ffmpeg.h:32
AVCodecContext * m_raw
Definition: ffmpeg.h:44
Definition: avutils.h:530