]> git.sesse.net Git - nageru/commitdiff
Move to FFmpeg 4.0 APIs, fixing the deprecation warnings.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 20 Dec 2018 14:41:57 +0000 (15:41 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 20 Dec 2018 14:41:57 +0000 (15:41 +0100)
README
meson.build
nageru/audio_encoder.cpp
nageru/audio_encoder.h
nageru/ffmpeg_capture.cpp
nageru/ffmpeg_capture.h
nageru/quicksync_encoder.cpp

diff --git a/README b/README
index f523f471958a8657372ef4992485cb62783173d9..85a86f70dcd511f6af890b41baa8c5990a324c04 100644 (file)
--- a/README
+++ b/README
@@ -59,8 +59,8 @@ Nageru currently needs:
 
  - x264 for encoding high-quality video suitable for streaming to end users.
 
- - ffmpeg for muxing, and for encoding audio. You will need at least
-   version 3.1.
+ - FFmpeg for muxing, and for encoding audio. You will need at least
+   version 4.0.
 
  - Working OpenGL; Movit works with almost any modern OpenGL implementation.
    Nageru has been tested with Intel on Mesa (you want 11.2 or newer, due
index 404f0af3b46e856c273a0b274f2c9e4c2a527c1b..417f28625a5c169ff8b149501d6c9f58f6af70fc 100644 (file)
@@ -12,7 +12,7 @@ dldep = cxx.find_library('dl')
 epoxydep = dependency('epoxy')
 libavcodecdep = dependency('libavcodec')
 libavformatdep = dependency('libavformat')
-libavresampledep = dependency('libavresample')
+libswresampledep = dependency('libswresample')
 libavutildep = dependency('libavutil')
 libjpegdep = dependency('libjpeg')
 libswscaledep = dependency('libswscale')
@@ -55,12 +55,6 @@ if cxx.has_argument('-Wno-non-virtual-dtor')
        add_project_arguments('-Wno-non-virtual-dtor', language: 'cpp')
 endif
 
-# FFmpeg has a lot of deprecated APIs whose replacements are not available
-# in Debian stable, so we suppress these warnings.
-if cxx.has_argument('-Wno-deprecated-declarations')
-       add_project_arguments('-Wno-deprecated-declarations', language: 'cpp')
-endif
-
 # This needs to be done before declaring any build targets.
 if get_option('cef_dir') != ''
        add_project_arguments('-DHAVE_CEF=1', language: 'cpp')
@@ -74,7 +68,7 @@ subdir('shared')
 
 nageru_srcs = []
 nageru_deps = [shareddep, qt5deps, libjpegdep, movitdep, protobufdep,
-       vax11dep, vadrmdep, x11dep, libavformatdep, libavresampledep, libavcodecdep, libavutildep,
+       vax11dep, vadrmdep, x11dep, libavformatdep, libswresampledep, libavcodecdep, libavutildep,
        libswscaledep, libusbdep, luajitdep, dldep, x264dep, alsadep, zitaresamplerdep,
        qcustomplotdep, threaddep]
 nageru_include_dirs = [include_directories('nageru')]
index f9faf42c349fdd926eb9f54263eb2f04d81240c7..7b72932f0b9ea1b4a6a4248001500f204326cf1d 100644 (file)
@@ -3,7 +3,7 @@
 extern "C" {
 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
-#include <libavresample/avresample.h>
+#include <libswresample/swresample.h>
 #include <libavutil/channel_layout.h>
 #include <libavutil/error.h>
 #include <libavutil/frame.h>
@@ -50,20 +50,21 @@ AudioEncoder::AudioEncoder(const string &codec_name, int bit_rate, const AVOutpu
                exit(1);
        }
 
-       resampler = avresample_alloc_context();
+       resampler = swr_alloc_set_opts(nullptr,
+                                      /*out_ch_layout=*/AV_CH_LAYOUT_STEREO,
+                                      /*out_sample_fmt=*/ctx->sample_fmt,
+                                      /*out_sample_rate=*/OUTPUT_FREQUENCY,
+                                      /*in_ch_layout=*/AV_CH_LAYOUT_STEREO,
+                                      /*in_sample_fmt=*/AV_SAMPLE_FMT_FLT,
+                                      /*in_sample_rate=*/OUTPUT_FREQUENCY,
+                                      /*log_offset=*/0,
+                                      /*log_ctx=*/nullptr);
        if (resampler == nullptr) {
                fprintf(stderr, "Allocating resampler failed.\n");
                exit(1);
        }
 
-       av_opt_set_int(resampler, "in_channel_layout",  AV_CH_LAYOUT_STEREO,       0);
-       av_opt_set_int(resampler, "out_channel_layout", AV_CH_LAYOUT_STEREO,       0);
-       av_opt_set_int(resampler, "in_sample_rate",     OUTPUT_FREQUENCY,          0);
-       av_opt_set_int(resampler, "out_sample_rate",    OUTPUT_FREQUENCY,          0);
-       av_opt_set_int(resampler, "in_sample_fmt",      AV_SAMPLE_FMT_FLT,         0);
-       av_opt_set_int(resampler, "out_sample_fmt",     ctx->sample_fmt, 0);
-
-       if (avresample_open(resampler) < 0) {
+       if (swr_init(resampler) < 0) {
                fprintf(stderr, "Could not open resample context.\n");
                exit(1);
        }
@@ -74,7 +75,7 @@ AudioEncoder::AudioEncoder(const string &codec_name, int bit_rate, const AVOutpu
 AudioEncoder::~AudioEncoder()
 {
        av_frame_free(&audio_frame);
-       avresample_free(&resampler);
+       swr_free(&resampler);
        avcodec_free_context(&ctx);
 }
 
@@ -118,8 +119,7 @@ void AudioEncoder::encode_audio_one_frame(const float *audio, size_t num_samples
                exit(1);
        }
 
-       if (avresample_convert(resampler, audio_frame->data, 0, num_samples,
-                              (uint8_t **)&audio, 0, num_samples) < 0) {
+       if (swr_convert(resampler, audio_frame->data, num_samples, reinterpret_cast<const uint8_t **>(&audio), num_samples) < 0) {
                fprintf(stderr, "Audio conversion failed.\n");
                exit(1);
        }
index d28d7eee3c04ff1d0ee89ac38e62cdae22260402..3a47f99afb0c3fe2cc792af12152312919017b39 100644 (file)
@@ -11,7 +11,7 @@
 extern "C" {
 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
-#include <libavresample/avresample.h>
+#include <libswresample/swresample.h>
 #include <libavutil/frame.h>
 }
 
@@ -39,7 +39,7 @@ private:
        int64_t last_pts = 0;  // The first pts after all audio we've encoded.
 
        AVCodecContext *ctx;
-       AVAudioResampleContext *resampler;
+       SwrContext *resampler;
        AVFrame *audio_frame = nullptr;
        std::vector<Mux *> muxes;
 };
index c8b87fee9628fa67776350f619768468d8e91e97..8f15973ba7eba8fc5d05d21268b873140023655a 100644 (file)
@@ -137,7 +137,7 @@ AVPixelFormat decide_dst_format(AVPixelFormat src_format, bmusb::PixelFormat dst
 YCbCrFormat decode_ycbcr_format(const AVPixFmtDescriptor *desc, const AVFrame *frame, bool is_mjpeg)
 {
        YCbCrFormat format;
-       AVColorSpace colorspace = av_frame_get_colorspace(frame);
+       AVColorSpace colorspace = frame->colorspace;
        switch (colorspace) {
        case AVCOL_SPC_BT709:
                format.luma_coefficients = YCBCR_REC_709;
@@ -231,7 +231,7 @@ FFmpegCapture::~FFmpegCapture()
        if (has_dequeue_callbacks) {
                dequeue_cleanup_callback();
        }
-       avresample_free(&resampler);
+       swr_free(&resampler);
 }
 
 void FFmpegCapture::configure_card()
@@ -753,22 +753,24 @@ void FFmpegCapture::convert_audio(const AVFrame *audio_avframe, FrameAllocator::
            audio_avframe->format != last_src_format ||
            dst_format != last_dst_format ||
            channel_layout != last_channel_layout ||
-           av_frame_get_sample_rate(audio_avframe) != last_sample_rate) {
-               avresample_free(&resampler);
-               resampler = avresample_alloc_context();
+           audio_avframe->sample_rate != last_sample_rate) {
+               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) {
                        fprintf(stderr, "Allocating resampler failed.\n");
                        exit(1);
                }
 
-               av_opt_set_int(resampler, "in_channel_layout",  channel_layout,                             0);
-               av_opt_set_int(resampler, "out_channel_layout", AV_CH_LAYOUT_STEREO_DOWNMIX,                0);
-               av_opt_set_int(resampler, "in_sample_rate",     av_frame_get_sample_rate(audio_avframe),    0);
-               av_opt_set_int(resampler, "out_sample_rate",    OUTPUT_FREQUENCY,                           0);
-               av_opt_set_int(resampler, "in_sample_fmt",      audio_avframe->format,                      0);
-               av_opt_set_int(resampler, "out_sample_fmt",     dst_format,                                 0);
-
-               if (avresample_open(resampler) < 0) {
+               if (swr_init(resampler) < 0) {
                        fprintf(stderr, "Could not open resample context.\n");
                        exit(1);
                }
@@ -776,15 +778,15 @@ void FFmpegCapture::convert_audio(const AVFrame *audio_avframe, FrameAllocator::
                last_src_format = AVSampleFormat(audio_avframe->format);
                last_dst_format = dst_format;
                last_channel_layout = channel_layout;
-               last_sample_rate = av_frame_get_sample_rate(audio_avframe);
+               last_sample_rate = audio_avframe->sample_rate;
        }
 
        size_t bytes_per_sample = (audio_format->bits_per_sample / 8) * 2;
        size_t num_samples_room = (audio_frame->size - audio_frame->len) / bytes_per_sample;
 
        uint8_t *data = audio_frame->data + audio_frame->len;
-       int out_samples = avresample_convert(resampler, &data, 0, num_samples_room,
-               const_cast<uint8_t **>(audio_avframe->data), audio_avframe->linesize[0], audio_avframe->nb_samples);
+       int out_samples = swr_convert(resampler, &data, num_samples_room,
+               const_cast<const uint8_t **>(audio_avframe->data), audio_avframe->nb_samples);
        if (out_samples < 0) {
                 fprintf(stderr, "Audio conversion failed.\n");
                 exit(1);
@@ -807,7 +809,7 @@ VideoFormat FFmpegCapture::construct_video_format(const AVFrame *frame, AVRation
                video_format.stride = width;
        }
        video_format.frame_rate_nom = video_timebase.den;
-       video_format.frame_rate_den = av_frame_get_pkt_duration(frame) * video_timebase.num;
+       video_format.frame_rate_den = frame->pkt_duration * video_timebase.num;
        if (video_format.frame_rate_nom == 0 || video_format.frame_rate_den == 0) {
                // Invalid frame rate.
                video_format.frame_rate_nom = 60;
index b0a1be2d542ce3b231bb4efe1263f43793c8b424..468c213d17f677a9235242a5d9f7b1bcecdeaba3 100644 (file)
@@ -31,7 +31,7 @@
 #include <movit/ycbcr.h>
 
 extern "C" {
-#include <libavresample/avresample.h>
+#include <libswresample/swresample.h>
 #include <libavutil/pixfmt.h>
 #include <libavutil/rational.h>
 #include <libavutil/samplefmt.h>
@@ -271,7 +271,7 @@ private:
        std::vector<QueuedCommand> command_queue;  // Protected by <queue_mu>.
 
        // Audio resampler.
-       AVAudioResampleContext *resampler = nullptr;
+       SwrContext *resampler = nullptr;
        AVSampleFormat last_src_format, last_dst_format;
        int64_t last_channel_layout;
        int last_sample_rate;
index b5d7c2d9dccf428665c954b161a57e6f76c3570c..3b8886ffc815da55715a51f663e501e2b23a6490 100644 (file)
@@ -1792,8 +1792,7 @@ void QuickSyncEncoderImpl::open_output_file(const std::string &filename)
 {
        AVFormatContext *avctx = avformat_alloc_context();
        avctx->oformat = av_guess_format(NULL, filename.c_str(), NULL);
-       assert(filename.size() < sizeof(avctx->filename) - 1);
-       strcpy(avctx->filename, filename.c_str());
+       avctx->url = strdup(filename.c_str());
 
        string url = "file:" + filename;
        int ret = avio_open2(&avctx->pb, url.c_str(), AVIO_FLAG_WRITE, &avctx->interrupt_callback, NULL);