webrtc java return callback

 src/sdk/android/api/org/webrtc/VideoEncoder.java中定義數據編碼後的回調接口.

  public interface Callback {
    /** Call to return an encoded frame. */
    void onEncodedFrame(EncodedImage frame, CodecSpecificInfo info);
  }

 這個接口由c++層調用java函數,在java層的函數中對這個接口進行實現。c++層代碼(src/sdk/android/src/jni/videodecoderwrapper.cc)

int32_t VideoEncoderWrapper::InitEncodeInternal(JNIEnv* jni) {
  bool automatic_resize_on;
  switch (codec_settings_.codecType) {
    case kVideoCodecVP8:
      automatic_resize_on = codec_settings_.VP8()->automaticResizeOn;
      break;
    case kVideoCodecVP9:
      automatic_resize_on = codec_settings_.VP9()->automaticResizeOn;
      break;
    default:
      automatic_resize_on = true;
  }
 //...
 //...
   jobject callback = Java_VideoEncoderWrapper_createEncoderCallback(
      jni, jlongFromPointer(this));

  jobject ret =
      Java_VideoEncoder_initEncode(jni, *encoder_, settings, callback);

}

 java層代碼(src/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java),實現callback接口。

  @CalledByNative
  static VideoEncoder.Callback createEncoderCallback(final long nativeEncoder) {
  //實現接口
    return (EncodedImage frame, VideoEncoder.CodecSpecificInfo info)
               -> nativeOnEncodedFrame(nativeEncoder, frame.buffer, frame.encodedWidth,
                   frame.encodedHeight, frame.captureTimeNs, frame.frameType.getNative(),
                   frame.rotation, frame.completeFrame, frame.qp);
  }

  @NativeClassQualifiedName("webrtc::jni::VideoEncoderWrapper")
  private static native void nativeOnEncodedFrame(long nativeEncoder, ByteBuffer buffer,
      int encodedWidth, int encodedHeight, long captureTimeNs, int frameType, int rotation,
      boolean completeFrame, Integer qp);

 根據jni函數命名規則,尋找nativeOnEncodedFrame對應c++函數時,找不到相應的函數。注意nativeOnEncodedFrame函數前面有這樣@NativeClassQualifiedName字符串,webrtc中有NativeClassQualifiedName.java這個文件,我只是知道nativeOnEncodedFrame對應的c++層函數就是(src/sdk/android/src/jni/videodecoderwrapper.cc)中的OnEncodedFrame函數。至於java是怎麼通過annotation將兩者對應起來的,並不是很清楚,對java中的annotation不熟。
 c++層的OnEncodedFrame函數,將編碼後的數據post到隊列中。

void VideoEncoderWrapper::OnEncodedFrame(JNIEnv* jni,
                                         jobject j_caller,
                                         jobject j_buffer,
                                         jint encoded_width,
                                         jint encoded_height,
                                         jlong capture_time_ns,
                                         jint frame_type,
                                         jint rotation,
                                         jboolean complete_frame,
                                         jobject j_qp)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章