Can I create and use C++ smart pointers for different pointer types from FFmpeg?
- "AVCodecContext *" which is used only as a pointer in all functions except deallocation.
Alloc:
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
Free:
void avcodec_free_context(AVCodecContext **avctx);
Use:
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
Then the smart pointer:
std::shared_ptr<AVCodecContext> av_codec_context(avcodec_alloc_context3(av_codec),
[](AVCodecContext* _context)
{
if (_context) avcodec_free_context(&_context);
});
avcodec_open2(av_codec_context.get(), av_codec, NULL)
Is this correct?
- "AVDictionary **" which is used in all functions only as a pointer to a pointer.
Alloc and use:
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
where pm is a Pointer to a pointer to a dictionary struct. If *pm is NULL a dictionary struct is allocated and put in *pm.
Free:
void av_dict_free(AVDictionary **m);
Then a smart pointer:
std::shared_ptr<AVDictionary*> av_dict(new (AVDictionary*),
[](AVDictionary** _dict)
{
if (_dict)
{
if(*_dict)
av_dict_free(_dict);
delete _dict;
}
});
av_dict_set(av_dict.get(), "key", "value", 0);
Is this correct?
- "AVFormatContext *" which is used both as a pointer and as a pointer to a pointer.
Alloc:
AVFormatContext *avformat_alloc_context(void);
Free:
void avformat_free_context(AVFormatContext *s);
Use:
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
or
int avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options);
where ps is a Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). May be a pointer to NULL, in which case an AVFormatContext is allocated by this function and written into ps.
Then a smart pointer:
std::shared_ptr<AVFormatContext> av_format_context(avformat_alloc_context(),
[](AVFormatContext* _context)
{
if(_context)
avformat_free_context(_context);
});
avformat_find_stream_info(av_format_context.get(), NULL);
Is this correct? But how can I use it with the avformat_open_input() function, which needs a pointer to a pointer and may want to create an object by this pointer?
new (AVDictionary*)
leaks currently, and you don't need that allocation anyway