Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
468739da
提交
468739da
authored
9月 06, 2012
作者:
Robert Jongbloed
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
More T.38 fax support changes for mod_opal. Not quite there yet.
上级
a580c311
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
90 行增加
和
52 行删除
+90
-52
mod_spandsp_fax.c
src/mod/applications/mod_spandsp/mod_spandsp_fax.c
+12
-12
mod_opal.cpp
src/mod/endpoints/mod_opal/mod_opal.cpp
+75
-39
mod_opal.h
src/mod/endpoints/mod_opal/mod_opal.h
+3
-1
没有找到文件。
src/mod/applications/mod_spandsp/mod_spandsp_fax.c
浏览文件 @
468739da
...
@@ -1109,21 +1109,21 @@ static t38_mode_t request_t38(pvt_t *pvt)
...
@@ -1109,21 +1109,21 @@ static t38_mode_t request_t38(pvt_t *pvt)
if
(
!
(
t38_options
=
switch_channel_get_private
(
channel
,
"_preconfigured_t38_options"
)))
{
if
(
!
(
t38_options
=
switch_channel_get_private
(
channel
,
"_preconfigured_t38_options"
)))
{
t38_options
=
switch_core_session_alloc
(
session
,
sizeof
(
*
t38_options
));
t38_options
=
switch_core_session_alloc
(
session
,
sizeof
(
*
t38_options
));
switch_channel_set_private
(
channel
,
"_preconfigured_t38_options"
,
NULL
);
t38_options
->
T38MaxBitRate
=
(
pvt
->
disable_v17
)
?
9600
:
14400
;
t38_options
->
T38FaxVersion
=
0
;
t38_options
->
T38FaxFillBitRemoval
=
1
;
t38_options
->
T38FaxTranscodingMMR
=
0
;
t38_options
->
T38FaxTranscodingJBIG
=
0
;
t38_options
->
T38FaxRateManagement
=
"transferredTCF"
;
t38_options
->
T38FaxMaxBuffer
=
2000
;
t38_options
->
T38FaxMaxDatagram
=
LOCAL_FAX_MAX_DATAGRAM
;
t38_options
->
T38FaxUdpEC
=
"t38UDPRedundancy"
;
t38_options
->
T38VendorInfo
=
"0 0 0"
;
}
}
t38_options
->
T38MaxBitRate
=
(
pvt
->
disable_v17
)
?
9600
:
14400
;
switch_channel_set_private
(
channel
,
"t38_options"
,
t38_options
);
t38_options
->
T38FaxVersion
=
0
;
switch_channel_set_private
(
channel
,
"_preconfigured_t38_options"
,
NULL
);
t38_options
->
T38FaxFillBitRemoval
=
1
;
t38_options
->
T38FaxTranscodingMMR
=
0
;
t38_options
->
T38FaxTranscodingJBIG
=
0
;
t38_options
->
T38FaxRateManagement
=
"transferredTCF"
;
t38_options
->
T38FaxMaxBuffer
=
2000
;
t38_options
->
T38FaxMaxDatagram
=
LOCAL_FAX_MAX_DATAGRAM
;
t38_options
->
T38FaxUdpEC
=
"t38UDPRedundancy"
;
t38_options
->
T38VendorInfo
=
"0 0 0"
;
switch_channel_set_private
(
channel
,
"t38_options"
,
t38_options
);
pvt
->
t38_mode
=
T38_MODE_REQUESTED
;
pvt
->
t38_mode
=
T38_MODE_REQUESTED
;
switch_channel_set_app_flag_key
(
"T38"
,
channel
,
CF_APP_T38_REQ
);
switch_channel_set_app_flag_key
(
"T38"
,
channel
,
CF_APP_T38_REQ
);
...
...
src/mod/endpoints/mod_opal/mod_opal.cpp
浏览文件 @
468739da
...
@@ -751,7 +751,7 @@ void FSConnection::SetCodecs()
...
@@ -751,7 +751,7 @@ void FSConnection::SetCodecs()
spandsp_mod has set it us. So, if not, we actually give to spandsp_mod. */
spandsp_mod has set it us. So, if not, we actually give to spandsp_mod. */
switch_t38_options_t
*
t38_options
=
(
switch_t38_options_t
*
)
switch_channel_get_private
(
m_fsChannel
,
"t38_options"
);
switch_t38_options_t
*
t38_options
=
(
switch_t38_options_t
*
)
switch_channel_get_private
(
m_fsChannel
,
"t38_options"
);
if
(
t38_options
==
NULL
)
if
(
t38_options
==
NULL
)
SetT38OptionsFromMediaFormat
(
t38
);
SetT38OptionsFromMediaFormat
(
t38
,
"_preconfigured_t38_options"
);
else
{
else
{
t38
.
SetOptionInteger
(
"T38FaxVersion"
,
t38_options
->
T38FaxVersion
);
t38
.
SetOptionInteger
(
"T38FaxVersion"
,
t38_options
->
T38FaxVersion
);
t38
.
SetOptionInteger
(
"T38MaxBitRate"
,
t38_options
->
T38MaxBitRate
);
t38
.
SetOptionInteger
(
"T38MaxBitRate"
,
t38_options
->
T38MaxBitRate
);
...
@@ -786,18 +786,18 @@ void FSConnection::OnPatchMediaStream(PBoolean isSource, OpalMediaPatch & patch)
...
@@ -786,18 +786,18 @@ void FSConnection::OnPatchMediaStream(PBoolean isSource, OpalMediaPatch & patch)
return
;
return
;
if
(
switch_channel_direction
(
m_fsChannel
)
==
SWITCH_CALL_DIRECTION_INBOUND
)
{
if
(
switch_channel_direction
(
m_fsChannel
)
==
SWITCH_CALL_DIRECTION_INBOUND
)
{
if
(
isSource
)
if
(
isSource
)
m_rxAudioOpened
.
Signal
();
m_rxAudioOpened
.
Signal
();
else
else
m_txAudioOpened
.
Signal
();
m_txAudioOpened
.
Signal
();
}
}
else
if
(
GetMediaStream
(
OpalMediaType
::
Audio
(),
!
isSource
)
!=
NULL
)
{
else
if
(
GetMediaStream
(
OpalMediaType
::
Audio
(),
!
isSource
)
!=
NULL
)
{
// Have open media in both directions.
// Have open media in both directions.
if
(
IsEstablished
())
if
(
IsEstablished
())
switch_channel_mark_answered
(
m_fsChannel
);
switch_channel_mark_answered
(
m_fsChannel
);
else
if
(
!
IsReleased
())
else
if
(
!
IsReleased
())
switch_channel_mark_pre_answered
(
m_fsChannel
);
switch_channel_mark_pre_answered
(
m_fsChannel
);
}
}
}
}
...
@@ -978,17 +978,22 @@ switch_status_t FSConnection::receive_message(switch_core_session_message_t *msg
...
@@ -978,17 +978,22 @@ switch_status_t FSConnection::receive_message(switch_core_session_message_t *msg
#if HAVE_T38
#if HAVE_T38
case
SWITCH_MESSAGE_INDICATE_REQUEST_IMAGE_MEDIA
:
case
SWITCH_MESSAGE_INDICATE_REQUEST_IMAGE_MEDIA
:
{
{
PTRACE
(
2
,
"mod_opal
\t
Requesting switch to T.38"
);
PSafePtr
<
OpalConnection
>
other
=
GetOtherPartyConnection
();
PSafePtr
<
OpalConnection
>
other
=
GetOtherPartyConnection
();
if
(
other
==
NULL
||
!
other
->
SwitchT38
(
true
))
{
if
(
other
!=
NULL
&&
other
->
SwitchT38
(
true
))
switch_channel_set_flag
(
m_fsChannel
,
CF_REQ_MEDIA
);
else
{
PTRACE
(
1
,
"mod_opal
\t
Mode change request to T.38 failed"
);
PTRACE
(
1
,
"mod_opal
\t
Mode change request to T.38 failed"
);
}
}
break
;
break
;
}
}
case
SWITCH_MESSAGE_INDICATE_T38_DESCRIPTION
:
case
SWITCH_MESSAGE_INDICATE_T38_DESCRIPTION
:
PTRACE
(
2
,
"mod_opal
\t
SWITCH_MESSAGE_INDICATE_T38_DESCRIPTION"
);
break
;
break
;
case
SWITCH_MESSAGE_INDICATE_UDPTL_MODE
:
case
SWITCH_MESSAGE_INDICATE_UDPTL_MODE
:
PTRACE
(
2
,
"mod_opal
\t
SWITCH_MESSAGE_INDICATE_UDPTL_MODE"
);
break
;
break
;
#endif // HAVE_T38
#endif // HAVE_T38
...
@@ -1018,9 +1023,9 @@ bool FSConnection::WaitForMedia()
...
@@ -1018,9 +1023,9 @@ bool FSConnection::WaitForMedia()
#if HAVE_T38
#if HAVE_T38
void
FSConnection
::
SetT38OptionsFromMediaFormat
(
const
OpalMediaFormat
&
mediaFormat
)
void
FSConnection
::
SetT38OptionsFromMediaFormat
(
const
OpalMediaFormat
&
mediaFormat
,
const
char
*
varname
)
{
{
switch_t38_options_t
*
t38_options
=
(
switch_t38_options_t
*
)
switch_channel_get_private
(
m_fsChannel
,
"t38_options"
);
switch_t38_options_t
*
t38_options
=
(
switch_t38_options_t
*
)
switch_channel_get_private
(
m_fsChannel
,
varname
);
if
(
t38_options
==
NULL
)
if
(
t38_options
==
NULL
)
t38_options
=
(
switch_t38_options_t
*
)
switch_core_session_alloc
(
m_fsSession
,
sizeof
(
switch_t38_options_t
));
t38_options
=
(
switch_t38_options_t
*
)
switch_core_session_alloc
(
m_fsSession
,
sizeof
(
switch_t38_options_t
));
...
@@ -1044,45 +1049,55 @@ void FSConnection::SetT38OptionsFromMediaFormat(const OpalMediaFormat & mediaFor
...
@@ -1044,45 +1049,55 @@ void FSConnection::SetT38OptionsFromMediaFormat(const OpalMediaFormat & mediaFor
//t38_options->remote_ip = switch_core_session_strdup(session, mediaFormat.something);
//t38_options->remote_ip = switch_core_session_strdup(session, mediaFormat.something);
//t38_options->remote_port = mediaFormat.something;
//t38_options->remote_port = mediaFormat.something;
switch_channel_set_private
(
m_fsChannel
,
"t38_options"
,
t38_options
);
switch_channel_set_private
(
m_fsChannel
,
varname
,
t38_options
);
PTRACE
(
3
,
"mod_opal
\t
Set "
<<
varname
);
}
}
void
FSConnection
::
OnSwitchedT38
(
bool
toT38
,
bool
success
)
void
FSConnection
::
OnSwitchedT38
(
bool
toT38
,
bool
success
)
{
{
PTRACE
(
3
,
"mod_opal
\t
Mode change request to fax succeeded"
);
if
(
!
toT38
||
!
success
||
!
IndicateSwitchedT38
())
OnSwitchingT38
(
toT38
&&
success
);
AbortT38
(
);
}
}
void
FSConnection
::
OnSwitchingT38
(
bool
toT38
)
void
FSConnection
::
OnSwitchingT38
(
bool
toT38
)
{
{
if
(
!
toT38
)
{
if
(
!
toT38
||
!
IndicateSwitchedT38
())
switch_channel_set_private
(
m_fsChannel
,
"t38_options"
,
NULL
);
AbortT38
();
switch_channel_clear_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38
);
}
switch_channel_clear_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38_REQ
);
switch_channel_set_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38_FAIL
);
return
;
void
FSConnection
::
AbortT38
()
}
{
PTRACE
(
3
,
"mod_opal
\t
Mode change request to T.38 failed"
);
switch_channel_set_private
(
m_fsChannel
,
"t38_options"
,
NULL
);
switch_channel_clear_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38
);
switch_channel_clear_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38_REQ
);
switch_channel_set_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38_FAIL
);
}
bool
FSConnection
::
IndicateSwitchedT38
()
{
PSafePtr
<
OpalConnection
>
other
=
GetOtherPartyConnection
();
PSafePtr
<
OpalConnection
>
other
=
GetOtherPartyConnection
();
if
(
other
==
NULL
)
if
(
other
==
NULL
)
return
;
return
false
;
OpalMediaFormatList
otherFormats
=
other
->
GetMediaFormats
();
OpalMediaFormatList
otherFormats
=
other
->
GetMediaFormats
();
OpalMediaFormatList
::
const_iterator
t38
=
otherFormats
.
FindFormat
(
OpalT38
);
OpalMediaFormatList
::
const_iterator
t38
=
otherFormats
.
FindFormat
(
OpalT38
);
if
(
t38
==
otherFormats
.
end
())
if
(
t38
==
otherFormats
.
end
())
return
;
return
false
;
SetT38OptionsFromMediaFormat
(
*
t38
);
SetT38OptionsFromMediaFormat
(
*
t38
,
"t38_options"
);
switch_channel_set_variable
(
m_fsChannel
,
"has_t38"
,
"true"
);
switch_channel_set_variable
(
m_fsChannel
,
"has_t38"
,
"true"
);
switch_channel_set_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38
);
switch_channel_set_app_flag_key
(
"T38"
,
m_fsChannel
,
CF_APP_T38
);
switch_channel_execute_on
(
m_fsChannel
,
"opal_execute_on_
image
"
);
switch_channel_execute_on
(
m_fsChannel
,
"opal_execute_on_
t38
"
);
switch_channel_api_on
(
m_fsChannel
,
"opal_api_on_
image
"
);
switch_channel_api_on
(
m_fsChannel
,
"opal_api_on_
t38
"
);
PTRACE
(
3
,
"mod_opal
\t
Mode change request to T.38 succeeded"
);
return
;
return
true
;
}
}
#endif // HAVE_T38
#endif // HAVE_T38
...
@@ -1103,13 +1118,21 @@ switch_status_t FSConnection::state_change()
...
@@ -1103,13 +1118,21 @@ switch_status_t FSConnection::state_change()
switch_status_t
FSConnection
::
read_audio_frame
(
switch_frame_t
**
frame
,
switch_io_flag_t
flags
,
int
stream_id
)
switch_status_t
FSConnection
::
read_audio_frame
(
switch_frame_t
**
frame
,
switch_io_flag_t
flags
,
int
stream_id
)
{
{
return
read_frame
(
OpalMediaType
::
Audio
(),
frame
,
flags
);
// Avoid all the channel closing and re-opening upsetting FS
if
(
ownerCall
.
IsSwitchingT38
())
return
SWITCH_STATUS_SUCCESS
;
return
read_frame
((
flags
&
SFF_UDPTL_PACKET
)
?
OpalMediaType
::
Fax
()
:
OpalMediaType
::
Audio
(),
frame
,
flags
);
}
}
switch_status_t
FSConnection
::
write_audio_frame
(
switch_frame_t
*
frame
,
switch_io_flag_t
flags
,
int
stream_id
)
switch_status_t
FSConnection
::
write_audio_frame
(
switch_frame_t
*
frame
,
switch_io_flag_t
flags
,
int
stream_id
)
{
{
return
write_frame
(
OpalMediaType
::
Audio
(),
frame
,
flags
);
// Avoid all the channel closing and re-opening upsetting FS
if
(
ownerCall
.
IsSwitchingT38
())
return
SWITCH_STATUS_SUCCESS
;
return
write_frame
((
flags
&
SFF_UDPTL_PACKET
)
?
OpalMediaType
::
Fax
()
:
OpalMediaType
::
Audio
(),
frame
,
flags
);
}
}
...
@@ -1128,14 +1151,22 @@ switch_status_t FSConnection::write_video_frame(switch_frame_t *frame, switch_io
...
@@ -1128,14 +1151,22 @@ switch_status_t FSConnection::write_video_frame(switch_frame_t *frame, switch_io
switch_status_t
FSConnection
::
read_frame
(
const
OpalMediaType
&
mediaType
,
switch_frame_t
**
frame
,
switch_io_flag_t
flags
)
switch_status_t
FSConnection
::
read_frame
(
const
OpalMediaType
&
mediaType
,
switch_frame_t
**
frame
,
switch_io_flag_t
flags
)
{
{
PSafePtr
<
FSMediaStream
>
stream
=
PSafePtrCast
<
OpalMediaStream
,
FSMediaStream
>
(
GetMediaStream
(
mediaType
,
false
));
PSafePtr
<
FSMediaStream
>
stream
=
PSafePtrCast
<
OpalMediaStream
,
FSMediaStream
>
(
GetMediaStream
(
mediaType
,
false
));
return
stream
!=
NULL
?
stream
->
read_frame
(
frame
,
flags
)
:
SWITCH_STATUS_FALSE
;
if
(
stream
!=
NULL
)
return
stream
->
read_frame
(
frame
,
flags
);
PTRACE
(
2
,
"mod_opal
\t
No stream for read of "
<<
mediaType
);
return
SWITCH_STATUS_SUCCESS
;
}
}
switch_status_t
FSConnection
::
write_frame
(
const
OpalMediaType
&
mediaType
,
const
switch_frame_t
*
frame
,
switch_io_flag_t
flags
)
switch_status_t
FSConnection
::
write_frame
(
const
OpalMediaType
&
mediaType
,
const
switch_frame_t
*
frame
,
switch_io_flag_t
flags
)
{
{
PSafePtr
<
FSMediaStream
>
stream
=
PSafePtrCast
<
OpalMediaStream
,
FSMediaStream
>
(
GetMediaStream
(
mediaType
,
true
));
PSafePtr
<
FSMediaStream
>
stream
=
PSafePtrCast
<
OpalMediaStream
,
FSMediaStream
>
(
GetMediaStream
(
mediaType
,
true
));
return
stream
!=
NULL
?
stream
->
write_frame
(
frame
,
flags
)
:
SWITCH_STATUS_FALSE
;
if
(
stream
!=
NULL
)
return
stream
->
write_frame
(
frame
,
flags
);
PTRACE
(
2
,
"mod_opal
\t
No stream for write of "
<<
mediaType
);
return
SWITCH_STATUS_SUCCESS
;
}
}
...
@@ -1266,17 +1297,17 @@ PBoolean FSMediaStream::RequiresPatchThread(OpalMediaStream *) const
...
@@ -1266,17 +1297,17 @@ PBoolean FSMediaStream::RequiresPatchThread(OpalMediaStream *) const
int
FSMediaStream
::
StartReadWrite
(
PatchPtr
&
mediaPatch
)
const
int
FSMediaStream
::
StartReadWrite
(
PatchPtr
&
mediaPatch
)
const
{
{
if
(
!
IsOpen
())
{
if
(
!
IsOpen
())
{
PTRACE
(
2
,
"mod_opal
\t
Not open!"
);
PTRACE
(
1
,
"mod_opal
\t
Not open!"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
m_switchCodec
)
{
if
(
!
m_switchCodec
)
{
PTRACE
(
2
,
"mod_opal
\t
No codec!"
);
PTRACE
(
1
,
"mod_opal
\t
No codec!"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
m_connection
.
IsChannelReady
())
{
if
(
!
m_connection
.
IsChannelReady
())
{
PTRACE
(
2
,
"mod_opal
\t
Channel not ready!"
);
PTRACE
(
1
,
"mod_opal
\t
Channel not ready!"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -1285,7 +1316,7 @@ int FSMediaStream::StartReadWrite(PatchPtr & mediaPatch) const
...
@@ -1285,7 +1316,7 @@ int FSMediaStream::StartReadWrite(PatchPtr & mediaPatch) const
if
(
mediaPatch
==
NULL
)
{
if
(
mediaPatch
==
NULL
)
{
/*There is a race here... sometimes we make it here and m_mediaPatch is NULL
/*There is a race here... sometimes we make it here and m_mediaPatch is NULL
if we wait it shows up in 1ms, maybe there is a better way to wait. */
if we wait it shows up in 1ms, maybe there is a better way to wait. */
PTRACE
(
3
,
"mod_opal
\t
Patch not ready!"
);
PTRACE
(
2
,
"mod_opal
\t
Patch not ready!"
);
return
1
;
return
1
;
}
}
...
@@ -1310,6 +1341,7 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag
...
@@ -1310,6 +1341,7 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag
m_readRTP
.
SetTimestamp
(
m_readFrame
.
timestamp
+
m_switchCodec
->
implementation
->
samples_per_packet
);
m_readRTP
.
SetTimestamp
(
m_readFrame
.
timestamp
+
m_switchCodec
->
implementation
->
samples_per_packet
);
if
(
!
mediaPatch
->
GetSource
().
ReadPacket
(
m_readRTP
))
{
if
(
!
mediaPatch
->
GetSource
().
ReadPacket
(
m_readRTP
))
{
PTRACE
(
1
,
"mod_opal
\t
read_frame: no source data!"
);
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
}
}
...
@@ -1320,7 +1352,7 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag
...
@@ -1320,7 +1352,7 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag
if
(
m_switchCodec
!=
NULL
)
{
if
(
m_switchCodec
!=
NULL
)
{
if
(
!
switch_core_codec_ready
(
m_switchCodec
))
{
if
(
!
switch_core_codec_ready
(
m_switchCodec
))
{
PTRACE
(
2
,
"mod_opal
\t
read_frame: codec not ready!"
);
PTRACE
(
1
,
"mod_opal
\t
read_frame: codec not ready!"
);
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
}
}
...
@@ -1385,7 +1417,11 @@ switch_status_t FSMediaStream::write_frame(const switch_frame_t *frame, switch_i
...
@@ -1385,7 +1417,11 @@ switch_status_t FSMediaStream::write_frame(const switch_frame_t *frame, switch_i
timestamp
+=
m_switchCodec
->
implementation
->
samples_per_packet
;
timestamp
+=
m_switchCodec
->
implementation
->
samples_per_packet
;
rtp
.
SetTimestamp
(
timestamp
);
rtp
.
SetTimestamp
(
timestamp
);
return
mediaPatch
->
PushFrame
(
rtp
)
?
SWITCH_STATUS_SUCCESS
:
SWITCH_STATUS_FALSE
;
if
(
mediaPatch
->
PushFrame
(
rtp
))
return
SWITCH_STATUS_SUCCESS
;
PTRACE
(
1
,
"mod_opal
\t
read_frame: push failed!"
);
return
SWITCH_STATUS_FALSE
;
}
}
...
...
src/mod/endpoints/mod_opal/mod_opal.h
浏览文件 @
468739da
...
@@ -305,7 +305,9 @@ class FSConnection : public OpalLocalConnection
...
@@ -305,7 +305,9 @@ class FSConnection : public OpalLocalConnection
void
SetCodecs
();
void
SetCodecs
();
bool
WaitForMedia
();
bool
WaitForMedia
();
#if HAVE_T38
#if HAVE_T38
void
SetT38OptionsFromMediaFormat
(
const
OpalMediaFormat
&
mediaFormat
);
void
SetT38OptionsFromMediaFormat
(
const
OpalMediaFormat
&
mediaFormat
,
const
char
*
varname
);
bool
IndicateSwitchedT38
();
void
AbortT38
();
#endif
#endif
switch_status_t
read_frame
(
const
OpalMediaType
&
mediaType
,
switch_frame_t
**
frame
,
switch_io_flag_t
flags
);
switch_status_t
read_frame
(
const
OpalMediaType
&
mediaType
,
switch_frame_t
**
frame
,
switch_io_flag_t
flags
);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论