Chromium Code Reviews| Index: content/renderer/media/video_track_recorder.cc |
| diff --git a/content/renderer/media/video_track_recorder.cc b/content/renderer/media/video_track_recorder.cc |
| index d65e238e8795e5d07b6ffcba163d6c135fb684c0..9fc9096d6579c6bfc8bd2e1a9098c545cd7761ac 100644 |
| --- a/content/renderer/media/video_track_recorder.cc |
| +++ b/content/renderer/media/video_track_recorder.cc |
| @@ -185,14 +185,43 @@ void VideoTrackRecorder::Encoder::StartFrameEncode( |
| if (!(video_frame->format() == media::PIXEL_FORMAT_I420 || |
| video_frame->format() == media::PIXEL_FORMAT_YV12 || |
| + video_frame->format() == media::PIXEL_FORMAT_ARGB || |
| video_frame->format() == media::PIXEL_FORMAT_YV12A)) { |
| - NOTREACHED(); |
| + NOTREACHED() << media::VideoPixelFormatToString(video_frame->format()); |
| return; |
| } |
|
emircan
2016/07/12 22:57:00
This code looks very similar to CopyFrame() below,
mcasas
2016/07/13 00:45:30
Happy to do that, but I see that CopyFrame() has a
|
| - scoped_refptr<media::VideoFrame> frame = video_frame; |
| - // Drop alpha channel since we do not support it yet. |
| - if (frame->format() == media::PIXEL_FORMAT_YV12A) |
| + scoped_refptr<media::VideoFrame> frame; |
| + if (video_frame->format() == media::PIXEL_FORMAT_ARGB) { |
| + // Certain Android (hardware) decoders produce media::PIXEL_FORMAT_ARGB, |
| + // (see https://crbug.com/585242) that may or may not be opaque. In the |
| + // former case, record black frames (yuv = {0, 0x80, 0x80}) instead. |
| + if (!video_frame->IsMappable()) { |
| + frame = media::VideoFrame::CreateColorFrame( |
| + video_frame->coded_size(), 0u, 0x80, 0x80, video_frame->timestamp()); |
|
emircan
2016/07/12 22:57:00
What if the coded_size() is not equal to visible_s
mcasas
2016/07/13 00:45:30
Well, I guess at this point the user is not going
|
| + } else { |
| + frame = media::VideoFrame::CreateFrame( |
| + media::PIXEL_FORMAT_I420, video_frame->coded_size(), |
| + video_frame->visible_rect(), video_frame->natural_size(), |
| + video_frame->timestamp()); |
| + const int result = |
| + libyuv::ARGBToI420(video_frame->data(media::VideoFrame::kARGBPlane), |
| + video_frame->stride(media::VideoFrame::kARGBPlane), |
| + frame->data(media::VideoFrame::kYPlane), |
| + frame->stride(media::VideoFrame::kYPlane), |
| + frame->data(media::VideoFrame::kUPlane), |
| + frame->stride(media::VideoFrame::kUPlane), |
| + frame->data(media::VideoFrame::kVPlane), |
| + frame->stride(media::VideoFrame::kVPlane), |
| + video_frame->coded_size().width(), |
| + video_frame->coded_size().height()); |
| + DCHECK_EQ(0, result) << "Error converting ARGB input frame to I420"; |
| + } |
| + } else if (video_frame->format() == media::PIXEL_FORMAT_YV12A) { |
| + // Drop alpha channel since we do not support it yet. |
| frame = media::WrapAsI420VideoFrame(video_frame); |
| + } else { |
| + frame = video_frame; |
| + } |
| encoding_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&Encoder::EncodeOnEncodingTaskRunner, this, frame, |