amf0 utest: remove the old amf0 read any, discovery object ant use object to read itself.
正在显示
2 个修改的文件
包含
99 行增加
和
144 行删除
| @@ -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) |
-
请 注册 或 登录 后发表评论