Android: Use scoped java refs
We currently use raw jobject in our code mixed with sporadic ScopedLocalRefFrame. This CL moves every jobject into a scoped object, either local, global, or a parameter. Also, this CL uses the JNI generation script to generate declaration stubs for the Java->C++ functions so that it no longer becomes possible to mistype them without getting compilation errors. TBR=brandt@webrtc.org Bug: webrtc:8278,webrtc:6969 Change-Id: Ic7bac74a89c11180177d65041086d7db1cdfb516 Reviewed-on: https://webrtc-review.googlesource.com/34655 Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21387}
This commit is contained in:
committed by
Commit Bot
parent
ec22e3f503
commit
84d8ae5df7
@ -35,7 +35,8 @@ inline rtc::Optional<Dst> cast_optional(const rtc::Optional<Src>& value) {
|
||||
}
|
||||
} // namespace
|
||||
|
||||
VideoDecoderWrapper::VideoDecoderWrapper(JNIEnv* jni, jobject decoder)
|
||||
VideoDecoderWrapper::VideoDecoderWrapper(JNIEnv* jni,
|
||||
const JavaRef<jobject>& decoder)
|
||||
: decoder_(jni, decoder) {
|
||||
initialized_ = false;
|
||||
// QP parsing starts enabled and we disable it if the decoder provides frames.
|
||||
@ -48,22 +49,21 @@ VideoDecoderWrapper::VideoDecoderWrapper(JNIEnv* jni, jobject decoder)
|
||||
int32_t VideoDecoderWrapper::InitDecode(const VideoCodec* codec_settings,
|
||||
int32_t number_of_cores) {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
|
||||
codec_settings_ = *codec_settings;
|
||||
number_of_cores_ = number_of_cores;
|
||||
return InitDecodeInternal(jni);
|
||||
}
|
||||
|
||||
int32_t VideoDecoderWrapper::InitDecodeInternal(JNIEnv* jni) {
|
||||
jobject settings = Java_Settings_Constructor(
|
||||
ScopedJavaLocalRef<jobject> settings = Java_Settings_Constructor(
|
||||
jni, number_of_cores_, codec_settings_.width, codec_settings_.height);
|
||||
|
||||
jobject callback = Java_VideoDecoderWrapper_createDecoderCallback(
|
||||
jni, jlongFromPointer(this));
|
||||
ScopedJavaLocalRef<jobject> callback =
|
||||
Java_VideoDecoderWrapper_createDecoderCallback(jni,
|
||||
jlongFromPointer(this));
|
||||
|
||||
jobject ret =
|
||||
Java_VideoDecoder_initDecode(jni, *decoder_, settings, callback);
|
||||
ScopedJavaLocalRef<jobject> ret =
|
||||
Java_VideoDecoder_initDecode(jni, decoder_, settings, callback);
|
||||
if (JavaToNativeVideoCodecStatus(jni, ret) == WEBRTC_VIDEO_CODEC_OK) {
|
||||
initialized_ = true;
|
||||
}
|
||||
@ -86,9 +86,6 @@ int32_t VideoDecoderWrapper::Decode(
|
||||
return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
|
||||
}
|
||||
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
|
||||
// Make a mutable copy so we can modify the timestamp.
|
||||
EncodedImage input_image(image_param);
|
||||
// We use RTP timestamp for capture time because capture_time_ms_ is always 0.
|
||||
@ -104,9 +101,13 @@ int32_t VideoDecoderWrapper::Decode(
|
||||
qp_parsing_enabled_ ? ParseQP(input_image) : rtc::nullopt;
|
||||
frame_extra_infos_.push_back(frame_extra_info);
|
||||
|
||||
jobject jinput_image = NativeToJavaEncodedImage(jni, input_image);
|
||||
jobject ret = Java_VideoDecoder_decode(jni, *decoder_, jinput_image, nullptr);
|
||||
return HandleReturnCode(jni, ret);
|
||||
JNIEnv* env = AttachCurrentThreadIfNeeded();
|
||||
ScopedJavaLocalRef<jobject> jinput_image =
|
||||
NativeToJavaEncodedImage(env, input_image);
|
||||
ScopedJavaLocalRef<jobject> decode_info;
|
||||
ScopedJavaLocalRef<jobject> ret =
|
||||
Java_VideoDecoder_decode(env, decoder_, jinput_image, decode_info);
|
||||
return HandleReturnCode(env, ret);
|
||||
}
|
||||
|
||||
int32_t VideoDecoderWrapper::RegisterDecodeCompleteCallback(
|
||||
@ -117,8 +118,7 @@ int32_t VideoDecoderWrapper::RegisterDecodeCompleteCallback(
|
||||
|
||||
int32_t VideoDecoderWrapper::Release() {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
jobject ret = Java_VideoDecoder_release(jni, *decoder_);
|
||||
ScopedJavaLocalRef<jobject> ret = Java_VideoDecoder_release(jni, decoder_);
|
||||
frame_extra_infos_.clear();
|
||||
initialized_ = false;
|
||||
return HandleReturnCode(jni, ret);
|
||||
@ -126,18 +126,19 @@ int32_t VideoDecoderWrapper::Release() {
|
||||
|
||||
bool VideoDecoderWrapper::PrefersLateDecoding() const {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
return Java_VideoDecoder_getPrefersLateDecoding(jni, *decoder_);
|
||||
return Java_VideoDecoder_getPrefersLateDecoding(jni, decoder_);
|
||||
}
|
||||
|
||||
const char* VideoDecoderWrapper::ImplementationName() const {
|
||||
return implementation_name_.c_str();
|
||||
}
|
||||
|
||||
void VideoDecoderWrapper::OnDecodedFrame(JNIEnv* env,
|
||||
jobject j_caller,
|
||||
jobject j_frame,
|
||||
jobject j_decode_time_ms,
|
||||
jobject j_qp) {
|
||||
void VideoDecoderWrapper::OnDecodedFrame(
|
||||
JNIEnv* env,
|
||||
const JavaRef<jobject>& j_caller,
|
||||
const JavaRef<jobject>& j_frame,
|
||||
const JavaRef<jobject>& j_decode_time_ms,
|
||||
const JavaRef<jobject>& j_qp) {
|
||||
const uint64_t timestamp_ns = GetJavaVideoFrameTimestampNs(env, j_frame);
|
||||
|
||||
FrameExtraInfo frame_extra_info;
|
||||
@ -170,7 +171,8 @@ void VideoDecoderWrapper::OnDecodedFrame(JNIEnv* env,
|
||||
decoder_qp ? decoder_qp : frame_extra_info.qp);
|
||||
}
|
||||
|
||||
int32_t VideoDecoderWrapper::HandleReturnCode(JNIEnv* jni, jobject code) {
|
||||
int32_t VideoDecoderWrapper::HandleReturnCode(JNIEnv* jni,
|
||||
const JavaRef<jobject>& code) {
|
||||
int32_t value = JavaToNativeVideoCodecStatus(jni, code);
|
||||
if (value < 0) { // Any errors are represented by negative values.
|
||||
// Reset the codec.
|
||||
|
||||
Reference in New Issue
Block a user