From: Hendrik Leppkes <h.leppkes@gmail.com>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH] avcodec: Align AVFrame memory to page size for access via Apple Metal
Date: Thu, 15 Jun 2023 11:39:50 +0200
Message-ID: <CA+anqdwhaF6DCYvV=p=GOei3yiu7gBW5qbz9QwBXfzEN3AUfFQ@mail.gmail.com> (raw)
In-Reply-To: <20230615021631.9139-1-sapharow@gmail.com>
On Thu, Jun 15, 2023 at 4:16 AM Iskandar Safarov <sapharow@gmail.com> wrote:
>
> ---
> libavcodec/get_buffer.c | 52 ++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 51 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/get_buffer.c b/libavcodec/get_buffer.c
> index a04fd878de..b18af3be4a 100644
> --- a/libavcodec/get_buffer.c
> +++ b/libavcodec/get_buffer.c
> @@ -33,6 +33,11 @@
> #include "avcodec.h"
> #include "internal.h"
>
> +#if __APPLE__
> +#import <mach/mach_init.h>
> +#import <mach/vm_map.h>
> +#endif
> +
> typedef struct FramePool {
> /**
> * Pools for each data plane. For audio all the planes have the same size,
> @@ -81,6 +86,51 @@ static AVBufferRef *frame_pool_alloc(void)
> return buf;
> }
>
> +#if __APPLE__
> +/*
> + When compiling for Apple platform the frame buffer data pointers need to be
> + page-aligned for cases when in-place GPU processing may be required
> + https://developer.apple.com/documentation/metal/mtldevice/1433382-newbufferwithbytesnocopy
> + */
> +#define POOL_BUFFER_ALLOCZ aapl_buffer_allocz
> +
> +static void aapl_buffer_free(void *opaque, uint8_t *data)
> +{
> + vm_deallocate((vm_map_t) mach_task_self(), (vm_address_t)data, (size_t)opaque);
> +}
> +
> +static AVBufferRef *aapl_buffer_alloc(size_t size)
> +{
> + AVBufferRef *ret = NULL;
> + uint8_t *data = NULL;
> +
> + kern_return_t err;
> + err = vm_allocate( (vm_map_t) mach_task_self(),
> + (vm_address_t*) &data, size, VM_FLAGS_ANYWHERE);
> + if (err != KERN_SUCCESS || !data)
> + return NULL;
> +
> + ret = av_buffer_create(data, size, aapl_buffer_free, (void*)size, 0);
> + if (!ret)
> + free(data);
> +
> + return ret;
> +}
> +
> +static AVBufferRef *aapl_buffer_allocz(size_t size)
> +{
> + AVBufferRef *ret = aapl_buffer_alloc(size);
> + if (!ret)
> + return NULL;
> +
> + memset(ret->data, 0, size);
> + return ret;
> +}
> +
> +#else
> +#define POOL_BUFFER_ALLOCZ av_buffer_allocz
> +#endif
> +
> static int update_frame_pool(AVCodecContext *avctx, AVFrame *frame)
> {
> FramePool *pool = avctx->internal->pool ?
> @@ -155,7 +205,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
> pool->pools[i] = av_buffer_pool_init(size[i] + 16 + STRIDE_ALIGN - 1,
> CONFIG_MEMORY_POISONING ?
> NULL :
> - av_buffer_allocz);
> + POOL_BUFFER_ALLOCZ);
> if (!pool->pools[i]) {
> ret = AVERROR(ENOMEM);
> goto fail;
> --
> 2.39.2 (Apple Git-143)
>
This is most definitely the wrong place to do this. Frames can be
allocated through various means and in various locations, and randomly
sprinkling new allocators all over is not how this should be
approached.
I don't believe FFmpeg itself shares this requirement, so maybe your
application should just use a custom get_buffer2 callback to fullfill
it?
If others agree that FFmpeg should create frames with this property by
default (which I can't answer without knowing if those special
allocation functions have any other downsides etc), it should be done
more centrally, rather then only in the avcodec pool.
- Hendrik
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-06-15 9:40 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-15 2:16 Iskandar Safarov
2023-06-15 9:39 ` Hendrik Leppkes [this message]
2023-06-15 10:33 ` Iskandar Safarov
2023-06-17 6:20 ` Paul B Mahol
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CA+anqdwhaF6DCYvV=p=GOei3yiu7gBW5qbz9QwBXfzEN3AUfFQ@mail.gmail.com' \
--to=h.leppkes@gmail.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git