Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2014-03-08 14:38:19 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
bfe771bbba6ef16cc94c766fe0ed8bcce24067ce
bfe771bb
1 parent
e40be6e8
amf0 utest: null,undefined,object-eof to any
显示空白字符变更
内嵌
并排对比
正在显示
9 个修改的文件
包含
286 行增加
和
220 行删除
trunk/src/app/srs_app_bandwidth.cpp
trunk/src/app/srs_app_hls.cpp
trunk/src/app/srs_app_source.cpp
trunk/src/rtmp/srs_protocol_amf0.cpp
trunk/src/rtmp/srs_protocol_amf0.hpp
trunk/src/rtmp/srs_protocol_rtmp.cpp
trunk/src/rtmp/srs_protocol_rtmp_stack.cpp
trunk/src/rtmp/srs_protocol_rtmp_stack.hpp
trunk/src/utest/srs_utest_amf0.cpp
trunk/src/app/srs_app_bandwidth.cpp
查看文件 @
bfe771b
...
...
@@ -178,15 +178,15 @@ int SrsBandwidth::do_bandwidth_check()
// send finished msg
SrsBandwidthPacket
*
pkt
=
SrsBandwidthPacket
::
create_finish
();
pkt
->
data
->
set
(
"code"
,
new
SrsAmf0Number
(
ERROR_SUCCESS
));
pkt
->
data
->
set
(
"start_time"
,
new
SrsAmf0Number
(
start_time
));
pkt
->
data
->
set
(
"end_time"
,
new
SrsAmf0Number
(
end_time
));
pkt
->
data
->
set
(
"play_kbps"
,
new
SrsAmf0Number
(
play_kbps
));
pkt
->
data
->
set
(
"publish_kbps"
,
new
SrsAmf0Number
(
publish_kbps
));
pkt
->
data
->
set
(
"play_bytes"
,
new
SrsAmf0Number
(
play_bytes
));
pkt
->
data
->
set
(
"play_time"
,
new
SrsAmf0Number
(
play_actual_duration_ms
));
pkt
->
data
->
set
(
"publish_bytes"
,
new
SrsAmf0Number
(
publish_bytes
));
pkt
->
data
->
set
(
"publish_time"
,
new
SrsAmf0Number
(
publish_actual_duration_ms
));
pkt
->
data
->
set
(
"code"
,
SrsAmf0Any
::
number
(
ERROR_SUCCESS
));
pkt
->
data
->
set
(
"start_time"
,
SrsAmf0Any
::
number
(
start_time
));
pkt
->
data
->
set
(
"end_time"
,
SrsAmf0Any
::
number
(
end_time
));
pkt
->
data
->
set
(
"play_kbps"
,
SrsAmf0Any
::
number
(
play_kbps
));
pkt
->
data
->
set
(
"publish_kbps"
,
SrsAmf0Any
::
number
(
publish_kbps
));
pkt
->
data
->
set
(
"play_bytes"
,
SrsAmf0Any
::
number
(
play_bytes
));
pkt
->
data
->
set
(
"play_time"
,
SrsAmf0Any
::
number
(
play_actual_duration_ms
));
pkt
->
data
->
set
(
"publish_bytes"
,
SrsAmf0Any
::
number
(
publish_bytes
));
pkt
->
data
->
set
(
"publish_time"
,
SrsAmf0Any
::
number
(
publish_actual_duration_ms
));
SrsCommonMessage
*
msg
=
(
new
SrsCommonMessage
())
->
set_packet
(
pkt
,
0
);
if
((
ret
=
rtmp
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
...
...
@@ -229,8 +229,8 @@ int SrsBandwidth::check_play(
// send start play command to client
SrsBandwidthPacket
*
pkt
=
SrsBandwidthPacket
::
create_start_play
();
pkt
->
data
->
set
(
"duration_ms"
,
new
SrsAmf0Number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
new
SrsAmf0Number
(
interval_ms
));
pkt
->
data
->
set
(
"duration_ms"
,
SrsAmf0Any
::
number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
SrsAmf0Any
::
number
(
interval_ms
));
SrsCommonMessage
*
msg
=
(
new
SrsCommonMessage
())
->
set_packet
(
pkt
,
0
);
if
((
ret
=
rtmp
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
...
...
@@ -308,10 +308,10 @@ int SrsBandwidth::check_play(
if
(
true
)
{
// notify client to stop play
SrsBandwidthPacket
*
pkt
=
SrsBandwidthPacket
::
create_stop_play
();
pkt
->
data
->
set
(
"duration_ms"
,
new
SrsAmf0Number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
new
SrsAmf0Number
(
interval_ms
));
pkt
->
data
->
set
(
"duration_delta"
,
new
SrsAmf0Number
(
actual_duration_ms
));
pkt
->
data
->
set
(
"bytes_delta"
,
new
SrsAmf0Number
(
play_bytes
));
pkt
->
data
->
set
(
"duration_ms"
,
SrsAmf0Any
::
number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
SrsAmf0Any
::
number
(
interval_ms
));
pkt
->
data
->
set
(
"duration_delta"
,
SrsAmf0Any
::
number
(
actual_duration_ms
));
pkt
->
data
->
set
(
"bytes_delta"
,
SrsAmf0Any
::
number
(
play_bytes
));
SrsCommonMessage
*
msg
=
(
new
SrsCommonMessage
())
->
set_packet
(
pkt
,
0
);
if
((
ret
=
rtmp
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
...
...
@@ -353,8 +353,8 @@ int SrsBandwidth::check_publish(
// notify client to start publish
SrsBandwidthPacket
*
pkt
=
SrsBandwidthPacket
::
create_start_publish
();
pkt
->
data
->
set
(
"duration_ms"
,
new
SrsAmf0Number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
new
SrsAmf0Number
(
interval_ms
));
pkt
->
data
->
set
(
"duration_ms"
,
SrsAmf0Any
::
number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
SrsAmf0Any
::
number
(
interval_ms
));
SrsCommonMessage
*
msg
=
(
new
SrsCommonMessage
())
->
set_packet
(
pkt
,
0
);
if
((
ret
=
rtmp
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
...
...
@@ -414,10 +414,10 @@ int SrsBandwidth::check_publish(
if
(
true
)
{
// notify client to stop publish
SrsBandwidthPacket
*
pkt
=
SrsBandwidthPacket
::
create_stop_publish
();
pkt
->
data
->
set
(
"duration_ms"
,
new
SrsAmf0Number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
new
SrsAmf0Number
(
interval_ms
));
pkt
->
data
->
set
(
"duration_delta"
,
new
SrsAmf0Number
(
actual_duration_ms
));
pkt
->
data
->
set
(
"bytes_delta"
,
new
SrsAmf0Number
(
publish_bytes
));
pkt
->
data
->
set
(
"duration_ms"
,
SrsAmf0Any
::
number
(
duration_ms
));
pkt
->
data
->
set
(
"interval_ms"
,
SrsAmf0Any
::
number
(
interval_ms
));
pkt
->
data
->
set
(
"duration_delta"
,
SrsAmf0Any
::
number
(
actual_duration_ms
));
pkt
->
data
->
set
(
"bytes_delta"
,
SrsAmf0Any
::
number
(
publish_bytes
));
SrsCommonMessage
*
msg
=
(
new
SrsCommonMessage
())
->
set_packet
(
pkt
,
0
);
if
((
ret
=
rtmp
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
...
...
trunk/src/app/srs_app_hls.cpp
查看文件 @
bfe771b
...
...
@@ -1221,29 +1221,29 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata)
SrsAmf0Any
*
prop
=
NULL
;
if
((
prop
=
obj
->
get_property
(
"duration"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
duration
=
(
int
)
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
codec
->
duration
=
(
int
)
prop
->
to_number
()
;
}
if
((
prop
=
obj
->
get_property
(
"width"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
width
=
(
int
)
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
codec
->
width
=
(
int
)
prop
->
to_number
()
;
}
if
((
prop
=
obj
->
get_property
(
"height"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
height
=
(
int
)
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
codec
->
height
=
(
int
)
prop
->
to_number
()
;
}
if
((
prop
=
obj
->
get_property
(
"framerate"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
frame_rate
=
(
int
)
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
codec
->
frame_rate
=
(
int
)
prop
->
to_number
()
;
}
if
((
prop
=
obj
->
get_property
(
"videocodecid"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
video_codec_id
=
(
int
)
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
codec
->
video_codec_id
=
(
int
)
prop
->
to_number
()
;
}
if
((
prop
=
obj
->
get_property
(
"videodatarate"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
video_data_rate
=
(
int
)(
1000
*
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
);
codec
->
video_data_rate
=
(
int
)(
1000
*
prop
->
to_number
()
);
}
if
((
prop
=
obj
->
get_property
(
"audiocodecid"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
audio_codec_id
=
(
int
)
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
codec
->
audio_codec_id
=
(
int
)
prop
->
to_number
()
;
}
if
((
prop
=
obj
->
get_property
(
"audiodatarate"
))
!=
NULL
&&
prop
->
is_number
())
{
codec
->
audio_data_rate
=
(
int
)(
1000
*
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
);
codec
->
audio_data_rate
=
(
int
)(
1000
*
prop
->
to_number
()
);
}
// ignore the following, for each flv/rtmp packet contains them:
...
...
trunk/src/app/srs_app_source.cpp
查看文件 @
bfe771b
...
...
@@ -645,12 +645,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
SrsAmf0Any
*
prop
=
NULL
;
if
((
prop
=
metadata
->
metadata
->
get_property
(
"audiosamplerate"
))
!=
NULL
)
{
if
(
prop
->
is_number
())
{
sample_rate
=
(
int
)
(
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
);
sample_rate
=
(
int
)
prop
->
to_number
(
);
}
}
if
((
prop
=
metadata
->
metadata
->
get_property
(
"framerate"
))
!=
NULL
)
{
if
(
prop
->
is_number
())
{
frame_rate
=
(
int
)
(
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
);
frame_rate
=
(
int
)
prop
->
to_number
(
);
}
}
...
...
trunk/src/rtmp/srs_protocol_amf0.cpp
查看文件 @
bfe771b
...
...
@@ -56,8 +56,8 @@ using namespace std;
// User defined
#define RTMP_AMF0_Invalid 0x3F
int
srs_amf0_read_object_eof
(
SrsStream
*
stream
,
SrsAmf0ObjectEOF
*&
);
int
srs_amf0_write_object_eof
(
SrsStream
*
stream
,
SrsAmf0ObjectEOF
*
);
int
srs_amf0_read_object_eof
(
SrsStream
*
stream
,
__SrsAmf0ObjectEOF
*&
);
int
srs_amf0_write_object_eof
(
SrsStream
*
stream
,
__SrsAmf0ObjectEOF
*
);
int
srs_amf0_read_any
(
SrsStream
*
stream
,
SrsAmf0Any
*&
value
);
int
srs_amf0_write_any
(
SrsStream
*
stream
,
SrsAmf0Any
*
value
);
...
...
@@ -117,6 +117,12 @@ bool SrsAmf0Any::to_boolean()
return
o
->
value
;
}
double
SrsAmf0Any
::
to_number
()
{
__SrsAmf0Number
*
o
=
srs_amf0_convert
<
__SrsAmf0Number
>
(
this
);
return
o
->
value
;
}
bool
SrsAmf0Any
::
is_object_eof
()
{
return
marker
==
RTMP_AMF0_ObjectEnd
;
...
...
@@ -132,69 +138,26 @@ SrsAmf0Any* SrsAmf0Any::boolean(bool value)
return
new
__SrsAmf0Boolean
(
value
);
}
SrsAmf0Number
::
SrsAmf0Number
(
double
_value
)
{
marker
=
RTMP_AMF0_Number
;
value
=
_value
;
}
SrsAmf0Number
::~
SrsAmf0Number
()
{
}
int
SrsAmf0Number
::
size
()
{
return
SrsAmf0Size
::
number
();
}
SrsAmf0Null
::
SrsAmf0Null
()
{
marker
=
RTMP_AMF0_Null
;
}
SrsAmf0Null
::~
SrsAmf0Null
()
{
}
int
SrsAmf0Null
::
size
()
{
return
SrsAmf0Size
::
null
();
}
SrsAmf0Undefined
::
SrsAmf0Undefined
()
{
marker
=
RTMP_AMF0_Undefined
;
}
SrsAmf0Undefined
::~
SrsAmf0Undefined
()
{
}
int
SrsAmf0Undefined
::
size
()
SrsAmf0Any
*
SrsAmf0Any
::
number
(
double
value
)
{
return
SrsAmf0Size
::
undefined
(
);
return
new
__SrsAmf0Number
(
value
);
}
SrsAmf0
ObjectEOF
::
SrsAmf0ObjectEOF
()
SrsAmf0
Any
*
SrsAmf0Any
::
null
()
{
marker
=
RTMP_AMF0_ObjectEnd
;
utf8_empty
=
0x00
;
return
new
__SrsAmf0Null
();
}
SrsAmf0
ObjectEOF
::~
SrsAmf0ObjectEOF
()
SrsAmf0
Any
*
SrsAmf0Any
::
undefined
()
{
return
new
__SrsAmf0Undefined
();
}
int
SrsAmf0ObjectEOF
::
siz
e
()
__SrsUnSortedHashtable
::
__SrsUnSortedHashtabl
e
()
{
return
SrsAmf0Size
::
object_eof
();
}
SrsUnSortedHashtable
::
SrsUnSortedHashtable
()
{
}
SrsUnSortedHashtable
::~
SrsUnSortedHashtable
()
__SrsUnSortedHashtable
::~
__SrsUnSortedHashtable
()
{
std
::
vector
<
SrsObjectPropertyType
>::
iterator
it
;
for
(
it
=
properties
.
begin
();
it
!=
properties
.
end
();
++
it
)
{
...
...
@@ -205,31 +168,31 @@ SrsUnSortedHashtable::~SrsUnSortedHashtable()
properties
.
clear
();
}
int
SrsUnSortedHashtable
::
size
()
int
__
SrsUnSortedHashtable
::
size
()
{
return
(
int
)
properties
.
size
();
}
void
SrsUnSortedHashtable
::
clear
()
void
__
SrsUnSortedHashtable
::
clear
()
{
properties
.
clear
();
}
std
::
string
SrsUnSortedHashtable
::
key_at
(
int
index
)
std
::
string
__
SrsUnSortedHashtable
::
key_at
(
int
index
)
{
srs_assert
(
index
<
size
());
SrsObjectPropertyType
&
elem
=
properties
[
index
];
return
elem
.
first
;
}
SrsAmf0Any
*
SrsUnSortedHashtable
::
value_at
(
int
index
)
SrsAmf0Any
*
__
SrsUnSortedHashtable
::
value_at
(
int
index
)
{
srs_assert
(
index
<
size
());
SrsObjectPropertyType
&
elem
=
properties
[
index
];
return
elem
.
second
;
}
void
SrsUnSortedHashtable
::
set
(
std
::
string
key
,
SrsAmf0Any
*
value
)
void
__
SrsUnSortedHashtable
::
set
(
std
::
string
key
,
SrsAmf0Any
*
value
)
{
std
::
vector
<
SrsObjectPropertyType
>::
iterator
it
;
...
...
@@ -248,7 +211,7 @@ void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value)
properties
.
push_back
(
std
::
make_pair
(
key
,
value
));
}
SrsAmf0Any
*
SrsUnSortedHashtable
::
get_property
(
std
::
string
name
)
SrsAmf0Any
*
__
SrsUnSortedHashtable
::
get_property
(
std
::
string
name
)
{
std
::
vector
<
SrsObjectPropertyType
>::
iterator
it
;
...
...
@@ -264,7 +227,7 @@ SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name)
return
NULL
;
}
SrsAmf0Any
*
SrsUnSortedHashtable
::
ensure_property_string
(
std
::
string
name
)
SrsAmf0Any
*
__
SrsUnSortedHashtable
::
ensure_property_string
(
std
::
string
name
)
{
SrsAmf0Any
*
prop
=
get_property
(
name
);
...
...
@@ -279,7 +242,7 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name)
return
prop
;
}
SrsAmf0Any
*
SrsUnSortedHashtable
::
ensure_property_number
(
std
::
string
name
)
SrsAmf0Any
*
__
SrsUnSortedHashtable
::
ensure_property_number
(
std
::
string
name
)
{
SrsAmf0Any
*
prop
=
get_property
(
name
);
...
...
@@ -294,6 +257,21 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name)
return
prop
;
}
__SrsAmf0ObjectEOF
::
__SrsAmf0ObjectEOF
()
{
marker
=
RTMP_AMF0_ObjectEnd
;
utf8_empty
=
0x00
;
}
__SrsAmf0ObjectEOF
::~
__SrsAmf0ObjectEOF
()
{
}
int
__SrsAmf0ObjectEOF
::
size
()
{
return
SrsAmf0Size
::
object_eof
();
}
SrsAmf0Object
::
SrsAmf0Object
()
{
marker
=
RTMP_AMF0_Object
;
...
...
@@ -709,6 +687,49 @@ int __SrsAmf0Boolean::size()
return
SrsAmf0Size
::
boolean
();
}
__SrsAmf0Number
::
__SrsAmf0Number
(
double
_value
)
{
marker
=
RTMP_AMF0_Number
;
value
=
_value
;
}
__SrsAmf0Number
::~
__SrsAmf0Number
()
{
}
int
__SrsAmf0Number
::
size
()
{
return
SrsAmf0Size
::
number
();
}
__SrsAmf0Null
::
__SrsAmf0Null
()
{
marker
=
RTMP_AMF0_Null
;
}
__SrsAmf0Null
::~
__SrsAmf0Null
()
{
}
int
__SrsAmf0Null
::
size
()
{
return
SrsAmf0Size
::
null
();
}
__SrsAmf0Undefined
::
__SrsAmf0Undefined
()
{
marker
=
RTMP_AMF0_Undefined
;
}
__SrsAmf0Undefined
::~
__SrsAmf0Undefined
()
{
}
int
__SrsAmf0Undefined
::
size
()
{
return
SrsAmf0Size
::
undefined
();
}
int
srs_amf0_read_utf8
(
SrsStream
*
stream
,
std
::
string
&
value
)
{
int
ret
=
ERROR_SUCCESS
;
...
...
@@ -1073,22 +1094,21 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
if
((
ret
=
srs_amf0_read_number
(
stream
,
data
))
!=
ERROR_SUCCESS
)
{
return
ret
;
}
value
=
new
SrsAmf0Number
();
srs_amf0_convert
<
SrsAmf0Number
>
(
value
)
->
value
=
data
;
value
=
SrsAmf0Any
::
number
(
data
);
return
ret
;
}
case
RTMP_AMF0_Null
:
{
stream
->
skip
(
1
);
value
=
new
SrsAmf0Null
();
value
=
new
__
SrsAmf0Null
();
return
ret
;
}
case
RTMP_AMF0_Undefined
:
{
stream
->
skip
(
1
);
value
=
new
SrsAmf0Undefined
();
value
=
new
__
SrsAmf0Undefined
();
return
ret
;
}
case
RTMP_AMF0_ObjectEnd
:
{
SrsAmf0ObjectEOF
*
p
=
NULL
;
__
SrsAmf0ObjectEOF
*
p
=
NULL
;
if
((
ret
=
srs_amf0_read_object_eof
(
stream
,
p
))
!=
ERROR_SUCCESS
)
{
return
ret
;
}
...
...
@@ -1137,7 +1157,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
return
srs_amf0_write_boolean
(
stream
,
data
);
}
case
RTMP_AMF0_Number
:
{
double
data
=
srs_amf0_convert
<
SrsAmf0Number
>
(
value
)
->
value
;
double
data
=
srs_amf0_convert
<
__
SrsAmf0Number
>
(
value
)
->
value
;
return
srs_amf0_write_number
(
stream
,
data
);
}
case
RTMP_AMF0_Null
:
{
...
...
@@ -1147,7 +1167,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
return
srs_amf0_write_undefined
(
stream
);
}
case
RTMP_AMF0_ObjectEnd
:
{
SrsAmf0ObjectEOF
*
p
=
srs_amf0_convert
<
SrsAmf0ObjectEOF
>
(
value
);
__SrsAmf0ObjectEOF
*
p
=
srs_amf0_convert
<
__
SrsAmf0ObjectEOF
>
(
value
);
return
srs_amf0_write_object_eof
(
stream
,
p
);
}
case
RTMP_AMF0_Object
:
{
...
...
@@ -1169,7 +1189,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
return
ret
;
}
int
srs_amf0_read_object_eof
(
SrsStream
*
stream
,
SrsAmf0ObjectEOF
*&
value
)
int
srs_amf0_read_object_eof
(
SrsStream
*
stream
,
__
SrsAmf0ObjectEOF
*&
value
)
{
int
ret
=
ERROR_SUCCESS
;
...
...
@@ -1207,12 +1227,12 @@ int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value)
}
srs_verbose
(
"amf0 read object eof marker success"
);
value
=
new
SrsAmf0ObjectEOF
();
value
=
new
__
SrsAmf0ObjectEOF
();
srs_verbose
(
"amf0 read object eof success"
);
return
ret
;
}
int
srs_amf0_write_object_eof
(
SrsStream
*
stream
,
SrsAmf0ObjectEOF
*
value
)
int
srs_amf0_write_object_eof
(
SrsStream
*
stream
,
__
SrsAmf0ObjectEOF
*
value
)
{
int
ret
=
ERROR_SUCCESS
;
...
...
trunk/src/rtmp/srs_protocol_amf0.hpp
查看文件 @
bfe771b
...
...
@@ -67,75 +67,22 @@ public:
virtual
std
::
string
to_str
();
/**
* get the boolean of any when is_boolean() indicates true.
* user must ensure the type is a
is_
boolean, or assert failed.
* user must ensure the type is a boolean, or assert failed.
*/
virtual
bool
to_boolean
();
/**
* get the number of any when is_number() indicates true.
* user must ensure the type is a number, or assert failed.
*/
virtual
double
to_number
();
public
:
virtual
int
size
()
=
0
;
public
:
static
SrsAmf0Any
*
str
(
const
char
*
value
=
NULL
);
static
SrsAmf0Any
*
boolean
(
bool
value
=
false
);
};
/**
* read amf0 number from stream.
* 2.2 Number Type
* number-type = number-marker DOUBLE
* @return default value is 0.
*/
class
SrsAmf0Number
:
public
SrsAmf0Any
{
public
:
double
value
;
SrsAmf0Number
(
double
_value
=
0.0
);
virtual
~
SrsAmf0Number
();
virtual
int
size
();
};
/**
* read amf0 null from stream.
* 2.7 null Type
* null-type = null-marker
*/
class
SrsAmf0Null
:
public
SrsAmf0Any
{
public
:
SrsAmf0Null
();
virtual
~
SrsAmf0Null
();
virtual
int
size
();
};
/**
* read amf0 undefined from stream.
* 2.8 undefined Type
* undefined-type = undefined-marker
*/
class
SrsAmf0Undefined
:
public
SrsAmf0Any
{
public
:
SrsAmf0Undefined
();
virtual
~
SrsAmf0Undefined
();
virtual
int
size
();
};
/**
* 2.11 Object End Type
* object-end-type = UTF-8-empty object-end-marker
* 0x00 0x00 0x09
*/
class
SrsAmf0ObjectEOF
:
public
SrsAmf0Any
{
public
:
int16_t
utf8_empty
;
SrsAmf0ObjectEOF
();
virtual
~
SrsAmf0ObjectEOF
();
virtual
int
size
();
static
SrsAmf0Any
*
number
(
double
value
=
0.0
);
static
SrsAmf0Any
*
null
();
static
SrsAmf0Any
*
undefined
();
};
/**
...
...
@@ -144,14 +91,14 @@ public:
* if ordered in map, the string compare order, the FMLE will creash when
* get the response of connect app.
*/
class
SrsUnSortedHashtable
class
__
SrsUnSortedHashtable
{
private
:
typedef
std
::
pair
<
std
::
string
,
SrsAmf0Any
*>
SrsObjectPropertyType
;
std
::
vector
<
SrsObjectPropertyType
>
properties
;
public
:
SrsUnSortedHashtable
();
virtual
~
SrsUnSortedHashtable
();
__SrsUnSortedHashtable
();
virtual
~
__SrsUnSortedHashtable
();
virtual
int
size
();
virtual
void
clear
();
...
...
@@ -165,6 +112,22 @@ public:
};
/**
* 2.11 Object End Type
* object-end-type = UTF-8-empty object-end-marker
* 0x00 0x00 0x09
*/
class
__SrsAmf0ObjectEOF
:
public
SrsAmf0Any
{
public
:
int16_t
utf8_empty
;
__SrsAmf0ObjectEOF
();
virtual
~
__SrsAmf0ObjectEOF
();
virtual
int
size
();
};
/**
* 2.5 Object Type
* anonymous-object-type = object-marker *(object-property)
* object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
...
...
@@ -172,9 +135,9 @@ public:
class
SrsAmf0Object
:
public
SrsAmf0Any
{
private
:
SrsUnSortedHashtable
properties
;
__
SrsUnSortedHashtable
properties
;
public
:
SrsAmf0ObjectEOF
eof
;
__
SrsAmf0ObjectEOF
eof
;
SrsAmf0Object
();
virtual
~
SrsAmf0Object
();
...
...
@@ -201,10 +164,10 @@ public:
class
SrsAmf0EcmaArray
:
public
SrsAmf0Any
{
private
:
SrsUnSortedHashtable
properties
;
__
SrsUnSortedHashtable
properties
;
public
:
int32_t
count
;
SrsAmf0ObjectEOF
eof
;
__
SrsAmf0ObjectEOF
eof
;
SrsAmf0EcmaArray
();
virtual
~
SrsAmf0EcmaArray
();
...
...
@@ -277,6 +240,51 @@ public:
};
/**
* read amf0 number from stream.
* 2.2 Number Type
* number-type = number-marker DOUBLE
* @return default value is 0.
*/
class
__SrsAmf0Number
:
public
SrsAmf0Any
{
public
:
double
value
;
__SrsAmf0Number
(
double
_value
);
virtual
~
__SrsAmf0Number
();
virtual
int
size
();
};
/**
* read amf0 null from stream.
* 2.7 null Type
* null-type = null-marker
*/
class
__SrsAmf0Null
:
public
SrsAmf0Any
{
public
:
__SrsAmf0Null
();
virtual
~
__SrsAmf0Null
();
virtual
int
size
();
};
/**
* read amf0 undefined from stream.
* 2.8 undefined Type
* undefined-type = undefined-marker
*/
class
__SrsAmf0Undefined
:
public
SrsAmf0Any
{
public
:
__SrsAmf0Undefined
();
virtual
~
__SrsAmf0Undefined
();
virtual
int
size
();
};
/**
* read amf0 utf8 string from stream.
* 1.3.1 Strings and UTF-8
* UTF-8 = U16 *(UTF8-char)
...
...
trunk/src/rtmp/srs_protocol_rtmp.cpp
查看文件 @
bfe771b
...
...
@@ -284,12 +284,12 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
pkt
->
command_object
->
set
(
"swfUrl"
,
SrsAmf0Any
::
str
());
pkt
->
command_object
->
set
(
"tcUrl"
,
SrsAmf0Any
::
str
(
tc_url
.
c_str
()));
pkt
->
command_object
->
set
(
"fpad"
,
SrsAmf0Any
::
boolean
(
false
));
pkt
->
command_object
->
set
(
"capabilities"
,
new
SrsAmf0Number
(
239
));
pkt
->
command_object
->
set
(
"audioCodecs"
,
new
SrsAmf0Number
(
3575
));
pkt
->
command_object
->
set
(
"videoCodecs"
,
new
SrsAmf0Number
(
252
));
pkt
->
command_object
->
set
(
"videoFunction"
,
new
SrsAmf0Number
(
1
));
pkt
->
command_object
->
set
(
"capabilities"
,
SrsAmf0Any
::
number
(
239
));
pkt
->
command_object
->
set
(
"audioCodecs"
,
SrsAmf0Any
::
number
(
3575
));
pkt
->
command_object
->
set
(
"videoCodecs"
,
SrsAmf0Any
::
number
(
252
));
pkt
->
command_object
->
set
(
"videoFunction"
,
SrsAmf0Any
::
number
(
1
));
pkt
->
command_object
->
set
(
"pageUrl"
,
SrsAmf0Any
::
str
());
pkt
->
command_object
->
set
(
"objectEncoding"
,
new
SrsAmf0N
umber
(
0
));
pkt
->
command_object
->
set
(
"objectEncoding"
,
SrsAmf0Any
::
n
umber
(
0
));
if
((
ret
=
protocol
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
return
ret
;
...
...
@@ -643,7 +643,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
}
if
((
prop
=
pkt
->
command_object
->
ensure_property_number
(
"objectEncoding"
))
!=
NULL
)
{
req
->
objectEncoding
=
srs_amf0_convert
<
SrsAmf0Number
>
(
prop
)
->
value
;
req
->
objectEncoding
=
prop
->
to_number
()
;
}
srs_info
(
"get connect app message params success."
);
...
...
@@ -699,13 +699,13 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip)
SrsConnectAppResPacket
*
pkt
=
new
SrsConnectAppResPacket
();
pkt
->
props
->
set
(
"fmsVer"
,
SrsAmf0Any
::
str
(
"FMS/"
RTMP_SIG_FMS_VER
));
pkt
->
props
->
set
(
"capabilities"
,
new
SrsAmf0Number
(
127
));
pkt
->
props
->
set
(
"mode"
,
new
SrsAmf0Number
(
1
));
pkt
->
props
->
set
(
"capabilities"
,
SrsAmf0Any
::
number
(
127
));
pkt
->
props
->
set
(
"mode"
,
SrsAmf0Any
::
number
(
1
));
pkt
->
info
->
set
(
StatusLevel
,
SrsAmf0Any
::
str
(
StatusLevelStatus
));
pkt
->
info
->
set
(
StatusCode
,
SrsAmf0Any
::
str
(
StatusCodeConnectSuccess
));
pkt
->
info
->
set
(
StatusDescription
,
SrsAmf0Any
::
str
(
"Connection succeeded"
));
pkt
->
info
->
set
(
"objectEncoding"
,
new
SrsAmf0N
umber
(
req
->
objectEncoding
));
pkt
->
info
->
set
(
"objectEncoding"
,
SrsAmf0Any
::
n
umber
(
req
->
objectEncoding
));
SrsAmf0EcmaArray
*
data
=
new
SrsAmf0EcmaArray
();
pkt
->
info
->
set
(
"data"
,
data
);
...
...
@@ -745,7 +745,7 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc)
pkt
->
props
->
set
(
StatusLevel
,
SrsAmf0Any
::
str
(
StatusLevelError
));
pkt
->
props
->
set
(
StatusCode
,
SrsAmf0Any
::
str
(
StatusCodeConnectRejected
));
pkt
->
props
->
set
(
StatusDescription
,
SrsAmf0Any
::
str
(
desc
));
//pkt->props->set("objectEncoding",
new SrsAmf0N
umber(req->objectEncoding));
//pkt->props->set("objectEncoding",
SrsAmf0Any::n
umber(req->objectEncoding));
SrsCommonMessage
*
msg
=
(
new
SrsCommonMessage
())
->
set_packet
(
pkt
,
0
);
if
((
ret
=
protocol
->
send_message
(
msg
))
!=
ERROR_SUCCESS
)
{
...
...
trunk/src/rtmp/srs_protocol_rtmp_stack.cpp
查看文件 @
bfe771b
...
...
@@ -1957,7 +1957,7 @@ SrsCreateStreamPacket::SrsCreateStreamPacket()
{
command_name
=
RTMP_AMF0_COMMAND_CREATE_STREAM
;
transaction_id
=
2
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
}
SrsCreateStreamPacket
::~
SrsCreateStreamPacket
()
...
...
@@ -2042,7 +2042,7 @@ SrsCreateStreamResPacket::SrsCreateStreamResPacket(double _transaction_id, doubl
{
command_name
=
RTMP_AMF0_COMMAND_RESULT
;
transaction_id
=
_transaction_id
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
stream_id
=
_stream_id
;
}
...
...
@@ -2140,7 +2140,7 @@ SrsCloseStreamPacket::SrsCloseStreamPacket()
{
command_name
=
RTMP_AMF0_COMMAND_CLOSE_STREAM
;
transaction_id
=
0
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
}
SrsCloseStreamPacket
::~
SrsCloseStreamPacket
()
...
...
@@ -2175,7 +2175,7 @@ SrsFMLEStartPacket::SrsFMLEStartPacket()
{
command_name
=
RTMP_AMF0_COMMAND_RELEASE_STREAM
;
transaction_id
=
0
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
}
SrsFMLEStartPacket
::~
SrsFMLEStartPacket
()
...
...
@@ -2298,8 +2298,8 @@ SrsFMLEStartResPacket::SrsFMLEStartResPacket(double _transaction_id)
{
command_name
=
RTMP_AMF0_COMMAND_RESULT
;
transaction_id
=
_transaction_id
;
command_object
=
new
SrsAmf0Null
();
args
=
new
SrsAmf0Undefined
();
command_object
=
SrsAmf0Any
::
null
();
args
=
SrsAmf0Any
::
undefined
();
}
SrsFMLEStartResPacket
::~
SrsFMLEStartResPacket
()
...
...
@@ -2397,7 +2397,7 @@ SrsPublishPacket::SrsPublishPacket()
{
command_name
=
RTMP_AMF0_COMMAND_PUBLISH
;
transaction_id
=
0
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
type
=
"live"
;
}
...
...
@@ -2506,7 +2506,7 @@ SrsPausePacket::SrsPausePacket()
{
command_name
=
RTMP_AMF0_COMMAND_PAUSE
;
transaction_id
=
0
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
time_ms
=
0
;
is_pause
=
true
;
...
...
@@ -2561,7 +2561,7 @@ SrsPlayPacket::SrsPlayPacket()
{
command_name
=
RTMP_AMF0_COMMAND_PLAY
;
transaction_id
=
0
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
start
=
-
2
;
duration
=
-
1
;
...
...
@@ -2630,7 +2630,7 @@ int SrsPlayPacket::decode(SrsStream* stream)
if
(
reset_value
->
is_boolean
())
{
reset
=
reset_value
->
to_boolean
();
}
else
if
(
reset_value
->
is_number
())
{
reset
=
(
srs_amf0_convert
<
SrsAmf0Number
>
(
reset_value
)
->
value
==
0
?
false
:
true
);
reset
=
(
reset_value
->
to_number
()
==
0
?
false
:
true
);
}
else
{
ret
=
ERROR_RTMP_AMF0_DECODE
;
srs_error
(
"amf0 invalid type=%#x, requires number or bool, ret=%d"
,
reset_value
->
marker
,
ret
);
...
...
@@ -2715,7 +2715,7 @@ SrsPlayResPacket::SrsPlayResPacket()
{
command_name
=
RTMP_AMF0_COMMAND_RESULT
;
transaction_id
=
0
;
command_object
=
new
SrsAmf0N
ull
();
command_object
=
SrsAmf0Any
::
n
ull
();
desc
=
new
SrsAmf0Object
();
}
...
...
@@ -2779,7 +2779,7 @@ SrsOnBWDonePacket::SrsOnBWDonePacket()
{
command_name
=
RTMP_AMF0_COMMAND_ON_BW_DONE
;
transaction_id
=
0
;
args
=
new
SrsAmf0N
ull
();
args
=
SrsAmf0Any
::
n
ull
();
}
SrsOnBWDonePacket
::~
SrsOnBWDonePacket
()
...
...
@@ -2834,7 +2834,7 @@ SrsOnStatusCallPacket::SrsOnStatusCallPacket()
{
command_name
=
RTMP_AMF0_COMMAND_ON_STATUS
;
transaction_id
=
0
;
args
=
new
SrsAmf0N
ull
();
args
=
SrsAmf0Any
::
n
ull
();
data
=
new
SrsAmf0Object
();
}
...
...
@@ -2897,7 +2897,7 @@ SrsBandwidthPacket::SrsBandwidthPacket()
{
command_name
=
RTMP_AMF0_COMMAND_ON_STATUS
;
transaction_id
=
0
;
args
=
new
SrsAmf0N
ull
();
args
=
SrsAmf0Any
::
n
ull
();
data
=
new
SrsAmf0Object
();
}
...
...
trunk/src/rtmp/srs_protocol_rtmp_stack.hpp
查看文件 @
bfe771b
...
...
@@ -86,8 +86,7 @@ class SrsStream;
class
SrsCommonMessage
;
class
SrsChunkStream
;
class
SrsAmf0Object
;
class
SrsAmf0Null
;
class
SrsAmf0Undefined
;
class
SrsAmf0Any
;
class
ISrsMessage
;
// convert class name to string.
...
...
@@ -600,7 +599,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
public:
SrsCreateStreamPacket
();
virtual
~
SrsCreateStreamPacket
();
...
...
@@ -629,7 +628,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
double
stream_id
;
public
:
SrsCreateStreamResPacket
(
double
_transaction_id
,
double
_stream_id
);
...
...
@@ -659,7 +658,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
public:
SrsCloseStreamPacket
();
virtual
~
SrsCloseStreamPacket
();
...
...
@@ -682,7 +681,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
std
::
string
stream_name
;
public
:
SrsFMLEStartPacket
();
...
...
@@ -715,8 +714,8 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0Null
*
command_object
;
SrsAmf0Undefined
*
args
;
SrsAmf0Any
*
command_object
;
// null
SrsAmf0Any
*
args
;
// undefined
public:
SrsFMLEStartResPacket
(
double
_transaction_id
);
virtual
~
SrsFMLEStartResPacket
();
...
...
@@ -750,7 +749,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
std
::
string
stream_name
;
// optional, default to live.
std
::
string
type
;
...
...
@@ -785,7 +784,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
bool
is_pause
;
double
time_ms
;
public
:
...
...
@@ -811,7 +810,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
std
::
string
stream_name
;
double
start
;
double
duration
;
...
...
@@ -845,7 +844,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
command_object
;
SrsAmf0
Any
*
command_object
;
// null
SrsAmf0Object
*
desc
;
public
:
SrsPlayResPacket
();
...
...
@@ -874,7 +873,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
args
;
SrsAmf0
Any
*
args
;
// null
public:
SrsOnBWDonePacket
();
virtual
~
SrsOnBWDonePacket
();
...
...
@@ -903,7 +902,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
args
;
SrsAmf0
Any
*
args
;
// null
SrsAmf0Object
*
data
;
public
:
SrsOnStatusCallPacket
();
...
...
@@ -936,7 +935,7 @@ protected:
public
:
std
::
string
command_name
;
double
transaction_id
;
SrsAmf0
Null
*
args
;
SrsAmf0
Any
*
args
;
// null
SrsAmf0Object
*
data
;
public
:
SrsBandwidthPacket
();
...
...
trunk/src/utest/srs_utest_amf0.cpp
查看文件 @
bfe771b
...
...
@@ -63,7 +63,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object
o
;
size
+=
SrsAmf0Size
::
utf8
(
"age"
)
+
SrsAmf0Size
::
number
();
o
.
set
(
"age"
,
new
SrsAmf0N
umber
(
9
));
o
.
set
(
"age"
,
SrsAmf0Any
::
n
umber
(
9
));
EXPECT_EQ
(
size
,
SrsAmf0Size
::
object
(
&
o
));
}
...
...
@@ -72,7 +72,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object
o
;
size
+=
SrsAmf0Size
::
utf8
(
"email"
)
+
SrsAmf0Size
::
null
();
o
.
set
(
"email"
,
new
SrsAmf0N
ull
());
o
.
set
(
"email"
,
SrsAmf0Any
::
n
ull
());
EXPECT_EQ
(
size
,
SrsAmf0Size
::
object
(
&
o
));
}
...
...
@@ -81,7 +81,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object
o
;
size
+=
SrsAmf0Size
::
utf8
(
"email"
)
+
SrsAmf0Size
::
undefined
();
o
.
set
(
"email"
,
new
SrsAmf0U
ndefined
());
o
.
set
(
"email"
,
SrsAmf0Any
::
u
ndefined
());
EXPECT_EQ
(
size
,
SrsAmf0Size
::
object
(
&
o
));
}
...
...
@@ -117,7 +117,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray
o
;
size
+=
SrsAmf0Size
::
utf8
(
"age"
)
+
SrsAmf0Size
::
number
();
o
.
set
(
"age"
,
new
SrsAmf0N
umber
(
9
));
o
.
set
(
"age"
,
SrsAmf0Any
::
n
umber
(
9
));
EXPECT_EQ
(
size
,
SrsAmf0Size
::
array
(
&
o
));
}
...
...
@@ -126,7 +126,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray
o
;
size
+=
SrsAmf0Size
::
utf8
(
"email"
)
+
SrsAmf0Size
::
null
();
o
.
set
(
"email"
,
new
SrsAmf0N
ull
());
o
.
set
(
"email"
,
SrsAmf0Any
::
n
ull
());
EXPECT_EQ
(
size
,
SrsAmf0Size
::
array
(
&
o
));
}
...
...
@@ -135,7 +135,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray
o
;
size
+=
SrsAmf0Size
::
utf8
(
"email"
)
+
SrsAmf0Size
::
undefined
();
o
.
set
(
"email"
,
new
SrsAmf0U
ndefined
());
o
.
set
(
"email"
,
SrsAmf0Any
::
u
ndefined
());
EXPECT_EQ
(
size
,
SrsAmf0Size
::
array
(
&
o
));
}
...
...
@@ -177,7 +177,7 @@ VOID TEST(AMF0Test, Size)
o
.
set
(
"args"
,
args
);
SrsAmf0EcmaArray
*
params
=
new
SrsAmf0EcmaArray
();
params
->
set
(
"p1"
,
new
SrsAmf0N
umber
(
10
));
params
->
set
(
"p1"
,
SrsAmf0Any
::
n
umber
(
10
));
size
+=
SrsAmf0Size
::
utf8
(
"params"
)
+
SrsAmf0Size
::
array
(
params
);
o
.
set
(
"params"
,
params
);
...
...
@@ -212,7 +212,7 @@ VOID TEST(AMF0Test, Size)
o
.
set
(
"args"
,
args
);
SrsAmf0Object
*
params
=
new
SrsAmf0Object
();
params
->
set
(
"p1"
,
new
SrsAmf0N
umber
(
10
));
params
->
set
(
"p1"
,
SrsAmf0Any
::
n
umber
(
10
));
size
+=
SrsAmf0Size
::
utf8
(
"params"
)
+
SrsAmf0Size
::
object
(
params
);
o
.
set
(
"params"
,
params
);
...
...
@@ -233,7 +233,7 @@ VOID TEST(AMF0Test, Size)
o
.
set
(
"args"
,
args
);
SrsAmf0Object
*
params
=
new
SrsAmf0Object
();
params
->
set
(
"p1"
,
new
SrsAmf0N
umber
(
10
));
params
->
set
(
"p1"
,
SrsAmf0Any
::
n
umber
(
10
));
size
+=
SrsAmf0Size
::
utf8
(
"params"
)
+
SrsAmf0Size
::
object
(
params
);
o
.
set
(
"params"
,
params
);
...
...
@@ -254,7 +254,7 @@ VOID TEST(AMF0Test, Size)
o
.
set
(
"args"
,
args
);
SrsAmf0EcmaArray
*
params
=
new
SrsAmf0EcmaArray
();
params
->
set
(
"p1"
,
new
SrsAmf0N
umber
(
10
));
params
->
set
(
"p1"
,
SrsAmf0Any
::
n
umber
(
10
));
size
+=
SrsAmf0Size
::
utf8
(
"params"
)
+
SrsAmf0Size
::
array
(
params
);
o
.
set
(
"params"
,
params
);
...
...
@@ -304,4 +304,43 @@ VOID TEST(AMF0Test, AnyElem)
EXPECT_TRUE
(
o
->
is_boolean
());
EXPECT_TRUE
(
o
->
to_boolean
());
}
// number
if
(
true
)
{
o
=
SrsAmf0Any
::
number
();
SrsAutoFree
(
SrsAmf0Any
,
o
,
false
);
EXPECT_TRUE
(
NULL
!=
o
);
EXPECT_TRUE
(
o
->
is_number
());
EXPECT_DOUBLE_EQ
(
0
,
o
->
to_number
());
}
if
(
true
)
{
o
=
SrsAmf0Any
::
number
(
100
);
SrsAutoFree
(
SrsAmf0Any
,
o
,
false
);
EXPECT_TRUE
(
NULL
!=
o
);
EXPECT_TRUE
(
o
->
is_number
());
EXPECT_DOUBLE_EQ
(
100
,
o
->
to_number
());
}
if
(
true
)
{
o
=
SrsAmf0Any
::
number
(
-
100
);
SrsAutoFree
(
SrsAmf0Any
,
o
,
false
);
EXPECT_TRUE
(
NULL
!=
o
);
EXPECT_TRUE
(
o
->
is_number
());
EXPECT_DOUBLE_EQ
(
-
100
,
o
->
to_number
());
}
// null
if
(
true
)
{
o
=
SrsAmf0Any
::
null
();
SrsAutoFree
(
SrsAmf0Any
,
o
,
false
);
EXPECT_TRUE
(
NULL
!=
o
);
EXPECT_TRUE
(
o
->
is_null
());
}
// undefined
if
(
true
)
{
o
=
SrsAmf0Any
::
undefined
();
SrsAutoFree
(
SrsAmf0Any
,
o
,
false
);
EXPECT_TRUE
(
NULL
!=
o
);
EXPECT_TRUE
(
o
->
is_undefined
());
}
}
...
...
请
注册
或
登录
后发表评论