|
@@ -52,6 +52,11 @@ static int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
|
|
static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
const SDL_Rect * rect, const void *pixels,
|
|
|
int pitch);
|
|
|
+static int GL_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
+ const SDL_Rect * rect,
|
|
|
+ const Uint8 *Yplane, int Ypitch,
|
|
|
+ const Uint8 *Uplane, int Upitch,
|
|
|
+ const Uint8 *Vplane, int Vpitch);
|
|
|
static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
const SDL_Rect * rect, void **pixels, int *pitch);
|
|
|
static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
|
@@ -403,6 +408,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
|
|
renderer->GetOutputSize = GL_GetOutputSize;
|
|
|
renderer->CreateTexture = GL_CreateTexture;
|
|
|
renderer->UpdateTexture = GL_UpdateTexture;
|
|
|
+ renderer->UpdateTextureYUV = GL_UpdateTextureYUV;
|
|
|
renderer->LockTexture = GL_LockTexture;
|
|
|
renderer->UnlockTexture = GL_UnlockTexture;
|
|
|
renderer->SetRenderTarget = GL_SetRenderTarget;
|
|
@@ -801,6 +807,41 @@ GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
return GL_CheckError("glTexSubImage2D()", renderer);
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+GL_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
+ const SDL_Rect * rect,
|
|
|
+ const Uint8 *Yplane, int Ypitch,
|
|
|
+ const Uint8 *Uplane, int Upitch,
|
|
|
+ const Uint8 *Vplane, int Vpitch)
|
|
|
+{
|
|
|
+ GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;
|
|
|
+ GL_TextureData *data = (GL_TextureData *) texture->driverdata;
|
|
|
+
|
|
|
+ GL_ActivateRenderer(renderer);
|
|
|
+
|
|
|
+ renderdata->glEnable(data->type);
|
|
|
+ renderdata->glBindTexture(data->type, data->texture);
|
|
|
+ renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
|
+ renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Ypitch);
|
|
|
+ renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w,
|
|
|
+ rect->h, data->format, data->formattype,
|
|
|
+ Yplane);
|
|
|
+
|
|
|
+ renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Upitch);
|
|
|
+ renderdata->glBindTexture(data->type, data->utexture);
|
|
|
+ renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
|
|
+ rect->w/2, rect->h/2,
|
|
|
+ data->format, data->formattype, Uplane);
|
|
|
+
|
|
|
+ renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Vpitch);
|
|
|
+ renderdata->glBindTexture(data->type, data->vtexture);
|
|
|
+ renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
|
|
|
+ rect->w/2, rect->h/2,
|
|
|
+ data->format, data->formattype, Vplane);
|
|
|
+ renderdata->glDisable(data->type);
|
|
|
+ return GL_CheckError("glTexSubImage2D()", renderer);
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
|
|
const SDL_Rect * rect, void **pixels, int *pitch)
|