aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryzrh <yzrh@noema.org>2023-06-20 13:07:32 +0000
committerFernando ApesteguĂ­a <fernape@FreeBSD.org>2023-06-21 05:45:27 +0000
commitcf95c7f7bf4c3b465f77629f3da2532f24c4034f (patch)
tree9acc12161a8237bc4517d2e8b0533fad9b2fbce9
parentbc8993b85b9486eec098bbfa8b175d255e9e42b8 (diff)
downloadports-cf95c7f7bf4c3b465f77629f3da2532f24c4034f.tar.gz
ports-cf95c7f7bf4c3b465f77629f3da2532f24c4034f.zip
multimedia/kodi: fix ac3 encoding for ffmpeg6
Add patch to fix the reported issue. PR: 272046 Reported by: yzrh@noema.org (maintainer)
-rw-r--r--multimedia/kodi/Makefile2
-rw-r--r--multimedia/kodi/files/patch-ffmpeg6-support67
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);