| Index: content/renderer/media_recorder/video_track_recorder.cc
|
| diff --git a/content/renderer/media_recorder/video_track_recorder.cc b/content/renderer/media_recorder/video_track_recorder.cc
|
| index de9ad3229910a8fecd76b9b7b96cd2da098fc18f..49def8d16071b449fbe87e534409b1c15cf78fee 100644
|
| --- a/content/renderer/media_recorder/video_track_recorder.cc
|
| +++ b/content/renderer/media_recorder/video_track_recorder.cc
|
| @@ -39,6 +39,22 @@ using video_track_recorder::kVEAEncoderMinResolutionHeight;
|
|
|
| namespace content {
|
|
|
| +libyuv::RotationMode MediaVideoRotationToRotationMode(
|
| + media::VideoRotation rotation) {
|
| + switch (rotation) {
|
| + case media::VIDEO_ROTATION_0:
|
| + return libyuv::kRotate0;
|
| + case media::VIDEO_ROTATION_90:
|
| + return libyuv::kRotate90;
|
| + case media::VIDEO_ROTATION_180:
|
| + return libyuv::kRotate180;
|
| + case media::VIDEO_ROTATION_270:
|
| + return libyuv::kRotate270;
|
| + }
|
| + NOTREACHED() << rotation;
|
| + return libyuv::kRotate0;
|
| +}
|
| +
|
| namespace {
|
|
|
| using CodecId = VideoTrackRecorder::CodecId;
|
| @@ -219,10 +235,21 @@ void VideoTrackRecorder::Encoder::RetrieveFrameOnMainThread(
|
| DCHECK(video_frame->HasTextures());
|
| DCHECK_EQ(media::PIXEL_FORMAT_ARGB, video_frame->format());
|
|
|
| + const gfx::Size& old_visible_size = video_frame->visible_rect().size();
|
| + gfx::Size new_visible_size = old_visible_size;
|
| +
|
| + media::VideoRotation video_rotation = media::VIDEO_ROTATION_0;
|
| + if (video_frame->metadata()->GetRotation(
|
| + media::VideoFrameMetadata::ROTATION, &video_rotation) &&
|
| + (video_rotation == media::VIDEO_ROTATION_90 ||
|
| + video_rotation == media::VIDEO_ROTATION_270)) {
|
| + new_visible_size.SetSize(old_visible_size.height(),
|
| + old_visible_size.width());
|
| + }
|
| +
|
| frame = media::VideoFrame::CreateFrame(
|
| - media::PIXEL_FORMAT_I420, video_frame->coded_size(),
|
| - video_frame->visible_rect(), video_frame->natural_size(),
|
| - video_frame->timestamp());
|
| + media::PIXEL_FORMAT_I420, new_visible_size, gfx::Rect(new_visible_size),
|
| + new_visible_size, video_frame->timestamp());
|
|
|
| const SkImageInfo info = SkImageInfo::MakeN32(
|
| frame->visible_rect().width(), frame->visible_rect().height(),
|
| @@ -247,26 +274,22 @@ void VideoTrackRecorder::Encoder::RetrieveFrameOnMainThread(
|
| DLOG(ERROR) << "Error trying to map PaintSurface's pixels";
|
| return;
|
| }
|
| - // TODO(mcasas): Use the incoming frame's rotation when
|
| - // https://bugs.chromium.org/p/webrtc/issues/detail?id=6069 is closed.
|
| - const libyuv::RotationMode source_rotation = libyuv::kRotate0;
|
| +
|
| const uint32 source_pixel_format =
|
| (kN32_SkColorType == kRGBA_8888_SkColorType) ? libyuv::FOURCC_ABGR
|
| : libyuv::FOURCC_ARGB;
|
| - if (libyuv::ConvertToI420(static_cast<uint8*>(pixmap.writable_addr()),
|
| - pixmap.getSafeSize(),
|
| - frame->visible_data(media::VideoFrame::kYPlane),
|
| - frame->stride(media::VideoFrame::kYPlane),
|
| - frame->visible_data(media::VideoFrame::kUPlane),
|
| - frame->stride(media::VideoFrame::kUPlane),
|
| - frame->visible_data(media::VideoFrame::kVPlane),
|
| - frame->stride(media::VideoFrame::kVPlane),
|
| - 0 /* crop_x */, 0 /* crop_y */,
|
| - pixmap.width(), pixmap.height(),
|
| - frame->visible_rect().width(),
|
| - frame->visible_rect().height(),
|
| - source_rotation,
|
| - source_pixel_format) != 0) {
|
| + if (libyuv::ConvertToI420(
|
| + static_cast<uint8*>(pixmap.writable_addr()), pixmap.getSafeSize(),
|
| + frame->visible_data(media::VideoFrame::kYPlane),
|
| + frame->stride(media::VideoFrame::kYPlane),
|
| + frame->visible_data(media::VideoFrame::kUPlane),
|
| + frame->stride(media::VideoFrame::kUPlane),
|
| + frame->visible_data(media::VideoFrame::kVPlane),
|
| + frame->stride(media::VideoFrame::kVPlane), 0 /* crop_x */,
|
| + 0 /* crop_y */, pixmap.width(), pixmap.height(),
|
| + old_visible_size.width(), old_visible_size.height(),
|
| + MediaVideoRotationToRotationMode(video_rotation),
|
| + source_pixel_format) != 0) {
|
| DLOG(ERROR) << "Error converting frame to I420";
|
| return;
|
| }
|
|
|