提交 7491f77c 编写于 作者: Z Zhang Rui

android/MediaCodec: replace getInputBuffer with writeInputData

上级 071724c2
......@@ -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 =
......
......@@ -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)
......
......@@ -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);
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册