winlin

amf0 utest: remove the old amf0 read any, discovery object ant use object to read itself.

@@ -191,6 +191,69 @@ SrsAmf0EcmaArray* SrsAmf0Any::array() @@ -191,6 +191,69 @@ SrsAmf0EcmaArray* SrsAmf0Any::array()
191 return new SrsAmf0EcmaArray(); 191 return new SrsAmf0EcmaArray();
192 } 192 }
193 193
  194 +int SrsAmf0Any::discovery(SrsStream* stream, SrsAmf0Any** ppvalue)
  195 +{
  196 + int ret = ERROR_SUCCESS;
  197 +
  198 + // detect the object-eof specially
  199 + if (srs_amf0_is_object_eof(stream)) {
  200 + *ppvalue = new __SrsAmf0ObjectEOF();
  201 + return ret;
  202 + }
  203 +
  204 + // marker
  205 + if (!stream->require(1)) {
  206 + ret = ERROR_RTMP_AMF0_DECODE;
  207 + srs_error("amf0 read any marker failed. ret=%d", ret);
  208 + return ret;
  209 + }
  210 +
  211 + char marker = stream->read_1bytes();
  212 + srs_verbose("amf0 any marker success");
  213 +
  214 + // backward the 1byte marker.
  215 + stream->skip(-1);
  216 +
  217 + switch (marker) {
  218 + case RTMP_AMF0_String: {
  219 + *ppvalue = new __SrsAmf0String();
  220 + return ret;
  221 + }
  222 + case RTMP_AMF0_Boolean: {
  223 + *ppvalue = new __SrsAmf0Boolean();
  224 + return ret;
  225 + }
  226 + case RTMP_AMF0_Number: {
  227 + *ppvalue = new __SrsAmf0Number();
  228 + return ret;
  229 + }
  230 + case RTMP_AMF0_Null: {
  231 + *ppvalue = new __SrsAmf0Null();
  232 + return ret;
  233 + }
  234 + case RTMP_AMF0_Undefined: {
  235 + *ppvalue = new __SrsAmf0Undefined();
  236 + return ret;
  237 + }
  238 + case RTMP_AMF0_Object: {
  239 + *ppvalue = new SrsAmf0Object();
  240 + return ret;
  241 + }
  242 + case RTMP_AMF0_EcmaArray: {
  243 + *ppvalue = new SrsAmf0EcmaArray();
  244 + return ret;
  245 + }
  246 + case RTMP_AMF0_Invalid:
  247 + default: {
  248 + ret = ERROR_RTMP_AMF0_INVALID;
  249 + srs_error("invalid amf0 message type. marker=%#x, ret=%d", marker, ret);
  250 + return ret;
  251 + }
  252 + }
  253 +
  254 + return ret;
  255 +}
  256 +
194 __SrsUnSortedHashtable::__SrsUnSortedHashtable() 257 __SrsUnSortedHashtable::__SrsUnSortedHashtable()
195 { 258 {
196 } 259 }
@@ -893,6 +956,32 @@ int __SrsAmf0Undefined::write(SrsStream* stream) @@ -893,6 +956,32 @@ int __SrsAmf0Undefined::write(SrsStream* stream)
893 return srs_amf0_write_undefined(stream); 956 return srs_amf0_write_undefined(stream);
894 } 957 }
895 958
  959 +int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue)
  960 +{
  961 + int ret = ERROR_SUCCESS;
  962 +
  963 + if ((ret = SrsAmf0Any::discovery(stream, ppvalue)) != ERROR_SUCCESS) {
  964 + srs_error("amf0 discovery any elem failed. ret=%d", ret);
  965 + return ret;
  966 + }
  967 +
  968 + srs_assert(*ppvalue);
  969 +
  970 + if ((ret = (*ppvalue)->read(stream)) != ERROR_SUCCESS) {
  971 + srs_error("amf0 parse elem failed. ret=%d", ret);
  972 + srs_freep(*ppvalue);
  973 + return ret;
  974 + }
  975 +
  976 + return ret;
  977 +}
  978 +
  979 +int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
  980 +{
  981 + srs_assert(value != NULL);
  982 + return value->write(stream);
  983 +}
  984 +
896 int srs_amf0_read_utf8(SrsStream* stream, std::string& value) 985 int srs_amf0_read_utf8(SrsStream* stream, std::string& value)
897 { 986 {
898 int ret = ERROR_SUCCESS; 987 int ret = ERROR_SUCCESS;
@@ -1231,142 +1320,6 @@ bool srs_amf0_is_object_eof(SrsStream* stream) @@ -1231,142 +1320,6 @@ bool srs_amf0_is_object_eof(SrsStream* stream)
1231 return false; 1320 return false;
1232 } 1321 }
1233 1322
1234 -int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue)  
1235 -{  
1236 - int ret = ERROR_SUCCESS;  
1237 -  
1238 - // detect the object-eof specially  
1239 - if (srs_amf0_is_object_eof(stream)) {  
1240 - *ppvalue = new __SrsAmf0ObjectEOF();  
1241 - if ((ret = (*ppvalue)->read(stream)) != ERROR_SUCCESS) {  
1242 - srs_freep(*ppvalue);  
1243 - return ret;  
1244 - }  
1245 - return ret;  
1246 - }  
1247 -  
1248 - // marker  
1249 - if (!stream->require(1)) {  
1250 - ret = ERROR_RTMP_AMF0_DECODE;  
1251 - srs_error("amf0 read any marker failed. ret=%d", ret);  
1252 - return ret;  
1253 - }  
1254 -  
1255 - char marker = stream->read_1bytes();  
1256 - srs_verbose("amf0 any marker success");  
1257 -  
1258 - // backward the 1byte marker.  
1259 - stream->skip(-1);  
1260 -  
1261 - switch (marker) {  
1262 - case RTMP_AMF0_String: {  
1263 - std::string data;  
1264 - if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) {  
1265 - return ret;  
1266 - }  
1267 - *ppvalue = SrsAmf0Any::str(data.c_str());  
1268 - return ret;  
1269 - }  
1270 - case RTMP_AMF0_Boolean: {  
1271 - bool data;  
1272 - if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) {  
1273 - return ret;  
1274 - }  
1275 - *ppvalue = SrsAmf0Any::boolean(data);  
1276 - return ret;  
1277 - }  
1278 - case RTMP_AMF0_Number: {  
1279 - double data;  
1280 - if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) {  
1281 - return ret;  
1282 - }  
1283 - *ppvalue = SrsAmf0Any::number(data);  
1284 - return ret;  
1285 - }  
1286 - case RTMP_AMF0_Null: {  
1287 - stream->skip(1);  
1288 - *ppvalue = new __SrsAmf0Null();  
1289 - return ret;  
1290 - }  
1291 - case RTMP_AMF0_Undefined: {  
1292 - stream->skip(1);  
1293 - *ppvalue = new __SrsAmf0Undefined();  
1294 - return ret;  
1295 - }  
1296 - case RTMP_AMF0_Object: {  
1297 - SrsAmf0Object* p = NULL;  
1298 - if ((ret = srs_amf0_read_object(stream, p)) != ERROR_SUCCESS) {  
1299 - return ret;  
1300 - }  
1301 - *ppvalue = p;  
1302 - return ret;  
1303 - }  
1304 - case RTMP_AMF0_EcmaArray: {  
1305 - SrsAmf0EcmaArray* p = NULL;  
1306 - if ((ret = srs_amf0_read_ecma_array(stream, p)) != ERROR_SUCCESS) {  
1307 - return ret;  
1308 - }  
1309 - *ppvalue = p;  
1310 - return ret;  
1311 - }  
1312 - case RTMP_AMF0_Invalid:  
1313 - default: {  
1314 - ret = ERROR_RTMP_AMF0_INVALID;  
1315 - srs_error("invalid amf0 message type. marker=%#x, ret=%d", marker, ret);  
1316 - return ret;  
1317 - }  
1318 - }  
1319 -  
1320 - return ret;  
1321 -}  
1322 -int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)  
1323 -{  
1324 - int ret = ERROR_SUCCESS;  
1325 -  
1326 - srs_assert(value != NULL);  
1327 -  
1328 - switch (value->marker) {  
1329 - case RTMP_AMF0_String: {  
1330 - std::string data = srs_amf0_convert<__SrsAmf0String*>(value)->value;  
1331 - return srs_amf0_write_string(stream, data);  
1332 - }  
1333 - case RTMP_AMF0_Boolean: {  
1334 - bool data = srs_amf0_convert<__SrsAmf0Boolean*>(value)->value;  
1335 - return srs_amf0_write_boolean(stream, data);  
1336 - }  
1337 - case RTMP_AMF0_Number: {  
1338 - double data = srs_amf0_convert<__SrsAmf0Number*>(value)->value;  
1339 - return srs_amf0_write_number(stream, data);  
1340 - }  
1341 - case RTMP_AMF0_Null: {  
1342 - return srs_amf0_write_null(stream);  
1343 - }  
1344 - case RTMP_AMF0_Undefined: {  
1345 - return srs_amf0_write_undefined(stream);  
1346 - }  
1347 - case RTMP_AMF0_ObjectEnd: {  
1348 - __SrsAmf0ObjectEOF* p = srs_amf0_convert<__SrsAmf0ObjectEOF*>(value);  
1349 - return p->write(stream);  
1350 - }  
1351 - case RTMP_AMF0_Object: {  
1352 - SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object*>(value);  
1353 - return srs_amf0_write_object(stream, p);  
1354 - }  
1355 - case RTMP_AMF0_EcmaArray: {  
1356 - SrsAmf0EcmaArray* p = srs_amf0_convert<SrsAmf0EcmaArray*>(value);  
1357 - return srs_amf0_write_ecma_array(stream, p);  
1358 - }  
1359 - case RTMP_AMF0_Invalid:  
1360 - default: {  
1361 - ret = ERROR_RTMP_AMF0_INVALID;  
1362 - srs_error("invalid amf0 message type. marker=%#x, ret=%d", value->marker, ret);  
1363 - return ret;  
1364 - }  
1365 - }  
1366 -  
1367 - return ret;  
1368 -}  
1369 -  
1370 int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value) 1323 int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value)
1371 { 1324 {
1372 int ret = ERROR_SUCCESS; 1325 int ret = ERROR_SUCCESS;
@@ -125,6 +125,8 @@ public: @@ -125,6 +125,8 @@ public:
125 static SrsAmf0Object* object(); 125 static SrsAmf0Object* object();
126 static SrsAmf0Any* object_eof(); 126 static SrsAmf0Any* object_eof();
127 static SrsAmf0EcmaArray* array(); 127 static SrsAmf0EcmaArray* array();
  128 +public:
  129 + static int discovery(SrsStream* stream, SrsAmf0Any** ppvalue);
128 }; 130 };
129 131
130 /** 132 /**
@@ -259,7 +261,7 @@ class __SrsAmf0String : public SrsAmf0Any @@ -259,7 +261,7 @@ class __SrsAmf0String : public SrsAmf0Any
259 public: 261 public:
260 std::string value; 262 std::string value;
261 263
262 - __SrsAmf0String(const char* _value); 264 + __SrsAmf0String(const char* _value = NULL);
263 virtual ~__SrsAmf0String(); 265 virtual ~__SrsAmf0String();
264 266
265 virtual int size(); 267 virtual int size();
@@ -279,7 +281,7 @@ class __SrsAmf0Boolean : public SrsAmf0Any @@ -279,7 +281,7 @@ class __SrsAmf0Boolean : public SrsAmf0Any
279 public: 281 public:
280 bool value; 282 bool value;
281 283
282 - __SrsAmf0Boolean(bool _value); 284 + __SrsAmf0Boolean(bool _value = false);
283 virtual ~__SrsAmf0Boolean(); 285 virtual ~__SrsAmf0Boolean();
284 286
285 virtual int size(); 287 virtual int size();
@@ -298,7 +300,7 @@ class __SrsAmf0Number : public SrsAmf0Any @@ -298,7 +300,7 @@ class __SrsAmf0Number : public SrsAmf0Any
298 public: 300 public:
299 double value; 301 double value;
300 302
301 - __SrsAmf0Number(double _value); 303 + __SrsAmf0Number(double _value = 0.0);
302 virtual ~__SrsAmf0Number(); 304 virtual ~__SrsAmf0Number();
303 305
304 virtual int size(); 306 virtual int size();
@@ -339,6 +341,11 @@ public: @@ -339,6 +341,11 @@ public:
339 }; 341 };
340 342
341 /** 343 /**
  344 +* read anything from stream.
  345 +*/
  346 +extern int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue);
  347 +
  348 +/**
342 * read amf0 string from stream. 349 * read amf0 string from stream.
343 * 2.4 String Type 350 * 2.4 String Type
344 * string-type = string-marker UTF-8 351 * string-type = string-marker UTF-8
@@ -380,11 +387,6 @@ extern int srs_amf0_read_undefined(SrsStream* stream); @@ -380,11 +387,6 @@ extern int srs_amf0_read_undefined(SrsStream* stream);
380 extern int srs_amf0_write_undefined(SrsStream* stream); 387 extern int srs_amf0_write_undefined(SrsStream* stream);
381 388
382 /** 389 /**
383 -* read anything from stream.  
384 -*/  
385 -extern int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue);  
386 -  
387 -/**  
388 * read amf0 object from stream. 390 * read amf0 object from stream.
389 * 2.5 Object Type 391 * 2.5 Object Type
390 * anonymous-object-type = object-marker *(object-property) 392 * anonymous-object-type = object-marker *(object-property)