You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
2.3 KiB
57 lines
2.3 KiB
// 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_
|