From 78a66b4c166da8a7c22c2e80e545b458debc1455 Mon Sep 17 00:00:00 2001 From: Bernat Arlandis Date: Sat, 24 May 2025 20:00:41 +0200 Subject: [PATCH] Theora: Fix UV channel offset when cropping region --- modules/theora/video_stream_theora.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index e8eefbacf2e..21a5f11815c 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -235,13 +235,16 @@ void VideoStreamPlaybackTheora::video_write(th_ycbcr_buffer yuv) { uint8_t *w = frame_data.ptrw(); char *dst = (char *)w; uint32_t y_offset = region.position.y * yuv[0].stride + region.position.x; - uint32_t uv_offset = region.position.y * yuv[1].stride + region.position.x; + uint32_t uv_offset = 0; if (px_fmt == TH_PF_444) { + uv_offset += region.position.y * yuv[1].stride + region.position.x; yuv444_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data + y_offset, (uint8_t *)yuv[1].data + uv_offset, (uint8_t *)yuv[2].data + uv_offset, region.size.x, region.size.y, yuv[0].stride, yuv[1].stride, region.size.x << 2); } else if (px_fmt == TH_PF_422) { + uv_offset += region.position.y * yuv[1].stride + region.position.x / 2; yuv422_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data + y_offset, (uint8_t *)yuv[1].data + uv_offset, (uint8_t *)yuv[2].data + uv_offset, region.size.x, region.size.y, yuv[0].stride, yuv[1].stride, region.size.x << 2); } else if (px_fmt == TH_PF_420) { + uv_offset += region.position.y * yuv[1].stride / 2 + region.position.x / 2; yuv420_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data + y_offset, (uint8_t *)yuv[1].data + uv_offset, (uint8_t *)yuv[2].data + uv_offset, region.size.x, region.size.y, yuv[0].stride, yuv[1].stride, region.size.x << 2); }