Explorar o código

Theora: Fix UV channel offset when cropping region

Bernat Arlandis hai 2 meses
pai
achega
78a66b4c16
Modificáronse 1 ficheiros con 4 adicións e 1 borrados
  1. 4 1
      modules/theora/video_stream_theora.cpp

+ 4 - 1
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);
 	}