Index: media/filters/skcanvas_video_renderer.cc |
diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc |
index 743efc04f648c8fc4171fb50d2909bd4858fdf70..7a18eaacc4cfb642402e6feef576df1008d3e2a4 100644 |
--- a/media/filters/skcanvas_video_renderer.cc |
+++ b/media/filters/skcanvas_video_renderer.cc |
@@ -390,8 +390,27 @@ class VideoImageGenerator : public SkImageGenerator { |
(frame_->visible_rect().y() >> y_shift)) + |
(frame_->visible_rect().x() >> 1); |
} |
- row_bytes[plane] = static_cast<size_t>(frame_->stride(plane)); |
- planes[plane] = frame_->data(plane) + offset; |
+ |
+ // Copy the frame to the supplied memory. |
+ // TODO: Find a way (API change?) to avoid this copy. |
+ char* out_line = static_cast<char*>(planes[plane]); |
+ int out_line_stride = row_bytes[plane]; |
+ uint8* in_line = frame_->data(plane) + offset; |
+ int in_line_stride = frame_->stride(plane); |
+ int plane_height = sizes[plane].height(); |
+ if (in_line_stride == out_line_stride) { |
+ memcpy(out_line, in_line, plane_height * in_line_stride); |
+ } else { |
+ // Different line padding so need to copy one line at a time. |
+ int bytes_to_copy_per_line = out_line_stride < in_line_stride |
+ ? out_line_stride |
+ : in_line_stride; |
+ for (int line_no = 0; line_no < plane_height; line_no++) { |
+ memcpy(out_line, in_line, bytes_to_copy_per_line); |
+ in_line += in_line_stride; |
+ out_line += out_line_stride; |
+ } |
+ } |
} |
} |
return true; |