annotate mmst.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 91076395b8d3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
1 /*
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
2 * MMS protocol over TCP
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
3 * Copyright (c) 2006,2007 Ryan Martell
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
4 * Copyright (c) 2007 Björn Axelsson
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
5 * Copyright (c) 2010 Zhentan Feng <spyfeng at gmail dot com>
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
6 *
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
7 * This file is part of FFmpeg.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
8 *
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
13 *
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
17 * Lesser General Public License for more details.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
18 *
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
22 */
6293
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
23
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
24 /* References
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
25 * MMS protocol specification:
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
26 * [1]http://msdn.microsoft.com/en-us/library/cc234711(PROT.10).aspx
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
27 * ASF specification. Revision 01.20.03.
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
28 * [2]http://msdn.microsoft.com/en-us/library/bb643323.aspx
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
29 */
130d730d1c5e Explicitely set the size of the "ff_asf_head1_guid" header chunk, this is
rbultje
parents: 6292
diff changeset
30
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
31 #include "avformat.h"
6368
1423af8f47f7 Move functions and structs shared between MMSH and MMST into their own file,
rbultje
parents: 6367
diff changeset
32 #include "mms.h"
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
33 #include "internal.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
34 #include "libavutil/intreadwrite.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
35 #include "libavcodec/bytestream.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
36 #include "network.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
37 #include "asf.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
38
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
39 #define LOCAL_ADDRESS 0xc0a80081 // FIXME get and use correct local ip address.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
40 #define LOCAL_PORT 1037 // as above.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
41 /** Client to server packet types. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
42 typedef enum {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
43 CS_PKT_INITIAL = 0x01,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
44 CS_PKT_PROTOCOL_SELECT = 0x02,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
45 CS_PKT_MEDIA_FILE_REQUEST = 0x05,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
46 CS_PKT_START_FROM_PKT_ID = 0x07,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
47 CS_PKT_STREAM_PAUSE = 0x09,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
48 CS_PKT_STREAM_CLOSE = 0x0d,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
49 CS_PKT_MEDIA_HEADER_REQUEST = 0x15,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
50 CS_PKT_TIMING_DATA_REQUEST = 0x18,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
51 CS_PKT_USER_PASSWORD = 0x1a,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
52 CS_PKT_KEEPALIVE = 0x1b,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
53 CS_PKT_STREAM_ID_REQUEST = 0x33,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
54 } MMSCSPacketType;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
55
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
56 /** Server to client packet types. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
57 typedef enum {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
58 /** Control packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
59 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
60 SC_PKT_CLIENT_ACCEPTED = 0x01,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
61 SC_PKT_PROTOCOL_ACCEPTED = 0x02,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
62 SC_PKT_PROTOCOL_FAILED = 0x03,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
63 SC_PKT_MEDIA_PKT_FOLLOWS = 0x05,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
64 SC_PKT_MEDIA_FILE_DETAILS = 0x06,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
65 SC_PKT_HEADER_REQUEST_ACCEPTED = 0x11,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
66 SC_PKT_TIMING_TEST_REPLY = 0x15,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
67 SC_PKT_PASSWORD_REQUIRED = 0x1a,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
68 SC_PKT_KEEPALIVE = 0x1b,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
69 SC_PKT_STREAM_STOPPED = 0x1e,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
70 SC_PKT_STREAM_CHANGING = 0x20,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
71 SC_PKT_STREAM_ID_ACCEPTED = 0x21,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
72 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
73
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
74 /** Pseudo packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
75 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
76 SC_PKT_CANCEL = -1,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
77 SC_PKT_NO_DATA = -2,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
78 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
79
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
80 /** Data packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
81 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
82 SC_PKT_ASF_HEADER = 0x010000,// make it bigger than 0xFF in case of
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
83 SC_PKT_ASF_MEDIA = 0x010001,// receiving false data packets.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
84 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
85 } MMSSCPacketType;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
86
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
87 typedef struct {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
88 MMSContext mms;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
89 int outgoing_packet_seq; ///< Outgoing packet sequence number.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
90 char path[256]; ///< Path of the resource being asked for.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
91 char host[128]; ///< Host of the resources.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
92 int incoming_packet_seq; ///< Incoming packet sequence number.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
93 int incoming_flags; ///< Incoming packet flags.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
94 int packet_id; ///< Identifier for packets in the current stream.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
95 unsigned int header_packet_id; ///< default is 2.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
96 } MMSTContext;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
97
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
98 /** Create MMST command packet header */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
99 static void start_command_packet(MMSTContext *mmst, MMSCSPacketType packet_type)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
100 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
101 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
102 mms->write_out_ptr = mms->out_buffer;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
103
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
104 bytestream_put_le32(&mms->write_out_ptr, 1); // start sequence
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
105 bytestream_put_le32(&mms->write_out_ptr, 0xb00bface);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
106 bytestream_put_le32(&mms->write_out_ptr, 0); // Length starts from after the protocol type bytes
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
107 bytestream_put_le32(&mms->write_out_ptr, MKTAG('M','M','S',' '));
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
108 bytestream_put_le32(&mms->write_out_ptr, 0);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
109 bytestream_put_le32(&mms->write_out_ptr, mmst->outgoing_packet_seq++);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
110 bytestream_put_le64(&mms->write_out_ptr, 0); // timestamp
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
111 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
112 bytestream_put_le16(&mms->write_out_ptr, packet_type);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
113 bytestream_put_le16(&mms->write_out_ptr, 3); // direction to server
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
114 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
115
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
116 /** Add prefixes to MMST command packet. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
117 static void insert_command_prefixes(MMSContext *mms,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
118 uint32_t prefix1, uint32_t prefix2)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
119 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
120 bytestream_put_le32(&mms->write_out_ptr, prefix1); // first prefix
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
121 bytestream_put_le32(&mms->write_out_ptr, prefix2); // second prefix
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
122 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
123
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
124 /** Send a prepared MMST command packet. */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
125 static int send_command_packet(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
126 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
127 MMSContext *mms = &mmst->mms;
6292
54715a725139 Align outgoing messages to 8 bytes, this is required to interact with
rbultje
parents: 6291
diff changeset
128 int len= mms->write_out_ptr - mms->out_buffer;
6366
d4691e73420f Use FFALIGN() in mmst.c where appropriate. Noticed by Benoit Fouet.
rbultje
parents: 6346
diff changeset
129 int exact_length = FFALIGN(len, 8);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
130 int first_length= exact_length - 16;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
131 int len8= first_length/8;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
132 int write_result;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
133
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
134 // update packet length fields.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
135 AV_WL32(mms->out_buffer + 8, first_length);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
136 AV_WL32(mms->out_buffer + 16, len8);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
137 AV_WL32(mms->out_buffer + 32, len8-2);
6292
54715a725139 Align outgoing messages to 8 bytes, this is required to interact with
rbultje
parents: 6291
diff changeset
138 memset(mms->write_out_ptr, 0, exact_length - len);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
139
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
140 // write it out.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
141 write_result= url_write(mms->mms_hd, mms->out_buffer, exact_length);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
142 if(write_result != exact_length) {
6316
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
143 av_log(NULL, AV_LOG_ERROR,
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
144 "Failed to write data of length %d: %d (%s)\n",
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
145 exact_length, write_result,
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
146 write_result < 0 ? strerror(write_result) :
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
147 "The server closed the connection");
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
148 return AVERROR_IO;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
149 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
150
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
151 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
152 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
153
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
154 static void mms_put_utf16(MMSContext *mms, uint8_t *src)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
155 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
156 ByteIOContext bic;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
157 int size = mms->write_out_ptr - mms->out_buffer;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
158 int len;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
159 init_put_byte(&bic, mms->write_out_ptr,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
160 sizeof(mms->out_buffer) - size, 1, NULL, NULL, NULL, NULL);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
161
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
162 len = ff_put_str16_nolen(&bic, src);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
163 mms->write_out_ptr += len;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
164 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
165
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
166 static int send_time_test_data(MMSTContext *mmst)
6289
fb720b9d8ee1 Send a time test to the server, as the spec recommends.
rbultje
parents: 6182
diff changeset
167 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
168 start_command_packet(mmst, CS_PKT_TIMING_DATA_REQUEST);
6374
697815446a12 Fix wrong command prefix for timing test in MMST protocol.
rbultje
parents: 6368
diff changeset
169 insert_command_prefixes(&mmst->mms, 0x00f0f0f0, 0x0004000b);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
170 return send_command_packet(mmst);
6289
fb720b9d8ee1 Send a time test to the server, as the spec recommends.
rbultje
parents: 6182
diff changeset
171 }
fb720b9d8ee1 Send a time test to the server, as the spec recommends.
rbultje
parents: 6182
diff changeset
172
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
173 static int send_protocol_select(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
174 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
175 char data_string[256];
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
176 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
177
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
178 start_command_packet(mmst, CS_PKT_PROTOCOL_SELECT);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
179 insert_command_prefixes(mms, 0, 0xffffffff);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
180 bytestream_put_le32(&mms->write_out_ptr, 0); // maxFunnelBytes
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
181 bytestream_put_le32(&mms->write_out_ptr, 0x00989680); // maxbitRate
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
182 bytestream_put_le32(&mms->write_out_ptr, 2); // funnelMode
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
183 snprintf(data_string, sizeof(data_string), "\\\\%d.%d.%d.%d\\%s\\%d",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
184 (LOCAL_ADDRESS>>24)&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
185 (LOCAL_ADDRESS>>16)&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
186 (LOCAL_ADDRESS>>8)&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
187 LOCAL_ADDRESS&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
188 "TCP", // or UDP
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
189 LOCAL_PORT);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
190
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
191 mms_put_utf16(mms, data_string);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
192 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
193 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
194
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
195 static int send_media_file_request(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
196 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
197 MMSContext *mms = &mmst->mms;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
198 start_command_packet(mmst, CS_PKT_MEDIA_FILE_REQUEST);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
199 insert_command_prefixes(mms, 1, 0xffffffff);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
200 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
201 bytestream_put_le32(&mms->write_out_ptr, 0);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
202 mms_put_utf16(mms, mmst->path + 1); // +1 for skip "/"
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
203
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
204 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
205 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
206
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
207 static void handle_packet_stream_changing_type(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
208 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
209 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
210 dprintf(NULL, "Stream changing!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
211
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
212 // 40 is the packet header size, 7 is the prefix size.
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
213 mmst->header_packet_id= AV_RL32(mms->in_buffer + 40 + 7);
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
214 dprintf(NULL, "Changed header prefix to 0x%x", mmst->header_packet_id);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
215 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
216
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
217 static int send_keepalive_packet(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
218 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
219 // respond to a keepalive with a keepalive...
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
220 start_command_packet(mmst, CS_PKT_KEEPALIVE);
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
221 insert_command_prefixes(&mmst->mms, 1, 0x100FFFF);
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
222 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
223 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
224
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
225 /** Pad media packets smaller than max_packet_size and/or adjust read position
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
226 * after a seek. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
227 static void pad_media_packet(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
228 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
229 if(mms->remaining_in_len<mms->asf_packet_len) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
230 int padding_size = mms->asf_packet_len - mms->remaining_in_len;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
231 memset(mms->in_buffer + mms->remaining_in_len, 0, padding_size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
232 mms->remaining_in_len += padding_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
233 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
234 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
235
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
236 /** Read incoming MMST media, header or command packet. */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
237 static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
238 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
239 int read_result;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
240 MMSSCPacketType packet_type= -1;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
241 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
242 for(;;) {
6317
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
243 read_result = url_read_complete(mms->mms_hd, mms->in_buffer, 8);
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
244 if (read_result != 8) {
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
245 if(read_result < 0) {
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
246 av_log(NULL, AV_LOG_ERROR,
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
247 "Error reading packet header: %d (%s)\n",
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
248 read_result, strerror(read_result));
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
249 packet_type = SC_PKT_CANCEL;
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
250 } else {
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
251 av_log(NULL, AV_LOG_ERROR,
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
252 "The server closed the connection\n");
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
253 packet_type = SC_PKT_NO_DATA;
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
254 }
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
255 return packet_type;
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
256 }
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
257
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
258 // handle command packet.
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
259 if(AV_RL32(mms->in_buffer + 4)==0xb00bface) {
6317
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
260 int length_remaining, hr;
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
261
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
262 mmst->incoming_flags= mms->in_buffer[3];
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
263 read_result= url_read_complete(mms->mms_hd, mms->in_buffer+8, 4);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
264 if(read_result != 4) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
265 av_log(NULL, AV_LOG_ERROR,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
266 "Reading command packet length failed: %d (%s)\n",
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
267 read_result,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
268 read_result < 0 ? strerror(read_result) :
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
269 "The server closed the connection");
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
270 return read_result < 0 ? read_result : AVERROR_IO;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
271 }
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
272
6317
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
273 length_remaining= AV_RL32(mms->in_buffer+8) + 4;
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
274 dprintf(NULL, "Length remaining is %d\n", length_remaining);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
275 // read the rest of the packet.
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
276 if (length_remaining < 0
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
277 || length_remaining > sizeof(mms->in_buffer) - 12) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
278 av_log(NULL, AV_LOG_ERROR,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
279 "Incoming packet length %d exceeds bufsize %zu\n",
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
280 length_remaining, sizeof(mms->in_buffer) - 12);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
281 return AVERROR_INVALIDDATA;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
282 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
283 read_result = url_read_complete(mms->mms_hd, mms->in_buffer + 12,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
284 length_remaining) ;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
285 if (read_result != length_remaining) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
286 av_log(NULL, AV_LOG_ERROR,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
287 "Reading pkt data (length=%d) failed: %d (%s)\n",
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
288 length_remaining, read_result,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
289 read_result < 0 ? strerror(read_result) :
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
290 "The server closed the connection");
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
291 return read_result < 0 ? read_result : AVERROR_IO;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
292 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
293 packet_type= AV_RL16(mms->in_buffer+36);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
294 hr = AV_RL32(mms->in_buffer + 40);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
295 if (hr) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
296 av_log(NULL, AV_LOG_ERROR,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
297 "Server sent an error status code: 0x%08x\n", hr);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
298 return AVERROR_UNKNOWN;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
299 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
300 } else {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
301 int length_remaining;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
302 int packet_id_type;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
303 int tmp;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
304
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
305 // note we cache the first 8 bytes,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
306 // then fill up the buffer with the others
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
307 tmp = AV_RL16(mms->in_buffer + 6);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
308 length_remaining = (tmp - 8) & 0xffff;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
309 mmst->incoming_packet_seq = AV_RL32(mms->in_buffer);
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
310 packet_id_type = mms->in_buffer[4];
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
311 mmst->incoming_flags = mms->in_buffer[5];
6317
c166e5ff20b9 Use inverse error branches, i.e. instead of if(something){success} else {error},
rbultje
parents: 6316
diff changeset
312
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
313 if (length_remaining < 0
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
314 || length_remaining > sizeof(mms->in_buffer) - 8) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
315 av_log(NULL, AV_LOG_ERROR,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
316 "Data length %d is invalid or too large (max=%zu)\n",
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
317 length_remaining, sizeof(mms->in_buffer));
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
318 return AVERROR_INVALIDDATA;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
319 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
320 mms->remaining_in_len = length_remaining;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
321 mms->read_in_ptr = mms->in_buffer;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
322 read_result= url_read_complete(mms->mms_hd, mms->in_buffer, length_remaining);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
323 if(read_result != length_remaining) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
324 av_log(NULL, AV_LOG_ERROR,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
325 "Failed to read packet data of size %d: %d (%s)\n",
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
326 length_remaining, read_result,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
327 read_result < 0 ? strerror(read_result) :
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
328 "The server closed the connection");
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
329 return read_result < 0 ? read_result : AVERROR_IO;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
330 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
331
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
332 // if we successfully read everything.
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
333 if(packet_id_type == mmst->header_packet_id) {
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
334 packet_type = SC_PKT_ASF_HEADER;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
335 // Store the asf header
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
336 if(!mms->header_parsed) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
337 void *p = av_realloc(mms->asf_header,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
338 mms->asf_header_size + mms->remaining_in_len);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
339 if (!p) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
340 av_freep(&mms->asf_header);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
341 return AVERROR(ENOMEM);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
342 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
343 mms->asf_header = p;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
344 memcpy(mms->asf_header + mms->asf_header_size,
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
345 mms->read_in_ptr, mms->remaining_in_len);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
346 mms->asf_header_size += mms->remaining_in_len;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
347 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
348 // 0x04 means asf header is sent in multiple packets.
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
349 if (mmst->incoming_flags == 0x04)
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
350 continue;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
351 } else if(packet_id_type == mmst->packet_id) {
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
352 packet_type = SC_PKT_ASF_MEDIA;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
353 } else {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
354 dprintf(NULL, "packet id type %d is old.", packet_id_type);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
355 continue;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
356 }
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
357 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
358
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
359 // preprocess some packet type
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
360 if(packet_type == SC_PKT_KEEPALIVE) {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
361 send_keepalive_packet(mmst);
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
362 continue;
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
363 } else if(packet_type == SC_PKT_STREAM_CHANGING) {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
364 handle_packet_stream_changing_type(mmst);
6318
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
365 } else if(packet_type == SC_PKT_ASF_MEDIA) {
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
366 pad_media_packet(mms);
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
367 }
1c7e9dfdefe3 Reindent after r24516.
rbultje
parents: 6317
diff changeset
368 return packet_type;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
369 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
370 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
371
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
372 static int mms_safe_send_recv(MMSTContext *mmst,
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
373 int (*send_fun)(MMSTContext *mmst),
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
374 const MMSSCPacketType expect_type)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
375 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
376 MMSSCPacketType type;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
377 if(send_fun) {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
378 int ret = send_fun(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
379 if (ret < 0) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
380 dprintf(NULL, "Send Packet error before expecting recv packet %d\n", expect_type);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
381 return ret;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
382 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
383 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
384
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
385 if ((type = get_tcp_server_response(mmst)) != expect_type) {
6316
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
386 av_log(NULL, AV_LOG_ERROR,
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
387 "Corrupt stream (unexpected packet type 0x%x, expected 0x%x)\n",
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
388 type, expect_type);
270f6c8aeac5 Use av_log(.., AV_LOG_ERROR) instead of dprintf() for logging errors. This
rbultje
parents: 6294
diff changeset
389 return AVERROR_INVALIDDATA;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
390 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
391 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
392 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
393 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
394
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
395 static int send_media_header_request(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
396 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
397 MMSContext *mms = &mmst->mms;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
398 start_command_packet(mmst, CS_PKT_MEDIA_HEADER_REQUEST);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
399 insert_command_prefixes(mms, 1, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
400 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
401 bytestream_put_le32(&mms->write_out_ptr, 0x00800000);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
402 bytestream_put_le32(&mms->write_out_ptr, 0xffffffff);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
403 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
404 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
405 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
406
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
407 // the media preroll value in milliseconds?
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
408 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
409 bytestream_put_le32(&mms->write_out_ptr, 0x40AC2000);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
410 bytestream_put_le32(&mms->write_out_ptr, 2);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
411 bytestream_put_le32(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
412
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
413 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
414 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
415
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
416 /** Send the initial handshake. */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
417 static int send_startup_packet(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
418 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
419 char data_string[256];
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
420 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
421 // SubscriberName is defined in MS specification linked below.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
422 // The guid value can be any valid value.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
423 // http://download.microsoft.com/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
424 // download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-WMSP%5D.pdf
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
425 snprintf(data_string, sizeof(data_string),
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
426 "NSPlayer/7.0.0.1956; {%s}; Host: %s",
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
427 "7E667F5D-A661-495E-A512-F55686DDA178", mmst->host);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
428
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
429 start_command_packet(mmst, CS_PKT_INITIAL);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
430 insert_command_prefixes(mms, 0, 0x0004000b);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
431 bytestream_put_le32(&mms->write_out_ptr, 0x0003001c);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
432 mms_put_utf16(mms, data_string);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
433 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
434 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
435
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
436 /** Send MMST stream selection command based on the AVStream->discard values. */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
437 static int send_stream_selection_request(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
438 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
439 int i;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
440 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
441 // send the streams we want back...
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
442 start_command_packet(mmst, CS_PKT_STREAM_ID_REQUEST);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
443 bytestream_put_le32(&mms->write_out_ptr, mms->stream_num); // stream nums
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
444 for(i= 0; i<mms->stream_num; i++) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
445 bytestream_put_le16(&mms->write_out_ptr, 0xffff); // flags
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
446 bytestream_put_le16(&mms->write_out_ptr, mms->streams[i].id); // stream id
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
447 bytestream_put_le16(&mms->write_out_ptr, 0); // selection
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
448 }
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
449 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
450 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
451
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
452 static int send_close_packet(MMSTContext *mmst)
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
453 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
454 start_command_packet(mmst, CS_PKT_STREAM_CLOSE);
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
455 insert_command_prefixes(&mmst->mms, 1, 1);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
456
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
457 return send_command_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
458 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
459
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
460 /** Close the MMSH/MMST connection */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
461 static int mms_close(URLContext *h)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
462 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
463 MMSTContext *mmst = (MMSTContext *)h->priv_data;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
464 MMSContext *mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
465 if(mms->mms_hd) {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
466 send_close_packet(mmst);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
467 url_close(mms->mms_hd);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
468 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
469
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
470 /* free all separately allocated pointers in mms */
6376
91076395b8d3 Remove use of MAX_STREAMS in MMSContext->streams[] array. Instead, dynamically
rbultje
parents: 6374
diff changeset
471 av_free(mms->streams);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
472 av_free(mms->asf_header);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
473 av_freep(&h->priv_data);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
474
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
475 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
476 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
477
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
478 static int send_media_packet_request(MMSTContext *mmst)
6344
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
479 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
480 MMSContext *mms = &mmst->mms;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
481 start_command_packet(mmst, CS_PKT_START_FROM_PKT_ID);
6344
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
482 insert_command_prefixes(mms, 1, 0x0001FFFF);
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
483 bytestream_put_le64(&mms->write_out_ptr, 0); // seek timestamp
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
484 bytestream_put_le32(&mms->write_out_ptr, 0xffffffff); // unknown
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
485 bytestream_put_le32(&mms->write_out_ptr, 0xffffffff); // packet offset
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
486 bytestream_put_byte(&mms->write_out_ptr, 0xff); // max stream time limit
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
487 bytestream_put_byte(&mms->write_out_ptr, 0xff); // max stream time limit
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
488 bytestream_put_byte(&mms->write_out_ptr, 0xff); // max stream time limit
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
489 bytestream_put_byte(&mms->write_out_ptr, 0x00); // stream time limit flag
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
490
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
491 mmst->packet_id++; // new packet_id
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
492 bytestream_put_le32(&mms->write_out_ptr, mmst->packet_id);
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
493 return send_command_packet(mmst);
6344
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
494 }
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
495
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
496
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
497 static void clear_stream_buffers(MMSContext *mms)
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
498 {
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
499 mms->remaining_in_len = 0;
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
500 mms->read_in_ptr = mms->in_buffer;
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
501 }
eff600bc4261 Move send_media_packet_request() and clear_stream_buffers() up.
rbultje
parents: 6318
diff changeset
502
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
503 static int mms_open(URLContext *h, const char *uri, int flags)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
504 {
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
505 MMSTContext *mmst;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
506 MMSContext *mms;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
507 int port, err;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
508 char tcpname[256];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
509
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
510 h->is_streamed = 1;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
511 mmst = h->priv_data = av_mallocz(sizeof(MMSTContext));
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
512 if (!h->priv_data)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
513 return AVERROR(ENOMEM);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
514 mms = &mmst->mms;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
515
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
516 // only for MMS over TCP, so set proto = NULL
6182
4fc5e0e4e1cd Make ff_url_split() public
mru
parents: 6134
diff changeset
517 av_url_split(NULL, 0, NULL, 0,
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
518 mmst->host, sizeof(mmst->host), &port, mmst->path,
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
519 sizeof(mmst->path), uri);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
520
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
521 if(port<0)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
522 port = 1755; // defaut mms protocol port
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
523
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
524 // establish tcp connection.
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
525 ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, mmst->host, port, NULL);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
526 err = url_open(&mms->mms_hd, tcpname, URL_RDWR);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
527 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
528 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
529
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
530 mmst->packet_id = 3; // default, initial value.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
531 mmst->header_packet_id = 2; // default, initial value.
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
532 err = mms_safe_send_recv(mmst, send_startup_packet, SC_PKT_CLIENT_ACCEPTED);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
533 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
534 goto fail;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
535 err = mms_safe_send_recv(mmst, send_time_test_data, SC_PKT_TIMING_TEST_REPLY);
6289
fb720b9d8ee1 Send a time test to the server, as the spec recommends.
rbultje
parents: 6182
diff changeset
536 if (err)
fb720b9d8ee1 Send a time test to the server, as the spec recommends.
rbultje
parents: 6182
diff changeset
537 goto fail;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
538 err = mms_safe_send_recv(mmst, send_protocol_select, SC_PKT_PROTOCOL_ACCEPTED);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
539 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
540 goto fail;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
541 err = mms_safe_send_recv(mmst, send_media_file_request, SC_PKT_MEDIA_FILE_DETAILS);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
542 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
543 goto fail;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
544 err = mms_safe_send_recv(mmst, send_media_header_request, SC_PKT_HEADER_REQUEST_ACCEPTED);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
545 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
546 goto fail;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
547 err = mms_safe_send_recv(mmst, NULL, SC_PKT_ASF_HEADER);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
548 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
549 goto fail;
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
550 if((mmst->incoming_flags != 0X08) && (mmst->incoming_flags != 0X0C))
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
551 goto fail;
6368
1423af8f47f7 Move functions and structs shared between MMSH and MMST into their own file,
rbultje
parents: 6367
diff changeset
552 err = ff_mms_asf_header_parser(mms);
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
553 if (err) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
554 dprintf(NULL, "asf header parsed failed!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
555 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
556 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
557 mms->header_parsed = 1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
558
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
559 if (!mms->asf_packet_len || !mms->stream_num)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
560 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
561
6345
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
562 clear_stream_buffers(mms);
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
563 err = mms_safe_send_recv(mmst, send_stream_selection_request, SC_PKT_STREAM_ID_ACCEPTED);
6345
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
564 if (err)
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
565 goto fail;
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
566 // send media packet request
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
567 err = mms_safe_send_recv(mmst, send_media_packet_request, SC_PKT_MEDIA_PKT_FOLLOWS);
6345
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
568 if (err) {
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
569 goto fail;
60df621e6237 Remove is_playing variable.
rbultje
parents: 6344
diff changeset
570 }
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
571 dprintf(NULL, "Leaving open (success)\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
572 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
573 fail:
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
574 mms_close(h);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
575 dprintf(NULL, "Leaving open (failure: %d)\n", err);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
576 return err;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
577 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
578
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
579 /** Read ASF data through the protocol. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
580 static int mms_read(URLContext *h, uint8_t *buf, int size)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
581 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
582 /* TODO: see tcp.c:tcp_read() about a possible timeout scheme */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
583 MMSTContext *mmst = h->priv_data;
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
584 MMSContext *mms = &mmst->mms;
6346
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
585 int result = 0;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
586
6346
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
587 do {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
588 if(mms->asf_header_read_size < mms->asf_header_size) {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
589 /* Read from ASF header buffer */
6368
1423af8f47f7 Move functions and structs shared between MMSH and MMST into their own file,
rbultje
parents: 6367
diff changeset
590 result = ff_mms_read_header(mms, buf, size);
6346
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
591 } else if(mms->remaining_in_len) {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
592 /* Read remaining packet data to buffer.
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
593 * the result can not be zero because remaining_in_len is positive.*/
6368
1423af8f47f7 Move functions and structs shared between MMSH and MMST into their own file,
rbultje
parents: 6367
diff changeset
594 result = ff_mms_read_data(mms, buf, size);
6346
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
595 } else {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
596 /* Read from network */
6367
c58f5d360b4e Extract fields that are to be shared between MMST/MMSH into a common struct,
rbultje
parents: 6366
diff changeset
597 int err = mms_safe_send_recv(mmst, NULL, SC_PKT_ASF_MEDIA);
6346
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
598 if (err == 0) {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
599 if(mms->remaining_in_len>mms->asf_packet_len) {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
600 av_log(NULL, AV_LOG_ERROR,
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
601 "Incoming pktlen %d is larger than ASF pktsize %d\n",
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
602 mms->remaining_in_len, mms->asf_packet_len);
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
603 result= AVERROR_IO;
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
604 } else {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
605 // copy the data to the packet buffer.
6368
1423af8f47f7 Move functions and structs shared between MMSH and MMST into their own file,
rbultje
parents: 6367
diff changeset
606 result = ff_mms_read_data(mms, buf, size);
6346
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
607 if (result == 0) {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
608 dprintf(NULL, "read asf media paket size is zero!\n");
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
609 break;
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
610 }
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
611 }
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
612 } else {
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
613 dprintf(NULL, "read packet error!\n");
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
614 break;
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
615 }
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
616 }
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
617 } while(!result); // only return one packet.
5bd7120eb3e7 Move read_mms_packet() code to be inlined in the calling function.
rbultje
parents: 6345
diff changeset
618 return result;
6053
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
619 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
620
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
621 URLProtocol mmst_protocol = {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
622 "mmst",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
623 mms_open,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
624 mms_read,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
625 NULL, // write
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
626 NULL, // seek
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
627 mms_close,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
628 };