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)