Browse Source

libobs: Fix async plane offset calculation

Frames allocated via video_frame_init from media-io/video-frame.c have
their planes aligned which the original offset calculation didn't take
into account, resulting in some planes being drawn incorrectly.

Example media file to reproduce via the ffmpeg (media) source:
http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi
Palana 10 years ago
parent
commit
89b7230652
1 changed files with 3 additions and 4 deletions
  1. 3 4
      libobs/obs-source.c

+ 3 - 4
libobs/obs-source.c

@@ -765,9 +765,8 @@ static inline bool set_planar420_sizes(struct obs_source *source,
 	source->async_convert_width   = frame->width;
 	source->async_convert_height  = (size / frame->width + 1) & 0xFFFFFFFE;
 	source->async_texture_format  = GS_R8;
-	source->async_plane_offset[0] = frame->width * frame->height;
-	source->async_plane_offset[1] = source->async_plane_offset[0] +
-		frame->width * frame->height / 4;
+	source->async_plane_offset[0] = (int)(frame->data[1] - frame->data[0]);
+	source->async_plane_offset[1] = (int)(frame->data[2] - frame->data[0]);
 	return true;
 }
 
@@ -780,7 +779,7 @@ static inline bool set_nv12_sizes(struct obs_source *source,
 	source->async_convert_width   = frame->width;
 	source->async_convert_height  = (size / frame->width + 1) & 0xFFFFFFFE;
 	source->async_texture_format  = GS_R8;
-	source->async_plane_offset[0] = frame->width * frame->height;
+	source->async_plane_offset[0] = (int)(frame->data[1] - frame->data[0]);
 	return true;
 }