mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 03:41:55 +00:00
amf0 utest: remove the old amf0 read any, discovery object ant use object to read itself.
This commit is contained in:
parent
3691c106fa
commit
609114a5fe
2 changed files with 99 additions and 144 deletions
|
@ -191,6 +191,69 @@ SrsAmf0EcmaArray* SrsAmf0Any::array()
|
||||||
return new SrsAmf0EcmaArray();
|
return new SrsAmf0EcmaArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsAmf0Any::discovery(SrsStream* stream, SrsAmf0Any** ppvalue)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
// detect the object-eof specially
|
||||||
|
if (srs_amf0_is_object_eof(stream)) {
|
||||||
|
*ppvalue = new __SrsAmf0ObjectEOF();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// marker
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_DECODE;
|
||||||
|
srs_error("amf0 read any marker failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
char marker = stream->read_1bytes();
|
||||||
|
srs_verbose("amf0 any marker success");
|
||||||
|
|
||||||
|
// backward the 1byte marker.
|
||||||
|
stream->skip(-1);
|
||||||
|
|
||||||
|
switch (marker) {
|
||||||
|
case RTMP_AMF0_String: {
|
||||||
|
*ppvalue = new __SrsAmf0String();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Boolean: {
|
||||||
|
*ppvalue = new __SrsAmf0Boolean();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Number: {
|
||||||
|
*ppvalue = new __SrsAmf0Number();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Null: {
|
||||||
|
*ppvalue = new __SrsAmf0Null();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Undefined: {
|
||||||
|
*ppvalue = new __SrsAmf0Undefined();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Object: {
|
||||||
|
*ppvalue = new SrsAmf0Object();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_EcmaArray: {
|
||||||
|
*ppvalue = new SrsAmf0EcmaArray();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Invalid:
|
||||||
|
default: {
|
||||||
|
ret = ERROR_RTMP_AMF0_INVALID;
|
||||||
|
srs_error("invalid amf0 message type. marker=%#x, ret=%d", marker, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
__SrsUnSortedHashtable::__SrsUnSortedHashtable()
|
__SrsUnSortedHashtable::__SrsUnSortedHashtable()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -893,6 +956,32 @@ int __SrsAmf0Undefined::write(SrsStream* stream)
|
||||||
return srs_amf0_write_undefined(stream);
|
return srs_amf0_write_undefined(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if ((ret = SrsAmf0Any::discovery(stream, ppvalue)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("amf0 discovery any elem failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_assert(*ppvalue);
|
||||||
|
|
||||||
|
if ((ret = (*ppvalue)->read(stream)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("amf0 parse elem failed. ret=%d", ret);
|
||||||
|
srs_freep(*ppvalue);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
|
||||||
|
{
|
||||||
|
srs_assert(value != NULL);
|
||||||
|
return value->write(stream);
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
@ -1231,142 +1320,6 @@ bool srs_amf0_is_object_eof(SrsStream* stream)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue)
|
|
||||||
{
|
|
||||||
int ret = ERROR_SUCCESS;
|
|
||||||
|
|
||||||
// detect the object-eof specially
|
|
||||||
if (srs_amf0_is_object_eof(stream)) {
|
|
||||||
*ppvalue = new __SrsAmf0ObjectEOF();
|
|
||||||
if ((ret = (*ppvalue)->read(stream)) != ERROR_SUCCESS) {
|
|
||||||
srs_freep(*ppvalue);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// marker
|
|
||||||
if (!stream->require(1)) {
|
|
||||||
ret = ERROR_RTMP_AMF0_DECODE;
|
|
||||||
srs_error("amf0 read any marker failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
char marker = stream->read_1bytes();
|
|
||||||
srs_verbose("amf0 any marker success");
|
|
||||||
|
|
||||||
// backward the 1byte marker.
|
|
||||||
stream->skip(-1);
|
|
||||||
|
|
||||||
switch (marker) {
|
|
||||||
case RTMP_AMF0_String: {
|
|
||||||
std::string data;
|
|
||||||
if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*ppvalue = SrsAmf0Any::str(data.c_str());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Boolean: {
|
|
||||||
bool data;
|
|
||||||
if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*ppvalue = SrsAmf0Any::boolean(data);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Number: {
|
|
||||||
double data;
|
|
||||||
if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*ppvalue = SrsAmf0Any::number(data);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Null: {
|
|
||||||
stream->skip(1);
|
|
||||||
*ppvalue = new __SrsAmf0Null();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Undefined: {
|
|
||||||
stream->skip(1);
|
|
||||||
*ppvalue = new __SrsAmf0Undefined();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Object: {
|
|
||||||
SrsAmf0Object* p = NULL;
|
|
||||||
if ((ret = srs_amf0_read_object(stream, p)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*ppvalue = p;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_EcmaArray: {
|
|
||||||
SrsAmf0EcmaArray* p = NULL;
|
|
||||||
if ((ret = srs_amf0_read_ecma_array(stream, p)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*ppvalue = p;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Invalid:
|
|
||||||
default: {
|
|
||||||
ret = ERROR_RTMP_AMF0_INVALID;
|
|
||||||
srs_error("invalid amf0 message type. marker=%#x, ret=%d", marker, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
|
|
||||||
{
|
|
||||||
int ret = ERROR_SUCCESS;
|
|
||||||
|
|
||||||
srs_assert(value != NULL);
|
|
||||||
|
|
||||||
switch (value->marker) {
|
|
||||||
case RTMP_AMF0_String: {
|
|
||||||
std::string data = srs_amf0_convert<__SrsAmf0String*>(value)->value;
|
|
||||||
return srs_amf0_write_string(stream, data);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Boolean: {
|
|
||||||
bool data = srs_amf0_convert<__SrsAmf0Boolean*>(value)->value;
|
|
||||||
return srs_amf0_write_boolean(stream, data);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Number: {
|
|
||||||
double data = srs_amf0_convert<__SrsAmf0Number*>(value)->value;
|
|
||||||
return srs_amf0_write_number(stream, data);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Null: {
|
|
||||||
return srs_amf0_write_null(stream);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Undefined: {
|
|
||||||
return srs_amf0_write_undefined(stream);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_ObjectEnd: {
|
|
||||||
__SrsAmf0ObjectEOF* p = srs_amf0_convert<__SrsAmf0ObjectEOF*>(value);
|
|
||||||
return p->write(stream);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Object: {
|
|
||||||
SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object*>(value);
|
|
||||||
return srs_amf0_write_object(stream, p);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_EcmaArray: {
|
|
||||||
SrsAmf0EcmaArray* p = srs_amf0_convert<SrsAmf0EcmaArray*>(value);
|
|
||||||
return srs_amf0_write_ecma_array(stream, p);
|
|
||||||
}
|
|
||||||
case RTMP_AMF0_Invalid:
|
|
||||||
default: {
|
|
||||||
ret = ERROR_RTMP_AMF0_INVALID;
|
|
||||||
srs_error("invalid amf0 message type. marker=%#x, ret=%d", value->marker, ret);
|
|
||||||
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;
|
||||||
|
|
|
@ -125,6 +125,8 @@ public:
|
||||||
static SrsAmf0Object* object();
|
static SrsAmf0Object* object();
|
||||||
static SrsAmf0Any* object_eof();
|
static SrsAmf0Any* object_eof();
|
||||||
static SrsAmf0EcmaArray* array();
|
static SrsAmf0EcmaArray* array();
|
||||||
|
public:
|
||||||
|
static int discovery(SrsStream* stream, SrsAmf0Any** ppvalue);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -259,7 +261,7 @@ class __SrsAmf0String : public SrsAmf0Any
|
||||||
public:
|
public:
|
||||||
std::string value;
|
std::string value;
|
||||||
|
|
||||||
__SrsAmf0String(const char* _value);
|
__SrsAmf0String(const char* _value = NULL);
|
||||||
virtual ~__SrsAmf0String();
|
virtual ~__SrsAmf0String();
|
||||||
|
|
||||||
virtual int size();
|
virtual int size();
|
||||||
|
@ -279,7 +281,7 @@ class __SrsAmf0Boolean : public SrsAmf0Any
|
||||||
public:
|
public:
|
||||||
bool value;
|
bool value;
|
||||||
|
|
||||||
__SrsAmf0Boolean(bool _value);
|
__SrsAmf0Boolean(bool _value = false);
|
||||||
virtual ~__SrsAmf0Boolean();
|
virtual ~__SrsAmf0Boolean();
|
||||||
|
|
||||||
virtual int size();
|
virtual int size();
|
||||||
|
@ -298,7 +300,7 @@ class __SrsAmf0Number : public SrsAmf0Any
|
||||||
public:
|
public:
|
||||||
double value;
|
double value;
|
||||||
|
|
||||||
__SrsAmf0Number(double _value);
|
__SrsAmf0Number(double _value = 0.0);
|
||||||
virtual ~__SrsAmf0Number();
|
virtual ~__SrsAmf0Number();
|
||||||
|
|
||||||
virtual int size();
|
virtual int size();
|
||||||
|
@ -338,6 +340,11 @@ public:
|
||||||
virtual int write(SrsStream* stream);
|
virtual int write(SrsStream* stream);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* read anything from stream.
|
||||||
|
*/
|
||||||
|
extern int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* read amf0 string from stream.
|
* read amf0 string from stream.
|
||||||
* 2.4 String Type
|
* 2.4 String Type
|
||||||
|
@ -379,11 +386,6 @@ extern int srs_amf0_write_null(SrsStream* stream);
|
||||||
extern int srs_amf0_read_undefined(SrsStream* stream);
|
extern int srs_amf0_read_undefined(SrsStream* stream);
|
||||||
extern int srs_amf0_write_undefined(SrsStream* stream);
|
extern int srs_amf0_write_undefined(SrsStream* stream);
|
||||||
|
|
||||||
/**
|
|
||||||
* read anything from stream.
|
|
||||||
*/
|
|
||||||
extern int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* read amf0 object from stream.
|
* read amf0 object from stream.
|
||||||
* 2.5 Object Type
|
* 2.5 Object Type
|
||||||
|
|
Loading…
Reference in a new issue