Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package scrcpy for openSUSE:Factory checked in at 2026-10-08 15:13:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/scrcpy (Old) and /work/SRC/openSUSE:Factory/.scrcpy.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "scrcpy" Thu Oct 8 15:13:54 2026 rev:7 rq:1383272 version:5.0.1 Changes: -------- --- /work/SRC/openSUSE:Factory/scrcpy/scrcpy.changes 2026-10-06 19:17:25.533044428 +0200 +++ /work/SRC/openSUSE:Factory/.scrcpy.new.3698736/scrcpy.changes 2026-10-08 15:14:28.558489927 +0200 @@ -1,0 +2,9 @@ +Thu Oct 8 06:57:44 UTC 2026 - [email protected] + +- Update to version 5.0.1: + * Accept DRM_FORMAT_RG88 for NV12 chroma plane (#7070, #7073) + * Fix H.265 hardware decoding on Windows (#7072) + * Use the GPU of the renderer for VA-API decoding (#7075, #7081) + * Force EGL only if VA-API is enabled (#7079) + +------------------------------------------------------------------- Old: ---- scrcpy-5.0.tar.gz New: ---- scrcpy-5.0.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ scrcpy.spec ++++++ --- /var/tmp/diff_new_pack.DbGuws/_old 2026-10-08 15:14:30.295562707 +0200 +++ /var/tmp/diff_new_pack.DbGuws/_new 2026-10-08 15:14:30.296562749 +0200 @@ -21,7 +21,7 @@ the required pre-build %{_datadir}/%{name}/%{name}-server binary. Name: scrcpy -Version: 5.0 +Version: 5.0.1 Release: 0 Summary: Display and control your Android device License: Apache-2.0 ++++++ SHA256SUMS.txt ++++++ --- /var/tmp/diff_new_pack.DbGuws/_old 2026-10-08 15:14:30.338564509 +0200 +++ /var/tmp/diff_new_pack.DbGuws/_new 2026-10-08 15:14:30.341564634 +0200 @@ -1,8 +1,8 @@ -26cbc9ad0aced6c2282455bef4fb43462605c1f8758c74b4ab1dbf818c229daa scrcpy-server-v5.0 -f052ad9eb981879e8c5f066c5ef122b39b6c9853b383d6497219030e6549baed scrcpy-linux-x86_64-v5.0.tar.gz -31413dd59a80cb76e7747ef91b4994934b546c8860e8e7976046c612a50e5cc3 scrcpy-win32-v5.0.zip -44c10d9e82f20ea67227d14d37bf9fbe3603117c5736df3f514544a02ba20a73 scrcpy-win64-v5.0.zip -afc1db17b216f91470d2c8f41ea786ae18ab1cb2bc2324bc05ec3d7685aa6054 scrcpy-winarm64-v5.0.zip -7cb4e41c859b05b36e89dc9be6c353cc5980c00d7f7f6a763b5b355551b82e9c scrcpy-macos-aarch64-v5.0.tar.gz -dacb995c8eb42528cb96b2da2a2e3110fe5c82281378e6044fc7cccf48a7c39a scrcpy-macos-x86_64-v5.0.tar.gz +764eb6f79811d5211fe9df341120882ba9994c7a61b897d7bf3fb662e53bc536 scrcpy-server-v5.0.1 +9f969d30cc574816077edecda65719c1c70b0aee1df1ba5fa00779ac07b8fd6e scrcpy-linux-x86_64-v5.0.1.tar.gz +0cb65ebf1bce892fa4d1502d699af0c7a1a7f24d7febcb9ef72894e3f23fc2ad scrcpy-win32-v5.0.1.zip +b12a2c4ee8be317422451fc7dcf8ee20a71b5ea7ef9ad73ddd825a25316227a5 scrcpy-win64-v5.0.1.zip +16c3fc2068df64946f670e3504b4752073ebae47a416a45b46e79a5ab19c689b scrcpy-winarm64-v5.0.1.zip +33611e51977a8289e2e124b220f727895181ef2eb9060e0987a4dc2db9cf0d6b scrcpy-macos-aarch64-v5.0.1.tar.gz +31a5467a9e907f162b093267cbbab1276b15c6e709c2ea8159566a8d165beb50 scrcpy-macos-x86_64-v5.0.1.tar.gz ++++++ SHA256SUMS.txt.asc ++++++ --- /var/tmp/diff_new_pack.DbGuws/_old 2026-10-08 15:14:30.358565347 +0200 +++ /var/tmp/diff_new_pack.DbGuws/_new 2026-10-08 15:14:30.361565472 +0200 @@ -1,17 +1,17 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCAAdFiEE454t5qVfWqbY77eaygH0bxhoOz0FAmrDelwACgkQygH0bxho -Oz3D4xAAmuSsFFkQDB4PivacEahTWpcBESrsNMgQ5MgsXmqNlB+upVtvgv09ELJl -MPI+o9rJ4sjt829GKgA+eua9UPe8ykKshryLjooQgdq9RVIZtqSYio7uK9+9PTM2 -1jNdKYU7sLAIW4h/EQvpKcOCQj0V8+ciM0EtphhnnL3xqDVxVUgVF6sxuq/Ka/ls -2Xe05l0oqicj0xTD2OpOgzdiwaVDAMvUyC0IRCeetDcYxLEMmZyN49VEE0CuCKHE -12G8wjFqd7hTWapMZRjdChblrCXsz+9UXNWs3/+u682RoyHR8BehqwGw4NlxDniv -8Jgmh/6rWmZeY6US9sDw2lAmqcON5gJ0Q9o3cE3KNU2Hqm5f/ve+uvq1ZthXeOHg -oFqmxRVlgpWcucErozYTUjaQ9J/OMCYQzz9zzvO2rTgUvEp71lGN9Z+fmpitWhxz -5dZiYWio/cC2bguhg4Remc1EiHL0qvDkcB1YPrFG4SOIzR2GkQz1nUQKWEc3wgcx -EM0aaKN+z7gQ9ICqzWmCCsmw89UtYafTWRItiehz+yPs/UNHeX3YPwd864iAn15A -1Ntllf70rwbd/W/Z3qbfqqFyqgkt3yKRKTE2cICwEH8HTDV6ccdk5rLxjcTk2y3x -mcwHOKCxMmHg/yeO+Eypzln0fCiYW80zG3a0zw+tPrEB1/ySblI= -=7jRq +iQIzBAABCAAdFiEE454t5qVfWqbY77eaygH0bxhoOz0FAmrHOoIACgkQygH0bxho +Oz3DTg//ZTILTC0LaA/b9LxyhKoP6bBBVFfI/Bnkq3t1dKQ6BiYHUBCm8zmDKsf+ +lRIrlYlFG/vOB/tLIy+zKQ2bWj/EJQImXjdsD8Fwqt7srcIIcJKtjEgfKAj+ZvyF +DFCWWD82ROieezApbeOYfGT+6d0ltQUbSEUwkvdpGknYfZbAC7ap+geit2kuF3D8 +8gF+3GxlsYVeGjItYCtloSyh324stRLoKQiL9IJOAbDgJ1JjVNq2Ulpa/cXx0iC0 +Fy/ALy3Rxi6OIjuwCMa363NFOfWBHn15eWGSRZm01VaHOymWEGbPyaJ2FMVLTsEQ +tlNp7YEzTpEgOHP71u1xlxjfkOD9Yt29sSak0Ft5M/9Uf+Nm+VuZvu14C/KycCZt +BAve1eFkmhAW3Omza/hWYEgo9ras/4cs777nnG6zP4MHLlJdOdQ0PoGEak0BA/P8 +mF735q72Cuc/95JRFPPH8Ev2m+F2j71AIe084qOOAClXPQMKTLxW7R6A7HKsa2O6 +4O4/6c/ZTKsSIG4d28QPbqG6ATiCzB4rZjcZKqDTRIQw95cmca1kK+jag5goBJgJ +kp1NGeDrBgvgPRTui67N8yTXYbPQiLLhIJCO/wSrN7baHkBQh8XdXQGxA/jEQ2Cb +6C198r2pn6OCqELiKw9tJ6nbzDY9kj9CgNe5mYVQ9XIJ/qPZo68= +=CX0Y -----END PGP SIGNATURE----- ++++++ scrcpy-5.0.tar.gz -> scrcpy-5.0.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/README.md new/scrcpy-5.0.1/README.md --- old/scrcpy-5.0/README.md 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/README.md 2026-10-08 08:41:27.000000000 +0200 @@ -3,7 +3,7 @@ source for the project. Do not download releases from random websites, even if their name contains `scrcpy`.** -# scrcpy (v5.0) +# scrcpy (v5.0.1) <img src="app/data/scrcpy.svg" width="128" height="128" alt="scrcpy" align="right" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/scrcpy-windows.rc new/scrcpy-5.0.1/app/scrcpy-windows.rc --- old/scrcpy-5.0/app/scrcpy-windows.rc 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/scrcpy-windows.rc 2026-10-08 08:41:27.000000000 +0200 @@ -13,7 +13,7 @@ VALUE "LegalCopyright", "Romain Vimont, Genymobile" VALUE "OriginalFilename", "scrcpy.exe" VALUE "ProductName", "scrcpy" - VALUE "ProductVersion", "5.0" + VALUE "ProductVersion", "5.0.1" END END BLOCK "VarFileInfo" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/egl.c new/scrcpy-5.0.1/app/src/egl.c --- old/scrcpy-5.0/app/src/egl.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/egl.c 2026-10-08 08:41:27.000000000 +0200 @@ -6,6 +6,25 @@ #include "util/log.h" +static bool +sc_egl_has_extension(const char *extensions, const char *extension) { + assert(extensions); + assert(extension); + assert(!strchr(extension, ' ')); + + size_t len = strlen(extension); + const char *p = extensions; + while ((p = strstr(p, extension))) { + if ((p == extensions || p[-1] == ' ') + && (p[len] == '\0' || p[len] == ' ')) { + return true; + } + p += len; + } + + return false; +} + bool sc_egl_init(struct sc_egl *egl) { egl->display = (EGLDisplay) SDL_EGL_GetCurrentDisplay(); @@ -22,8 +41,8 @@ SDL_EGL_GetProcAddress("eglGetError"); assert(egl->GetError); - egl->extensions = egl->QueryString(egl->display, EGL_EXTENSIONS); - if (!egl->extensions) { + const char *extensions = egl->QueryString(egl->display, EGL_EXTENSIONS); + if (!extensions) { LOGE("EGL error: Could not get EGL extensions"); return false; } @@ -32,8 +51,8 @@ // so only resolve the entry points of advertised extensions egl->CreateImageKHR = NULL; egl->DestroyImageKHR = NULL; - if (sc_egl_has_extension(egl, "EGL_KHR_image_base") - || sc_egl_has_extension(egl, "EGL_KHR_image")) { + if (sc_egl_has_extension(extensions, "EGL_KHR_image_base") + || sc_egl_has_extension(extensions, "EGL_KHR_image")) { egl->CreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) SDL_EGL_GetProcAddress("eglCreateImageKHR"); assert(egl->CreateImageKHR); @@ -49,31 +68,57 @@ SDL_GL_GetProcAddress("glEGLImageTargetTexture2DOES"); } + // EGL_EXT_device_query is a client extension (not specific to a display) + const char *client_extensions = + egl->QueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + + egl->QueryDisplayAttribEXT = NULL; + egl->QueryDeviceStringEXT = NULL; + if (client_extensions && sc_egl_has_extension(client_extensions, + "EGL_EXT_device_query")) { + egl->QueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC) + SDL_EGL_GetProcAddress("eglQueryDisplayAttribEXT"); + assert(egl->QueryDisplayAttribEXT); + + egl->QueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC) + SDL_EGL_GetProcAddress("eglQueryDeviceStringEXT"); + assert(egl->QueryDeviceStringEXT); + } + egl->has_dma_buf_import = - sc_egl_has_extension(egl, "EGL_EXT_image_dma_buf_import"); + sc_egl_has_extension(extensions, "EGL_EXT_image_dma_buf_import"); egl->has_dma_buf_import_modifiers = - sc_egl_has_extension(egl, "EGL_EXT_image_dma_buf_import_modifiers"); + sc_egl_has_extension(extensions, + "EGL_EXT_image_dma_buf_import_modifiers"); return true; } -bool -sc_egl_has_extension(struct sc_egl *egl, const char *extension) { - assert(egl->extensions); - assert(extension); - assert(!strchr(extension, ' ')); +const char * +sc_egl_get_drm_render_node(struct sc_egl *egl) { + if (!egl->QueryDisplayAttribEXT || !egl->QueryDeviceStringEXT) { + return NULL; + } - size_t len = strlen(extension); - const char *p = egl->extensions; - while ((p = strstr(p, extension))) { - if ((p == egl->extensions || p[-1] == ' ') - && (p[len] == '\0' || p[len] == ' ')) { - return true; - } - p += len; + EGLAttrib attrib; + if (!egl->QueryDisplayAttribEXT(egl->display, EGL_DEVICE_EXT, &attrib)) { + return NULL; } - return false; + EGLDeviceEXT device = (EGLDeviceEXT) attrib; + if (device == EGL_NO_DEVICE_EXT) { + return NULL; + } + + const char *extensions = egl->QueryDeviceStringEXT(device, EGL_EXTENSIONS); + if (!extensions + || !sc_egl_has_extension(extensions, + "EGL_EXT_device_drm_render_node")) { + return NULL; + } + + // May be NULL if the device has no render node + return egl->QueryDeviceStringEXT(device, EGL_DRM_RENDER_NODE_FILE_EXT); } EGLImageKHR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/egl.h new/scrcpy-5.0.1/app/src/egl.h --- old/scrcpy-5.0/app/src/egl.h 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/egl.h 2026-10-08 08:41:27.000000000 +0200 @@ -28,6 +28,10 @@ PFNEGLCREATEIMAGEKHRPROC CreateImageKHR; PFNEGLDESTROYIMAGEKHRPROC DestroyImageKHR; + // EGL_EXT_device_query (NULL if unsupported) + PFNEGLQUERYDISPLAYATTRIBEXTPROC QueryDisplayAttribEXT; + PFNEGLQUERYDEVICESTRINGEXTPROC QueryDeviceStringEXT; + // GL_OES_EGL_image, the OpenGL side of EGLImage (NULL if unsupported) PFNGLEGLIMAGETARGETTEXTURE2DOESPROC EGLImageTargetTexture2DOES; @@ -54,8 +58,14 @@ bool sc_egl_init(struct sc_egl *egl); -bool -sc_egl_has_extension(struct sc_egl *egl, const char *extension); +/** + * Return the DRM render node of the device used by the EGL display (for example + * "/dev/dri/renderD128") + * + * The string is owned by EGL. Return NULL if it is unknown. + */ +const char * +sc_egl_get_drm_render_node(struct sc_egl *egl); /** * Import a single-plane DMA-BUF as an EGLImage diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/hwdec.c new/scrcpy-5.0.1/app/src/hwdec.c --- old/scrcpy-5.0/app/src/hwdec.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/hwdec.c 2026-10-08 08:41:27.000000000 +0200 @@ -73,7 +73,8 @@ bool sc_hwdec_init(struct sc_hwdec *hwdec, enum AVHWDeviceType hw_type, - bool hw_forced, SDL_Renderer *renderer) { + const char *hw_device, bool hw_forced, SDL_Renderer *renderer) { + (void) hw_device; // only used by some hardware decoders (void) renderer; // only used by some hardware decoders hwdec->hw_type = hw_type; @@ -85,8 +86,9 @@ break; #ifdef HAVE_VAAPI case AV_HWDEVICE_TYPE_VAAPI: { + LOGD("VA-API device: %s", hw_device ? hw_device : "(default)"); int ret = av_hwdevice_ctx_create(&hwdec->hw_device_ctx, hw_type, - NULL, NULL, 0); + hw_device, NULL, 0); if (ret < 0) { LOGE("Could not create VA-API device: %s", av_err2str(ret)); return false; @@ -200,9 +202,13 @@ return false; } - // Some backends do not expose plain Baseline (only Constrained Baseline). - // Hardware supporting Main/High can still decode Baseline. - ctx->hwaccel_flags |= AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH; + if (ctx->codec_id == AV_CODEC_ID_H264) { + // Some backends do not expose plain Baseline (only Constrained + // Baseline). Hardware supporting Main/High can still decode Baseline. + // Do not set it for other codecs: for H.265, FFmpeg would select the + // Main10 D3D11VA decoder for a Main stream. + ctx->hwaccel_flags |= AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH; + } if (hwdec->hw_forced) { // By default, FFmpeg falls back to a software format if the hardware diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/hwdec.h new/scrcpy-5.0.1/app/src/hwdec.h --- old/scrcpy-5.0/app/src/hwdec.h 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/hwdec.h 2026-10-08 08:41:27.000000000 +0200 @@ -22,7 +22,7 @@ bool sc_hwdec_init(struct sc_hwdec *hwdec, enum AVHWDeviceType hw_type, - bool hw_forced, SDL_Renderer *renderer); + const char *hw_device, bool hw_forced, SDL_Renderer *renderer); const AVCodec * sc_hwdec_find_decoder(struct sc_hwdec *hwdec, enum AVCodecID codec_id); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/interop/interop.h new/scrcpy-5.0.1/app/src/interop/interop.h --- old/scrcpy-5.0/app/src/interop/interop.h 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/interop/interop.h 2026-10-08 08:41:27.000000000 +0200 @@ -18,6 +18,7 @@ const char *name; enum AVHWDeviceType hw_type; + const char *hw_device; enum AVPixelFormat pix_fmt; SDL_Texture *texture; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/interop/interop_d3d11va.c new/scrcpy-5.0.1/app/src/interop/interop_d3d11va.c --- old/scrcpy-5.0/app/src/interop/interop_d3d11va.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/interop/interop_d3d11va.c 2026-10-08 08:41:27.000000000 +0200 @@ -188,6 +188,7 @@ d3d11va->interop.name = "d3d11va"; d3d11va->interop.hw_type = AV_HWDEVICE_TYPE_D3D11VA; + d3d11va->interop.hw_device = NULL; d3d11va->interop.pix_fmt = AV_PIX_FMT_D3D11; d3d11va->interop.texture = NULL; d3d11va->interop.ops = &ops; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/interop/interop_software.c new/scrcpy-5.0.1/app/src/interop/interop_software.c --- old/scrcpy-5.0/app/src/interop/interop_software.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/interop/interop_software.c 2026-10-08 08:41:27.000000000 +0200 @@ -170,6 +170,7 @@ sw->interop.name = "software"; sw->interop.hw_type = AV_HWDEVICE_TYPE_NONE; + sw->interop.hw_device = NULL; sw->interop.pix_fmt = AV_PIX_FMT_YUV420P; sw->interop.texture = NULL; sw->interop.ops = &ops; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/interop/interop_vaapi.c new/scrcpy-5.0.1/app/src/interop/interop_vaapi.c --- old/scrcpy-5.0/app/src/interop/interop_vaapi.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/interop/interop_vaapi.c 2026-10-08 08:41:27.000000000 +0200 @@ -61,7 +61,8 @@ return desc->nb_layers == 2 && desc->layers[0].format == DRM_FORMAT_R8 && desc->layers[0].nb_planes == 1 - && desc->layers[1].format == DRM_FORMAT_GR88 + && (desc->layers[1].format == DRM_FORMAT_GR88 + || desc->layers[1].format == DRM_FORMAT_RG88) && desc->layers[1].nb_planes == 1; } @@ -339,6 +340,8 @@ vaapi->interop.name = "vaapi"; vaapi->interop.hw_type = AV_HWDEVICE_TYPE_VAAPI; + // Decode on the GPU used by the renderer + vaapi->interop.hw_device = sc_egl_get_drm_render_node(&vaapi->egl); vaapi->interop.pix_fmt = AV_PIX_FMT_VAAPI; vaapi->interop.texture = NULL; vaapi->interop.ops = &ops; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/interop/interop_videotoolbox.c new/scrcpy-5.0.1/app/src/interop/interop_videotoolbox.c --- old/scrcpy-5.0/app/src/interop/interop_videotoolbox.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/interop/interop_videotoolbox.c 2026-10-08 08:41:27.000000000 +0200 @@ -144,6 +144,7 @@ vt->interop.name = "videotoolbox"; vt->interop.hw_type = AV_HWDEVICE_TYPE_VIDEOTOOLBOX; + vt->interop.hw_device = NULL; vt->interop.pix_fmt = AV_PIX_FMT_VIDEOTOOLBOX; vt->interop.texture = NULL; vt->interop.ops = &ops; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/scrcpy.c new/scrcpy-5.0.1/app/src/scrcpy.c --- old/scrcpy-5.0/app/src/scrcpy.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/scrcpy.c 2026-10-08 08:41:27.000000000 +0200 @@ -338,14 +338,16 @@ sc_init_video_hwdec(struct sc_hwdec *hwdec, enum sc_hwdec_mode mode, struct sc_screen *screen) { enum AVHWDeviceType hw_type = AV_HWDEVICE_TYPE_NONE; + const char *hw_device = NULL; SDL_Renderer *renderer = NULL; if (screen) { hw_type = sc_screen_get_hw_type(screen); + hw_device = sc_screen_get_hw_device(screen); renderer = screen->renderer; } bool hw_forced = hw_type != AV_HWDEVICE_TYPE_NONE && mode != SC_HWDEC_MODE_AUTO; - if (sc_hwdec_init(hwdec, hw_type, hw_forced, renderer)) { + if (sc_hwdec_init(hwdec, hw_type, hw_device, hw_forced, renderer)) { return true; } @@ -368,7 +370,7 @@ } // Initialize software decoder - return sc_hwdec_init(hwdec, AV_HWDEVICE_TYPE_NONE, false, NULL); + return sc_hwdec_init(hwdec, AV_HWDEVICE_TYPE_NONE, NULL, false, NULL); } enum scrcpy_exit_code diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/screen.h new/scrcpy-5.0.1/app/src/screen.h --- old/scrcpy-5.0/app/src/screen.h 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/screen.h 2026-10-08 08:41:27.000000000 +0200 @@ -216,6 +216,11 @@ return sc_texture_get_hw_type(&screen->tex); } +static inline const char * +sc_screen_get_hw_device(struct sc_screen *screen) { + return sc_texture_get_hw_device(&screen->tex); +} + static inline bool sc_screen_disable_hwdec(struct sc_screen *screen) { return sc_texture_disable_hwdec(&screen->tex); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/sdl_hints.c new/scrcpy-5.0.1/app/src/sdl_hints.c --- old/scrcpy-5.0/app/src/sdl_hints.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/sdl_hints.c 2026-10-08 08:41:27.000000000 +0200 @@ -44,15 +44,18 @@ LOGW("Could not enable screensaver"); } +#ifdef HAVE_VAAPI // On X11, SDL creates the OpenGL contexts with GLX by default, but // importing hardware decoded frames (VA-API) requires EGL. Always use EGL, - // so that the rendering does not depend on the hardware decoding mode. It - // has no effect on other platforms. + // so that the rendering does not depend on the hardware decoding mode. + // Do not force it on other platforms: on Windows and macOS, it would try to + // load libEGL.dll. // The environment variable SDL_VIDEO_FORCE_EGL=0 takes priority to restore // GLX (hardware decoding is then unavailable). if (!SDL_SetHint(SDL_HINT_VIDEO_FORCE_EGL, "1")) { LOGW("Could not force EGL"); } +#endif // On Windows, SDL creates the Direct3D 11 device single-threaded by // default, but hardware decoding (D3D11VA) uses it from the decoder thread. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/texture.c new/scrcpy-5.0.1/app/src/texture.c --- old/scrcpy-5.0/app/src/texture.c 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/texture.c 2026-10-08 08:41:27.000000000 +0200 @@ -72,6 +72,11 @@ return tex->interop->hw_type; } +const char * +sc_texture_get_hw_device(struct sc_texture *tex) { + return tex->interop->hw_device; +} + struct sc_size sc_texture_get_frame_size(struct sc_texture *tex) { assert(tex->interop && tex->interop->texture); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/app/src/texture.h new/scrcpy-5.0.1/app/src/texture.h --- old/scrcpy-5.0/app/src/texture.h 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/app/src/texture.h 2026-10-08 08:41:27.000000000 +0200 @@ -46,6 +46,9 @@ enum AVHWDeviceType sc_texture_get_hw_type(struct sc_texture *tex); +const char * +sc_texture_get_hw_device(struct sc_texture *tex); + bool sc_texture_disable_hwdec(struct sc_texture *tex); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/doc/build.md new/scrcpy-5.0.1/doc/build.md --- old/scrcpy-5.0/doc/build.md 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/doc/build.md 2026-10-08 08:41:27.000000000 +0200 @@ -237,10 +237,10 @@ #### Option 2: Use prebuilt server - - [`scrcpy-server-v5.0`][direct-scrcpy-server] - <sub>SHA-256: `26cbc9ad0aced6c2282455bef4fb43462605c1f8758c74b4ab1dbf818c229daa`</sub> + - [`scrcpy-server-v5.0.1`][direct-scrcpy-server] + <sub>SHA-256: `764eb6f79811d5211fe9df341120882ba9994c7a61b897d7bf3fb662e53bc536`</sub> -[direct-scrcpy-server]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-server-v5.0 +[direct-scrcpy-server]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-server-v5.0.1 Download the prebuilt server somewhere, and specify its path during the Meson configuration: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/doc/linux.md new/scrcpy-5.0.1/doc/linux.md --- old/scrcpy-5.0/doc/linux.md 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/doc/linux.md 2026-10-08 08:41:27.000000000 +0200 @@ -6,11 +6,11 @@ Download a static build of the [latest release]: - - [`scrcpy-linux-x86_64-v5.0.tar.gz`][direct-linux-x86_64] (x86_64) - <sub>SHA-256: `f052ad9eb981879e8c5f066c5ef122b39b6c9853b383d6497219030e6549baed`</sub> + - [`scrcpy-linux-x86_64-v5.0.1.tar.gz`][direct-linux-x86_64] (x86_64) + <sub>SHA-256: `9f969d30cc574816077edecda65719c1c70b0aee1df1ba5fa00779ac07b8fd6e`</sub> [latest release]: https://github.com/Genymobile/scrcpy/releases/latest -[direct-linux-x86_64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-linux-x86_64-v5.0.tar.gz +[direct-linux-x86_64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-linux-x86_64-v5.0.1.tar.gz and extract it. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/doc/macos.md new/scrcpy-5.0.1/doc/macos.md --- old/scrcpy-5.0/doc/macos.md 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/doc/macos.md 2026-10-08 08:41:27.000000000 +0200 @@ -6,14 +6,14 @@ Download a static build of the [latest release]: - - [`scrcpy-macos-aarch64-v5.0.tar.gz`][direct-macos-aarch64] (aarch64) - <sub>SHA-256: `7cb4e41c859b05b36e89dc9be6c353cc5980c00d7f7f6a763b5b355551b82e9c`</sub> - - [`scrcpy-macos-x86_64-v5.0.tar.gz`][direct-macos-x86_64] (x86_64) - <sub>SHA-256: `dacb995c8eb42528cb96b2da2a2e3110fe5c82281378e6044fc7cccf48a7c39a`</sub> + - [`scrcpy-macos-aarch64-v5.0.1.tar.gz`][direct-macos-aarch64] (aarch64) + <sub>SHA-256: `33611e51977a8289e2e124b220f727895181ef2eb9060e0987a4dc2db9cf0d6b`</sub> + - [`scrcpy-macos-x86_64-v5.0.1.tar.gz`][direct-macos-x86_64] (x86_64) + <sub>SHA-256: `31a5467a9e907f162b093267cbbab1276b15c6e709c2ea8159566a8d165beb50`</sub> [latest release]: https://github.com/Genymobile/scrcpy/releases/latest -[direct-macos-aarch64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-macos-aarch64-v5.0.tar.gz -[direct-macos-x86_64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-macos-x86_64-v5.0.tar.gz +[direct-macos-aarch64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-macos-aarch64-v5.0.1.tar.gz +[direct-macos-x86_64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-macos-x86_64-v5.0.1.tar.gz and extract it. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/doc/windows.md new/scrcpy-5.0.1/doc/windows.md --- old/scrcpy-5.0/doc/windows.md 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/doc/windows.md 2026-10-08 08:41:27.000000000 +0200 @@ -6,17 +6,17 @@ Download the [latest release]: - - [`scrcpy-win64-v5.0.zip`][direct-win64] (64-bit) - <sub>SHA-256: `44c10d9e82f20ea67227d14d37bf9fbe3603117c5736df3f514544a02ba20a73`</sub> - - [`scrcpy-win32-v5.0.zip`][direct-win32] (32-bit) - <sub>SHA-256: `31413dd59a80cb76e7747ef91b4994934b546c8860e8e7976046c612a50e5cc3`</sub> - - [`scrcpy-winarm64-v5.0.zip`][direct-win32] (ARM 64-bit) - <sub>SHA-256: `afc1db17b216f91470d2c8f41ea786ae18ab1cb2bc2324bc05ec3d7685aa6054`</sub> + - [`scrcpy-win64-v5.0.1.zip`][direct-win64] (64-bit) + <sub>SHA-256: `b12a2c4ee8be317422451fc7dcf8ee20a71b5ea7ef9ad73ddd825a25316227a5`</sub> + - [`scrcpy-win32-v5.0.1.zip`][direct-win32] (32-bit) + <sub>SHA-256: `0cb65ebf1bce892fa4d1502d699af0c7a1a7f24d7febcb9ef72894e3f23fc2ad`</sub> + - [`scrcpy-winarm64-v5.0.1.zip`][direct-win32] (ARM 64-bit) + <sub>SHA-256: `16c3fc2068df64946f670e3504b4752073ebae47a416a45b46e79a5ab19c689b`</sub> [latest release]: https://github.com/Genymobile/scrcpy/releases/latest -[direct-win64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-win64-v5.0.zip -[direct-win32]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-win32-v5.0.zip -[direct-winarm64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-winarm64-v5.0.zip +[direct-win64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-win64-v5.0.1.zip +[direct-win32]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-win32-v5.0.1.zip +[direct-winarm64]: https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-winarm64-v5.0.1.zip and extract it. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/install_release.sh new/scrcpy-5.0.1/install_release.sh --- old/scrcpy-5.0/install_release.sh 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/install_release.sh 2026-10-08 08:41:27.000000000 +0200 @@ -2,8 +2,8 @@ set -e BUILDDIR=build-auto -PREBUILT_SERVER_URL=https://github.com/Genymobile/scrcpy/releases/download/v5.0/scrcpy-server-v5.0 -PREBUILT_SERVER_SHA256=26cbc9ad0aced6c2282455bef4fb43462605c1f8758c74b4ab1dbf818c229daa +PREBUILT_SERVER_URL=https://github.com/Genymobile/scrcpy/releases/download/v5.0.1/scrcpy-server-v5.0.1 +PREBUILT_SERVER_SHA256=764eb6f79811d5211fe9df341120882ba9994c7a61b897d7bf3fb662e53bc536 echo "[scrcpy] Downloading prebuilt server..." wget "$PREBUILT_SERVER_URL" -O scrcpy-server diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/meson.build new/scrcpy-5.0.1/meson.build --- old/scrcpy-5.0/meson.build 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/meson.build 2026-10-08 08:41:27.000000000 +0200 @@ -1,5 +1,5 @@ project('scrcpy', 'c', - version: '5.0', + version: '5.0.1', meson_version: '>= 0.49', default_options: [ 'c_std=c11', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/server/build.gradle new/scrcpy-5.0.1/server/build.gradle --- old/scrcpy-5.0/server/build.gradle 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/server/build.gradle 2026-10-08 08:41:27.000000000 +0200 @@ -7,8 +7,8 @@ applicationId = "com.genymobile.scrcpy" minSdkVersion 21 targetSdkVersion 36 - versionCode 50000 - versionName "5.0" + versionCode 50001 + versionName "5.0.1" testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scrcpy-5.0/server/build_without_gradle.sh new/scrcpy-5.0.1/server/build_without_gradle.sh --- old/scrcpy-5.0/server/build_without_gradle.sh 2026-10-05 12:26:14.000000000 +0200 +++ new/scrcpy-5.0.1/server/build_without_gradle.sh 2026-10-08 08:41:27.000000000 +0200 @@ -12,7 +12,7 @@ set -e SCRCPY_DEBUG=false -SCRCPY_VERSION_NAME=5.0 +SCRCPY_VERSION_NAME=5.0.1 PLATFORM=${ANDROID_PLATFORM:-36} BUILD_TOOLS=${ANDROID_BUILD_TOOLS:-36.0.0}
