diff --git a/media/base/video_frame_converter_internals.cc b/media/base/video_frame_converter_internals.cc --- a/media/base/video_frame_converter_internals.cc +++ b/media/base/video_frame_converter_internals.cc @@ -254,15 +254,17 @@ void MergeUV(const VideoFrame& src_frame, VideoFrame& dest_frame) { DCHECK(dest_frame.format() == PIXEL_FORMAT_NV12 || dest_frame.format() == PIXEL_FORMAT_NV12A); DCHECK_EQ(src_frame.visible_rect().size(), dest_frame.visible_rect().size()); + // Use ceil semantics to match VideoFrame::Rows/Columns and PlaneSizeInSamples + // so the entire allocated UV plane is written for odd visible dimensions. libyuv::MergeUVPlane( src_frame.visible_data(VideoFrame::Plane::kU), src_frame.stride(VideoFrame::Plane::kU), src_frame.visible_data(VideoFrame::Plane::kV), src_frame.stride(VideoFrame::Plane::kV), dest_frame.GetWritableVisibleData(VideoFrame::Plane::kUV), dest_frame.stride(VideoFrame::Plane::kUV), - dest_frame.visible_rect().width() / 2, - dest_frame.visible_rect().height() / 2); + (dest_frame.visible_rect().width() + 1) / 2, + (dest_frame.visible_rect().height() + 1) / 2); } void SplitUV(const VideoFrame& src_frame, VideoFrame& dest_frame) {