| 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
|
|
|