From: Steinar H. Gunderson Date: Thu, 20 Dec 2018 14:41:57 +0000 (+0100) Subject: Move to FFmpeg 4.0 APIs, fixing the deprecation warnings. X-Git-Tag: 1.8.1~64 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=1501c53153cb0daa846e4de7a73cfbfc797fd543 Move to FFmpeg 4.0 APIs, fixing the deprecation warnings. --- diff --git a/README b/README index f523f47..85a86f7 100644 --- 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 diff --git a/meson.build b/meson.build index 404f0af..417f286 100644 --- a/meson.build +++ b/meson.build @@ -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')] diff --git a/nageru/audio_encoder.cpp b/nageru/audio_encoder.cpp index f9faf42..7b72932 100644 --- a/nageru/audio_encoder.cpp +++ b/nageru/audio_encoder.cpp @@ -3,7 +3,7 @@ extern "C" { #include #include -#include +#include #include #include #include @@ -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(&audio), num_samples) < 0) { fprintf(stderr, "Audio conversion failed.\n"); exit(1); } diff --git a/nageru/audio_encoder.h b/nageru/audio_encoder.h index d28d7ee..3a47f99 100644 --- a/nageru/audio_encoder.h +++ b/nageru/audio_encoder.h @@ -11,7 +11,7 @@ extern "C" { #include #include -#include +#include #include } @@ -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 muxes; }; diff --git a/nageru/ffmpeg_capture.cpp b/nageru/ffmpeg_capture.cpp index c8b87fe..8f15973 100644 --- a/nageru/ffmpeg_capture.cpp +++ b/nageru/ffmpeg_capture.cpp @@ -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(audio_avframe->data), audio_avframe->linesize[0], audio_avframe->nb_samples); + int out_samples = swr_convert(resampler, &data, num_samples_room, + const_cast(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; diff --git a/nageru/ffmpeg_capture.h b/nageru/ffmpeg_capture.h index b0a1be2..468c213 100644 --- a/nageru/ffmpeg_capture.h +++ b/nageru/ffmpeg_capture.h @@ -31,7 +31,7 @@ #include extern "C" { -#include +#include #include #include #include @@ -271,7 +271,7 @@ private: std::vector command_queue; // Protected by . // Audio resampler. - AVAudioResampleContext *resampler = nullptr; + SwrContext *resampler = nullptr; AVSampleFormat last_src_format, last_dst_format; int64_t last_channel_layout; int last_sample_rate; diff --git a/nageru/quicksync_encoder.cpp b/nageru/quicksync_encoder.cpp index b5d7c2d..3b8886f 100644 --- a/nageru/quicksync_encoder.cpp +++ b/nageru/quicksync_encoder.cpp @@ -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);