Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: webrtc/common_video/libyuv/webrtc_libyuv.cc

Issue 2906053002: Update I420Buffer to new VideoFrameBuffer interface (Closed)
Patch Set: Make const versions of Get functions Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 int stride, 63 int stride,
64 FILE* file) { 64 FILE* file) {
65 for (int i = 0; i < height; i++, buf += stride) { 65 for (int i = 0; i < height; i++, buf += stride) {
66 if (fwrite(buf, 1, width, file) != static_cast<unsigned int>(width)) 66 if (fwrite(buf, 1, width, file) != static_cast<unsigned int>(width))
67 return -1; 67 return -1;
68 } 68 }
69 return 0; 69 return 0;
70 } 70 }
71 71
72 // TODO(nisse): Belongs with the test code? 72 // TODO(nisse): Belongs with the test code?
73 int PrintVideoFrame(const VideoFrameBuffer& frame, FILE* file) { 73 int PrintVideoFrame(const I420BufferInterface& frame, FILE* file) {
74 int width = frame.width(); 74 int width = frame.width();
75 int height = frame.height(); 75 int height = frame.height();
76 int chroma_width = (width + 1) / 2; 76 int chroma_width = frame.ChromaWidth();
77 int chroma_height = (height + 1) / 2; 77 int chroma_height = frame.ChromaHeight();
78 78
79 if (PrintPlane(frame.DataY(), width, height, 79 if (PrintPlane(frame.DataY(), width, height,
80 frame.StrideY(), file) < 0) { 80 frame.StrideY(), file) < 0) {
81 return -1; 81 return -1;
82 } 82 }
83 if (PrintPlane(frame.DataU(), 83 if (PrintPlane(frame.DataU(),
84 chroma_width, chroma_height, 84 chroma_width, chroma_height,
85 frame.StrideU(), file) < 0) { 85 frame.StrideU(), file) < 0) {
86 return -1; 86 return -1;
87 } 87 }
88 if (PrintPlane(frame.DataV(), 88 if (PrintPlane(frame.DataV(),
89 chroma_width, chroma_height, 89 chroma_width, chroma_height,
90 frame.StrideV(), file) < 0) { 90 frame.StrideV(), file) < 0) {
91 return -1; 91 return -1;
92 } 92 }
93 return 0; 93 return 0;
94 } 94 }
95 95
96 int PrintVideoFrame(const VideoFrame& frame, FILE* file) { 96 int PrintVideoFrame(const VideoFrame& frame, FILE* file) {
97 return PrintVideoFrame(*frame.video_frame_buffer(), file); 97 return PrintVideoFrame(*frame.video_frame_buffer()->ToI420(), file);
98 } 98 }
99 99
100 int ExtractBuffer(const rtc::scoped_refptr<VideoFrameBuffer>& input_frame, 100 int ExtractBuffer(const rtc::scoped_refptr<I420BufferInterface>& input_frame,
101 size_t size, 101 size_t size,
102 uint8_t* buffer) { 102 uint8_t* buffer) {
103 RTC_DCHECK(buffer); 103 RTC_DCHECK(buffer);
104 if (!input_frame) 104 if (!input_frame)
105 return -1; 105 return -1;
106 int width = input_frame->width(); 106 int width = input_frame->width();
107 int height = input_frame->height(); 107 int height = input_frame->height();
108 size_t length = CalcBufferSize(VideoType::kI420, width, height); 108 size_t length = CalcBufferSize(VideoType::kI420, width, height);
109 if (size < length) { 109 if (size < length) {
110 return -1; 110 return -1;
111 } 111 }
112 112
113 int chroma_width = (width + 1) / 2; 113 int chroma_width = input_frame->ChromaWidth();
114 int chroma_height = (height + 1) / 2; 114 int chroma_height = input_frame->ChromaHeight();
115 115
116 libyuv::I420Copy(input_frame->DataY(), 116 libyuv::I420Copy(input_frame->DataY(),
117 input_frame->StrideY(), 117 input_frame->StrideY(),
118 input_frame->DataU(), 118 input_frame->DataU(),
119 input_frame->StrideU(), 119 input_frame->StrideU(),
120 input_frame->DataV(), 120 input_frame->DataV(),
121 input_frame->StrideV(), 121 input_frame->StrideV(),
122 buffer, width, 122 buffer, width,
123 buffer + width*height, chroma_width, 123 buffer + width*height, chroma_width,
124 buffer + width*height + chroma_width*chroma_height, 124 buffer + width*height + chroma_width*chroma_height,
125 chroma_width, 125 chroma_width,
126 width, height); 126 width, height);
127 127
128 return static_cast<int>(length); 128 return static_cast<int>(length);
129 } 129 }
130 130
131 int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer) { 131 int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer) {
132 return ExtractBuffer(input_frame.video_frame_buffer(), size, buffer); 132 return ExtractBuffer(input_frame.video_frame_buffer()->ToI420(), size,
133 buffer);
133 } 134 }
134 135
135 int ConvertNV12ToRGB565(const uint8_t* src_frame, 136 int ConvertNV12ToRGB565(const uint8_t* src_frame,
136 uint8_t* dst_frame, 137 uint8_t* dst_frame,
137 int width, int height) { 138 int width, int height) {
138 int abs_height = (height < 0) ? -height : height; 139 int abs_height = (height < 0) ? -height : height;
139 const uint8_t* yplane = src_frame; 140 const uint8_t* yplane = src_frame;
140 const uint8_t* uvInterlaced = src_frame + (width * abs_height); 141 const uint8_t* uvInterlaced = src_frame + (width * abs_height);
141 142
142 return libyuv::NV12ToRGB565(yplane, width, 143 return libyuv::NV12ToRGB565(yplane, width,
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 src_width, src_height, 234 src_width, src_height,
234 dst_width, dst_height, 235 dst_width, dst_height,
235 ConvertRotationMode(rotation), 236 ConvertRotationMode(rotation),
236 ConvertVideoType(src_video_type)); 237 ConvertVideoType(src_video_type));
237 } 238 }
238 239
239 int ConvertFromI420(const VideoFrame& src_frame, 240 int ConvertFromI420(const VideoFrame& src_frame,
240 VideoType dst_video_type, 241 VideoType dst_video_type,
241 int dst_sample_size, 242 int dst_sample_size,
242 uint8_t* dst_frame) { 243 uint8_t* dst_frame) {
244 rtc::scoped_refptr<I420BufferInterface> i420_buffer =
245 src_frame.video_frame_buffer()->ToI420();
243 return libyuv::ConvertFromI420( 246 return libyuv::ConvertFromI420(
244 src_frame.video_frame_buffer()->DataY(), 247 i420_buffer->DataY(), i420_buffer->StrideY(), i420_buffer->DataU(),
245 src_frame.video_frame_buffer()->StrideY(), 248 i420_buffer->StrideU(), i420_buffer->DataV(), i420_buffer->StrideV(),
246 src_frame.video_frame_buffer()->DataU(), 249 dst_frame, dst_sample_size, src_frame.width(), src_frame.height(),
247 src_frame.video_frame_buffer()->StrideU(),
248 src_frame.video_frame_buffer()->DataV(),
249 src_frame.video_frame_buffer()->StrideV(),
250 dst_frame, dst_sample_size,
251 src_frame.width(), src_frame.height(),
252 ConvertVideoType(dst_video_type)); 250 ConvertVideoType(dst_video_type));
253 } 251 }
254 252
255 // Compute PSNR for an I420 frame (all planes). Can upscale test frame. 253 // Compute PSNR for an I420 frame (all planes). Can upscale test frame.
256 double I420PSNR(const VideoFrameBuffer& ref_buffer, 254 double I420PSNR(const I420BufferInterface& ref_buffer,
257 const VideoFrameBuffer& test_buffer) { 255 const I420BufferInterface& test_buffer) {
258 RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width()); 256 RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width());
259 RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height()); 257 RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height());
260 if ((ref_buffer.width() != test_buffer.width()) || 258 if ((ref_buffer.width() != test_buffer.width()) ||
261 (ref_buffer.height() != test_buffer.height())) { 259 (ref_buffer.height() != test_buffer.height())) {
262 rtc::scoped_refptr<I420Buffer> scaled_buffer = 260 rtc::scoped_refptr<I420Buffer> scaled_buffer =
263 I420Buffer::Create(ref_buffer.width(), ref_buffer.height()); 261 I420Buffer::Create(ref_buffer.width(), ref_buffer.height());
264 scaled_buffer->ScaleFrom(test_buffer); 262 scaled_buffer->ScaleFrom(test_buffer);
265 return I420PSNR(ref_buffer, *scaled_buffer); 263 return I420PSNR(ref_buffer, *scaled_buffer);
266 } 264 }
267 double psnr = libyuv::I420Psnr( 265 double psnr = libyuv::I420Psnr(
268 ref_buffer.DataY(), ref_buffer.StrideY(), ref_buffer.DataU(), 266 ref_buffer.DataY(), ref_buffer.StrideY(), ref_buffer.DataU(),
269 ref_buffer.StrideU(), ref_buffer.DataV(), ref_buffer.StrideV(), 267 ref_buffer.StrideU(), ref_buffer.DataV(), ref_buffer.StrideV(),
270 test_buffer.DataY(), test_buffer.StrideY(), test_buffer.DataU(), 268 test_buffer.DataY(), test_buffer.StrideY(), test_buffer.DataU(),
271 test_buffer.StrideU(), test_buffer.DataV(), test_buffer.StrideV(), 269 test_buffer.StrideU(), test_buffer.DataV(), test_buffer.StrideV(),
272 test_buffer.width(), test_buffer.height()); 270 test_buffer.width(), test_buffer.height());
273 // LibYuv sets the max psnr value to 128, we restrict it here. 271 // LibYuv sets the max psnr value to 128, we restrict it here.
274 // In case of 0 mse in one frame, 128 can skew the results significantly. 272 // In case of 0 mse in one frame, 128 can skew the results significantly.
275 return (psnr > kPerfectPSNR) ? kPerfectPSNR : psnr; 273 return (psnr > kPerfectPSNR) ? kPerfectPSNR : psnr;
276 } 274 }
277 275
278 // Compute PSNR for an I420 frame (all planes) 276 // Compute PSNR for an I420 frame (all planes)
279 double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) { 277 double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
280 if (!ref_frame || !test_frame) 278 if (!ref_frame || !test_frame)
281 return -1; 279 return -1;
282 return I420PSNR(*ref_frame->video_frame_buffer(), 280 return I420PSNR(*ref_frame->video_frame_buffer()->ToI420(),
283 *test_frame->video_frame_buffer()); 281 *test_frame->video_frame_buffer()->ToI420());
284 } 282 }
285 283
286 // Compute SSIM for an I420 frame (all planes). Can upscale test_buffer. 284 // Compute SSIM for an I420 frame (all planes). Can upscale test_buffer.
287 double I420SSIM(const VideoFrameBuffer& ref_buffer, 285 double I420SSIM(const I420BufferInterface& ref_buffer,
288 const VideoFrameBuffer& test_buffer) { 286 const I420BufferInterface& test_buffer) {
289 RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width()); 287 RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width());
290 RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height()); 288 RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height());
291 if ((ref_buffer.width() != test_buffer.width()) || 289 if ((ref_buffer.width() != test_buffer.width()) ||
292 (ref_buffer.height() != test_buffer.height())) { 290 (ref_buffer.height() != test_buffer.height())) {
293 rtc::scoped_refptr<I420Buffer> scaled_buffer = 291 rtc::scoped_refptr<I420Buffer> scaled_buffer =
294 I420Buffer::Create(ref_buffer.width(), ref_buffer.height()); 292 I420Buffer::Create(ref_buffer.width(), ref_buffer.height());
295 scaled_buffer->ScaleFrom(test_buffer); 293 scaled_buffer->ScaleFrom(test_buffer);
296 return I420SSIM(ref_buffer, *scaled_buffer); 294 return I420SSIM(ref_buffer, *scaled_buffer);
297 } 295 }
298 return libyuv::I420Ssim( 296 return libyuv::I420Ssim(
299 ref_buffer.DataY(), ref_buffer.StrideY(), ref_buffer.DataU(), 297 ref_buffer.DataY(), ref_buffer.StrideY(), ref_buffer.DataU(),
300 ref_buffer.StrideU(), ref_buffer.DataV(), ref_buffer.StrideV(), 298 ref_buffer.StrideU(), ref_buffer.DataV(), ref_buffer.StrideV(),
301 test_buffer.DataY(), test_buffer.StrideY(), test_buffer.DataU(), 299 test_buffer.DataY(), test_buffer.StrideY(), test_buffer.DataU(),
302 test_buffer.StrideU(), test_buffer.DataV(), test_buffer.StrideV(), 300 test_buffer.StrideU(), test_buffer.DataV(), test_buffer.StrideV(),
303 test_buffer.width(), test_buffer.height()); 301 test_buffer.width(), test_buffer.height());
304 } 302 }
305 double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) { 303 double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
306 if (!ref_frame || !test_frame) 304 if (!ref_frame || !test_frame)
307 return -1; 305 return -1;
308 return I420SSIM(*ref_frame->video_frame_buffer(), 306 return I420SSIM(*ref_frame->video_frame_buffer()->ToI420(),
309 *test_frame->video_frame_buffer()); 307 *test_frame->video_frame_buffer()->ToI420());
310 } 308 }
311 309
312 void NV12Scale(std::vector<uint8_t>* tmp_buffer, 310 void NV12Scale(std::vector<uint8_t>* tmp_buffer,
313 const uint8_t* src_y, int src_stride_y, 311 const uint8_t* src_y, int src_stride_y,
314 const uint8_t* src_uv, int src_stride_uv, 312 const uint8_t* src_uv, int src_stride_uv,
315 int src_width, int src_height, 313 int src_width, int src_height,
316 uint8_t* dst_y, int dst_stride_y, 314 uint8_t* dst_y, int dst_stride_y,
317 uint8_t* dst_uv, int dst_stride_uv, 315 uint8_t* dst_uv, int dst_stride_uv,
318 int dst_width, int dst_height) { 316 int dst_width, int dst_height) {
319 const int src_chroma_width = (src_width + 1) / 2; 317 const int src_chroma_width = (src_width + 1) / 2;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 src_v, src_uv_width, 411 src_v, src_uv_width,
414 src_width, src_height, 412 src_width, src_height,
415 dst_y, dst_stride_y, 413 dst_y, dst_stride_y,
416 dst_u, dst_stride_u, 414 dst_u, dst_stride_u,
417 dst_v, dst_stride_v, 415 dst_v, dst_stride_v,
418 dst_width, dst_height, 416 dst_width, dst_height,
419 libyuv::kFilterBox); 417 libyuv::kFilterBox);
420 } 418 }
421 419
422 } // namespace webrtc 420 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/common_video/libyuv/libyuv_unittest.cc ('k') | webrtc/examples/peerconnection/client/linux/main_wnd.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698