1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
/**********************************************************************
Audacity: A Digital Audio Editor
AVFrameWrapperImpl.inl
Dmitry Vedenko
**********************************************************************/
class AVChannelLayoutWrapperImpl : public AVChannelLayoutWrapper
{
public:
#if HAS_AV_CHANNEL_LAYOUT
AVChannelLayoutWrapperImpl(const FFmpegFunctions& ffmpeg, int channels)
{
ffmpeg.av_channel_layout_default(&mChannelLayout, channels);
}
explicit AVChannelLayoutWrapperImpl(const AVChannelLayout& layout) noexcept
: mChannelLayout(layout)
{
}
#else
AVChannelLayoutWrapperImpl(const FFmpegFunctions& ffmpeg, int channels)
: mChannelsCount { channels }
{
mLegacyChannelLayout = ffmpeg.av_get_default_channel_layout(channels);
}
AVChannelLayoutWrapperImpl(uint64_t layout, int channelsCount) noexcept
: mLegacyChannelLayout(layout)
, mChannelsCount(channelsCount)
{
}
#endif
uint64_t GetLegacyChannelLayout() const noexcept override
{
#if HAS_AV_CHANNEL_LAYOUT
return 0;
#else
return mLegacyChannelLayout;
#endif
}
int GetChannelsCount() const noexcept override
{
#if HAS_AV_CHANNEL_LAYOUT
return mChannelLayout.nb_channels;
#else
return mChannelsCount;
#endif
}
const AVChannelLayout* GetChannelLayout() const noexcept override
{
#if HAS_AV_CHANNEL_LAYOUT
return &mChannelLayout;
#else
return nullptr;
#endif
}
std::unique_ptr<AVChannelLayoutWrapper> Clone() const override
{
#if HAS_AV_CHANNEL_LAYOUT
return std::make_unique<AVChannelLayoutWrapperImpl>(
AVChannelLayoutWrapperImpl { mChannelLayout });
#else
return std::make_unique<AVChannelLayoutWrapperImpl>(
AVChannelLayoutWrapperImpl { mLegacyChannelLayout, mChannelsCount });
#endif
}
private:
#if HAS_AV_CHANNEL_LAYOUT
AVChannelLayout mChannelLayout {};
#else
uint64_t mLegacyChannelLayout {};
int mChannelsCount {};
#endif
}; // class AVChannelLayoutWrapperImpl
std::unique_ptr<AVChannelLayoutWrapper>
CreateDefaultChannelLayout(const FFmpegFunctions& functions, int channelsCount)
{
return std::make_unique<AVChannelLayoutWrapperImpl>(
functions, channelsCount);
}
std::unique_ptr<AVChannelLayoutWrapper> CreateLegacyChannelLayout(
const FFmpegFunctions& functions, uint64_t layout, int channelsCount)
{
#if HAS_AV_CHANNEL_LAYOUT
return nullptr;
#else
return std::make_unique<AVChannelLayoutWrapperImpl>(layout, channelsCount);
#endif
}
std::unique_ptr<AVChannelLayoutWrapper> CreateAVChannelLayout(
const FFmpegFunctions& functions, const AVChannelLayout* layout)
{
if (layout == nullptr)
return nullptr;
#if HAS_AV_CHANNEL_LAYOUT
return std::make_unique<AVChannelLayoutWrapperImpl>(*layout);
#else
return nullptr;
#endif
}
|