1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

amf0 utest: null,undefined,object-eof to any

This commit is contained in:
winlin 2014-03-08 14:38:19 +08:00
parent e40be6e89d
commit bfe771bbba
9 changed files with 293 additions and 227 deletions

View file

@ -178,15 +178,15 @@ int SrsBandwidth::do_bandwidth_check()
// send finished msg // send finished msg
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish(); SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish();
pkt->data->set("code", new SrsAmf0Number(ERROR_SUCCESS)); pkt->data->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
pkt->data->set("start_time", new SrsAmf0Number(start_time)); pkt->data->set("start_time", SrsAmf0Any::number(start_time));
pkt->data->set("end_time", new SrsAmf0Number(end_time)); pkt->data->set("end_time", SrsAmf0Any::number(end_time));
pkt->data->set("play_kbps", new SrsAmf0Number(play_kbps)); pkt->data->set("play_kbps", SrsAmf0Any::number(play_kbps));
pkt->data->set("publish_kbps", new SrsAmf0Number(publish_kbps)); pkt->data->set("publish_kbps", SrsAmf0Any::number(publish_kbps));
pkt->data->set("play_bytes", new SrsAmf0Number(play_bytes)); pkt->data->set("play_bytes", SrsAmf0Any::number(play_bytes));
pkt->data->set("play_time", new SrsAmf0Number(play_actual_duration_ms)); pkt->data->set("play_time", SrsAmf0Any::number(play_actual_duration_ms));
pkt->data->set("publish_bytes", new SrsAmf0Number(publish_bytes)); pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_bytes));
pkt->data->set("publish_time", new SrsAmf0Number(publish_actual_duration_ms)); pkt->data->set("publish_time", SrsAmf0Any::number(publish_actual_duration_ms));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@ -229,8 +229,8 @@ int SrsBandwidth::check_play(
// send start play command to client // send start play command to client
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_play(); SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_play();
pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@ -308,10 +308,10 @@ int SrsBandwidth::check_play(
if (true) { if (true) {
// notify client to stop play // notify client to stop play
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play(); SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play();
pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
pkt->data->set("duration_delta", new SrsAmf0Number(actual_duration_ms)); pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
pkt->data->set("bytes_delta", new SrsAmf0Number(play_bytes)); pkt->data->set("bytes_delta", SrsAmf0Any::number(play_bytes));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@ -353,8 +353,8 @@ int SrsBandwidth::check_publish(
// notify client to start publish // notify client to start publish
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_publish(); SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_publish();
pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@ -414,10 +414,10 @@ int SrsBandwidth::check_publish(
if (true) { if (true) {
// notify client to stop publish // notify client to stop publish
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish(); SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish();
pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
pkt->data->set("duration_delta", new SrsAmf0Number(actual_duration_ms)); pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
pkt->data->set("bytes_delta", new SrsAmf0Number(publish_bytes)); pkt->data->set("bytes_delta", SrsAmf0Any::number(publish_bytes));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {

View file

@ -1221,29 +1221,29 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata)
SrsAmf0Any* prop = NULL; SrsAmf0Any* prop = NULL;
if ((prop = obj->get_property("duration")) != NULL && prop->is_number()) { 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()) { 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()) { 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()) { 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()) { 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()) { 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()) { 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()) { 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: // ignore the following, for each flv/rtmp packet contains them:

View file

@ -645,12 +645,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
SrsAmf0Any* prop = NULL; SrsAmf0Any* prop = NULL;
if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) { if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) {
if (prop->is_number()) { 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 = metadata->metadata->get_property("framerate")) != NULL) {
if (prop->is_number()) { if (prop->is_number()) {
frame_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); frame_rate = (int)prop->to_number();
} }
} }

View file

@ -56,8 +56,8 @@ using namespace std;
// User defined // User defined
#define RTMP_AMF0_Invalid 0x3F #define RTMP_AMF0_Invalid 0x3F
int srs_amf0_read_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_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*);
int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value); int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value);
int srs_amf0_write_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; return o->value;
} }
double SrsAmf0Any::to_number()
{
__SrsAmf0Number* o = srs_amf0_convert<__SrsAmf0Number>(this);
return o->value;
}
bool SrsAmf0Any::is_object_eof() bool SrsAmf0Any::is_object_eof()
{ {
return marker == RTMP_AMF0_ObjectEnd; return marker == RTMP_AMF0_ObjectEnd;
@ -132,69 +138,26 @@ SrsAmf0Any* SrsAmf0Any::boolean(bool value)
return new __SrsAmf0Boolean(value); return new __SrsAmf0Boolean(value);
} }
SrsAmf0Number::SrsAmf0Number(double _value) SrsAmf0Any* SrsAmf0Any::number(double value)
{ {
marker = RTMP_AMF0_Number; return new __SrsAmf0Number(value);
value = _value;
} }
SrsAmf0Number::~SrsAmf0Number() SrsAmf0Any* SrsAmf0Any::null()
{
return new __SrsAmf0Null();
}
SrsAmf0Any* SrsAmf0Any::undefined()
{
return new __SrsAmf0Undefined();
}
__SrsUnSortedHashtable::__SrsUnSortedHashtable()
{ {
} }
int SrsAmf0Number::size() __SrsUnSortedHashtable::~__SrsUnSortedHashtable()
{
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();
}
SrsAmf0ObjectEOF::SrsAmf0ObjectEOF()
{
marker = RTMP_AMF0_ObjectEnd;
utf8_empty = 0x00;
}
SrsAmf0ObjectEOF::~SrsAmf0ObjectEOF()
{
}
int SrsAmf0ObjectEOF::size()
{
return SrsAmf0Size::object_eof();
}
SrsUnSortedHashtable::SrsUnSortedHashtable()
{
}
SrsUnSortedHashtable::~SrsUnSortedHashtable()
{ {
std::vector<SrsObjectPropertyType>::iterator it; std::vector<SrsObjectPropertyType>::iterator it;
for (it = properties.begin(); it != properties.end(); ++it) { for (it = properties.begin(); it != properties.end(); ++it) {
@ -205,31 +168,31 @@ SrsUnSortedHashtable::~SrsUnSortedHashtable()
properties.clear(); properties.clear();
} }
int SrsUnSortedHashtable::size() int __SrsUnSortedHashtable::size()
{ {
return (int)properties.size(); return (int)properties.size();
} }
void SrsUnSortedHashtable::clear() void __SrsUnSortedHashtable::clear()
{ {
properties.clear(); properties.clear();
} }
std::string SrsUnSortedHashtable::key_at(int index) std::string __SrsUnSortedHashtable::key_at(int index)
{ {
srs_assert(index < size()); srs_assert(index < size());
SrsObjectPropertyType& elem = properties[index]; SrsObjectPropertyType& elem = properties[index];
return elem.first; return elem.first;
} }
SrsAmf0Any* SrsUnSortedHashtable::value_at(int index) SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index)
{ {
srs_assert(index < size()); srs_assert(index < size());
SrsObjectPropertyType& elem = properties[index]; SrsObjectPropertyType& elem = properties[index];
return elem.second; return elem.second;
} }
void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) void __SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value)
{ {
std::vector<SrsObjectPropertyType>::iterator it; 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)); 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; std::vector<SrsObjectPropertyType>::iterator it;
@ -264,7 +227,7 @@ SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name)
return NULL; return NULL;
} }
SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name) SrsAmf0Any* __SrsUnSortedHashtable::ensure_property_string(std::string name)
{ {
SrsAmf0Any* prop = get_property(name); SrsAmf0Any* prop = get_property(name);
@ -279,7 +242,7 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name)
return prop; return prop;
} }
SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name) SrsAmf0Any* __SrsUnSortedHashtable::ensure_property_number(std::string name)
{ {
SrsAmf0Any* prop = get_property(name); SrsAmf0Any* prop = get_property(name);
@ -294,6 +257,21 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name)
return prop; return prop;
} }
__SrsAmf0ObjectEOF::__SrsAmf0ObjectEOF()
{
marker = RTMP_AMF0_ObjectEnd;
utf8_empty = 0x00;
}
__SrsAmf0ObjectEOF::~__SrsAmf0ObjectEOF()
{
}
int __SrsAmf0ObjectEOF::size()
{
return SrsAmf0Size::object_eof();
}
SrsAmf0Object::SrsAmf0Object() SrsAmf0Object::SrsAmf0Object()
{ {
marker = RTMP_AMF0_Object; marker = RTMP_AMF0_Object;
@ -709,6 +687,49 @@ int __SrsAmf0Boolean::size()
return SrsAmf0Size::boolean(); 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 srs_amf0_read_utf8(SrsStream* stream, std::string& value)
{ {
int ret = ERROR_SUCCESS; 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) { if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) {
return ret; return ret;
} }
value = new SrsAmf0Number(); value = SrsAmf0Any::number(data);
srs_amf0_convert<SrsAmf0Number>(value)->value = data;
return ret; return ret;
} }
case RTMP_AMF0_Null: { case RTMP_AMF0_Null: {
stream->skip(1); stream->skip(1);
value = new SrsAmf0Null(); value = new __SrsAmf0Null();
return ret; return ret;
} }
case RTMP_AMF0_Undefined: { case RTMP_AMF0_Undefined: {
stream->skip(1); stream->skip(1);
value = new SrsAmf0Undefined(); value = new __SrsAmf0Undefined();
return ret; return ret;
} }
case RTMP_AMF0_ObjectEnd: { case RTMP_AMF0_ObjectEnd: {
SrsAmf0ObjectEOF* p = NULL; __SrsAmf0ObjectEOF* p = NULL;
if ((ret = srs_amf0_read_object_eof(stream, p)) != ERROR_SUCCESS) { if ((ret = srs_amf0_read_object_eof(stream, p)) != ERROR_SUCCESS) {
return ret; return ret;
} }
@ -1137,7 +1157,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
return srs_amf0_write_boolean(stream, data); return srs_amf0_write_boolean(stream, data);
} }
case RTMP_AMF0_Number: { 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); return srs_amf0_write_number(stream, data);
} }
case RTMP_AMF0_Null: { case RTMP_AMF0_Null: {
@ -1147,7 +1167,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
return srs_amf0_write_undefined(stream); return srs_amf0_write_undefined(stream);
} }
case RTMP_AMF0_ObjectEnd: { 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); return srs_amf0_write_object_eof(stream, p);
} }
case RTMP_AMF0_Object: { case RTMP_AMF0_Object: {
@ -1169,7 +1189,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
return ret; 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; 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"); srs_verbose("amf0 read object eof marker success");
value = new SrsAmf0ObjectEOF(); value = new __SrsAmf0ObjectEOF();
srs_verbose("amf0 read object eof success"); srs_verbose("amf0 read object eof success");
return ret; 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; int ret = ERROR_SUCCESS;

View file

@ -67,75 +67,22 @@ public:
virtual std::string to_str(); virtual std::string to_str();
/** /**
* get the boolean of any when is_boolean() indicates true. * 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(); 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: public:
virtual int size() = 0; virtual int size() = 0;
public: public:
static SrsAmf0Any* str(const char* value = NULL); static SrsAmf0Any* str(const char* value = NULL);
static SrsAmf0Any* boolean(bool value = false); static SrsAmf0Any* boolean(bool value = false);
}; static SrsAmf0Any* number(double value = 0.0);
static SrsAmf0Any* null();
/** static SrsAmf0Any* undefined();
* 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();
}; };
/** /**
@ -144,14 +91,14 @@ public:
* if ordered in map, the string compare order, the FMLE will creash when * if ordered in map, the string compare order, the FMLE will creash when
* get the response of connect app. * get the response of connect app.
*/ */
class SrsUnSortedHashtable class __SrsUnSortedHashtable
{ {
private: private:
typedef std::pair<std::string, SrsAmf0Any*> SrsObjectPropertyType; typedef std::pair<std::string, SrsAmf0Any*> SrsObjectPropertyType;
std::vector<SrsObjectPropertyType> properties; std::vector<SrsObjectPropertyType> properties;
public: public:
SrsUnSortedHashtable(); __SrsUnSortedHashtable();
virtual ~SrsUnSortedHashtable(); virtual ~__SrsUnSortedHashtable();
virtual int size(); virtual int size();
virtual void clear(); virtual void clear();
@ -164,6 +111,22 @@ public:
virtual SrsAmf0Any* ensure_property_number(std::string name); virtual SrsAmf0Any* ensure_property_number(std::string name);
}; };
/**
* 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 * 2.5 Object Type
* anonymous-object-type = object-marker *(object-property) * anonymous-object-type = object-marker *(object-property)
@ -172,9 +135,9 @@ public:
class SrsAmf0Object : public SrsAmf0Any class SrsAmf0Object : public SrsAmf0Any
{ {
private: private:
SrsUnSortedHashtable properties; __SrsUnSortedHashtable properties;
public: public:
SrsAmf0ObjectEOF eof; __SrsAmf0ObjectEOF eof;
SrsAmf0Object(); SrsAmf0Object();
virtual ~SrsAmf0Object(); virtual ~SrsAmf0Object();
@ -201,10 +164,10 @@ public:
class SrsAmf0EcmaArray : public SrsAmf0Any class SrsAmf0EcmaArray : public SrsAmf0Any
{ {
private: private:
SrsUnSortedHashtable properties; __SrsUnSortedHashtable properties;
public: public:
int32_t count; int32_t count;
SrsAmf0ObjectEOF eof; __SrsAmf0ObjectEOF eof;
SrsAmf0EcmaArray(); SrsAmf0EcmaArray();
virtual ~SrsAmf0EcmaArray(); virtual ~SrsAmf0EcmaArray();
@ -276,6 +239,51 @@ public:
virtual int size(); virtual int size();
}; };
/**
* 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. * read amf0 utf8 string from stream.
* 1.3.1 Strings and UTF-8 * 1.3.1 Strings and UTF-8

View file

@ -284,12 +284,12 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
pkt->command_object->set("swfUrl", SrsAmf0Any::str()); pkt->command_object->set("swfUrl", SrsAmf0Any::str());
pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str()));
pkt->command_object->set("fpad", SrsAmf0Any::boolean(false)); pkt->command_object->set("fpad", SrsAmf0Any::boolean(false));
pkt->command_object->set("capabilities", new SrsAmf0Number(239)); pkt->command_object->set("capabilities", SrsAmf0Any::number(239));
pkt->command_object->set("audioCodecs", new SrsAmf0Number(3575)); pkt->command_object->set("audioCodecs", SrsAmf0Any::number(3575));
pkt->command_object->set("videoCodecs", new SrsAmf0Number(252)); pkt->command_object->set("videoCodecs", SrsAmf0Any::number(252));
pkt->command_object->set("videoFunction", new SrsAmf0Number(1)); pkt->command_object->set("videoFunction", SrsAmf0Any::number(1));
pkt->command_object->set("pageUrl", SrsAmf0Any::str()); pkt->command_object->set("pageUrl", SrsAmf0Any::str());
pkt->command_object->set("objectEncoding", new SrsAmf0Number(0)); pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0));
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
return ret; return ret;
@ -643,7 +643,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
} }
if ((prop = pkt->command_object->ensure_property_number("objectEncoding")) != NULL) { 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."); 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(); SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket();
pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER)); pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER));
pkt->props->set("capabilities", new SrsAmf0Number(127)); pkt->props->set("capabilities", SrsAmf0Any::number(127));
pkt->props->set("mode", new SrsAmf0Number(1)); pkt->props->set("mode", SrsAmf0Any::number(1));
pkt->info->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); pkt->info->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->info->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectSuccess)); pkt->info->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectSuccess));
pkt->info->set(StatusDescription, SrsAmf0Any::str("Connection succeeded")); pkt->info->set(StatusDescription, SrsAmf0Any::str("Connection succeeded"));
pkt->info->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); pkt->info->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray(); SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray();
pkt->info->set("data", data); 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(StatusLevel, SrsAmf0Any::str(StatusLevelError));
pkt->props->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected)); pkt->props->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected));
pkt->props->set(StatusDescription, SrsAmf0Any::str(desc)); pkt->props->set(StatusDescription, SrsAmf0Any::str(desc));
//pkt->props->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); //pkt->props->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {

View file

@ -1957,7 +1957,7 @@ SrsCreateStreamPacket::SrsCreateStreamPacket()
{ {
command_name = RTMP_AMF0_COMMAND_CREATE_STREAM; command_name = RTMP_AMF0_COMMAND_CREATE_STREAM;
transaction_id = 2; transaction_id = 2;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
} }
SrsCreateStreamPacket::~SrsCreateStreamPacket() SrsCreateStreamPacket::~SrsCreateStreamPacket()
@ -2042,7 +2042,7 @@ SrsCreateStreamResPacket::SrsCreateStreamResPacket(double _transaction_id, doubl
{ {
command_name = RTMP_AMF0_COMMAND_RESULT; command_name = RTMP_AMF0_COMMAND_RESULT;
transaction_id = _transaction_id; transaction_id = _transaction_id;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
stream_id = _stream_id; stream_id = _stream_id;
} }
@ -2140,7 +2140,7 @@ SrsCloseStreamPacket::SrsCloseStreamPacket()
{ {
command_name = RTMP_AMF0_COMMAND_CLOSE_STREAM; command_name = RTMP_AMF0_COMMAND_CLOSE_STREAM;
transaction_id = 0; transaction_id = 0;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
} }
SrsCloseStreamPacket::~SrsCloseStreamPacket() SrsCloseStreamPacket::~SrsCloseStreamPacket()
@ -2175,7 +2175,7 @@ SrsFMLEStartPacket::SrsFMLEStartPacket()
{ {
command_name = RTMP_AMF0_COMMAND_RELEASE_STREAM; command_name = RTMP_AMF0_COMMAND_RELEASE_STREAM;
transaction_id = 0; transaction_id = 0;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
} }
SrsFMLEStartPacket::~SrsFMLEStartPacket() SrsFMLEStartPacket::~SrsFMLEStartPacket()
@ -2298,8 +2298,8 @@ SrsFMLEStartResPacket::SrsFMLEStartResPacket(double _transaction_id)
{ {
command_name = RTMP_AMF0_COMMAND_RESULT; command_name = RTMP_AMF0_COMMAND_RESULT;
transaction_id = _transaction_id; transaction_id = _transaction_id;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
args = new SrsAmf0Undefined(); args = SrsAmf0Any::undefined();
} }
SrsFMLEStartResPacket::~SrsFMLEStartResPacket() SrsFMLEStartResPacket::~SrsFMLEStartResPacket()
@ -2397,7 +2397,7 @@ SrsPublishPacket::SrsPublishPacket()
{ {
command_name = RTMP_AMF0_COMMAND_PUBLISH; command_name = RTMP_AMF0_COMMAND_PUBLISH;
transaction_id = 0; transaction_id = 0;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
type = "live"; type = "live";
} }
@ -2506,7 +2506,7 @@ SrsPausePacket::SrsPausePacket()
{ {
command_name = RTMP_AMF0_COMMAND_PAUSE; command_name = RTMP_AMF0_COMMAND_PAUSE;
transaction_id = 0; transaction_id = 0;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
time_ms = 0; time_ms = 0;
is_pause = true; is_pause = true;
@ -2561,7 +2561,7 @@ SrsPlayPacket::SrsPlayPacket()
{ {
command_name = RTMP_AMF0_COMMAND_PLAY; command_name = RTMP_AMF0_COMMAND_PLAY;
transaction_id = 0; transaction_id = 0;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
start = -2; start = -2;
duration = -1; duration = -1;
@ -2630,7 +2630,7 @@ int SrsPlayPacket::decode(SrsStream* stream)
if (reset_value->is_boolean()) { if (reset_value->is_boolean()) {
reset = reset_value->to_boolean(); reset = reset_value->to_boolean();
} else if (reset_value->is_number()) { } 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 { } else {
ret = ERROR_RTMP_AMF0_DECODE; ret = ERROR_RTMP_AMF0_DECODE;
srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); 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; command_name = RTMP_AMF0_COMMAND_RESULT;
transaction_id = 0; transaction_id = 0;
command_object = new SrsAmf0Null(); command_object = SrsAmf0Any::null();
desc = new SrsAmf0Object(); desc = new SrsAmf0Object();
} }
@ -2779,7 +2779,7 @@ SrsOnBWDonePacket::SrsOnBWDonePacket()
{ {
command_name = RTMP_AMF0_COMMAND_ON_BW_DONE; command_name = RTMP_AMF0_COMMAND_ON_BW_DONE;
transaction_id = 0; transaction_id = 0;
args = new SrsAmf0Null(); args = SrsAmf0Any::null();
} }
SrsOnBWDonePacket::~SrsOnBWDonePacket() SrsOnBWDonePacket::~SrsOnBWDonePacket()
@ -2834,7 +2834,7 @@ SrsOnStatusCallPacket::SrsOnStatusCallPacket()
{ {
command_name = RTMP_AMF0_COMMAND_ON_STATUS; command_name = RTMP_AMF0_COMMAND_ON_STATUS;
transaction_id = 0; transaction_id = 0;
args = new SrsAmf0Null(); args = SrsAmf0Any::null();
data = new SrsAmf0Object(); data = new SrsAmf0Object();
} }
@ -2897,7 +2897,7 @@ SrsBandwidthPacket::SrsBandwidthPacket()
{ {
command_name = RTMP_AMF0_COMMAND_ON_STATUS; command_name = RTMP_AMF0_COMMAND_ON_STATUS;
transaction_id = 0; transaction_id = 0;
args = new SrsAmf0Null(); args = SrsAmf0Any::null();
data = new SrsAmf0Object(); data = new SrsAmf0Object();
} }

View file

@ -86,8 +86,7 @@ class SrsStream;
class SrsCommonMessage; class SrsCommonMessage;
class SrsChunkStream; class SrsChunkStream;
class SrsAmf0Object; class SrsAmf0Object;
class SrsAmf0Null; class SrsAmf0Any;
class SrsAmf0Undefined;
class ISrsMessage; class ISrsMessage;
// convert class name to string. // convert class name to string.
@ -600,7 +599,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
public: public:
SrsCreateStreamPacket(); SrsCreateStreamPacket();
virtual ~SrsCreateStreamPacket(); virtual ~SrsCreateStreamPacket();
@ -629,7 +628,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
double stream_id; double stream_id;
public: public:
SrsCreateStreamResPacket(double _transaction_id, double _stream_id); SrsCreateStreamResPacket(double _transaction_id, double _stream_id);
@ -659,7 +658,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
public: public:
SrsCloseStreamPacket(); SrsCloseStreamPacket();
virtual ~SrsCloseStreamPacket(); virtual ~SrsCloseStreamPacket();
@ -682,7 +681,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
std::string stream_name; std::string stream_name;
public: public:
SrsFMLEStartPacket(); SrsFMLEStartPacket();
@ -715,8 +714,8 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
SrsAmf0Undefined* args; SrsAmf0Any* args; // undefined
public: public:
SrsFMLEStartResPacket(double _transaction_id); SrsFMLEStartResPacket(double _transaction_id);
virtual ~SrsFMLEStartResPacket(); virtual ~SrsFMLEStartResPacket();
@ -750,7 +749,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
std::string stream_name; std::string stream_name;
// optional, default to live. // optional, default to live.
std::string type; std::string type;
@ -785,7 +784,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
bool is_pause; bool is_pause;
double time_ms; double time_ms;
public: public:
@ -811,7 +810,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
std::string stream_name; std::string stream_name;
double start; double start;
double duration; double duration;
@ -845,7 +844,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* command_object; SrsAmf0Any* command_object; // null
SrsAmf0Object* desc; SrsAmf0Object* desc;
public: public:
SrsPlayResPacket(); SrsPlayResPacket();
@ -874,7 +873,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* args; SrsAmf0Any* args; // null
public: public:
SrsOnBWDonePacket(); SrsOnBWDonePacket();
virtual ~SrsOnBWDonePacket(); virtual ~SrsOnBWDonePacket();
@ -903,7 +902,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* args; SrsAmf0Any* args; // null
SrsAmf0Object* data; SrsAmf0Object* data;
public: public:
SrsOnStatusCallPacket(); SrsOnStatusCallPacket();
@ -936,7 +935,7 @@ protected:
public: public:
std::string command_name; std::string command_name;
double transaction_id; double transaction_id;
SrsAmf0Null* args; SrsAmf0Any* args; // null
SrsAmf0Object* data; SrsAmf0Object* data;
public: public:
SrsBandwidthPacket(); SrsBandwidthPacket();

View file

@ -63,7 +63,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o; SrsAmf0Object o;
size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number(); size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number();
o.set("age", new SrsAmf0Number(9)); o.set("age", SrsAmf0Any::number(9));
EXPECT_EQ(size, SrsAmf0Size::object(&o)); EXPECT_EQ(size, SrsAmf0Size::object(&o));
} }
@ -72,7 +72,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o; SrsAmf0Object o;
size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null(); size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null();
o.set("email", new SrsAmf0Null()); o.set("email", SrsAmf0Any::null());
EXPECT_EQ(size, SrsAmf0Size::object(&o)); EXPECT_EQ(size, SrsAmf0Size::object(&o));
} }
@ -81,7 +81,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o; SrsAmf0Object o;
size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined(); size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined();
o.set("email", new SrsAmf0Undefined()); o.set("email", SrsAmf0Any::undefined());
EXPECT_EQ(size, SrsAmf0Size::object(&o)); EXPECT_EQ(size, SrsAmf0Size::object(&o));
} }
@ -117,7 +117,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o; SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number(); size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number();
o.set("age", new SrsAmf0Number(9)); o.set("age", SrsAmf0Any::number(9));
EXPECT_EQ(size, SrsAmf0Size::array(&o)); EXPECT_EQ(size, SrsAmf0Size::array(&o));
} }
@ -126,7 +126,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o; SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null(); size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null();
o.set("email", new SrsAmf0Null()); o.set("email", SrsAmf0Any::null());
EXPECT_EQ(size, SrsAmf0Size::array(&o)); EXPECT_EQ(size, SrsAmf0Size::array(&o));
} }
@ -135,7 +135,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o; SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined(); size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined();
o.set("email", new SrsAmf0Undefined()); o.set("email", SrsAmf0Any::undefined());
EXPECT_EQ(size, SrsAmf0Size::array(&o)); EXPECT_EQ(size, SrsAmf0Size::array(&o));
} }
@ -177,7 +177,7 @@ VOID TEST(AMF0Test, Size)
o.set("args", args); o.set("args", args);
SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray(); SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray();
params->set("p1", new SrsAmf0Number(10)); params->set("p1", SrsAmf0Any::number(10));
size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params);
o.set("params", params); o.set("params", params);
@ -212,7 +212,7 @@ VOID TEST(AMF0Test, Size)
o.set("args", args); o.set("args", args);
SrsAmf0Object* params = new SrsAmf0Object(); SrsAmf0Object* params = new SrsAmf0Object();
params->set("p1", new SrsAmf0Number(10)); params->set("p1", SrsAmf0Any::number(10));
size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params);
o.set("params", params); o.set("params", params);
@ -233,7 +233,7 @@ VOID TEST(AMF0Test, Size)
o.set("args", args); o.set("args", args);
SrsAmf0Object* params = new SrsAmf0Object(); SrsAmf0Object* params = new SrsAmf0Object();
params->set("p1", new SrsAmf0Number(10)); params->set("p1", SrsAmf0Any::number(10));
size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params);
o.set("params", params); o.set("params", params);
@ -254,7 +254,7 @@ VOID TEST(AMF0Test, Size)
o.set("args", args); o.set("args", args);
SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray(); SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray();
params->set("p1", new SrsAmf0Number(10)); params->set("p1", SrsAmf0Any::number(10));
size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params);
o.set("params", params); o.set("params", params);
@ -304,4 +304,43 @@ VOID TEST(AMF0Test, AnyElem)
EXPECT_TRUE(o->is_boolean()); EXPECT_TRUE(o->is_boolean());
EXPECT_TRUE(o->to_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());
}
} }