Skip to content

Commit 00fb5c4

Browse files
committed
Crop image when doing color space conversion
1 parent f247532 commit 00fb5c4

File tree

1 file changed

+13
-21
lines changed

1 file changed

+13
-21
lines changed

modules/theora/video_stream_theora.cpp

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,29 +61,20 @@ int VideoStreamPlaybackTheora::queue_page(ogg_page *page) {
6161
}
6262

6363
void VideoStreamPlaybackTheora::video_write(th_ycbcr_buffer yuv) {
64-
int pitch = 4;
65-
frame_data.resize(size.x * size.y * pitch);
66-
{
67-
uint8_t *w = frame_data.ptrw();
68-
char *dst = (char *)w;
69-
70-
if (px_fmt == TH_PF_444) {
71-
yuv444_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data, (uint8_t *)yuv[1].data, (uint8_t *)yuv[2].data, size.x, size.y, yuv[0].stride, yuv[1].stride, size.x << 2);
72-
73-
} else if (px_fmt == TH_PF_422) {
74-
yuv422_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data, (uint8_t *)yuv[1].data, (uint8_t *)yuv[2].data, size.x, size.y, yuv[0].stride, yuv[1].stride, size.x << 2);
75-
76-
} else if (px_fmt == TH_PF_420) {
77-
yuv420_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data, (uint8_t *)yuv[1].data, (uint8_t *)yuv[2].data, size.x, size.y, yuv[0].stride, yuv[1].stride, size.x << 2);
78-
}
79-
80-
format = Image::FORMAT_RGBA8;
64+
uint8_t *w = frame_data.ptrw();
65+
char *dst = (char *)w;
66+
uint32_t y_offset = region.position.y * yuv[0].stride + region.position.x;
67+
uint32_t uv_offset = region.position.y * yuv[1].stride + region.position.x;
68+
69+
if (px_fmt == TH_PF_444) {
70+
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);
71+
} else if (px_fmt == TH_PF_422) {
72+
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);
73+
} else if (px_fmt == TH_PF_420) {
74+
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);
8175
}
8276

83-
Ref<Image> img = memnew(Image(size.x, size.y, false, Image::FORMAT_RGBA8, frame_data)); //zero copy image creation
84-
if (region.size.x != size.x || region.size.y != size.y) {
85-
img = img->get_region(region);
86-
}
77+
Ref<Image> img = memnew(Image(region.size.x, region.size.y, false, Image::FORMAT_RGBA8, frame_data)); //zero copy image creation
8778

8879
texture->update(img); //zero copy send to rendering server
8980
}
@@ -296,6 +287,7 @@ void VideoStreamPlaybackTheora::set_file(const String &p_file) {
296287

297288
Ref<Image> img = Image::create_empty(region.size.x, region.size.y, false, Image::FORMAT_RGBA8);
298289
texture->set_image(img);
290+
frame_data.resize(region.size.x * region.size.y * 4);
299291

300292
frame_duration = (double)ti.fps_denominator / ti.fps_numerator;
301293
} else {

0 commit comments

Comments
 (0)