diff --git a/app/app.pro b/app/app.pro
index f8201b53e..829dfab04 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -146,7 +146,7 @@ unix:!macx {
 }
 win32 {
     LIBS += -llibssl -llibcrypto -lSDL2 -lSDL2_ttf -lavcodec -lavutil -lopus -ldxgi -ld3d11
-    CONFIG += ffmpeg
+    CONFIG += ffmpeg libplacebo
 }
 win32:!winrt {
     CONFIG += soundio discord-rpc
@@ -338,6 +338,11 @@ libplacebo {
         streaming/video/ffmpeg-renderers/plvk_c.c
     HEADERS += \
         streaming/video/ffmpeg-renderers/plvk.h
+
+    win32 {
+        INCLUDEPATH += $((VULKAN_SDK))/Include
+        LIBS += libplacebo.lib
+    }
 }
 config_EGL {
     message(EGL renderer selected)
diff --git a/app/cli/commandlineparser.cpp b/app/cli/commandlineparser.cpp
index a6970cc47..b05654226 100644
--- a/app/cli/commandlineparser.cpp
+++ b/app/cli/commandlineparser.cpp
@@ -374,6 +374,7 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
     parser.addToggleOption("keep-awake", "prevent display sleep while streaming");
     parser.addToggleOption("performance-overlay", "show performance overlay");
     parser.addToggleOption("hdr", "HDR streaming");
+    parser.addToggleOption("yuv444", "YUV 4:4:4 sampling, if supported");
     parser.addChoiceOption("capture-system-keys", "capture system key combos", m_CaptureSysKeysModeMap.keys());
     parser.addChoiceOption("video-codec", "video codec", m_VideoCodecMap.keys());
     parser.addChoiceOption("video-decoder", "video decoder", m_VideoDecoderMap.keys());
@@ -493,6 +494,9 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
 
     // Resolve --hdr and --no-hdr options
     preferences->enableHdr = parser.getToggleOptionValue("hdr", preferences->enableHdr);
+
+    // Resolve --yuv444 and --no-yuv444 options
+    preferences->enableYUV444 = parser.getToggleOptionValue("yuv444", preferences->enableYUV444);
     
     // Resolve --capture-system-keys option
     if (parser.isSet("capture-system-keys")) {
diff --git a/app/gui/SettingsView.qml b/app/gui/SettingsView.qml
index b13ac31f3..cdeedeb6f 100644
--- a/app/gui/SettingsView.qml
+++ b/app/gui/SettingsView.qml
@@ -1611,6 +1611,18 @@ Flickable {
                                       qsTr("HDR streaming is not supported on this PC.")
                 }
 
+                CheckBox {
+                    id: enableYUV444
+                    width: parent.width
+                    text: qsTr("Enable YUV 4:4:4 (Experimental)")
+                    font.pointSize: 12
+
+                    checked: StreamingPreferences.enableYUV444
+                    onCheckedChanged: {
+                        StreamingPreferences.enableYUV444 = checked
+                    }
+                }
+
                 CheckBox {
                     id: enableMdns
                     width: parent.width
diff --git a/app/settings/streamingpreferences.cpp b/app/settings/streamingpreferences.cpp
index bf92dd78c..55a9c6979 100644
--- a/app/settings/streamingpreferences.cpp
+++ b/app/settings/streamingpreferences.cpp
@@ -23,6 +23,7 @@
 #define SER_AUDIOCFG "audiocfg"
 #define SER_VIDEOCFG "videocfg"
 #define SER_HDR "hdr"
+#define SER_YUV444 "yuv444"
 #define SER_VIDEODEC "videodec"
 #define SER_WINDOWMODE "windowmode"
 #define SER_MDNS "mdns"
@@ -140,6 +141,7 @@ void StreamingPreferences::reload()
     swapFaceButtons = settings.value(SER_SWAPFACEBUTTONS, false).toBool();
     keepAwake = settings.value(SER_KEEPAWAKE, true).toBool();
     enableHdr = settings.value(SER_HDR, false).toBool();
+    enableYUV444 = settings.value(SER_YUV444, false).toBool();
     captureSysKeysMode = static_cast<CaptureSysKeysMode>(settings.value(SER_CAPTURESYSKEYS,
                                                          static_cast<int>(CaptureSysKeysMode::CSK_OFF)).toInt());
     audioConfig = static_cast<AudioConfig>(settings.value(SER_AUDIOCFG,
@@ -320,6 +322,7 @@ void StreamingPreferences::save()
     settings.setValue(SER_SHOWPERFOVERLAY, showPerformanceOverlay);
     settings.setValue(SER_AUDIOCFG, static_cast<int>(audioConfig));
     settings.setValue(SER_HDR, enableHdr);
+    settings.setValue(SER_YUV444, enableYUV444);
     settings.setValue(SER_VIDEOCFG, static_cast<int>(videoCodecConfig));
     settings.setValue(SER_VIDEODEC, static_cast<int>(videoDecoderSelection));
     settings.setValue(SER_WINDOWMODE, static_cast<int>(windowMode));
diff --git a/app/settings/streamingpreferences.h b/app/settings/streamingpreferences.h
index b5c8fb2f9..90cf46de9 100644
--- a/app/settings/streamingpreferences.h
+++ b/app/settings/streamingpreferences.h
@@ -124,6 +124,7 @@ class StreamingPreferences : public QObject
     Q_PROPERTY(AudioConfig audioConfig MEMBER audioConfig NOTIFY audioConfigChanged)
     Q_PROPERTY(VideoCodecConfig videoCodecConfig MEMBER videoCodecConfig NOTIFY videoCodecConfigChanged)
     Q_PROPERTY(bool enableHdr MEMBER enableHdr NOTIFY enableHdrChanged)
+    Q_PROPERTY(bool enableYUV444 MEMBER enableYUV444 NOTIFY enableYUV444Changed)
     Q_PROPERTY(VideoDecoderSelection videoDecoderSelection MEMBER videoDecoderSelection NOTIFY videoDecoderSelectionChanged)
     Q_PROPERTY(WindowMode windowMode MEMBER windowMode NOTIFY windowModeChanged)
     Q_PROPERTY(WindowMode recommendedFullScreenMode MEMBER recommendedFullScreenMode CONSTANT)
@@ -168,6 +169,7 @@ class StreamingPreferences : public QObject
     AudioConfig audioConfig;
     VideoCodecConfig videoCodecConfig;
     bool enableHdr;
+    bool enableYUV444;
     VideoDecoderSelection videoDecoderSelection;
     WindowMode windowMode;
     WindowMode recommendedFullScreenMode;
@@ -190,6 +192,7 @@ class StreamingPreferences : public QObject
     void audioConfigChanged();
     void videoCodecConfigChanged();
     void enableHdrChanged();
+    void enableYUV444Changed();
     void videoDecoderSelectionChanged();
     void uiDisplayModeChanged();
     void windowModeChanged();
diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp
index 887f23867..5b1f2e176 100644
--- a/app/streaming/session.cpp
+++ b/app/streaming/session.cpp
@@ -472,18 +472,33 @@ bool Session::populateDecoderProperties(SDL_Window* window)
     IVideoDecoder* decoder;
 
     int videoFormat;
-    if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_MAIN10) {
+    if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH10_444) {
+        videoFormat = VIDEO_FORMAT_AV1_HIGH10_444;
+    }
+    else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_MAIN10) {
         videoFormat = VIDEO_FORMAT_AV1_MAIN10;
     }
+    else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH8_444) {
+        videoFormat = VIDEO_FORMAT_AV1_HIGH8_444;
+    }
     else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_MAIN8) {
         videoFormat = VIDEO_FORMAT_AV1_MAIN8;
     }
+    else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265_REXT10_444) {
+        videoFormat = VIDEO_FORMAT_H265_REXT10_444;
+    }
     else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265_MAIN10) {
         videoFormat = VIDEO_FORMAT_H265_MAIN10;
     }
+    else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265_REXT8_444) {
+        videoFormat = VIDEO_FORMAT_H265_REXT8_444;
+    }
     else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265) {
         videoFormat = VIDEO_FORMAT_H265;
     }
+    else if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H264_HIGH8_444) {
+        videoFormat = VIDEO_FORMAT_H264_HIGH8_444;
+    }
     else {
         videoFormat = VIDEO_FORMAT_H264;
     }
@@ -606,15 +621,22 @@ bool Session::initialize()
         return false;
     }
 
+    LiInitializeStreamConfiguration(&m_StreamConfig);
+    m_StreamConfig.width = m_Preferences->width;
+    m_StreamConfig.height = m_Preferences->height;
+
+    int x, y, width, height;
+    getWindowDimensions(x, y, width, height);
+
     // Create a hidden window to use for decoder initialization tests
-    SDL_Window* testWindow = SDL_CreateWindow("", 0, 0, 1280, 720,
+    SDL_Window* testWindow = SDL_CreateWindow("", x, y, width, height,
                                               SDL_WINDOW_HIDDEN | StreamUtils::getPlatformWindowFlags());
     if (!testWindow) {
         SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
                     "Failed to create test window with platform flags: %s",
                     SDL_GetError());
 
-        testWindow = SDL_CreateWindow("", 0, 0, 1280, 720, SDL_WINDOW_HIDDEN);
+        testWindow = SDL_CreateWindow("", x, y, width, height, SDL_WINDOW_HIDDEN);
         if (!testWindow) {
             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
                          "Failed to create window for hardware decode test: %s",
@@ -630,9 +652,6 @@ bool Session::initialize()
     LiInitializeVideoCallbacks(&m_VideoCallbacks);
     m_VideoCallbacks.setup = drSetup;
 
-    LiInitializeStreamConfiguration(&m_StreamConfig);
-    m_StreamConfig.width = m_Preferences->width;
-    m_StreamConfig.height = m_Preferences->height;
     m_StreamConfig.fps = m_Preferences->fps;
     m_StreamConfig.bitrate = m_Preferences->bitrateKbps;
 
@@ -712,14 +731,31 @@ bool Session::initialize()
 #endif
 
         // TODO: Determine if HEVC is better depending on the decoder
-        if (m_Preferences->enableHdr && isHardwareDecodeAvailable(testWindow,
-                                                                  m_Preferences->videoDecoderSelection,
-                                                                  VIDEO_FORMAT_H265_MAIN10,
-                                                                  m_StreamConfig.width,
-                                                                  m_StreamConfig.height,
-                                                                  m_StreamConfig.fps)) {
+        if (m_Preferences->enableHdr &&
+            m_Preferences->enableYUV444 && isHardwareDecodeAvailable(testWindow,
+                                                                     m_Preferences->videoDecoderSelection,
+                                                                     VIDEO_FORMAT_H265_REXT10_444,
+                                                                     m_StreamConfig.width,
+                                                                     m_StreamConfig.height,
+                                                                     m_StreamConfig.fps)) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265 | VIDEO_FORMAT_H265_MAIN10 | VIDEO_FORMAT_H265_REXT8_444 | VIDEO_FORMAT_H265_REXT10_444;
+        }
+        else if (m_Preferences->enableHdr && isHardwareDecodeAvailable(testWindow,
+                                                                       m_Preferences->videoDecoderSelection,
+                                                                       VIDEO_FORMAT_H265_MAIN10,
+                                                                       m_StreamConfig.width,
+                                                                       m_StreamConfig.height,
+                                                                       m_StreamConfig.fps)) {
             m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265 | VIDEO_FORMAT_H265_MAIN10;
         }
+        else if (m_Preferences->enableYUV444 && isHardwareDecodeAvailable(testWindow,
+                                                                          m_Preferences->videoDecoderSelection,
+                                                                          VIDEO_FORMAT_H265_REXT8_444,
+                                                                          m_StreamConfig.width,
+                                                                          m_StreamConfig.height,
+                                                                          m_StreamConfig.fps)) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265 | VIDEO_FORMAT_H265_REXT8_444;
+        }
         else if (isHardwareDecodeAvailable(testWindow,
                                            m_Preferences->videoDecoderSelection,
                                            VIDEO_FORMAT_H265,
@@ -747,18 +783,33 @@ bool Session::initialize()
 #endif
         break;
     case StreamingPreferences::VCC_FORCE_H264:
+        if (m_Preferences->enableYUV444) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H264_HIGH8_444;
+        }
         break;
     case StreamingPreferences::VCC_FORCE_HEVC:
     case StreamingPreferences::VCC_FORCE_HEVC_HDR_DEPRECATED:
         m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265;
         if (m_Preferences->enableHdr) {
             m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265_MAIN10;
+            if (m_Preferences->enableYUV444) {
+                m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265_REXT10_444;
+            }
+        }
+        if (m_Preferences->enableYUV444) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265_REXT8_444;
         }
         break;
     case StreamingPreferences::VCC_FORCE_AV1:
         m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_AV1_MAIN8;
         if (m_Preferences->enableHdr) {
             m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_AV1_MAIN10;
+            if (m_Preferences->enableYUV444) {
+                m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_AV1_HIGH10_444;
+            }
+        }
+        if (m_Preferences->enableYUV444) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_AV1_HIGH8_444;
         }
 
         // We'll try to fall back to HEVC first if AV1 fails. We'd rather not fall back
@@ -769,6 +820,12 @@ bool Session::initialize()
         if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_MAIN10) {
             m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265_MAIN10;
         }
+        if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH8_444) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265_REXT8_444;
+        }
+        if (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH10_444) {
+            m_StreamConfig.supportedVideoFormats |= VIDEO_FORMAT_H265_REXT10_444;
+        }
         break;
     }
 
@@ -988,6 +1045,82 @@ bool Session::validateLaunch(SDL_Window* testWindow)
         }
     }
 
+    if (m_Preferences->enableYUV444) {
+        switch (m_Preferences->videoCodecConfig) {
+        case StreamingPreferences::VCC_AUTO:
+            // Auto was already checked during init
+            break;
+
+        case StreamingPreferences::VCC_FORCE_H264:
+            if ((m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H264_HIGH8_444) &&
+                (!(m_Computer->serverCodecModeSupport & SCM_H264_HIGH8_444) ||
+                 !isHardwareDecodeAvailable(testWindow,
+                                            m_Preferences->videoDecoderSelection,
+                                            VIDEO_FORMAT_H264_HIGH8_444,
+                                            m_StreamConfig.width,
+                                            m_StreamConfig.height,
+                                            m_StreamConfig.fps))) {
+                m_StreamConfig.supportedVideoFormats &= ~VIDEO_FORMAT_H264_HIGH8_444;
+            }
+            break;
+
+        case StreamingPreferences::VCC_FORCE_HEVC:
+        case StreamingPreferences::VCC_FORCE_HEVC_HDR_DEPRECATED:
+            if ((m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265_REXT10_444) &&
+                (!(m_Computer->serverCodecModeSupport & SCM_HEVC_REXT10_444) ||
+                 !isHardwareDecodeAvailable(testWindow,
+                                            m_Preferences->videoDecoderSelection,
+                                            VIDEO_FORMAT_H265_REXT10_444,
+                                            m_StreamConfig.width,
+                                            m_StreamConfig.height,
+                                            m_StreamConfig.fps))) {
+                m_StreamConfig.supportedVideoFormats &= ~VIDEO_FORMAT_H265_REXT10_444;
+            }
+            // Skip 8-bit check if we passed 10-bit check
+            if (!(m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265_REXT10_444) &&
+                (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_H265_REXT8_444) &&
+                (!(m_Computer->serverCodecModeSupport & SCM_HEVC_REXT8_444) ||
+                 !isHardwareDecodeAvailable(testWindow,
+                                            m_Preferences->videoDecoderSelection,
+                                            VIDEO_FORMAT_H265_REXT8_444,
+                                            m_StreamConfig.width,
+                                            m_StreamConfig.height,
+                                            m_StreamConfig.fps))) {
+                m_StreamConfig.supportedVideoFormats &= ~VIDEO_FORMAT_H265_REXT8_444;
+            }
+            break;
+
+        case StreamingPreferences::VCC_FORCE_AV1:
+            if ((m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH10_444) &&
+                (!(m_Computer->serverCodecModeSupport & SCM_AV1_HIGH10_444) ||
+                 !isHardwareDecodeAvailable(testWindow,
+                                            m_Preferences->videoDecoderSelection,
+                                            VIDEO_FORMAT_AV1_HIGH10_444,
+                                            m_StreamConfig.width,
+                                            m_StreamConfig.height,
+                                            m_StreamConfig.fps))) {
+                m_StreamConfig.supportedVideoFormats &= ~VIDEO_FORMAT_AV1_HIGH10_444;
+            }
+            // Skip 8-bit check if we passed 10-bit check
+            if (!(m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH10_444) &&
+                (m_StreamConfig.supportedVideoFormats & VIDEO_FORMAT_AV1_HIGH8_444) &&
+                (!(m_Computer->serverCodecModeSupport & SCM_AV1_HIGH8_444) ||
+                 !isHardwareDecodeAvailable(testWindow,
+                                            m_Preferences->videoDecoderSelection,
+                                            VIDEO_FORMAT_AV1_HIGH8_444,
+                                            m_StreamConfig.width,
+                                            m_StreamConfig.height,
+                                            m_StreamConfig.fps))) {
+                m_StreamConfig.supportedVideoFormats &= ~VIDEO_FORMAT_AV1_HIGH8_444;
+            }
+            break;
+
+        default:
+            SDL_assert(false);
+            break;
+        }
+    }
+
     if (m_StreamConfig.width >= 3840) {
         // Only allow 4K on GFE 3.x+
         if (m_Computer->gfeVersion.isEmpty() || m_Computer->gfeVersion.startsWith("2.")) {
diff --git a/app/streaming/video/ffmpeg-renderers/plvk.cpp b/app/streaming/video/ffmpeg-renderers/plvk.cpp
index 8e95d0b0a..2aa9bd5d4 100644
--- a/app/streaming/video/ffmpeg-renderers/plvk.cpp
+++ b/app/streaming/video/ffmpeg-renderers/plvk.cpp
@@ -271,12 +271,14 @@ bool PlVkRenderer::tryInitializeDevice(VkPhysicalDevice device, VkPhysicalDevice
         return false;
     }
 
+    /*
     if ((decoderParams->videoFormat & VIDEO_FORMAT_MASK_10BIT) && !isColorSpaceSupportedByPhysicalDevice(device, VK_COLOR_SPACE_HDR10_ST2084_EXT)) {
         SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
                     "Vulkan device '%s' does not support HDR10 (ST.2084 PQ)",
                     deviceProps->deviceName);
         return false;
     }
+    */
 
     // Avoid software GPUs
     if (deviceProps->deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU && qgetenv("PLVK_ALLOW_SOFTWARE") != "1") {
@@ -579,6 +581,7 @@ bool PlVkRenderer::isPresentModeSupportedByPhysicalDevice(VkPhysicalDevice devic
     return false;
 }
 
+/*
 bool PlVkRenderer::isColorSpaceSupportedByPhysicalDevice(VkPhysicalDevice device, VkColorSpaceKHR colorSpace)
 {
     uint32_t formatCount = 0;
@@ -595,6 +598,7 @@ bool PlVkRenderer::isColorSpaceSupportedByPhysicalDevice(VkPhysicalDevice device
 
     return false;
 }
+*/
 
 bool PlVkRenderer::isSurfacePresentationSupportedByPhysicalDevice(VkPhysicalDevice device)
 {
@@ -896,6 +900,7 @@ bool PlVkRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
 
 int PlVkRenderer::getRendererAttributes()
 {
+    /*
     int attributes = 0;
 
     if (isColorSpaceSupportedByPhysicalDevice(m_Vulkan->phys_device, VK_COLOR_SPACE_HDR10_ST2084_EXT)) {
@@ -903,11 +908,21 @@ int PlVkRenderer::getRendererAttributes()
     }
 
     return attributes;
+    */
+
+    return RENDERER_ATTRIBUTE_HDR_SUPPORT;
+}
+
+int PlVkRenderer::getDecoderColorspace()
+{
+    // We rely on libplacebo for color conversion, pick colorspace with the same primaries as sRGB
+    return COLORSPACE_REC_709;
 }
 
 int PlVkRenderer::getDecoderColorRange()
 {
-    // Explicitly set the color range to full to fix raised black levels on OLED displays
+    // Explicitly set the color range to full to fix raised black levels on OLED displays,
+    // should also reduce banding artifacts in all situations
     return COLOR_RANGE_FULL;
 }
 
diff --git a/app/streaming/video/ffmpeg-renderers/plvk.h b/app/streaming/video/ffmpeg-renderers/plvk.h
index 3596002e4..d4cdf4ba0 100644
--- a/app/streaming/video/ffmpeg-renderers/plvk.h
+++ b/app/streaming/video/ffmpeg-renderers/plvk.h
@@ -23,6 +23,7 @@ class PlVkRenderer : public IFFmpegRenderer {
     virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
     virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
     virtual int getRendererAttributes() override;
+    virtual int getDecoderColorspace() override;
     virtual int getDecoderColorRange() override;
     virtual int getDecoderCapabilities() override;
     virtual bool needsTestFrame() override;
@@ -41,7 +42,7 @@ class PlVkRenderer : public IFFmpegRenderer {
     bool tryInitializeDevice(VkPhysicalDevice device, VkPhysicalDeviceProperties* deviceProps, PDECODER_PARAMETERS decoderParams);
     bool isExtensionSupportedByPhysicalDevice(VkPhysicalDevice device, const char* extensionName);
     bool isPresentModeSupportedByPhysicalDevice(VkPhysicalDevice device, VkPresentModeKHR presentMode);
-    bool isColorSpaceSupportedByPhysicalDevice(VkPhysicalDevice device, VkColorSpaceKHR colorSpace);
+    //bool isColorSpaceSupportedByPhysicalDevice(VkPhysicalDevice device, VkColorSpaceKHR colorSpace);
     bool isSurfacePresentationSupportedByPhysicalDevice(VkPhysicalDevice device);
 
     // The backend renderer if we're frontend-only
diff --git a/app/streaming/video/ffmpeg.cpp b/app/streaming/video/ffmpeg.cpp
index f2e1846ef..46e86c87e 100644
--- a/app/streaming/video/ffmpeg.cpp
+++ b/app/streaming/video/ffmpeg.cpp
@@ -525,6 +525,26 @@ bool FFmpegVideoDecoder::completeInitialization(const AVCodec* decoder, enum AVP
             m_Pkt->data = (uint8_t*)k_AV1Main10TestFrame;
             m_Pkt->size = sizeof(k_AV1Main10TestFrame);
             break;
+        case VIDEO_FORMAT_H264_HIGH8_444:
+            m_Pkt->data = (uint8_t*)k_h264High_444TestFrame;
+            m_Pkt->size = sizeof(k_h264High_444TestFrame);
+            break;
+        case VIDEO_FORMAT_H265_REXT8_444:
+            m_Pkt->data = (uint8_t*)k_HEVCRExt8_444TestFrame;
+            m_Pkt->size = sizeof(k_HEVCRExt8_444TestFrame);
+            break;
+        case VIDEO_FORMAT_H265_REXT10_444:
+            m_Pkt->data = (uint8_t*)k_HEVCRExt10_444TestFrame;
+            m_Pkt->size = sizeof(k_HEVCRExt10_444TestFrame);
+            break;
+        case VIDEO_FORMAT_AV1_HIGH8_444:
+            m_Pkt->data = (uint8_t*)k_AV1High8_444TestFrame;
+            m_Pkt->size = sizeof(k_AV1High8_444TestFrame);
+            break;
+        case VIDEO_FORMAT_AV1_HIGH10_444:
+            m_Pkt->data = (uint8_t*)k_AV1High10_444TestFrame;
+            m_Pkt->size = sizeof(k_AV1High10_444TestFrame);
+            break;
         default:
             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
                          "No test frame for format: %x",
@@ -677,16 +697,33 @@ void FFmpegVideoDecoder::stringifyVideoStats(VIDEO_STATS& stats, char* output, i
         codecString = "H.264";
         break;
 
+    case VIDEO_FORMAT_H264_HIGH8_444:
+        codecString = "H.264 4:4:4";
+        break;
+
     case VIDEO_FORMAT_H265:
         codecString = "HEVC";
         break;
 
+    case VIDEO_FORMAT_H265_REXT8_444:
+        codecString = "HEVC 4:4:4";
+        break;
+
     case VIDEO_FORMAT_H265_MAIN10:
         if (LiGetCurrentHostDisplayHdrMode()) {
-            codecString = "HEVC Main 10 HDR";
+            codecString = "HEVC 10-bit HDR";
         }
         else {
-            codecString = "HEVC Main 10 SDR";
+            codecString = "HEVC 10-bit SDR";
+        }
+        break;
+
+    case VIDEO_FORMAT_H265_REXT10_444:
+        if (LiGetCurrentHostDisplayHdrMode()) {
+            codecString = "HEVC 10-bit HDR 4:4:4";
+        }
+        else {
+            codecString = "HEVC 10-bit SDR 4:4:4";
         }
         break;
 
@@ -694,6 +731,10 @@ void FFmpegVideoDecoder::stringifyVideoStats(VIDEO_STATS& stats, char* output, i
         codecString = "AV1";
         break;
 
+    case VIDEO_FORMAT_AV1_HIGH8_444:
+        codecString = "AV1 4:4:4";
+        break;
+
     case VIDEO_FORMAT_AV1_MAIN10:
         if (LiGetCurrentHostDisplayHdrMode()) {
             codecString = "AV1 10-bit HDR";
@@ -703,6 +744,15 @@ void FFmpegVideoDecoder::stringifyVideoStats(VIDEO_STATS& stats, char* output, i
         }
         break;
 
+    case VIDEO_FORMAT_AV1_HIGH10_444:
+        if (LiGetCurrentHostDisplayHdrMode()) {
+            codecString = "AV1 10-bit HDR 4:4:4";
+        }
+        else {
+            codecString = "AV1 10-bit SDR 4:4:4";
+        }
+        break;
+
     default:
         SDL_assert(false);
         codecString = "UNKNOWN";
@@ -1238,6 +1288,12 @@ bool FFmpegVideoDecoder::initialize(PDECODER_PARAMETERS params)
                     break;
                 }
 
+                // TODO: reexamine this
+                if ((params->videoFormat & VIDEO_FORMAT_MASK_YUV444) && config->device_type != AV_HWDEVICE_TYPE_VULKAN) {
+                    // We only support YUV 4:4:4 decoding on Vulkan through libplacebo
+                    continue;
+                }
+
                 // Initialize the hardware codec and submit a test frame if the renderer needs it
                 IFFmpegRenderer::InitFailureReason failureReason;
                 if (tryInitializeRenderer(decoder, AV_PIX_FMT_NONE, params, config, &failureReason,
@@ -1323,6 +1379,12 @@ bool FFmpegVideoDecoder::initialize(PDECODER_PARAMETERS params)
                     break;
                 }
 
+                // TODO: reexamine this
+                if ((params->videoFormat & VIDEO_FORMAT_MASK_YUV444) && config->device_type != AV_HWDEVICE_TYPE_VULKAN) {
+                    // We only support YUV 4:4:4 decoding on Vulkan through libplacebo
+                    continue;
+                }
+
                 // Initialize the hardware codec and submit a test frame if the renderer needs it
                 IFFmpegRenderer::InitFailureReason failureReason;
                 if (tryInitializeRenderer(decoder, AV_PIX_FMT_NONE, params, config, &failureReason,
diff --git a/app/streaming/video/ffmpeg.h b/app/streaming/video/ffmpeg.h
index 02a7b2522..5fc725783 100644
--- a/app/streaming/video/ffmpeg.h
+++ b/app/streaming/video/ffmpeg.h
@@ -104,4 +104,10 @@ class FFmpegVideoDecoder : public IVideoDecoder {
     static const uint8_t k_HEVCMain10TestFrame[];
     static const uint8_t k_AV1Main8TestFrame[];
     static const uint8_t k_AV1Main10TestFrame[];
+    static const uint8_t k_h264High_444TestFrame[];
+    static const uint8_t k_HEVCRExt8_444TestFrame[];
+    static const uint8_t k_HEVCRExt10_444TestFrame[];
+    static const uint8_t k_AV1High8_444TestFrame[];
+    static const uint8_t k_AV1High10_444TestFrame[];
+
 };
diff --git a/app/streaming/video/ffmpeg_videosamples.cpp b/app/streaming/video/ffmpeg_videosamples.cpp
index 66f0f8c1e..d25523969 100644
--- a/app/streaming/video/ffmpeg_videosamples.cpp
+++ b/app/streaming/video/ffmpeg_videosamples.cpp
@@ -41,3 +41,130 @@ const uint8_t FFmpegVideoDecoder::k_AV1Main8TestFrame[] = {
 const uint8_t FFmpegVideoDecoder::k_AV1Main10TestFrame[] = {
     0x12, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x43, 0xFC, 0x13, 0xFC, 0x0B, 0x3C, 0x02, 0x4E, 0xA8, 0x30, 0x30, 0x30, 0xA0, 0x32, 0x8B, 0x81, 0x80, 0x00, 0x10, 0x00, 0x4B, 0x00, 0x10, 0xC2, 0xFB, 0xE1, 0x52, 0x49, 0xFF, 0xE0, 0x00, 0x28, 0xB8, 0xB4, 0x5D, 0x8F, 0xF0, 0x01, 0x33, 0xAC, 0x5D, 0xD3, 0xCB, 0xF0, 0xFB, 0x2F, 0x59, 0xE9, 0xBF, 0x5B, 0x6E, 0x2C, 0x7A, 0x2B, 0xD1, 0xC5, 0x45, 0x24, 0x93, 0xC7, 0x92, 0x89, 0x89, 0x4E, 0x6F, 0x04, 0x58, 0x09, 0xD1, 0x70, 0x67, 0xE9, 0xB6, 0x09, 0x1A, 0x35, 0xB6, 0x37, 0x4E, 0x7D, 0x61, 0xC3, 0xF5, 0xBD, 0x48, 0xA4, 0x23, 0x60, 0x59, 0xA2, 0xA0, 0x21, 0xDA, 0x20, 0x92, 0xDB, 0xB9, 0x31, 0x43, 0xFB, 0x85, 0xD9, 0x3B, 0x4F, 0xF3, 0x96, 0x05, 0x0A, 0x98, 0x6E, 0xCE, 0xC5, 0x3F, 0xCD, 0x18, 0x6D, 0x2C, 0x17, 0x49, 0x68, 0xC3, 0x4A, 0xC0, 0xF5, 0x58, 0x0C, 0xA4, 0xDE, 0xF6, 0x4A, 0x11, 0x24, 0xC2, 0xE0, 0x24, 0xB7, 0x00, 0xCB, 0x71, 0x96, 0xDA, 0x35, 0xFD, 0xBA, 0x3F, 0xD9, 0xB7, 0x58, 0xF2, 0x28, 0x14, 0x2D, 0xB0, 0xE9, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
+
+// 720p H.264 High 4:4:4
+// ffmpeg -i green128.png -pix_fmt yuv444p -colorspace smpte170m -color_trc smpte170m -color_primaries smpte170m -c:v libx264 -bsf:v filter_units=remove_types=6 test8_444.h264
+// xxd -i test8_444.h264
+const uint8_t FFmpegVideoDecoder::k_h264High_444TestFrame[] = {
+  0x00, 0x00, 0x00, 0x01, 0x67, 0xf4, 0x00, 0x1f, 0x91, 0x9b, 0x28, 0x0a,
+  0x00, 0xb7, 0x60, 0x2d, 0x41, 0x81, 0x81, 0x90, 0x00, 0x00, 0x03, 0x00,
+  0x10, 0x00, 0x00, 0x03, 0x03, 0x20, 0xf1, 0x83, 0x19, 0x60, 0x00, 0x00,
+  0x00, 0x01, 0x68, 0xeb, 0xe3, 0xc4, 0x48, 0x44, 0x00, 0x00, 0x01, 0x65,
+  0x88, 0x84, 0x00, 0x2b, 0xff, 0xfe, 0xf5, 0xdb, 0xf3, 0x2c, 0x93, 0x97,
+  0x37, 0xc0, 0xa5, 0x7d, 0x51, 0xf0, 0x29, 0x74, 0xec, 0x3f, 0xff, 0x07,
+  0xb6, 0x53, 0xd1, 0x9d, 0x16, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x59, 0x20, 0x00, 0x00, 0x03, 0x00, 0x69, 0xa0, 0x00,
+  0x09, 0x84, 0x00, 0x01, 0x59, 0x80, 0x00, 0x44, 0xe0, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x29,
+};
+
+// 720p HEVC RExt8 4:4:4
+// ffmpeg -i green128.png -pix_fmt yuv444p -colorspace smpte170m -color_trc smpte170m -color_primaries smpte170m -c:v libx265 -x265-params info=0 test8_444.hevc
+// xxd -i test8_444.hevc
+const uint8_t FFmpegVideoDecoder::k_HEVCRExt8_444TestFrame[] = {
+  0x00, 0x00, 0x00, 0x01, 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x04, 0x08,
+  0x00, 0x00, 0x03, 0x00, 0x9e, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x5d,
+  0x95, 0x98, 0x09, 0x00, 0x00, 0x00, 0x01, 0x42, 0x01, 0x01, 0x04, 0x08,
+  0x00, 0x00, 0x03, 0x00, 0x9e, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x5d,
+  0x90, 0x00, 0x50, 0x10, 0x05, 0xa2, 0xcb, 0x2b, 0x34, 0x92, 0x65, 0x78,
+  0x0b, 0x50, 0x60, 0x60, 0x60, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00,
+  0x00, 0x06, 0x42, 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0xc1, 0x72, 0x86,
+  0x0c, 0x46, 0x24, 0x00, 0x00, 0x01, 0x28, 0x01, 0xaf, 0x1d, 0x18, 0x69,
+  0x57, 0x59, 0x55, 0x54, 0x51, 0x34, 0xd2, 0x4a, 0xf7, 0xcf, 0x80, 0xff,
+  0xf1, 0xcc, 0x1f, 0xc9, 0x84, 0x7d, 0xf8, 0xb6, 0xba, 0xfa, 0xcd, 0x61,
+  0xb5, 0xe3, 0xc1, 0x02, 0x19, 0x26, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x04, 0xf4, 0xa8, 0x17,
+  0x96, 0x03, 0x4c, 0x4e, 0x1a, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x09, 0xf8, 0x93, 0x0b,
+  0x93, 0x40, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x48, 0xc0, 0x87, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x01, 0xa3, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x0b, 0xd8, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x51, 0xc0, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x39, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x02, 0xca, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x74, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x07, 0x6c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x27, 0xa0,
+};
+
+// 720p HEVC RExt10 4:4:4
+// ffmpeg -i green128.png -pix_fmt yuv444p10 -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020 -c:v libx265 -x265-params info=0 test10_444.hevc
+// xxd -i test10_444.hevc
+const uint8_t FFmpegVideoDecoder::k_HEVCRExt10_444TestFrame[] = {
+  0x00, 0x00, 0x00, 0x01, 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x04, 0x08,
+  0x00, 0x00, 0x03, 0x00, 0x9c, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x5d,
+  0x95, 0x98, 0x09, 0x00, 0x00, 0x00, 0x01, 0x42, 0x01, 0x01, 0x04, 0x08,
+  0x00, 0x00, 0x03, 0x00, 0x9c, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x5d,
+  0x90, 0x00, 0x50, 0x10, 0x05, 0xa2, 0x6c, 0xb2, 0xb3, 0x49, 0x26, 0x57,
+  0x80, 0xb5, 0x09, 0x10, 0x09, 0x04, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,
+  0x00, 0x03, 0x00, 0x64, 0x20, 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0xc1,
+  0x72, 0x86, 0x0c, 0x46, 0x24, 0x00, 0x00, 0x01, 0x28, 0x01, 0xaf, 0x1d,
+  0x18, 0x69, 0x57, 0x59, 0x55, 0x54, 0x51, 0x34, 0xd2, 0x4a, 0xf7, 0xcf,
+  0x80, 0xff, 0xf1, 0xef, 0x9f, 0xc9, 0x84, 0x7d, 0xf8, 0xb6, 0xba, 0xfa,
+  0xcd, 0x61, 0xb5, 0xe3, 0xc1, 0x02, 0x19, 0x26, 0x30, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x04, 0xf4,
+  0xa8, 0x17, 0x96, 0x03, 0x4c, 0x4e, 0x1a, 0x80, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x09, 0xf8,
+  0x93, 0x0b, 0x93, 0x40, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x48, 0xc0, 0x87,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x01, 0xa3, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x0b, 0xd8, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x51,
+  0xc0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x39, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x02, 0xca, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00,
+  0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x74,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+  0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x6c, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
+  0x27, 0xa0,
+};
+
+// 720p AV1 High8 4:4:4
+// ffmpeg -i green128.png -pix_fmt yuv444p -colorspace smpte170m -color_trc smpte170m -color_primaries smpte170m -c:v libaom-av1 test8_444.obu
+// xxd -i test8_444.obu
+const uint8_t FFmpegVideoDecoder::k_AV1High8_444TestFrame[] = {
+  0x12, 0x00, 0x0a, 0x0e, 0x20, 0x00, 0x00, 0x2d, 0x4c, 0xff, 0xb3, 0xdf,
+  0xff, 0x9a, 0x0c, 0x0c, 0x0c, 0x20, 0x32, 0x25, 0x10, 0x00, 0x90, 0x00,
+  0x00, 0x00, 0xa0, 0x00, 0x00, 0x80, 0x0c, 0x80, 0xad, 0xfd, 0xdb, 0x2e,
+  0x81, 0x37, 0x40, 0xfd, 0x19, 0x97, 0xdc, 0x15, 0x72, 0x1d, 0xe0, 0xff,
+  0x00, 0x35, 0x9d, 0x2c, 0x10, 0x7d, 0x17, 0x58, 0x60,
+};
+
+// 720p AV1 High10 4:4:4
+// ffmpeg -i green128.png -pix_fmt yuv444p10 -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020 -c:v libaom-av1 test10_444.obu
+// xxd -i test10_444.obu
+const uint8_t FFmpegVideoDecoder::k_AV1High10_444TestFrame[] = {
+  0x12, 0x00, 0x0a, 0x0e, 0x20, 0x00, 0x00, 0x2d, 0x4c, 0xff, 0xb3, 0xdf,
+  0xff, 0x9e, 0x12, 0x20, 0x12, 0x20, 0x32, 0x25, 0x10, 0x00, 0x90, 0x00,
+  0x00, 0x00, 0xa0, 0x00, 0x00, 0x80, 0x0c, 0x80, 0xad, 0xfe, 0x04, 0x70,
+  0x81, 0x37, 0x40, 0xfd, 0x19, 0x97, 0xdc, 0x15, 0x72, 0x1d, 0xe0, 0xff,
+  0x00, 0x35, 0x9d, 0x2c, 0x10, 0x7d, 0x17, 0x58, 0x60,
+};
diff --git a/moonlight-common-c/moonlight-common-c b/moonlight-common-c/moonlight-common-c
index c245fe599..907110c4e 160000
--- a/moonlight-common-c/moonlight-common-c
+++ b/moonlight-common-c/moonlight-common-c
@@ -1 +1 @@
-Subproject commit c245fe599d932943a50125b903ee325aac2d0d8a
+Subproject commit 907110c4ec9bac4bd501d46b7671206f1f99adf9