annotate mmst.c @ 6115:4c91cdcb8a52 libavformat

Initialize the http connection in http_seek, too This makes url_fsize return correct values for delay opened connections that have not yet been initialized. This fixes using the image2 demuxer with http sources.
author mstorsjo
date Wed, 09 Jun 2010 08:29:51 +0000
parents 1b6a5459ff73
children 6c41d8dce99e
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 */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
23 #include "avformat.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
24 #include "internal.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
25 #include "libavutil/intreadwrite.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
26 #include "libavcodec/bytestream.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
27 #include "network.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
28 #include "asf.h"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
29
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
30 #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
31 #define LOCAL_PORT 1037 // as above.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
32 /** Client to server packet types. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
33 typedef enum {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
34 CS_PKT_INITIAL = 0x01,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
35 CS_PKT_PROTOCOL_SELECT = 0x02,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
36 CS_PKT_MEDIA_FILE_REQUEST = 0x05,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
37 CS_PKT_START_FROM_PKT_ID = 0x07,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
38 CS_PKT_STREAM_PAUSE = 0x09,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
39 CS_PKT_STREAM_CLOSE = 0x0d,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
40 CS_PKT_MEDIA_HEADER_REQUEST = 0x15,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
41 CS_PKT_TIMING_DATA_REQUEST = 0x18,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
42 CS_PKT_USER_PASSWORD = 0x1a,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
43 CS_PKT_KEEPALIVE = 0x1b,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
44 CS_PKT_STREAM_ID_REQUEST = 0x33,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
45 } MMSCSPacketType;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
46
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
47 /** Server to client packet types. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
48 typedef enum {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
49 /** Control packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
50 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
51 SC_PKT_CLIENT_ACCEPTED = 0x01,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
52 SC_PKT_PROTOCOL_ACCEPTED = 0x02,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
53 SC_PKT_PROTOCOL_FAILED = 0x03,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
54 SC_PKT_MEDIA_PKT_FOLLOWS = 0x05,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
55 SC_PKT_MEDIA_FILE_DETAILS = 0x06,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
56 SC_PKT_HEADER_REQUEST_ACCEPTED = 0x11,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
57 SC_PKT_TIMING_TEST_REPLY = 0x15,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
58 SC_PKT_PASSWORD_REQUIRED = 0x1a,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
59 SC_PKT_KEEPALIVE = 0x1b,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
60 SC_PKT_STREAM_STOPPED = 0x1e,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
61 SC_PKT_STREAM_CHANGING = 0x20,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
62 SC_PKT_STREAM_ID_ACCEPTED = 0x21,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
63 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
64
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
65 /** Pseudo packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
66 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
67 SC_PKT_CANCEL = -1,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
68 SC_PKT_NO_DATA = -2,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
69 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
70
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
71 /** Data packets. */
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 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
74 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
75 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
76 } MMSSCPacketType;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
77
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
78 typedef struct {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
79 int id;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
80 }MMSStream;
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 typedef struct {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
83 int outgoing_packet_seq; ///< Outgoing packet sequence number.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
84 char path[256]; ///< Path of the resource being asked for.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
85 char host[128]; ///< Host of the resources.
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 URLContext *mms_hd; ///< TCP connection handle
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
88 MMSStream streams[MAX_STREAMS];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
89
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
90 /** Buffer for outgoing packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
91 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
92 uint8_t *write_out_ptr; ///< Pointer for writting the buffer.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
93 uint8_t out_buffer[512]; ///< Buffer for outgoing packet.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
94 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
95
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
96 /** Buffer for incoming packets. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
97 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
98 uint8_t in_buffer[8192]; ///< Buffer for incoming packets.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
99 uint8_t *read_in_ptr; ///< Pointer for reading from incoming buffer.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
100 int remaining_in_len; ///< Reading length from incoming buffer.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
101 /*@}*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
102
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
103 int incoming_packet_seq; ///< Incoming packet sequence number.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
104 int incoming_flags; ///< Incoming packet flags.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
105
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
106 int packet_id; ///< Identifier for packets in the current stream.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
107 unsigned int header_packet_id; ///< default is 2.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
108
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
109 /** Internal handling of the ASF header */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
110 /*@{*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
111 uint8_t *asf_header; ///< Stored ASF header.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
112 int asf_header_size; ///< Size of stored ASF header.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
113 int header_parsed; ///< The header has been received and parsed.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
114 int asf_packet_len;
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
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
117 int stream_num; ///< stream numbers.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
118 int is_playing;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
119 } MMSContext;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
120
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
121 /** Create MMST command packet header */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
122 static void start_command_packet(MMSContext *mms, MMSCSPacketType packet_type)
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 mms->write_out_ptr = mms->out_buffer;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
125
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
126 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
127 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
128 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
129 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
130 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
131 bytestream_put_le32(&mms->write_out_ptr, mms->outgoing_packet_seq++);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
132 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
133 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
134 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
135 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
136 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
137
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
138 /** Add prefixes to MMST command packet. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
139 static void insert_command_prefixes(MMSContext *mms,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
140 uint32_t prefix1, uint32_t prefix2)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
141 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
142 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
143 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
144 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
145
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
146 /** Send a prepared MMST command packet. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
147 static int send_command_packet(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
148 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
149 int exact_length= mms->write_out_ptr - mms->out_buffer;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
150 int first_length= exact_length - 16;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
151 int len8= first_length/8;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
152 int write_result;
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 // update packet length fields.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
155 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
156 AV_WL32(mms->out_buffer + 16, len8);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
157 AV_WL32(mms->out_buffer + 32, len8-2);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
158
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
159 // write it out.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
160 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
161 if(write_result != exact_length) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
162 dprintf(NULL, "url_write returned: %d != %d\n",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
163 write_result, exact_length);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
164 return AVERROR_IO;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
165 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
166
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
167 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
168 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
169
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
170 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
171 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
172 ByteIOContext bic;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
173 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
174 int len;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
175 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
176 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
177
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
178 len = ff_put_str16_nolen(&bic, src);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
179 mms->write_out_ptr += len;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
180 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
181
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
182 static int send_protocol_select(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
183 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
184 char data_string[256];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
185
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
186 start_command_packet(mms, CS_PKT_PROTOCOL_SELECT);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
187 insert_command_prefixes(mms, 0, 0xffffffff);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
188 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
189 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
190 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
191 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
192 (LOCAL_ADDRESS>>24)&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
193 (LOCAL_ADDRESS>>16)&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
194 (LOCAL_ADDRESS>>8)&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
195 LOCAL_ADDRESS&0xff,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
196 "TCP", // or UDP
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
197 LOCAL_PORT);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
198
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
199 mms_put_utf16(mms, data_string);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
200 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
201 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
202
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
203 static int send_media_file_request(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
204 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
205 start_command_packet(mms, CS_PKT_MEDIA_FILE_REQUEST);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
206 insert_command_prefixes(mms, 1, 0xffffffff);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
207 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
208 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
209 mms_put_utf16(mms, mms->path + 1); // +1 for skip "/"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
210
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
211 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
212 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
213
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
214 static void handle_packet_stream_changing_type(MMSContext *mms)
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 dprintf(NULL, "Stream changing!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
217
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
218 // 40 is the packet header size, 7 is the prefix size.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
219 mms->header_packet_id= AV_RL32(mms->in_buffer + 40 + 7);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
220 dprintf(NULL, "Changed header prefix to 0x%x", mms->header_packet_id);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
221 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
222
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
223 static int send_keepalive_packet(MMSContext *mms)
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 // respond to a keepalive with a keepalive...
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
226 start_command_packet(mms, CS_PKT_KEEPALIVE);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
227 insert_command_prefixes(mms, 1, 0x100FFFF);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
228 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
229 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
230
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
231 /** 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
232 * after a seek. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
233 static void pad_media_packet(MMSContext *mms)
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 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
236 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
237 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
238 mms->remaining_in_len += padding_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
239 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
240 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
241
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
242 /** Read incoming MMST media, header or command packet. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
243 static MMSSCPacketType get_tcp_server_response(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
244 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
245 int read_result;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
246 MMSSCPacketType packet_type= -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
247
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
248 for(;;) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
249 if((read_result= url_read_complete(mms->mms_hd, mms->in_buffer, 8))==8) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
250 // handle command packet.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
251 if(AV_RL32(mms->in_buffer + 4)==0xb00bface) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
252 mms->incoming_flags= mms->in_buffer[3];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
253 read_result= url_read_complete(mms->mms_hd, mms->in_buffer+8, 4);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
254 if(read_result == 4) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
255 int length_remaining= AV_RL32(mms->in_buffer+8) + 4;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
256
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
257 dprintf(NULL, "Length remaining is %d\n", length_remaining);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
258 // read the rest of the packet.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
259 if (length_remaining < 0
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
260 || length_remaining > sizeof(mms->in_buffer) - 12) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
261 dprintf("Incoming message len %d exceeds buffer len %d\n",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
262 length_remaining, sizeof(mms->in_buffer) - 12);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
263 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
264 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
265 read_result = url_read_complete(mms->mms_hd, mms->in_buffer + 12,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
266 length_remaining) ;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
267 if (read_result == length_remaining) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
268 packet_type= AV_RL16(mms->in_buffer+36);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
269 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
270 dprintf(NULL, "read for packet type failed%d!\n", read_result);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
271 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
272 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
273 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
274 dprintf(NULL, "read for length remaining failed%d!\n", read_result);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
275 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
276 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
277 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
278 int length_remaining;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
279 int packet_id_type;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
280 int tmp;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
281
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
282 assert(mms->remaining_in_len==0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
283
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
284 // note we cache the first 8 bytes,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
285 // then fill up the buffer with the others
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
286 tmp = AV_RL16(mms->in_buffer + 6);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
287 length_remaining = (tmp - 8) & 0xffff;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
288 mms->incoming_packet_seq = AV_RL32(mms->in_buffer);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
289 packet_id_type = mms->in_buffer[4];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
290 mms->incoming_flags = mms->in_buffer[5];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
291
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
292 if (length_remaining < 0
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
293 || length_remaining > sizeof(mms->in_buffer) - 8) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
294 dprintf("Incoming data len %d exceeds buffer len %d\n",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
295 length_remaining, sizeof(mms->in_buffer));
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
296 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
297 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
298 mms->remaining_in_len = length_remaining;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
299 mms->read_in_ptr = mms->in_buffer;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
300 read_result= url_read_complete(mms->mms_hd, mms->in_buffer, length_remaining);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
301 if(read_result != length_remaining) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
302 dprintf(NULL, "read_bytes result: %d asking for %d\n",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
303 read_result, length_remaining);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
304 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
305 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
306 // if we successfully read everything.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
307 if(packet_id_type == mms->header_packet_id) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
308 packet_type = SC_PKT_ASF_HEADER;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
309 // Store the asf header
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
310 if(!mms->header_parsed) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
311 void *p = av_realloc(mms->asf_header,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
312 mms->asf_header_size
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
313 + mms->remaining_in_len);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
314 if (!p) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
315 av_freep(&mms->asf_header);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
316 return AVERROR(ENOMEM);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
317 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
318 mms->asf_header = p;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
319 memcpy(mms->asf_header + mms->asf_header_size,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
320 mms->read_in_ptr,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
321 mms->remaining_in_len);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
322 mms->asf_header_size += mms->remaining_in_len;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
323 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
324 } else if(packet_id_type == mms->packet_id) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
325 packet_type = SC_PKT_ASF_MEDIA;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
326 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
327 dprintf(NULL, "packet id type %d is old.", packet_id_type);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
328 continue;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
329 }
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 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
332
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
333 // preprocess some packet type
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
334 if(packet_type == SC_PKT_KEEPALIVE) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
335 send_keepalive_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
336 continue;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
337 } else if(packet_type == SC_PKT_STREAM_CHANGING) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
338 handle_packet_stream_changing_type(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
339 } else if(packet_type == SC_PKT_ASF_MEDIA) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
340 pad_media_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
341 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
342 return packet_type;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
343 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
344 if(read_result<0) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
345 dprintf(NULL, "Read error (or cancelled) returned %d!\n", read_result);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
346 packet_type = SC_PKT_CANCEL;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
347 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
348 dprintf(NULL, "Read result of zero?!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
349 packet_type = SC_PKT_NO_DATA;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
350 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
351 return packet_type;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
352 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
353 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
354 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
355
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
356 static int mms_safe_send_recv(MMSContext *mms,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
357 int (*send_fun)(MMSContext *mms),
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
358 const MMSSCPacketType expect_type)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
359 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
360 MMSSCPacketType type;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
361 if(send_fun) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
362 int ret = send_fun(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
363 if (ret < 0) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
364 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
365 return ret;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
366 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
367 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
368
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
369 if ((type = get_tcp_server_response(mms)) != expect_type) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
370 dprintf(NULL,"Unexpected packet type %d with type %d\n", type, expect_type);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
371 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
372 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
373 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
374 }
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
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
377 static int send_media_header_request(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
378 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
379 start_command_packet(mms, CS_PKT_MEDIA_HEADER_REQUEST);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
380 insert_command_prefixes(mms, 1, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
381 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
382 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
383 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
384 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
385 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
386 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
387
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
388 // the media preroll value in milliseconds?
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
389 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
390 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
391 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
392 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
393
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
394 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
395 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
396
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
397 /** Send the initial handshake. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
398 static int send_startup_packet(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
399 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
400 char data_string[256];
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
401 // 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
402 // 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
403 // http://download.microsoft.com/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
404 // 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
405 snprintf(data_string, sizeof(data_string),
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
406 "NSPlayer/7.0.0.1956; {%s}; Host: %s",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
407 "7E667F5D-A661-495E-A512-F55686DDA178", mms->host);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
408
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
409 start_command_packet(mms, CS_PKT_INITIAL);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
410 insert_command_prefixes(mms, 0, 0x0004000b);
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, 0x0003001c);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
412 mms_put_utf16(mms, data_string);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
413 return send_command_packet(mms);
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 static int asf_header_parser(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
417 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
418 uint8_t *p = mms->asf_header;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
419 uint8_t *end;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
420 int flags, stream_id, real_header_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
421 mms->stream_num = 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
422
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
423 if (mms->asf_header_size < sizeof(ff_asf_guid) * 2 + 22 ||
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
424 memcmp(p, ff_asf_header, sizeof(ff_asf_guid)))
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
425 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
426
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
427 real_header_size = AV_RL64(p + sizeof(ff_asf_guid));
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
428 end = mms->asf_header + real_header_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
429
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
430 p += sizeof(ff_asf_guid) + 14;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
431 while(end - p >= sizeof(ff_asf_guid) + 8) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
432 uint64_t chunksize = AV_RL64(p + sizeof(ff_asf_guid));
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
433 if (!chunksize || chunksize > end - p) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
434 dprintf("chunksize is exceptional value:%d!\n", chunksize);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
435 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
436 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
437 if (!memcmp(p, ff_asf_file_header, sizeof(ff_asf_guid))) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
438 /* read packet size */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
439 if (end - p > sizeof(ff_asf_guid) * 2 + 68) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
440 mms->asf_packet_len = AV_RL32(p + sizeof(ff_asf_guid) * 2 + 64);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
441 if (mms->asf_packet_len <= 0 || mms->asf_packet_len > sizeof(mms->in_buffer)) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
442 dprintf(NULL,"Too large packet len:%d"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
443 " may overwrite in_buffer when padding", mms->asf_packet_len);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
444 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
445 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
446 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
447 } else if (!memcmp(p, ff_asf_stream_header, sizeof(ff_asf_guid))) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
448 flags = AV_RL16(p + sizeof(ff_asf_guid)*3 + 24);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
449 stream_id = flags & 0x7F;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
450 //The second condition is for checking CS_PKT_STREAM_ID_REQUEST packet size,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
451 //we can calcuate the packet size by stream_num.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
452 //Please see function send_stream_selection_request().
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
453 if (mms->stream_num < MAX_STREAMS &&
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
454 46 + mms->stream_num * 6 < sizeof(mms->out_buffer)) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
455 mms->streams[mms->stream_num].id = stream_id;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
456 mms->stream_num++;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
457 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
458 dprintf("Too many streams.\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
459 return -1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
460 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
461 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
462 p += chunksize;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
463 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
464
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
465 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
466 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
467
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
468 /** Send MMST stream selection command based on the AVStream->discard values. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
469 static int send_stream_selection_request(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
470 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
471 int i;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
472
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
473 // send the streams we want back...
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
474 start_command_packet(mms, CS_PKT_STREAM_ID_REQUEST);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
475 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
476 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
477 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
478 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
479 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
480 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
481
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
482 bytestream_put_le16(&mms->write_out_ptr, 0);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
483
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
484 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
485 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
486
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
487 static int read_data(MMSContext *mms, uint8_t *buf, const int buf_size)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
488 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
489 int read_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
490 read_size = FFMIN(buf_size, mms->remaining_in_len);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
491 memcpy(buf, mms->read_in_ptr, read_size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
492 mms->remaining_in_len -= read_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
493 mms->read_in_ptr += read_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
494 return read_size;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
495 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
496
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
497 /** Read at most one media packet (or a whole header). */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
498 static int read_mms_packet(MMSContext *mms, uint8_t *buf, int buf_size)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
499 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
500 int result = 0, read_header_size = 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
501 int size_to_copy;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
502
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
503 do {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
504 if(read_header_size < mms->asf_header_size && !mms->is_playing) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
505 /* Read from ASF header buffer */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
506 size_to_copy= FFMIN(buf_size,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
507 mms->asf_header_size - read_header_size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
508 memcpy(buf, mms->asf_header + read_header_size, size_to_copy);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
509 read_header_size += size_to_copy;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
510 result += size_to_copy;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
511 dprintf(NULL, "Copied %d bytes from stored header. left: %d\n",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
512 size_to_copy, mms->asf_header_size - read_header_size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
513 if (mms->asf_header_size == read_header_size) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
514 av_freep(&mms->asf_header);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
515 mms->is_playing = 1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
516 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
517 } else if(mms->remaining_in_len) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
518 /* Read remaining packet data to buffer.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
519 * the result can not be zero because remaining_in_len is positive.*/
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
520 result = read_data(mms, buf, buf_size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
521 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
522 /* Read from network */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
523 int err = mms_safe_send_recv(mms, NULL, SC_PKT_ASF_MEDIA);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
524 if (err == 0) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
525 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
526 dprintf(NULL, "Incoming packet"
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
527 "larger than the asf packet size stated (%d>%d)\n",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
528 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
529 result= AVERROR_IO;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
530 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
531 // copy the data to the packet buffer.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
532 result = read_data(mms, buf, buf_size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
533 if (result == 0) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
534 dprintf(NULL, "read asf media paket size is zero!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
535 break;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
536 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
537 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
538 } else {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
539 dprintf(NULL, "read packet error!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
540 break;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
541 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
542 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
543 } while(!result); // only return one packet.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
544 return result;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
545 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
546
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
547 static int send_close_packet(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
548 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
549 start_command_packet(mms, CS_PKT_STREAM_CLOSE);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
550 insert_command_prefixes(mms, 1, 1);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
551
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
552 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
553 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
554
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
555 /** Close the MMSH/MMST connection */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
556 static int mms_close(URLContext *h)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
557 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
558 MMSContext *mms = (MMSContext *)h->priv_data;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
559
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
560 if(mms->mms_hd) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
561 send_close_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
562 url_close(mms->mms_hd);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
563 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
564
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
565 /* free all separately allocated pointers in mms */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
566 av_free(mms->asf_header);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
567 av_freep(&h->priv_data);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
568
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
569 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
570 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
571
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
572 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
573 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
574 MMSContext *mms;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
575 int port, err;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
576 char tcpname[256];
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 h->is_streamed = 1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
579 mms = h->priv_data = av_mallocz(sizeof(MMSContext));
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
580 if (!h->priv_data)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
581 return AVERROR(ENOMEM);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
582
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
583 // only for MMS over TCP, so set proto = NULL
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
584 ff_url_split(NULL, 0, NULL, 0,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
585 mms->host, sizeof(mms->host), &port, mms->path,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
586 sizeof(mms->path), uri);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
587
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
588 if(port<0)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
589 port = 1755; // defaut mms protocol port
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
590
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
591 // establish tcp connection.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
592 ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, mms->host, port, NULL);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
593 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
594 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
595 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
596
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
597 mms->packet_id = 3; // default, initial value.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
598 mms->header_packet_id = 2; // default, initial value.
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
599 err = mms_safe_send_recv(mms, send_startup_packet, SC_PKT_CLIENT_ACCEPTED);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
600 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
601 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
602 err = mms_safe_send_recv(mms, send_protocol_select, SC_PKT_PROTOCOL_ACCEPTED);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
603 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
604 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
605 err = mms_safe_send_recv(mms, send_media_file_request, SC_PKT_MEDIA_FILE_DETAILS);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
606 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
607 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
608 err = mms_safe_send_recv(mms, send_media_header_request, SC_PKT_HEADER_REQUEST_ACCEPTED);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
609 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
610 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
611 err = mms_safe_send_recv(mms, NULL, SC_PKT_ASF_HEADER);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
612 if (err)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
613 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
614 if((mms->incoming_flags != 0X08) && (mms->incoming_flags != 0X0C))
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
615 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
616 err = asf_header_parser(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
617 if (err) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
618 dprintf(NULL, "asf header parsed failed!\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
619 goto fail;
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 mms->header_parsed = 1;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
622
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
623 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
624 goto fail;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
625
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
626 dprintf(NULL, "Leaving open (success)\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
627 return 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
628 fail:
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
629 mms_close(h);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
630 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
631 return err;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
632 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
633
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
634 static int send_media_packet_request(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
635 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
636 start_command_packet(mms, CS_PKT_START_FROM_PKT_ID);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
637 insert_command_prefixes(mms, 1, 0x0001FFFF);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
638 bytestream_put_le64(&mms->write_out_ptr, 0); // seek timestamp
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
639 bytestream_put_le32(&mms->write_out_ptr, 0xffffffff); // unknown
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
640 bytestream_put_le32(&mms->write_out_ptr, 0xffffffff); // packet offset
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
641 bytestream_put_byte(&mms->write_out_ptr, 0xff); // max stream time limit
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
642 bytestream_put_byte(&mms->write_out_ptr, 0xff); // max stream time limit
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
643 bytestream_put_byte(&mms->write_out_ptr, 0xff); // max stream time limit
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
644 bytestream_put_byte(&mms->write_out_ptr, 0x00); // stream time limit flag
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
645
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
646 mms->packet_id++; // new packet_id
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
647 bytestream_put_le32(&mms->write_out_ptr, mms->packet_id);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
648 return send_command_packet(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
649 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
650
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
651
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
652 static void clear_stream_buffers(MMSContext *mms)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
653 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
654 mms->remaining_in_len = 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
655 mms->read_in_ptr = mms->in_buffer;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
656 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
657
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
658 /** Read ASF data through the protocol. */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
659 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
660 {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
661 /* TODO: see tcp.c:tcp_read() about a possible timeout scheme */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
662 MMSContext *mms = h->priv_data;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
663 int result = 0;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
664
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
665 /* Since we read the header at open(), this shouldn't be possible */
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
666 assert(mms->header_parsed);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
667
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
668 if (!mms->is_playing) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
669 dprintf(NULL, "mms_read() before play().\n");
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
670 clear_stream_buffers(mms);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
671 result = mms_safe_send_recv(mms, send_stream_selection_request, SC_PKT_STREAM_ID_ACCEPTED);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
672 if (result)
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
673 return result;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
674 // send media packet request
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
675 result = mms_safe_send_recv(mms, send_media_packet_request, SC_PKT_MEDIA_PKT_FOLLOWS);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
676 if (result) {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
677 return result;
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
678 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
679 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
680 return read_mms_packet(mms, buf, size);
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
681 }
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
682
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
683 URLProtocol mmst_protocol = {
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
684 "mmst",
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
685 mms_open,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
686 mms_read,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
687 NULL, // write
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
688 NULL, // seek
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
689 mms_close,
1b6a5459ff73 MMS-over-TCP protocol support. Patch by Zhentan Feng <spyfeng gmail com>.
rbultje
parents:
diff changeset
690 };