blob: aa516175d340e0ca33781ee247d3d732318351a0 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CAST_STANDALONE_RECEIVER_AVCODEC_GLUE_H_
#define CAST_STANDALONE_RECEIVER_AVCODEC_GLUE_H_
#include <memory>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/samplefmt.h>
}
namespace openscreen {
namespace cast {
// Macro that, for an AVFoo, generates code for:
//
// using FooUniquePtr = std::unique_ptr<Foo, FooFreer>;
// FooUniquePtr MakeUniqueFoo(...args...);
#define DEFINE_AV_UNIQUE_PTR(name, create_func, free_statement) \
namespace internal { \
struct name##Freer { \
void operator()(name* obj) const { \
if (obj) { \
free_statement; \
} \
} \
}; \
} \
\
using name##UniquePtr = std::unique_ptr<name, internal::name##Freer>; \
\
template <typename... Args> \
name##UniquePtr MakeUnique##name(Args&&... args) { \
return name##UniquePtr(create_func(std::forward<Args>(args)...)); \
}
DEFINE_AV_UNIQUE_PTR(AVCodecParserContext,
av_parser_init,
av_parser_close(obj));
DEFINE_AV_UNIQUE_PTR(AVCodecContext,
avcodec_alloc_context3,
avcodec_free_context(&obj));
DEFINE_AV_UNIQUE_PTR(AVPacket, av_packet_alloc, av_packet_free(&obj));
DEFINE_AV_UNIQUE_PTR(AVFrame, av_frame_alloc, av_frame_free(&obj));
#undef DEFINE_AV_UNIQUE_PTR
} // namespace cast
} // namespace openscreen
#endif // CAST_STANDALONE_RECEIVER_AVCODEC_GLUE_H_