ffmpeg: update rpi patch

Patch created using revisions dc91b91..34fb1cd
from branch dev/4.4/rpi_import_1 of https://github.com/jc-kynesim/rpi-ffmpeg
This commit is contained in:
Matthias Reichl 2022-03-11 17:11:52 +01:00
parent 9390f49b64
commit 34bc440c43

View File

@ -47380,7 +47380,7 @@ index 8dbc7fc104..7d5fadcd3d 100644
/** /**
* Enqueues a V4L2Buffer * Enqueues a V4L2Buffer
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
index ff1ea8e57b..b2c40636a2 100644 index ff1ea8e57b..d8a86e8261 100644
--- a/libavcodec/v4l2_context.c --- a/libavcodec/v4l2_context.c
+++ b/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c
@@ -27,11 +27,13 @@ @@ -27,11 +27,13 @@
@ -47625,7 +47625,7 @@ index ff1ea8e57b..b2c40636a2 100644
return 1; return 1;
} }
@@ -280,171 +291,267 @@ static int v4l2_stop_encode(V4L2Context *ctx) @@ -280,171 +291,274 @@ static int v4l2_stop_encode(V4L2Context *ctx)
return 0; return 0;
} }
@ -47698,6 +47698,7 @@ index ff1ea8e57b..b2c40636a2 100644
+ +
+ while (ioctl(m->fd, VIDIOC_DQBUF, &buf) != 0) { + while (ioctl(m->fd, VIDIOC_DQBUF, &buf) != 0) {
+ const int err = errno; + const int err = errno;
+ av_assert0(AVERROR(err) < 0);
+ if (err != EINTR) { + if (err != EINTR) {
+ av_log(avctx, AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n", + av_log(avctx, AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n",
+ ctx->name, av_err2str(AVERROR(err))); + ctx->name, av_err2str(AVERROR(err)));
@ -47811,6 +47812,12 @@ index ff1ea8e57b..b2c40636a2 100644
- /* if re-init failed, abort */ - /* if re-init failed, abort */
- ctx->done = 1; - ctx->done = 1;
- return NULL; - return NULL;
- }
- if (ret) {
- /* if re-init was successful drop the buffer (if there was one)
- * since we had to reconfigure capture (unmap all buffers)
- */
- return NULL;
+ if (evt.type == V4L2_EVENT_SOURCE_CHANGE) + if (evt.type == V4L2_EVENT_SOURCE_CHANGE)
+ return do_source_change(m); + return do_source_change(m);
+ +
@ -47821,6 +47828,7 @@ index ff1ea8e57b..b2c40636a2 100644
+// Get a buffer +// Get a buffer
+// If output then just gets the buffer in the expected way +// If output then just gets the buffer in the expected way
+// If capture then runs the capture state m/c to deal with res change etc. +// If capture then runs the capture state m/c to deal with res change etc.
+// If return value == 0 then *ppavbuf != NULL
+ +
+static int +static int
+get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout) +get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout)
@ -47849,52 +47857,40 @@ index ff1ea8e57b..b2c40636a2 100644
+ av_log(avctx, AV_LOG_TRACE, "V4L2 %s already done\n", ctx->name); + av_log(avctx, AV_LOG_TRACE, "V4L2 %s already done\n", ctx->name);
+ return AVERROR_EOF; + return AVERROR_EOF;
} }
- if (ret) { - }
- /* if re-init was successful drop the buffer (if there was one)
- * since we had to reconfigure capture (unmap all buffers) - /* 2. dequeue the buffer */
- */ - if (pfd.revents & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) {
- return NULL;
+
+ // If capture && timeout == -1 then also wait for rx buffer free + // If capture && timeout == -1 then also wait for rx buffer free
+ if (is_cap && timeout == -1 && m->output.streamon && !m->draining) + if (is_cap && timeout == -1 && m->output.streamon && !m->draining)
+ pfd.events |= poll_out; + pfd.events |= poll_out;
+
- if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) {
- /* there is a capture buffer ready */
- if (pfd.revents & (POLLIN | POLLRDNORM))
- goto dequeue;
+ // If nothing Qed all we will get is POLLERR - avoid that + // If nothing Qed all we will get is POLLERR - avoid that
+ if ((pfd.events == poll_out && atomic_load(&m->output.q_count) == 0) || + if ((pfd.events == poll_out && atomic_load(&m->output.q_count) == 0) ||
+ (pfd.events == poll_cap && atomic_load(&m->capture.q_count) == 0) || + (pfd.events == poll_cap && atomic_load(&m->capture.q_count) == 0) ||
+ (pfd.events == (poll_cap | poll_out) && atomic_load(&m->capture.q_count) == 0 && atomic_load(&m->output.q_count) == 0)) { + (pfd.events == (poll_cap | poll_out) && atomic_load(&m->capture.q_count) == 0 && atomic_load(&m->output.q_count) == 0)) {
+ av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s empty\n", ctx->name); + av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s empty\n", ctx->name);
+ return AVERROR(EAGAIN); + return AVERROR(EAGAIN);
} + }
- }
- /* 2. dequeue the buffer */
- if (pfd.revents & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) {
+ // Timeout kludged s.t. "forever" eventually gives up & produces logging
+ // If waiting for an event when we have seen a last_frame then we expect
+ // it to be ready already so force a short timeout
+ ret = poll(&pfd, 1,
+ ff_v4l2_ctx_eos(ctx) ? 10 :
+ timeout == -1 ? 3000 : timeout);
- if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) {
- /* there is a capture buffer ready */
- if (pfd.revents & (POLLIN | POLLRDNORM))
- goto dequeue;
+ av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s ret=%d, timeout=%d, events=%#x, revents=%#x\n",
+ ctx->name, ret, timeout, pfd.events, pfd.revents);
- /* the driver is ready to accept more input; instead of waiting for the capture - /* the driver is ready to accept more input; instead of waiting for the capture
- * buffer to complete we return NULL so input can proceed (we are single threaded) - * buffer to complete we return NULL so input can proceed (we are single threaded)
- */ - */
- if (pfd.revents & (POLLOUT | POLLWRNORM)) - if (pfd.revents & (POLLOUT | POLLWRNORM))
- return NULL; - return NULL;
+ // Timeout kludged s.t. "forever" eventually gives up & produces logging
+ // If waiting for an event when we have seen a last_frame then we expect
+ // it to be ready already so force a short timeout
+ ret = poll(&pfd, 1,
+ ff_v4l2_ctx_eos(ctx) ? 10 :
+ timeout == -1 ? 3000 : timeout);
+ if (ret < 0) { + if (ret < 0) {
+ const int err = errno; + ret = AVERROR(errno); // Remember errno before logging etc.
+ if (err == EINTR) + av_assert0(ret < 0);
+ continue;
+ av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll error %d (%s)\n", ctx->name, err, strerror(err));
+ return AVERROR(err);
} }
-dequeue: -dequeue:
@ -47905,6 +47901,23 @@ index ff1ea8e57b..b2c40636a2 100644
- memset(planes, 0, sizeof(planes)); - memset(planes, 0, sizeof(planes));
- buf.length = VIDEO_MAX_PLANES; - buf.length = VIDEO_MAX_PLANES;
- buf.m.planes = planes; - buf.m.planes = planes;
+ av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s ret=%d, timeout=%d, events=%#x, revents=%#x\n",
+ ctx->name, ret, timeout, pfd.events, pfd.revents);
+
+ if (ret < 0) {
+ if (ret == AVERROR(EINTR))
+ continue;
+ av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll error %d (%s)\n", ctx->name, AVUNERROR(ret), av_err2str(ret));
+ return ret;
}
- ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DQBUF, &buf);
- if (ret) {
- if (errno != EAGAIN) {
- ctx->done = 1;
- if (errno != EPIPE)
- av_log(logger(ctx), AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n",
- ctx->name, av_err2str(AVERROR(errno)));
+ if (ret == 0) { + if (ret == 0) {
+ if (timeout == -1) + if (timeout == -1)
+ av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll unexpected timeout: events=%#x\n", ctx->name, pfd.events); + av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll unexpected timeout: events=%#x\n", ctx->name, pfd.events);
@ -47915,19 +47928,11 @@ index ff1ea8e57b..b2c40636a2 100644
+ ctx->done = 1; + ctx->done = 1;
+ return ret; + return ret;
+ } + }
+ } }
+ return AVERROR(EAGAIN);
}
- ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DQBUF, &buf);
- if (ret) {
- if (errno != EAGAIN) {
- ctx->done = 1;
- if (errno != EPIPE)
- av_log(logger(ctx), AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n",
- ctx->name, av_err2str(AVERROR(errno)));
- }
- return NULL; - return NULL;
+ return AVERROR(EAGAIN);
+ }
+
+ if ((pfd.revents & POLLERR) != 0) { + if ((pfd.revents & POLLERR) != 0) {
+ av_log(avctx, AV_LOG_WARNING, "V4L2 %s POLLERR\n", ctx->name); + av_log(avctx, AV_LOG_WARNING, "V4L2 %s POLLERR\n", ctx->name);
+ return AVERROR_UNKNOWN; + return AVERROR_UNKNOWN;
@ -47949,6 +47954,13 @@ index ff1ea8e57b..b2c40636a2 100644
- ctx->done = 1; - ctx->done = 1;
-#endif -#endif
+ continue; + continue;
+ }
+
+ if ((pfd.revents & poll_cap) != 0) {
+ ret = dq_buf(ctx, ppavbuf);
+ if (ret == AVERROR(EPIPE))
+ continue;
+ return ret;
} }
- avbuf = &ctx->buffers[buf.index]; - avbuf = &ctx->buffers[buf.index];
@ -47957,18 +47969,13 @@ index ff1ea8e57b..b2c40636a2 100644
- if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) {
- memcpy(avbuf->planes, planes, sizeof(planes)); - memcpy(avbuf->planes, planes, sizeof(planes));
- avbuf->buf.m.planes = avbuf->planes; - avbuf->buf.m.planes = avbuf->planes;
+ if ((pfd.revents & poll_cap) != 0) { + if ((pfd.revents & poll_out) != 0) {
+ ret = dq_buf(ctx, ppavbuf); + if (is_cap)
+ if (ret == AVERROR(EPIPE)) + return AVERROR(EAGAIN);
+ continue; + return dq_buf(ctx, ppavbuf);
+ return ret;
} }
- return avbuf; - return avbuf;
+ +
+ if ((pfd.revents & poll_out) != 0) {
+ return is_cap ? 0 : dq_buf(ctx, ppavbuf);
+ }
+
+ av_log(avctx, AV_LOG_ERROR, "V4L2 poll unexpected events=%#x, revents=%#x\n", pfd.events, pfd.revents); + av_log(avctx, AV_LOG_ERROR, "V4L2 poll unexpected events=%#x, revents=%#x\n", pfd.events, pfd.revents);
+ return AVERROR_UNKNOWN; + return AVERROR_UNKNOWN;
} }
@ -48015,7 +48022,7 @@ index ff1ea8e57b..b2c40636a2 100644
} }
return NULL; return NULL;
@@ -452,25 +559,45 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) @@ -452,25 +566,45 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx)
static int v4l2_release_buffers(V4L2Context* ctx) static int v4l2_release_buffers(V4L2Context* ctx)
{ {
@ -48045,18 +48052,18 @@ index ff1ea8e57b..b2c40636a2 100644
+ .type = ctx->type, + .type = ctx->type,
+ .count = 0, /* 0 -> unmap all buffers from the driver */ + .count = 0, /* 0 -> unmap all buffers from the driver */
+ }; + };
+
+ while ((ret = ioctl(fd, VIDIOC_REQBUFS, &req)) == -1) {
+ if (errno == EINTR)
+ continue;
+
+ ret = AVERROR(errno);
- for (j = 0; j < buffer->num_planes; j++) { - for (j = 0; j < buffer->num_planes; j++) {
- struct V4L2Plane_info *p = &buffer->plane_info[j]; - struct V4L2Plane_info *p = &buffer->plane_info[j];
- if (p->mm_addr && p->length) - if (p->mm_addr && p->length)
- if (munmap(p->mm_addr, p->length) < 0) - if (munmap(p->mm_addr, p->length) < 0)
- av_log(logger(ctx), AV_LOG_ERROR, "%s unmap plane (%s))\n", ctx->name, av_err2str(AVERROR(errno))); - av_log(logger(ctx), AV_LOG_ERROR, "%s unmap plane (%s))\n", ctx->name, av_err2str(AVERROR(errno)));
+ while ((ret = ioctl(fd, VIDIOC_REQBUFS, &req)) == -1) {
+ if (errno == EINTR)
+ continue;
+
+ ret = AVERROR(errno);
+
+ av_log(logger(ctx), AV_LOG_ERROR, "release all %s buffers (%s)\n", + av_log(logger(ctx), AV_LOG_ERROR, "release all %s buffers (%s)\n",
+ ctx->name, av_err2str(AVERROR(errno))); + ctx->name, av_err2str(AVERROR(errno)));
+ +
@ -48075,7 +48082,7 @@ index ff1ea8e57b..b2c40636a2 100644
} }
static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfmt) static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfmt)
@@ -499,6 +626,8 @@ static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfm @@ -499,6 +633,8 @@ static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfm
static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p)
{ {
@ -48084,7 +48091,7 @@ index ff1ea8e57b..b2c40636a2 100644
enum AVPixelFormat pixfmt = ctx->av_pix_fmt; enum AVPixelFormat pixfmt = ctx->av_pix_fmt;
struct v4l2_fmtdesc fdesc; struct v4l2_fmtdesc fdesc;
int ret; int ret;
@@ -517,6 +646,13 @@ static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) @@ -517,6 +653,13 @@ static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p)
if (ret) if (ret)
return AVERROR(EINVAL); return AVERROR(EINVAL);
@ -48098,7 +48105,7 @@ index ff1ea8e57b..b2c40636a2 100644
pixfmt = ff_v4l2_format_v4l2_to_avfmt(fdesc.pixelformat, AV_CODEC_ID_RAWVIDEO); pixfmt = ff_v4l2_format_v4l2_to_avfmt(fdesc.pixelformat, AV_CODEC_ID_RAWVIDEO);
ret = v4l2_try_raw_format(ctx, pixfmt); ret = v4l2_try_raw_format(ctx, pixfmt);
if (ret){ if (ret){
@@ -569,18 +705,84 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p) @@ -569,18 +712,84 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p)
* *
*****************************************************************************/ *****************************************************************************/
@ -48170,24 +48177,24 @@ index ff1ea8e57b..b2c40636a2 100644
+ { + {
+ if (cmd == VIDIOC_STREAMOFF) + if (cmd == VIDIOC_STREAMOFF)
+ flush_all_buffers_status(ctx); + flush_all_buffers_status(ctx);
+
- ctx->streamon = (cmd == VIDIOC_STREAMON);
+ ctx->streamon = (cmd == VIDIOC_STREAMON); + ctx->streamon = (cmd == VIDIOC_STREAMON);
+ av_log(avctx, AV_LOG_DEBUG, "%s set status %d (%s) OK\n", ctx->name, + av_log(avctx, AV_LOG_DEBUG, "%s set status %d (%s) OK\n", ctx->name,
+ cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF"); + cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF");
+ } + }
- return 0; - ctx->streamon = (cmd == VIDIOC_STREAMON);
+ // Both stream off & on effectively clear flag_last + // Both stream off & on effectively clear flag_last
+ ctx->flag_last = 0; + ctx->flag_last = 0;
+
- return 0;
+ ff_mutex_unlock(&ctx->lock); + ff_mutex_unlock(&ctx->lock);
+ +
+ return ret; + return ret;
} }
int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame)
@@ -608,7 +810,8 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) @@ -608,7 +817,8 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame)
return ff_v4l2_buffer_enqueue(avbuf); return ff_v4l2_buffer_enqueue(avbuf);
} }
@ -48197,7 +48204,7 @@ index ff1ea8e57b..b2c40636a2 100644
{ {
V4L2m2mContext *s = ctx_to_m2mctx(ctx); V4L2m2mContext *s = ctx_to_m2mctx(ctx);
V4L2Buffer* avbuf; V4L2Buffer* avbuf;
@@ -616,8 +819,9 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) @@ -616,8 +826,9 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt)
if (!pkt->size) { if (!pkt->size) {
ret = v4l2_stop_decode(ctx); ret = v4l2_stop_decode(ctx);
@ -48208,7 +48215,7 @@ index ff1ea8e57b..b2c40636a2 100644
s->draining = 1; s->draining = 1;
return 0; return 0;
} }
@@ -626,8 +830,11 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) @@ -626,8 +837,11 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt)
if (!avbuf) if (!avbuf)
return AVERROR(EAGAIN); return AVERROR(EAGAIN);
@ -48222,7 +48229,7 @@ index ff1ea8e57b..b2c40636a2 100644
return ret; return ret;
return ff_v4l2_buffer_enqueue(avbuf); return ff_v4l2_buffer_enqueue(avbuf);
@@ -636,19 +843,10 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) @@ -636,19 +850,10 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt)
int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout)
{ {
V4L2Buffer *avbuf; V4L2Buffer *avbuf;
@ -48245,7 +48252,7 @@ index ff1ea8e57b..b2c40636a2 100644
return ff_v4l2_buffer_buf_to_avframe(frame, avbuf); return ff_v4l2_buffer_buf_to_avframe(frame, avbuf);
} }
@@ -656,19 +854,10 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) @@ -656,19 +861,10 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout)
int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt)
{ {
V4L2Buffer *avbuf; V4L2Buffer *avbuf;
@ -48268,7 +48275,7 @@ index ff1ea8e57b..b2c40636a2 100644
return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf); return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf);
} }
@@ -702,78 +891,158 @@ int ff_v4l2_context_get_format(V4L2Context* ctx, int probe) @@ -702,78 +898,158 @@ int ff_v4l2_context_get_format(V4L2Context* ctx, int probe)
int ff_v4l2_context_set_format(V4L2Context* ctx) int ff_v4l2_context_set_format(V4L2Context* ctx)
{ {
@ -61254,32 +61261,35 @@ index 0000000000..92bc13a3df
+ +
diff --git a/pi-util/clean_usr_libs.sh b/pi-util/clean_usr_libs.sh diff --git a/pi-util/clean_usr_libs.sh b/pi-util/clean_usr_libs.sh
new file mode 100755 new file mode 100755
index 0000000000..98ab9d6de9 index 0000000000..b3b2d5509d
--- /dev/null --- /dev/null
+++ b/pi-util/clean_usr_libs.sh +++ b/pi-util/clean_usr_libs.sh
@@ -0,0 +1,23 @@ @@ -0,0 +1,26 @@
+set -e +set -e
+U=/usr/lib/arm-linux-gnueabihf +U=/usr/lib/arm-linux-gnueabihf
+rm -f $U/libavcodec.* +rm -f $U/libavcodec.*
+rm -f $U/libavdevice.* +rm -f $U/libavdevice.*
+rm -f $U/libavfilter.* +rm -f $U/libavfilter.*
+rm -f $U/libavformat.* +rm -f $U/libavformat.*
+rm -f $U/libavresample.*
+rm -f $U/libavutil.* +rm -f $U/libavutil.*
+rm -f $U/libswresample.*
+rm -f $U/libswscale.*
+U=/usr/lib/arm-linux-gnueabihf/neon/vfp +U=/usr/lib/arm-linux-gnueabihf/neon/vfp
+rm -f $U/libavcodec.* +rm -f $U/libavcodec.*
+rm -f $U/libavdevice.* +rm -f $U/libavdevice.*
+rm -f $U/libavfilter.* +rm -f $U/libavfilter.*
+rm -f $U/libavformat.* +rm -f $U/libavformat.*
+rm -f $U/libavresample.*
+rm -f $U/libavutil.* +rm -f $U/libavutil.*
+rm -f $U/libswresample.*
+rm -f $U/libswscale.*
+U=/usr/lib/aarch64-linux-gnu +U=/usr/lib/aarch64-linux-gnu
+rm -f $U/libavcodec.* +rm -f $U/libavcodec.*
+rm -f $U/libavdevice.* +rm -f $U/libavdevice.*
+rm -f $U/libavfilter.* +rm -f $U/libavfilter.*
+rm -f $U/libavformat.* +rm -f $U/libavformat.*
+rm -f $U/libavresample.*
+rm -f $U/libavutil.* +rm -f $U/libavutil.*
+rm -f $U/libswresample.*
+rm -f $U/libswscale.*
+ +
diff --git a/pi-util/conf_arm64_native.sh b/pi-util/conf_arm64_native.sh diff --git a/pi-util/conf_arm64_native.sh b/pi-util/conf_arm64_native.sh
new file mode 100644 new file mode 100644