正在显示
7 个修改的文件
包含
268 行增加
和
36 行删除
@@ -78,18 +78,6 @@ int main(int argc, char** argv) | @@ -78,18 +78,6 @@ int main(int argc, char** argv) | ||
78 | return ret; | 78 | return ret; |
79 | } | 79 | } |
80 | 80 | ||
81 | -int parse_audio_data(char* data, int size) | ||
82 | -{ | ||
83 | - int ret = 0; | ||
84 | - return ret; | ||
85 | -} | ||
86 | - | ||
87 | -int parse_video_data(char* data, int size) | ||
88 | -{ | ||
89 | - int ret = 0; | ||
90 | - return ret; | ||
91 | -} | ||
92 | - | ||
93 | void digit_to_char(char* src, int ssize, char* dst, int dsize) | 81 | void digit_to_char(char* src, int ssize, char* dst, int dsize) |
94 | { | 82 | { |
95 | int i, j; | 83 | int i, j; |
@@ -129,29 +117,92 @@ int parse_bytes(char* data, int size, char* hbuf, int hsize, char* tbuf, int tsi | @@ -129,29 +117,92 @@ int parse_bytes(char* data, int size, char* hbuf, int hsize, char* tbuf, int tsi | ||
129 | { | 117 | { |
130 | memset(hbuf, 0, hsize); | 118 | memset(hbuf, 0, hsize); |
131 | memset(tbuf, 0, tsize); | 119 | memset(tbuf, 0, tsize); |
132 | - if (size > print_size * 2) { | 120 | + |
121 | + if (size > 0) { | ||
133 | digit_to_char(data, size, hbuf, hsize - 1); | 122 | digit_to_char(data, size, hbuf, hsize - 1); |
123 | + } | ||
124 | + | ||
125 | + if (size > print_size * 2) { | ||
134 | digit_to_char(data + size - print_size, size, tbuf, tsize - 1); | 126 | digit_to_char(data + size - print_size, size, tbuf, tsize - 1); |
135 | } | 127 | } |
136 | } | 128 | } |
137 | 129 | ||
138 | -int parse_script_data(char* data, int size) | 130 | +#define FLV_HEADER_SIZE 11 |
131 | +int parse_script_data(u_int32_t timestamp, char* data, int size, int64_t offset) | ||
139 | { | 132 | { |
140 | int ret = 0; | 133 | int ret = 0; |
141 | 134 | ||
142 | char hbuf[48]; | 135 | char hbuf[48]; |
143 | char tbuf[48]; | 136 | char tbuf[48]; |
137 | + | ||
138 | + int amf0_size = 0; | ||
139 | + int nparsed = 0; | ||
140 | + | ||
141 | + srs_amf0_t amf0_name; | ||
142 | + char* amf0_name_str = NULL; | ||
143 | + | ||
144 | + srs_amf0_t amf0_data; | ||
145 | + char* amf0_data_str = NULL; | ||
146 | + | ||
147 | + // bytes | ||
144 | parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16); | 148 | parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16); |
145 | 149 | ||
146 | - srs_amf0_t amf0 = srs_amf0_parse(data, size); | ||
147 | - if (amf0 == NULL) { | ||
148 | - trace("invalid amf0 data."); | 150 | + // amf0 |
151 | + amf0_name = srs_amf0_parse(data, size, &nparsed); | ||
152 | + if (amf0_name == NULL || nparsed >= size) { | ||
153 | + trace("invalid amf0 name data."); | ||
149 | return -1; | 154 | return -1; |
150 | } | 155 | } |
156 | + amf0_data = srs_amf0_parse(data + nparsed, size - nparsed, &nparsed); | ||
157 | + | ||
158 | + trace("packet type=%s, time=%d, size=%d, data-size=%d, \n" | ||
159 | + "offset=%d\n[+00, +15] %s\n[-15, EOF] %s\n%s%s", | ||
160 | + srs_type2string(SRS_RTMP_TYPE_SCRIPT), timestamp, size + FLV_HEADER_SIZE, size, | ||
161 | + (int)offset, hbuf, tbuf, | ||
162 | + srs_amf0_human_print(amf0_name, &amf0_name_str, &amf0_size), | ||
163 | + srs_amf0_human_print(amf0_data, &amf0_data_str, &amf0_size)); | ||
164 | + | ||
165 | + srs_amf0_free(amf0_name); | ||
166 | + srs_amf0_free_bytes(amf0_name_str); | ||
167 | + | ||
168 | + srs_amf0_free(amf0_data); | ||
169 | + srs_amf0_free_bytes(amf0_data_str); | ||
170 | + | ||
171 | + return ret; | ||
172 | +} | ||
173 | + | ||
174 | +int parse_audio_data(u_int32_t timestamp, char* data, int size, int64_t offset) | ||
175 | +{ | ||
176 | + int ret = 0; | ||
177 | + | ||
178 | + char hbuf[48]; | ||
179 | + char tbuf[48]; | ||
180 | + | ||
181 | + // bytes | ||
182 | + parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16); | ||
151 | 183 | ||
152 | - trace("details:\n" | ||
153 | - "[+00, +15] %s\n[-15, EOF] %s", | ||
154 | - hbuf, tbuf); | 184 | + trace("packet type=%s, time=%d, size=%d, data-size=%d, \n" |
185 | + "offset=%d\n[+00, +15] %s\n[-15, EOF] %s\n", | ||
186 | + srs_type2string(SRS_RTMP_TYPE_AUDIO), timestamp, size + FLV_HEADER_SIZE, size, | ||
187 | + (int)offset, hbuf, tbuf); | ||
188 | + | ||
189 | + return ret; | ||
190 | +} | ||
191 | + | ||
192 | +int parse_video_data(u_int32_t timestamp, char* data, int size, int64_t offset) | ||
193 | +{ | ||
194 | + int ret = 0; | ||
195 | + | ||
196 | + char hbuf[48]; | ||
197 | + char tbuf[48]; | ||
198 | + | ||
199 | + // bytes | ||
200 | + parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16); | ||
201 | + | ||
202 | + trace("packet type=%s, time=%d, size=%d, data-size=%d, \n" | ||
203 | + "offset=%d\n[+00, +15] %s\n[-15, EOF] %s\n", | ||
204 | + srs_type2string(SRS_RTMP_TYPE_VIDEO), timestamp, size + FLV_HEADER_SIZE, size, | ||
205 | + (int)offset, hbuf, tbuf); | ||
155 | 206 | ||
156 | return ret; | 207 | return ret; |
157 | } | 208 | } |
@@ -168,9 +219,12 @@ int parse_flv(int flv_fd) | @@ -168,9 +219,12 @@ int parse_flv(int flv_fd) | ||
168 | int type, size; | 219 | int type, size; |
169 | u_int32_t timestamp = 0; | 220 | u_int32_t timestamp = 0; |
170 | char* data = NULL; | 221 | char* data = NULL; |
222 | + int64_t offset = 0; | ||
171 | 223 | ||
172 | trace("start parse flv"); | 224 | trace("start parse flv"); |
173 | for (;;) { | 225 | for (;;) { |
226 | + offset = lseek(flv_fd, 0, SEEK_CUR); | ||
227 | + | ||
174 | if ((ret = flv_read_packet(flv_fd, &type, ×tamp, &data, &size)) != 0) { | 228 | if ((ret = flv_read_packet(flv_fd, &type, ×tamp, &data, &size)) != 0) { |
175 | if (ret == ERROR_FLV_CODEC_EOF) { | 229 | if (ret == ERROR_FLV_CODEC_EOF) { |
176 | trace("parse completed."); | 230 | trace("parse completed."); |
@@ -179,19 +233,18 @@ int parse_flv(int flv_fd) | @@ -179,19 +233,18 @@ int parse_flv(int flv_fd) | ||
179 | trace("irtmp get packet failed. ret=%d", ret); | 233 | trace("irtmp get packet failed. ret=%d", ret); |
180 | return ret; | 234 | return ret; |
181 | } | 235 | } |
182 | - trace("flv got packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, size); | ||
183 | 236 | ||
184 | // data tag | 237 | // data tag |
185 | if (type == SRS_RTMP_TYPE_AUDIO) { | 238 | if (type == SRS_RTMP_TYPE_AUDIO) { |
186 | - if ((ret = parse_audio_data(data, size)) != 0) { | 239 | + if ((ret = parse_audio_data(timestamp, data, size, offset)) != 0) { |
187 | return ret; | 240 | return ret; |
188 | } | 241 | } |
189 | } else if (type == SRS_RTMP_TYPE_VIDEO) { | 242 | } else if (type == SRS_RTMP_TYPE_VIDEO) { |
190 | - if ((ret = parse_video_data(data, size)) != 0) { | 243 | + if ((ret = parse_video_data(timestamp, data, size, offset)) != 0) { |
191 | return ret; | 244 | return ret; |
192 | } | 245 | } |
193 | } else { | 246 | } else { |
194 | - if ((ret = parse_script_data(data, size)) != 0) { | 247 | + if ((ret = parse_script_data(timestamp, data, size, offset)) != 0) { |
195 | return ret; | 248 | return ret; |
196 | } | 249 | } |
197 | } | 250 | } |
@@ -80,6 +80,7 @@ int SrsConnection::cycle() | @@ -80,6 +80,7 @@ int SrsConnection::cycle() | ||
80 | 80 | ||
81 | void SrsConnection::on_thread_stop() | 81 | void SrsConnection::on_thread_stop() |
82 | { | 82 | { |
83 | + // TODO: FIXME: never remove itself, use isolate thread to do cleanup. | ||
83 | server->remove(this); | 84 | server->remove(this); |
84 | } | 85 | } |
85 | 86 |
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
31 | // current release version | 31 | // current release version |
32 | #define VERSION_MAJOR "0" | 32 | #define VERSION_MAJOR "0" |
33 | #define VERSION_MINOR "9" | 33 | #define VERSION_MINOR "9" |
34 | -#define VERSION_REVISION "109" | 34 | +#define VERSION_REVISION "110" |
35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION | 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION |
36 | // server info. | 36 | // server info. |
37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
@@ -26,6 +26,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -26,6 +26,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
26 | #include <stdlib.h> | 26 | #include <stdlib.h> |
27 | 27 | ||
28 | #include <string> | 28 | #include <string> |
29 | +#include <sstream> | ||
29 | using namespace std; | 30 | using namespace std; |
30 | 31 | ||
31 | #include <srs_kernel_error.hpp> | 32 | #include <srs_kernel_error.hpp> |
@@ -408,7 +409,7 @@ int64_t srs_get_time_ms() | @@ -408,7 +409,7 @@ int64_t srs_get_time_ms() | ||
408 | return srs_get_system_time_ms(); | 409 | return srs_get_system_time_ms(); |
409 | } | 410 | } |
410 | 411 | ||
411 | -srs_amf0_t srs_amf0_parse(char* data, int size) | 412 | +srs_amf0_t srs_amf0_parse(char* data, int size, int* nparsed) |
412 | { | 413 | { |
413 | int ret = ERROR_SUCCESS; | 414 | int ret = ERROR_SUCCESS; |
414 | 415 | ||
@@ -430,11 +431,23 @@ srs_amf0_t srs_amf0_parse(char* data, int size) | @@ -430,11 +431,23 @@ srs_amf0_t srs_amf0_parse(char* data, int size) | ||
430 | return amf0; | 431 | return amf0; |
431 | } | 432 | } |
432 | 433 | ||
434 | + *nparsed = stream.pos(); | ||
433 | amf0 = (srs_amf0_t)any; | 435 | amf0 = (srs_amf0_t)any; |
434 | 436 | ||
435 | return amf0; | 437 | return amf0; |
436 | } | 438 | } |
437 | 439 | ||
440 | +void srs_amf0_free(srs_amf0_t amf0) | ||
441 | +{ | ||
442 | + SrsAmf0Any* any = (SrsAmf0Any*)amf0; | ||
443 | + srs_freep(any); | ||
444 | +} | ||
445 | + | ||
446 | +void srs_amf0_free_bytes(char* data) | ||
447 | +{ | ||
448 | + srs_freep(data); | ||
449 | +} | ||
450 | + | ||
438 | amf0_bool srs_amf0_is_string(srs_amf0_t amf0) | 451 | amf0_bool srs_amf0_is_string(srs_amf0_t amf0) |
439 | { | 452 | { |
440 | SrsAmf0Any* any = (SrsAmf0Any*)amf0; | 453 | SrsAmf0Any* any = (SrsAmf0Any*)amf0; |
@@ -471,6 +484,130 @@ amf0_bool srs_amf0_is_ecma_array(srs_amf0_t amf0) | @@ -471,6 +484,130 @@ amf0_bool srs_amf0_is_ecma_array(srs_amf0_t amf0) | ||
471 | return any->is_ecma_array(); | 484 | return any->is_ecma_array(); |
472 | } | 485 | } |
473 | 486 | ||
487 | +const char* srs_amf0_to_string(srs_amf0_t amf0) | ||
488 | +{ | ||
489 | + SrsAmf0Any* any = (SrsAmf0Any*)amf0; | ||
490 | + return any->to_str_raw(); | ||
491 | +} | ||
492 | + | ||
493 | +amf0_bool srs_amf0_to_boolean(srs_amf0_t amf0) | ||
494 | +{ | ||
495 | + SrsAmf0Any* any = (SrsAmf0Any*)amf0; | ||
496 | + return any->to_boolean(); | ||
497 | +} | ||
498 | + | ||
499 | +amf0_number srs_amf0_to_number(srs_amf0_t amf0) | ||
500 | +{ | ||
501 | + SrsAmf0Any* any = (SrsAmf0Any*)amf0; | ||
502 | + return any->to_number(); | ||
503 | +} | ||
504 | + | ||
505 | +int srs_amf0_object_property_count(srs_amf0_t amf0) | ||
506 | +{ | ||
507 | + SrsAmf0Object* obj = (SrsAmf0Object*)amf0; | ||
508 | + return obj->count(); | ||
509 | +} | ||
510 | + | ||
511 | +const char* srs_amf0_object_property_name_at(srs_amf0_t amf0, int index) | ||
512 | +{ | ||
513 | + SrsAmf0Object* obj = (SrsAmf0Object*)amf0; | ||
514 | + return obj->key_raw_at(index); | ||
515 | +} | ||
516 | + | ||
517 | +srs_amf0_t srs_amf0_object_property_value_at(srs_amf0_t amf0, int index) | ||
518 | +{ | ||
519 | + SrsAmf0Object* obj = (SrsAmf0Object*)amf0; | ||
520 | + return (srs_amf0_t)obj->value_at(index); | ||
521 | +} | ||
522 | + | ||
523 | +int srs_amf0_array_property_count(srs_amf0_t amf0) | ||
524 | +{ | ||
525 | + SrsAmf0EcmaArray * obj = (SrsAmf0EcmaArray*)amf0; | ||
526 | + return obj->count(); | ||
527 | +} | ||
528 | + | ||
529 | +const char* srs_amf0_array_property_name_at(srs_amf0_t amf0, int index) | ||
530 | +{ | ||
531 | + SrsAmf0EcmaArray* obj = (SrsAmf0EcmaArray*)amf0; | ||
532 | + return obj->key_raw_at(index); | ||
533 | +} | ||
534 | + | ||
535 | +srs_amf0_t srs_amf0_array_property_value_at(srs_amf0_t amf0, int index) | ||
536 | +{ | ||
537 | + SrsAmf0EcmaArray* obj = (SrsAmf0EcmaArray*)amf0; | ||
538 | + return (srs_amf0_t)obj->value_at(index); | ||
539 | +} | ||
540 | + | ||
541 | +void __srs_amf0_do_print(SrsAmf0Any* any, stringstream& ss, int& level) | ||
542 | +{ | ||
543 | + if (true) { | ||
544 | + for (int i = 0; i < level; i++) { | ||
545 | + ss << " "; | ||
546 | + } | ||
547 | + } | ||
548 | + | ||
549 | + if (any->is_boolean()) { | ||
550 | + ss << "Boolean " << (any->to_boolean()? "true":"false") << endl; | ||
551 | + } else if (any->is_number()) { | ||
552 | + ss << "Number " << std::fixed << any->to_number() << endl; | ||
553 | + } else if (any->is_string()) { | ||
554 | + ss << "String " << any->to_str() << endl; | ||
555 | + } else if (any->is_null()) { | ||
556 | + ss << "Null" << endl; | ||
557 | + } else if (any->is_ecma_array()) { | ||
558 | + SrsAmf0EcmaArray* obj = any->to_ecma_array(); | ||
559 | + ss << "EcmaArray " << "(" << obj->count() << " items)" << endl; | ||
560 | + for (int i = 0; i < obj->count(); i++) { | ||
561 | + ss << " Property '" << obj->key_at(i) << "' "; | ||
562 | + if (obj->value_at(i)->is_object() || obj->value_at(i)->is_ecma_array()) { | ||
563 | + int next_level = level + 1; | ||
564 | + __srs_amf0_do_print(obj->value_at(i), ss, next_level); | ||
565 | + } else { | ||
566 | + int next_level = 0; | ||
567 | + __srs_amf0_do_print(obj->value_at(i), ss, next_level); | ||
568 | + } | ||
569 | + } | ||
570 | + } else if (any->is_object()) { | ||
571 | + SrsAmf0Object* obj = any->to_object(); | ||
572 | + ss << "Object " << "(" << obj->count() << " items)" << endl; | ||
573 | + for (int i = 0; i < obj->count(); i++) { | ||
574 | + ss << " Property '" << obj->key_at(i) << "' "; | ||
575 | + if (obj->value_at(i)->is_object() || obj->value_at(i)->is_ecma_array()) { | ||
576 | + int next_level = level + 1; | ||
577 | + __srs_amf0_do_print(obj->value_at(i), ss, next_level); | ||
578 | + } else { | ||
579 | + int next_level = 0; | ||
580 | + __srs_amf0_do_print(obj->value_at(i), ss, next_level); | ||
581 | + } | ||
582 | + } | ||
583 | + } else { | ||
584 | + ss << "Unknown" << endl; | ||
585 | + } | ||
586 | +} | ||
587 | + | ||
588 | +char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize) | ||
589 | +{ | ||
590 | + stringstream ss; | ||
591 | + | ||
592 | + ss.precision(1); | ||
593 | + | ||
594 | + SrsAmf0Any* any = (SrsAmf0Any*)amf0; | ||
595 | + | ||
596 | + int level = 0; | ||
597 | + __srs_amf0_do_print(any, ss, level); | ||
598 | + | ||
599 | + string str = ss.str(); | ||
600 | + if (str.empty()) { | ||
601 | + return NULL; | ||
602 | + } | ||
603 | + | ||
604 | + *pdata = new char[str.length()]; | ||
605 | + *psize = str.length(); | ||
606 | + memcpy(*pdata, str.data(), str.length()); | ||
607 | + | ||
608 | + return *pdata; | ||
609 | +} | ||
610 | + | ||
474 | #ifdef __cplusplus | 611 | #ifdef __cplusplus |
475 | } | 612 | } |
476 | #endif | 613 | #endif |
@@ -165,18 +165,31 @@ int64_t srs_get_time_ms(); | @@ -165,18 +165,31 @@ int64_t srs_get_time_ms(); | ||
165 | /* the output handler. */ | 165 | /* the output handler. */ |
166 | typedef void* srs_amf0_t; | 166 | typedef void* srs_amf0_t; |
167 | typedef int amf0_bool; | 167 | typedef int amf0_bool; |
168 | -extern srs_amf0_t srs_amf0_parse(char* data, int size); | 168 | +typedef double amf0_number; |
169 | +srs_amf0_t srs_amf0_parse(char* data, int size, int* nparsed); | ||
170 | +void srs_amf0_free(srs_amf0_t amf0); | ||
171 | +void srs_amf0_free_bytes(char* data); | ||
169 | /* type detecter */ | 172 | /* type detecter */ |
170 | -extern amf0_bool srs_amf0_is_string(srs_amf0_t amf0); | ||
171 | -extern amf0_bool srs_amf0_is_boolean(srs_amf0_t amf0); | ||
172 | -extern amf0_bool srs_amf0_is_number(srs_amf0_t amf0); | ||
173 | -extern amf0_bool srs_amf0_is_null(srs_amf0_t amf0); | ||
174 | -extern amf0_bool srs_amf0_is_object(srs_amf0_t amf0); | ||
175 | -extern amf0_bool srs_amf0_is_ecma_array(srs_amf0_t amf0); | 173 | +amf0_bool srs_amf0_is_string(srs_amf0_t amf0); |
174 | +amf0_bool srs_amf0_is_boolean(srs_amf0_t amf0); | ||
175 | +amf0_bool srs_amf0_is_number(srs_amf0_t amf0); | ||
176 | +amf0_bool srs_amf0_is_null(srs_amf0_t amf0); | ||
177 | +amf0_bool srs_amf0_is_object(srs_amf0_t amf0); | ||
178 | +amf0_bool srs_amf0_is_ecma_array(srs_amf0_t amf0); | ||
176 | /* value converter */ | 179 | /* value converter */ |
177 | -/*const char* srs_amf0_to_string(srs_amf0_t amf0); | ||
178 | -bool srs_amf0_to_boolean(srs_amf0_t amf0); | ||
179 | -double srs_amf0_to_number(srs_amf0_t amf0);*/ | 180 | +const char* srs_amf0_to_string(srs_amf0_t amf0); |
181 | +amf0_bool srs_amf0_to_boolean(srs_amf0_t amf0); | ||
182 | +amf0_number srs_amf0_to_number(srs_amf0_t amf0); | ||
183 | +/* object value converter */ | ||
184 | +int srs_amf0_object_property_count(srs_amf0_t amf0); | ||
185 | +const char* srs_amf0_object_property_name_at(srs_amf0_t amf0, int index); | ||
186 | +srs_amf0_t srs_amf0_object_property_value_at(srs_amf0_t amf0, int index); | ||
187 | +/* array value converter */ | ||
188 | +int srs_amf0_array_property_count(srs_amf0_t amf0); | ||
189 | +const char* srs_amf0_array_property_name_at(srs_amf0_t amf0, int index); | ||
190 | +srs_amf0_t srs_amf0_array_property_value_at(srs_amf0_t amf0, int index); | ||
191 | +/* human readable print */ | ||
192 | +char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize); | ||
180 | 193 | ||
181 | #ifdef __cplusplus | 194 | #ifdef __cplusplus |
182 | } | 195 | } |
@@ -166,6 +166,7 @@ public: | @@ -166,6 +166,7 @@ public: | ||
166 | virtual int count(); | 166 | virtual int count(); |
167 | virtual void clear(); | 167 | virtual void clear(); |
168 | virtual std::string key_at(int index); | 168 | virtual std::string key_at(int index); |
169 | + virtual const char* key_raw_at(int index); | ||
169 | virtual SrsAmf0Any* value_at(int index); | 170 | virtual SrsAmf0Any* value_at(int index); |
170 | virtual void set(std::string key, SrsAmf0Any* value); | 171 | virtual void set(std::string key, SrsAmf0Any* value); |
171 | 172 | ||
@@ -257,6 +258,13 @@ string SrsAmf0Any::to_str() | @@ -257,6 +258,13 @@ string SrsAmf0Any::to_str() | ||
257 | return p->value; | 258 | return p->value; |
258 | } | 259 | } |
259 | 260 | ||
261 | +const char* SrsAmf0Any::to_str_raw() | ||
262 | +{ | ||
263 | + __SrsAmf0String* p = dynamic_cast<__SrsAmf0String*>(this); | ||
264 | + srs_assert(p != NULL); | ||
265 | + return p->value.data(); | ||
266 | +} | ||
267 | + | ||
260 | bool SrsAmf0Any::to_boolean() | 268 | bool SrsAmf0Any::to_boolean() |
261 | { | 269 | { |
262 | __SrsAmf0Boolean* p = dynamic_cast<__SrsAmf0Boolean*>(this); | 270 | __SrsAmf0Boolean* p = dynamic_cast<__SrsAmf0Boolean*>(this); |
@@ -425,6 +433,13 @@ string __SrsUnSortedHashtable::key_at(int index) | @@ -425,6 +433,13 @@ string __SrsUnSortedHashtable::key_at(int index) | ||
425 | return elem.first; | 433 | return elem.first; |
426 | } | 434 | } |
427 | 435 | ||
436 | +const char* __SrsUnSortedHashtable::key_raw_at(int index) | ||
437 | +{ | ||
438 | + srs_assert(index < count()); | ||
439 | + SrsAmf0ObjectPropertyType& elem = properties[index]; | ||
440 | + return elem.first.data(); | ||
441 | +} | ||
442 | + | ||
428 | SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index) | 443 | SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index) |
429 | { | 444 | { |
430 | srs_assert(index < count()); | 445 | srs_assert(index < count()); |
@@ -719,6 +734,11 @@ string SrsAmf0Object::key_at(int index) | @@ -719,6 +734,11 @@ string SrsAmf0Object::key_at(int index) | ||
719 | return properties->key_at(index); | 734 | return properties->key_at(index); |
720 | } | 735 | } |
721 | 736 | ||
737 | +const char* SrsAmf0Object::key_raw_at(int index) | ||
738 | +{ | ||
739 | + return properties->key_raw_at(index); | ||
740 | +} | ||
741 | + | ||
722 | SrsAmf0Any* SrsAmf0Object::value_at(int index) | 742 | SrsAmf0Any* SrsAmf0Object::value_at(int index) |
723 | { | 743 | { |
724 | return properties->value_at(index); | 744 | return properties->value_at(index); |
@@ -906,6 +926,11 @@ string SrsAmf0EcmaArray::key_at(int index) | @@ -906,6 +926,11 @@ string SrsAmf0EcmaArray::key_at(int index) | ||
906 | return properties->key_at(index); | 926 | return properties->key_at(index); |
907 | } | 927 | } |
908 | 928 | ||
929 | +const char* SrsAmf0EcmaArray::key_raw_at(int index) | ||
930 | +{ | ||
931 | + return properties->key_raw_at(index); | ||
932 | +} | ||
933 | + | ||
909 | SrsAmf0Any* SrsAmf0EcmaArray::value_at(int index) | 934 | SrsAmf0Any* SrsAmf0EcmaArray::value_at(int index) |
910 | { | 935 | { |
911 | return properties->value_at(index); | 936 | return properties->value_at(index); |
@@ -102,6 +102,7 @@ public: | @@ -102,6 +102,7 @@ public: | ||
102 | * user must ensure the type is a string, or assert failed. | 102 | * user must ensure the type is a string, or assert failed. |
103 | */ | 103 | */ |
104 | virtual std::string to_str(); | 104 | virtual std::string to_str(); |
105 | + virtual const char* to_str_raw(); | ||
105 | /** | 106 | /** |
106 | * get the boolean of any when is_boolean() indicates true. | 107 | * get the boolean of any when is_boolean() indicates true. |
107 | * user must ensure the type is a boolean, or assert failed. | 108 | * user must ensure the type is a boolean, or assert failed. |
@@ -172,6 +173,7 @@ public: | @@ -172,6 +173,7 @@ public: | ||
172 | virtual int count(); | 173 | virtual int count(); |
173 | // @remark: max index is count(). | 174 | // @remark: max index is count(). |
174 | virtual std::string key_at(int index); | 175 | virtual std::string key_at(int index); |
176 | + virtual const char* key_raw_at(int index); | ||
175 | // @remark: max index is count(). | 177 | // @remark: max index is count(). |
176 | virtual SrsAmf0Any* value_at(int index); | 178 | virtual SrsAmf0Any* value_at(int index); |
177 | 179 | ||
@@ -212,6 +214,7 @@ public: | @@ -212,6 +214,7 @@ public: | ||
212 | virtual int count(); | 214 | virtual int count(); |
213 | // @remark: max index is count(). | 215 | // @remark: max index is count(). |
214 | virtual std::string key_at(int index); | 216 | virtual std::string key_at(int index); |
217 | + virtual const char* key_raw_at(int index); | ||
215 | // @remark: max index is count(). | 218 | // @remark: max index is count(). |
216 | virtual SrsAmf0Any* value_at(int index); | 219 | virtual SrsAmf0Any* value_at(int index); |
217 | 220 |
-
请 注册 或 登录 后发表评论