ffmpeg: update Amlogic patches with recent commits from test/5.1.4/main

Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
This commit is contained in:
Christian Hewitt 2024-03-05 11:10:45 +00:00
parent 353213effd
commit 23942f808a
No known key found for this signature in database
14 changed files with 894 additions and 0 deletions

View File

@ -0,0 +1,62 @@
From 162a9ac64b7babb4e831df86f6ed0efdfe84204e Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Fri, 12 Jan 2024 15:17:43 +0000
Subject: [PATCH 01/14] vf_bwdif: Add capability to deinterlace NV12
As bwdif takes no account of horizontally adjacent pixels the same
code can be used on planes that have multiple components as is used
on single component planes. Update the filtering code to cope with
multi-component planes and add NV12 to the list of supported formats.
Signed-off-by: John Cox <jc@kynesim.co.uk>
---
libavfilter/vf_bwdif.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c
index 9847d38b6a..4d69b3039d 100644
--- a/libavfilter/vf_bwdif.c
+++ b/libavfilter/vf_bwdif.c
@@ -302,19 +302,28 @@ static void filter(AVFilterContext *ctx, AVFrame *dstpic,
YADIFContext *yadif = &bwdif->yadif;
ThreadData td = { .frame = dstpic, .parity = parity, .tff = tff };
int i;
+ int last_plane = -1;
for (i = 0; i < yadif->csp->nb_components; i++) {
int w = dstpic->width;
int h = dstpic->height;
+ const AVComponentDescriptor * const comp = yadif->csp->comp + i;
+
+ // If the last plane was the same as this plane assume we've dealt
+ // with all the pels already
+ if (last_plane == comp->plane)
+ continue;
+ last_plane = comp->plane;
if (i == 1 || i == 2) {
w = AV_CEIL_RSHIFT(w, yadif->csp->log2_chroma_w);
h = AV_CEIL_RSHIFT(h, yadif->csp->log2_chroma_h);
}
- td.w = w;
- td.h = h;
- td.plane = i;
+ // comp step is in bytes but td.w is in pels
+ td.w = w * comp->step / ((comp->depth + 7) / 8);
+ td.h = h;
+ td.plane = comp->plane;
ff_filter_execute(ctx, filter_slice, &td, NULL,
FFMIN((h+3)/4, ff_filter_get_nb_threads(ctx)));
@@ -350,6 +359,7 @@ static const enum AVPixelFormat pix_fmts[] = {
AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+ AV_PIX_FMT_NV12,
AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP16,
--
2.34.1

View File

@ -0,0 +1,65 @@
From 4960acb627d736421251500b3e4e0e88d3b12cd1 Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Fri, 12 Jan 2024 16:46:27 +0000
Subject: [PATCH 02/14] v4l2_m2m_dec: Try to accomodate ffmpegs ideas about
default s/w fmts
---
libavcodec/v4l2_m2m_dec.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
index f67dd23ba1..3883223079 100644
--- a/libavcodec/v4l2_m2m_dec.c
+++ b/libavcodec/v4l2_m2m_dec.c
@@ -1079,7 +1079,6 @@ choose_capture_format(AVCodecContext * const avctx, V4L2m2mContext * const s)
unsigned int fmts_n;
uint32_t *fmts = ff_v4l2_context_enum_drm_formats(&s->capture, &fmts_n);
enum AVPixelFormat *fmts2 = NULL;
- enum AVPixelFormat t;
enum AVPixelFormat gf_pix_fmt;
unsigned int i;
unsigned int n = 0;
@@ -1089,7 +1088,7 @@ choose_capture_format(AVCodecContext * const avctx, V4L2m2mContext * const s)
if (!fmts)
return AVERROR(ENOENT);
- if ((fmts2 = av_malloc(sizeof(*fmts2) * (fmts_n + 2))) == NULL) {
+ if ((fmts2 = av_malloc(sizeof(*fmts2) * (fmts_n + 3))) == NULL) {
rv = AVERROR(ENOMEM);
goto error;
}
@@ -1110,17 +1109,25 @@ choose_capture_format(AVCodecContext * const avctx, V4L2m2mContext * const s)
pref_n = n;
fmts2[n++] = f;
}
- fmts2[n] = AV_PIX_FMT_NONE;
if (n < 2) {
av_log(avctx, AV_LOG_DEBUG, "%s: No usable formats found\n", __func__);
goto error;
}
- // Put preferred s/w format at the end - ff_get_format will put it in sw_pix_fmt
- t = fmts2[n - 1];
- fmts2[n - 1] = fmts2[pref_n];
- fmts2[pref_n] = t;
+ if (n != 2) {
+ // ffmpeg.c really only expects one s/w format. It thinks that the
+ // last format in the list is the s/w format of the h/w format but
+ // also chooses the first non-h/w format as the preferred s/w format.
+ // The only way of reconciling this is to dup our preferred format into
+ // both last & first place :-(
+ const enum AVPixelFormat t = fmts2[pref_n];
+ fmts2[pref_n] = fmts2[1];
+ fmts2[1] = t;
+ fmts2[n++] = t;
+ }
+
+ fmts2[n] = AV_PIX_FMT_NONE;
gf_pix_fmt = ff_get_format(avctx, fmts2);
av_log(avctx, AV_LOG_DEBUG, "avctx requested=%d (%s) %dx%d; get_format requested=%d (%s)\n",
--
2.34.1

View File

@ -0,0 +1,92 @@
From 80f74137438df2cfe911907242ec96593642f64b Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Thu, 18 Jan 2024 15:57:30 +0000
Subject: [PATCH 03/14] v4l2_m2m_dec: Fix cma allocated s/w output
---
libavcodec/v4l2_buffers.c | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
index e412636a7a..b3ef74bcd4 100644
--- a/libavcodec/v4l2_buffers.c
+++ b/libavcodec/v4l2_buffers.c
@@ -486,6 +486,11 @@ static void v4l2_free_bufref(void *opaque, uint8_t *data)
// Buffer still attached to context
V4L2m2mContext *s = buf_to_m2mctx(avbuf);
+ if (!s->output_drm && avbuf->dmabuf[0] != NULL) {
+ for (unsigned int i = 0; i != avbuf->num_planes; ++i)
+ dmabuf_read_end(avbuf->dmabuf[i]);
+ }
+
ff_mutex_lock(&ctx->lock);
ff_v4l2_buffer_set_avail(avbuf);
@@ -533,6 +538,9 @@ static int v4l2_buffer_export_drm(V4L2Buffer* avbuf)
avbuf->buf.m.planes[i].m.fd = dma_fd;
else
avbuf->buf.m.fd = dma_fd;
+
+ if (!s->output_drm)
+ avbuf->plane_info[i].mm_addr = dmabuf_map(avbuf->dmabuf[i]);
}
else {
struct v4l2_exportbuffer expbuf;
@@ -647,6 +655,11 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf)
break;
}
+ if (avbuf->dmabuf[0] != NULL) {
+ for (unsigned int i = 0; i != avbuf->num_planes; ++i)
+ dmabuf_read_start(avbuf->dmabuf[i]);
+ }
+
return 0;
}
@@ -947,6 +960,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct
V4L2Buffer * const avbuf = av_mallocz(sizeof(*avbuf));
AVBufferRef * bufref;
V4L2m2mContext * const s = ctx_to_m2mctx(ctx);
+ int want_mmap;
*pbufref = NULL;
if (avbuf == NULL)
@@ -988,10 +1002,10 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct
} else
avbuf->num_planes = 1;
- for (i = 0; i < avbuf->num_planes; i++) {
- const int want_mmap = avbuf->buf.memory == V4L2_MEMORY_MMAP &&
- (V4L2_TYPE_IS_OUTPUT(ctx->type) || !buf_to_m2mctx(avbuf)->output_drm);
+ want_mmap = avbuf->buf.memory == V4L2_MEMORY_MMAP &&
+ (V4L2_TYPE_IS_OUTPUT(ctx->type) || !buf_to_m2mctx(avbuf)->output_drm);
+ for (i = 0; i < avbuf->num_planes; i++) {
avbuf->plane_info[i].bytesperline = V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ?
ctx->format.fmt.pix_mp.plane_fmt[i].bytesperline :
ctx->format.fmt.pix.bytesperline;
@@ -1032,13 +1046,12 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct
avbuf->buf.length = avbuf->planes[0].length;
}
- if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) {
- if (s->output_drm) {
- ret = v4l2_buffer_export_drm(avbuf);
- if (ret) {
- av_log(logger(avbuf), AV_LOG_ERROR, "Failed to get exported drm handles\n");
- goto fail;
- }
+ if (!want_mmap) {
+ // export_drm does dmabuf alloc if we aren't using v4l2 alloc
+ ret = v4l2_buffer_export_drm(avbuf);
+ if (ret) {
+ av_log(logger(avbuf), AV_LOG_ERROR, "Failed to get exported drm handles\n");
+ goto fail;
}
}
--
2.34.1

View File

@ -0,0 +1,109 @@
From c1328b956e9856210b1f2bc20c20fd152c309123 Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Mon, 29 Jan 2024 15:12:34 +0000
Subject: [PATCH 04/14] v4l2_req: Fix media pool delete race
fds & polltasks associated with media fds that are still in flight are
not freed on delete but the main pool is leading to use after free when
they finally do complete. Stop scanning the free chain on delete and
simply delete everything, in-flight or not. This requires changing alloc
as the buffers weren't previously tracked in-flight.
---
libavcodec/v4l2_req_media.c | 38 ++++++++++++++++++++-----------------
1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c
index 0394bb2b23..c94cc5b0f6 100644
--- a/libavcodec/v4l2_req_media.c
+++ b/libavcodec/v4l2_req_media.c
@@ -86,6 +86,8 @@ struct media_pool {
int fd;
sem_t sem;
pthread_mutex_t lock;
+ unsigned int pool_n;
+ struct media_request * pool_reqs;
struct media_request * free_reqs;
struct pollqueue * pq;
};
@@ -251,18 +253,17 @@ int media_request_abort(struct media_request ** const preq)
return 0;
}
-static void delete_req_chain(struct media_request * const chain)
+static void free_req_pool(struct media_request * const pool, const unsigned int n)
{
- struct media_request * next = chain;
- while (next) {
- struct media_request * const req = next;
- next = req->next;
+ unsigned int i;
+ for (i = 0; i != n; ++i) {
+ struct media_request * const req = pool + i;
if (req->pt)
polltask_delete(&req->pt);
if (req->fd != -1)
close(req->fd);
- free(req);
}
+ free(pool);
}
struct media_pool * media_pool_new(const char * const media_path,
@@ -283,17 +284,16 @@ struct media_pool * media_pool_new(const char * const media_path,
goto fail1;
}
+ if ((mp->pool_reqs = calloc(n, sizeof(*mp->pool_reqs))) == NULL)
+ goto fail3;
+ mp->pool_n = n;
for (i = 0; i != n; ++i) {
- struct media_request * req = malloc(sizeof(*req));
- if (!req)
- goto fail4;
+ mp->pool_reqs[i].mp = mp;
+ mp->pool_reqs[i].fd = -1;
+ }
- *req = (struct media_request){
- .next = mp->free_reqs,
- .mp = mp,
- .fd = -1
- };
- mp->free_reqs = req;
+ for (i = 0; i != n; ++i) {
+ struct media_request * const req = mp->pool_reqs + i;
if (ioctl(mp->fd, MEDIA_IOC_REQUEST_ALLOC, &req->fd) == -1) {
request_log("Failed to alloc request %d: %s\n", i, strerror(errno));
@@ -303,6 +303,9 @@ struct media_pool * media_pool_new(const char * const media_path,
req->pt = polltask_new(pq, req->fd, POLLPRI, media_request_done, req);
if (!req->pt)
goto fail4;
+
+ req->next = mp->free_reqs,
+ mp->free_reqs = req;
}
sem_init(&mp->sem, 0, n);
@@ -310,7 +313,8 @@ struct media_pool * media_pool_new(const char * const media_path,
return mp;
fail4:
- delete_req_chain(mp->free_reqs);
+ free_req_pool(mp->pool_reqs, mp->pool_n);
+fail3:
close(mp->fd);
pthread_mutex_destroy(&mp->lock);
fail1:
@@ -327,7 +331,7 @@ void media_pool_delete(struct media_pool ** pMp)
return;
*pMp = NULL;
- delete_req_chain(mp->free_reqs);
+ free_req_pool(mp->pool_reqs, mp->pool_n);
close(mp->fd);
sem_destroy(&mp->sem);
pthread_mutex_destroy(&mp->lock);
--
2.34.1

View File

@ -0,0 +1,30 @@
From 613e5cbb5e0a7626377876e9a441c614afe1e25e Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Tue, 30 Jan 2024 14:24:59 +0000
Subject: [PATCH 05/14] drm_vout: Fix connector etc. desc memory leak
---
libavdevice/drm_vout.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c
index 491e1dc608..275748abdc 100644
--- a/libavdevice/drm_vout.c
+++ b/libavdevice/drm_vout.c
@@ -501,6 +501,13 @@ static int find_crtc(struct AVFormatContext * const avctx, int drmfd, struct drm
crtc ? crtc->height : 0,
(s->conId == (int)con->connector_id ?
" (chosen)" : ""));
+
+ if (crtc)
+ drmModeFreeCrtc(crtc);
+ if (enc)
+ drmModeFreeEncoder(enc);
+ if (con)
+ drmModeFreeConnector(con);
}
if (!s->conId) {
--
2.34.1

View File

@ -0,0 +1,58 @@
From f1868ad7d598cf4f194680a5e8d116744d8227cc Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Tue, 30 Jan 2024 16:20:53 +0000
Subject: [PATCH 06/14] conf_native: Add --tsan option
---
pi-util/conf_native.sh | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh
index f0ed159594..0dbaa53e97 100755
--- a/pi-util/conf_native.sh
+++ b/pi-util/conf_native.sh
@@ -10,6 +10,8 @@ RPI_KEEPS=""
NOSHARED=
MMAL=
USR_PREFIX=
+TOOLCHAIN=
+R=rel
while [ "$1" != "" ] ; do
case $1 in
@@ -22,6 +24,10 @@ while [ "$1" != "" ] ; do
--usr)
USR_PREFIX=/usr
;;
+ --tsan)
+ TOOLCHAIN="--toolchain=gcc-tsan"
+ R=tsan
+ ;;
*)
echo "Usage $0: [--noshared] [--mmal] [--usr]"
echo " noshared Build static libs and executable - good for testing"
@@ -82,11 +88,11 @@ V=`cat RELEASE`
SHARED_LIBS="--enable-shared"
if [ $NOSHARED ]; then
SHARED_LIBS="--disable-shared"
- OUT=$BUILDBASE/$B-$C-$V-static-rel
+ OUT=$BUILDBASE/$B-$C-$V-static-$R
echo Static libs
else
echo Shared libs
- OUT=$BUILDBASE/$B-$C-$V-shared-rel
+ OUT=$BUILDBASE/$B-$C-$V-shared-$R
fi
if [ ! $USR_PREFIX ]; then
@@ -106,6 +112,7 @@ $FFSRC/configure \
--libdir=$LIB_PREFIX\
--incdir=$INC_PREFIX\
$MCOPTS\
+ $TOOLCHAIN\
--disable-stripping\
--disable-thumb\
--enable-sand\
--
2.34.1

View File

@ -0,0 +1,166 @@
From 4f458f6ef9d74a44029dab3c0416f630c96a968b Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Tue, 30 Jan 2024 16:25:53 +0000
Subject: [PATCH 07/14] v4l2_m2m: Rework use of ctx->lock to avoid use while
uninit
---
libavcodec/v4l2_buffers.c | 9 ++--
libavcodec/v4l2_context.c | 86 +++++++++++++++++++++++++++------------
2 files changed, 63 insertions(+), 32 deletions(-)
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
index b3ef74bcd4..e844a1a0b6 100644
--- a/libavcodec/v4l2_buffers.c
+++ b/libavcodec/v4l2_buffers.c
@@ -484,7 +484,7 @@ static void v4l2_free_bufref(void *opaque, uint8_t *data)
if (ctx != NULL) {
// Buffer still attached to context
- V4L2m2mContext *s = buf_to_m2mctx(avbuf);
+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx);
if (!s->output_drm && avbuf->dmabuf[0] != NULL) {
for (unsigned int i = 0; i != avbuf->num_planes; ++i)
@@ -494,15 +494,14 @@ static void v4l2_free_bufref(void *opaque, uint8_t *data)
ff_mutex_lock(&ctx->lock);
ff_v4l2_buffer_set_avail(avbuf);
+ avbuf->buf.timestamp.tv_sec = 0;
+ avbuf->buf.timestamp.tv_usec = 0;
- if (s->draining && V4L2_TYPE_IS_OUTPUT(ctx->type)) {
+ if (V4L2_TYPE_IS_OUTPUT(ctx->type)) {
av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer avail\n", ctx->name);
- /* no need to queue more buffers to the driver */
}
else if (ctx->streamon) {
av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer requeue\n", ctx->name);
- avbuf->buf.timestamp.tv_sec = 0;
- avbuf->buf.timestamp.tv_usec = 0;
ff_v4l2_buffer_enqueue(avbuf); // will set to IN_DRIVER
}
else {
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
index a01a105892..0d61a432c3 100644
--- a/libavcodec/v4l2_context.c
+++ b/libavcodec/v4l2_context.c
@@ -906,56 +906,88 @@ static int stuff_all_buffers(AVCodecContext * avctx, V4L2Context* ctx)
}
}
+ ff_mutex_lock(&ctx->lock);
for (i = 0; i < ctx->num_buffers; ++i) {
struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data;
if (buf->status == V4L2BUF_AVAILABLE) {
rv = ff_v4l2_buffer_enqueue(buf);
if (rv < 0)
- return rv;
+ break;
}
}
- return 0;
+ ff_mutex_unlock(&ctx->lock);
+ return rv;
}
-int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd)
+static int set_streamon(AVCodecContext * const avctx, V4L2Context*const ctx)
{
int type = ctx->type;
int ret = 0;
- AVCodecContext * const avctx = logger(ctx);
+
+ if (!V4L2_TYPE_IS_OUTPUT(ctx->type))
+ stuff_all_buffers(avctx, ctx);
+
+ if (ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_STREAMON, &type) < 0) {
+ ret = AVERROR(errno);
+ av_log(avctx, AV_LOG_ERROR, "%s set status ON failed: err=%s\n", ctx->name,
+ av_err2str(ret));
+ return ret;
+ }
+
+ ctx->first_buf = 1;
+ ctx->streamon = 1;
+ ctx->flag_last = 0;
+ av_log(avctx, AV_LOG_DEBUG, "%s set status ON OK\n", ctx->name);
+ return ret;
+}
+
+static int set_streamoff(AVCodecContext * const avctx, V4L2Context*const ctx)
+{
+ int type = ctx->type;
+ int ret = 0;
+ const int has_bufs = ctx_buffers_alloced(ctx);
// Avoid doing anything if there is nothing we can do
- if (cmd == VIDIOC_STREAMOFF && !ctx_buffers_alloced(ctx) && !ctx->streamon)
+ if (!has_bufs && !ctx->streamon)
return 0;
- ff_mutex_lock(&ctx->lock);
-
- if (cmd == VIDIOC_STREAMON && !V4L2_TYPE_IS_OUTPUT(ctx->type))
- stuff_all_buffers(avctx, ctx);
+ if (has_bufs)
+ ff_mutex_lock(&ctx->lock);
- if (ioctl(ctx_to_m2mctx(ctx)->fd, cmd, &type) < 0) {
- const int err = errno;
- av_log(avctx, AV_LOG_ERROR, "%s set status %d (%s) failed: err=%d\n", ctx->name,
- cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF", err);
- ret = AVERROR(err);
+ if (ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_STREAMOFF, &type) < 0) {
+ ret = AVERROR(errno);
+ av_log(avctx, AV_LOG_ERROR, "%s set status ON failed: err=%s\n", ctx->name,
+ av_err2str(ret));
}
- else
- {
- if (cmd == VIDIOC_STREAMOFF)
- flush_all_buffers_status(ctx);
- else
- ctx->first_buf = 1;
+ else {
+ flush_all_buffers_status(ctx);
- ctx->streamon = (cmd == VIDIOC_STREAMON);
- av_log(avctx, AV_LOG_DEBUG, "%s set status %d (%s) OK\n", ctx->name,
- cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF");
+ ctx->streamon = 0;
+ ctx->flag_last = 0;
+
+ av_log(avctx, AV_LOG_DEBUG, "%s set status OFF OK\n", ctx->name);
}
- // Both stream off & on effectively clear flag_last
- ctx->flag_last = 0;
+ if (has_bufs)
+ ff_mutex_unlock(&ctx->lock);
+ return ret;
+}
- ff_mutex_unlock(&ctx->lock);
- return ret;
+int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd)
+{
+ AVCodecContext * const avctx = logger(ctx);
+
+ switch (cmd) {
+ case VIDIOC_STREAMOFF:
+ return set_streamoff(avctx, ctx);
+ case VIDIOC_STREAMON:
+ return set_streamon(avctx, ctx);
+ default:
+ av_log(avctx, AV_LOG_ERROR, "%s: Unexpected cmd: %d\n", __func__, cmd);
+ break;
+ }
+ return AVERROR_BUG;
}
int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame)
--
2.34.1

View File

@ -0,0 +1,25 @@
From e00b19de388fec567e37c10edeafa646d322afa6 Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Thu, 1 Feb 2024 18:11:06 +0000
Subject: [PATCH 08/14] matroskaenc: Fix H264 delayed extradata creation
---
libavformat/matroskaenc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 61e4c976ef..a6a00f03e7 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -1125,7 +1125,7 @@ static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn
case AV_CODEC_ID_WAVPACK:
return put_wv_codecpriv(dyn_cp, extradata, extradata_size);
case AV_CODEC_ID_H264:
- if (par->extradata_size)
+ if (extradata_size)
return ff_isom_write_avcc(dyn_cp, extradata,
extradata_size);
else
--
2.34.1

View File

@ -0,0 +1,34 @@
From 97c735a3fc0976aa50d819a2f397e9467228722d Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Thu, 1 Feb 2024 18:12:38 +0000
Subject: [PATCH 09/14] matroskaenc: Assume H264 is Annex B if no extradata
---
libavformat/matroskaenc.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index a6a00f03e7..131ad31d1b 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -3194,9 +3194,15 @@ static int mkv_init(struct AVFormatContext *s)
track->reformat = mkv_reformat_wavpack;
break;
case AV_CODEC_ID_H264:
+ // Default to reformat if no extradata as the only current
+ // encoder which does this is v4l2m2m which needs reformat
+ if (par->extradata_size == 0 ||
+ (par->extradata_size > 3 &&
+ (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)))
+ track->reformat = mkv_reformat_h2645;
+ break;
case AV_CODEC_ID_HEVC:
- if ((par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 0 ||
- par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 6) &&
+ if (par->extradata_size > 6 &&
(AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1))
track->reformat = mkv_reformat_h2645;
break;
--
2.34.1

View File

@ -0,0 +1,42 @@
From 47212b4641888cbf131cbc2f9da58af68e4c92e5 Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Fri, 16 Feb 2024 11:50:56 +0000
Subject: [PATCH 10/14] aarch64/rgb2rgb: Change incorrect SXTX to stxw
---
libswscale/aarch64/rgb2rgb_neon.S | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/libswscale/aarch64/rgb2rgb_neon.S b/libswscale/aarch64/rgb2rgb_neon.S
index 0956800b41..38f83a1b78 100644
--- a/libswscale/aarch64/rgb2rgb_neon.S
+++ b/libswscale/aarch64/rgb2rgb_neon.S
@@ -338,8 +338,8 @@ function ff_bgr24toyv12_aarch64, export=1
b.eq 90f
subs w9, w4, #0
- add x0, x0, w14, SXTX
- add x1, x1, w6, SXTX
+ add x0, x0, w14, sxtw
+ add x1, x1, w6, sxtw
mov x10, x0
mov x11, x1
b.lt 12f
@@ -424,10 +424,10 @@ function ff_bgr24toyv12_aarch64, export=1
// ------------------- Loop to start
- add x0, x0, w14, SXTX
- add x1, x1, w6, SXTX
- add x2, x2, w7, SXTX
- add x3, x3, w7, SXTX
+ add x0, x0, w14, sxtw
+ add x1, x1, w6, sxtw
+ add x2, x2, w7, sxtw
+ add x3, x3, w7, sxtw
subs w5, w5, #1
b.gt 11b
90:
--
2.34.1

View File

@ -0,0 +1,130 @@
From d346c57fec8c75e2f36368a5f62f91389e9b7547 Mon Sep 17 00:00:00 2001
From: James Le Cuirot <chewi@gentoo.org>
Date: Sat, 17 Feb 2024 13:29:36 +0000
Subject: [PATCH 11/14] aarch64/rpi_sand: Fix building under Clang/LLVM
The "Arm A64 Instruction Set Architecture" manual says that the MOV
(element) instruction takes the form `MOV <Vd>.<Ts>[<index1>],
<Vn>.<Ts>[<index2>]`, where `<Ts>` is one of B, H, S, or D. Only certain
other instructions accept a number in front. GNU as allows you to
include it for any instruction, but this is non-standard. This is
explained at https://stackoverflow.com/questions/71907156.
---
libavutil/aarch64/rpi_sand_neon.S | 50 +++++++++++++++----------------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S
index 11658de0c8..3a6bc3de74 100644
--- a/libavutil/aarch64/rpi_sand_neon.S
+++ b/libavutil/aarch64/rpi_sand_neon.S
@@ -387,13 +387,13 @@ function ff_rpi_sand30_lines_to_planar_c16, export=1
st3 {v0.4h - v2.4h}, [x0], #24
st3 {v16.4h - v18.4h}, [x2], #24
beq 11b
- mov v0.2d[0], v0.2d[1]
+ mov v0.d[0], v0.d[1]
sub w9, w9, #12
- mov v1.2d[0], v1.2d[1]
- mov v2.2d[0], v2.2d[1]
- mov v16.2d[0], v16.2d[1]
- mov v17.2d[0], v17.2d[1]
- mov v18.2d[0], v18.2d[1]
+ mov v1.d[0], v1.d[1]
+ mov v2.d[0], v2.d[1]
+ mov v16.d[0], v16.d[1]
+ mov v17.d[0], v17.d[1]
+ mov v18.d[0], v18.d[1]
1:
cmp w9, #6-48
blt 1f
@@ -526,28 +526,28 @@ function ff_rpi_sand30_lines_to_planar_y16, export=1
blt 1f
st3 {v16.4h, v17.4h, v18.4h}, [x0], #24
beq 11b
- mov v16.2d[0], v16.2d[1]
+ mov v16.d[0], v16.d[1]
sub w5, w5, #12
- mov v17.2d[0], v17.2d[1]
- mov v18.2d[0], v18.2d[1]
+ mov v17.d[0], v17.d[1]
+ mov v18.d[0], v18.d[1]
1:
cmp w5, #6-96
blt 1f
st3 {v16.h, v17.h, v18.h}[0], [x0], #6
st3 {v16.h, v17.h, v18.h}[1], [x0], #6
beq 11b
- mov v16.2s[0], v16.2s[1]
+ mov v16.s[0], v16.s[1]
sub w5, w5, #6
- mov v17.2s[0], v17.2s[1]
- mov v18.2s[0], v18.2s[1]
+ mov v17.s[0], v17.s[1]
+ mov v18.s[0], v18.s[1]
1:
cmp w5, #3-96
blt 1f
st3 {v16.h, v17.h, v18.h}[0], [x0], #6
beq 11b
- mov v16.4h[0], v16.4h[1]
+ mov v16.h[0], v16.h[1]
sub w5, w5, #3
- mov v17.4h[0], v17.4h[1]
+ mov v17.h[0], v17.h[1]
1:
cmp w5, #2-96
blt 1f
@@ -625,10 +625,10 @@ function ff_rpi_sand30_lines_to_planar_y8, export=1
blt 1f
st3 {v16.8b, v17.8b, v18.8b}, [x0], #24
beq 11b
- mov v16.2d[0], v16.2d[1]
+ mov v16.d[0], v16.d[1]
sub w5, w5, #24
- mov v17.2d[0], v17.2d[1]
- mov v18.2d[0], v18.2d[1]
+ mov v17.d[0], v17.d[1]
+ mov v18.d[0], v18.d[1]
1:
cmp w5, #12-96
blt 1f
@@ -637,28 +637,28 @@ function ff_rpi_sand30_lines_to_planar_y8, export=1
st3 {v16.b, v17.b, v18.b}[2], [x0], #3
st3 {v16.b, v17.b, v18.b}[3], [x0], #3
beq 11b
- mov v16.2s[0], v16.2s[1]
+ mov v16.s[0], v16.s[1]
sub w5, w5, #12
- mov v17.2s[0], v17.2s[1]
- mov v18.2s[0], v18.2s[1]
+ mov v17.s[0], v17.s[1]
+ mov v18.s[0], v18.s[1]
1:
cmp w5, #6-96
blt 1f
st3 {v16.b, v17.b, v18.b}[0], [x0], #3
st3 {v16.b, v17.b, v18.b}[1], [x0], #3
beq 11b
- mov v16.4h[0], v16.4h[1]
+ mov v16.h[0], v16.h[1]
sub w5, w5, #6
- mov v17.4h[0], v17.4h[1]
- mov v18.4h[0], v18.4h[1]
+ mov v17.h[0], v17.h[1]
+ mov v18.h[0], v18.h[1]
1:
cmp w5, #3-96
blt 1f
st3 {v16.b, v17.b, v18.b}[0], [x0], #3
beq 11b
- mov v16.8b[0], v16.8b[1]
+ mov v16.b[0], v16.b[1]
sub w5, w5, #3
- mov v17.8b[0], v17.8b[1]
+ mov v17.b[0], v17.b[1]
1:
cmp w5, #2-96
blt 1f
--
2.34.1

View File

@ -0,0 +1,27 @@
From 07ff7baa79d23620d293b03fc2445c43bdacb34a Mon Sep 17 00:00:00 2001
From: James Le Cuirot <chewi@gentoo.org>
Date: Sat, 17 Feb 2024 14:37:44 +0000
Subject: [PATCH 12/14] rtpenc: Fix building with GCC 14
This incompatible pointer type issue became a fatal error in GCC 14. The
AVBuffer API started using size_t in 5.0 with ef6a9e5e.
---
libavformat/rtpenc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
index f67dc2a15a..1f1e4cb25a 100644
--- a/libavformat/rtpenc.c
+++ b/libavformat/rtpenc.c
@@ -588,7 +588,7 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
case AV_CODEC_ID_H264:
{
uint8_t *side_data;
- int side_data_size = 0;
+ size_t side_data_size = 0;
side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
&side_data_size);
--
2.34.1

View File

@ -0,0 +1,26 @@
From aa44997bf59e2aca86a38cb65755861c413b2609 Mon Sep 17 00:00:00 2001
From: James Le Cuirot <chewi@gentoo.org>
Date: Sun, 18 Feb 2024 09:18:31 +0000
Subject: [PATCH 13/14] v4l2_req: Fix building against musl by including
pthread.h
---
libavcodec/v4l2_req_decode_q.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/libavcodec/v4l2_req_decode_q.h b/libavcodec/v4l2_req_decode_q.h
index af7bbe1de4..27eafbc42b 100644
--- a/libavcodec/v4l2_req_decode_q.h
+++ b/libavcodec/v4l2_req_decode_q.h
@@ -1,6 +1,8 @@
#ifndef AVCODEC_V4L2_REQ_DECODE_Q_H
#define AVCODEC_V4L2_REQ_DECODE_Q_H
+#include <pthread.h>
+
typedef struct req_decode_ent {
struct req_decode_ent * next;
struct req_decode_ent * prev;
--
2.34.1

View File

@ -0,0 +1,28 @@
From b3d4a1be1582195480c0f166744ada70f7457a5c Mon Sep 17 00:00:00 2001
From: John Cox <jc@kynesim.co.uk>
Date: Tue, 27 Feb 2024 12:57:08 +0000
Subject: [PATCH 14/14] v4l2_buffers: Fix init of drmprime source (OUTPUT)
buffers for encode
Previous fix for mmaped dmabuf CAPTURE buffers broke this due to failure
to note that dmabuf export wasn't wanted for OUTPUT buffers.
---
libavcodec/v4l2_buffers.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
index e844a1a0b6..2d1db41a30 100644
--- a/libavcodec/v4l2_buffers.c
+++ b/libavcodec/v4l2_buffers.c
@@ -1045,7 +1045,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct
avbuf->buf.length = avbuf->planes[0].length;
}
- if (!want_mmap) {
+ if (V4L2_TYPE_IS_CAPTURE(ctx->type) && !want_mmap) {
// export_drm does dmabuf alloc if we aren't using v4l2 alloc
ret = v4l2_buffer_export_drm(avbuf);
if (ret) {
--
2.34.1