MediaCodec: don't use JNI after GetPrimitiveArrayCritical()

this was found, because of having -Xcheck:jni enabled
This commit is contained in:
Julian Winkler
2024-02-03 23:37:52 +01:00
parent 810886ca59
commit f107328bf4
2 changed files with 6 additions and 4 deletions

View File

@@ -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.nb_channels = nb_channels;
data = get_nio_buffer(env, extradata, &array_ref, &array);
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);
memcpy(codec_ctx->extradata, data, codec_ctx->extradata_size);
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);
uint8_t *raw_buffer = get_nio_buffer(env, buffer, &array_ref, &array);
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);
release_nio_buffer(env, array_ref, array);
_SET_INT_FIELD(buffer_info, "offset", 0);
_SET_INT_FIELD(buffer_info, "size", outSamples * 2 * 2);
av_frame_free(&frame);
} else if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
// 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;
release_nio_buffer(env, array_ref, array);
_SET_INT_FIELD(buffer_info, "offset", 0);
_SET_INT_FIELD(buffer_info, "size", sizeof(AVFrame *));
}
release_nio_buffer(env, array_ref, array);
return 0;
}

View File

@@ -213,8 +213,8 @@ void *get_nio_buffer(JNIEnv *env, jobject buffer, jarray *array_ref, jbyte **arr
pointer += position << elementSizeShift;
} else { // buffer is indirect
*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"));
pointer = *array = (*env)->GetPrimitiveArrayCritical(env, *array_ref, NULL);
pointer += (offset + position) << elementSizeShift;
}
return pointer;