Title: [279011] trunk/Source/ThirdParty/libwebrtc
Revision
279011
Author
[email protected]
Date
2021-06-17 15:01:55 -0700 (Thu, 17 Jun 2021)

Log Message

[Mac] libwebrtc CMBaseClass objects need alignment fixup
https://bugs.webkit.org/show_bug.cgi?id=227137

Reviewed by Youenn Fablet.

* Source/webrtc/sdk/WebKit/WebKitVP8Decoder.cpp:
(webrtc::createWebKitVP8Decoder): Add padding to the CMBaseClass object on x86_64
so function pointers are naturally aligned. Add static_asserts to ensure alignment
and sizes are correct.
* Source/webrtc/sdk/WebKit/WebKitVP9Decoder.cpp:
(webrtc::createWebKitVP9Decoder): Ditto.

Modified Paths

Diff

Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (279010 => 279011)


--- trunk/Source/ThirdParty/libwebrtc/ChangeLog	2021-06-17 21:55:22 UTC (rev 279010)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog	2021-06-17 22:01:55 UTC (rev 279011)
@@ -1,3 +1,17 @@
+2021-06-17  Eric Carlson  <[email protected]>
+
+        [Mac] libwebrtc CMBaseClass objects need alignment fixup
+        https://bugs.webkit.org/show_bug.cgi?id=227137
+
+        Reviewed by Youenn Fablet.
+
+        * Source/webrtc/sdk/WebKit/WebKitVP8Decoder.cpp:
+        (webrtc::createWebKitVP8Decoder): Add padding to the CMBaseClass object on x86_64
+        so function pointers are naturally aligned. Add static_asserts to ensure alignment
+        and sizes are correct.
+        * Source/webrtc/sdk/WebKit/WebKitVP9Decoder.cpp:
+        (webrtc::createWebKitVP9Decoder): Ditto.
+
 2021-06-15  Youenn Fablet  <[email protected]>
 
         Enable kVTVideoEncoderSpecification_RequiredLowLatency in case of MacOS software encoder

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitVP8Decoder.cpp (279010 => 279011)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitVP8Decoder.cpp	2021-06-17 21:55:22 UTC (rev 279010)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitVP8Decoder.cpp	2021-06-17 22:01:55 UTC (rev 279011)
@@ -48,20 +48,34 @@
 static void finalizeVP8Decoder(CMBaseObjectRef);
 static CFStringRef copyVP8DecoderDebugDescription(CMBaseObjectRef);
 
-static const CMBaseClass WebKitVP8Decoder_BaseClass =
-{
-    kCMBaseObject_ClassVersion_1,
-    sizeof(WebKitVP8Decoder),
-    nullptr, // Comparison by pointer equality
-    invalidateVP8Decoder,
-    finalizeVP8Decoder,
-    copyVP8DecoderDebugDescription,
-    nullptr, // CopyProperty
-    nullptr, // SetProperty
-    nullptr,
-    nullptr
-};
+#if defined(__x86_64__) || defined(_M_X64)
+    constexpr size_t padSize = 4;
+#else
+    constexpr size_t padSize = 0;
+#endif
 
+#pragma pack(push, 4)
+    struct DecoderClass { uint8_t pad[padSize]; CMBaseClass alignedClass; } WebKitVP8Decoder_BaseClass { { }, {
+        kCMBaseObject_ClassVersion_1,
+        sizeof(WebKitVP8Decoder),
+        nullptr, // Comparison by pointer equality
+        invalidateVP8Decoder,
+        finalizeVP8Decoder,
+        copyVP8DecoderDebugDescription,
+        nullptr, // CopyProperty
+        nullptr, // SetProperty
+        nullptr,
+        nullptr
+    } };
+#pragma pack(pop)
+
+#if defined(__x86_64__) || defined(_M_X64)
+    static_assert(sizeof(WebKitVP8Decoder_BaseClass.alignedClass.version) != sizeof(void*), "CMBaseClass fixup is required on X86_64");
+#else
+    static_assert(sizeof(WebKitVP8Decoder_BaseClass.alignedClass.version) == sizeof(void*), "CMBaseClass fixup only required on X86_64");
+#endif
+    static_assert(alignof(DecoderClass) == 4, "CMBaseClass must have 4 byte alignment");
+
 static OSStatus startVP8DecoderSession(VTVideoDecoderRef, VTVideoDecoderSession, CMVideoFormatDescriptionRef);
 static OSStatus decodeVP8DecoderFrame(VTVideoDecoderRef, VTVideoDecoderFrame, CMSampleBufferRef, VTDecodeFrameFlags, VTDecodeInfoFlags*);
 
@@ -82,7 +96,7 @@
 
 static const VTVideoDecoderVTable WebKitVP8DecoderVTable =
 {
-    { nullptr, &WebKitVP8Decoder_BaseClass },
+    { nullptr, &WebKitVP8Decoder_BaseClass.alignedClass },
     &WebKitVP8Decoder_VideoDecoderClass
 };
 

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitVP9Decoder.cpp (279010 => 279011)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitVP9Decoder.cpp	2021-06-17 21:55:22 UTC (rev 279010)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitVP9Decoder.cpp	2021-06-17 22:01:55 UTC (rev 279011)
@@ -48,20 +48,34 @@
 static void finalizeVP9Decoder(CMBaseObjectRef);
 static CFStringRef copyVP9DecoderDebugDescription(CMBaseObjectRef);
 
-static const CMBaseClass WebKitVP9Decoder_BaseClass =
-{
-    kCMBaseObject_ClassVersion_1,
-    sizeof(WebKitVP9Decoder),
-    nullptr, // Comparison by pointer equality
-    invalidateVP9Decoder,
-    finalizeVP9Decoder,
-    copyVP9DecoderDebugDescription,
-    nullptr, // CopyProperty
-    nullptr, // SetProperty
-    nullptr,
-    nullptr
-};
+#if defined(__x86_64__) || defined(_M_X64)
+    constexpr size_t padSize = 4;
+#else
+    constexpr size_t padSize = 0;
+#endif
 
+#pragma pack(push, 4)
+    struct DecoderClass { uint8_t pad[padSize]; CMBaseClass alignedClass; } WebKitVP9Decoder_BaseClass { { }, {
+        kCMBaseObject_ClassVersion_1,
+        sizeof(WebKitVP9Decoder),
+        nullptr, // Comparison by pointer equality
+        invalidateVP9Decoder,
+        finalizeVP9Decoder,
+        copyVP9DecoderDebugDescription,
+        nullptr, // CopyProperty
+        nullptr, // SetProperty
+        nullptr,
+        nullptr
+    } };
+#pragma pack(pop)
+
+#if defined(__x86_64__) || defined(_M_X64)
+    static_assert(sizeof(WebKitVP9Decoder_BaseClass.alignedClass.version) != sizeof(void*), "CMBaseClass fixup is required on X86_64");
+#else
+    static_assert(sizeof(WebKitVP9Decoder_BaseClass.alignedClass.version) == sizeof(void*), "CMBaseClass fixup only required on X86_64");
+#endif
+    static_assert(alignof(DecoderClass) == 4, "CMBaseClass must have 4 byte alignment");
+
 static OSStatus startVP9DecoderSession(VTVideoDecoderRef, VTVideoDecoderSession, CMVideoFormatDescriptionRef);
 static OSStatus decodeVP9DecoderFrame(VTVideoDecoderRef, VTVideoDecoderFrame, CMSampleBufferRef, VTDecodeFrameFlags, VTDecodeInfoFlags*);
 
@@ -82,7 +96,7 @@
 
 static const VTVideoDecoderVTable WebKitVP9DecoderVTable =
 {
-    { nullptr, &WebKitVP9Decoder_BaseClass },
+    { nullptr, &WebKitVP9Decoder_BaseClass.alignedClass },
     &WebKitVP9Decoder_VideoDecoderClass
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to