Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
500b32b3
提交
500b32b3
authored
2月 28, 2015
作者:
Anthony Minessale
提交者:
Michael Jerris
5月 28, 2015
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FS-7509 FS-7514: another round of cleanup
上级
a883818b
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
270 行增加
和
92 行删除
+270
-92
index.html
html5/verto/video_demo/index.html
+67
-23
verto.js
html5/verto/video_demo/verto.js
+8
-0
mod_fsv.c
src/mod/applications/mod_fsv/mod_fsv.c
+35
-9
mod_vlc.c
src/mod/formats/mod_vlc/mod_vlc.c
+155
-59
switch_core_session.c
src/switch_core_session.c
+3
-0
switch_core_state_machine.c
src/switch_core_state_machine.c
+2
-1
没有找到文件。
html5/verto/video_demo/index.html
浏览文件 @
500b32b3
...
...
@@ -99,6 +99,7 @@
<button
data-inline=
"true"
id=
"hold"
>
HOLD
</button>
<button
data-inline=
"true"
id=
"hupbtn"
>
End Call
</button>
<button
data-inline=
"true"
id=
"mutebtn"
>
Toggle Audio Mute
</button>
<!-- <button data-inline="true" class="startxferbtn">Transfer</button>-->
<span
class=
"sharediv"
>
<button
data-inline=
"true"
id=
"sharebtn"
>
Share
</button>
...
...
@@ -109,7 +110,8 @@
<button
data-inline=
"true"
id=
"smallerbtn"
>
Smaller -
</button>
<button
data-inline=
"true"
id=
"biggerbtn"
>
Bigger +
</button>
<button
data-inline=
"true"
id=
"fullbtn"
>
Full Screen
</button>
</span>
<button
data-inline=
"true"
id=
"vmutebtn"
>
Toggle Video Mute
</button>
</span>
<div
id=
"media"
>
<video
id=
"webcam"
autoplay=
"autoplay"
></video>
...
...
@@ -168,8 +170,12 @@
FreeSWITCH Verto
™
Video Transcoding Demo
</div>
<br>
<a
target=
"_CC2104"
href=
"https://www.cluecon.com"
><img
border=
"0"
width=
"300"
src=
"img/cc_banner.gif"
></a>
<center>
<table
width=
"1024"
border=
"0"
>
<tr><td>
<center><a
target=
"_CC2104"
href=
"https://www.cluecon.com"
><img
border=
"0"
width=
"300"
src=
"img/cc_banner.gif"
></a></center></td>
<td><center>
<img
src=
"img/verto_black_web.gif"
width=
"300"
></center>
</td></tr>
</table></center><br><br>
<div
id=
"offline"
>
<div
id=
"errordisplay"
style=
"font-weight:bold;font-size:18px;color:#ae0000"
></div>
...
...
@@ -234,20 +240,60 @@ function dial(ext)
<div
id=
"online"
align=
"center"
style=
"width:75%"
>
<div
class=
"ui-field-contain"
>
<div
id=
"devices"
>
<script>
function
toggle_demo
()
{
if
(
$
(
'#demos'
).
is
(
':visible'
))
{
$
(
'#demos'
).
hide
();
$
(
'#showdemo'
).
text
(
"Show Demo Extensions"
);
}
else
{
$
(
'#devices'
).
hide
();
$
(
'#showdevices'
).
show
();
$
(
'#demos'
).
show
();
$
(
'#showdemo'
).
text
(
"Hide Demo Extensions"
);
}
}
function
toggle_device
()
{
if
(
$
(
'#devices'
).
is
(
':visible'
))
{
$
(
'#devices'
).
hide
();
$
(
'#showdevices'
).
text
(
"View Device Settings"
);
}
else
{
$
(
'#devices'
).
show
();
$
(
'#demos'
).
hide
();
$
(
'#showdevices'
).
text
(
"Hide Device Settings"
);
}
}
</script>
<button
data-inline=
"true"
id=
"showdemo"
onclick=
"toggle_demo();"
>
View Demo Extensions
</button>
<button
data-inline=
"true"
id=
"showdevices"
onclick=
"toggle_device();"
>
View Device Settings
</button>
<button
data-inline=
"true"
id=
"logoutbtn"
>
Log Out
</button>
<br><br>
<div
id=
"devices"
style=
"border-style:outset;border-width:2px"
>
<div
id=
"camdiv"
>
<legend><b>
Camera
</b>
:
</legend><select
data-theme=
"a"
data-overlay-theme=
"a"
data-native-menu=
"false"
id=
"usecamera"
></select>
<legend><b>
Camera
</b>
:
</legend><select
data-theme=
"a"
data-overlay-theme=
"a"
data-native-menu=
"false"
id=
"usecamera"
></select>
<br><br></div>
<legend><b>
Microphone
</b>
:
</legend><select
data-theme=
"a"
data-overlay-theme=
"a"
data-native-menu=
"false"
id=
"usemic"
></select>
<Br
clear=
"all"
><Br>
<center><button
data-inline=
"true"
id=
"refreshbtn"
>
Refresh Device List
</button>
<button
data-inline=
"true"
id=
"hidedevices"
onclick=
"$('#devices').hide();$('#showdevices').show()"
>
Save Device Settings
</button>
</center>
<Br
clear=
"all"
><hr><br>
<div
style=
"xvisibility:hidden"
>
<label><input
id=
"use_vid"
type=
"checkbox"
value=
"foo"
>
Use Video
</label>
<label><input
id=
"use_stereo"
type=
"checkbox"
value=
"foo"
>
Stereo Audio
</label>
<label><input
id=
"use_stun"
type=
"checkbox"
value=
"foo"
>
Use STUN
</label>
<!-- <label><input id="local_video" type="checkbox" value="foo" > Local Video</label>-->
</div>
<Br
clear=
"all"
>
<br><br>
<div
>
<fieldset
data-role=
"controlgroup"
data-type=
"horizontal"
>
<legend><b>
Video Quality
</b>
:
</legend>
...
...
@@ -336,12 +382,16 @@ function dial(ext)
</fieldset>
</div><br
clear=
"all"
><br>
<br><br>
<center><button
data-inline=
"true"
id=
"refreshbtn"
>
Refresh Device List
</button>
<button
data-inline=
"true"
id=
"hidedevices"
onclick=
"$('#devices').hide();$('#showdevices').show()"
>
Save Device Settings
</button>
</center>
<Br
clear=
"all"
><br>
</div>
<button
data-inline=
"true"
id=
"showdemo"
onclick=
"$('#demos').show();$('#showdemo').hide()"
>
View Demo Extensions
</button>
<button
data-inline=
"true"
id=
"showdevices"
onclick=
"$('#devices').show();$('#showdevices').hide()"
>
View Device Settings
</button>
<br><br>
<div
id=
"demos"
style=
"border-style:outset"
>
...
...
@@ -371,14 +421,13 @@ function dial(ext)
<div
style=
"border-style:inset;border-width:1px;background-color:#eeeeee"
>
<button
class=
"vidbtn"
data-inline=
"true"
onclick=
"dial('decode')"
>
Video from your Webcam decoded then re-encoded w/ MOH
</button>
<button
class=
"vidbtn"
data-inline=
"true"
onclick=
"dial('3500')"
>
Video Transcoded Conference
</button>
<button
class=
"vidbtn"
id=
"hidedemo"
data-inline=
"true"
onclick=
"$('#demos').hide();$('#showdemo').show();"
>
Hide Demos
</button>
</div>
</div>
<br><br><br>
<br><br><br>
<hr><br>
<div
class=
"ui-field-contain"
style=
"text-align:right;"
>
<label
for=
"name"
>
Name
</label>
<input
type=
"text"
size=
"30"
id=
"cidname"
/>
...
...
@@ -392,20 +441,15 @@ function dial(ext)
<input
type=
"text"
id=
"ext"
"
/>
</div>
<button
data-inline=
"true"
id=
"callbtn"
>
Call Extension
</button>
<br><br>
<br>
<hr>
<br><br>
<div
style=
"color:blue"
id=
"main_info"
>
</div><br><br>
<img
src=
"img/verto_black_web.gif"
width=
"300"
><br><br>
<button
data-inline=
"true"
id=
"logoutbtn"
>
Log Out
</button>
</div>
<br>
<div
style=
"xvisibility:hidden"
>
<label><input
id=
"use_vid"
type=
"checkbox"
value=
"foo"
>
Use Video
</label>
<label><input
id=
"use_stereo"
type=
"checkbox"
value=
"foo"
>
Stereo Audio
</label>
<label><input
id=
"use_stun"
type=
"checkbox"
value=
"foo"
>
Use STUN
</label>
<!-- <label><input id="local_video" type="checkbox" value="foo" > Local Video</label>-->
</div>
<br>
<br>
<!--
<b>TEXT</b><br>To: <input type="text" size="20" id="textto"/> MSG: <input type="text" size="40" id="textmsg"/>
...
...
html5/verto/video_demo/verto.js
浏览文件 @
500b32b3
...
...
@@ -509,6 +509,14 @@ $("#hupbtn").click(function() {
cur_call
=
null
;
});
$
(
"#mutebtn"
).
click
(
function
()
{
cur_call
.
dtmf
(
"0"
);
});
$
(
"#vmutebtn"
).
click
(
function
()
{
cur_call
.
dtmf
(
"*0"
);
});
$
(
"#fullbtn"
).
click
(
function
()
{
full_screen
(
"webcam"
);
});
...
...
src/mod/applications/mod_fsv/mod_fsv.c
浏览文件 @
500b32b3
...
...
@@ -498,18 +498,15 @@ SWITCH_STANDARD_APP(play_yuv_function)
switch_image_t
*
img
=
NULL
;
switch_byte_t
*
yuv
=
NULL
;
int
argc
;
char
*
argv
[
3
]
=
{
0
};
int
to
=
0
;
char
*
argv
[
5
]
=
{
0
};
char
*
mydata
=
switch_core_session_strdup
(
session
,
data
);
uint32_t
loops
=
0
;
switch_time_t
done
=
0
;
int
nots
=
0
;
switch_channel_answer
(
channel
);
while
(
switch_channel_ready
(
channel
)
&&
!
switch_channel_test_flag
(
channel
,
CF_VIDEO
))
{
if
((
++
loops
%
100
)
==
0
)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Waiting for video......
\n
"
);
switch_ivr_sleep
(
session
,
20
,
SWITCH_TRUE
,
NULL
);
continue
;
}
switch_channel_audio_sync
(
channel
);
switch_core_session_raw_read
(
session
);
...
...
@@ -522,6 +519,23 @@ SWITCH_STANDARD_APP(play_yuv_function)
if
(
argc
>
1
)
width
=
atoi
(
argv
[
1
]);
if
(
argc
>
2
)
height
=
atoi
(
argv
[
2
]);
if
(
argc
>
3
)
to
=
atoi
(
argv
[
3
]);
if
(
argc
>
4
)
nots
=
atoi
(
argv
[
4
]);
done
=
switch_micro_time_now
()
+
(
to
*
1000
);
while
(
switch_channel_ready
(
channel
)
&&
!
switch_channel_test_flag
(
channel
,
CF_VIDEO
))
{
if
((
++
loops
%
100
)
==
0
)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Waiting for video......
\n
"
);
switch_ivr_sleep
(
session
,
20
,
SWITCH_TRUE
,
NULL
);
if
(
switch_micro_time_now
()
>
done
)
{
goto
done
;
}
continue
;
}
width
=
width
?
width
:
352
;
height
=
height
?
height
:
288
;
...
...
@@ -568,6 +582,9 @@ SWITCH_STANDARD_APP(play_yuv_function)
switch_set_flag
((
&
vid_frame
),
SFF_RAW_RTP
);
// switch_set_flag((&vid_frame), SFF_PROXY_PACKET);
switch_core_session_request_video_refresh
(
session
);
switch_core_media_gen_key_frame
(
session
);
while
(
switch_channel_ready
(
channel
))
{
char
ts_str
[
64
];
...
...
@@ -578,6 +595,11 @@ SWITCH_STANDARD_APP(play_yuv_function)
break
;
}
if
(
switch_micro_time_now
()
>
done
)
{
goto
done
;
}
switch_ivr_parse_all_events
(
session
);
//check for dtmf interrupts
...
...
@@ -597,10 +619,14 @@ SWITCH_STANDARD_APP(play_yuv_function)
}
}
memset
(
read_frame
->
data
,
0
,
read_frame
->
datalen
);
if
(
read_frame
)
switch_core_session_write_frame
(
session
,
read_frame
,
SWITCH_IO_FLAG_NONE
,
0
);
sprintf
(
ts_str
,
"%"
SWITCH_TIME_T_FMT
,
switch_micro_time_now
()
/
1000
);
switch_img_add_text
(
img
->
planes
[
SWITCH_PLANE_PACKED
],
width
,
20
,
20
,
ts_str
);
if
(
!
nots
)
{
sprintf
(
ts_str
,
"%"
SWITCH_TIME_T_FMT
,
switch_micro_time_now
()
/
1000
);
switch_img_add_text
(
img
->
planes
[
SWITCH_PLANE_PACKED
],
width
,
20
,
20
,
ts_str
);
}
vid_frame
.
img
=
img
;
switch_core_session_write_video_frame
(
session
,
&
vid_frame
,
SWITCH_IO_FLAG_NONE
,
0
);
}
...
...
src/mod/formats/mod_vlc/mod_vlc.c
浏览文件 @
500b32b3
...
...
@@ -81,6 +81,7 @@ struct vlc_file_context {
switch_memory_pool_t
*
pool
;
switch_buffer_t
*
audio_buffer
;
switch_mutex_t
*
audio_mutex
;
switch_mutex_t
*
cond_mutex
;
switch_thread_cond_t
*
cond
;
char
*
path
;
int
samples
;
...
...
@@ -102,6 +103,7 @@ struct vlc_video_context {
libvlc_media_player_t
*
mp
;
libvlc_media_t
*
m
;
switch_mutex_t
*
audio_mutex
;
switch_mutex_t
*
cond_mutex
;
switch_file_handle_t
fh
;
switch_memory_pool_t
*
pool
;
switch_thread_cond_t
*
cond
;
...
...
@@ -183,9 +185,9 @@ static void vlc_mediaplayer_error_callback(const libvlc_event_t * event, void *
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Got a libvlc_MediaPlayerEncounteredError callback. mediaPlayer Status: %d
\n
"
,
status
);
if
(
status
==
libvlc_Error
)
{
context
->
err
=
1
;
if
(
switch_mutex_lock
(
context
->
audio
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_mutex_lock
(
context
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
audio
_mutex
);
switch_mutex_unlock
(
context
->
cond
_mutex
);
}
}
}
...
...
@@ -197,9 +199,9 @@ static void vlc_media_state_callback(const libvlc_event_t * event, void * data)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Got a libvlc_MediaStateChanged callback. New state: %d
\n
"
,
new_state
);
if
(
new_state
==
libvlc_Ended
||
new_state
==
libvlc_Error
)
{
if
(
switch_mutex_lock
(
context
->
audio
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_mutex_lock
(
context
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
audio
_mutex
);
switch_mutex_unlock
(
context
->
cond
_mutex
);
}
}
}
...
...
@@ -208,28 +210,54 @@ static void vlc_media_state_callback(const libvlc_event_t * event, void * data)
static
void
vlc_mediaplayer_av_error_callback
(
const
libvlc_event_t
*
event
,
void
*
data
)
{
vlc_video_context_t
*
context
=
(
vlc_video_context_t
*
)
data
;
int
status
=
libvlc_media_get_state
(
context
->
m
);
vlc_file_context_t
*
acontext
=
(
vlc_file_context_t
*
)
data
;
vlc_video_context_t
*
vcontext
=
acontext
->
vcontext
;
int
status
=
libvlc_media_get_state
(
vcontext
->
m
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Got a libvlc_MediaPlayerEncounteredError callback. mediaPlayer Status: %d
\n
"
,
status
);
if
(
status
==
libvlc_Error
)
{
context
->
err
=
1
;
if
(
switch_mutex_lock
(
context
->
audio_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
audio_mutex
);
vcontext
->
err
=
1
;
if
(
vcontext
&&
vcontext
->
video_queue
)
{
switch_queue_push
(
vcontext
->
video_queue
,
NULL
);
}
if
(
vcontext
&&
vcontext
->
video_queue
)
{
switch_queue_push
(
vcontext
->
video_queue
,
NULL
);
}
if
(
switch_mutex_lock
(
acontext
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
acontext
->
cond
);
switch_mutex_unlock
(
acontext
->
cond_mutex
);
}
if
(
switch_mutex_lock
(
vcontext
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
vcontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
cond_mutex
);
}
}
}
static
void
vlc_media_av_state_callback
(
const
libvlc_event_t
*
event
,
void
*
data
)
{
vlc_video_context_t
*
context
=
(
vlc_video_context_t
*
)
data
;
vlc_file_context_t
*
acontext
=
(
vlc_file_context_t
*
)
data
;
vlc_video_context_t
*
vcontext
=
acontext
->
vcontext
;
int
new_state
=
event
->
u
.
media_state_changed
.
new_state
;
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Got a libvlc_MediaStateChanged callback. New state: %d
\n
"
,
new_state
);
if
(
new_state
==
libvlc_Ended
||
new_state
==
libvlc_Error
)
{
if
(
switch_mutex_lock
(
context
->
audio_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
audio_mutex
);
if
(
new_state
==
libvlc_Ended
||
new_state
==
libvlc_Error
||
new_state
==
6
)
{
vcontext
->
err
=
1
;
if
(
vcontext
&&
vcontext
->
video_queue
)
{
switch_queue_push
(
vcontext
->
video_queue
,
NULL
);
}
if
(
switch_mutex_lock
(
acontext
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
acontext
->
cond
);
switch_mutex_unlock
(
acontext
->
cond_mutex
);
}
if
(
switch_mutex_lock
(
vcontext
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
vcontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
cond_mutex
);
}
}
}
...
...
@@ -249,7 +277,10 @@ void vlc_auto_play_callback(void *data, const void *samples, unsigned count, int
if
(
!
context
->
playing
)
{
context
->
playing
=
1
;
switch_thread_cond_signal
(
context
->
cond
);
if
(
switch_mutex_trylock
(
context
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
cond_mutex
);
}
}
switch_mutex_unlock
(
context
->
audio_mutex
);
}
...
...
@@ -257,25 +288,64 @@ void vlc_auto_play_callback(void *data, const void *samples, unsigned count, int
#define FORCE_SPLIT 1
void
vlc_play_audio_callback
(
void
*
data
,
const
void
*
samples
,
unsigned
count
,
int64_t
pts
)
{
vlc_video_context_t
*
context
=
(
vlc_video_context_t
*
)
data
;
vlc_video_context_t
*
v
context
=
(
vlc_video_context_t
*
)
data
;
switch_size_t
bytes
;
switch_mutex_lock
(
context
->
audio_mutex
);
switch_mutex_lock
(
v
context
->
audio_mutex
);
bytes
=
switch_buffer_inuse
(
context
->
audio_buffer
);
bytes
=
switch_buffer_inuse
(
v
context
->
audio_buffer
);
if
(
bytes
>
2000000
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Buffer overflow %d
\n
"
,
(
int
)
bytes
);
switch_buffer_zero
(
context
->
audio_buffer
);
switch_buffer_zero
(
v
context
->
audio_buffer
);
}
switch_buffer_write
(
context
->
audio_buffer
,
samples
,
count
*
2
*
context
->
channels
);
switch_buffer_write
(
vcontext
->
audio_buffer
,
samples
,
count
*
2
*
v
context
->
channels
);
if
(
!
context
->
playing
)
{
context
->
playing
=
1
;
if
(
context
->
cond
)
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
vcontext
->
audio_mutex
);
if
(
!
vcontext
->
playing
)
{
vcontext
->
playing
=
1
;
if
(
switch_mutex_trylock
(
vcontext
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
vcontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
cond_mutex
);
}
}
switch_mutex_unlock
(
context
->
audio_mutex
);
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "VLC callback, play audio: %d \n", count);
}
void
vlc_file_play_audio_callback
(
void
*
data
,
const
void
*
samples
,
unsigned
count
,
int64_t
pts
)
{
vlc_file_context_t
*
acontext
=
(
vlc_file_context_t
*
)
data
;
vlc_video_context_t
*
vcontext
=
acontext
->
vcontext
;
switch_size_t
bytes
;
switch_mutex_lock
(
vcontext
->
audio_mutex
);
bytes
=
switch_buffer_inuse
(
vcontext
->
audio_buffer
);
if
(
bytes
>
2000000
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Buffer overflow %d
\n
"
,
(
int
)
bytes
);
switch_buffer_zero
(
vcontext
->
audio_buffer
);
}
switch_buffer_write
(
vcontext
->
audio_buffer
,
samples
,
count
*
2
*
vcontext
->
channels
);
switch_mutex_unlock
(
vcontext
->
audio_mutex
);
if
(
!
vcontext
->
playing
)
{
vcontext
->
playing
=
1
;
if
(
switch_mutex_trylock
(
acontext
->
cond_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
acontext
->
cond
);
switch_mutex_unlock
(
acontext
->
cond_mutex
);
}
}
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "VLC callback, play audio: %d \n", count);
}
...
...
@@ -386,6 +456,15 @@ unsigned video_format_setup_callback(void **opaque, char *chroma, unsigned *widt
*
height
=
context
->
force_height
;
}
if
(
*
height
==
738
)
{
*
height
=
720
;
}
if
(
*
height
==
1090
)
{
*
height
=
1080
;
}
*
pitches
=
(
*
width
)
*
2
;
*
lines
=
(
*
height
);
...
...
@@ -500,10 +579,12 @@ static switch_status_t av_init_handle(switch_file_handle_t *handle, switch_image
switch_buffer_create_dynamic
(
&
(
vcontext
->
audio_buffer
),
VLC_BUFFER_SIZE
,
VLC_BUFFER_SIZE
*
8
,
0
);
switch_mutex_init
(
&
vcontext
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
vcontext
->
pool
);
switch_mutex_init
(
&
vcontext
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
vcontext
->
pool
);
switch_mutex_init
(
&
acontext
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
acontext
->
pool
);
switch_mutex_init
(
&
vcontext
->
video_mutex
,
SWITCH_MUTEX_NESTED
,
vcontext
->
pool
);
switch_thread_cond_create
(
&
vcontext
->
cond
,
vcontext
->
pool
);
switch_thread_cond_create
(
&
acontext
->
cond
,
acontext
->
pool
);
switch_core_timer_init
(
&
vcontext
->
timer
,
"soft"
,
1
,
1000
,
vcontext
->
pool
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"VLC open %s for writing
\n
"
,
acontext
->
path
);
...
...
@@ -632,7 +713,12 @@ static switch_status_t vlc_file_av_open(switch_file_handle_t *handle, const char
switch_mutex_init
(
&
vcontext
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
vcontext
->
pool
);
switch_mutex_init
(
&
vcontext
->
video_mutex
,
SWITCH_MUTEX_NESTED
,
vcontext
->
pool
);
switch_mutex_init
(
&
vcontext
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
vcontext
->
pool
);
switch_mutex_init
(
&
acontext
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
acontext
->
pool
);
switch_mutex_init
(
&
acontext
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
acontext
->
pool
);
switch_queue_create
(
&
vcontext
->
video_queue
,
SWITCH_CORE_QUEUE_LEN
,
vcontext
->
pool
);
switch_thread_cond_create
(
&
acontext
->
cond
,
acontext
->
pool
);
switch_thread_cond_create
(
&
vcontext
->
cond
,
vcontext
->
pool
);
switch_buffer_create_dynamic
(
&
vcontext
->
audio_buffer
,
VLC_BUFFER_SIZE
,
VLC_BUFFER_SIZE
*
8
,
0
);
...
...
@@ -642,13 +728,13 @@ static switch_status_t vlc_file_av_open(switch_file_handle_t *handle, const char
libvlc_audio_set_format
(
vcontext
->
mp
,
"S16N"
,
vcontext
->
samplerate
,
handle
->
channels
);
m_event_manager
=
libvlc_media_event_manager
(
vcontext
->
m
);
libvlc_event_attach
(
m_event_manager
,
libvlc_MediaStateChanged
,
vlc_media_av_state_callback
,
(
void
*
)
v
context
);
libvlc_event_attach
(
m_event_manager
,
libvlc_MediaStateChanged
,
vlc_media_av_state_callback
,
(
void
*
)
a
context
);
mp_event_manager
=
libvlc_media_player_event_manager
(
vcontext
->
mp
);
libvlc_event_attach
(
mp_event_manager
,
libvlc_MediaPlayerEncounteredError
,
vlc_mediaplayer_av_error_callback
,
(
void
*
)
v
context
);
libvlc_event_attach
(
mp_event_manager
,
libvlc_MediaPlayerEncounteredError
,
vlc_mediaplayer_av_error_callback
,
(
void
*
)
a
context
);
libvlc_audio_set_callbacks
(
vcontext
->
mp
,
vlc_
play_audio_callback
,
NULL
,
NULL
,
NULL
,
NULL
,
(
void
*
)
v
context
);
libvlc_audio_set_callbacks
(
vcontext
->
mp
,
vlc_
file_play_audio_callback
,
NULL
,
NULL
,
NULL
,
NULL
,
(
void
*
)
a
context
);
libvlc_video_set_format_callbacks
(
vcontext
->
mp
,
video_format_setup_callback
,
video_format_clean_callback
);
libvlc_video_set_callbacks
(
vcontext
->
mp
,
vlc_video_lock_callback
,
vlc_video_av_unlock_callback
,
vlc_video_display_callback
,
vcontext
);
...
...
@@ -680,6 +766,7 @@ static switch_status_t vlc_file_open(switch_file_handle_t *handle, const char *p
switch_buffer_create_dynamic
(
&
(
context
->
audio_buffer
),
VLC_BUFFER_SIZE
,
VLC_BUFFER_SIZE
*
8
,
0
);
switch_mutex_init
(
&
context
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_thread_cond_create
(
&
(
context
->
cond
),
context
->
pool
);
switch_mutex_init
(
&
context
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
}
handle
->
private_info
=
context
;
...
...
@@ -800,28 +887,30 @@ static switch_status_t vlc_file_av_read(switch_file_handle_t *handle, void *data
return
SWITCH_STATUS_GENERR
;
}
switch_mutex_lock
(
vcontext
->
audio_mutex
);
while
(
vcontext
->
playing
==
0
&&
status
!=
libvlc_Ended
&&
status
!=
libvlc_Error
)
{
switch_thread_cond_wait
(
vcontext
->
cond
,
vcontext
->
audio_mutex
);
switch_mutex_lock
(
acontext
->
cond_mutex
);
switch_thread_cond_wait
(
acontext
->
cond
,
acontext
->
cond_mutex
);
switch_mutex_unlock
(
acontext
->
cond_mutex
);
status
=
libvlc_media_get_state
(
vcontext
->
m
);
}
if
(
vcontext
->
err
==
1
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"VLC error
\n
"
);
switch_mutex_unlock
(
vcontext
->
audio_mutex
);
return
SWITCH_STATUS_FALSE
;
}
switch_mutex_unlock
(
vcontext
->
audio_mutex
);
if
(
!
vcontext
->
vid_ready
)
{
switch_mutex_lock
(
vcontext
->
audio
_mutex
);
switch_mutex_lock
(
vcontext
->
cond
_mutex
);
if
(
!
vcontext
->
vid_ready
)
{
switch_thread_cond_wait
(
vcontext
->
cond
,
vcontext
->
audio
_mutex
);
switch_thread_cond_wait
(
vcontext
->
cond
,
vcontext
->
cond
_mutex
);
}
switch_mutex_unlock
(
vcontext
->
audio
_mutex
);
switch_mutex_unlock
(
vcontext
->
cond
_mutex
);
}
while
(
!
switch_buffer_inuse
(
vcontext
->
audio_buffer
)
&&
!
vcontext
->
err
&&
vcontext
->
playing
)
{
switch_cond_next
();
}
switch_mutex_lock
(
vcontext
->
audio_mutex
);
read
=
switch_buffer_read
(
vcontext
->
audio_buffer
,
data
,
bytes
);
...
...
@@ -869,18 +958,19 @@ static switch_status_t vlc_file_read(switch_file_handle_t *handle, void *data, s
return
SWITCH_STATUS_GENERR
;
}
switch_mutex_lock
(
context
->
audio
_mutex
);
switch_mutex_lock
(
context
->
cond
_mutex
);
while
(
context
->
playing
==
0
&&
status
!=
libvlc_Ended
&&
status
!=
libvlc_Error
)
{
switch_thread_cond_wait
(
context
->
cond
,
context
->
audio_mutex
);
switch_thread_cond_wait
(
context
->
cond
,
context
->
cond_mutex
);
status
=
libvlc_media_get_state
(
context
->
m
);
}
switch_mutex_lock
(
context
->
cond_mutex
);
if
(
context
->
err
==
1
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"VLC error
\n
"
);
switch_mutex_unlock
(
context
->
audio_mutex
);
return
SWITCH_STATUS_FALSE
;
}
switch_mutex_lock
(
context
->
audio_mutex
);
read
=
switch_buffer_read
(
context
->
audio_buffer
,
data
,
bytes
);
switch_mutex_unlock
(
context
->
audio_mutex
);
...
...
@@ -914,9 +1004,9 @@ static switch_status_t vlc_file_read_video(switch_file_handle_t *handle, switch_
if
(
!
vcontext
->
vid_ready
)
{
vcontext
->
vid_ready
=
1
;
if
(
switch_mutex_trylock
(
vcontext
->
audio
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_mutex_trylock
(
vcontext
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
vcontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
audio
_mutex
);
switch_mutex_unlock
(
vcontext
->
cond
_mutex
);
}
}
...
...
@@ -964,9 +1054,9 @@ static switch_status_t vlc_file_write_video(switch_file_handle_t *handle, switch
if
(
!
vcontext
->
vid_ready
)
{
vcontext
->
vid_ready
=
1
;
if
(
switch_mutex_trylock
(
vcontext
->
audio
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_mutex_trylock
(
vcontext
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
vcontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
audio
_mutex
);
switch_mutex_unlock
(
vcontext
->
cond
_mutex
);
}
}
...
...
@@ -1004,11 +1094,11 @@ static switch_status_t vlc_file_av_write(switch_file_handle_t *handle, void *dat
}
if
(
!
vcontext
->
vid_ready
)
{
switch_mutex_lock
(
vcontext
->
audio
_mutex
);
switch_mutex_lock
(
vcontext
->
cond
_mutex
);
if
(
!
vcontext
->
vid_ready
)
{
switch_thread_cond_wait
(
vcontext
->
cond
,
vcontext
->
audio
_mutex
);
switch_thread_cond_wait
(
vcontext
->
cond
,
vcontext
->
cond
_mutex
);
}
switch_mutex_unlock
(
vcontext
->
audio
_mutex
);
switch_mutex_unlock
(
vcontext
->
cond
_mutex
);
}
switch_mutex_lock
(
vcontext
->
audio_mutex
);
...
...
@@ -1065,14 +1155,14 @@ static switch_status_t vlc_file_av_close(switch_file_handle_t *handle)
if
(
switch_test_flag
(
handle
,
SWITCH_FILE_FLAG_WRITE
)
&&
switch_test_flag
(
handle
,
SWITCH_FILE_FLAG_VIDEO
))
{
if
(
vcontext
->
cond
&&
switch_mutex_trylock
(
vcontext
->
video
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
vcontext
->
cond
&&
switch_mutex_trylock
(
vcontext
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
vcontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
video
_mutex
);
switch_mutex_unlock
(
vcontext
->
cond
_mutex
);
}
if
(
acontext
->
cond
&&
switch_mutex_trylock
(
vcontext
->
audio
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
acontext
->
cond
&&
switch_mutex_trylock
(
acontext
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
acontext
->
cond
);
switch_mutex_unlock
(
vcontext
->
audio
_mutex
);
switch_mutex_unlock
(
acontext
->
cond
_mutex
);
}
while
(
switch_buffer_inuse
(
vcontext
->
audio_buffer
)
||
switch_queue_size
(
vcontext
->
video_queue
))
{
...
...
@@ -1212,6 +1302,8 @@ SWITCH_STANDARD_APP(play_video_function)
switch_mutex_init
(
&
context
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
video_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_thread_cond_create
(
&
(
context
->
cond
),
context
->
pool
);
...
...
@@ -1349,11 +1441,11 @@ int vlc_write_video_imem_get_callback(void *data, const char *cookie, int64_t *
int
r
=
0
;
if
(
!
context
->
ending
)
{
switch_mutex_lock
(
context
->
video
_mutex
);
switch_mutex_lock
(
context
->
cond
_mutex
);
if
(
!
switch_queue_size
(
context
->
video_queue
))
{
switch_thread_cond_wait
(
context
->
cond
,
context
->
video_mutex
);
switch_thread_cond_wait
(
context
->
cond
,
context
->
cond_mutex
);
}
switch_mutex_unlock
(
context
->
video
_mutex
);
switch_mutex_unlock
(
context
->
cond
_mutex
);
}
if
(
*
cookie
==
'v'
)
{
...
...
@@ -1464,9 +1556,9 @@ static switch_status_t video_read_callback(switch_core_session_t *session, switc
switch_queue_push
(
context
->
video_queue
,
img_copy
);
if
(
!
size
)
{
/* was empty before this push */
if
(
switch_mutex_trylock
(
context
->
video
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_mutex_trylock
(
context
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
video
_mutex
);
switch_mutex_unlock
(
context
->
cond
_mutex
);
}
}
}
...
...
@@ -1537,6 +1629,7 @@ SWITCH_STANDARD_APP(capture_video_function)
switch_buffer_create_dynamic
(
&
(
context
->
audio_buffer
),
VLC_BUFFER_SIZE
,
VLC_BUFFER_SIZE
*
8
,
0
);
switch_mutex_init
(
&
context
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
video_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_thread_cond_create
(
&
context
->
cond
,
context
->
pool
);
switch_core_timer_init
(
&
context
->
timer
,
"soft"
,
1
,
1000
,
context
->
pool
);
...
...
@@ -1678,9 +1771,9 @@ SWITCH_STANDARD_APP(capture_video_function)
switch_core_session_set_video_read_callback
(
session
,
NULL
,
NULL
);
context
->
ending
=
1
;
if
(
switch_mutex_trylock
(
context
->
video
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_mutex_trylock
(
context
->
cond
_mutex
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_thread_cond_signal
(
context
->
cond
);
switch_mutex_unlock
(
context
->
video
_mutex
);
switch_mutex_unlock
(
context
->
cond
_mutex
);
}
while
(
switch_buffer_inuse
(
context
->
audio_buffer
)
||
switch_queue_size
(
context
->
video_queue
))
{
...
...
@@ -1843,6 +1936,9 @@ static switch_status_t setup_tech_pvt(switch_core_session_t *osession, switch_co
switch_mutex_init
(
&
context
->
audio_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
video_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_mutex_init
(
&
context
->
cond_mutex
,
SWITCH_MUTEX_NESTED
,
context
->
pool
);
switch_thread_cond_create
(
&
(
context
->
cond
),
context
->
pool
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_NOTICE
,
"VLC open %s for reading
\n
"
,
path
);
...
...
src/switch_core_session.c
浏览文件 @
500b32b3
...
...
@@ -2691,6 +2691,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_execute_application_get_flag
switch_application_interface_t
*
application_interface
;
switch_status_t
status
=
SWITCH_STATUS_SUCCESS
;
switch_core_session_request_video_refresh
(
session
);
switch_core_media_gen_key_frame
(
session
);
if
(
switch_channel_down_nosig
(
session
->
channel
))
{
char
*
p
;
if
(
!
arg
&&
(
p
=
strstr
(
app
,
"::"
)))
{
...
...
src/switch_core_state_machine.c
浏览文件 @
500b32b3
...
...
@@ -361,7 +361,8 @@ void switch_core_state_machine_init(switch_memory_pool_t *pool)
if (state < CS_HANGUP && switch_channel_get_callstate(session->channel) == CCS_UNHELD) { \
switch_channel_set_callstate(session->channel, CCS_ACTIVE); \
} \
switch_core_session_request_video_refresh(session); \
switch_core_session_request_video_refresh(session); \
switch_core_media_gen_key_frame(session); \
if (!driver_state_handler->on_##__STATE || (driver_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \
)) { \
while (do_extra_handlers && (application_state_handler = switch_channel_get_state_handler(session->channel, index++)) != 0) { \
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论