提交 c7ca0671 编写于 作者: Z Zhang Rui

ff_ffplay: support loop playback

上级 3216ab56
......@@ -618,6 +618,31 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer {
private native void _reset();
/**
* Sets the player to be looping or non-looping.
*
* @param looping whether to loop or not
*/
public void setLooping(boolean looping) {
int loopCount = looping ? 0 : 1;
setOption(OPT_CATEGORY_PLAYER, "loop", loopCount);
_setLoopCount(loopCount);
}
private native void _setLoopCount(int loopCount);
/**
* Checks whether the MediaPlayer is looping or non-looping.
*
* @return true if the MediaPlayer is currently looping, false otherwise
*/
public boolean isLooping() {
int loopCount = _getLoopCount();
return loopCount != 1;
}
private native int _getLoopCount();
public native void setVolume(float leftVolume, float rightVolume);
@Override
......
......@@ -306,6 +306,34 @@ IjkMediaPlayer_reset(JNIEnv *env, jobject thiz)
ijkmp_dec_ref_p(&mp);
}
static void
IjkMediaPlayer_setLoopCount(JNIEnv *env, jobject thiz, jint loop_count)
{
MPTRACE("%s\n", __func__);
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
JNI_CHECK_GOTO(mp, env, NULL, "mpjni: setLoopCount: null mp", LABEL_RETURN);
ijkmp_set_loop(mp, loop_count);
LABEL_RETURN:
ijkmp_dec_ref_p(&mp);
}
static jint
IjkMediaPlayer_getLoopCount(JNIEnv *env, jobject thiz)
{
jint loop_count = 1;
MPTRACE("%s\n", __func__);
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
JNI_CHECK_GOTO(mp, env, NULL, "mpjni: getLoopCount: null mp", LABEL_RETURN);
loop_count = ijkmp_get_loop(mp);
LABEL_RETURN:
ijkmp_dec_ref_p(&mp);
return loop_count;
}
static void
IjkMediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume)
{
......@@ -888,6 +916,8 @@ static JNINativeMethod g_methods[] = {
{ "_getVideoCodecInfo", "()Ljava/lang/String;", (void *) IjkMediaPlayer_getVideoCodecInfo },
{ "_getAudioCodecInfo", "()Ljava/lang/String;", (void *) IjkMediaPlayer_getAudioCodecInfo },
{ "_getMediaMeta", "()Landroid/os/Bundle;", (void *) IjkMediaPlayer_getMediaMeta },
{ "_setLoopCount", "(I)V", (void *) IjkMediaPlayer_setLoopCount },
{ "_getLoopCount", "()I", (void *) IjkMediaPlayer_getLoopCount },
{ "native_profileBegin", "(Ljava/lang/String;)V", (void *) IjkMediaPlayer_native_profileBegin },
{ "native_profileEnd", "()V", (void *) IjkMediaPlayer_native_profileEnd },
......
......@@ -130,7 +130,8 @@ static const AVOption ffp_context_options[] = {
{ "fast", "non spec compliant optimizations",
OPTION_OFFSET(fast), OPTION_INT(0, 0, 1) },
// FFP_MERGE: genpts, drp, lowres, sync, autoexit, exitonkeydown, exitonmousedown
// TODO: loop
{ "loop", "set number of times the playback shall be looped",
OPTION_OFFSET(loop), OPTION_INT(1, INT_MIN, INT_MAX) },
{ "infbuf", "don't limit the input buffer size (useful with realtime streams)",
OPTION_OFFSET(infinite_buffer), OPTION_INT(0, 0, 1) },
{ "framedrop", "drop frames when cpu is too slow",
......@@ -3603,6 +3604,22 @@ long ffp_get_playable_duration_l(FFPlayer *ffp)
return (long)ffp->playable_duration_ms;
}
void ffp_set_loop(FFPlayer *ffp, int loop)
{
assert(ffp);
if (!ffp)
return;
ffp->loop = loop;
}
int ffp_get_loop(FFPlayer *ffp)
{
assert(ffp);
if (!ffp)
return 1;
return ffp->loop;
}
void ffp_packet_queue_init(PacketQueue *q)
{
return packet_queue_init(q);
......
......@@ -65,6 +65,8 @@ int ffp_seek_to_l(FFPlayer *ffp, long msec);
long ffp_get_current_position_l(FFPlayer *ffp);
long ffp_get_duration_l(FFPlayer *ffp);
long ffp_get_playable_duration_l(FFPlayer *ffp);
void ffp_set_loop(FFPlayer *ffp, int loop);
int ffp_get_loop(FFPlayer *ffp);
/* for internal usage */
void ffp_packet_queue_init(PacketQueue *q);
......
......@@ -560,6 +560,23 @@ long ijkmp_get_playable_duration(IjkMediaPlayer *mp)
return retval;
}
void ijkmp_set_loop(IjkMediaPlayer *mp, int loop)
{
assert(mp);
pthread_mutex_lock(&mp->mutex);
ffp_set_loop(mp->ffplayer, loop);
pthread_mutex_unlock(&mp->mutex);
}
int ijkmp_get_loop(IjkMediaPlayer *mp)
{
assert(mp);
pthread_mutex_lock(&mp->mutex);
int loop = ffp_get_loop(mp->ffplayer);
pthread_mutex_unlock(&mp->mutex);
return loop;
}
void *ijkmp_get_weak_thiz(IjkMediaPlayer *mp)
{
return mp->weak_thiz;
......
......@@ -196,6 +196,8 @@ bool ijkmp_is_playing(IjkMediaPlayer *mp);
long ijkmp_get_current_position(IjkMediaPlayer *mp);
long ijkmp_get_duration(IjkMediaPlayer *mp);
long ijkmp_get_playable_duration(IjkMediaPlayer *mp);
void ijkmp_set_loop(IjkMediaPlayer *mp, int loop);
int ijkmp_get_loop(IjkMediaPlayer *mp);
void *ijkmp_get_weak_thiz(IjkMediaPlayer *mp);
void *ijkmp_set_weak_thiz(IjkMediaPlayer *mp, void *weak_thiz);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册