[vlc-commits] [Git][videolan/vlc][master] 4 commits: mpeg: dvbpsi: avoid casting callbacks
Steve Lhomme (@robUx4)
gitlab at videolan.org
Wed Jan 29 15:57:35 UTC 2025
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
61c4034f by Alaric Senat at 2025-01-29T15:42:33+00:00
mpeg: dvbpsi: avoid casting callbacks
The function signature does not match the dvbpsi callback (demux_t*
instead of void*). While this is supported by many platforms and
compilers, it's undefined behavior strictly by the standard [1] and it's
known to often fail with emscripten [^2].
[1]:
Section 6.3.2.3, paragraph 8:
> A pointer to a function of one type may be converted to a pointer to a
> function of another type and back again; the result shall compare
> equal to the original pointer. If a converted pointer is used to call
> a function whose type is not compatible with the pointed-to type, the
> behavior is undefined.
Quoting section 6.7.5.1, paragraph 2 for pointer compatibility:
> For two pointer types to be compatible, both shall be identically
> qualified and both shall be pointers to compatible types.
[^2]: https://emscripten.org/docs/porting/guidelines/function_pointer_issues.html
- - - - -
e99be279 by Alaric Senat at 2025-01-29T15:42:33+00:00
libplacebo: avoid casting callbacks
The function signature does not match the libplacebo callback (gl_t*
instead of void*). While this is supported by many platforms and
compilers, it's undefined behavior strictly by the standard [1] and it's
known to often fail with emscripten [^2].
[1]:
Section 6.3.2.3, paragraph 8:
> A pointer to a function of one type may be converted to a pointer to a
> function of another type and back again; the result shall compare
> equal to the original pointer. If a converted pointer is used to call
> a function whose type is not compatible with the pointed-to type, the
> behavior is undefined.
Quoting section 6.7.5.1, paragraph 2 for pointer compatibility:
> For two pointer types to be compatible, both shall be identically
> qualified and both shall be pointers to compatible types.
[^2]: https://emscripten.org/docs/porting/guidelines/function_pointer_issues.html
- - - - -
c876b0f7 by Alaric Senat at 2025-01-29T15:42:33+00:00
emscripten: extra_checks: ban incompatible function casts
Emscripten is known to deal badly with function casts to incompatible
types [^1]. This patch prevent us to accidentally merge harmful UB casts
to wasm enabled code. The warning is really strict but is compliant to the
standard. Code that wants to use function cast should be disabled from
the wasm platform.
[^1]: https://emscripten.org/docs/porting/guidelines/function_pointer_issues.html
- - - - -
a7f92685 by Alaric Senat at 2025-01-29T15:42:33+00:00
configure: misc: fix some typos
- - - - -
3 changed files:
- configure.ac
- modules/demux/mpeg/ts_si.c
- modules/video_output/libplacebo/instance_opengl.c
Changes:
=====================================
configure.ac
=====================================
@@ -455,7 +455,7 @@ esac
dnl WinRT
AC_ARG_ENABLE([winstore_app],
AS_HELP_STRING([--enable-winstore-app],
- [Build targetted for Windows Store apps (default disabled)]))
+ [Build targeted for Windows Store apps (default disabled)]))
vlc_winstore_app=0
AS_IF([test "${SYS}" = "mingw32"],[
@@ -691,7 +691,7 @@ AC_PREPROC_IFELSE([AC_LANG_SOURCE([
#endif
])], [
-dnl Check for broken versions of mingw-runtime compatability library
+dnl Check for broken versions of mingw-runtime compatibility library
AC_MSG_CHECKING(for broken mingw-runtime)
AC_PREPROC_IFELSE([AC_LANG_SOURCE([
#include <_mingw.h>
@@ -742,7 +742,7 @@ dnl Check for broken versions of mingw-runtime compatability library
dnl
-dnl Buggy glibc prevention. Purposedly not cached.
+dnl Buggy glibc prevention. Purposely not cached.
dnl See sourceware.org bugs 5058 and 5443.
dnl Ubuntu alone has 20 bug numbers for this...
dnl
@@ -939,7 +939,7 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_Thread_local int foo = 0;
],[ AC_MSG_RESULT([no])])
dnl __STDC_NO_THREADS__ can't be trusted on some platforms.
-dnl check for its availability explicitely
+dnl check for its availability explicitly
AC_CHECK_HEADERS([threads.h])
AC_CHECK_LIB([anl],[getaddrinfo_a],[])
@@ -1198,6 +1198,15 @@ AS_IF([test "${enable_extra_checks}" = "yes"], [
AC_LANG_POP(C++)
])
+# Casting incompatible functions is notoriously bug prone with emscripten:
+# https://emscripten.org/docs/porting/guidelines/function_pointer_issues.html
+AS_IF([test "${enable_extra_checks}" = "yes" && test "${SYS}" = "emscripten"], [
+ AX_APPEND_COMPILE_FLAGS([-Werror=cast-function-type-strict], [CFLAGS])
+ AC_LANG_PUSH(C++)
+ AX_APPEND_COMPILE_FLAGS([-Werror=cast-function-type-strict], [CXXFLAGS])
+ AC_LANG_POP(C++)
+])
+
dnl UWP forbidden checks
AS_IF([test "${SYS}" = "mingw32"], [
AC_MSG_CHECKING(for if_nametoindex availability)
@@ -1445,7 +1454,7 @@ fi
WIN32_PATH_CMD=
AS_IF([test "${SYS}" = "mingw32"], [
- AC_MSG_CHECKING([how to transform windows pathes])
+ AC_MSG_CHECKING([how to transform windows paths])
win32_path_cmd=no
for win_path in "cygpath" "wslpath" "wine winepath"
do
@@ -3133,7 +3142,7 @@ dnl
dnl Teletext Modules
dnl vbi decoder plugin (using libzbvi)
dnl telx module
-dnl uncompatible
+dnl incompatible
dnl
AC_ARG_ENABLE([zvbi],
AS_HELP_STRING([--enable-zvbi],[VBI (inc. Teletext) decoding support with
=====================================
modules/demux/mpeg/ts_si.c
=====================================
@@ -150,8 +150,9 @@ static char *EITConvertToUTF8( demux_t *p_demux,
}\
} while(0)\
-static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )
+static void SDTCallBack( void *opaque, dvbpsi_sdt_t *p_sdt )
{
+ demux_t *p_demux = opaque;
demux_sys_t *p_sys = p_demux->p_sys;
ts_pid_t *sdt = GetPID(p_sys, TS_SI_SDT_PID);
ts_pat_t *p_pat = ts_pid_Get(&p_sys->pids, 0)->u.p_pat;
@@ -383,8 +384,9 @@ static int EITConvertDuration( uint32_t i_duration )
}
#undef CVT_FROM_BCD
-static void TDTCallBack( demux_t *p_demux, dvbpsi_tot_t *p_tdt )
+static void TDTCallBack( void *opaque, dvbpsi_tot_t *p_tdt )
{
+ demux_t *p_demux = opaque;
demux_sys_t *p_sys = p_demux->p_sys;
@@ -490,8 +492,9 @@ static void EITExtractDrDescItems( demux_t *p_demux, const dvbpsi_extended_event
}
}
-static void EITCallBack( demux_t *p_demux, dvbpsi_eit_t *p_eit )
+static void EITCallBack( void *opaque, dvbpsi_eit_t *p_eit )
{
+ demux_t *p_demux = opaque;
demux_sys_t *p_sys = p_demux->p_sys;
const dvbpsi_eit_event_t *p_evt;
uint64_t i_runevt = 0;
@@ -783,7 +786,7 @@ static void SINewTableCallBack( dvbpsi_t *h, uint8_t i_table_id,
#endif
if( p_pid->i_pid == TS_SI_SDT_PID && i_table_id == 0x42 )
{
- if( !dvbpsi_sdt_attach( h, i_table_id, i_extension, (dvbpsi_sdt_callback)SDTCallBack, p_demux ) )
+ if( !dvbpsi_sdt_attach( h, i_table_id, i_extension, SDTCallBack, p_demux ) )
msg_Err( p_demux, "SINewTableCallback: failed attaching SDTCallback" );
}
else if( p_pid->i_pid == TS_SI_EIT_PID &&
@@ -791,13 +794,13 @@ static void SINewTableCallBack( dvbpsi_t *h, uint8_t i_table_id,
(i_table_id >= 0x50 && i_table_id <= 0x5f) ) ) /* Schedule */
{
if( !dvbpsi_eit_attach( h, i_table_id, i_extension,
- (dvbpsi_eit_callback)EITCallBack, p_demux ) )
+ EITCallBack, p_demux ) )
msg_Err( p_demux, "SINewTableCallback: failed attaching EITCallback" );
}
else if( p_pid->i_pid == TS_SI_TDT_PID &&
(i_table_id == TS_SI_TDT_TABLE_ID || i_table_id == TS_SI_TOT_TABLE_ID) )
{
- if( !dvbpsi_tot_attach( h, i_table_id, i_extension, (dvbpsi_tot_callback)TDTCallBack, p_demux ) )
+ if( !dvbpsi_tot_attach( h, i_table_id, i_extension, TDTCallBack, p_demux ) )
msg_Err( p_demux, "SINewTableCallback: failed attaching TDTCallback" );
}
else if( p_pid->i_pid == TS_ARIB_CDT_PID && i_table_id == TS_ARIB_CDT_TABLE_ID )
=====================================
modules/video_output/libplacebo/instance_opengl.c
=====================================
@@ -37,6 +37,7 @@ static int InitInstance(vlc_placebo_t *pl, const vout_display_cfg_t *cfg);
static void CloseInstance(vlc_placebo_t *pl);
static int MakeCurrent(vlc_placebo_t *pl);
static void ReleaseCurrent(vlc_placebo_t *pl);
+static void SwapBuffers(void *);
#define GL_TEXT N_("OpenGL extension")
#define GLES2_TEXT N_("OpenGL ES 2 extension")
@@ -127,7 +128,7 @@ static int InitInstance(vlc_placebo_t *pl, const vout_display_cfg_t *cfg)
// Create swapchain for this surface
struct pl_opengl_swapchain_params swap_params = {
- .swap_buffers = (void (*)(void *)) vlc_gl_Swap,
+ .swap_buffers = SwapBuffers,
.max_swapchain_depth = var_InheritInteger(pl, "gl-swap-depth"),
.priv = sys->gl,
};
@@ -179,3 +180,8 @@ static void ReleaseCurrent(vlc_placebo_t *pl)
vlc_placebo_system_t *sys = pl->sys;
vlc_gl_ReleaseCurrent(sys->gl);
}
+
+static void SwapBuffers(void *opaque)
+{
+ vlc_gl_Swap(opaque);
+}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/837f9778eee974e5274b9c84aad3a78b894ba1e9...a7f9268551dcd6d5b0433863a380ad3272264eae
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/837f9778eee974e5274b9c84aad3a78b894ba1e9...a7f9268551dcd6d5b0433863a380ad3272264eae
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list