From 7491f77cd02c136a7bbb56211cb6a7411520e522 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Wed, 16 Dec 2015 21:05:33 +0800 Subject: [PATCH] android/MediaCodec: replace getInputBuffer with writeInputData --- .../ffpipenode_android_mediacodec_vdec.c | 13 ++-- .../android/ijksdl_codec_android_mediacodec.c | 12 +--- .../android/ijksdl_codec_android_mediacodec.h | 6 +- .../ijksdl_codec_android_mediacodec_java.c | 67 +++++++------------ 4 files changed, 34 insertions(+), 64 deletions(-) diff --git a/ijkmedia/ijkplayer/android/pipeline/ffpipenode_android_mediacodec_vdec.c b/ijkmedia/ijkplayer/android/pipeline/ffpipenode_android_mediacodec_vdec.c index edbdee51..dc5fc62e 100644 --- a/ijkmedia/ijkplayer/android/pipeline/ffpipenode_android_mediacodec_vdec.c +++ b/ijkmedia/ijkplayer/android/pipeline/ffpipenode_android_mediacodec_vdec.c @@ -312,9 +312,7 @@ static int feed_input_buffer(JNIEnv *env, IJKFF_Pipenode *node, int64_t timeUs, sdl_amedia_status_t amc_ret = 0; int ret = 0; ssize_t input_buffer_index = 0; - uint8_t* input_buffer_ptr = NULL; - size_t input_buffer_size = 0; - size_t copy_size = 0; + ssize_t copy_size = 0; int64_t time_stamp = 0; if (enqueue_count) @@ -506,16 +504,13 @@ static int feed_input_buffer(JNIEnv *env, IJKFF_Pipenode *node, int64_t timeUs, ffp_packet_queue_flush(&opaque->fake_pictq); } - input_buffer_ptr = SDL_AMediaCodec_getInputBuffer(opaque->acodec, input_buffer_index, &input_buffer_size); - if (!input_buffer_ptr) { + copy_size = SDL_AMediaCodec_writeInputData(opaque->acodec, input_buffer_index, d->pkt_temp.data, d->pkt_temp.size); + if (!copy_size) { ALOGE("%s: SDL_AMediaCodec_getInputBuffer failed\n", __func__); ret = -1; goto fail; } - copy_size = FFMIN(input_buffer_size, d->pkt_temp.size); - memcpy(input_buffer_ptr, d->pkt_temp.data, copy_size); - time_stamp = d->pkt_temp.pts; if (!time_stamp && d->pkt_temp.dts) time_stamp = d->pkt_temp.dts; @@ -537,7 +532,7 @@ static int feed_input_buffer(JNIEnv *env, IJKFF_Pipenode *node, int64_t timeUs, ++*enqueue_count; } - if (input_buffer_size < 0) { + if (copy_size < 0) { d->packet_pending = 0; } else { d->pkt_temp.dts = diff --git a/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.c b/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.c index 5fa00f39..ef7157bd 100644 --- a/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.c +++ b/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.c @@ -148,16 +148,10 @@ sdl_amedia_status_t SDL_AMediaCodec_flush(SDL_AMediaCodec* acodec) return acodec->func_flush(acodec); } -uint8_t* SDL_AMediaCodec_getInputBuffer(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size) +ssize_t SDL_AMediaCodec_writeInputData(SDL_AMediaCodec* acodec, size_t idx, const uint8_t *data, size_t size) { - assert(acodec->func_getInputBuffer); - return acodec->func_getInputBuffer(acodec, idx, out_size); -} - -uint8_t* SDL_AMediaCodec_getOutputBuffer(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size) -{ - assert(acodec->func_getOutputBuffer); - return acodec->func_getOutputBuffer(acodec, idx, out_size); + assert(acodec->func_writeInputData); + return acodec->func_writeInputData(acodec, idx, data, size); } ssize_t SDL_AMediaCodec_dequeueInputBuffer(SDL_AMediaCodec* acodec, int64_t timeoutUs) diff --git a/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.h b/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.h index 65ff4957..a519e95b 100644 --- a/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.h +++ b/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec.h @@ -76,8 +76,7 @@ typedef struct SDL_AMediaCodec sdl_amedia_status_t (*func_stop)(SDL_AMediaCodec* acodec); sdl_amedia_status_t (*func_flush)(SDL_AMediaCodec* acodec); - uint8_t* (*func_getInputBuffer)(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size); - uint8_t* (*func_getOutputBuffer)(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size); + ssize_t (*func_writeInputData)(SDL_AMediaCodec* acodec, size_t idx, const uint8_t *data, size_t size); ssize_t (*func_dequeueInputBuffer)(SDL_AMediaCodec* acodec, int64_t timeoutUs); sdl_amedia_status_t (*func_queueInputBuffer)(SDL_AMediaCodec* acodec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags); @@ -128,8 +127,7 @@ sdl_amedia_status_t SDL_AMediaCodec_start(SDL_AMediaCodec* acodec); sdl_amedia_status_t SDL_AMediaCodec_stop(SDL_AMediaCodec* acodec); sdl_amedia_status_t SDL_AMediaCodec_flush(SDL_AMediaCodec* acodec); -uint8_t* SDL_AMediaCodec_getInputBuffer(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size); -// uint8_t* SDL_AMediaCodec_getOutputBuffer(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size); +ssize_t SDL_AMediaCodec_writeInputData(SDL_AMediaCodec* acodec, size_t idx, const uint8_t *data, size_t size); ssize_t SDL_AMediaCodec_dequeueInputBuffer(SDL_AMediaCodec* acodec, int64_t timeoutUs); sdl_amedia_status_t SDL_AMediaCodec_queueInputBuffer(SDL_AMediaCodec* acodec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags); diff --git a/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec_java.c b/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec_java.c index 9c900bb7..4eda5e24 100644 --- a/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec_java.c +++ b/ijkmedia/ijksdl/android/ijksdl_codec_android_mediacodec_java.c @@ -36,8 +36,6 @@ static SDL_Class g_amediacodec_class = { typedef struct SDL_AMediaCodec_Opaque { jobject android_media_codec; - jobjectArray input_buffer_array; - jobject input_buffer; jobject output_buffer_info; bool is_input_buffer_valid; @@ -93,8 +91,6 @@ static sdl_amedia_status_t SDL_AMediaCodecJava_delete(SDL_AMediaCodec* acodec) } SDL_JNI_DeleteGlobalRefP(env, &opaque->output_buffer_info); - SDL_JNI_DeleteGlobalRefP(env, &opaque->input_buffer); - SDL_JNI_DeleteGlobalRefP(env, &opaque->input_buffer_array); SDL_JNI_DeleteGlobalRefP(env, &opaque->android_media_codec); } @@ -102,19 +98,6 @@ static sdl_amedia_status_t SDL_AMediaCodecJava_delete(SDL_AMediaCodec* acodec) return SDL_AMEDIA_OK; } -inline static int getInputBuffers(JNIEnv *env, SDL_AMediaCodec* acodec) -{ - SDL_AMediaCodec_Opaque *opaque = (SDL_AMediaCodec_Opaque *)acodec->opaque; - jobject android_media_codec = opaque->android_media_codec; - SDL_JNI_DeleteGlobalRefP(env, &opaque->input_buffer_array); - - opaque->input_buffer_array = JJKC_MediaCodec__getInputBuffers__asGlobalRef__catchAll(env, android_media_codec); - if (!opaque->input_buffer_array) - return -1; - - return 0; -} - static sdl_amedia_status_t SDL_AMediaCodecJava_configure_surface( JNIEnv*env, SDL_AMediaCodec* acodec, @@ -135,7 +118,6 @@ static sdl_amedia_status_t SDL_AMediaCodecJava_configure_surface( } opaque->is_input_buffer_valid = true; - SDL_JNI_DeleteGlobalRefP(env, &opaque->input_buffer_array); return SDL_AMEDIA_OK; } @@ -202,46 +184,48 @@ static sdl_amedia_status_t SDL_AMediaCodecJava_flush(SDL_AMediaCodec* acodec) return SDL_AMEDIA_OK; } -static uint8_t* SDL_AMediaCodecJava_getInputBuffer(SDL_AMediaCodec* acodec, size_t idx, size_t *out_size) +static ssize_t SDL_AMediaCodecJava_writeInputData(SDL_AMediaCodec* acodec, size_t idx, const uint8_t *data, size_t size) { AMCTRACE("%s", __func__); + ssize_t write_ret = -1; + jobject input_buffer_array = NULL; + jobject input_buffer = NULL; JNIEnv *env = NULL; if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) { ALOGE("%s: SetupThreadEnv failed", __func__); - return NULL; + return -1; } SDL_AMediaCodec_Opaque *opaque = (SDL_AMediaCodec_Opaque *)acodec->opaque; - if (0 != getInputBuffers(env, acodec)) - return NULL; + input_buffer_array = JJKC_MediaCodec__getInputBuffers__catchAll(env, opaque->android_media_codec); + if (!input_buffer_array) + return -1; - assert(opaque->input_buffer_array); - int buffer_count = (*env)->GetArrayLength(env, opaque->input_buffer_array); + int buffer_count = (*env)->GetArrayLength(env, input_buffer_array); if (JJK_ExceptionCheck__catchAll(env) || idx < 0 || idx >= buffer_count) { ALOGE("%s: idx(%d) < count(%d)\n", __func__, (int)idx, (int)buffer_count); - return NULL; + goto fail; } - SDL_JNI_DeleteGlobalRefP(env, &opaque->input_buffer); - jobject local_input_buffer = (*env)->GetObjectArrayElement(env, opaque->input_buffer_array, idx); - if (JJK_ExceptionCheck__catchAll(env) || !local_input_buffer) { + input_buffer = (*env)->GetObjectArrayElement(env, input_buffer_array, idx); + if (JJK_ExceptionCheck__catchAll(env) || !input_buffer) { ALOGE("%s: GetObjectArrayElement failed\n", __func__); - return NULL; - } - opaque->input_buffer = (*env)->NewGlobalRef(env, local_input_buffer); - SDL_JNI_DeleteLocalRefP(env, &local_input_buffer); - if (JJK_ExceptionCheck__catchAll(env) || !opaque->input_buffer) { - ALOGE("%s: GetObjectArrayElement.NewGlobalRef failed\n", __func__); - return NULL; + goto fail; } - jlong size = (*env)->GetDirectBufferCapacity(env, opaque->input_buffer); - void *ptr = (*env)->GetDirectBufferAddress(env, opaque->input_buffer); + { + jlong buf_size = (*env)->GetDirectBufferCapacity(env, input_buffer); + void *buf_ptr = (*env)->GetDirectBufferAddress(env, input_buffer); + + write_ret = size < buf_size ? size : buf_size; + memcpy(buf_ptr, data, write_ret); + } - if (out_size) - *out_size = size; - return ptr; +fail: + SDL_JNI_DeleteLocalRefP(env, &input_buffer); + SDL_JNI_DeleteLocalRefP(env, &input_buffer_array); + return write_ret; } ssize_t SDL_AMediaCodecJava_dequeueInputBuffer(SDL_AMediaCodec* acodec, int64_t timeoutUs) @@ -321,7 +305,6 @@ ssize_t SDL_AMediaCodecJava_dequeueOutputBuffer(SDL_AMediaCodec* acodec, SDL_AMe } if (idx == AMEDIACODEC__INFO_OUTPUT_BUFFERS_CHANGED) { ALOGI("%s: INFO_OUTPUT_BUFFERS_CHANGED\n", __func__); - SDL_JNI_DeleteGlobalRefP(env, &opaque->input_buffer_array); continue; } else if (idx == AMEDIACODEC__INFO_OUTPUT_FORMAT_CHANGED) { ALOGI("%s: INFO_OUTPUT_FORMAT_CHANGED\n", __func__); @@ -394,7 +377,7 @@ static SDL_AMediaCodec* SDL_AMediaCodecJava_init(JNIEnv *env, jobject android_me acodec->func_stop = SDL_AMediaCodecJava_stop; acodec->func_flush = SDL_AMediaCodecJava_flush; - acodec->func_getInputBuffer = SDL_AMediaCodecJava_getInputBuffer; + acodec->func_writeInputData = SDL_AMediaCodecJava_writeInputData; acodec->func_dequeueInputBuffer = SDL_AMediaCodecJava_dequeueInputBuffer; acodec->func_queueInputBuffer = SDL_AMediaCodecJava_queueInputBuffer; -- GitLab