mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support encode amf0 packet, connect app response packet
This commit is contained in:
parent
57dd58d557
commit
8283ed465a
7 changed files with 482 additions and 10 deletions
|
@ -53,6 +53,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
// User defined
|
// User defined
|
||||||
#define RTMP_AMF0_Invalid 0x3F
|
#define RTMP_AMF0_Invalid 0x3F
|
||||||
|
|
||||||
|
int srs_amf0_get_object_eof_size();
|
||||||
|
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);
|
||||||
|
|
||||||
SrsAmf0Any::SrsAmf0Any()
|
SrsAmf0Any::SrsAmf0Any()
|
||||||
{
|
{
|
||||||
marker = RTMP_AMF0_Invalid;
|
marker = RTMP_AMF0_Invalid;
|
||||||
|
@ -167,8 +173,6 @@ SrsAmf0Any* SrsAmf0Object::ensure_property_string(std::string name)
|
||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*&);
|
|
||||||
|
|
||||||
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;
|
||||||
|
@ -213,6 +217,36 @@ int srs_amf0_read_utf8(SrsStream* stream, std::string& value)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
int srs_amf0_write_utf8(SrsStream* stream, std::string value)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
// len
|
||||||
|
if (!stream->require(2)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write string length failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
stream->write_2bytes(value.length());
|
||||||
|
srs_verbose("amf0 write string length success. len=%d", (int)value.length());
|
||||||
|
|
||||||
|
// empty string
|
||||||
|
if (value.length() <= 0) {
|
||||||
|
srs_verbose("amf0 write empty string. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// data
|
||||||
|
if (!stream->require(value.length())) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write string data failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
stream->write_string(value);
|
||||||
|
srs_verbose("amf0 write string data success. str=%s", value.c_str());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int srs_amf0_read_string(SrsStream* stream, std::string& value)
|
int srs_amf0_read_string(SrsStream* stream, std::string& value)
|
||||||
{
|
{
|
||||||
|
@ -237,6 +271,23 @@ int srs_amf0_read_string(SrsStream* stream, std::string& value)
|
||||||
return srs_amf0_read_utf8(stream, value);
|
return srs_amf0_read_utf8(stream, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int srs_amf0_write_string(SrsStream* stream, std::string value)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
// marker
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write string marker failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream->write_1bytes(RTMP_AMF0_String);
|
||||||
|
srs_verbose("amf0 write string marker success");
|
||||||
|
|
||||||
|
return srs_amf0_write_utf8(stream, value);
|
||||||
|
}
|
||||||
|
|
||||||
int srs_amf0_read_boolean(SrsStream* stream, bool& value)
|
int srs_amf0_read_boolean(SrsStream* stream, bool& value)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
@ -274,6 +325,36 @@ int srs_amf0_read_boolean(SrsStream* stream, bool& value)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
int srs_amf0_write_boolean(SrsStream* stream, bool value)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
// marker
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write bool marker failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
stream->write_1bytes(RTMP_AMF0_Boolean);
|
||||||
|
srs_verbose("amf0 write bool marker success");
|
||||||
|
|
||||||
|
// value
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write bool value failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
stream->write_1bytes(0x01);
|
||||||
|
} else {
|
||||||
|
stream->write_1bytes(0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_verbose("amf0 write bool value success. value=%d", value);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int srs_amf0_read_number(SrsStream* stream, double& value)
|
int srs_amf0_read_number(SrsStream* stream, double& value)
|
||||||
{
|
{
|
||||||
|
@ -309,6 +390,35 @@ int srs_amf0_read_number(SrsStream* stream, double& value)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
int srs_amf0_write_number(SrsStream* stream, double value)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
// marker
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write number marker failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream->write_1bytes(RTMP_AMF0_Number);
|
||||||
|
srs_verbose("amf0 write number marker success");
|
||||||
|
|
||||||
|
// value
|
||||||
|
if (!stream->require(8)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write number value failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t temp = 0x00;
|
||||||
|
memcpy(&temp, &value, 8);
|
||||||
|
stream->write_8bytes(temp);
|
||||||
|
|
||||||
|
srs_verbose("amf0 write number value success. value=%.2f", value);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
|
int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
|
||||||
{
|
{
|
||||||
|
@ -381,11 +491,66 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
|
||||||
|
|
||||||
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_ObjectEnd: {
|
||||||
|
SrsAmf0ObjectEOF* p = srs_amf0_convert<SrsAmf0ObjectEOF>(value);
|
||||||
|
return srs_amf0_write_object_eof(stream, p);
|
||||||
|
}
|
||||||
|
case RTMP_AMF0_Object: {
|
||||||
|
SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object>(value);
|
||||||
|
return srs_amf0_write_object(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_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;
|
||||||
|
|
||||||
|
// auto skip -2 to read the object eof.
|
||||||
|
srs_assert(stream->pos() >= 2);
|
||||||
|
stream->skip(-2);
|
||||||
|
|
||||||
|
// value
|
||||||
|
if (!stream->require(2)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_DECODE;
|
||||||
|
srs_error("amf0 read object eof value failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int16_t temp = stream->read_2bytes();
|
||||||
|
if (temp != 0x00) {
|
||||||
|
ret = ERROR_RTMP_AMF0_DECODE;
|
||||||
|
srs_error("amf0 read object eof value check failed. "
|
||||||
|
"must be 0x00, actual is %#x, ret=%d", temp, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// marker
|
// marker
|
||||||
if (!stream->require(1)) {
|
if (!stream->require(1)) {
|
||||||
ret = ERROR_RTMP_AMF0_DECODE;
|
ret = ERROR_RTMP_AMF0_DECODE;
|
||||||
|
@ -402,9 +567,36 @@ 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
|
|
||||||
value = new SrsAmf0ObjectEOF();
|
value = new SrsAmf0ObjectEOF();
|
||||||
srs_verbose("amf0 read object eof marker success");
|
srs_verbose("amf0 read object eof success");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF* value)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
srs_assert(value != NULL);
|
||||||
|
|
||||||
|
// value
|
||||||
|
if (!stream->require(2)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write object eof value failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
stream->write_2bytes(0x00);
|
||||||
|
srs_verbose("amf0 write object eof value success");
|
||||||
|
|
||||||
|
// marker
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write object eof marker failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream->write_1bytes(RTMP_AMF0_ObjectEnd);
|
||||||
|
|
||||||
|
srs_verbose("amf0 read object eof success");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -462,3 +654,108 @@ int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
srs_assert(value != NULL);
|
||||||
|
|
||||||
|
// marker
|
||||||
|
if (!stream->require(1)) {
|
||||||
|
ret = ERROR_RTMP_AMF0_ENCODE;
|
||||||
|
srs_error("amf0 write object marker failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream->write_1bytes(RTMP_AMF0_Object);
|
||||||
|
srs_verbose("amf0 write object marker success");
|
||||||
|
|
||||||
|
// value
|
||||||
|
std::map<std::string, SrsAmf0Any*>::iterator it;
|
||||||
|
for (it = value->properties.begin(); it != value->properties.end(); ++it) {
|
||||||
|
std::string name = it->first;
|
||||||
|
SrsAmf0Any* any = it->second;
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_utf8(stream, name)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("write object property name failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_any(stream, any)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("write object property value failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_verbose("write amf0 property success. name=%s", name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_object_eof(stream, &value->eof)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("write object eof failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_verbose("write amf0 object success.");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_get_utf8_size(std::string value)
|
||||||
|
{
|
||||||
|
return 2 + value.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_get_string_size(std::string value)
|
||||||
|
{
|
||||||
|
return 1 + srs_amf0_get_utf8_size(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_get_number_size()
|
||||||
|
{
|
||||||
|
return 1 + 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_get_boolean_size()
|
||||||
|
{
|
||||||
|
return 1 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_get_object_size(SrsAmf0Object* obj)
|
||||||
|
{
|
||||||
|
if (!obj) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int size = 1;
|
||||||
|
|
||||||
|
std::map<std::string, SrsAmf0Any*>::iterator it;
|
||||||
|
for (it = obj->properties.begin(); it != obj->properties.end(); ++it) {
|
||||||
|
std::string name = it->first;
|
||||||
|
SrsAmf0Any* value = it->second;
|
||||||
|
|
||||||
|
size += srs_amf0_get_utf8_size(name);
|
||||||
|
|
||||||
|
if (value->is_boolean()) {
|
||||||
|
size += srs_amf0_get_boolean_size();
|
||||||
|
} else if (value->is_number()) {
|
||||||
|
size += srs_amf0_get_number_size();
|
||||||
|
} else if (value->is_string()) {
|
||||||
|
SrsAmf0String* p = srs_amf0_convert<SrsAmf0String>(value);
|
||||||
|
size += srs_amf0_get_string_size(p->value);
|
||||||
|
} else if (value->is_object()) {
|
||||||
|
SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object>(value);
|
||||||
|
size += srs_amf0_get_object_size(p);
|
||||||
|
} else {
|
||||||
|
// TOOD: other AMF0 types.
|
||||||
|
srs_warn("ignore unkown AMF0 type size.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size += srs_amf0_get_object_eof_size();
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srs_amf0_get_object_eof_size()
|
||||||
|
{
|
||||||
|
return 2 + 1;
|
||||||
|
}
|
||||||
|
|
|
@ -140,6 +140,7 @@ struct SrsAmf0Object : public SrsAmf0Any
|
||||||
* @remark only support UTF8-1 char.
|
* @remark only support UTF8-1 char.
|
||||||
*/
|
*/
|
||||||
extern int srs_amf0_read_utf8(SrsStream* stream, std::string& value);
|
extern int srs_amf0_read_utf8(SrsStream* stream, std::string& value);
|
||||||
|
extern int srs_amf0_write_utf8(SrsStream* stream, std::string value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* read amf0 string from stream.
|
* read amf0 string from stream.
|
||||||
|
@ -147,6 +148,7 @@ extern int srs_amf0_read_utf8(SrsStream* stream, std::string& value);
|
||||||
* string-type = string-marker UTF-8
|
* string-type = string-marker UTF-8
|
||||||
*/
|
*/
|
||||||
extern int srs_amf0_read_string(SrsStream* stream, std::string& value);
|
extern int srs_amf0_read_string(SrsStream* stream, std::string& value);
|
||||||
|
extern int srs_amf0_write_string(SrsStream* stream, std::string value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* read amf0 boolean from stream.
|
* read amf0 boolean from stream.
|
||||||
|
@ -155,6 +157,7 @@ extern int srs_amf0_read_string(SrsStream* stream, std::string& value);
|
||||||
* 0 is false, <> 0 is true
|
* 0 is false, <> 0 is true
|
||||||
*/
|
*/
|
||||||
extern int srs_amf0_read_boolean(SrsStream* stream, bool& value);
|
extern int srs_amf0_read_boolean(SrsStream* stream, bool& value);
|
||||||
|
extern int srs_amf0_write_boolean(SrsStream* stream, bool value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* read amf0 number from stream.
|
* read amf0 number from stream.
|
||||||
|
@ -162,6 +165,7 @@ extern int srs_amf0_read_boolean(SrsStream* stream, bool& value);
|
||||||
* number-type = number-marker DOUBLE
|
* number-type = number-marker DOUBLE
|
||||||
*/
|
*/
|
||||||
extern int srs_amf0_read_number(SrsStream* stream, double& value);
|
extern int srs_amf0_read_number(SrsStream* stream, double& value);
|
||||||
|
extern int srs_amf0_write_number(SrsStream* stream, double value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* read amf0 object from stream.
|
* read amf0 object from stream.
|
||||||
|
@ -170,6 +174,16 @@ extern int srs_amf0_read_number(SrsStream* stream, double& value);
|
||||||
* object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
|
* object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
|
||||||
*/
|
*/
|
||||||
extern int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value);
|
extern int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value);
|
||||||
|
extern int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get amf0 objects size.
|
||||||
|
*/
|
||||||
|
extern int srs_amf0_get_utf8_size(std::string value);
|
||||||
|
extern int srs_amf0_get_string_size(std::string value);
|
||||||
|
extern int srs_amf0_get_number_size();
|
||||||
|
extern int srs_amf0_get_boolean_size();
|
||||||
|
extern int srs_amf0_get_object_size(SrsAmf0Object* obj);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* convert the any to specified object.
|
* convert the any to specified object.
|
||||||
|
|
|
@ -58,6 +58,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#define ERROR_RTMP_REQ_TCURL 306
|
#define ERROR_RTMP_REQ_TCURL 306
|
||||||
#define ERROR_RTMP_MESSAGE_DECODE 307
|
#define ERROR_RTMP_MESSAGE_DECODE 307
|
||||||
#define ERROR_RTMP_MESSAGE_ENCODE 308
|
#define ERROR_RTMP_MESSAGE_ENCODE 308
|
||||||
|
#define ERROR_RTMP_AMF0_ENCODE 309
|
||||||
|
|
||||||
#define ERROR_SYSTEM_STREAM_INIT 400
|
#define ERROR_SYSTEM_STREAM_INIT 400
|
||||||
#define ERROR_SYSTEM_PACKET_INVALID 401
|
#define ERROR_SYSTEM_PACKET_INVALID 401
|
||||||
|
|
|
@ -1010,6 +1010,10 @@ SrsConnectAppPacket::SrsConnectAppPacket()
|
||||||
|
|
||||||
SrsConnectAppPacket::~SrsConnectAppPacket()
|
SrsConnectAppPacket::~SrsConnectAppPacket()
|
||||||
{
|
{
|
||||||
|
if (command_object) {
|
||||||
|
delete command_object;
|
||||||
|
command_object = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int SrsConnectAppPacket::decode(SrsStream* stream)
|
int SrsConnectAppPacket::decode(SrsStream* stream)
|
||||||
|
@ -1053,6 +1057,77 @@ int SrsConnectAppPacket::decode(SrsStream* stream)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SrsConnectAppResPacket::SrsConnectAppResPacket()
|
||||||
|
{
|
||||||
|
command_name = RTMP_AMF0_COMMAND_CONNECT;
|
||||||
|
transaction_id = 1;
|
||||||
|
props = NULL;
|
||||||
|
info = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsConnectAppResPacket::~SrsConnectAppResPacket()
|
||||||
|
{
|
||||||
|
if (props) {
|
||||||
|
delete props;
|
||||||
|
props = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info) {
|
||||||
|
delete info;
|
||||||
|
info = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsConnectAppResPacket::get_perfer_cid()
|
||||||
|
{
|
||||||
|
return RTMP_CID_OverConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsConnectAppResPacket::get_message_type()
|
||||||
|
{
|
||||||
|
return RTMP_MSG_AMF0CommandMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsConnectAppResPacket::get_size()
|
||||||
|
{
|
||||||
|
return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()
|
||||||
|
+ srs_amf0_get_object_size(props)+ srs_amf0_get_object_size(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsConnectAppResPacket::encode_packet(SrsStream* stream)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_string(stream, command_name)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("encode command_name failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_verbose("encode command_name success.");
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_number(stream, transaction_id)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("encode transaction_id failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_verbose("encode transaction_id success.");
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_object(stream, props)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("encode props failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_verbose("encode props success.");
|
||||||
|
|
||||||
|
if ((ret = srs_amf0_write_object(stream, info)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("encode info failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_verbose("encode info success.");
|
||||||
|
|
||||||
|
|
||||||
|
srs_info("encode connect app response packet success.");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
SrsSetWindowAckSizePacket::SrsSetWindowAckSizePacket()
|
SrsSetWindowAckSizePacket::SrsSetWindowAckSizePacket()
|
||||||
{
|
{
|
||||||
ackowledgement_window_size = 0;
|
ackowledgement_window_size = 0;
|
||||||
|
|
|
@ -324,6 +324,34 @@ public:
|
||||||
public:
|
public:
|
||||||
virtual int decode(SrsStream* stream);
|
virtual int decode(SrsStream* stream);
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* response for SrsConnectAppPacket.
|
||||||
|
*/
|
||||||
|
class SrsConnectAppResPacket : public SrsPacket
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
typedef SrsPacket super;
|
||||||
|
protected:
|
||||||
|
virtual const char* get_class_name()
|
||||||
|
{
|
||||||
|
return CLASS_NAME_STRING(SrsConnectAppResPacket);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
std::string command_name;
|
||||||
|
double transaction_id;
|
||||||
|
SrsAmf0Object* props;
|
||||||
|
SrsAmf0Object* info;
|
||||||
|
public:
|
||||||
|
SrsConnectAppResPacket();
|
||||||
|
virtual ~SrsConnectAppResPacket();
|
||||||
|
public:
|
||||||
|
virtual int get_perfer_cid();
|
||||||
|
public:
|
||||||
|
virtual int get_message_type();
|
||||||
|
protected:
|
||||||
|
virtual int get_size();
|
||||||
|
virtual int encode_packet(SrsStream* stream);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 5.5. Window Acknowledgement Size (5)
|
* 5.5. Window Acknowledgement Size (5)
|
||||||
|
|
|
@ -78,6 +78,15 @@ void SrsStream::skip(int size)
|
||||||
p += size;
|
p += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsStream::pos()
|
||||||
|
{
|
||||||
|
if (empty()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p - bytes;
|
||||||
|
}
|
||||||
|
|
||||||
int8_t SrsStream::read_1bytes()
|
int8_t SrsStream::read_1bytes()
|
||||||
{
|
{
|
||||||
srs_assert(require(1));
|
srs_assert(require(1));
|
||||||
|
@ -141,6 +150,22 @@ std::string SrsStream::read_string(int len)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SrsStream::write_1bytes(int8_t value)
|
||||||
|
{
|
||||||
|
srs_assert(require(1));
|
||||||
|
|
||||||
|
*p++ = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsStream::write_2bytes(int16_t value)
|
||||||
|
{
|
||||||
|
srs_assert(require(2));
|
||||||
|
|
||||||
|
pp = (char*)&value;
|
||||||
|
*p++ = pp[1];
|
||||||
|
*p++ = pp[0];
|
||||||
|
}
|
||||||
|
|
||||||
void SrsStream::write_4bytes(int32_t value)
|
void SrsStream::write_4bytes(int32_t value)
|
||||||
{
|
{
|
||||||
srs_assert(require(4));
|
srs_assert(require(4));
|
||||||
|
@ -152,10 +177,26 @@ void SrsStream::write_4bytes(int32_t value)
|
||||||
*p++ = pp[0];
|
*p++ = pp[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsStream::write_1bytes(int8_t value)
|
void SrsStream::write_8bytes(int64_t value)
|
||||||
{
|
{
|
||||||
srs_assert(require(1));
|
srs_assert(require(8));
|
||||||
|
|
||||||
*p++ = value;
|
pp = (char*)&value;
|
||||||
|
*p++ = pp[7];
|
||||||
|
*p++ = pp[6];
|
||||||
|
*p++ = pp[5];
|
||||||
|
*p++ = pp[4];
|
||||||
|
*p++ = pp[3];
|
||||||
|
*p++ = pp[2];
|
||||||
|
*p++ = pp[1];
|
||||||
|
*p++ = pp[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsStream::write_string(std::string value)
|
||||||
|
{
|
||||||
|
srs_assert(require(value.length()));
|
||||||
|
|
||||||
|
memcpy(p, value.data(), value.length());
|
||||||
|
p += value.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class SrsStream
|
class SrsStream
|
||||||
{
|
{
|
||||||
protected:
|
private:
|
||||||
char* p;
|
char* p;
|
||||||
char* pp;
|
char* pp;
|
||||||
char* bytes;
|
char* bytes;
|
||||||
|
@ -70,6 +70,10 @@ public:
|
||||||
* @size can be any value. positive to forward; nagetive to backward.
|
* @size can be any value. positive to forward; nagetive to backward.
|
||||||
*/
|
*/
|
||||||
virtual void skip(int size);
|
virtual void skip(int size);
|
||||||
|
/**
|
||||||
|
* tell the current pos.
|
||||||
|
*/
|
||||||
|
virtual int pos();
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* get 1bytes char from stream.
|
* get 1bytes char from stream.
|
||||||
|
@ -92,14 +96,26 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual std::string read_string(int len);
|
virtual std::string read_string(int len);
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* write 1bytes char to stream.
|
||||||
|
*/
|
||||||
|
virtual void write_1bytes(int8_t value);
|
||||||
|
/**
|
||||||
|
* write 2bytes int to stream.
|
||||||
|
*/
|
||||||
|
virtual void write_2bytes(int16_t value);
|
||||||
/**
|
/**
|
||||||
* write 4bytes int to stream.
|
* write 4bytes int to stream.
|
||||||
*/
|
*/
|
||||||
virtual void write_4bytes(int32_t value);
|
virtual void write_4bytes(int32_t value);
|
||||||
/**
|
/**
|
||||||
* write 1bytes char to stream.
|
* write 8bytes int to stream.
|
||||||
*/
|
*/
|
||||||
virtual void write_1bytes(int8_t value);
|
virtual void write_8bytes(int64_t value);
|
||||||
|
/**
|
||||||
|
* write string to stream
|
||||||
|
*/
|
||||||
|
virtual void write_string(std::string value);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Add table
Add a link
Reference in a new issue