Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
NotesChapter
ijkplayer
提交
1a3ef752
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,发现更多精彩内容 >>
提交
1a3ef752
编写于
6月 08, 2013
作者:
Z
Zhang Rui
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
jni: ijkplayer: use ffmpeg locking api
上级
6e0a693d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
188 addition
and
192 deletion
+188
-192
ijkmediaplayer/jni/ijkplayer/ffplay_pkt_queue.c
ijkmediaplayer/jni/ijkplayer/ffplay_pkt_queue.c
+1
-144
ijkmediaplayer/jni/ijkplayer/ffplay_pkt_queue.h
ijkmediaplayer/jni/ijkplayer/ffplay_pkt_queue.h
+142
-8
ijkmediaplayer/jni/ijkplayer/ffplay_read_thread.c
ijkmediaplayer/jni/ijkplayer/ffplay_read_thread.c
+4
-4
ijkmediaplayer/jni/ijkplayer/ffplayer.c
ijkmediaplayer/jni/ijkplayer/ffplayer.c
+41
-19
ijkmediaplayer/jni/ijkplayer/ffplayer.h
ijkmediaplayer/jni/ijkplayer/ffplayer.h
+0
-17
未找到文件。
ijkmediaplayer/jni/ijkplayer/ffplay_pkt_queue.c
浏览文件 @
1a3ef752
...
@@ -24,147 +24,4 @@
...
@@ -24,147 +24,4 @@
#include "ffplay_pkt_queue.h"
#include "ffplay_pkt_queue.h"
static
AVPacket
flush_pkt
;
AVPacket
flush_pkt
;
int
packet_queue_put
(
PacketQueue
*
q
,
AVPacket
*
pkt
);
static
int
packet_queue_put_private
(
PacketQueue
*
q
,
AVPacket
*
pkt
)
{
MyAVPacketList
*
pkt1
;
if
(
q
->
abort_request
)
return
-
1
;
pkt1
=
av_malloc
(
sizeof
(
MyAVPacketList
));
if
(
!
pkt1
)
return
-
1
;
pkt1
->
pkt
=
*
pkt
;
pkt1
->
next
=
NULL
;
if
(
pkt
==
&
flush_pkt
)
q
->
serial
++
;
pkt1
->
serial
=
q
->
serial
;
if
(
!
q
->
last_pkt
)
q
->
first_pkt
=
pkt1
;
else
q
->
last_pkt
->
next
=
pkt1
;
q
->
last_pkt
=
pkt1
;
q
->
nb_packets
++
;
q
->
size
+=
pkt1
->
pkt
.
size
+
sizeof
(
*
pkt1
);
/* XXX: should duplicate packet data in DV case */
SDL_CondSignal
(
q
->
cond
);
return
0
;
}
int
packet_queue_put
(
PacketQueue
*
q
,
AVPacket
*
pkt
)
{
int
ret
;
/* duplicate the packet */
if
(
pkt
!=
&
flush_pkt
&&
av_dup_packet
(
pkt
)
<
0
)
return
-
1
;
SDL_LockMutex
(
q
->
mutex
);
ret
=
packet_queue_put_private
(
q
,
pkt
);
SDL_UnlockMutex
(
q
->
mutex
);
if
(
pkt
!=
&
flush_pkt
&&
ret
<
0
)
av_free_packet
(
pkt
);
return
ret
;
}
/* packet queue handling */
void
packet_queue_init
(
PacketQueue
*
q
)
{
memset
(
q
,
0
,
sizeof
(
PacketQueue
));
q
->
mutex
=
SDL_CreateMutex
();
q
->
cond
=
SDL_CreateCond
();
q
->
abort_request
=
1
;
}
void
packet_queue_flush
(
PacketQueue
*
q
)
{
MyAVPacketList
*
pkt
,
*
pkt1
;
SDL_LockMutex
(
q
->
mutex
);
for
(
pkt
=
q
->
first_pkt
;
pkt
!=
NULL
;
pkt
=
pkt1
)
{
pkt1
=
pkt
->
next
;
av_free_packet
(
&
pkt
->
pkt
);
av_freep
(
&
pkt
);
}
q
->
last_pkt
=
NULL
;
q
->
first_pkt
=
NULL
;
q
->
nb_packets
=
0
;
q
->
size
=
0
;
SDL_UnlockMutex
(
q
->
mutex
);
}
void
packet_queue_destroy
(
PacketQueue
*
q
)
{
packet_queue_flush
(
q
);
SDL_DestroyMutex
(
q
->
mutex
);
SDL_DestroyCond
(
q
->
cond
);
}
void
packet_queue_abort
(
PacketQueue
*
q
)
{
SDL_LockMutex
(
q
->
mutex
);
q
->
abort_request
=
1
;
SDL_CondSignal
(
q
->
cond
);
SDL_UnlockMutex
(
q
->
mutex
);
}
void
packet_queue_start
(
PacketQueue
*
q
)
{
SDL_LockMutex
(
q
->
mutex
);
q
->
abort_request
=
0
;
packet_queue_put_private
(
q
,
&
flush_pkt
);
SDL_UnlockMutex
(
q
->
mutex
);
}
/* return < 0 if aborted, 0 if no packet and > 0 if packet. */
int
packet_queue_get
(
PacketQueue
*
q
,
AVPacket
*
pkt
,
int
block
,
int
*
serial
)
{
MyAVPacketList
*
pkt1
;
int
ret
;
SDL_LockMutex
(
q
->
mutex
);
for
(;;)
{
if
(
q
->
abort_request
)
{
ret
=
-
1
;
break
;
}
pkt1
=
q
->
first_pkt
;
if
(
pkt1
)
{
q
->
first_pkt
=
pkt1
->
next
;
if
(
!
q
->
first_pkt
)
q
->
last_pkt
=
NULL
;
q
->
nb_packets
--
;
q
->
size
-=
pkt1
->
pkt
.
size
+
sizeof
(
*
pkt1
);
*
pkt
=
pkt1
->
pkt
;
if
(
serial
)
*
serial
=
pkt1
->
serial
;
av_free
(
pkt1
);
ret
=
1
;
break
;
}
else
if
(
!
block
)
{
ret
=
0
;
break
;
}
else
{
SDL_CondWait
(
q
->
cond
,
q
->
mutex
);
}
}
SDL_UnlockMutex
(
q
->
mutex
);
return
ret
;
}
AVPacket
*
packet_get_flush_pkt
()
{
return
&
flush_pkt
;
}
ijkmediaplayer/jni/ijkplayer/ffplay_pkt_queue.h
浏览文件 @
1a3ef752
...
@@ -44,16 +44,150 @@ typedef struct PacketQueue {
...
@@ -44,16 +44,150 @@ typedef struct PacketQueue {
SDL_cond
*
cond
;
SDL_cond
*
cond
;
}
PacketQueue
;
}
PacketQueue
;
void
packet_queue_init
(
PacketQueue
*
q
);
AVPacket
flush_pkt
;
void
packet_queue_destroy
(
PacketQueue
*
q
);
void
packet_queue_start
(
PacketQueue
*
q
);
inline
static
int
packet_queue_put
(
PacketQueue
*
q
,
AVPacket
*
pkt
);
void
packet_queue_abort
(
PacketQueue
*
q
);
void
packet_queue_flush
(
PacketQueue
*
q
);
int
packet_queue_put
(
PacketQueue
*
q
,
AVPacket
*
pkt
);
inline
static
int
packet_queue_put_private
(
PacketQueue
*
q
,
AVPacket
*
pkt
)
int
packet_queue_get
(
PacketQueue
*
q
,
AVPacket
*
pkt
,
int
block
,
int
*
serial
);
{
MyAVPacketList
*
pkt1
;
AVPacket
*
packet_get_flush_pkt
();
if
(
q
->
abort_request
)
return
-
1
;
pkt1
=
av_malloc
(
sizeof
(
MyAVPacketList
));
if
(
!
pkt1
)
return
-
1
;
pkt1
->
pkt
=
*
pkt
;
pkt1
->
next
=
NULL
;
if
(
pkt
==
&
flush_pkt
)
q
->
serial
++
;
pkt1
->
serial
=
q
->
serial
;
if
(
!
q
->
last_pkt
)
q
->
first_pkt
=
pkt1
;
else
q
->
last_pkt
->
next
=
pkt1
;
q
->
last_pkt
=
pkt1
;
q
->
nb_packets
++
;
q
->
size
+=
pkt1
->
pkt
.
size
+
sizeof
(
*
pkt1
);
/* XXX: should duplicate packet data in DV case */
SDL_CondSignal
(
q
->
cond
);
return
0
;
}
inline
static
int
packet_queue_put
(
PacketQueue
*
q
,
AVPacket
*
pkt
)
{
int
ret
;
/* duplicate the packet */
if
(
pkt
!=
&
flush_pkt
&&
av_dup_packet
(
pkt
)
<
0
)
return
-
1
;
SDL_LockMutex
(
q
->
mutex
);
ret
=
packet_queue_put_private
(
q
,
pkt
);
SDL_UnlockMutex
(
q
->
mutex
);
if
(
pkt
!=
&
flush_pkt
&&
ret
<
0
)
av_free_packet
(
pkt
);
return
ret
;
}
/* packet queue handling */
inline
static
void
packet_queue_init
(
PacketQueue
*
q
)
{
memset
(
q
,
0
,
sizeof
(
PacketQueue
));
q
->
mutex
=
SDL_CreateMutex
();
q
->
cond
=
SDL_CreateCond
();
q
->
abort_request
=
1
;
}
inline
static
void
packet_queue_flush
(
PacketQueue
*
q
)
{
MyAVPacketList
*
pkt
,
*
pkt1
;
SDL_LockMutex
(
q
->
mutex
);
for
(
pkt
=
q
->
first_pkt
;
pkt
!=
NULL
;
pkt
=
pkt1
)
{
pkt1
=
pkt
->
next
;
av_free_packet
(
&
pkt
->
pkt
);
av_freep
(
&
pkt
);
}
q
->
last_pkt
=
NULL
;
q
->
first_pkt
=
NULL
;
q
->
nb_packets
=
0
;
q
->
size
=
0
;
SDL_UnlockMutex
(
q
->
mutex
);
}
inline
static
void
packet_queue_destroy
(
PacketQueue
*
q
)
{
packet_queue_flush
(
q
);
SDL_DestroyMutex
(
q
->
mutex
);
SDL_DestroyCond
(
q
->
cond
);
}
inline
static
void
packet_queue_abort
(
PacketQueue
*
q
)
{
SDL_LockMutex
(
q
->
mutex
);
q
->
abort_request
=
1
;
SDL_CondSignal
(
q
->
cond
);
SDL_UnlockMutex
(
q
->
mutex
);
}
inline
static
void
packet_queue_start
(
PacketQueue
*
q
)
{
SDL_LockMutex
(
q
->
mutex
);
q
->
abort_request
=
0
;
packet_queue_put_private
(
q
,
&
flush_pkt
);
SDL_UnlockMutex
(
q
->
mutex
);
}
/* return < 0 if aborted, 0 if no packet and > 0 if packet. */
inline
static
int
packet_queue_get
(
PacketQueue
*
q
,
AVPacket
*
pkt
,
int
block
,
int
*
serial
)
{
MyAVPacketList
*
pkt1
;
int
ret
;
SDL_LockMutex
(
q
->
mutex
);
for
(;;)
{
if
(
q
->
abort_request
)
{
ret
=
-
1
;
break
;
}
pkt1
=
q
->
first_pkt
;
if
(
pkt1
)
{
q
->
first_pkt
=
pkt1
->
next
;
if
(
!
q
->
first_pkt
)
q
->
last_pkt
=
NULL
;
q
->
nb_packets
--
;
q
->
size
-=
pkt1
->
pkt
.
size
+
sizeof
(
*
pkt1
);
*
pkt
=
pkt1
->
pkt
;
if
(
serial
)
*
serial
=
pkt1
->
serial
;
av_free
(
pkt1
);
ret
=
1
;
break
;
}
else
if
(
!
block
)
{
ret
=
0
;
break
;
}
else
{
SDL_CondWait
(
q
->
cond
,
q
->
mutex
);
}
}
SDL_UnlockMutex
(
q
->
mutex
);
return
ret
;
}
inline
static
void
packet_queue_global_init
()
{
av_init_packet
(
&
flush_pkt
);
flush_pkt
.
data
=
(
uint8_t
*
)(
intptr_t
)
"FLUSH"
;
}
#endif
#endif
ijkmediaplayer/jni/ijkplayer/ffplay_read_thread.c
浏览文件 @
1a3ef752
...
@@ -379,7 +379,7 @@ static int audio_decode_frame(VideoState *is)
...
@@ -379,7 +379,7 @@ static int audio_decode_frame(VideoState *is)
if
((
new_packet
=
packet_queue_get
(
&
is
->
audioq
,
pkt
,
1
,
&
is
->
audio_pkt_temp_serial
))
<
0
)
if
((
new_packet
=
packet_queue_get
(
&
is
->
audioq
,
pkt
,
1
,
&
is
->
audio_pkt_temp_serial
))
<
0
)
return
-
1
;
return
-
1
;
if
(
pkt
->
data
==
packet_get_flush_pkt
()
->
data
)
{
if
(
pkt
->
data
==
flush_pkt
.
data
)
{
avcodec_flush_buffers
(
dec
);
avcodec_flush_buffers
(
dec
);
flush_complete
=
0
;
flush_complete
=
0
;
}
}
...
@@ -874,15 +874,15 @@ int ijkff_read_thread(void *arg)
...
@@ -874,15 +874,15 @@ int ijkff_read_thread(void *arg)
}
else
{
}
else
{
if
(
is
->
audio_stream
>=
0
)
{
if
(
is
->
audio_stream
>=
0
)
{
packet_queue_flush
(
&
is
->
audioq
);
packet_queue_flush
(
&
is
->
audioq
);
packet_queue_put
(
&
is
->
audioq
,
packet_get_flush_pkt
()
);
packet_queue_put
(
&
is
->
audioq
,
&
flush_pkt
);
}
}
if
(
is
->
subtitle_stream
>=
0
)
{
if
(
is
->
subtitle_stream
>=
0
)
{
packet_queue_flush
(
&
is
->
subtitleq
);
packet_queue_flush
(
&
is
->
subtitleq
);
packet_queue_put
(
&
is
->
subtitleq
,
packet_get_flush_pkt
()
);
packet_queue_put
(
&
is
->
subtitleq
,
&
flush_pkt
);
}
}
if
(
is
->
video_stream
>=
0
)
{
if
(
is
->
video_stream
>=
0
)
{
packet_queue_flush
(
&
is
->
videoq
);
packet_queue_flush
(
&
is
->
videoq
);
packet_queue_put
(
&
is
->
videoq
,
packet_get_flush_pkt
()
);
packet_queue_put
(
&
is
->
videoq
,
&
flush_pkt
);
}
}
if
(
is
->
seek_flags
&
AVSEEK_FLAG_BYTE
)
{
if
(
is
->
seek_flags
&
AVSEEK_FLAG_BYTE
)
{
update_external_clock_pts
(
is
,
NAN
);
update_external_clock_pts
(
is
,
NAN
);
...
...
ijkmediaplayer/jni/ijkplayer/ffplayer.c
浏览文件 @
1a3ef752
...
@@ -27,20 +27,48 @@
...
@@ -27,20 +27,48 @@
#include <stdbool.h>
#include <stdbool.h>
static
bool
g_ffmpeg_global_inited
=
false
;
static
bool
g_ffmpeg_global_inited
=
false
;
static
pthread_mutex_t
g_avcodec_mutex
;
static
int
lockmgr
(
void
**
mtx
,
enum
AVLockOp
op
)
{
switch
(
op
)
{
case
AV_LOCK_CREATE
:
*
mtx
=
SDL_CreateMutex
();
if
(
!*
mtx
)
return
1
;
return
0
;
case
AV_LOCK_OBTAIN
:
return
!!
SDL_LockMutex
(
*
mtx
);
case
AV_LOCK_RELEASE
:
return
!!
SDL_UnlockMutex
(
*
mtx
);
case
AV_LOCK_DESTROY
:
SDL_DestroyMutex
(
*
mtx
);
return
0
;
}
return
1
;
}
void
ijkff_global_init
()
void
ijkff_global_init
()
{
{
if
(
g_ffmpeg_global_inited
)
if
(
g_ffmpeg_global_inited
)
return
;
return
;
pthread_mutex_init
(
&
g_avcodec_mutex
,
NULL
);
/* register all codecs, demux and protocols */
av_register_all
();
avcodec_register_all
();
avcodec_register_all
();
#if CONFIG_AVDEVICE
avdevice_register_all
();
#endif
#if CONFIG_AVFILTER
avfilter_register_all
();
#endif
av_register_all
();
avformat_network_init
();
avformat_network_init
();
av_lockmgr_register
(
lockmgr
);
/* FIXME: SDL_Init() */
packet_queue_global_init
();
g_ffmpeg_global_inited
=
true
;
g_ffmpeg_global_inited
=
true
;
}
}
...
@@ -49,20 +77,14 @@ void ijkff_global_uninit()
...
@@ -49,20 +77,14 @@ void ijkff_global_uninit()
if
(
!
g_ffmpeg_global_inited
)
if
(
!
g_ffmpeg_global_inited
)
return
;
return
;
pthread_mutex_destroy
(
&
g_avcodec_mutex
);
av_lockmgr_register
(
NULL
);
g_ffmpeg_global_inited
=
false
;
}
void
ijkff_avcodec_lock
()
#if CONFIG_AVFILTER
{
avfilter_uninit
();
if
(
!
g_ffmpeg_global_inited
)
av_freep
(
&
vfilters
);
return
;
#endif
pthread_mutex_lock
(
&
g_avcodec_mutex
);
avformat_network_deinit
(
);
}
/* FIXME: SDL_Quit(); */
void
ijkff_avcodec_unlock
()
g_ffmpeg_global_inited
=
false
;
{
if
(
!
g_ffmpeg_global_inited
)
return
;
pthread_mutex_unlock
(
&
g_avcodec_mutex
);
}
}
ijkmediaplayer/jni/ijkplayer/ffplayer.h
浏览文件 @
1a3ef752
...
@@ -142,22 +142,5 @@ inline static void ijkff_reset(FFPlayer *ffp)
...
@@ -142,22 +142,5 @@ inline static void ijkff_reset(FFPlayer *ffp)
void
ijkff_global_init
();
void
ijkff_global_init
();
void
ijkff_global_uninit
();
void
ijkff_global_uninit
();
/*
* ffmpeg api listed below must be locked
*
* av_set_cpu_flags_mask();
* av_register_all();
* avcodec_register_all();
*
* avcodec_open
* avcodec_open2
* avcodec_close
*
* avformat_find_stream_info
* av_find_stream_info
*/
void
ijkff_avcodec_lock
();
void
ijkff_avcodec_unlock
();
#endif
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录