[vlc-devel] [PATCH 03/11] mediacodec: split mc_api functions
Thomas Guillem
thomas at gllm.fr
Wed Aug 26 18:10:00 CEST 2015
Split put_in into dequeue_in and queue_in.
Split get_out into dequeue_out and get_out
---
modules/codec/omxil/mediacodec.c | 39 ++++++++---
modules/codec/omxil/mediacodec.h | 29 ++++++++-
modules/codec/omxil/mediacodec_jni.c | 122 +++++++++++++++++++++++------------
modules/codec/omxil/mediacodec_ndk.c | 122 +++++++++++++++++++++--------------
4 files changed, 211 insertions(+), 101 deletions(-)
diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
index 002dd45..7ec3504 100644
--- a/modules/codec/omxil/mediacodec.c
+++ b/modules/codec/omxil/mediacodec.c
@@ -747,10 +747,16 @@ static int PutInput(decoder_t *p_dec, block_t *p_block, mtime_t timeout)
i_ts = p_block->i_dts;
}
- i_ret = p_sys->api->put_in(p_sys->api, p_buf, i_size, i_ts, b_config,
- timeout);
- if (i_ret != 1)
- return i_ret;
+ i_ret = p_sys->api->dequeue_in(p_sys->api, timeout);
+ if (i_ret == MC_API_INFO_TRYAGAIN)
+ return 0;
+ else if (i_ret < 0)
+ return -1;
+
+ i_ret = p_sys->api->queue_in(p_sys->api, i_ret, p_buf, i_size, i_ts,
+ b_config);
+ if (i_ret != 0)
+ return -1;
if (p_sys->i_csd_send < p_sys->i_csd_count)
{
@@ -776,7 +782,7 @@ static int Video_GetOutput(decoder_t *p_dec, picture_t **pp_out_pic,
decoder_sys_t *p_sys = p_dec->p_sys;
mc_api_out out;
picture_t *p_pic = NULL;
- int i_ret;
+ int i_ret = 0, i_index;
assert(pp_out_pic && !pp_out_block);
@@ -808,7 +814,15 @@ static int Video_GetOutput(decoder_t *p_dec, picture_t **pp_out_pic,
}
}
- i_ret = p_sys->api->get_out(p_sys->api, &out, i_timeout);
+ i_index = p_sys->api->dequeue_out(p_sys->api, i_timeout);
+ if (i_index >= 0 || i_index == MC_API_INFO_OUTPUT_FORMAT_CHANGED
+ || i_index == MC_API_INFO_OUTPUT_BUFFERS_CHANGED)
+ i_ret = p_sys->api->get_out(p_sys->api, i_index, &out);
+ else if (i_index == MC_API_INFO_TRYAGAIN)
+ i_ret = 0;
+ else
+ i_ret = -1;
+
if (i_ret != 1)
goto end;
@@ -942,12 +956,21 @@ static int Audio_GetOutput(decoder_t *p_dec, picture_t **pp_out_pic,
{
decoder_sys_t *p_sys = p_dec->p_sys;
mc_api_out out;
- int i_ret;
+ int i_ret, i_index;
(void) p_abort;
assert(!pp_out_pic && pp_out_block);
- i_ret = p_sys->api->get_out(p_sys->api, &out, i_timeout);
+
+ i_index = p_sys->api->dequeue_out(p_sys->api, i_timeout);
+ if (i_index >= 0 || i_index == MC_API_INFO_OUTPUT_FORMAT_CHANGED
+ || i_index == MC_API_INFO_OUTPUT_BUFFERS_CHANGED)
+ i_ret = p_sys->api->get_out(p_sys->api, i_index, &out);
+ else if (i_index == MC_API_INFO_TRYAGAIN)
+ i_ret = 0;
+ else
+ i_ret = -1;
+
if (i_ret != 1)
return i_ret;
diff --git a/modules/codec/omxil/mediacodec.h b/modules/codec/omxil/mediacodec.h
index 3d071a2..4221a9c 100644
--- a/modules/codec/omxil/mediacodec.h
+++ b/modules/codec/omxil/mediacodec.h
@@ -35,6 +35,11 @@ char* MediaCodec_GetName(vlc_object_t *p_obj, const char *psz_mime,
int MediaCodecJni_Init(mc_api*);
int MediaCodecNdk_Init(mc_api*);
+#define MC_API_ERROR (-1)
+#define MC_API_INFO_TRYAGAIN (-11)
+#define MC_API_INFO_OUTPUT_FORMAT_CHANGED (-12)
+#define MC_API_INFO_OUTPUT_BUFFERS_CHANGED (-13)
+
struct mc_api_out
{
enum {
@@ -105,9 +110,27 @@ struct mc_api
union mc_api_args *p_args);
int (*stop)(mc_api *);
int (*flush)(mc_api *);
- int (*put_in)(mc_api *, const void *p_buf, size_t i_size,
- mtime_t i_ts, bool b_config, mtime_t i_timeout);
- int (*get_out)(mc_api *, mc_api_out *p_out, mtime_t i_timeout);
+
+ /* The Dequeue functions return:
+ * - The index of the input or output buffer if >= 0,
+ * - MC_API_INFO_TRYAGAIN if no buffers where dequeued during i_timeout,
+ * - MC_API_INFO_OUTPUT_FORMAT_CHANGED if output format changed
+ * - MC_API_INFO_OUTPUT_BUFFERS_CHANGED if buffers changed
+ * - MC_API_ERROR in case of error. */
+ int (*dequeue_in)(mc_api *, mtime_t i_timeout);
+ int (*dequeue_out)(mc_api *, mtime_t i_timeout);
+
+ /* i_index is the index returned by dequeue_in and should be >= 0
+ * Returns 0 if buffer is successfully queued, or MC_API_ERROR */
+ int (*queue_in)(mc_api *, int i_index, const void *p_buf, size_t i_size,
+ mtime_t i_ts, bool b_config);
+
+ /* i_index is the index returned by dequeue_out and should be >= 0,
+ * MC_API_INFO_OUTPUT_FORMAT_CHANGED, or MC_API_INFO_OUTPUT_BUFFERS_CHANGED.
+ * Returns 1 if p_out if valid, 0 if p_out is unchanged or MC_API_ERROR */
+ int (*get_out)(mc_api *, int i_index, mc_api_out *p_out);
+
+ /* i_index is the index returned by dequeue_out and should be >= 0 */
int (*release_out)(mc_api *, int i_index, bool b_render);
};
diff --git a/modules/codec/omxil/mediacodec_jni.c b/modules/codec/omxil/mediacodec_jni.c
index 641e48b..b928a6d 100644
--- a/modules/codec/omxil/mediacodec_jni.c
+++ b/modules/codec/omxil/mediacodec_jni.c
@@ -165,7 +165,7 @@ static inline bool check_exception(JNIEnv *env)
return false;
}
#define CHECK_EXCEPTION() check_exception( env )
-#define GET_ENV() if (!(env = android_getEnv(api->p_obj, THREAD_NAME))) return VLC_EGENERIC;
+#define GET_ENV() if (!(env = android_getEnv(api->p_obj, THREAD_NAME))) return MC_API_ERROR;
static inline int get_integer(JNIEnv *env, jobject obj, const char *psz_name)
{
@@ -461,7 +461,7 @@ static int Stop(mc_api *api)
p_sys->buffer_info = NULL;
}
msg_Dbg(api->p_obj, "MediaCodec via JNI closed");
- return VLC_SUCCESS;
+ return 0;
}
/*****************************************************************************
@@ -472,7 +472,7 @@ static int Start(mc_api *api, const char *psz_name, const char *psz_mime,
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv* env = NULL;
- int i_ret = VLC_EGENERIC;
+ int i_ret = MC_API_ERROR;
bool b_direct_rendering = false;
jstring jmime = NULL;
jstring jcodec_name = NULL;
@@ -600,7 +600,7 @@ static int Start(mc_api *api, const char *psz_name, const char *psz_mime,
p_sys->buffer_info = (*env)->NewGlobalRef(env, jbuffer_info);
api->b_direct_rendering = b_direct_rendering;
- i_ret = VLC_SUCCESS;
+ i_ret = 0;
msg_Dbg(api->p_obj, "MediaCodec via JNI opened");
error:
@@ -621,7 +621,7 @@ error:
if (jbuffer_info)
(*env)->DeleteLocalRef(env, jbuffer_info);
- if (i_ret != VLC_SUCCESS)
+ if (i_ret != 0)
Stop(api);
return i_ret;
}
@@ -640,48 +640,64 @@ static int Flush(mc_api *api)
if (CHECK_EXCEPTION())
{
msg_Warn(api->p_obj, "Exception occurred in MediaCodec.flush");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
- return VLC_SUCCESS;
+ return 0;
}
/*****************************************************************************
- * PutInput
+ * DequeueInput
*****************************************************************************/
-static int PutInput(mc_api *api, const void *p_buf, size_t i_size,
- mtime_t i_ts, bool b_config, mtime_t i_timeout)
+static int DequeueInput(mc_api *api, mtime_t i_timeout)
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv *env;
- int index;
- uint8_t *p_mc_buf;
- jobject j_mc_buf;
- jsize j_mc_size;
- jint jflags = b_config ? BUFFER_FLAG_CODEC_CONFIG : 0;
+ int i_index;
GET_ENV();
- index = (*env)->CallIntMethod(env, p_sys->codec,
- jfields.dequeue_input_buffer, i_timeout);
+ i_index = (*env)->CallIntMethod(env, p_sys->codec,
+ jfields.dequeue_input_buffer, i_timeout);
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception occurred in MediaCodec.dequeueInputBuffer");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
- if (index < 0)
- return 0;
+ if (i_index >= 0)
+ return i_index;
+ else
+ return MC_API_INFO_TRYAGAIN;
+
+}
+
+/*****************************************************************************
+ * QueueInput
+ *****************************************************************************/
+static int QueueInput(mc_api *api, int i_index, const void *p_buf,
+ size_t i_size, mtime_t i_ts, bool b_config)
+{
+ mc_api_sys *p_sys = api->p_sys;
+ JNIEnv *env;
+ uint8_t *p_mc_buf;
+ jobject j_mc_buf;
+ jsize j_mc_size;
+ jint jflags = b_config ? BUFFER_FLAG_CODEC_CONFIG : 0;
+
+ assert(i_index >= 0);
+
+ GET_ENV();
if (jfields.get_input_buffers)
j_mc_buf = (*env)->GetObjectArrayElement(env, p_sys->input_buffers,
- index);
+ i_index);
else
{
j_mc_buf = (*env)->CallObjectMethod(env, p_sys->codec,
- jfields.get_input_buffer, index);
+ jfields.get_input_buffer, i_index);
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception in MediaCodec.getInputBuffer");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
}
j_mc_size = (*env)->GetDirectBufferCapacity(env, j_mc_buf);
@@ -690,28 +706,28 @@ static int PutInput(mc_api *api, const void *p_buf, size_t i_size,
{
msg_Err(api->p_obj, "Java buffer has invalid size");
(*env)->DeleteLocalRef(env, j_mc_buf);
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
if ((size_t) j_mc_size > i_size)
j_mc_size = i_size;
memcpy(p_mc_buf, p_buf, j_mc_size);
(*env)->CallVoidMethod(env, p_sys->codec, jfields.queue_input_buffer,
- index, 0, j_mc_size, i_ts, jflags);
+ i_index, 0, j_mc_size, i_ts, jflags);
(*env)->DeleteLocalRef(env, j_mc_buf);
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception in MediaCodec.queueInputBuffer");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
- return 1;
+ return 0;
}
/*****************************************************************************
- * GetOutput
+ * DequeueOutput
*****************************************************************************/
-static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
+static int DequeueOutput(mc_api *api, mtime_t i_timeout)
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv *env;
@@ -724,8 +740,27 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception in MediaCodec.dequeueOutputBuffer");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
+ if (i_index >= 0)
+ return i_index;
+ else if (i_index == INFO_OUTPUT_FORMAT_CHANGED)
+ return MC_API_INFO_OUTPUT_FORMAT_CHANGED;
+ else if (i_index == INFO_OUTPUT_BUFFERS_CHANGED)
+ return MC_API_INFO_OUTPUT_BUFFERS_CHANGED;
+ else
+ return MC_API_INFO_TRYAGAIN;
+}
+
+/*****************************************************************************
+ * GetOutput
+ *****************************************************************************/
+static int GetOutput(mc_api *api, int i_index, mc_api_out *p_out)
+{
+ mc_api_sys *p_sys = api->p_sys;
+ JNIEnv *env;
+
+ GET_ENV();
if (i_index >= 0)
{
@@ -756,7 +791,7 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception in MediaCodec.getOutputBuffer");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
}
//jsize buf_size = (*env)->GetDirectBufferCapacity(env, buf);
@@ -770,8 +805,7 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
(*env)->DeleteLocalRef(env, buf);
}
return 1;
- }
- else if (i_index == INFO_OUTPUT_FORMAT_CHANGED)
+ } else if (i_index == MC_API_INFO_OUTPUT_FORMAT_CHANGED)
{
jobject format = NULL;
jobject format_string = NULL;
@@ -783,7 +817,7 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception in MediaCodec.getOutputFormat");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
format_string = (*env)->CallObjectMethod(env, format, jfields.tostring);
@@ -817,7 +851,7 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
(*env)->DeleteLocalRef(env, format);
return 1;
}
- else if (i_index == INFO_OUTPUT_BUFFERS_CHANGED)
+ else if (i_index == MC_API_INFO_OUTPUT_BUFFERS_CHANGED)
{
jobject joutput_buffers;
@@ -832,7 +866,7 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
{
msg_Err(api->p_obj, "Exception in MediaCodec.getOutputBuffer");
p_sys->output_buffers = NULL;
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
p_sys->output_buffers = (*env)->NewGlobalRef(env, joutput_buffers);
(*env)->DeleteLocalRef(env, joutput_buffers);
@@ -848,6 +882,8 @@ static int ReleaseOutput(mc_api *api, int i_index, bool b_render)
mc_api_sys *p_sys = api->p_sys;
JNIEnv *env;
+ assert(i_index >= 0);
+
GET_ENV();
(*env)->CallVoidMethod(env, p_sys->codec, jfields.release_output_buffer,
@@ -855,9 +891,9 @@ static int ReleaseOutput(mc_api *api, int i_index, bool b_render)
if (CHECK_EXCEPTION())
{
msg_Err(api->p_obj, "Exception in MediaCodec.releaseOutputBuffer");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
- return VLC_SUCCESS;
+ return 0;
}
/*****************************************************************************
@@ -878,22 +914,24 @@ int MediaCodecJni_Init(mc_api *api)
GET_ENV();
if (!InitJNIFields(api->p_obj, env))
- return VLC_EGENERIC;
+ return MC_API_ERROR;
api->p_sys = calloc(1, sizeof(mc_api_sys));
if (!api->p_sys)
- return VLC_EGENERIC;
+ return MC_API_ERROR;
api->clean = Clean;
api->start = Start;
api->stop = Stop;
api->flush = Flush;
- api->put_in = PutInput;
+ api->dequeue_in = DequeueInput;
+ api->queue_in = QueueInput;
+ api->dequeue_out = DequeueOutput;
api->get_out = GetOutput;
api->release_out = ReleaseOutput;
/* Allow interlaced picture only after API 21 */
api->b_support_interlaced = jfields.get_input_buffer
&& jfields.get_output_buffer;
- return VLC_SUCCESS;
+ return 0;
}
diff --git a/modules/codec/omxil/mediacodec_ndk.c b/modules/codec/omxil/mediacodec_ndk.c
index cf43253..6da00d5 100644
--- a/modules/codec/omxil/mediacodec_ndk.c
+++ b/modules/codec/omxil/mediacodec_ndk.c
@@ -262,6 +262,7 @@ struct mc_api_sys
{
AMediaCodec* p_codec;
AMediaFormat* p_format;
+ AMediaCodecBufferInfo info;
};
/*****************************************************************************
@@ -290,7 +291,7 @@ static int Stop(mc_api *api)
}
msg_Dbg(api->p_obj, "MediaCodec via NDK closed");
- return VLC_SUCCESS;
+ return 0;
}
/*****************************************************************************
@@ -300,7 +301,7 @@ static int Start(mc_api *api, const char *psz_name, const char *psz_mime,
union mc_api_args *p_args)
{
mc_api_sys *p_sys = api->p_sys;
- int i_ret = VLC_EGENERIC;
+ int i_ret = MC_API_ERROR;
ANativeWindow *p_anw = NULL;
p_sys->p_codec = syms.AMediaCodec.createCodecByName(psz_name);
@@ -348,11 +349,11 @@ static int Start(mc_api *api, const char *psz_name, const char *psz_mime,
api->b_started = true;
api->b_direct_rendering = !!p_anw;
- i_ret = VLC_SUCCESS;
+ i_ret = 0;
msg_Dbg(api->p_obj, "MediaCodec via NDK opened");
error:
- if (i_ret != VLC_SUCCESS)
+ if (i_ret != 0)
Stop(api);
return i_ret;
}
@@ -365,39 +366,48 @@ static int Flush(mc_api *api)
mc_api_sys *p_sys = api->p_sys;
if (syms.AMediaCodec.flush(p_sys->p_codec) == AMEDIA_OK)
- return VLC_SUCCESS;
+ return 0;
else
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
/*****************************************************************************
- * PutInput
+ * DequeueInput
*****************************************************************************/
-static int PutInput(mc_api *api, const void *p_buf, size_t i_size,
- mtime_t i_ts, bool b_config, mtime_t i_timeout)
+static int DequeueInput(mc_api *api, mtime_t i_timeout)
{
mc_api_sys *p_sys = api->p_sys;
ssize_t i_index;
- uint8_t *p_mc_buf;
- size_t i_mc_size;
- int i_flags = b_config ? AMEDIACODEC_FLAG_CODEC_CONFIG : 0;
i_index = syms.AMediaCodec.dequeueInputBuffer(p_sys->p_codec, i_timeout);
- if (i_index < 0)
+ if (i_index >= 0)
+ return i_index;
+ else if (i_index == AMEDIACODEC_INFO_TRY_AGAIN_LATER)
+ return MC_API_INFO_TRYAGAIN;
+ else
{
- if (i_index == AMEDIACODEC_INFO_TRY_AGAIN_LATER)
- return 0;
- else
- {
- msg_Err(api->p_obj, "AMediaCodec.dequeueInputBuffer failed");
- return VLC_EGENERIC;
- }
+ msg_Err(api->p_obj, "AMediaCodec.dequeueInputBuffer failed");
+ return MC_API_ERROR;
}
+}
+
+/*****************************************************************************
+ * QueueInput
+ *****************************************************************************/
+static int QueueInput(mc_api *api, int i_index, const void *p_buf,
+ size_t i_size, mtime_t i_ts, bool b_config)
+{
+ mc_api_sys *p_sys = api->p_sys;
+ uint8_t *p_mc_buf;
+ size_t i_mc_size;
+ int i_flags = b_config ? AMEDIACODEC_FLAG_CODEC_CONFIG : 0;
+
+ assert(i_index >= 0);
p_mc_buf = syms.AMediaCodec.getInputBuffer(p_sys->p_codec,
i_index, &i_mc_size);
if (!p_mc_buf)
- return VLC_EGENERIC;
+ return MC_API_ERROR;
if (i_mc_size > i_size)
i_mc_size = i_size;
@@ -405,11 +415,11 @@ static int PutInput(mc_api *api, const void *p_buf, size_t i_size,
if (syms.AMediaCodec.queueInputBuffer(p_sys->p_codec, i_index, 0, i_mc_size,
i_ts, i_flags) == AMEDIA_OK)
- return 1;
+ return 0;
else
{
msg_Err(api->p_obj, "AMediaCodec.queueInputBuffer failed");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
}
@@ -421,22 +431,44 @@ static int32_t GetFormatInteger(AMediaFormat *p_format, const char *psz_name)
}
/*****************************************************************************
- * GetOutput
+ * DequeueOutput
*****************************************************************************/
-static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
+static int DequeueOutput(mc_api *api, mtime_t i_timeout)
{
mc_api_sys *p_sys = api->p_sys;
- AMediaCodecBufferInfo info;
ssize_t i_index;
- i_index = syms.AMediaCodec.dequeueOutputBuffer(p_sys->p_codec, &info,
+ i_index = syms.AMediaCodec.dequeueOutputBuffer(p_sys->p_codec, &p_sys->info,
i_timeout);
+
+ if (i_index >= 0)
+ return i_index;
+ else if (i_index == AMEDIACODEC_INFO_TRY_AGAIN_LATER)
+ return MC_API_INFO_TRYAGAIN;
+ else if (i_index == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED)
+ return MC_API_INFO_OUTPUT_BUFFERS_CHANGED;
+ else if (i_index == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED)
+ return MC_API_INFO_OUTPUT_FORMAT_CHANGED;
+ else
+ {
+ msg_Err(api->p_obj, "AMediaCodec.dequeueOutputBuffer failed");
+ return MC_API_ERROR;
+ }
+}
+
+/*****************************************************************************
+ * GetOutput
+ *****************************************************************************/
+static int GetOutput(mc_api *api, int i_index, mc_api_out *p_out)
+{
+ mc_api_sys *p_sys = api->p_sys;
+
if (i_index >= 0)
{
p_out->type = MC_OUT_TYPE_BUF;
p_out->u.buf.i_index = i_index;
- p_out->u.buf.i_ts = info.presentationTimeUs;
+ p_out->u.buf.i_ts = p_sys->info.presentationTimeUs;
if (api->b_direct_rendering)
{
@@ -452,14 +484,14 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
if (!p_mc_buf)
{
msg_Err(api->p_obj, "AMediaCodec.getOutputBuffer failed");
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
- p_out->u.buf.p_ptr = p_mc_buf + info.offset;
- p_out->u.buf.i_size = info.size;
+ p_out->u.buf.p_ptr = p_mc_buf + p_sys->info.offset;
+ p_out->u.buf.i_size = p_sys->info.size;
}
return 1;
}
- else if (i_index == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED)
+ else if (i_index == MC_API_INFO_OUTPUT_FORMAT_CHANGED)
{
AMediaFormat *format = syms.AMediaCodec.getOutputFormat(p_sys->p_codec);
@@ -484,16 +516,7 @@ static int GetOutput(mc_api *api, mc_api_out *p_out, mtime_t i_timeout)
}
return 1;
}
- else if (i_index == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED
- || i_index == AMEDIACODEC_INFO_TRY_AGAIN_LATER)
- {
- return 0;
- }
- else
- {
- msg_Err(api->p_obj, "AMediaCodec.dequeueOutputBuffer failed");
- return VLC_EGENERIC;
- }
+ return 0;
}
/*****************************************************************************
@@ -503,11 +526,12 @@ static int ReleaseOutput(mc_api *api, int i_index, bool b_render)
{
mc_api_sys *p_sys = api->p_sys;
+ assert(i_index >= 0);
if (syms.AMediaCodec.releaseOutputBuffer(p_sys->p_codec, i_index, b_render)
== AMEDIA_OK)
- return VLC_SUCCESS;
+ return 0;
else
- return VLC_EGENERIC;
+ return MC_API_ERROR;
}
@@ -525,20 +549,22 @@ static void Clean(mc_api *api)
int MediaCodecNdk_Init(mc_api *api)
{
if (!InitSymbols(api))
- return VLC_EGENERIC;
+ return MC_API_ERROR;
api->p_sys = calloc(1, sizeof(mc_api_sys));
if (!api->p_sys)
- return VLC_EGENERIC;
+ return MC_API_ERROR;
api->clean = Clean;
api->start = Start;
api->stop = Stop;
api->flush = Flush;
- api->put_in = PutInput;
+ api->dequeue_in = DequeueInput;
+ api->queue_in = QueueInput;
+ api->dequeue_out = DequeueOutput;
api->get_out = GetOutput;
api->release_out = ReleaseOutput;
api->b_support_interlaced = true;
- return VLC_SUCCESS;
+ return 0;
}
--
2.1.4
More information about the vlc-devel
mailing list