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

Side by Side Diff: talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java

Issue 1313563002: Java VideoRenderer.Callbacks: Make renderFrame() interface asynchronous (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebase Created 5 years, 3 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 * libjingle 2 * libjingle
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 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 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 361
362 this.videoWidth = videoWidth; 362 this.videoWidth = videoWidth;
363 this.videoHeight = videoHeight; 363 this.videoHeight = videoHeight;
364 rotationDegree = rotation; 364 rotationDegree = rotation;
365 int[] strides = { videoWidth, videoWidth / 2, videoWidth / 2 }; 365 int[] strides = { videoWidth, videoWidth / 2, videoWidth / 2 };
366 366
367 // Clear rendering queue. 367 // Clear rendering queue.
368 frameToRenderQueue.poll(); 368 frameToRenderQueue.poll();
369 // Re-allocate / allocate the frame. 369 // Re-allocate / allocate the frame.
370 yuvFrameToRender = new I420Frame(videoWidth, videoHeight, rotationDegree , 370 yuvFrameToRender = new I420Frame(videoWidth, videoHeight, rotationDegree ,
371 strides, null); 371 strides, null, 0);
372 textureFrameToRender = new I420Frame(videoWidth, videoHeight, rotationDe gree, 372 textureFrameToRender = new I420Frame(videoWidth, videoHeight, rotationDe gree,
373 null, -1); 373 null, -1, 0);
374 updateTextureProperties = true; 374 updateTextureProperties = true;
375 Log.d(TAG, " YuvImageRenderer.setSize done."); 375 Log.d(TAG, " YuvImageRenderer.setSize done.");
376 } 376 }
377 } 377 }
378 378
379 @Override 379 @Override
380 public synchronized void renderFrame(I420Frame frame) { 380 public synchronized void renderFrame(I420Frame frame) {
381 if (surface == null) { 381 if (surface == null) {
382 // This object has been released. 382 // This object has been released.
383 VideoRenderer.renderFrameDone(frame);
383 return; 384 return;
384 } 385 }
385 if (!seenFrame && rendererEvents != null) { 386 if (!seenFrame && rendererEvents != null) {
386 Log.d(TAG, "ID: " + id + ". Reporting first rendered frame."); 387 Log.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
387 rendererEvents.onFirstFrameRendered(); 388 rendererEvents.onFirstFrameRendered();
388 } 389 }
389 setSize(frame.width, frame.height, frame.rotationDegree); 390 setSize(frame.width, frame.height, frame.rotationDegree);
390 long now = System.nanoTime(); 391 long now = System.nanoTime();
391 framesReceived++; 392 framesReceived++;
392 synchronized (frameToRenderQueue) { 393 synchronized (frameToRenderQueue) {
393 // Skip rendering of this frame if setSize() was not called. 394 // Skip rendering of this frame if setSize() was not called.
394 if (yuvFrameToRender == null || textureFrameToRender == null) { 395 if (yuvFrameToRender == null || textureFrameToRender == null) {
395 framesDropped++; 396 framesDropped++;
397 VideoRenderer.renderFrameDone(frame);
396 return; 398 return;
397 } 399 }
398 // Check input frame parameters. 400 // Check input frame parameters.
399 if (frame.yuvFrame) { 401 if (frame.yuvFrame) {
400 if (frame.yuvStrides[0] < frame.width || 402 if (frame.yuvStrides[0] < frame.width ||
401 frame.yuvStrides[1] < frame.width / 2 || 403 frame.yuvStrides[1] < frame.width / 2 ||
402 frame.yuvStrides[2] < frame.width / 2) { 404 frame.yuvStrides[2] < frame.width / 2) {
403 Log.e(TAG, "Incorrect strides " + frame.yuvStrides[0] + ", " + 405 Log.e(TAG, "Incorrect strides " + frame.yuvStrides[0] + ", " +
404 frame.yuvStrides[1] + ", " + frame.yuvStrides[2]); 406 frame.yuvStrides[1] + ", " + frame.yuvStrides[2]);
407 VideoRenderer.renderFrameDone(frame);
405 return; 408 return;
406 } 409 }
407 // Check incoming frame dimensions. 410 // Check incoming frame dimensions.
408 if (frame.width != yuvFrameToRender.width || 411 if (frame.width != yuvFrameToRender.width ||
409 frame.height != yuvFrameToRender.height) { 412 frame.height != yuvFrameToRender.height) {
410 throw new RuntimeException("Wrong frame size " + 413 throw new RuntimeException("Wrong frame size " +
411 frame.width + " x " + frame.height); 414 frame.width + " x " + frame.height);
412 } 415 }
413 } 416 }
414 417
415 if (frameToRenderQueue.size() > 0) { 418 if (frameToRenderQueue.size() > 0) {
416 // Skip rendering of this frame if previous frame was not rendered yet . 419 // Skip rendering of this frame if previous frame was not rendered yet .
417 framesDropped++; 420 framesDropped++;
421 VideoRenderer.renderFrameDone(frame);
418 return; 422 return;
419 } 423 }
420 424
421 // Create a local copy of the frame. 425 // Create a local copy of the frame.
422 if (frame.yuvFrame) { 426 if (frame.yuvFrame) {
423 yuvFrameToRender.copyFrom(frame); 427 yuvFrameToRender.copyFrom(frame);
424 rendererType = RendererType.RENDERER_YUV; 428 rendererType = RendererType.RENDERER_YUV;
425 frameToRenderQueue.offer(yuvFrameToRender); 429 frameToRenderQueue.offer(yuvFrameToRender);
426 } else { 430 } else {
427 textureFrameToRender.copyFrom(frame); 431 textureFrameToRender.copyFrom(frame);
428 rendererType = RendererType.RENDERER_TEXTURE; 432 rendererType = RendererType.RENDERER_TEXTURE;
429 frameToRenderQueue.offer(textureFrameToRender); 433 frameToRenderQueue.offer(textureFrameToRender);
430 } 434 }
431 } 435 }
432 copyTimeNs += (System.nanoTime() - now); 436 copyTimeNs += (System.nanoTime() - now);
433 seenFrame = true; 437 seenFrame = true;
438 VideoRenderer.renderFrameDone(frame);
434 439
435 // Request rendering. 440 // Request rendering.
436 surface.requestRender(); 441 surface.requestRender();
437 } 442 }
438 } 443 }
439 444
440 /** Passes GLSurfaceView to video renderer. */ 445 /** Passes GLSurfaceView to video renderer. */
441 public static synchronized void setView(GLSurfaceView surface, 446 public static synchronized void setView(GLSurfaceView surface,
442 Runnable eglContextReadyCallback) { 447 Runnable eglContextReadyCallback) {
443 Log.d(TAG, "VideoRendererGui.setView"); 448 Log.d(TAG, "VideoRendererGui.setView");
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 GLES20.glViewport(0, 0, screenWidth, screenHeight); 637 GLES20.glViewport(0, 0, screenWidth, screenHeight);
633 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 638 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
634 synchronized (yuvImageRenderers) { 639 synchronized (yuvImageRenderers) {
635 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) { 640 for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) {
636 yuvImageRenderer.draw(drawer); 641 yuvImageRenderer.draw(drawer);
637 } 642 }
638 } 643 }
639 } 644 }
640 645
641 } 646 }
OLDNEW
« no previous file with comments | « talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java ('k') | talk/app/webrtc/java/jni/peerconnection_jni.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698