提交 6ce7af47 编写于 作者: B bbcallen

ffplay: support options

上级 c225a139
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry combineaccessrules="false" kind="src" path="/ijkmediawidget"/>
<classpathentry combineaccessrules="false" kind="src" path="/ijkmediaplayer"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/ijkmediawidget"/>
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/ijkmediaplayer"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
......@@ -66,6 +66,9 @@ public class VideoPlayerActivity extends Activity {
// invalid variant
mVideoPath = "http://64k.kankanews.com/hls-smgvod/2013/06/30/f969bb5169365989b2e9bace44353a2b.m3u8";
// segment 404
mVideoPath = "http://live.gslb.letv.com/gslb?stream_id=btv6_800&tag=live&ext=m3u8"
// 720p sina
mVideoPath = "http://edge.v.iask.com/101692214.hlv?KID=sina,viask&Expires=1374249600&ssig=8dvnUJ%2Fb2n"
......@@ -78,7 +81,7 @@ public class VideoPlayerActivity extends Activity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
mVideoPath = "http://v.youku.com/player/getM3U8/vid/XNTY1ODE5NjMy/type//v.m3u8";
mVideoPath = "http://live.gslb.letv.com/gslb?stream_id=btv6_800&tag=live&ext=m3u8";
Intent intent = getIntent();
String intentAction = intent.getAction();
......
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
......@@ -22,7 +22,7 @@ import java.io.IOException;
import java.lang.ref.WeakReference;
import tv.danmaku.ijk.media.player.annotations.AccessedByNative;
import tv.danmaku.ijk.media.player.option.AvFormatOption;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.SurfaceTexture;
......@@ -323,6 +323,16 @@ public final class IjkMediaPlayer extends SimpleMediaPlayer {
}
private native void _reset();
public void setAvOption(AvFormatOption option) {
setAvFormatOption(option.getName(), option.getValue());
}
public void setAvFormatOption(String name, String value) {
_setAvFormatOption(name, value);
}
private native void _setAvFormatOption(String name, String value);
@Override
public void setAudioStreamType(int streamtype) {
......
package tv.danmaku.ijk.media.player.option;
public interface AvFormatOption {
public abstract String getName();
public abstract String getValue();
}
package tv.danmaku.ijk.media.player.option.format;
import tv.danmaku.ijk.media.player.option.AvFormatOption;
// some video servers do not accept "Range: bytes=0-"
public final class AvFormatOption_HttpDetectRangeSupport implements
AvFormatOption {
public static AvFormatOption_HttpDetectRangeSupport Enable = new AvFormatOption_HttpDetectRangeSupport(
"1");
public static AvFormatOption_HttpDetectRangeSupport Disable = new AvFormatOption_HttpDetectRangeSupport(
"0");
private final String mValue;
public AvFormatOption_HttpDetectRangeSupport(String value) {
mValue = value;
}
public String getName() {
return "http-detect-range-support";
}
public String getValue() {
return mValue;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry combineaccessrules="false" kind="src" path="/ijkmediaplayer"/>
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/ijkmediaplayer"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
......@@ -31,6 +31,7 @@ import tv.danmaku.ijk.media.player.AbstractMediaPlayer.OnSeekCompleteListener;
import tv.danmaku.ijk.media.player.AbstractMediaPlayer.OnVideoSizeChangedListener;
import tv.danmaku.ijk.media.player.AndroidMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
import tv.danmaku.ijk.media.player.option.format.AvFormatOption_HttpDetectRangeSupport;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
......@@ -244,7 +245,10 @@ public class VideoView extends SurfaceView implements
mDuration = -1;
mCurrentBufferPercentage = 0;
// mMediaPlayer = new AndroidMediaPlayer();
mMediaPlayer = new IjkMediaPlayer();
IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();
ijkMediaPlayer.setAvOption(AvFormatOption_HttpDetectRangeSupport.Disable);
mMediaPlayer = ijkMediaPlayer;
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mCompletionListener);
......@@ -255,6 +259,7 @@ public class VideoView extends SurfaceView implements
mMediaPlayer.setDataSource(mUri.toString());
mMediaPlayer.setDisplay(mSurfaceHolder);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.prepareAsync();
mCurrentState = STATE_PREPARING;
attachMediaController();
......
......@@ -160,6 +160,17 @@ void ijkmp_reset(IjkMediaPlayer *mp)
MPTRACE("ijkmp_reset()=void");
}
void ijkmp_set_format_option(IjkMediaPlayer *mp, const char *name, const char *value)
{
assert(mp);
MPTRACE("ijkmp_reset()");
pthread_mutex_lock(&mp->mutex);
ffp_set_format_option(mp->ffplayer, name, value);
pthread_mutex_unlock(&mp->mutex);
MPTRACE("ijkmp_reset()=void");
}
void ijkmp_inc_ref(IjkMediaPlayer *mp)
{
assert(mp);
......
......@@ -169,6 +169,8 @@ long ijkmp_get_current_position(IjkMediaPlayer *mp);
long ijkmp_get_duration(IjkMediaPlayer *mp);
void ijkmp_reset(IjkMediaPlayer *mp);
void ijkmp_set_format_option(IjkMediaPlayer *mp, const char *name, const char *value);
void ijkmp_set_android_surface(JNIEnv *env, IjkMediaPlayer *mp, jobject android_surface);
void *ijkmp_set_weak_thiz(IjkMediaPlayer *mp, void *weak_thiz);
......
......@@ -261,6 +261,31 @@ IjkMediaPlayer_reset(JNIEnv *env, jobject thiz)
ijkmp_dec_ref_p(&mp);
}
static void
IjkMediaPlayer_setAvFormatOption(JNIEnv *env, jobject thiz, jobject name, jobject value)
{
MPTRACE("IjkMediaPlayer_setAvFormatOption");
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
const char *c_name = NULL;
const char *c_value = NULL;
JNI_CHECK_GOTO(mp, env, "java/lang/IllegalStateException", "mpjni: setAvFormatOption: null mp", LABEL_RETURN);
c_name = (*env)->GetStringUTFChars(env, name, NULL);
JNI_CHECK_GOTO(c_name, env, "java/lang/OutOfMemoryError", "mpjni: setAvFormatOption: name.string oom", LABEL_RETURN);
c_value = (*env)->GetStringUTFChars(env, value, NULL);
JNI_CHECK_GOTO(c_name, env, "java/lang/OutOfMemoryError", "mpjni: setAvFormatOption: name.string oom", LABEL_RETURN);
ijkmp_set_format_option(mp, c_name, c_value);
LABEL_RETURN:
if (c_name)
(*env)->ReleaseStringUTFChars(env, name, c_name);
if (c_value)
(*env)->ReleaseStringUTFChars(env, value, c_value);
ijkmp_dec_ref_p(&mp);
}
static void
IjkMediaPlayer_native_init(JNIEnv *env)
{
......@@ -282,10 +307,9 @@ IjkMediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
}
static void
IjkMediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
IjkMediaPlayer_native_finalize(JNIEnv *env, jobject thiz, jobject name, jobject value)
{
MPTRACE("IjkMediaPlayer_native_finalize");
// TODO: 9 is there any thing not released ?
IjkMediaPlayer_release(env, thiz);
}
......@@ -408,6 +432,8 @@ static JNINativeMethod g_methods[] = {
{ "native_init", "()V", (void *) IjkMediaPlayer_native_init },
{ "native_setup", "(Ljava/lang/Object;)V", (void *) IjkMediaPlayer_native_setup },
{ "native_finalize", "()V", (void *) IjkMediaPlayer_native_finalize },
{ "_setAvFormatOption", "(Ljava/lang/String;Ljava/lang/String;)V", (void *) IjkMediaPlayer_setAvFormatOption },
};
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
......
......@@ -1871,9 +1871,6 @@ static int read_thread(void *arg)
is->last_subtitle_stream = is->subtitle_stream = -1;
#endif
// TODO: 8 set options from java side
// av_dict_set(&ffp->format_opts, "timeout", "10000000", 0);
ic = avformat_alloc_context();
ic->interrupt_callback.callback = decode_interrupt_cb;
ic->interrupt_callback.opaque = is;
......@@ -2496,6 +2493,14 @@ void ffp_destroy_p(FFPlayer **pffp)
*pffp = NULL;
}
void ffp_set_format_option(FFPlayer *ffp, const char *name, const char *value)
{
if (!ffp)
return;
av_dict_set(&ffp->format_opts, name, value, 0);
}
int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name)
{
assert(ffp);
......
......@@ -36,6 +36,8 @@ void ffp_destroy(FFPlayer *ffp);
void ffp_destroy_p(FFPlayer **pffp);
void ffp_reset(FFPlayer *ffp);
void ffp_set_format_option(FFPlayer *ffp, const char *name, const char *value);
int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name);
int ffp_start_from_l(FFPlayer *ffp, long msec);
int ffp_start_l(FFPlayer *ffp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册