+ // Calculate that portion of the |frame| that should be copied into
+ // |bitmap|. If |frame| has been cropped,
+ // frame->coded_size() != frame->visible_rect().
+ const int src_width = frame->coded_size().width();
+ const int src_height = frame->coded_size().height();
+ DCHECK(src_width >= dst_width && src_height >= dst_height);
+
+ const int horiz_crop = frame->visible_rect().x();
+ const int vert_crop = frame->visible_rect().y();
+
+ const uint8* src_y = frame->data(media::VideoFrame::kYPlane) +
+ (src_width * vert_crop + horiz_crop);
+ const int center = (src_width + 1) / 2;
+ const uint8* src_u = frame->data(media::VideoFrame::kUPlane) +
+ (center * vert_crop + horiz_crop) / 2;
+ const uint8* src_v = frame->data(media::VideoFrame::kVPlane) +
+ (center * vert_crop + horiz_crop) / 2;
+
+ libyuv::I420ToBGRA(src_y,
+ frame->stride(media::VideoFrame::kYPlane),
+ src_u,
+ frame->stride(media::VideoFrame::kUPlane),
+ src_v,
+ frame->stride(media::VideoFrame::kVPlane),
+ bitmap_pixels,
+ bitmap->rowBytes(),
+ dst_width,
+ dst_height);