Chromium Code Reviews| Index: webrtc/common_video/video_frame_buffer.cc |
| diff --git a/webrtc/common_video/video_frame_buffer.cc b/webrtc/common_video/video_frame_buffer.cc |
| index 1ee97531b07aac91a9b169a08ddbba3c9b5e1477..d23b4c5d45417e2d738cf226235479ceae06a8aa 100644 |
| --- a/webrtc/common_video/video_frame_buffer.cc |
| +++ b/webrtc/common_video/video_frame_buffer.cc |
| @@ -61,10 +61,12 @@ I420Buffer::I420Buffer(int width, |
| I420Buffer::~I420Buffer() { |
| } |
| +// static |
| rtc::scoped_refptr<I420Buffer> I420Buffer::Create(int width, int height) { |
| return new rtc::RefCountedObject<I420Buffer>(width, height); |
| } |
| +// static |
| rtc::scoped_refptr<I420Buffer> I420Buffer::Create(int width, |
| int height, |
| int stride_y, |
| @@ -74,6 +76,67 @@ rtc::scoped_refptr<I420Buffer> I420Buffer::Create(int width, |
| width, height, stride_y, stride_u, stride_v); |
| } |
| +// static |
| +rtc::scoped_refptr<I420Buffer> I420Buffer::Copy( |
| + const VideoFrameBuffer& source) { |
| + return Copy(source.width(), source.height(), |
| + source.DataY(), source.StrideY(), |
| + source.DataU(), source.StrideU(), |
| + source.DataV(), source.StrideV()); |
| +} |
| + |
| +// static |
| +rtc::scoped_refptr<I420Buffer> I420Buffer::Copy( |
| + int width, int height, |
| + const uint8_t* data_y, int stride_y, |
| + const uint8_t* data_u, int stride_u, |
| + const uint8_t* data_v, int stride_v) { |
| + // Note: May use different strides than the input data. |
| + rtc::scoped_refptr<I420Buffer> buffer = Create(width, height); |
| + RTC_CHECK_EQ(0, libyuv::I420Copy(data_y, stride_y, |
| + data_u, stride_u, |
| + data_v, stride_v, |
| + buffer->MutableDataY(), buffer->StrideY(), |
| + buffer->MutableDataU(), buffer->StrideU(), |
| + buffer->MutableDataV(), buffer->StrideV(), |
| + width, height)); |
| + return buffer; |
| +} |
| + |
| +// static |
| +rtc::scoped_refptr<VideoFrameBuffer> I420Buffer::Rotate( |
| + rtc::scoped_refptr<VideoFrameBuffer> src, |
| + VideoRotation rotation) { |
| + RTC_CHECK(src->DataY()); |
|
nisse-webrtc
2016/11/28 09:44:54
I also changed these from DCHECK to CHECK. I think
|
| + RTC_CHECK(src->DataU()); |
| + RTC_CHECK(src->DataV()); |
| + |
| + if (rotation == webrtc::kVideoRotation_0) { |
| + return src; |
| + } |
| + |
| + int rotated_width = src->width(); |
| + int rotated_height = src->height(); |
| + if (rotation == webrtc::kVideoRotation_90 || |
| + rotation == webrtc::kVideoRotation_270) { |
| + std::swap(rotated_width, rotated_height); |
| + } |
| + |
| + rtc::scoped_refptr<webrtc::I420Buffer> buffer = |
| + I420Buffer::Create(rotated_width, rotated_height); |
| + |
| + RTC_CHECK_EQ(0, libyuv::I420Rotate( |
|
nisse-webrtc
2016/11/28 09:44:54
And this is changed from res = ...; RTC_DCHECK_EQ(
|
| + src->DataY(), src->StrideY(), |
| + src->DataU(), src->StrideU(), |
| + src->DataV(), src->StrideV(), |
| + buffer->MutableDataY(), buffer->StrideY(), buffer->MutableDataU(), |
| + buffer->StrideU(), buffer->MutableDataV(), buffer->StrideV(), |
| + src->width(), src->height(), |
| + static_cast<libyuv::RotationMode>(rotation))); |
| + |
| + return buffer; |
| +} |
| + |
| void I420Buffer::InitializeData() { |
| memset(data_.get(), 0, |
| I420DataSize(height_, stride_y_, stride_u_, stride_v_)); |
| @@ -126,23 +189,6 @@ rtc::scoped_refptr<VideoFrameBuffer> I420Buffer::NativeToI420Buffer() { |
| return nullptr; |
| } |
| -// static |
| -rtc::scoped_refptr<I420Buffer> I420Buffer::Copy( |
| - const VideoFrameBuffer& source) { |
| - int width = source.width(); |
| - int height = source.height(); |
| - rtc::scoped_refptr<I420Buffer> target = I420Buffer::Create(width, height); |
| - RTC_CHECK(libyuv::I420Copy(source.DataY(), source.StrideY(), |
| - source.DataU(), source.StrideU(), |
| - source.DataV(), source.StrideV(), |
| - target->MutableDataY(), target->StrideY(), |
| - target->MutableDataU(), target->StrideU(), |
| - target->MutableDataV(), target->StrideV(), |
| - width, height) == 0); |
| - |
| - return target; |
| -} |
| - |
| void I420Buffer::SetToBlack() { |
| RTC_CHECK(libyuv::I420Rect(MutableDataY(), StrideY(), |
| MutableDataU(), StrideU(), |
| @@ -205,41 +251,6 @@ void I420Buffer::ScaleFrom(const VideoFrameBuffer& src) { |
| CropAndScaleFrom(src, 0, 0, src.width(), src.height()); |
| } |
| -// static |
| -rtc::scoped_refptr<VideoFrameBuffer> I420Buffer::Rotate( |
| - rtc::scoped_refptr<VideoFrameBuffer> src, |
| - VideoRotation rotation) { |
| - RTC_DCHECK(src->DataY()); |
| - RTC_DCHECK(src->DataU()); |
| - RTC_DCHECK(src->DataV()); |
| - |
| - if (rotation == webrtc::kVideoRotation_0) { |
| - return src; |
| - } |
| - |
| - int rotated_width = src->width(); |
| - int rotated_height = src->height(); |
| - if (rotation == webrtc::kVideoRotation_90 || |
| - rotation == webrtc::kVideoRotation_270) { |
| - std::swap(rotated_width, rotated_height); |
| - } |
| - |
| - rtc::scoped_refptr<webrtc::I420Buffer> buffer = |
| - I420Buffer::Create(rotated_width, rotated_height); |
| - |
| - int res = libyuv::I420Rotate( |
| - src->DataY(), src->StrideY(), |
| - src->DataU(), src->StrideU(), |
| - src->DataV(), src->StrideV(), |
| - buffer->MutableDataY(), buffer->StrideY(), buffer->MutableDataU(), |
| - buffer->StrideU(), buffer->MutableDataV(), buffer->StrideV(), |
| - src->width(), src->height(), |
| - static_cast<libyuv::RotationMode>(rotation)); |
| - RTC_DCHECK_EQ(res, 0); |
| - |
| - return buffer; |
| -} |
| - |
| NativeHandleBuffer::NativeHandleBuffer(void* native_handle, |
| int width, |
| int height) |