#include "ffmpeg_capture.h"
+#include "defs.h"
+#include "shared/shared_defs.h"
#include <assert.h>
+#include <cerrno>
+#include <ctime>
+#include <limits>
+#include <map>
+#include <memory>
+#include <movit/effect.h>
+#include <movit/image_format.h>
+#include <movit/ycbcr.h>
+#include <mutex>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <string>
#include <sys/stat.h>
-#include <unistd.h>
+#include <thread>
extern "C" {
#include <libavcodec/avcodec.h>
+#include <libavcodec/codec.h>
+#include <libavcodec/codec_id.h>
+#include <libavcodec/codec_par.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
+#include <libavutil/buffer.h>
+#include <libavutil/channel_layout.h>
+#include <libavutil/common.h>
+#include <libavutil/dict.h>
#include <libavutil/error.h>
#include <libavutil/frame.h>
-#include <libavutil/imgutils.h>
-#include <libavutil/mem.h>
+#include <libavutil/hwcontext.h>
+#include <libavutil/mathematics.h>
+#include <libavutil/pixdesc.h>
#include <libavutil/pixfmt.h>
-#include <libavutil/opt.h>
+#include <libavutil/rational.h>
+#include <libavutil/samplefmt.h>
+#include <libavutil/version.h>
+#include <libswresample/swresample.h>
#include <libswscale/swscale.h>
}
#include "shared/ffmpeg_raii.h"
#include "ffmpeg_util.h"
#include "flags.h"
-#include "image_input.h"
#include "ref_counted_frame.h"
#include "shared/timebase.h"
}
audio_format->num_channels = 2;
- int64_t channel_layout = audio_avframe->channel_layout;
- if (channel_layout == 0) {
- channel_layout = av_get_default_channel_layout(audio_avframe->channels);
+ AVChannelLayout channel_layout = audio_avframe->ch_layout;
+ if (!av_channel_layout_check(&channel_layout) ||
+ channel_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
+ av_channel_layout_default(&channel_layout, audio_avframe->ch_layout.nb_channels);
}
if (resampler == nullptr ||
audio_avframe->format != last_src_format ||
dst_format != last_dst_format ||
- channel_layout != last_channel_layout ||
+ av_channel_layout_compare(&channel_layout, &last_channel_layout) != 0||
audio_avframe->sample_rate != last_sample_rate) {
+ // TODO: When we get C++20, use AV_CHANNEL_LAYOUT_STEREO_DOWNMIX.
+ AVChannelLayout stereo_downmix;
+ stereo_downmix.order = AV_CHANNEL_ORDER_NATIVE;
+ stereo_downmix.nb_channels = 2;
+ stereo_downmix.u.mask = AV_CH_LAYOUT_STEREO_DOWNMIX;
+
swr_free(&resampler);
- resampler = swr_alloc_set_opts(nullptr,
- /*out_ch_layout=*/AV_CH_LAYOUT_STEREO_DOWNMIX,
- /*out_sample_fmt=*/dst_format,
- /*out_sample_rate=*/OUTPUT_FREQUENCY,
- /*in_ch_layout=*/channel_layout,
- /*in_sample_fmt=*/AVSampleFormat(audio_avframe->format),
- /*in_sample_rate=*/audio_avframe->sample_rate,
- /*log_offset=*/0,
- /*log_ctx=*/nullptr);
-
- if (resampler == nullptr) {
+ resampler = nullptr;
+ int err = swr_alloc_set_opts2(&resampler,
+ /*out_ch_layout=*/&stereo_downmix,
+ /*out_sample_fmt=*/dst_format,
+ /*out_sample_rate=*/OUTPUT_FREQUENCY,
+ /*in_ch_layout=*/&channel_layout,
+ /*in_sample_fmt=*/AVSampleFormat(audio_avframe->format),
+ /*in_sample_rate=*/audio_avframe->sample_rate,
+ /*log_offset=*/0,
+ /*log_ctx=*/nullptr);
+
+ if (err != 0 || resampler == nullptr) {
fprintf(stderr, "Allocating resampler failed.\n");
abort();
}