/**
   * encode a buffer and add in RTP input
   *
   * @param data
   */
  private void encode(byte[] data) {
    // Set timestamp
    timeStamp = SystemClock.uptimeMillis() - videoStartTime;

    // Encode frame
    byte[] encoded;
    if (frameBuffer.dataSrcWidth != 0 && frameBuffer.dataSrcHeight != 0) {
      encoded =
          NativeH264Encoder.ResizeAndEncodeFrame(
              data, timeStamp, mirroring, frameBuffer.dataSrcWidth, frameBuffer.dataSrcHeight);
    } else {
      encoded =
          NativeH264Encoder.EncodeFrame(data, timeStamp, mirroring, frameBuffer.dataScaleFactor);
    }
    int encodeResult = NativeH264Encoder.getLastEncodeStatus();
    if ((encodeResult == 0) && (encoded.length > 0)) {
      // Send SPS/PPS if IDR or first frame
      if (!nalInit || isIdrFrame(encoded)) {
        rtpInput.addFrame(sps, timeStamp);
        rtpInput.addFrame(pps, timeStamp);
        nalInit = true;
      }

      VideoOrientation videoOrientation = null;
      if (orientationHeaderId > 0) {
        videoOrientation =
            new VideoOrientation(
                orientationHeaderId, CameraOptions.convert(cameraId), mOrientation);
      }
      rtpInput.addFrame(encoded, timeStamp, videoOrientation);
    }
  }