<html><head></head><body>Hi,<br><br>It is not that black and white. Named initialisation has two problems, that classic sequential initialisation does not. 1) it does not work in C++, and as much as I'd like to get rid of C++ code... Not happening.<br>2) it mutes warnings about missing initialisers when a member is added.<br><br><div class="gmail_quote">Le 22 juillet 2019 09:12:29 GMT+03:00, Steve Lhomme <robux4@ycbcr.xyz> a écrit :<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">On 2019-07-19 18:33, Rémi Denis-Courmont wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;">vlc | branch: master | Rémi Denis-Courmont <remi@remlab.net> | Fri Jul 19 19:32:33 2019 +0300| [bbbdc5ca6cf8f95d6b8f80ebc6d41907fdee45cb] | committer: Rémi Denis-Courmont<br><br>va: use operations structure<br><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #ad7fa8; padding-left: 1ex;"><a href="http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bbbdc5ca6cf8f95d6b8f80ebc6d41907fdee45cb">http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bbbdc5ca6cf8f95d6b8f80ebc6d41907fdee45cb</a><br></blockquote><hr>  modules/codec/avcodec/d3d11va.c |  6 +++---<br>  modules/codec/avcodec/dxva2.c   |  5 +++--<br>  modules/codec/avcodec/va.c      |  4 ++--<br>  modules/codec/avcodec/va.h      | 10 +++++++---<br>  modules/codec/avcodec/vaapi.c   |  5 +++--<br>  modules/hw/vdpau/avcodec.c      |  5 +++--<br>  6 files changed, 21 insertions(+), 14 deletions(-)<br><br>diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c<br>index 6823b8d2fb..90f5a00d19 100644<br>--- a/modules/codec/avcodec/d3d11va.c<br>+++ b/modules/codec/avcodec/d3d11va.c<br>@@ -308,6 +308,8 @@ static void Close(vlc_va_t *va, void **ctx)<br>      free(sys);<br>  }<br>  <br>+static const struct vlc_va_operations ops = { Get, Close, };<br></blockquote><br>You should set the name for each callback. If the order of the struct is <br>changed, the code is broken (and I'm planning to add a callback in there).<br><br>That's why I'd prefer a generic setter that cannot be mistaken. Adding, <br>removing, changing callbacks will be safe from oversight (won't <br>compile). That will avoid breaking platforms by mistake when gitlab <br>checks all the platforms before pushing is allowed.<br><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;">+<br>  static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br>                  const es_format_t *fmt, picture_sys_d3d11_t *p_sys)<br>  {<br>@@ -409,9 +411,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br>  <br>      ctx->hwaccel_context = &sys->hw;<br>  <br>-    va->get = Get;<br>-    va->close = Close;<br>-<br>+    va->ops = &ops;<br>      return VLC_SUCCESS;<br>  <br>  error:<br>diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c<br>index ca45421d3c..596538d0f3 100644<br>--- a/modules/codec/avcodec/dxva2.c<br>+++ b/modules/codec/avcodec/dxva2.c<br>@@ -253,6 +253,8 @@ static void Close(vlc_va_t *va, void **ctx)<br>      free(sys);<br>  }<br>  <br>+static const struct vlc_va_operations ops = { Get, Close, };<br>+<br>  static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br>                  const es_format_t *fmt, picture_sys_d3d9_t *p_sys)<br>  {<br>@@ -337,8 +339,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br>  <br>      ctx->hwaccel_context = &sys->hw;<br>  <br>-    va->get = Get;<br>-    va->close = Close;<br>+    va->ops = &ops;<br>      return VLC_SUCCESS;<br>  <br>  error:<br>diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c<br>index 545699e870..d491fed0e9 100644<br>--- a/modules/codec/avcodec/va.c<br>+++ b/modules/codec/avcodec/va.c<br>@@ -125,7 +125,7 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,<br>  <br>  void vlc_va_Delete(vlc_va_t *va, void **hwctx)<br>  {<br>-    if (va->close != NULL)<br>-        va->close(va, hwctx);<br>+    if (va->ops->close != NULL)<br>+        va->ops->close(va, hwctx);<br>      vlc_object_delete(va);<br>  }<br>diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h<br>index 5ef2df1307..aeab69b34b 100644<br>--- a/modules/codec/avcodec/va.h<br>+++ b/modules/codec/avcodec/va.h<br>@@ -28,12 +28,16 @@<br>  typedef struct vlc_va_t vlc_va_t;<br>  typedef struct vlc_va_sys_t vlc_va_sys_t;<br>  <br>+struct vlc_va_operations {<br>+    int (*get)(vlc_va_t *, picture_t *pic, uint8_t **surface);<br>+    void (*close)(vlc_va_t *, void **hwctx);<br>+};<br>+<br>  struct vlc_va_t {<br>      struct vlc_object_t obj;<br>  <br>      vlc_va_sys_t *sys;<br>-    int (*get)(vlc_va_t *, picture_t *pic, uint8_t **surface);<br>-    void (*close)(vlc_va_t *, void **hwctx);<br>+    const struct vlc_va_operations *ops;<br>  };<br>  <br>  /**<br>@@ -75,7 +79,7 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *,<br>   */<br>  static inline int vlc_va_Get(vlc_va_t *va, picture_t *pic, uint8_t **surface)<br>  {<br>-    return va->get(va, pic, surface);<br>+    return va->ops->get(va, pic, surface);<br>  }<br>  <br>  /**<br>diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c<br>index 948916d046..4ed67677d5 100644<br>--- a/modules/codec/avcodec/vaapi.c<br>+++ b/modules/codec/avcodec/vaapi.c<br>@@ -145,6 +145,8 @@ static void Delete(vlc_va_t *va, void **hwctx)<br>      free(sys);<br>  }<br>  <br>+static const struct vlc_va_operations ops = { Get, Delete, };<br>+<br>  static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br>                    const es_format_t *fmt, void *p_sys)<br>  {<br>@@ -201,8 +203,7 @@ static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br>  <br>      ctx->hwaccel_context = &sys->hw_ctx;<br>      va->sys = sys;<br>-    va->get = Get;<br>-    va->close = Delete;<br>+    va->ops = &ops;<br>      return VLC_SUCCESS;<br>  <br>  error:<br>diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c<br>index 92fe0a65f6..c1d5d79cea 100644<br>--- a/modules/hw/vdpau/avcodec.c<br>+++ b/modules/hw/vdpau/avcodec.c<br>@@ -128,6 +128,8 @@ static void Close(vlc_va_t *va, void **hwctx)<br>      free(sys);<br>  }<br>  <br>+static const struct vlc_va_operations ops = { Lock, Close, };<br>+<br>  static int Open(vlc_va_t *va, AVCodecContext *avctx, enum PixelFormat pix_fmt,<br>                  const es_format_t *fmt, void *p_sys)<br>  {<br>@@ -215,8 +217,7 @@ static int Open(vlc_va_t *va, AVCodecContext *avctx, enum PixelFormat pix_fmt,<br>      if (vdp_get_information_string(sys->vdp, &infos) == VDP_STATUS_OK)<br>          msg_Info(va, "Using %s", infos);<br>  <br>-    va->get = Lock;<br>-    va->close = Close;<br>+    va->ops = &ops;<br>      return VLC_SUCCESS;<br>  <br>  error:<hr>vlc-commits mailing list<br>vlc-commits@videolan.org<br><a href="https://mailman.videolan.org/listinfo/vlc-commits">https://mailman.videolan.org/listinfo/vlc-commits</a><br><br></blockquote><hr>vlc-devel mailing list<br>To unsubscribe or modify your subscription options:<br><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a></pre></blockquote></div><br>-- <br>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.</body></html>