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

Side by Side Diff: talk/app/webrtc/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java

Issue 1460703002: Implement AndroidTextureBuffer::NativeToI420. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Testcase cleanup. Revert EglBase helper method. Created 5 years 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 * libjingle 2 * libjingle
3 * Copyright 2015 Google Inc. 3 * Copyright 2015 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 wait(timeRemainingMs); 90 wait(timeRemainingMs);
91 final long elapsedTimeMs = SystemClock.elapsedRealtime() - startTimeMs; 91 final long elapsedTimeMs = SystemClock.elapsedRealtime() - startTimeMs;
92 timeRemainingMs = timeoutMs - elapsedTimeMs; 92 timeRemainingMs = timeoutMs - elapsedTimeMs;
93 } 93 }
94 final boolean didReceiveFrame = hasNewFrame; 94 final boolean didReceiveFrame = hasNewFrame;
95 hasNewFrame = false; 95 hasNewFrame = false;
96 return didReceiveFrame; 96 return didReceiveFrame;
97 } 97 }
98 } 98 }
99 99
100 /** Assert that two integers are close, with difference at most
101 * {@code threshold}. */
102 public static void assertClose(int threshold, int expected, int actual) {
103 if (Math.abs(expected - actual) <= threshold)
104 return;
105 failNotEquals("Not close enough, threshold " + threshold, expected, actual);
106 }
107
100 /** 108 /**
101 * Test normal use by receiving three uniform texture frames. Texture frames a re returned as early 109 * Test normal use by receiving three uniform texture frames. Texture frames a re returned as early
102 * as possible. The texture pixel values are inspected by drawing the texture frame to a pixel 110 * as possible. The texture pixel values are inspected by drawing the texture frame to a pixel
103 * buffer and reading it back with glReadPixels(). 111 * buffer and reading it back with glReadPixels().
104 */ 112 */
105 @MediumTest 113 @MediumTest
106 public static void testThreeConstantColorFrames() throws InterruptedException { 114 public static void testThreeConstantColorFrames() throws InterruptedException {
107 final int width = 16; 115 final int width = 16;
108 final int height = 16; 116 final int height = 16;
109 // Create EGL base with a pixel buffer as display output. 117 // Create EGL base with a pixel buffer as display output.
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 eglOesBase.swapBuffers(); 352 eglOesBase.swapBuffers();
345 eglOesBase.release(); 353 eglOesBase.release();
346 354
347 // Wait for an OES texture to arrive. 355 // Wait for an OES texture to arrive.
348 listener.waitForNewFrame(); 356 listener.waitForNewFrame();
349 357
350 surfaceTextureHelper.disconnect(handler); 358 surfaceTextureHelper.disconnect(handler);
351 359
352 surfaceTextureHelper.returnTextureFrame(); 360 surfaceTextureHelper.returnTextureFrame();
353 } 361 }
362
363 @MediumTest
364 public static void testTexturetoYUV() throws InterruptedException {
365 final int width = 16;
366 final int height = 16;
367
368 final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
369
370 // Create SurfaceTextureHelper and listener.
371 final SurfaceTextureHelper surfaceTextureHelper =
372 SurfaceTextureHelper.create(eglBase.getEglBaseContext());
373 final MockTextureListener listener = new MockTextureListener();
374 surfaceTextureHelper.setListener(listener);
375 surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height) ;
376
377 // Create resources for stubbing an OES texture producer. |eglBase| has the SurfaceTexture in
378 // |surfaceTextureHelper| as the target EGLSurface.
379
380 eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
381 assertEquals(eglBase.surfaceWidth(), width);
382 assertEquals(eglBase.surfaceHeight(), height);
383
384 final int red[] = new int[] {79, 144, 185};
385 final int green[] = new int[] {66, 210, 162};
386 final int blue[] = new int[] {161, 117, 158};
387
388 final int ref_y[] = new int[] {81, 180, 168};
389 final int ref_u[] = new int[] {173, 93, 122};
390 final int ref_v[] = new int[] {127, 103, 140};
391
392 // Draw three frames.
393 for (int i = 0; i < 3; ++i) {
394 // Draw a constant color frame onto the SurfaceTexture.
395 eglBase.makeCurrent();
396 GLES20.glClearColor(red[i] / 255.0f, green[i] / 255.0f, blue[i] / 255.0f, 1.0f);
397 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
398 // swapBuffers() will ultimately trigger onTextureFrameAvailable().
399 eglBase.swapBuffers();
400
401 // Wait for an OES texture to arrive.
402 listener.waitForNewFrame();
403
404 // Memory layout: Lines are 16 bytes. First 16 lines are
405 // the Y data. These are followed by 8 lines with 8 bytes of U
406 // data the left and 8 bytes of V data on the right.
perkj_webrtc 2015/12/10 12:33:35 s/ to
407 //
408 // Offset
409 // 0 YYYYYYYY YYYYYYYY
410 // 16 YYYYYYYY YYYYYYYY
411 // ...
412 // 240 YYYYYYYY YYYYYYYY
413 // 256 UUUUUUUU VVVVVVVV
414 // 272 UUUUUUUU VVVVVVVV
415 // ...
416 // 368 UUUUUUUU VVVVVVVV
417 // 384 buffer end
418 ByteBuffer buffer = ByteBuffer.allocateDirect(width * height * 3 / 2);
419 surfaceTextureHelper.textureToYUV(buffer, width, height, width,
420 listener.oesTextureId, listener.transformMatrix);
421
422 surfaceTextureHelper.returnTextureFrame();
423
424 // Allow off-by-one differences due to different rounding.
425 while (buffer.position() < width*height) {
426 assertClose(1, buffer.get() & 0xff, ref_y[i]);
427 }
428 while (buffer.hasRemaining()) {
429 if (buffer.position() % width < width/2)
430 assertClose(1, buffer.get() & 0xff, ref_u[i]);
431 else
432 assertClose(1, buffer.get() & 0xff, ref_v[i]);
433 }
434 }
435
436 surfaceTextureHelper.disconnect();
437 eglBase.release();
438 }
354 } 439 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698