- 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
epoxydep = dependency('epoxy')
libavcodecdep = dependency('libavcodec')
libavformatdep = dependency('libavformat')
-libavresampledep = dependency('libavresample')
+libswresampledep = dependency('libswresample')
libavutildep = dependency('libavutil')
libjpegdep = dependency('libjpeg')
libswscaledep = dependency('libswscale')
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')
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')]
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>
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);
}
AudioEncoder::~AudioEncoder()
{
av_frame_free(&audio_frame);
- avresample_free(&resampler);
+ swr_free(&resampler);
avcodec_free_context(&ctx);
}
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);
}
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
-#include <libavresample/avresample.h>
+#include <libswresample/swresample.h>
#include <libavutil/frame.h>
}
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;
};
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;
if (has_dequeue_callbacks) {
dequeue_cleanup_callback();
}
- avresample_free(&resampler);
+ swr_free(&resampler);
}
void FFmpegCapture::configure_card()
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);
}
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);
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;
#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>
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;
{
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);