--- video/out/opengl/video.c.orig
+++ video/out/opengl/video.c
@@ -968,7 +968,7 @@ static void uninit_video(struct gl_video
         gl->DeleteTextures(1, &plane->gl_texture);
         gl_pbo_upload_uninit(&plane->pbo);
     }
-    *vimg = (struct video_image){0};
+    *vimg = (struct video_image){{0}};
 
     // Invalidate image_params to ensure that gl_video_config() will call
     // init_video() on uninitialized gl_video.
@@ -1073,7 +1073,7 @@ static void pass_prepare_src_tex(struct 
 static void render_pass_quad(struct gl_video *p, int vp_w, int vp_h,
                              const struct mp_rect *dst)
 {
-    struct vertex va[4] = {0};
+    struct vertex va[4] = {{{0}}};
 
     struct gl_transform t;
     gl_transform_ortho(&t, 0, vp_w, 0, vp_h);
@@ -3000,7 +3000,7 @@ void gl_video_perfdata(struct gl_video *
 // This assumes nv12, with textures set to GL_NEAREST filtering.
 static void reinterleave_vdpau(struct gl_video *p, struct gl_hwdec_frame *frame)
 {
-    struct gl_hwdec_frame res = {0};
+    struct gl_hwdec_frame res = {{{0}}};
     for (int n = 0; n < 2; n++) {
         struct fbotex *fbo = &p->vdpau_deinterleave_fbo[n];
         // This is an array of the 2 to-merge planes.
@@ -3063,7 +3063,7 @@ static bool pass_upload_image(struct gl_
 
     if (p->hwdec_active) {
         // Hardware decoding
-        struct gl_hwdec_frame gl_frame = {0};
+        struct gl_hwdec_frame gl_frame = {{{0}}};
 
         pass_describe(p, "map frame (hwdec)");
         gl_timer_start(p->upload_timer);
