[PATCH] winegstreamer: Set specific large buffer sizes for decodebin

Zebediah Figura (she/her) zfigura at codeweavers.com
Wed Mar 17 14:17:38 CDT 2021


On 3/17/21 1:49 PM, Andrew Eikum wrote:
> Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
> ---
> 
> Setting them to 0 just means use the default:
> 
>      https://gstreamer.freedesktop.org/documentation/playback/decodebin.html?gi-language=c#decodebin:max-size-buffers
> 
>   dlls/winegstreamer/gst_private.h  |  2 +-
>   dlls/winegstreamer/media_source.c |  2 +-
>   dlls/winegstreamer/wg_parser.c    | 10 +++++-----
>   3 files changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
> index 55a62361966..69833a40b62 100644
> --- a/dlls/winegstreamer/gst_private.h
> +++ b/dlls/winegstreamer/gst_private.h
> @@ -173,7 +173,7 @@ struct unix_funcs
>               void **data, uint64_t *offset, uint32_t *size);
>       void (CDECL *wg_parser_complete_read_request)(struct wg_parser *parser, bool ret);
>   
> -    void (CDECL *wg_parser_set_unlimited_buffering)(struct wg_parser *parser);
> +    void (CDECL *wg_parser_set_large_buffering)(struct wg_parser *parser);
>   
>       uint32_t (CDECL *wg_parser_get_stream_count)(struct wg_parser *parser);
>       struct wg_parser_stream *(CDECL *wg_parser_get_stream)(struct wg_parser *parser, uint32_t index);
> diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
> index 3260175f45a..828d15f906e 100644
> --- a/dlls/winegstreamer/media_source.c
> +++ b/dlls/winegstreamer/media_source.c
> @@ -1125,7 +1125,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
>        * never deselects it). Remove buffering limits from decodebin in order to
>        * account for this. Note that this does leak memory, but the same memory
>        * leak occurs with native. */
> -    unix_funcs->wg_parser_set_unlimited_buffering(parser);
> +    unix_funcs->wg_parser_set_large_buffering(parser);
>   
>       object->stream_count = unix_funcs->wg_parser_get_stream_count(parser);
>   
> diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
> index f76ca903b80..de6396a5603 100644
> --- a/dlls/winegstreamer/wg_parser.c
> +++ b/dlls/winegstreamer/wg_parser.c
> @@ -543,11 +543,11 @@ static void CDECL wg_parser_complete_read_request(struct wg_parser *parser, bool
>       pthread_cond_signal(&parser->read_done_cond);
>   }
>   
> -static void CDECL wg_parser_set_unlimited_buffering(struct wg_parser *parser)
> +static void CDECL wg_parser_set_large_buffering(struct wg_parser *parser)
>   {
> -    g_object_set(parser->decodebin, "max-size-buffers", 0, NULL);
> -    g_object_set(parser->decodebin, "max-size-time", G_GUINT64_CONSTANT(0), NULL);
> -    g_object_set(parser->decodebin, "max-size-bytes", 0, NULL);
> +    g_object_set(parser->decodebin, "max-size-buffers", UINT_MAX, NULL);
> +    g_object_set(parser->decodebin, "max-size-time", G_GUINT64_CONSTANT(1000000000), NULL);
> +    g_object_set(parser->decodebin, "max-size-bytes", 8 * 1024 * 1024, NULL);
>   }
>   

Is 8 MB or 1 second really enough? Is there any reason not to just use 
G_MAXUINT64/UINT_MAX here?

>   static void CDECL wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, struct wg_format *format)
> @@ -1883,7 +1883,7 @@ static const struct unix_funcs funcs =
>       wg_parser_get_read_request,
>       wg_parser_complete_read_request,
>   
> -    wg_parser_set_unlimited_buffering,
> +    wg_parser_set_large_buffering,
>   
>       wg_parser_get_stream_count,
>       wg_parser_get_stream,
> 



More information about the wine-devel mailing list