Browse Source

mediacodec: separate configure behaviour from start

start was creating the codec, configuring it and eventually starting it
in the end. Splitting this behaviour into configure + start allows code
sharing with mediacodec encoder.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
pull/73/head
Alexandre Janniaux 8 years ago
committed by Jean-Baptiste Kempf
parent
commit
71a0e80e40
  1. 7
      modules/codec/omxil/mediacodec.c
  2. 3
      modules/codec/omxil/mediacodec.h
  3. 146
      modules/codec/omxil/mediacodec_jni.c
  4. 85
      modules/codec/omxil/mediacodec_ndk.c

7
modules/codec/omxil/mediacodec.c

@ -515,7 +515,12 @@ static int StartMediaCodec(decoder_t *p_dec)
args.audio.i_channel_count = p_sys->audio.i_channels;
}
return p_sys->api.start(&p_sys->api, &args);
if (p_sys->api.configure_decoder(&p_sys->api, &args) != 0)
{
return MC_API_ERROR;
}
return p_sys->api.start(&p_sys->api);
}
/*****************************************************************************

3
modules/codec/omxil/mediacodec.h

@ -126,7 +126,8 @@ struct mc_api
void (*clean)(mc_api *);
int (*prepare)(mc_api *, int i_profile);
int (*start)(mc_api *, union mc_api_args *p_args);
int (*configure_decoder)(mc_api *, union mc_api_args* p_args);
int (*start)(mc_api *);
int (*stop)(mc_api *);
int (*flush)(mc_api *);

146
modules/codec/omxil/mediacodec_jni.c

@ -479,56 +479,9 @@ loopclean:
}
/*****************************************************************************
* Stop
* ConfigureDecoder
*****************************************************************************/
static int Stop(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv *env;
api->b_direct_rendering = false;
GET_ENV();
if (p_sys->input_buffers)
{
(*env)->DeleteGlobalRef(env, p_sys->input_buffers);
p_sys->input_buffers = NULL;
}
if (p_sys->output_buffers)
{
(*env)->DeleteGlobalRef(env, p_sys->output_buffers);
p_sys->output_buffers = NULL;
}
if (p_sys->codec)
{
if (api->b_started)
{
(*env)->CallVoidMethod(env, p_sys->codec, jfields.stop);
if (CHECK_EXCEPTION())
msg_Err(api->p_obj, "Exception in MediaCodec.stop");
api->b_started = false;
}
(*env)->CallVoidMethod(env, p_sys->codec, jfields.release);
if (CHECK_EXCEPTION())
msg_Err(api->p_obj, "Exception in MediaCodec.release");
(*env)->DeleteGlobalRef(env, p_sys->codec);
p_sys->codec = NULL;
}
if (p_sys->buffer_info)
{
(*env)->DeleteGlobalRef(env, p_sys->buffer_info);
p_sys->buffer_info = NULL;
}
msg_Dbg(api->p_obj, "MediaCodec via JNI closed");
return 0;
}
/*****************************************************************************
* Start
*****************************************************************************/
static int Start(mc_api *api, union mc_api_args *p_args)
static int ConfigureDecoder(mc_api *api, union mc_api_args* p_args)
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv* env = NULL;
@ -538,9 +491,6 @@ static int Start(mc_api *api, union mc_api_args *p_args)
jstring jcodec_name = NULL;
jobject jcodec = NULL;
jobject jformat = NULL;
jobject jinput_buffers = NULL;
jobject joutput_buffers = NULL;
jobject jbuffer_info = NULL;
jobject jsurface = NULL;
assert(api->psz_mime && api->psz_name);
@ -599,6 +549,7 @@ static int Start(mc_api *api, union mc_api_args *p_args)
p_args->audio.i_sample_rate,
p_args->audio.i_channel_count);
}
/* No limits for input size */
SET_INTEGER(jformat, "max-input-size", 0);
@ -613,6 +564,8 @@ static int Start(mc_api *api, union mc_api_args *p_args)
"with an output surface.");
goto error;
}
api->b_direct_rendering = b_direct_rendering;
}
else
{
@ -623,7 +576,85 @@ static int Start(mc_api *api, union mc_api_args *p_args)
msg_Warn(api->p_obj, "Exception occurred in MediaCodec.configure");
goto error;
}
api->b_direct_rendering = false;
}
i_ret = 0;
error:
if (jmime)
(*env)->DeleteLocalRef(env, jmime);
if (jcodec_name)
(*env)->DeleteLocalRef(env, jcodec_name);
if (jcodec)
(*env)->DeleteLocalRef(env, jcodec);
if (jformat)
(*env)->DeleteLocalRef(env, jformat);
return i_ret;
}
/*****************************************************************************
* Stop
*****************************************************************************/
static int Stop(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv *env;
api->b_direct_rendering = false;
GET_ENV();
if (p_sys->input_buffers)
{
(*env)->DeleteGlobalRef(env, p_sys->input_buffers);
p_sys->input_buffers = NULL;
}
if (p_sys->output_buffers)
{
(*env)->DeleteGlobalRef(env, p_sys->output_buffers);
p_sys->output_buffers = NULL;
}
if (p_sys->codec)
{
if (api->b_started)
{
(*env)->CallVoidMethod(env, p_sys->codec, jfields.stop);
if (CHECK_EXCEPTION())
msg_Err(api->p_obj, "Exception in MediaCodec.stop");
api->b_started = false;
}
(*env)->CallVoidMethod(env, p_sys->codec, jfields.release);
if (CHECK_EXCEPTION())
msg_Err(api->p_obj, "Exception in MediaCodec.release");
(*env)->DeleteGlobalRef(env, p_sys->codec);
p_sys->codec = NULL;
}
if (p_sys->buffer_info)
{
(*env)->DeleteGlobalRef(env, p_sys->buffer_info);
p_sys->buffer_info = NULL;
}
msg_Dbg(api->p_obj, "MediaCodec via JNI closed");
return 0;
}
/*****************************************************************************
* Start
*****************************************************************************/
static int Start(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
JNIEnv* env = NULL;
jobject jinput_buffers = NULL;
jobject joutput_buffers = NULL;
jobject jbuffer_info = NULL;
GET_ENV();
int i_ret = MC_API_ERROR;
(*env)->CallVoidMethod(env, p_sys->codec, jfields.start);
if (CHECK_EXCEPTION())
@ -635,7 +666,6 @@ static int Start(mc_api *api, union mc_api_args *p_args)
if (jfields.get_input_buffers && jfields.get_output_buffers)
{
jinput_buffers = (*env)->CallObjectMethod(env, p_sys->codec,
jfields.get_input_buffers);
if (CHECK_EXCEPTION())
@ -658,19 +688,10 @@ static int Start(mc_api *api, union mc_api_args *p_args)
jfields.buffer_info_ctor);
p_sys->buffer_info = (*env)->NewGlobalRef(env, jbuffer_info);
api->b_direct_rendering = b_direct_rendering;
i_ret = 0;
msg_Dbg(api->p_obj, "MediaCodec via JNI opened");
error:
if (jmime)
(*env)->DeleteLocalRef(env, jmime);
if (jcodec_name)
(*env)->DeleteLocalRef(env, jcodec_name);
if (jcodec)
(*env)->DeleteLocalRef(env, jcodec);
if (jformat)
(*env)->DeleteLocalRef(env, jformat);
if (jinput_buffers)
(*env)->DeleteLocalRef(env, jinput_buffers);
if (joutput_buffers)
@ -1022,6 +1043,7 @@ int MediaCodecJni_Init(mc_api *api)
api->clean = Clean;
api->prepare = Prepare;
api->configure_decoder = ConfigureDecoder;
api->start = Start;
api->stop = Stop;
api->flush = Flush;

85
modules/codec/omxil/mediacodec_ndk.c

@ -279,41 +279,11 @@ struct mc_api_sys
};
/*****************************************************************************
* Stop
*****************************************************************************/
static int Stop(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
api->b_direct_rendering = false;
if (p_sys->p_codec)
{
if (api->b_started)
{
syms.AMediaCodec.stop(p_sys->p_codec);
api->b_started = false;
}
syms.AMediaCodec.delete(p_sys->p_codec);
p_sys->p_codec = NULL;
}
if (p_sys->p_format)
{
syms.AMediaFormat.delete(p_sys->p_format);
p_sys->p_format = NULL;
}
msg_Dbg(api->p_obj, "MediaCodec via NDK closed");
return 0;
}
/*****************************************************************************
* Start
* ConfigureDecoder
*****************************************************************************/
static int Start(mc_api *api, union mc_api_args *p_args)
static int ConfigureDecoder(mc_api *api, union mc_api_args *p_args)
{
mc_api_sys *p_sys = api->p_sys;
int i_ret = MC_API_ERROR;
ANativeWindow *p_anw = NULL;
assert(api->psz_mime && api->psz_name);
@ -323,14 +293,14 @@ static int Start(mc_api *api, union mc_api_args *p_args)
{
msg_Err(api->p_obj, "AMediaCodec.createCodecByName for %s failed",
api->psz_name);
goto error;
return MC_API_ERROR;
}
p_sys->p_format = syms.AMediaFormat.new();
if (!p_sys->p_format)
{
msg_Err(api->p_obj, "AMediaFormat.new failed");
goto error;
return MC_API_ERROR;
}
syms.AMediaFormat.setInt32(p_sys->p_format, "encoder", 0);
@ -363,8 +333,51 @@ static int Start(mc_api *api, union mc_api_args *p_args)
p_anw, NULL, 0) != AMEDIA_OK)
{
msg_Err(api->p_obj, "AMediaCodec.configure failed");
goto error;
return MC_API_ERROR;
}
api->b_direct_rendering = !!p_anw;
return 0;
}
/*****************************************************************************
* Stop
*****************************************************************************/
static int Stop(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
api->b_direct_rendering = false;
if (p_sys->p_codec)
{
if (api->b_started)
{
syms.AMediaCodec.stop(p_sys->p_codec);
api->b_started = false;
}
syms.AMediaCodec.delete(p_sys->p_codec);
p_sys->p_codec = NULL;
}
if (p_sys->p_format)
{
syms.AMediaFormat.delete(p_sys->p_format);
p_sys->p_format = NULL;
}
msg_Dbg(api->p_obj, "MediaCodec via NDK closed");
return 0;
}
/*****************************************************************************
* Start
*****************************************************************************/
static int Start(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
int i_ret = MC_API_ERROR;
if (syms.AMediaCodec.start(p_sys->p_codec) != AMEDIA_OK)
{
msg_Err(api->p_obj, "AMediaCodec.start failed");
@ -372,7 +385,6 @@ static int Start(mc_api *api, union mc_api_args *p_args)
}
api->b_started = true;
api->b_direct_rendering = !!p_anw;
i_ret = 0;
msg_Dbg(api->p_obj, "MediaCodec via NDK opened");
@ -634,6 +646,7 @@ int MediaCodecNdk_Init(mc_api *api)
api->clean = Clean;
api->prepare = Prepare;
api->configure_decoder = ConfigureDecoder;
api->start = Start;
api->stop = Stop;
api->flush = Flush;

Loading…
Cancel
Save