Index: webrtc/common_video/libyuv/webrtc_libyuv.cc |
diff --git a/webrtc/common_video/libyuv/webrtc_libyuv.cc b/webrtc/common_video/libyuv/webrtc_libyuv.cc |
index 44577e9ac8e6beac40001a87af737422d92da624..0e8fb54288c67ec4c6d7c6cd58b5237432d240b2 100644 |
--- a/webrtc/common_video/libyuv/webrtc_libyuv.cc |
+++ b/webrtc/common_video/libyuv/webrtc_libyuv.cc |
@@ -249,23 +249,20 @@ int ConvertToI420(VideoType src_video_type, |
int src_height, |
size_t sample_size, |
VideoRotation rotation, |
- VideoFrame* dst_frame) { |
- int dst_width = dst_frame->width(); |
- int dst_height = dst_frame->height(); |
+ const rtc::scoped_refptr<I420Buffer>& dst_buffer) { |
+ int dst_width = dst_buffer->width(); |
+ int dst_height = dst_buffer->height(); |
// LibYuv expects pre-rotation values for dst. |
// Stride values should correspond to the destination values. |
if (rotation == kVideoRotation_90 || rotation == kVideoRotation_270) { |
- dst_width = dst_frame->height(); |
- dst_height = dst_frame->width(); |
+ dst_width = dst_buffer->height(); |
+ dst_height = dst_buffer->width(); |
} |
return libyuv::ConvertToI420( |
src_frame, sample_size, |
- dst_frame->video_frame_buffer()->MutableDataY(), |
- dst_frame->video_frame_buffer()->StrideY(), |
- dst_frame->video_frame_buffer()->MutableDataU(), |
- dst_frame->video_frame_buffer()->StrideU(), |
- dst_frame->video_frame_buffer()->MutableDataV(), |
- dst_frame->video_frame_buffer()->StrideV(), |
+ dst_buffer->MutableDataY(), dst_buffer->StrideY(), |
+ dst_buffer->MutableDataU(), dst_buffer->StrideU(), |
+ dst_buffer->MutableDataV(), dst_buffer->StrideV(), |
crop_x, crop_y, |
src_width, src_height, |
dst_width, dst_height, |
@@ -290,55 +287,59 @@ int ConvertFromI420(const VideoFrame& src_frame, |
} |
// Compute PSNR for an I420 frame (all planes) |
-double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) { |
- if (!ref_frame || !test_frame) |
+double I420PSNR(const rtc::scoped_refptr<VideoFrameBuffer>& ref_buffer, |
+ const rtc::scoped_refptr<VideoFrameBuffer>& test_buffer) { |
+ if (!ref_buffer || !test_buffer) |
return -1; |
- else if ((ref_frame->width() != test_frame->width()) || |
- (ref_frame->height() != test_frame->height())) |
+ else if ((ref_buffer->width() != test_buffer->width()) || |
+ (ref_buffer->height() != test_buffer->height())) |
return -1; |
- else if (ref_frame->width() < 0 || ref_frame->height() < 0) |
+ else if (ref_buffer->width() < 0 || ref_buffer->height() < 0) |
return -1; |
- double psnr = libyuv::I420Psnr(ref_frame->video_frame_buffer()->DataY(), |
- ref_frame->video_frame_buffer()->StrideY(), |
- ref_frame->video_frame_buffer()->DataU(), |
- ref_frame->video_frame_buffer()->StrideU(), |
- ref_frame->video_frame_buffer()->DataV(), |
- ref_frame->video_frame_buffer()->StrideV(), |
- test_frame->video_frame_buffer()->DataY(), |
- test_frame->video_frame_buffer()->StrideY(), |
- test_frame->video_frame_buffer()->DataU(), |
- test_frame->video_frame_buffer()->StrideU(), |
- test_frame->video_frame_buffer()->DataV(), |
- test_frame->video_frame_buffer()->StrideV(), |
- test_frame->width(), test_frame->height()); |
+ double psnr = libyuv::I420Psnr(ref_buffer->DataY(), ref_buffer->StrideY(), |
+ ref_buffer->DataU(), ref_buffer->StrideU(), |
+ ref_buffer->DataV(), ref_buffer->StrideV(), |
+ test_buffer->DataY(), test_buffer->StrideY(), |
+ test_buffer->DataU(), test_buffer->StrideU(), |
+ test_buffer->DataV(), test_buffer->StrideV(), |
+ test_buffer->width(), test_buffer->height()); |
// LibYuv sets the max psnr value to 128, we restrict it here. |
// In case of 0 mse in one frame, 128 can skew the results significantly. |
return (psnr > kPerfectPSNR) ? kPerfectPSNR : psnr; |
} |
-// Compute SSIM for an I420 frame (all planes) |
-double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) { |
+// Compute PSNR for an I420 frame (all planes) |
+double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) { |
if (!ref_frame || !test_frame) |
return -1; |
- else if ((ref_frame->width() != test_frame->width()) || |
- (ref_frame->height() != test_frame->height())) |
+ return I420PSNR(ref_frame->video_frame_buffer(), |
+ test_frame->video_frame_buffer()); |
+} |
+ |
+// Compute SSIM for an I420 frame (all planes) |
+double I420SSIM(const rtc::scoped_refptr<VideoFrameBuffer>& ref_buffer, |
+ const rtc::scoped_refptr<VideoFrameBuffer>& test_buffer) { |
+ if (!ref_buffer || !test_buffer) |
+ return -1; |
+ else if ((ref_buffer->width() != test_buffer->width()) || |
+ (ref_buffer->height() != test_buffer->height())) |
return -1; |
- else if (ref_frame->width() < 0 || ref_frame->height() < 0) |
+ else if (ref_buffer->width() < 0 || ref_buffer->height() < 0) |
return -1; |
- return libyuv::I420Ssim(ref_frame->video_frame_buffer()->DataY(), |
- ref_frame->video_frame_buffer()->StrideY(), |
- ref_frame->video_frame_buffer()->DataU(), |
- ref_frame->video_frame_buffer()->StrideU(), |
- ref_frame->video_frame_buffer()->DataV(), |
- ref_frame->video_frame_buffer()->StrideV(), |
- test_frame->video_frame_buffer()->DataY(), |
- test_frame->video_frame_buffer()->StrideY(), |
- test_frame->video_frame_buffer()->DataU(), |
- test_frame->video_frame_buffer()->StrideU(), |
- test_frame->video_frame_buffer()->DataV(), |
- test_frame->video_frame_buffer()->StrideV(), |
- test_frame->width(), test_frame->height()); |
+ return libyuv::I420Ssim(ref_buffer->DataY(), ref_buffer->StrideY(), |
+ ref_buffer->DataU(), ref_buffer->StrideU(), |
+ ref_buffer->DataV(), ref_buffer->StrideV(), |
+ test_buffer->DataY(), test_buffer->StrideY(), |
+ test_buffer->DataU(), test_buffer->StrideU(), |
+ test_buffer->DataV(), test_buffer->StrideV(), |
+ test_buffer->width(), test_buffer->height()); |
+} |
+double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) { |
+ if (!ref_frame || !test_frame) |
+ return -1; |
+ return I420SSIM(ref_frame->video_frame_buffer(), |
+ test_frame->video_frame_buffer()); |
} |
} // namespace webrtc |