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..4ffdfdc6b910465cf179bb56171f41d72b4bb6b5 100644 |
--- a/webrtc/common_video/libyuv/webrtc_libyuv.cc |
+++ b/webrtc/common_video/libyuv/webrtc_libyuv.cc |
@@ -103,33 +103,35 @@ static int PrintPlane(const uint8_t* buf, |
} |
// TODO(nisse): Belongs with the test code? |
-int PrintVideoFrame(const VideoFrame& frame, FILE* file) { |
- if (file == NULL) |
- return -1; |
- if (frame.IsZeroSize()) |
- return -1; |
- int width = frame.video_frame_buffer()->width(); |
- int height = frame.video_frame_buffer()->height(); |
+int PrintVideoFrame(const VideoFrameBuffer& frame, FILE* file) { |
+ int width = frame.width(); |
+ int height = frame.height(); |
int chroma_width = (width + 1) / 2; |
int chroma_height = (height + 1) / 2; |
- if (PrintPlane(frame.video_frame_buffer()->DataY(), width, height, |
- frame.video_frame_buffer()->StrideY(), file) < 0) { |
+ if (PrintPlane(frame.DataY(), width, height, |
+ frame.StrideY(), file) < 0) { |
return -1; |
} |
- if (PrintPlane(frame.video_frame_buffer()->DataU(), |
+ if (PrintPlane(frame.DataU(), |
chroma_width, chroma_height, |
- frame.video_frame_buffer()->StrideU(), file) < 0) { |
+ frame.StrideU(), file) < 0) { |
return -1; |
} |
- if (PrintPlane(frame.video_frame_buffer()->DataV(), |
+ if (PrintPlane(frame.DataV(), |
chroma_width, chroma_height, |
- frame.video_frame_buffer()->StrideV(), file) < 0) { |
+ frame.StrideV(), file) < 0) { |
return -1; |
} |
return 0; |
} |
+int PrintVideoFrame(const VideoFrame& frame, FILE* file) { |
+ if (frame.IsZeroSize()) |
+ return -1; |
+ return PrintVideoFrame(*frame.video_frame_buffer(), file); |
+} |
+ |
int ExtractBuffer(const rtc::scoped_refptr<VideoFrameBuffer>& input_frame, |
size_t size, |
uint8_t* buffer) { |
@@ -249,23 +251,19 @@ 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(); |
+ 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(); |
+ std::swap(dst_width, dst_height); |
} |
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 +288,55 @@ 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) |
- return -1; |
- else if ((ref_frame->width() != test_frame->width()) || |
- (ref_frame->height() != test_frame->height())) |
+double I420PSNR(const VideoFrameBuffer& ref_buffer, |
+ const VideoFrameBuffer& test_buffer) { |
+ 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 VideoFrameBuffer& ref_buffer, |
+ const VideoFrameBuffer& test_buffer) { |
+ 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 |