1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef CAST_STANDALONE_RECEIVER_AVCODEC_GLUE_H_ 6*3f982cf4SFabien Sanglard #define CAST_STANDALONE_RECEIVER_AVCODEC_GLUE_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <memory> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard extern "C" { 11*3f982cf4SFabien Sanglard #include <libavcodec/avcodec.h> 12*3f982cf4SFabien Sanglard #include <libavutil/common.h> 13*3f982cf4SFabien Sanglard #include <libavutil/imgutils.h> 14*3f982cf4SFabien Sanglard #include <libavutil/samplefmt.h> 15*3f982cf4SFabien Sanglard } 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard namespace openscreen { 18*3f982cf4SFabien Sanglard namespace cast { 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard // Macro that, for an AVFoo, generates code for: 21*3f982cf4SFabien Sanglard // 22*3f982cf4SFabien Sanglard // using FooUniquePtr = std::unique_ptr<Foo, FooFreer>; 23*3f982cf4SFabien Sanglard // FooUniquePtr MakeUniqueFoo(...args...); 24*3f982cf4SFabien Sanglard #define DEFINE_AV_UNIQUE_PTR(name, create_func, free_statement) \ 25*3f982cf4SFabien Sanglard namespace internal { \ 26*3f982cf4SFabien Sanglard struct name##Freer { \ 27*3f982cf4SFabien Sanglard void operator()(name* obj) const { \ 28*3f982cf4SFabien Sanglard if (obj) { \ 29*3f982cf4SFabien Sanglard free_statement; \ 30*3f982cf4SFabien Sanglard } \ 31*3f982cf4SFabien Sanglard } \ 32*3f982cf4SFabien Sanglard }; \ 33*3f982cf4SFabien Sanglard } \ 34*3f982cf4SFabien Sanglard \ 35*3f982cf4SFabien Sanglard using name##UniquePtr = std::unique_ptr<name, internal::name##Freer>; \ 36*3f982cf4SFabien Sanglard \ 37*3f982cf4SFabien Sanglard template <typename... Args> \ 38*3f982cf4SFabien Sanglard name##UniquePtr MakeUnique##name(Args&&... args) { \ 39*3f982cf4SFabien Sanglard return name##UniquePtr(create_func(std::forward<Args>(args)...)); \ 40*3f982cf4SFabien Sanglard } 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard DEFINE_AV_UNIQUE_PTR(AVCodecParserContext, 43*3f982cf4SFabien Sanglard av_parser_init, 44*3f982cf4SFabien Sanglard av_parser_close(obj)); 45*3f982cf4SFabien Sanglard DEFINE_AV_UNIQUE_PTR(AVCodecContext, 46*3f982cf4SFabien Sanglard avcodec_alloc_context3, 47*3f982cf4SFabien Sanglard avcodec_free_context(&obj)); 48*3f982cf4SFabien Sanglard DEFINE_AV_UNIQUE_PTR(AVPacket, av_packet_alloc, av_packet_free(&obj)); 49*3f982cf4SFabien Sanglard DEFINE_AV_UNIQUE_PTR(AVFrame, av_frame_alloc, av_frame_free(&obj)); 50*3f982cf4SFabien Sanglard 51*3f982cf4SFabien Sanglard #undef DEFINE_AV_UNIQUE_PTR 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard } // namespace cast 54*3f982cf4SFabien Sanglard } // namespace openscreen 55*3f982cf4SFabien Sanglard 56*3f982cf4SFabien Sanglard #endif // CAST_STANDALONE_RECEIVER_AVCODEC_GLUE_H_ 57