#include "amf0.h" #include #include #include #define AMF_OBJECT_ITEM_VALUE(v, amf_type, amf_name, amf_value, amf_size) { v.type=amf_type; v.name=amf_name; v.value=amf_value; v.size=amf_size; } struct rtmp_result_t { char code[64]; // NetStream.Play.Start char level[8]; // warning/status/error char description[256]; }; static int amf0_get(const char* file, void* amf0, size_t bytes) { int r; FILE* fp; fp = fopen(file, "rb"); if (NULL == fp) return 0; r = fread(amf0, 1, bytes, fp); fclose(fp); return r; } void amf0_test2(void) { int r; uint8_t* end; static uint8_t amf0[2 * 1024]; struct rtmp_result_t result; struct amf_object_item_t info[3]; struct amf_object_item_t items[2]; AMF_OBJECT_ITEM_VALUE(info[0], AMF_STRING, "code", result.code, sizeof(result.code)); AMF_OBJECT_ITEM_VALUE(info[1], AMF_STRING, "level", result.level, sizeof(result.level)); AMF_OBJECT_ITEM_VALUE(info[2], AMF_STRING, "description", result.description, sizeof(result.description)); AMF_OBJECT_ITEM_VALUE(items[0], AMF_OBJECT, "command", NULL, 0); // Command object AMF_OBJECT_ITEM_VALUE(items[1], AMF_OBJECT, "information", info, sizeof(info) / sizeof(info[0])); // Information object r = amf0_get("../libflv/test/rtmp.onStatus.amf0", amf0, sizeof(amf0)); end = amf0 + r; assert(end == amf_read_items(amf0, end, items, sizeof(items) / sizeof(items[0]))); assert(0 == strcmp(result.code, "NetStream.Play.Reset")); assert(0 == strcmp(result.level, "status")); assert(0 == strcmp(result.description, "Playing and resetting 92f509c10c112171f935?token=3129bc162ee05a1353f7&secret=15b1bca0997ab790656c903493cada3b&ckey=17e23e4fd0bb5b54a2434fd1514343ee")); }