Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
dba6530e
提交
dba6530e
authored
3月 20, 2013
作者:
Anthony Minessale
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FS-5011 try this rev
上级
cd0dc2c0
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
101 行增加
和
47 行删除
+101
-47
switch_core_pvt.h
src/include/private/switch_core_pvt.h
+2
-1
switch_core_io.c
src/switch_core_io.c
+66
-43
switch_core_media_bug.c
src/switch_core_media_bug.c
+33
-3
没有找到文件。
src/include/private/switch_core_pvt.h
浏览文件 @
dba6530e
...
@@ -99,7 +99,8 @@ typedef enum {
...
@@ -99,7 +99,8 @@ typedef enum {
SSF_WRITE_TRANSCODE
=
(
1
<<
6
),
SSF_WRITE_TRANSCODE
=
(
1
<<
6
),
SSF_READ_CODEC_RESET
=
(
1
<<
7
),
SSF_READ_CODEC_RESET
=
(
1
<<
7
),
SSF_WRITE_CODEC_RESET
=
(
1
<<
8
),
SSF_WRITE_CODEC_RESET
=
(
1
<<
8
),
SSF_DESTROYABLE
=
(
1
<<
9
)
SSF_DESTROYABLE
=
(
1
<<
9
),
SSF_MEDIA_BUG_TAP_ONLY
=
(
1
<<
10
)
}
switch_session_flag_t
;
}
switch_session_flag_t
;
...
...
src/switch_core_io.c
浏览文件 @
dba6530e
...
@@ -111,6 +111,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -111,6 +111,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_assert
(
session
!=
NULL
);
switch_assert
(
session
!=
NULL
);
tap_only
=
switch_test_flag
(
session
,
SSF_MEDIA_BUG_TAP_ONLY
);
switch_os_yield
();
switch_os_yield
();
...
@@ -246,14 +247,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -246,14 +247,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
goto
done
;
goto
done
;
}
}
if
(
session
->
bugs
&&
!
((
*
frame
)
->
flags
&
SFF_CNG
)
&&
!
((
*
frame
)
->
flags
&
SFF_NOT_AUDIO
))
{
if
(
session
->
bugs
&&
!
((
*
frame
)
->
flags
&
SFF_NOT_AUDIO
)
&&
!
((
*
frame
)
->
flags
&
SFF_CNG
))
{
switch_media_bug_t
*
bp
;
switch_media_bug_t
*
bp
;
switch_bool_t
ok
=
SWITCH_TRUE
;
switch_bool_t
ok
=
SWITCH_TRUE
;
int
prune
=
0
;
int
prune
=
0
;
tap_only
=
1
;
switch_thread_rwlock_rdlock
(
session
->
bug_rwlock
);
switch_thread_rwlock_rdlock
(
session
->
bug_rwlock
);
for
(
bp
=
session
->
bugs
;
bp
;
bp
=
bp
->
next
)
{
for
(
bp
=
session
->
bugs
;
bp
;
bp
=
bp
->
next
)
{
...
@@ -270,11 +268,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -270,11 +268,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
}
}
if
(
bp
->
ready
)
{
if
(
bp
->
ready
)
{
if
(
!
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_READ
)
&&
!
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_WRITE
))
{
printf
(
"FUCKER
\n\n\n
"
);
tap_only
=
0
;
}
if
(
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_READ
))
{
if
(
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_READ
))
{
if
(
bp
->
callback
)
{
if
(
bp
->
callback
)
{
bp
->
native_read_frame
=
*
frame
;
bp
->
native_read_frame
=
*
frame
;
...
@@ -306,7 +299,65 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -306,7 +299,65 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
do_resample
=
1
;
do_resample
=
1
;
}
}
if
(
session
->
bugs
&&
!
need_codec
)
{
if
(
tap_only
)
{
switch_media_bug_t
*
bp
;
switch_bool_t
ok
=
SWITCH_TRUE
;
int
prune
=
0
;
need_codec
=
0
;
do_resample
=
0
;
do_bugs
=
0
;
if
(
session
->
bugs
&&
switch_test_flag
(
*
frame
,
SFF_CNG
))
{
switch_thread_rwlock_rdlock
(
session
->
bug_rwlock
);
for
(
bp
=
session
->
bugs
;
bp
;
bp
=
bp
->
next
)
{
if
(
switch_channel_test_flag
(
session
->
channel
,
CF_PAUSE_BUGS
)
&&
!
switch_core_media_bug_test_flag
(
bp
,
SMBF_NO_PAUSE
))
{
continue
;
}
if
(
!
switch_channel_test_flag
(
session
->
channel
,
CF_ANSWERED
)
&&
switch_core_media_bug_test_flag
(
bp
,
SMBF_ANSWER_REQ
))
{
continue
;
}
if
(
switch_test_flag
(
bp
,
SMBF_PRUNE
))
{
prune
++
;
continue
;
}
if
(
bp
->
ready
&&
(
*
frame
)
->
codec
&&
(
*
frame
)
->
codec
->
implementation
&&
(
*
frame
)
->
codec
->
implementation
->
encoded_bytes_per_packet
)
{
if
(
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_READ
))
{
if
(
bp
->
callback
)
{
switch_frame_t
tmp_frame
=
{
0
};
unsigned
char
data
[
SWITCH_RECOMMENDED_BUFFER_SIZE
]
=
{
0
};
tmp_frame
.
codec
=
(
*
frame
)
->
codec
;
tmp_frame
.
datalen
=
(
*
frame
)
->
codec
->
implementation
->
encoded_bytes_per_packet
;
tmp_frame
.
samples
=
(
*
frame
)
->
codec
->
implementation
->
samples_per_packet
;
tmp_frame
.
data
=
data
;
bp
->
native_read_frame
=
&
tmp_frame
;
ok
=
bp
->
callback
(
bp
,
bp
->
user_data
,
SWITCH_ABC_TYPE_TAP_NATIVE_READ
);
bp
->
native_read_frame
=
NULL
;
}
}
}
if
((
bp
->
stop_time
&&
bp
->
stop_time
<=
switch_epoch_time_now
(
NULL
))
||
ok
==
SWITCH_FALSE
)
{
switch_set_flag
(
bp
,
SMBF_PRUNE
);
prune
++
;
}
}
switch_thread_rwlock_unlock
(
session
->
bug_rwlock
);
if
(
prune
)
{
switch_core_media_bug_prune
(
session
);
}
}
goto
done
;
}
else
if
(
session
->
bugs
&&
!
need_codec
)
{
do_bugs
=
1
;
do_bugs
=
1
;
need_codec
=
1
;
need_codec
=
1
;
}
}
...
@@ -318,7 +369,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -318,7 +369,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
switch_core_session_t
*
other_session
=
NULL
;
switch_core_session_t
*
other_session
=
NULL
;
if
(
switch_channel_test_flag
(
switch_core_session_get_channel
(
session
),
CF_BRIDGED
)
&&
if
(
switch_channel_test_flag
(
switch_core_session_get_channel
(
session
),
CF_BRIDGED
)
&&
switch_core_session_get_partner
(
session
,
&
other_session
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_core_session_get_partner
(
session
,
&
other_session
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
other_session
->
bugs
)
{
if
(
other_session
->
bugs
&&
!
switch_test_flag
(
other_session
,
SSF_MEDIA_BUG_TAP_ONLY
)
)
{
other_session_bugs
=
1
;
other_session_bugs
=
1
;
}
}
switch_core_session_rwunlock
(
other_session
);
switch_core_session_rwunlock
(
other_session
);
...
@@ -338,14 +389,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -338,14 +389,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
need_codec
=
0
;
need_codec
=
0
;
}
}
if
(
tap_only
)
{
need_codec
=
0
;
do_resample
=
0
;
do_bugs
=
0
;
goto
done
;
}
if
(
switch_test_flag
(
session
,
SSF_READ_TRANSCODE
)
&&
!
need_codec
&&
switch_core_codec_ready
(
session
->
read_codec
))
{
if
(
switch_test_flag
(
session
,
SSF_READ_TRANSCODE
)
&&
!
need_codec
&&
switch_core_codec_ready
(
session
->
read_codec
))
{
switch_core_session_t
*
other_session
;
switch_core_session_t
*
other_session
;
const
char
*
uuid
=
switch_channel_get_partner_uuid
(
switch_core_session_get_channel
(
session
));
const
char
*
uuid
=
switch_channel_get_partner_uuid
(
switch_core_session_get_channel
(
session
));
...
@@ -365,10 +408,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -365,10 +408,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
}
}
if
(
status
==
SWITCH_STATUS_SUCCESS
&&
need_codec
)
{
if
(
status
==
SWITCH_STATUS_SUCCESS
&&
need_codec
)
{
switch_frame_t
*
enc_frame
,
*
read_frame
=
*
frame
;
switch_frame_t
*
enc_frame
,
*
read_frame
=
*
frame
;
...
@@ -690,7 +729,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
...
@@ -690,7 +729,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
goto
done
;
goto
done
;
}
}
}
}
if
(
perfect
||
switch_buffer_inuse
(
session
->
raw_read_buffer
)
>=
session
->
read_impl
.
decoded_bytes_per_packet
)
{
if
(
perfect
||
switch_buffer_inuse
(
session
->
raw_read_buffer
)
>=
session
->
read_impl
.
decoded_bytes_per_packet
)
{
if
(
perfect
)
{
if
(
perfect
)
{
enc_frame
=
read_frame
;
enc_frame
=
read_frame
;
...
@@ -986,25 +1025,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
...
@@ -986,25 +1025,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
need_codec
=
TRUE
;
need_codec
=
TRUE
;
}
}
if
(
session
->
bugs
&&
!
need_codec
)
{
if
(
session
->
bugs
&&
!
need_codec
&&
!
switch_test_flag
(
session
,
SSF_MEDIA_BUG_TAP_ONLY
))
{
switch_media_bug_t
*
bp
;
do_bugs
=
TRUE
;
int
tap_only
=
1
;
need_codec
=
TRUE
;
switch_thread_rwlock_rdlock
(
session
->
bug_rwlock
);
for
(
bp
=
session
->
bugs
;
bp
;
bp
=
bp
->
next
)
{
if
(
bp
->
ready
)
{
if
(
!
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_READ
)
&&
!
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_WRITE
))
{
tap_only
=
0
;
break
;
}
}
}
switch_thread_rwlock_unlock
(
session
->
bug_rwlock
);
if
(
!
tap_only
)
{
do_bugs
=
TRUE
;
need_codec
=
TRUE
;
}
}
}
if
(
frame
->
codec
->
implementation
->
actual_samples_per_second
!=
session
->
write_impl
.
actual_samples_per_second
)
{
if
(
frame
->
codec
->
implementation
->
actual_samples_per_second
!=
session
->
write_impl
.
actual_samples_per_second
)
{
...
...
src/switch_core_media_bug.c
浏览文件 @
dba6530e
...
@@ -408,9 +408,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t
...
@@ -408,9 +408,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t
switch_media_bug_flag_t
flags
,
switch_media_bug_flag_t
flags
,
switch_media_bug_t
**
new_bug
)
switch_media_bug_t
**
new_bug
)
{
{
switch_media_bug_t
*
bug
;
//
, *bp;
switch_media_bug_t
*
bug
,
*
bp
;
switch_size_t
bytes
;
switch_size_t
bytes
;
switch_event_t
*
event
;
switch_event_t
*
event
;
int
tap_only
=
1
;
const
char
*
p
;
const
char
*
p
;
...
@@ -514,9 +515,23 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t
...
@@ -514,9 +515,23 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t
switch_thread_rwlock_wrlock
(
session
->
bug_rwlock
);
switch_thread_rwlock_wrlock
(
session
->
bug_rwlock
);
bug
->
next
=
session
->
bugs
;
bug
->
next
=
session
->
bugs
;
session
->
bugs
=
bug
;
session
->
bugs
=
bug
;
for
(
bp
=
session
->
bugs
;
bp
;
bp
=
bp
->
next
)
{
if
(
bp
->
ready
&&
!
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_READ
)
&&
!
switch_test_flag
(
bp
,
SMBF_TAP_NATIVE_WRITE
))
{
tap_only
=
0
;
}
}
switch_thread_rwlock_unlock
(
session
->
bug_rwlock
);
switch_thread_rwlock_unlock
(
session
->
bug_rwlock
);
*
new_bug
=
bug
;
*
new_bug
=
bug
;
if
(
tap_only
)
{
switch_set_flag
(
session
,
SSF_MEDIA_BUG_TAP_ONLY
);
}
else
{
switch_clear_flag
(
session
,
SSF_MEDIA_BUG_TAP_ONLY
);
}
if
(
switch_event_create
(
&
event
,
SWITCH_EVENT_MEDIA_BUG_START
)
==
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_event_create
(
&
event
,
SWITCH_EVENT_MEDIA_BUG_START
)
==
SWITCH_STATUS_SUCCESS
)
{
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"Media-Bug-Function"
,
"%s"
,
bug
->
function
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"Media-Bug-Function"
,
"%s"
,
bug
->
function
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"Media-Bug-Target"
,
"%s"
,
bug
->
target
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"Media-Bug-Target"
,
"%s"
,
bug
->
target
);
...
@@ -738,9 +753,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_close(switch_media_bug_t *
...
@@ -738,9 +753,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_close(switch_media_bug_t *
SWITCH_DECLARE
(
switch_status_t
)
switch_core_media_bug_remove
(
switch_core_session_t
*
session
,
switch_media_bug_t
**
bug
)
SWITCH_DECLARE
(
switch_status_t
)
switch_core_media_bug_remove
(
switch_core_session_t
*
session
,
switch_media_bug_t
**
bug
)
{
{
switch_media_bug_t
*
bp
=
NULL
,
*
last
=
NULL
;
switch_media_bug_t
*
bp
=
NULL
,
*
bp2
=
NULL
,
*
last
=
NULL
;
switch_status_t
status
=
SWITCH_STATUS_FALSE
;
switch_status_t
status
=
SWITCH_STATUS_FALSE
;
int
tap_only
=
0
;
if
(
switch_core_media_bug_test_flag
(
*
bug
,
SMBF_LOCK
))
{
if
(
switch_core_media_bug_test_flag
(
*
bug
,
SMBF_LOCK
))
{
return
status
;
return
status
;
}
}
...
@@ -765,6 +781,20 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove(switch_core_session
...
@@ -765,6 +781,20 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove(switch_core_session
switch_core_codec_destroy
(
&
session
->
bug_codec
);
switch_core_codec_destroy
(
&
session
->
bug_codec
);
}
}
if
(
session
->
bugs
)
{
for
(
bp2
=
session
->
bugs
;
bp2
;
bp2
=
bp2
->
next
)
{
if
(
bp2
->
ready
&&
!
switch_test_flag
(
bp2
,
SMBF_TAP_NATIVE_READ
)
&&
!
switch_test_flag
(
bp2
,
SMBF_TAP_NATIVE_WRITE
))
{
tap_only
=
0
;
}
}
}
if
(
tap_only
)
{
switch_set_flag
(
session
,
SSF_MEDIA_BUG_TAP_ONLY
);
}
else
{
switch_clear_flag
(
session
,
SSF_MEDIA_BUG_TAP_ONLY
);
}
switch_thread_rwlock_unlock
(
session
->
bug_rwlock
);
switch_thread_rwlock_unlock
(
session
->
bug_rwlock
);
if
(
bp
)
{
if
(
bp
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论