mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
122 lines
4.1 KiB
Diff
122 lines
4.1 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: "Jan Alexander Steffens (heftig)" <heftig@archlinux.org>
|
||
|
Date: Sat, 5 Oct 2024 04:21:10 +0200
|
||
|
Subject: [PATCH] x265enc: Unbreak build with x265 4.0
|
||
|
|
||
|
Following a [similar change][1] in FFmpeg.
|
||
|
|
||
|
[1]: https://git.ffmpeg.org/gitweb/ffmpeg.git/commitdiff/1f801dfdb5066aadf0ade9cb5e94d620f33eacdc
|
||
|
---
|
||
|
.../gst-plugins-bad/ext/x265/gstx265enc.c | 29 ++++++++++++++-----
|
||
|
1 file changed, 21 insertions(+), 8 deletions(-)
|
||
|
|
||
|
diff --git a/subprojects/gst-plugins-bad/ext/x265/gstx265enc.c b/subprojects/gst-plugins-bad/ext/x265/gstx265enc.c
|
||
|
index e6aa973ac7cc..77de727061b1 100644
|
||
|
--- a/subprojects/gst-plugins-bad/ext/x265/gstx265enc.c
|
||
|
+++ b/subprojects/gst-plugins-bad/ext/x265/gstx265enc.c
|
||
|
@@ -1514,7 +1514,12 @@ gst_x265_enc_encode_frame (GstX265Enc * encoder, x265_picture * pic_in,
|
||
|
{
|
||
|
GstVideoCodecFrame *frame = NULL;
|
||
|
GstBuffer *out_buf = NULL;
|
||
|
- x265_picture pic_out;
|
||
|
+#if (X265_BUILD >= 210)
|
||
|
+ x265_picture pics_out[MAX_SCALABLE_LAYERS], *pics_outp[MAX_SCALABLE_LAYERS];
|
||
|
+#else
|
||
|
+ x265_picture pics_out[1];
|
||
|
+#endif
|
||
|
+ x265_picture *pic_out = &pics_out[0];
|
||
|
x265_nal *nal;
|
||
|
int i_size, i, offset;
|
||
|
int encoder_return;
|
||
|
@@ -1549,75 +1554,83 @@ gst_x265_enc_encode_frame (GstX265Enc * encoder, x265_picture * pic_in,
|
||
|
if (G_UNLIKELY (update_latency))
|
||
|
gst_x265_enc_set_latency (encoder);
|
||
|
|
||
|
+#if (X265_BUILD >= 210)
|
||
|
+ for (i = 0; i < MAX_SCALABLE_LAYERS; i++)
|
||
|
+ pics_outp[i] = &pics_out[i];
|
||
|
+
|
||
|
encoder_return = api->encoder_encode (encoder->x265enc,
|
||
|
- &nal, i_nal, pic_in, &pic_out);
|
||
|
+ &nal, i_nal, pic_in, pics_outp);
|
||
|
+#else
|
||
|
+ encoder_return = api->encoder_encode (encoder->x265enc,
|
||
|
+ &nal, i_nal, pic_in, pic_out);
|
||
|
+#endif
|
||
|
|
||
|
GST_DEBUG_OBJECT (encoder, "encoder result (%d) with %u nal units",
|
||
|
encoder_return, *i_nal);
|
||
|
|
||
|
if (encoder_return < 0) {
|
||
|
GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x265 frame failed."),
|
||
|
("x265_encoder_encode return code=%d", encoder_return));
|
||
|
ret = GST_FLOW_ERROR;
|
||
|
/* Make sure we finish this frame */
|
||
|
frame = input_frame;
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
/* Input frame is now queued */
|
||
|
if (input_frame)
|
||
|
gst_video_codec_frame_unref (input_frame);
|
||
|
|
||
|
if (!*i_nal) {
|
||
|
ret = GST_FLOW_OK;
|
||
|
GST_LOG_OBJECT (encoder, "no output yet");
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
frame = gst_video_encoder_get_frame (GST_VIDEO_ENCODER (encoder),
|
||
|
- GPOINTER_TO_INT (pic_out.userData));
|
||
|
+ GPOINTER_TO_INT (pic_out->userData));
|
||
|
g_assert (frame || !send);
|
||
|
|
||
|
GST_DEBUG_OBJECT (encoder,
|
||
|
- "output picture ready POC=%d system=%d frame found %d", pic_out.poc,
|
||
|
- GPOINTER_TO_INT (pic_out.userData), frame != NULL);
|
||
|
+ "output picture ready POC=%d system=%d frame found %d", pic_out->poc,
|
||
|
+ GPOINTER_TO_INT (pic_out->userData), frame != NULL);
|
||
|
|
||
|
if (!send || !frame) {
|
||
|
GST_LOG_OBJECT (encoder, "not sending (%d) or frame not found (%d)", send,
|
||
|
frame != NULL);
|
||
|
ret = GST_FLOW_OK;
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
i_size = 0;
|
||
|
offset = 0;
|
||
|
for (i = 0; i < *i_nal; i++)
|
||
|
i_size += nal[i].sizeBytes;
|
||
|
out_buf = gst_buffer_new_allocate (NULL, i_size, NULL);
|
||
|
for (i = 0; i < *i_nal; i++) {
|
||
|
gst_buffer_fill (out_buf, offset, nal[i].payload, nal[i].sizeBytes);
|
||
|
offset += nal[i].sizeBytes;
|
||
|
}
|
||
|
|
||
|
- if (pic_out.sliceType == X265_TYPE_IDR || pic_out.sliceType == X265_TYPE_I) {
|
||
|
+ if (pic_out->sliceType == X265_TYPE_IDR || pic_out->sliceType == X265_TYPE_I) {
|
||
|
GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
|
||
|
}
|
||
|
|
||
|
frame->output_buffer = out_buf;
|
||
|
|
||
|
if (encoder->push_header) {
|
||
|
GstBuffer *header;
|
||
|
|
||
|
header = gst_x265_enc_get_header_buffer (encoder);
|
||
|
frame->output_buffer = gst_buffer_append (header, frame->output_buffer);
|
||
|
encoder->push_header = FALSE;
|
||
|
}
|
||
|
|
||
|
GST_LOG_OBJECT (encoder,
|
||
|
"output: dts %" G_GINT64_FORMAT " pts %" G_GINT64_FORMAT,
|
||
|
- (gint64) pic_out.dts, (gint64) pic_out.pts);
|
||
|
+ (gint64) pic_out->dts, (gint64) pic_out->pts);
|
||
|
|
||
|
- frame->dts = pic_out.dts + encoder->dts_offset;
|
||
|
+ frame->dts = pic_out->dts + encoder->dts_offset;
|
||
|
|
||
|
out:
|
||
|
if (frame) {
|