X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_filter_graph.cc;h=cb888c16206459f50be0e80680f9df6acdad31f4;hb=a37dbbc42a99baeea21f8937f114fb350001595c;hp=fc43b5a344a972a9ef20d69e1257441024616412;hpb=1516214cdc7970797b79bca06b46a2eed16a1da3;p=dcpomatic.git diff --git a/src/lib/audio_filter_graph.cc b/src/lib/audio_filter_graph.cc index fc43b5a34..cb888c162 100644 --- a/src/lib/audio_filter_graph.cc +++ b/src/lib/audio_filter_graph.cc @@ -18,9 +18,12 @@ */ -#include "audio_filter_graph.h" + #include "audio_buffers.h" +#include "audio_filter_graph.h" #include "compose.hpp" +#include "dcpomatic_assert.h" +#include "exceptions.h" extern "C" { #include #include @@ -31,9 +34,12 @@ extern "C" { #include "i18n.h" -using std::string; + using std::cout; +using std::make_shared; using std::shared_ptr; +using std::string; + AudioFilterGraph::AudioFilterGraph (int sample_rate, int channels) : _sample_rate (sample_rate) @@ -42,13 +48,12 @@ AudioFilterGraph::AudioFilterGraph (int sample_rate, int channels) /* FFmpeg doesn't know any channel layouts for any counts between 8 and 16, so we need to tell it we're using 16 channels if we are using more than 8. */ - if (_channels > 8) { - _channel_layout = av_get_default_channel_layout (16); - } else { - _channel_layout = av_get_default_channel_layout (_channels); - } + av_channel_layout_default(&_channel_layout, _channels > 8 ? 16 : _channels); _in_frame = av_frame_alloc (); + if (_in_frame == nullptr) { + throw std::bad_alloc(); + } } AudioFilterGraph::~AudioFilterGraph() @@ -60,7 +65,7 @@ string AudioFilterGraph::src_parameters () const { char layout[64]; - av_get_channel_layout_string (layout, sizeof(layout), 0, _channel_layout); + av_channel_layout_describe(&_channel_layout, layout, sizeof(layout)); char buffer[256]; snprintf ( @@ -79,8 +84,9 @@ AudioFilterGraph::set_parameters (AVFilterContext* context) const int r = av_opt_set_int_list (context, "sample_fmts", sample_fmts, AV_SAMPLE_FMT_NONE, AV_OPT_SEARCH_CHILDREN); DCPOMATIC_ASSERT (r >= 0); - int64_t channel_layouts[] = { _channel_layout, -1 }; - r = av_opt_set_int_list (context, "channel_layouts", channel_layouts, -1, AV_OPT_SEARCH_CHILDREN); + char ch_layout[64]; + av_channel_layout_describe(&_channel_layout, ch_layout, sizeof(ch_layout)); + r = av_opt_set(context, "ch_layouts", ch_layout, AV_OPT_SEARCH_CHILDREN); DCPOMATIC_ASSERT (r >= 0); int sample_rates[] = { _sample_rate, -1 }; @@ -102,10 +108,10 @@ AudioFilterGraph::sink_name () const } void -AudioFilterGraph::process (shared_ptr buffers) +AudioFilterGraph::process (shared_ptr buffers) { DCPOMATIC_ASSERT (buffers->frames() > 0); - int const process_channels = av_get_channel_layout_nb_channels (_channel_layout); + int const process_channels = _channel_layout.nb_channels; DCPOMATIC_ASSERT (process_channels >= buffers->channels()); if (buffers->channels() < process_channels) { @@ -113,7 +119,7 @@ AudioFilterGraph::process (shared_ptr buffers) the constructor) so we need to create new buffers with some extra silent channels. */ - shared_ptr extended_buffers (new AudioBuffers (process_channels, buffers->frames())); + auto extended_buffers = make_shared(process_channels, buffers->frames()); for (int i = 0; i < buffers->channels(); ++i) { extended_buffers->copy_channel_from (buffers.get(), i, i); } @@ -135,8 +141,10 @@ AudioFilterGraph::process (shared_ptr buffers) _in_frame->nb_samples = buffers->frames (); _in_frame->format = AV_SAMPLE_FMT_FLTP; _in_frame->sample_rate = _sample_rate; - _in_frame->channel_layout = _channel_layout; + _in_frame->ch_layout = _channel_layout; +LIBDCP_DISABLE_WARNINGS _in_frame->channels = process_channels; +LIBDCP_ENABLE_WARNINGS int r = av_buffersrc_write_frame (_buffer_src_context, _in_frame);