You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
MediaCodec: don't use JNI after GetPrimitiveArrayCritical()
this was found, because of having -Xcheck:jni enabled
This commit is contained in:
@@ -74,8 +74,8 @@ JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1configure_1audio(JN
|
|||||||
codec_ctx->ch_layout = (AVChannelLayout) AV_CHANNEL_LAYOUT_STEREO;
|
codec_ctx->ch_layout = (AVChannelLayout) AV_CHANNEL_LAYOUT_STEREO;
|
||||||
codec_ctx->ch_layout.nb_channels = nb_channels;
|
codec_ctx->ch_layout.nb_channels = nb_channels;
|
||||||
|
|
||||||
data = get_nio_buffer(env, extradata, &array_ref, &array);
|
|
||||||
codec_ctx->extradata_size = get_nio_buffer_size(env, extradata);
|
codec_ctx->extradata_size = get_nio_buffer_size(env, extradata);
|
||||||
|
data = get_nio_buffer(env, extradata, &array_ref, &array);
|
||||||
codec_ctx->extradata = av_mallocz(codec_ctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
|
codec_ctx->extradata = av_mallocz(codec_ctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||||
memcpy(codec_ctx->extradata, data, codec_ctx->extradata_size);
|
memcpy(codec_ctx->extradata, data, codec_ctx->extradata_size);
|
||||||
release_nio_buffer(env, array_ref, array);
|
release_nio_buffer(env, array_ref, array);
|
||||||
@@ -395,20 +395,22 @@ JNIEXPORT jint JNICALL Java_android_media_MediaCodec_native_1dequeueOutputBuffer
|
|||||||
}
|
}
|
||||||
_SET_LONG_FIELD(buffer_info, "presentationTimeUs", frame->pts);
|
_SET_LONG_FIELD(buffer_info, "presentationTimeUs", frame->pts);
|
||||||
|
|
||||||
uint8_t *raw_buffer = get_nio_buffer(env, buffer, &array_ref, &array);
|
|
||||||
if (codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
if (codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||||
|
uint8_t *raw_buffer = get_nio_buffer(env, buffer, &array_ref, &array);
|
||||||
int outSamples = swr_convert(ctx->audio.swr, &raw_buffer, frame->nb_samples, (uint8_t const **) (frame->data), frame->nb_samples);
|
int outSamples = swr_convert(ctx->audio.swr, &raw_buffer, frame->nb_samples, (uint8_t const **) (frame->data), frame->nb_samples);
|
||||||
|
release_nio_buffer(env, array_ref, array);
|
||||||
_SET_INT_FIELD(buffer_info, "offset", 0);
|
_SET_INT_FIELD(buffer_info, "offset", 0);
|
||||||
_SET_INT_FIELD(buffer_info, "size", outSamples * 2 * 2);
|
_SET_INT_FIELD(buffer_info, "size", outSamples * 2 * 2);
|
||||||
|
|
||||||
av_frame_free(&frame);
|
av_frame_free(&frame);
|
||||||
} else if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
|
} else if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||||
// copy frame pointer into data buffer to be read by releaseOutputBuffer function
|
// copy frame pointer into data buffer to be read by releaseOutputBuffer function
|
||||||
|
uint8_t *raw_buffer = get_nio_buffer(env, buffer, &array_ref, &array);
|
||||||
*((AVFrame **)raw_buffer) = frame;
|
*((AVFrame **)raw_buffer) = frame;
|
||||||
|
release_nio_buffer(env, array_ref, array);
|
||||||
_SET_INT_FIELD(buffer_info, "offset", 0);
|
_SET_INT_FIELD(buffer_info, "offset", 0);
|
||||||
_SET_INT_FIELD(buffer_info, "size", sizeof(AVFrame *));
|
_SET_INT_FIELD(buffer_info, "size", sizeof(AVFrame *));
|
||||||
}
|
}
|
||||||
release_nio_buffer(env, array_ref, array);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -213,8 +213,8 @@ void *get_nio_buffer(JNIEnv *env, jobject buffer, jarray *array_ref, jbyte **arr
|
|||||||
pointer += position << elementSizeShift;
|
pointer += position << elementSizeShift;
|
||||||
} else { // buffer is indirect
|
} else { // buffer is indirect
|
||||||
*array_ref = (*env)->CallObjectMethod(env, buffer, _METHOD(class, "array", "()Ljava/lang/Object;"));
|
*array_ref = (*env)->CallObjectMethod(env, buffer, _METHOD(class, "array", "()Ljava/lang/Object;"));
|
||||||
pointer = *array = (*env)->GetPrimitiveArrayCritical(env, *array_ref, NULL);
|
|
||||||
jint offset = (*env)->CallIntMethod(env, buffer, _METHOD(class, "arrayOffset", "()I"));
|
jint offset = (*env)->CallIntMethod(env, buffer, _METHOD(class, "arrayOffset", "()I"));
|
||||||
|
pointer = *array = (*env)->GetPrimitiveArrayCritical(env, *array_ref, NULL);
|
||||||
pointer += (offset + position) << elementSizeShift;
|
pointer += (offset + position) << elementSizeShift;
|
||||||
}
|
}
|
||||||
return pointer;
|
return pointer;
|
||||||
|
|||||||
Reference in New Issue
Block a user