Mercurial > libavformat.hg
comparison mmst.c @ 6344:eff600bc4261 libavformat
Move send_media_packet_request() and clear_stream_buffers() up.
Patch by Zhentan Feng <spyfeng gmail com>.
author | rbultje |
---|---|
date | Wed, 04 Aug 2010 22:32:43 +0000 |
parents | 1c7e9dfdefe3 |
children | 60df621e6237 |
comparison
equal
deleted
inserted
replaced
6343:a90f19fbad6f | 6344:eff600bc4261 |
---|---|
618 av_freep(&h->priv_data); | 618 av_freep(&h->priv_data); |
619 | 619 |
620 return 0; | 620 return 0; |
621 } | 621 } |
622 | 622 |
623 static int mms_open(URLContext *h, const char *uri, int flags) | |
624 { | |
625 MMSContext *mms; | |
626 int port, err; | |
627 char tcpname[256]; | |
628 | |
629 h->is_streamed = 1; | |
630 mms = h->priv_data = av_mallocz(sizeof(MMSContext)); | |
631 if (!h->priv_data) | |
632 return AVERROR(ENOMEM); | |
633 | |
634 // only for MMS over TCP, so set proto = NULL | |
635 av_url_split(NULL, 0, NULL, 0, | |
636 mms->host, sizeof(mms->host), &port, mms->path, | |
637 sizeof(mms->path), uri); | |
638 | |
639 if(port<0) | |
640 port = 1755; // defaut mms protocol port | |
641 | |
642 // establish tcp connection. | |
643 ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, mms->host, port, NULL); | |
644 err = url_open(&mms->mms_hd, tcpname, URL_RDWR); | |
645 if (err) | |
646 goto fail; | |
647 | |
648 mms->packet_id = 3; // default, initial value. | |
649 mms->header_packet_id = 2; // default, initial value. | |
650 err = mms_safe_send_recv(mms, send_startup_packet, SC_PKT_CLIENT_ACCEPTED); | |
651 if (err) | |
652 goto fail; | |
653 err = mms_safe_send_recv(mms, send_time_test_data, SC_PKT_TIMING_TEST_REPLY); | |
654 if (err) | |
655 goto fail; | |
656 err = mms_safe_send_recv(mms, send_protocol_select, SC_PKT_PROTOCOL_ACCEPTED); | |
657 if (err) | |
658 goto fail; | |
659 err = mms_safe_send_recv(mms, send_media_file_request, SC_PKT_MEDIA_FILE_DETAILS); | |
660 if (err) | |
661 goto fail; | |
662 err = mms_safe_send_recv(mms, send_media_header_request, SC_PKT_HEADER_REQUEST_ACCEPTED); | |
663 if (err) | |
664 goto fail; | |
665 err = mms_safe_send_recv(mms, NULL, SC_PKT_ASF_HEADER); | |
666 if (err) | |
667 goto fail; | |
668 if((mms->incoming_flags != 0X08) && (mms->incoming_flags != 0X0C)) | |
669 goto fail; | |
670 err = asf_header_parser(mms); | |
671 if (err) { | |
672 dprintf(NULL, "asf header parsed failed!\n"); | |
673 goto fail; | |
674 } | |
675 mms->header_parsed = 1; | |
676 | |
677 if (!mms->asf_packet_len || !mms->stream_num) | |
678 goto fail; | |
679 | |
680 dprintf(NULL, "Leaving open (success)\n"); | |
681 return 0; | |
682 fail: | |
683 mms_close(h); | |
684 dprintf(NULL, "Leaving open (failure: %d)\n", err); | |
685 return err; | |
686 } | |
687 | |
688 static int send_media_packet_request(MMSContext *mms) | 623 static int send_media_packet_request(MMSContext *mms) |
689 { | 624 { |
690 start_command_packet(mms, CS_PKT_START_FROM_PKT_ID); | 625 start_command_packet(mms, CS_PKT_START_FROM_PKT_ID); |
691 insert_command_prefixes(mms, 1, 0x0001FFFF); | 626 insert_command_prefixes(mms, 1, 0x0001FFFF); |
692 bytestream_put_le64(&mms->write_out_ptr, 0); // seek timestamp | 627 bytestream_put_le64(&mms->write_out_ptr, 0); // seek timestamp |
705 | 640 |
706 static void clear_stream_buffers(MMSContext *mms) | 641 static void clear_stream_buffers(MMSContext *mms) |
707 { | 642 { |
708 mms->remaining_in_len = 0; | 643 mms->remaining_in_len = 0; |
709 mms->read_in_ptr = mms->in_buffer; | 644 mms->read_in_ptr = mms->in_buffer; |
645 } | |
646 | |
647 static int mms_open(URLContext *h, const char *uri, int flags) | |
648 { | |
649 MMSContext *mms; | |
650 int port, err; | |
651 char tcpname[256]; | |
652 | |
653 h->is_streamed = 1; | |
654 mms = h->priv_data = av_mallocz(sizeof(MMSContext)); | |
655 if (!h->priv_data) | |
656 return AVERROR(ENOMEM); | |
657 | |
658 // only for MMS over TCP, so set proto = NULL | |
659 av_url_split(NULL, 0, NULL, 0, | |
660 mms->host, sizeof(mms->host), &port, mms->path, | |
661 sizeof(mms->path), uri); | |
662 | |
663 if(port<0) | |
664 port = 1755; // defaut mms protocol port | |
665 | |
666 // establish tcp connection. | |
667 ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, mms->host, port, NULL); | |
668 err = url_open(&mms->mms_hd, tcpname, URL_RDWR); | |
669 if (err) | |
670 goto fail; | |
671 | |
672 mms->packet_id = 3; // default, initial value. | |
673 mms->header_packet_id = 2; // default, initial value. | |
674 err = mms_safe_send_recv(mms, send_startup_packet, SC_PKT_CLIENT_ACCEPTED); | |
675 if (err) | |
676 goto fail; | |
677 err = mms_safe_send_recv(mms, send_time_test_data, SC_PKT_TIMING_TEST_REPLY); | |
678 if (err) | |
679 goto fail; | |
680 err = mms_safe_send_recv(mms, send_protocol_select, SC_PKT_PROTOCOL_ACCEPTED); | |
681 if (err) | |
682 goto fail; | |
683 err = mms_safe_send_recv(mms, send_media_file_request, SC_PKT_MEDIA_FILE_DETAILS); | |
684 if (err) | |
685 goto fail; | |
686 err = mms_safe_send_recv(mms, send_media_header_request, SC_PKT_HEADER_REQUEST_ACCEPTED); | |
687 if (err) | |
688 goto fail; | |
689 err = mms_safe_send_recv(mms, NULL, SC_PKT_ASF_HEADER); | |
690 if (err) | |
691 goto fail; | |
692 if((mms->incoming_flags != 0X08) && (mms->incoming_flags != 0X0C)) | |
693 goto fail; | |
694 err = asf_header_parser(mms); | |
695 if (err) { | |
696 dprintf(NULL, "asf header parsed failed!\n"); | |
697 goto fail; | |
698 } | |
699 mms->header_parsed = 1; | |
700 | |
701 if (!mms->asf_packet_len || !mms->stream_num) | |
702 goto fail; | |
703 | |
704 dprintf(NULL, "Leaving open (success)\n"); | |
705 return 0; | |
706 fail: | |
707 mms_close(h); | |
708 dprintf(NULL, "Leaving open (failure: %d)\n", err); | |
709 return err; | |
710 } | 710 } |
711 | 711 |
712 /** Read ASF data through the protocol. */ | 712 /** Read ASF data through the protocol. */ |
713 static int mms_read(URLContext *h, uint8_t *buf, int size) | 713 static int mms_read(URLContext *h, uint8_t *buf, int size) |
714 { | 714 { |