Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
NotesChapter
ijkplayer
提交
2f3e5a59
I
ijkplayer
项目概览
NotesChapter
/
ijkplayer
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
ijkplayer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2f3e5a59
编写于
6月 17, 2013
作者:
Z
Zhang Rui
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ijkplayer: add MP_STATUS_xxx
上级
145d45dc
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
304 addition
and
46 deletion
+304
-46
ijkmediaplayer/jni/ijkplayer/ff_ffplay.c
ijkmediaplayer/jni/ijkplayer/ff_ffplay.c
+52
-0
ijkmediaplayer/jni/ijkplayer/ff_ffplay.h
ijkmediaplayer/jni/ijkplayer/ff_ffplay.h
+7
-0
ijkmediaplayer/jni/ijkplayer/ijkerror.h
ijkmediaplayer/jni/ijkplayer/ijkerror.h
+1
-1
ijkmediaplayer/jni/ijkplayer/ijkplayer.c
ijkmediaplayer/jni/ijkplayer/ijkplayer.c
+111
-28
ijkmediaplayer/jni/ijkplayer/ijkplayer.h
ijkmediaplayer/jni/ijkplayer/ijkplayer.h
+113
-14
ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c
ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c
+15
-3
ijkmediaplayer/src/tv/danmaku/ijk/media/player/IjkMediaException.java
...er/src/tv/danmaku/ijk/media/player/IjkMediaException.java
+5
-0
未找到文件。
ijkmediaplayer/jni/ijkplayer/ff_ffplay.c
浏览文件 @
2f3e5a59
...
...
@@ -23,6 +23,7 @@
#include "ff_ffplay.h"
#include "ff_cmdutils.h"
#include "ijkerror.h"
static
int
packet_queue_put
(
PacketQueue
*
q
,
AVPacket
*
pkt
);
...
...
@@ -2147,6 +2148,8 @@ static int read_thread(void *arg)
if
(
ffp
->
infinite_buffer
<
0
&&
is
->
realtime
)
ffp
->
infinite_buffer
=
1
;
// FIXME: post prepared event
for
(;;)
{
if
(
is
->
abort_request
)
break
;
...
...
@@ -2464,3 +2467,52 @@ void ijkff_global_uninit()
g_ffmpeg_global_inited
=
false
;
}
void
ijkff_destroy_ffplayer
(
FFPlayer
**
pffp
)
{
if
(
!
pffp
||
!*
pffp
)
return
;
FFPlayer
*
ffp
=
*
pffp
;
ijkff_reset
(
ffp
);
free
(
ffp
);
*
pffp
=
NULL
;
}
int
ijkff_stream_open
(
FFPlayer
*
ffp
,
const
char
*
file_name
)
{
assert
(
ffp
);
assert
(
file_name
);
assert
(
!
ffp
->
is
.
read_tid
);
VideoState
*
is
=
stream_open
(
ffp
,
file_name
,
NULL
);
if
(
!
is
)
return
EIJK_OUT_OF_MEMORY
;
return
0
;
}
int
ijkff_start
(
FFPlayer
*
ffp
)
{
assert
(
ffp
);
VideoState
*
is
=
&
ffp
->
is
;
if
(
is
->
paused
)
{
is
->
frame_timer
+=
av_gettime
()
/
1000000
.
0
+
is
->
video_current_pts_drift
-
is
->
video_current_pts
;
if
(
is
->
read_pause_return
!=
AVERROR
(
ENOSYS
))
{
is
->
video_current_pts
=
is
->
video_current_pts_drift
+
av_gettime
()
/
1000000
.
0
;
}
is
->
video_current_pts_drift
=
is
->
video_current_pts
-
av_gettime
()
/
1000000
.
0
;
}
update_external_clock_pts
(
is
,
get_external_clock
(
is
));
is
->
paused
=
0
;
return
0
;
}
int
ijkff_pause
(
FFPlayer
*
ffp
)
{
assert
(
ffp
);
VideoState
*
is
=
&
ffp
->
is
;
update_external_clock_pts
(
is
,
get_external_clock
(
is
));
is
->
paused
=
1
;
return
0
;
}
ijkmediaplayer/jni/ijkplayer/ff_ffplay.h
浏览文件 @
2f3e5a59
...
...
@@ -29,4 +29,11 @@
void
ijkff_global_init
();
void
ijkff_global_uninit
();
void
ijkff_destroy_ffplayer
(
FFPlayer
**
pffp
);
int
ijkff_stream_open
(
FFPlayer
*
ffp
,
const
char
*
file_name
);
int
ijkff_start
(
FFPlayer
*
ffp
);
int
ijkff_pause
(
FFPlayer
*
ffp
);
int
ijkff_stop
(
FFPlayer
*
ffp
);
#endif
ijkmediaplayer/jni/ijkplayer/ijkerror.h
浏览文件 @
2f3e5a59
...
...
@@ -24,8 +24,8 @@
#ifndef IJKPLAYER__IJKERROR_H
#define IJKPLAYER__IJKERROR_H
#define EIJK_OK 0
#define EIJK_FAILED -1
#define EIJK_OUT_OF_MEMORY -2
#define EIJK_INVALID_STATE -3
#endif
ijkmediaplayer/jni/ijkplayer/ijkplayer.c
浏览文件 @
2f3e5a59
...
...
@@ -26,6 +26,39 @@
#include "ijkerror.h"
#include "ff_ffplay.h"
#define MPST_CHECK_NOT_RET_INT(real, expected, errcode) \
do { \
if (real == expected) return errcode; \
} while(0)
#define MPST_CHECK_NOT_RET(real, expected) \
MPST_CHECK_NOT_RET_INT(real, expected, EIJK_INVALID_STATE)
typedef
struct
IjkMediaPlayer
{
volatile
int
ref_count
;
FFPlayer
*
ffplayer
;
int
mp_state
;
char
*
data_source
;
}
IjkMediaPlayer
;
inline
static
void
destroy_mp
(
IjkMediaPlayer
**
pmp
)
{
if
(
!
pmp
)
return
;
IjkMediaPlayer
*
mp
=
*
pmp
;
if
(
!
mp
)
return
;
ijkff_destroy_ffplayer
(
&
mp
->
ffplayer
);
free
(
mp
->
data_source
);
memset
(
mp
,
0
,
sizeof
(
IjkMediaPlayer
));
free
(
mp
);
*
pmp
=
NULL
;
}
void
ijkmp_global_init
()
{
ijkff_global_init
();
...
...
@@ -61,16 +94,7 @@ IjkMediaPlayer *ijkmp_create()
void
ijkmp_shutdown
(
IjkMediaPlayer
*
mp
)
{
assert
(
mp
);
// FIXME: implement
}
inline
static
void
ijkmp_free
(
IjkMediaPlayer
*
mp
)
{
memset
(
mp
->
ffplayer
,
0
,
sizeof
(
FFPlayer
));
free
(
mp
->
ffplayer
);
memset
(
mp
,
0
,
sizeof
(
IjkMediaPlayer
));
free
(
mp
);
// FIXME: implement
}
void
ijkmp_inc_ref
(
IjkMediaPlayer
*
mp
)
...
...
@@ -87,74 +111,133 @@ void ijkmp_dec_ref(IjkMediaPlayer **pmp)
int
ref_count
=
__sync_fetch_and_sub
(
&
mp
->
ref_count
,
1
);
if
(
ref_count
==
0
)
{
ijkmp_shutdown
(
mp
);
ijkmp_free
(
mp
);
destroy_mp
(
&
mp
);
}
*
pmp
=
NULL
;
}
void
ijkmp_set_data_source
(
IjkMediaPlayer
*
mp
,
const
char
*
url
)
int
ijkmp_set_data_source
(
IjkMediaPlayer
*
mp
,
const
char
*
url
)
{
// FIXME: implement
assert
(
mp
);
assert
(
url
);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_IDLE);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_INITIALIZED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_ASYNC_PREPARING
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_PREPARED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_STARTED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_PAUSED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_COMPLETED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_STOPPED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_ERROR
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_END
);
char
*
dup_url
=
strdup
(
url
);
if
(
!
dup_url
)
return
EIJK_OUT_OF_MEMORY
;
free
(
mp
->
data_source
);
mp
->
data_source
=
dup_url
;
mp
->
mp_state
=
MP_STATE_INITIALIZED
;
return
0
;
}
void
ijkmp_prepare_async
(
IjkMediaPlayer
*
mp
)
int
ijkmp_prepare_async
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
assert
(
mp
);
assert
(
url
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_IDLE
);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_INITIALIZED);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_ASYNC_PREPARING
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_PREPARED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_STARTED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_PAUSED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_COMPLETED
);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STOPPED);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_ERROR
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_END
);
assert
(
mp
->
data_source
);
int
retval
=
ijkff_stream_open
(
mp
->
ffplayer
,
mp
->
data_source
);
if
(
retval
<
0
)
{
mp
->
mp_state
=
MP_STATE_ERROR
;
return
retval
;
}
mp
->
mp_state
=
MP_STATE_ASYNC_PREPARING
;
return
0
;
}
void
ijkmp_start
(
IjkMediaPlayer
*
mp
)
int
ijkmp_start
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
assert
(
mp
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_IDLE
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_INITIALIZED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_ASYNC_PREPARING
);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PREPARED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STARTED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PAUSED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_COMPLETED);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_STOPPED
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_ERROR
);
MPST_CHECK_NOT_RET
(
mp
->
mp_state
,
MP_STATE_END
);
assert
(
mp
->
data_source
);
return
0
;
}
void
ijkmp_
stop
(
IjkMediaPlayer
*
mp
)
void
ijkmp_
pause
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
}
void
ijkmp_
pause
(
IjkMediaPlayer
*
mp
)
void
ijkmp_
stop
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
}
int
ijkmp_get_video_width
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
return
0
;
}
int
ijkmp_get_video_height
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
return
0
;
}
void
ijkmp_seek_to
(
IjkMediaPlayer
*
mp
,
int
msec
)
{
// FIXME: implement
// FIXME: implement
}
bool
ijkmp_is_playing
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
return
false
;
}
int
ijkmp_get_current_position
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
return
0
;
}
int
ijkmp_get_duration
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
return
0
;
}
void
ijkmp_reset
(
IjkMediaPlayer
*
mp
)
{
// FIXME: implement
// FIXME: implement
}
void
ijkmp_set_vout
(
IjkMediaPlayer
*
mp
,
SDL_Vout
*
vout
)
...
...
ijkmediaplayer/jni/ijkplayer/ijkplayer.h
浏览文件 @
2f3e5a59
...
...
@@ -29,10 +29,109 @@ struct IjkMediaPlayer;
typedef
struct
FFPlayer
FFPlayer
;
typedef
struct
SDL_Vout
SDL_Vout
;
typedef
struct
IjkMediaPlayer
{
volatile
int
ref_count
;
FFPlayer
*
ffplayer
;
}
IjkMediaPlayer
;
/*-
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_IDLE);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_INITIALIZED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ASYNC_PREPARING);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PREPARED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STARTED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PAUSED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_COMPLETED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STOPPED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ERROR);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_END);
*/
/*-
* ijkmp_set_data_source() -> MP_STATE_INITIALIZED
*
* ijkmp_reset -> self
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_IDLE 0
/*-
* ijkmp_prepare_async() -> MP_STATE_ASYNC_PREPARING
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_INITIALIZED 1
/*-
* ... -> MP_STATE_PREPARED
* ... -> MP_STATE_ERROR
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_ASYNC_PREPARING 2
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> MP_STATE_STARTED
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_PREPARED 3
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> self
* ijkmp_pause() -> MP_STATE_PAUSED
* ijkmp_stop() -> MP_STATE_STOPPED
* ... -> MP_STATE_COMPLETED
* ... -> MP_STATE_ERROR
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_STARTED 4
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> MP_STATE_STARTED
* ijkmp_pause() -> self
* ijkmp_stop() -> MP_STATE_STOPPED
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_PAUSED 5
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> MP_STATE_STARTED (from beginning)
* ijkmp_pause() -> self
* ijkmp_stop() -> MP_STATE_STOPPED
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_COMPLETED 6
/*-
* ijkmp_stop() -> self
* ijkmp_prepare_async() -> MP_STATE_ASYNC_PREPARING
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_STOPPED 7
/*-
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_ERROR 8
/*-
* ijkmp_release -> self
*/
#define MP_STATE_END 9
typedef
struct
IjkMediaPlayer
IjkMediaPlayer
;
// ref_count is 1 after open
IjkMediaPlayer
*
ijkmp_create
();
...
...
@@ -50,20 +149,20 @@ void ijkmp_inc_ref(IjkMediaPlayer *mp);
// NOTE: ijkmp_dec_ref may block thread
void
ijkmp_dec_ref
(
IjkMediaPlayer
**
pmp
);
void
ijkmp_set_data_source
(
IjkMediaPlayer
*
mp
,
const
char
*
url
);
void
ijkmp_prepare_async
(
IjkMediaPlayer
*
mp
);
void
ijkmp_start
(
IjkMediaPlayer
*
mp
);
void
ijkmp_stop
(
IjkMediaPlayer
*
mp
);
void
ijkmp_pause
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_video_width
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_video_height
(
IjkMediaPlayer
*
mp
);
int
ijkmp_set_data_source
(
IjkMediaPlayer
*
mp
,
const
char
*
url
);
int
ijkmp_prepare_async
(
IjkMediaPlayer
*
mp
);
int
ijkmp_start
(
IjkMediaPlayer
*
mp
);
int
ijkmp_pause
(
IjkMediaPlayer
*
mp
);
int
ijkmp_stop
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_video_width
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_video_height
(
IjkMediaPlayer
*
mp
);
void
ijkmp_seek_to
(
IjkMediaPlayer
*
mp
,
int
msec
);
bool
ijkmp_is_playing
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_current_position
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_duration
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_current_position
(
IjkMediaPlayer
*
mp
);
int
ijkmp_get_duration
(
IjkMediaPlayer
*
mp
);
void
ijkmp_reset
(
IjkMediaPlayer
*
mp
);
void
ijkmp_set_vout
(
IjkMediaPlayer
*
mp
,
SDL_Vout
*
vout
);
void
ijkmp_set_vout
(
IjkMediaPlayer
*
mp
,
SDL_Vout
*
vout
);
SDL_Vout
*
ijkmp_get_vout
(
IjkMediaPlayer
*
mp
);
#endif
ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c
浏览文件 @
2f3e5a59
...
...
@@ -27,9 +27,16 @@
#include "ijksdl/ijksdl.h"
#include "ijkutil/ijkutil.h"
#include "ijkplayer.h"
#include "ijkerror.h"
#define JNI_MODULE_PACKAGE "tv/danmaku/ijk/media/player"
#define JNI_CLASS_IJKPLAYER "tv/danmaku/ijk/media/player/IjkMediaPlayer"
#define JNI_IJK_MEDIA_EXCEPTION "tv/danmaku/ijk/media/player/IjkMediaException"
#define IJK_CHECK_MPRET_GOTO(retval, env, label) \
JNI_CHECK_GOTO((retval != EIJK_INVALID_STATE), env, "java/lang/IllegalStateException", NULL, LABEL_RETURN); \
JNI_CHECK_GOTO((retval != EIJK_OUT_OF_MEMORY), env, "java/lang/OutOfMemoryError", NULL, LABEL_RETURN); \
JNI_CHECK_GOTO((retval < 0), env, JNI_IJK_MEDIA_EXCEPTION, NULL, LABEL_RETURN);
typedef
struct
player_fields_t
{
pthread_mutex_t
mutex
;
...
...
@@ -81,6 +88,7 @@ IjkMediaPlayer_setDataSourceAndHeaders(
JNIEnv
*
env
,
jobject
thiz
,
jstring
path
,
jobjectArray
keys
,
jobjectArray
values
)
{
int
retval
=
0
;
const
char
*
c_path
=
NULL
;
IjkMediaPlayer
*
mp
=
jni_get_media_player
(
env
,
thiz
);
JNI_CHECK_GOTO
(
path
,
env
,
"java/lang/IllegalArgumentException"
,
"mpjni: setDataSource: null path"
,
LABEL_RETURN
);
...
...
@@ -90,9 +98,11 @@ IjkMediaPlayer_setDataSourceAndHeaders(
JNI_CHECK_GOTO
(
c_path
,
env
,
"java/lang/OutOfMemoryError"
,
"mpjni: setDataSource: path.string oom"
,
LABEL_RETURN
);
ALOGV
(
"setDataSource: path %s"
,
c_path
);
ijkmp_set_data_source
(
mp
,
c_path
);
retval
=
ijkmp_set_data_source
(
mp
,
c_path
);
(
*
env
)
->
ReleaseStringUTFChars
(
env
,
path
,
c_path
);
IJK_CHECK_MPRET_GOTO
(
retval
,
env
,
LABEL_RETURN
);
LABEL_RETURN:
ijkmp_dec_ref
(
&
mp
);
}
...
...
@@ -116,10 +126,12 @@ IjkMediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
static
void
IjkMediaPlayer_prepareAsync
(
JNIEnv
*
env
,
jobject
thiz
)
{
int
retval
=
0
;
IjkMediaPlayer
*
mp
=
jni_get_media_player
(
env
,
thiz
);
JNI_CHECK_GOTO
(
mp
,
env
,
"java/lang/IllegalStateException"
,
"mpjni: prepareAsync: null mp"
,
LABEL_RETURN
);
ijkmp_prepare_async
(
mp
);
retval
=
ijkmp_prepare_async
(
mp
);
IJK_CHECK_MPRET_GOTO
(
retval
,
env
,
LABEL_RETURN
);
LABEL_RETURN:
ijkmp_dec_ref
(
&
mp
);
...
...
@@ -280,7 +292,7 @@ IjkMediaPlayer_reset(JNIEnv *env, jobject thiz)
static
void
IjkMediaPlayer_native_init
(
JNIEnv
*
env
)
{
// FIXME: implement
// FIXME: implement
}
static
void
...
...
ijkmediaplayer/src/tv/danmaku/ijk/media/player/IjkMediaException.java
0 → 100644
浏览文件 @
2f3e5a59
package
tv.danmaku.ijk.media.player
;
public
class
IjkMediaException
extends
Exception
{
private
static
final
long
serialVersionUID
=
7234796519009099506L
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录