Browse Source

Added support for P010 pixel format in SDL_UpdateNVTexture()

Sam Lantinga 1 week ago
parent
commit
fe3b399b7e
2 changed files with 6 additions and 5 deletions
  1. 4 3
      src/render/SDL_render.c
  2. 2 2
      test/testyuv.c

+ 4 - 3
src/render/SDL_render.c

@@ -2475,7 +2475,7 @@ bool SDL_UpdateYUVTexture(SDL_Texture *texture, const SDL_Rect *rect,
 
 
     CHECK_PARAM(texture->format != SDL_PIXELFORMAT_YV12 &&
     CHECK_PARAM(texture->format != SDL_PIXELFORMAT_YV12 &&
                 texture->format != SDL_PIXELFORMAT_IYUV) {
                 texture->format != SDL_PIXELFORMAT_IYUV) {
-        return SDL_SetError("Texture format must by YV12 or IYUV");
+        return SDL_SetError("Texture format must be YV12 or IYUV");
     }
     }
 
 
     real_rect.x = 0;
     real_rect.x = 0;
@@ -2534,8 +2534,9 @@ bool SDL_UpdateNVTexture(SDL_Texture *texture, const SDL_Rect *rect,
     }
     }
 
 
     CHECK_PARAM(texture->format != SDL_PIXELFORMAT_NV12 &&
     CHECK_PARAM(texture->format != SDL_PIXELFORMAT_NV12 &&
-                texture->format != SDL_PIXELFORMAT_NV21) {
-        return SDL_SetError("Texture format must by NV12 or NV21");
+                texture->format != SDL_PIXELFORMAT_NV21 &&
+                texture->format != SDL_PIXELFORMAT_P010) {
+        return SDL_SetError("Texture format must be NV12, NV21, or P010");
     }
     }
 
 
     real_rect.x = 0;
     real_rect.x = 0;

+ 2 - 2
test/testyuv.c

@@ -685,11 +685,11 @@ int main(int argc, char **argv)
         SDL_free(plane0);
         SDL_free(plane0);
         SDL_free(plane1);
         SDL_free(plane1);
         SDL_free(plane2);
         SDL_free(plane2);
-    } else if (planar && (yuv_format == SDL_PIXELFORMAT_NV12 || yuv_format == SDL_PIXELFORMAT_NV21)) {
+    } else if (planar && (yuv_format == SDL_PIXELFORMAT_NV12 || yuv_format == SDL_PIXELFORMAT_NV21 || yuv_format == SDL_PIXELFORMAT_P010)) {
         const int Yrows = original->h;
         const int Yrows = original->h;
         const int UVrows = ((original->h + 1) / 2);
         const int UVrows = ((original->h + 1) / 2);
         const int src_Ypitch = pitch;
         const int src_Ypitch = pitch;
-        const int src_UVpitch = ((pitch + 1) / 2) * 2;
+        const int src_UVpitch = (yuv_format == SDL_PIXELFORMAT_P010) ? ((pitch + 3) & ~3) : ((pitch + 1) & ~1);
         const Uint8 *src_plane0 = (const Uint8 *)raw_yuv;
         const Uint8 *src_plane0 = (const Uint8 *)raw_yuv;
         const Uint8 *src_plane1 = src_plane0 + Yrows * src_Ypitch;
         const Uint8 *src_plane1 = src_plane0 + Yrows * src_Ypitch;
         const int Ypitch = pitch + 37;
         const int Ypitch = pitch + 37;