Example #1
0
 // Update frame dimensions and report any changes to |rendererEvents|.
 private void updateFrameDimensionsAndReportEvents(VideoRenderer.I420Frame frame) {
   synchronized (layoutLock) {
     if (!isFirstFrameRendered) {
       isFirstFrameRendered = true;
       logD("Reporting first rendered frame.");
       if (rendererEvents != null) {
         rendererEvents.onFirstFrameRendered();
       }
     }
     if (rotatedFrameWidth != frame.rotatedWidth()
         || rotatedFrameHeight != frame.rotatedHeight()
         || frameRotation != frame.rotationDegree) {
       logD(
           "Reporting frame resolution changed to "
               + frame.width
               + "x"
               + frame.height
               + " with rotation "
               + frame.rotationDegree);
       if (rendererEvents != null) {
         rendererEvents.onFrameResolutionChanged(frame.width, frame.height, frame.rotationDegree);
       }
       rotatedFrameWidth = frame.rotatedWidth();
       rotatedFrameHeight = frame.rotatedHeight();
       frameRotation = frame.rotationDegree;
       post(
           new Runnable() {
             @Override
             public void run() {
               requestLayout();
             }
           });
     }
   }
 }
    @Override
    public synchronized void renderFrame(I420Frame frame) {
      if (surface == null) {
        // This object has been released.
        VideoRenderer.renderFrameDone(frame);
        return;
      }
      if (!seenFrame && rendererEvents != null) {
        Logging.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
        rendererEvents.onFirstFrameRendered();
      }
      framesReceived++;
      synchronized (pendingFrameLock) {
        // Check input frame parameters.
        if (frame.yuvFrame) {
          if (frame.yuvStrides[0] < frame.width
              || frame.yuvStrides[1] < frame.width / 2
              || frame.yuvStrides[2] < frame.width / 2) {
            Logging.e(
                TAG,
                "Incorrect strides "
                    + frame.yuvStrides[0]
                    + ", "
                    + frame.yuvStrides[1]
                    + ", "
                    + frame.yuvStrides[2]);
            VideoRenderer.renderFrameDone(frame);
            return;
          }
        }

        if (pendingFrame != null) {
          // Skip rendering of this frame if previous frame was not rendered yet.
          framesDropped++;
          VideoRenderer.renderFrameDone(frame);
          return;
        }
        pendingFrame = frame;
      }
      setSize(frame.width, frame.height, frame.rotationDegree);
      seenFrame = true;

      // Request rendering.
      surface.requestRender();
    }
    private void setSize(final int videoWidth, final int videoHeight, final int rotation) {
      if (videoWidth == this.videoWidth
          && videoHeight == this.videoHeight
          && rotation == rotationDegree) {
        return;
      }
      if (rendererEvents != null) {
        Logging.d(
            TAG,
            "ID: "
                + id
                + ". Reporting frame resolution changed to "
                + videoWidth
                + " x "
                + videoHeight);
        rendererEvents.onFrameResolutionChanged(videoWidth, videoHeight, rotation);
      }

      synchronized (updateLayoutLock) {
        Logging.d(
            TAG,
            "ID: "
                + id
                + ". YuvImageRenderer.setSize: "
                + videoWidth
                + " x "
                + videoHeight
                + " rotation "
                + rotation);

        this.videoWidth = videoWidth;
        this.videoHeight = videoHeight;
        rotationDegree = rotation;
        updateLayoutProperties = true;
        Logging.d(TAG, "  YuvImageRenderer.setSize done.");
      }
    }