OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |