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