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 {