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.

72 lines
2.8 KiB

// Copyright 2020 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_SENDER_FFMPEG_GLUE_H_
#define CAST_STANDALONE_SENDER_FFMPEG_GLUE_H_
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/pixfmt.h>
#include <libavutil/samplefmt.h>
#include <libswresample/swresample.h>
}
#include <memory>
#include <utility>
namespace openscreen {
namespace cast {
namespace internal {
// Convenience allocator for a new AVFormatContext, given a file |path|. Returns
// nullptr on error. Note: MakeUniqueAVFormatContext() is the public API.
AVFormatContext* CreateAVFormatContextForFile(const char* path);
} // namespace internal
// 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_func) \
namespace internal { \
struct name##Freer { \
void operator()(name* obj) const { \
if (obj) { \
free_func(&obj); \
} \
} \
}; \
} \
\
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(AVFormatContext,
::openscreen::cast::internal::CreateAVFormatContextForFile,
avformat_close_input);
DEFINE_AV_UNIQUE_PTR(AVCodecContext,
avcodec_alloc_context3,
avcodec_free_context);
DEFINE_AV_UNIQUE_PTR(AVPacket, av_packet_alloc, av_packet_free);
DEFINE_AV_UNIQUE_PTR(AVFrame, av_frame_alloc, av_frame_free);
DEFINE_AV_UNIQUE_PTR(SwrContext, swr_alloc, swr_free);
#undef DEFINE_AV_UNIQUE_PTR
} // namespace cast
} // namespace openscreen
#endif // CAST_STANDALONE_SENDER_FFMPEG_GLUE_H_