From: Mark Thompson <sw@jkqxz.net>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH v2] avcodec/amfenc: increase precision of Sleep() on Windows
Date: Mon, 27 Nov 2023 13:42:09 +0000
Message-ID: <9fd98754-299f-4844-9296-3e38c40d4d4a@jkqxz.net> (raw)
In-Reply-To: <20231113143722.1959-1-lucenticus@gmail.com>
On 13/11/2023 14:37, Evgeny Pavlov wrote:
> This commit increase precision of Sleep() function on Windows.
> This fix reduces the sleep time on Windows to improve AMF encoding
> performance on low resolution input videos.
>
> Fix for issue #10622
>
> v2: use timeBeginPeriod/timeEndPeriod for increasing precision of Sleep()
>
> Signed-off-by: Evgeny Pavlov <lucenticus@gmail.com>
> ---
> libavcodec/amfenc.c | 31 +++++++++++++++++++++++++++++++
> libavcodec/amfenc.h | 3 +++
> 2 files changed, 34 insertions(+)
>
> diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c
> index 061859f85c..55e24856e8 100644
> --- a/libavcodec/amfenc.c
> +++ b/libavcodec/amfenc.c
> @@ -42,7 +42,12 @@
> #endif
>
> #ifdef _WIN32
> +#include <timeapi.h>
> #include "compat/w32dlfcn.h"
> +
> +typedef MMRESULT (*timeapi_fun)(UINT uPeriod);
> +#define WINMM_DLL "winmm.dll"
> +
> #else
> #include <dlfcn.h>
> #endif
> @@ -113,6 +118,9 @@ static int amf_load_library(AVCodecContext *avctx)
> AMFInit_Fn init_fun;
> AMFQueryVersion_Fn version_fun;
> AMF_RESULT res;
> +#ifdef _WIN32
> + timeapi_fun time_begin_fun;
> +#endif
>
> ctx->delayed_frame = av_frame_alloc();
> if (!ctx->delayed_frame) {
> @@ -145,6 +153,16 @@ static int amf_load_library(AVCodecContext *avctx)
> AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "GetTrace() failed with error %d\n", res);
> res = ctx->factory->pVtbl->GetDebug(ctx->factory, &ctx->debug);
> AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "GetDebug() failed with error %d\n", res);
> +
> +#ifdef _WIN32
> + // Increase precision of Sleep() function on Windows platform
> + ctx->winmm_lib = dlopen(WINMM_DLL, RTLD_NOW | RTLD_LOCAL);
> + AMF_RETURN_IF_FALSE(ctx, ctx->winmm_lib != NULL, 0, "DLL %s failed to open\n", WINMM_DLL);
> + time_begin_fun = (timeapi_fun)dlsym(ctx->winmm_lib, "timeBeginPeriod");
> + AMF_RETURN_IF_FALSE(ctx, time_begin_fun != NULL, 0, "DLL %s failed to find function %s\n", WINMM_DLL, "timeBeginPeriod");
> + time_begin_fun(1);
> +#endif //_WIN32
> +
> return 0;
> }
>
> @@ -375,6 +393,9 @@ static int amf_init_encoder(AVCodecContext *avctx)
> int av_cold ff_amf_encode_close(AVCodecContext *avctx)
> {
> AmfContext *ctx = avctx->priv_data;
> +#ifdef _WIN32
> + timeapi_fun time_end_fun;
> +#endif //_WIN32
>
> if (ctx->delayed_surface) {
> ctx->delayed_surface->pVtbl->Release(ctx->delayed_surface);
> @@ -410,6 +431,16 @@ int av_cold ff_amf_encode_close(AVCodecContext *avctx)
> av_frame_free(&ctx->delayed_frame);
> av_fifo_freep2(&ctx->timestamp_list);
>
> +#ifdef _WIN32
> + if (ctx->winmm_lib) {
> + time_end_fun = (timeapi_fun)dlsym(ctx->winmm_lib, "timeEndPeriod");
> + AMF_RETURN_IF_FALSE(ctx, time_end_fun != NULL, 0, "DLL %s failed to find function %s\n", WINMM_DLL, "timeEndPeriod");
> + time_end_fun(1);
> + dlclose(ctx->winmm_lib);
> + ctx->winmm_lib = NULL;
> + }
> +#endif //_WIN32
> +
> return 0;
> }
>
> diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h
> index 2dbd378ef8..35bcf1dfe3 100644
> --- a/libavcodec/amfenc.h
> +++ b/libavcodec/amfenc.h
> @@ -50,6 +50,9 @@ typedef struct AmfContext {
> AVClass *avclass;
> // access to AMF runtime
> amf_handle library; ///< handle to DLL library
> +#ifdef _WIN32
> + amf_handle winmm_lib; ///< handle to winmm DLL library
> +#endif //_WIN32
> AMFFactory *factory; ///< pointer to AMF factory
> AMFDebug *debug; ///< pointer to AMF debug interface
> AMFTrace *trace; ///< pointer to AMF trace interface
Is it reasonable to set this global state from a library without the parent program knowing? We'd really prefer not to affect the global state unexpectedly.
It's also unclear to me what the effect of this tradeoff on power is, given that the whole reason why this happens is that Windows is trying to keep the CPU asleep for as long as possible to save power.
Thanks,
- Mark
_______________________________________________
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-11-27 13:42 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-16 9:13 [FFmpeg-devel] [PATCH] avcodec/amfenc: Fix for windows imprecise sleep Evgeny Pavlov
2023-10-16 21:24 ` Mark Thompson
2023-10-17 1:25 ` Zhao Zhili
2023-10-17 17:11 ` Evgeny Pavlov
2023-10-17 19:45 ` Kacper Michajlow
2023-10-18 10:32 ` Evgeny Pavlov
2023-10-18 20:36 ` [FFmpeg-devel] [PATCH] amfenc: Use a blocking call instead of sleeping and polling Mark Thompson
2023-10-19 16:13 ` Evgeny Pavlov
2023-10-22 14:30 ` Mark Thompson
2023-11-13 14:37 ` [FFmpeg-devel] [PATCH v2] avcodec/amfenc: increase precision of Sleep() on Windows Evgeny Pavlov
2023-11-20 16:01 ` Evgeny Pavlov
2023-11-27 13:42 ` Mark Thompson [this message]
2023-11-27 14:04 ` Henrik Gramner via ffmpeg-devel
2024-02-19 15:26 ` Evgeny Pavlov
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=9fd98754-299f-4844-9296-3e38c40d4d4a@jkqxz.net \
--to=sw@jkqxz.net \
--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