Mercurial > libavformat.hg
comparison rtmpproto.c @ 5417:9d7de5529047 libavformat
cosmetics: reindent after last commit
author | kostya |
---|---|
date | Fri, 04 Dec 2009 16:52:42 +0000 |
parents | e01b6917b3cf |
children | 006c95a7a3d2 |
comparison
equal
deleted
inserted
replaced
5416:e01b6917b3cf | 5417:9d7de5529047 |
---|---|
113 ff_amf_write_object_start(&p); | 113 ff_amf_write_object_start(&p); |
114 ff_amf_write_field_name(&p, "app"); | 114 ff_amf_write_field_name(&p, "app"); |
115 ff_amf_write_string(&p, rt->app); | 115 ff_amf_write_string(&p, rt->app); |
116 | 116 |
117 if (rt->is_input) { | 117 if (rt->is_input) { |
118 snprintf(ver, sizeof(ver), "%s %d,%d,%d,%d", RTMP_CLIENT_PLATFORM, RTMP_CLIENT_VER1, | 118 snprintf(ver, sizeof(ver), "%s %d,%d,%d,%d", RTMP_CLIENT_PLATFORM, RTMP_CLIENT_VER1, |
119 RTMP_CLIENT_VER2, RTMP_CLIENT_VER3, RTMP_CLIENT_VER4); | 119 RTMP_CLIENT_VER2, RTMP_CLIENT_VER3, RTMP_CLIENT_VER4); |
120 } else { | 120 } else { |
121 snprintf(ver, sizeof(ver), "FMLE/3.0 (compatible; %s)", LIBAVFORMAT_IDENT); | 121 snprintf(ver, sizeof(ver), "FMLE/3.0 (compatible; %s)", LIBAVFORMAT_IDENT); |
122 ff_amf_write_field_name(&p, "type"); | 122 ff_amf_write_field_name(&p, "type"); |
123 ff_amf_write_string(&p, "nonprivate"); | 123 ff_amf_write_string(&p, "nonprivate"); |
124 } | 124 } |
125 ff_amf_write_field_name(&p, "flashVer"); | 125 ff_amf_write_field_name(&p, "flashVer"); |
126 ff_amf_write_string(&p, ver); | 126 ff_amf_write_string(&p, ver); |
127 ff_amf_write_field_name(&p, "tcUrl"); | 127 ff_amf_write_field_name(&p, "tcUrl"); |
128 ff_amf_write_string(&p, tcurl); | 128 ff_amf_write_string(&p, tcurl); |
129 if (rt->is_input) { | 129 if (rt->is_input) { |
130 ff_amf_write_field_name(&p, "fpad"); | 130 ff_amf_write_field_name(&p, "fpad"); |
131 ff_amf_write_bool(&p, 0); | 131 ff_amf_write_bool(&p, 0); |
132 ff_amf_write_field_name(&p, "capabilities"); | 132 ff_amf_write_field_name(&p, "capabilities"); |
133 ff_amf_write_number(&p, 15.0); | 133 ff_amf_write_number(&p, 15.0); |
134 ff_amf_write_field_name(&p, "audioCodecs"); | 134 ff_amf_write_field_name(&p, "audioCodecs"); |
135 ff_amf_write_number(&p, 1639.0); | 135 ff_amf_write_number(&p, 1639.0); |
136 ff_amf_write_field_name(&p, "videoCodecs"); | 136 ff_amf_write_field_name(&p, "videoCodecs"); |
137 ff_amf_write_number(&p, 252.0); | 137 ff_amf_write_number(&p, 252.0); |
138 ff_amf_write_field_name(&p, "videoFunction"); | 138 ff_amf_write_field_name(&p, "videoFunction"); |
139 ff_amf_write_number(&p, 1.0); | 139 ff_amf_write_number(&p, 1.0); |
140 } | 140 } |
141 ff_amf_write_object_end(&p); | 141 ff_amf_write_object_end(&p); |
142 | 142 |
143 pkt.data_size = p - pkt.data; | 143 pkt.data_size = p - pkt.data; |
144 | 144 |
476 | 476 |
477 av_log(LOG_CONTEXT, AV_LOG_DEBUG, "Server version %d.%d.%d.%d\n", | 477 av_log(LOG_CONTEXT, AV_LOG_DEBUG, "Server version %d.%d.%d.%d\n", |
478 serverdata[5], serverdata[6], serverdata[7], serverdata[8]); | 478 serverdata[5], serverdata[6], serverdata[7], serverdata[8]); |
479 | 479 |
480 if (rt->is_input) { | 480 if (rt->is_input) { |
481 server_pos = rtmp_validate_digest(serverdata + 1, 772); | 481 server_pos = rtmp_validate_digest(serverdata + 1, 772); |
482 if (!server_pos) { | |
483 server_pos = rtmp_validate_digest(serverdata + 1, 8); | |
484 if (!server_pos) { | 482 if (!server_pos) { |
485 av_log(LOG_CONTEXT, AV_LOG_ERROR, "Server response validating failed\n"); | 483 server_pos = rtmp_validate_digest(serverdata + 1, 8); |
484 if (!server_pos) { | |
485 av_log(LOG_CONTEXT, AV_LOG_ERROR, "Server response validating failed\n"); | |
486 return -1; | |
487 } | |
488 } | |
489 | |
490 rtmp_calc_digest(tosend + 1 + client_pos, 32, 0, | |
491 rtmp_server_key, sizeof(rtmp_server_key), | |
492 digest); | |
493 rtmp_calc_digest(clientdata, RTMP_HANDSHAKE_PACKET_SIZE-32, 0, | |
494 digest, 32, | |
495 digest); | |
496 if (memcmp(digest, clientdata + RTMP_HANDSHAKE_PACKET_SIZE - 32, 32)) { | |
497 av_log(LOG_CONTEXT, AV_LOG_ERROR, "Signature mismatch\n"); | |
486 return -1; | 498 return -1; |
487 } | 499 } |
488 } | 500 |
489 | 501 for (i = 0; i < RTMP_HANDSHAKE_PACKET_SIZE; i++) |
490 rtmp_calc_digest(tosend + 1 + client_pos, 32, 0, | 502 tosend[i] = av_lfg_get(&rnd) >> 24; |
491 rtmp_server_key, sizeof(rtmp_server_key), | 503 rtmp_calc_digest(serverdata + 1 + server_pos, 32, 0, |
492 digest); | 504 rtmp_player_key, sizeof(rtmp_player_key), |
493 rtmp_calc_digest(clientdata, RTMP_HANDSHAKE_PACKET_SIZE-32, 0, | 505 digest); |
494 digest, 32, | 506 rtmp_calc_digest(tosend, RTMP_HANDSHAKE_PACKET_SIZE - 32, 0, |
495 digest); | 507 digest, 32, |
496 if (memcmp(digest, clientdata + RTMP_HANDSHAKE_PACKET_SIZE - 32, 32)) { | 508 tosend + RTMP_HANDSHAKE_PACKET_SIZE - 32); |
497 av_log(LOG_CONTEXT, AV_LOG_ERROR, "Signature mismatch\n"); | 509 |
498 return -1; | 510 // write reply back to the server |
499 } | 511 url_write(rt->stream, tosend, RTMP_HANDSHAKE_PACKET_SIZE); |
500 | |
501 for (i = 0; i < RTMP_HANDSHAKE_PACKET_SIZE; i++) | |
502 tosend[i] = av_lfg_get(&rnd) >> 24; | |
503 rtmp_calc_digest(serverdata + 1 + server_pos, 32, 0, | |
504 rtmp_player_key, sizeof(rtmp_player_key), | |
505 digest); | |
506 rtmp_calc_digest(tosend, RTMP_HANDSHAKE_PACKET_SIZE - 32, 0, | |
507 digest, 32, | |
508 tosend + RTMP_HANDSHAKE_PACKET_SIZE - 32); | |
509 | |
510 // write reply back to the server | |
511 url_write(rt->stream, tosend, RTMP_HANDSHAKE_PACKET_SIZE); | |
512 } else { | 512 } else { |
513 url_write(rt->stream, serverdata+1, RTMP_HANDSHAKE_PACKET_SIZE); | 513 url_write(rt->stream, serverdata+1, RTMP_HANDSHAKE_PACKET_SIZE); |
514 } | 514 } |
515 | 515 |
516 return 0; | 516 return 0; |
589 av_log(LOG_CONTEXT, AV_LOG_WARNING, "Unexpected reply on connect()\n"); | 589 av_log(LOG_CONTEXT, AV_LOG_WARNING, "Unexpected reply on connect()\n"); |
590 } else { | 590 } else { |
591 rt->main_channel_id = (int) av_int2dbl(AV_RB64(pkt->data + 21)); | 591 rt->main_channel_id = (int) av_int2dbl(AV_RB64(pkt->data + 21)); |
592 } | 592 } |
593 if (rt->is_input) { | 593 if (rt->is_input) { |
594 gen_play(s, rt); | 594 gen_play(s, rt); |
595 } else { | 595 } else { |
596 gen_publish(s, rt); | 596 gen_publish(s, rt); |
597 } | 597 } |
598 rt->state = STATE_READY; | 598 rt->state = STATE_READY; |
599 break; | 599 break; |
749 if (url_open(&rt->stream, buf, URL_RDWR) < 0) { | 749 if (url_open(&rt->stream, buf, URL_RDWR) < 0) { |
750 av_log(LOG_CONTEXT, AV_LOG_ERROR, "Cannot open connection %s\n", buf); | 750 av_log(LOG_CONTEXT, AV_LOG_ERROR, "Cannot open connection %s\n", buf); |
751 goto fail; | 751 goto fail; |
752 } | 752 } |
753 | 753 |
754 rt->state = STATE_START; | 754 rt->state = STATE_START; |
755 if (rtmp_handshake(s, rt)) | 755 if (rtmp_handshake(s, rt)) |
756 return -1; | 756 return -1; |
757 | 757 |
758 rt->chunk_size = 128; | 758 rt->chunk_size = 128; |
759 rt->state = STATE_HANDSHAKED; | 759 rt->state = STATE_HANDSHAKED; |
760 //extract "app" part from path | 760 //extract "app" part from path |
761 if (!strncmp(path, "/ondemand/", 10)) { | 761 if (!strncmp(path, "/ondemand/", 10)) { |
762 fname = path + 10; | 762 fname = path + 10; |
763 memcpy(rt->app, "ondemand", 9); | 763 memcpy(rt->app, "ondemand", 9); |
764 } else { | |
765 char *p = strchr(path + 1, '/'); | |
766 if (!p) { | |
767 fname = path + 1; | |
768 rt->app[0] = '\0'; | |
764 } else { | 769 } else { |
765 char *p = strchr(path + 1, '/'); | 770 char *c = strchr(p + 1, ':'); |
766 if (!p) { | 771 fname = strchr(p + 1, '/'); |
767 fname = path + 1; | 772 if (!fname || c < fname) { |
768 rt->app[0] = '\0'; | 773 fname = p + 1; |
774 av_strlcpy(rt->app, path + 1, p - path); | |
769 } else { | 775 } else { |
770 char *c = strchr(p + 1, ':'); | 776 fname++; |
771 fname = strchr(p + 1, '/'); | 777 av_strlcpy(rt->app, path + 1, fname - path - 1); |
772 if (!fname || c < fname) { | |
773 fname = p + 1; | |
774 av_strlcpy(rt->app, path + 1, p - path); | |
775 } else { | |
776 fname++; | |
777 av_strlcpy(rt->app, path + 1, fname - path - 1); | |
778 } | |
779 } | 778 } |
780 } | 779 } |
781 if (!strchr(fname, ':') && | 780 } |
782 (!strcmp(fname + strlen(fname) - 4, ".f4v") || | 781 if (!strchr(fname, ':') && |
783 !strcmp(fname + strlen(fname) - 4, ".mp4"))) { | 782 (!strcmp(fname + strlen(fname) - 4, ".f4v") || |
784 memcpy(rt->playpath, "mp4:", 5); | 783 !strcmp(fname + strlen(fname) - 4, ".mp4"))) { |
785 } else { | 784 memcpy(rt->playpath, "mp4:", 5); |
786 rt->playpath[0] = 0; | 785 } else { |
787 } | 786 rt->playpath[0] = 0; |
788 strncat(rt->playpath, fname, sizeof(rt->playpath) - 5); | 787 } |
789 | 788 strncat(rt->playpath, fname, sizeof(rt->playpath) - 5); |
790 av_log(LOG_CONTEXT, AV_LOG_DEBUG, "Proto = %s, path = %s, app = %s, fname = %s\n", | 789 |
791 proto, path, rt->app, rt->playpath); | 790 av_log(LOG_CONTEXT, AV_LOG_DEBUG, "Proto = %s, path = %s, app = %s, fname = %s\n", |
792 gen_connect(s, rt, proto, hostname, port); | 791 proto, path, rt->app, rt->playpath); |
793 | 792 gen_connect(s, rt, proto, hostname, port); |
794 do { | 793 |
795 ret = get_packet(s, 1); | 794 do { |
796 } while (ret == EAGAIN); | 795 ret = get_packet(s, 1); |
797 if (ret < 0) | 796 } while (ret == EAGAIN); |
798 goto fail; | 797 if (ret < 0) |
798 goto fail; | |
799 | 799 |
800 if (rt->is_input) { | 800 if (rt->is_input) { |
801 // generate FLV header for demuxer | 801 // generate FLV header for demuxer |
802 rt->flv_size = 13; | 802 rt->flv_size = 13; |
803 rt->flv_data = av_realloc(rt->flv_data, rt->flv_size); | 803 rt->flv_data = av_realloc(rt->flv_data, rt->flv_size); |