diff options
Diffstat (limited to 'multimedia/olive/files/patch-app_codec_ffmpeg_ffmpegencoder.cpp')
| -rw-r--r-- | multimedia/olive/files/patch-app_codec_ffmpeg_ffmpegencoder.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/multimedia/olive/files/patch-app_codec_ffmpeg_ffmpegencoder.cpp b/multimedia/olive/files/patch-app_codec_ffmpeg_ffmpegencoder.cpp new file mode 100644 index 000000000000..943c59accca8 --- /dev/null +++ b/multimedia/olive/files/patch-app_codec_ffmpeg_ffmpegencoder.cpp @@ -0,0 +1,108 @@ +--- app/codec/ffmpeg/ffmpegencoder.cpp.orig 2024-12-04 17:13:33 UTC ++++ app/codec/ffmpeg/ffmpegencoder.cpp +@@ -334,7 +334,11 @@ bool FFmpegEncoder::WriteAudioData(const AudioParams & + int output_sample_count = input_sample_count ? swr_get_out_samples(audio_resample_ctx_, input_sample_count) : 102400; + uint8_t** output_data = nullptr; + int output_linesize; ++#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) ++ av_samples_alloc_array_and_samples(&output_data, &output_linesize, audio_stream_->codecpar->ch_layout.nb_channels, ++#else + av_samples_alloc_array_and_samples(&output_data, &output_linesize, audio_stream_->codecpar->channels, ++#endif + output_sample_count, static_cast<AVSampleFormat>(audio_stream_->codecpar->format), 0); + + // Perform conversion +@@ -349,7 +353,11 @@ bool FFmpegEncoder::WriteAudioData(const AudioParams & + + av_samples_copy(audio_frame_->data, output_data, audio_frame_offset_, i, + copy_length, ++#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) ++ audio_frame_->ch_layout.nb_channels, static_cast<AVSampleFormat>(audio_frame_->format)); ++#else + audio_frame_->channels, static_cast<AVSampleFormat>(audio_frame_->format)); ++#endif + + audio_frame_offset_ += copy_length; + i += copy_length; +@@ -690,8 +698,12 @@ bool FFmpegEncoder::InitializeStream(AVMediaType type, + + // Assume audio stream + codec_ctx->sample_rate = params().audio_params().sample_rate(); ++#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) ++ av_channel_layout_from_mask(&codec_ctx->ch_layout, params().audio_params().channel_layout()); ++#else + codec_ctx->channel_layout = params().audio_params().channel_layout(); + codec_ctx->channels = av_get_channel_layout_nb_channels(codec_ctx->channel_layout); ++#endif + codec_ctx->sample_fmt = FFmpegUtils::GetFFmpegSampleFormat(params().audio_params().format()); + codec_ctx->time_base = {1, codec_ctx->sample_rate}; + +@@ -787,12 +799,19 @@ void FFmpegEncoder::FlushEncoders() + } + + if (fmt_ctx_) { ++#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(59, 0, 100) ++ // AVFMT_ALLOW_FLUSH removed in ffmpeg 7+, always allow flush now ++ int r = av_interleaved_write_frame(fmt_ctx_, nullptr); ++#else + if (fmt_ctx_->oformat->flags & AVFMT_ALLOW_FLUSH) { + int r = av_interleaved_write_frame(fmt_ctx_, nullptr); ++#endif + if (r < 0) { + FFmpegError(tr("Failed to write interleaved packet"), r); + } ++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100) + } ++#endif + } + } + +@@ -829,6 +848,28 @@ bool FFmpegEncoder::InitializeResampleContext(const Au + } + + // Create resample context ++#if LIBSWRESAMPLE_VERSION_INT >= AV_VERSION_INT(4, 5, 100) ++ AVChannelLayout out_ch_layout = AV_CHANNEL_LAYOUT_MASK(0, 0); ++ AVChannelLayout in_ch_layout = AV_CHANNEL_LAYOUT_MASK(0, 0); ++ av_channel_layout_from_mask(&out_ch_layout, audio_codec_ctx_->ch_layout.u.mask ? audio_codec_ctx_->ch_layout.u.mask : AV_CH_LAYOUT_STEREO); ++ av_channel_layout_from_mask(&in_ch_layout, audio.channel_layout()); ++ ++ int ret = swr_alloc_set_opts2(&audio_resample_ctx_, ++ &out_ch_layout, ++ audio_codec_ctx_->sample_fmt, ++ audio_codec_ctx_->sample_rate, ++ &in_ch_layout, ++ FFmpegUtils::GetFFmpegSampleFormat(audio.format()), ++ audio.sample_rate(), ++ 0, ++ nullptr); ++ av_channel_layout_uninit(&out_ch_layout); ++ av_channel_layout_uninit(&in_ch_layout); ++ ++ if (ret < 0) { ++ return false; ++ } ++#else + audio_resample_ctx_ = swr_alloc_set_opts(nullptr, + static_cast<int64_t>(audio_codec_ctx_->channel_layout), + audio_codec_ctx_->sample_fmt, +@@ -838,6 +879,7 @@ bool FFmpegEncoder::InitializeResampleContext(const Au + audio.sample_rate(), + 0, + nullptr); ++#endif + if (!audio_resample_ctx_) { + return false; + } +@@ -865,7 +907,11 @@ bool FFmpegEncoder::InitializeResampleContext(const Au + return false; + } + ++#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) ++ av_channel_layout_copy(&audio_frame_->ch_layout, &audio_codec_ctx_->ch_layout); ++#else + audio_frame_->channel_layout = audio_codec_ctx_->channel_layout; ++#endif + audio_frame_->format = audio_codec_ctx_->sample_fmt; + audio_frame_->nb_samples = audio_max_samples_; + |
