git: cf95c7f7bf4c - main - multimedia/kodi: fix ac3 encoding for ffmpeg6
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 21 Jun 2023 05:50:44 UTC
The branch main has been updated by fernape: URL: https://cgit.FreeBSD.org/ports/commit/?id=cf95c7f7bf4c3b465f77629f3da2532f24c4034f commit cf95c7f7bf4c3b465f77629f3da2532f24c4034f Author: yzrh <yzrh@noema.org> AuthorDate: 2023-06-20 13:07:32 +0000 Commit: Fernando Apesteguía <fernape@FreeBSD.org> CommitDate: 2023-06-21 05:45:27 +0000 multimedia/kodi: fix ac3 encoding for ffmpeg6 Add patch to fix the reported issue. PR: 272046 Reported by: yzrh@noema.org (maintainer) --- multimedia/kodi/Makefile | 2 +- multimedia/kodi/files/patch-ffmpeg6-support | 67 ++++++++++++++++------------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/multimedia/kodi/Makefile b/multimedia/kodi/Makefile index e1bddf9a55d6..83753da338ac 100644 --- a/multimedia/kodi/Makefile +++ b/multimedia/kodi/Makefile @@ -1,6 +1,6 @@ PORTNAME= kodi DISTVERSION= 20.1 -PORTREVISION= 3 +PORTREVISION= 4 CATEGORIES= multimedia java # do not forget to fix devel/kodi-platform when updating kodi diff --git a/multimedia/kodi/files/patch-ffmpeg6-support b/multimedia/kodi/files/patch-ffmpeg6-support index 2ab9cbc27a3d..f337f73931b2 100644 --- a/multimedia/kodi/files/patch-ffmpeg6-support +++ b/multimedia/kodi/files/patch-ffmpeg6-support @@ -536,7 +536,7 @@ diff -urN xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp.orig xbmc/cores/Au avcodec_free_context(&m_CodecCtx); return false; } -@@ -242,62 +261,78 @@ +@@ -242,62 +261,83 @@ int CAEEncoderFFmpeg::Encode(uint8_t *in, int in_size, uint8_t *out, int out_size) { @@ -588,51 +588,56 @@ diff -urN xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp.orig xbmc/cores/Au - /* initialize the output packet */ - AVPacket* pkt = av_packet_alloc(); - if (!pkt) -- { -- CLog::Log(LOGERROR, "CAEEncoderFFmpeg::{} - av_packet_alloc failed: {}", __FUNCTION__, -- strerror(errno)); -- av_frame_free(&frame); -- return 0; -- } -+ pkt->size = out_size; -+ pkt->data = out; - -- pkt->size = out_size; -- pkt->data = out; + /* encode it */ + err = avcodec_send_frame(m_CodecCtx, frame); + if (err < 0) + throw FFMpegException("Error sending a frame for encoding (error '{}')", + FFMpegErrorToString(err)); - -- /* encode it */ -- int ret = avcodec_encode_audio2(m_CodecCtx, pkt, frame, &got_output); -+ while (err >= 0) ++ ++ err = avcodec_receive_packet(m_CodecCtx, pkt); ++ //! @TODO: This is a workaround for our current design. The caller should be made ++ // aware of the potential error values to use the ffmpeg API in a proper way, which means ++ // copying with EAGAIN and multiple packet output. ++ // For the current situation there is a relationship implicitely assumed of: ++ // 1 frame in - 1 packet out. This holds true in practice but the API does not guarantee it. ++ if (err >= 0) + { -+ err = avcodec_receive_packet(m_CodecCtx, pkt); -+ if (err == AVERROR(EAGAIN) || err == AVERROR_EOF) ++ if (pkt->size <= out_size) + { -+ av_channel_layout_uninit(&frame->ch_layout); -+ av_frame_free(&frame); -+ av_packet_free(&pkt); -+ return (err == AVERROR(EAGAIN)) ? -1 : 0; ++ memset(out, 0, out_size); ++ memcpy(out, pkt->data, pkt->size); ++ size = pkt->size; + } -+ else if (err < 0) ++ else + { -+ throw FFMpegException("Error during encoding (error '{}')", FFMpegErrorToString(err)); ++ CLog::LogF(LOGERROR, "Encoded pkt size ({}) is bigger than buffer ({})", pkt->size, ++ out_size); + } - -- int size = pkt->size; + av_packet_unref(pkt); + } - -+ size = pkt->size; ++ else ++ { ++ CLog::LogF(LOGERROR, "Error receiving encoded paket ({})", err); ++ } + } + catch (const FFMpegException& caught) -+ { + { +- CLog::Log(LOGERROR, "CAEEncoderFFmpeg::{} - av_packet_alloc failed: {}", __FUNCTION__, +- strerror(errno)); +- av_frame_free(&frame); +- return 0; + CLog::Log(LOGERROR, "CAEEncoderFFmpeg::{} - {}", __func__, caught.what()); -+ } -+ + } + +- pkt->size = out_size; +- pkt->data = out; ++ av_channel_layout_uninit(&frame->ch_layout); + +- /* encode it */ +- int ret = avcodec_encode_audio2(m_CodecCtx, pkt, frame, &got_output); +- +- int size = pkt->size; +- /* free temporary data */ av_frame_free(&frame);