@@ -61,29 +61,20 @@ int VideoStreamPlaybackTheora::queue_page(ogg_page *page) {
6161}
6262
6363void 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