diff options
author | wm4 <wm4@nowhere> | 2013-07-07 19:40:14 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-07-07 19:42:38 +0200 |
commit | 854303ad49d188d96af8151b290162916c81c993 (patch) | |
tree | d47fc0ccd34adf47df7612c8b213d09b3816eae5 /stream | |
parent | feaa721916303c36dcd676c11ac74ecdec2db006 (diff) | |
download | mpv-854303ad49d188d96af8151b290162916c81c993.tar.bz2 mpv-854303ad49d188d96af8151b290162916c81c993.tar.xz |
Remove internal network support
This commit removes the "old" networking code in favor of libavformat's
code.
The code was still used for mp_http, udp, ftp, cddb. http has been
mapped to libavformat's http support since approximately 6 months ago.
udp and ftp have support in ffmpeg (though ftp was added only last
month). cddb support is removed with this commit - it's probably not
important and rarely used if at all, so we don't care about it.
Diffstat (limited to 'stream')
-rw-r--r-- | stream/asf_mmst_streaming.c | 686 | ||||
-rw-r--r-- | stream/asf_mmst_streaming.h | 26 | ||||
-rw-r--r-- | stream/asf_streaming.c | 855 | ||||
-rw-r--r-- | stream/cookies.c | 86 | ||||
-rw-r--r-- | stream/cookies.h | 4 | ||||
-rw-r--r-- | stream/http.c | 966 | ||||
-rw-r--r-- | stream/http.h | 70 | ||||
-rw-r--r-- | stream/network.c | 455 | ||||
-rw-r--r-- | stream/network.h | 84 | ||||
-rw-r--r-- | stream/stream.c | 76 | ||||
-rw-r--r-- | stream/stream.h | 29 | ||||
-rw-r--r-- | stream/stream_cdda.c | 32 | ||||
-rw-r--r-- | stream/stream_cddb.c | 902 | ||||
-rw-r--r-- | stream/stream_ftp.c | 520 | ||||
-rw-r--r-- | stream/stream_lavf.c | 3 | ||||
-rw-r--r-- | stream/stream_udp.c | 105 | ||||
-rw-r--r-- | stream/tcp.c | 279 | ||||
-rw-r--r-- | stream/tcp.h | 35 | ||||
-rw-r--r-- | stream/udp.c | 201 | ||||
-rw-r--r-- | stream/udp.h | 30 | ||||
-rw-r--r-- | stream/url.c | 506 | ||||
-rw-r--r-- | stream/url.h | 55 |
22 files changed, 9 insertions, 5996 deletions
diff --git a/stream/asf_mmst_streaming.c b/stream/asf_mmst_streaming.c deleted file mode 100644 index 98c386d11d..0000000000 --- a/stream/asf_mmst_streaming.c +++ /dev/null @@ -1,686 +0,0 @@ -/* - * MMST implementation taken from the xine-mms plugin made by - * Major MMS (http://geocities.com/majormms/). - * Ported to MPlayer by Abhijeet Phatak <abhijeetphatak@yahoo.com>. - * - * Information about the MMS protocol can be found at http://get.to/sdp - * - * copyright (C) 2002 Abhijeet Phatak <abhijeetphatak@yahoo.com> - * copyright (C) 2002 the xine project - * copyright (C) 2000-2001 major mms - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <inttypes.h> - -#include "config.h" -#include "core/options.h" -#include "core/mp_msg.h" - -#if HAVE_WINSOCK2_H -#include <winsock2.h> -#endif - -#ifdef CONFIG_ICONV -#include <iconv.h> -#endif - -#include "url.h" -#include "demux/asf.h" - -#include "stream.h" -#include "asf_mmst_streaming.h" -#include "network.h" -#include "tcp.h" - -extern int audio_id; -extern int video_id; - -#define BUF_SIZE 102400 -#define HDR_BUF_SIZE 8192 -#define MAX_STREAMS 20 - -typedef struct -{ - uint8_t buf[BUF_SIZE]; - int num_bytes; - -} command_t; - -static int seq_num; -static int num_stream_ids; -static int stream_ids[MAX_STREAMS]; - -static int get_data (int s, char *buf, size_t count); - -static void put_32 (command_t *cmd, uint32_t value) -{ - cmd->buf[cmd->num_bytes ] = value % 256; - value = value >> 8; - cmd->buf[cmd->num_bytes+1] = value % 256 ; - value = value >> 8; - cmd->buf[cmd->num_bytes+2] = value % 256 ; - value = value >> 8; - cmd->buf[cmd->num_bytes+3] = value % 256 ; - - cmd->num_bytes += 4; -} - -static uint32_t get_32 (unsigned char *cmd, int offset) -{ - uint32_t ret; - - ret = cmd[offset] ; - ret |= cmd[offset+1]<<8 ; - ret |= cmd[offset+2]<<16 ; - ret |= cmd[offset+3]<<24 ; - - return ret; -} - -static void send_command (int s, int command, uint32_t switches, - uint32_t extra, int length, - char *data) -{ - command_t cmd; - int len8; - - len8 = (length + 7) / 8; - - cmd.num_bytes = 0; - - put_32 (&cmd, 0x00000001); /* start sequence */ - put_32 (&cmd, 0xB00BFACE); /* #-)) */ - put_32 (&cmd, len8*8 + 32); - put_32 (&cmd, 0x20534d4d); /* protocol type "MMS " */ - put_32 (&cmd, len8 + 4); - put_32 (&cmd, seq_num); - seq_num++; - put_32 (&cmd, 0x0); /* unknown */ - put_32 (&cmd, 0x0); - put_32 (&cmd, len8+2); - put_32 (&cmd, 0x00030000 | command); /* dir | command */ - put_32 (&cmd, switches); - put_32 (&cmd, extra); - - memcpy (&cmd.buf[48], data, length); - if (length & 7) - memset(&cmd.buf[48 + length], 0, 8 - (length & 7)); - - if (send (s, cmd.buf, len8*8+48, 0) != (len8*8+48)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"write error\n"); - } -} - -#ifdef CONFIG_ICONV -static iconv_t url_conv; -#endif - -static void string_utf16(char *dest, char *src, int len) { - int i; -#ifdef CONFIG_ICONV - size_t len1, len2; - char *ip, *op; - - if (url_conv != (iconv_t)(-1)) - { - memset(dest, 0, 1000); - len1 = len; len2 = 1000; - ip = src; op = dest; - - iconv(url_conv, &ip, &len1, &op, &len2); - } - else - { -#endif - if (len > 499) len = 499; - for (i=0; i<len; i++) { - dest[i*2] = src[i]; - dest[i*2+1] = 0; - } - /* trailing zeroes */ - dest[i*2] = 0; - dest[i*2+1] = 0; -#ifdef CONFIG_ICONV - } -#endif -} - -static void get_answer (int s) -{ - char data[BUF_SIZE]; - int command = 0x1b; - - while (command == 0x1b) { - int len; - - len = recv (s, data, BUF_SIZE, 0) ; - if (!len) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"\nAlert! EOF\n"); - return; - } - - command = get_32 (data, 36) & 0xFFFF; - - if (command == 0x1b) - send_command (s, 0x1b, 0, 0, 0, data); - } -} - -static int get_data (int s, char *buf, size_t count) -{ - ssize_t len; - size_t total = 0; - - while (total < count) { - - len = recv (s, &buf[total], count-total, 0); - - if (len<=0) { - perror ("read error:"); - return 0; - } - - total += len; - - if (len != 0) { -// mp_msg(MSGT_NETWORK,MSGL_INFO,"[%d/%d]", total, count); - fflush (stdout); - } - - } - - return 1; - -} - -static int get_header (int s, uint8_t *header, streaming_ctrl_t *streaming_ctrl) -{ - unsigned char pre_header[8]; - int header_len; - - header_len = 0; - - while (1) { - if (!get_data (s, pre_header, 8)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"pre-header read failed\n"); - return 0; - } - if (pre_header[4] == 0x02) { - - int packet_len; - - packet_len = (pre_header[7] << 8 | pre_header[6]) - 8; - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"asf header packet detected, len=%d\n", packet_len); - - if (packet_len < 0 || packet_len > HDR_BUF_SIZE - header_len) { - mp_tmsg(MSGT_NETWORK, MSGL_FATAL, "Invalid header size, giving up.\n"); - return 0; - } - - if (!get_data (s, &header[header_len], packet_len)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"Header data read failed.\n"); - return 0; - } - - header_len += packet_len; - - if ( (header[header_len-1] == 1) && (header[header_len-2]==1)) { - - - if( streaming_bufferize( streaming_ctrl, header, header_len )<0 ) { - return -1; - } - - // mp_msg(MSGT_NETWORK,MSGL_INFO,"get header packet finished\n"); - - return header_len; - - } - - } else { - - int32_t packet_len; - int command; - char data[BUF_SIZE]; - - if (!get_data (s, (char*)&packet_len, 4)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"packet_len read failed.\n"); - return 0; - } - - packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4; - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"command packet detected, len=%d\n", packet_len); - - if (packet_len < 0 || packet_len > BUF_SIZE) { - mp_tmsg(MSGT_NETWORK, MSGL_FATAL, - "Invalid RTSP packet size, giving up.\n"); - return 0; - } - - if (!get_data (s, data, packet_len)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"Command data read failed.\n"); - return 0; - } - - command = get_32 (data, 24) & 0xFFFF; - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"command: %02x\n", command); - - if (command == 0x1b) - send_command (s, 0x1b, 0, 0, 0, data); - - } - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"get header packet succ\n"); - } -} - -static int interp_header (uint8_t *header, int header_len) -{ - int i; - int packet_length=-1; - - /* - * parse header - */ - - i = 30; - while (i<header_len) { - - uint64_t guid_1, guid_2, length; - - guid_2 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8) - | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24) - | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40) - | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56); - i += 8; - - guid_1 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8) - | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24) - | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40) - | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56); - i += 8; - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"guid found: %016llx%016llx\n", guid_1, guid_2); - - length = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8) - | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24) - | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40) - | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56); - - i += 8; - - if ( (guid_1 == 0x6cce6200aa00d9a6ULL) && (guid_2 == 0x11cf668e75b22630ULL) ) { - mp_tmsg(MSGT_NETWORK,MSGL_INFO,"header object\n"); - } else if ((guid_1 == 0x6cce6200aa00d9a6ULL) && (guid_2 == 0x11cf668e75b22636ULL)) { - mp_tmsg(MSGT_NETWORK,MSGL_INFO,"data object\n"); - } else if ((guid_1 == 0x6553200cc000e48eULL) && (guid_2 == 0x11cfa9478cabdca1ULL)) { - - packet_length = get_32(header, i+92-24); - - mp_tmsg(MSGT_NETWORK,MSGL_INFO,"file object, packet length = %d (%d)\n", - packet_length, get_32(header, i+96-24)); - - - } else if ((guid_1 == 0x6553200cc000e68eULL) && (guid_2 == 0x11cfa9b7b7dc0791ULL)) { - - int stream_id = header[i+48] | header[i+49] << 8; - - mp_tmsg(MSGT_NETWORK,MSGL_INFO,"stream object, stream ID: %d\n", stream_id); - - if (num_stream_ids < MAX_STREAMS) { - stream_ids[num_stream_ids] = stream_id; - num_stream_ids++; - } else { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"Too many IDs, stream skipped."); - } - - } else { -#if 0 - int b = i; - printf ("unknown object (guid: %016llx, %016llx, len: %lld)\n", guid_1, guid_2, length); - for (; b < length; b++) - { - if (isascii(header[b]) || isalpha(header[b])) - printf("%c ", header[b]); - else - printf("%x ", header[b]); - } - printf("\n"); -#else - mp_tmsg(MSGT_NETWORK,MSGL_WARN,"unknown object\n"); -#endif - } - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"length : %lld\n", length); - - i += length-24; - - } - - return packet_length; - -} - - -static int get_media_packet (int s, int padding, streaming_ctrl_t *stream_ctrl) { - unsigned char pre_header[8]; - char data[BUF_SIZE]; - - if (!get_data (s, pre_header, 8)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"pre-header read failed\n"); - return 0; - } - -// for (i=0; i<8; i++) -// mp_msg(MSGT_NETWORK,MSGL_INFO,"pre_header[%d] = %02x (%d)\n", -// i, pre_header[i], pre_header[i]); - - if (pre_header[4] == 0x04) { - - int packet_len; - - packet_len = (pre_header[7] << 8 | pre_header[6]) - 8; - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"asf media packet detected, len=%d\n", packet_len); - - if (packet_len < 0 || packet_len > BUF_SIZE) { - mp_tmsg(MSGT_NETWORK, MSGL_FATAL, "Invalid RTSP packet size, giving up.\n"); - return 0; - } - - if (!get_data (s, data, packet_len)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"Media data read failed.\n"); - return 0; - } - - streaming_bufferize(stream_ctrl, data, padding); - - } else { - - int32_t packet_len; - int command; - - if (!get_data (s, (char*)&packet_len, 4)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"packet_len read failed.\n"); - return 0; - } - - packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4; - - if (packet_len < 0 || packet_len > BUF_SIZE) { - mp_tmsg(MSGT_NETWORK,MSGL_FATAL,"Invalid RTSP packet size, giving up.\n"); - return 0; - } - - if (!get_data (s, data, packet_len)) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"Command data read failed.\n"); - return 0; - } - - if ( (pre_header[7] != 0xb0) || (pre_header[6] != 0x0b) - || (pre_header[5] != 0xfa) || (pre_header[4] != 0xce) ) { - - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"missing signature\n"); - return -1; - } - - command = get_32 (data, 24) & 0xFFFF; - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"\ncommand packet detected, len=%d cmd=0x%X\n", packet_len, command); - - if (command == 0x1b) - send_command (s, 0x1b, 0, 0, 0, data); - else if (command == 0x1e) { - mp_tmsg(MSGT_NETWORK,MSGL_INFO,"Everything done. Thank you for downloading a media file containing proprietary and patented technology.\n"); - return 0; - } - else if (command == 0x21 ) { - // Looks like it's new in WMS9 - // Unknown command, but ignoring it seems to work. - return 0; - } - else if (command != 0x05) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"unknown command %02x\n",command); - return -1; - } - } - -// mp_msg(MSGT_NETWORK,MSGL_INFO,"get media packet succ\n"); - - return 1; -} - - -static int packet_length1; - -static int asf_mmst_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) -{ - int len; - - while( stream_ctrl->buffer_size==0 ) { - // buffer is empty - fill it! - int ret = get_media_packet( fd, packet_length1, stream_ctrl); - if( ret<0 ) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"get_media_packet error : %s\n",strerror(errno)); - return -1; - } else if (ret==0) //EOF? - return ret; - } - - len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos; - if(len>size) len=size; - memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len ); - stream_ctrl->buffer_pos += len; - if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) { - free( stream_ctrl->buffer ); - stream_ctrl->buffer = NULL; - stream_ctrl->buffer_size = 0; - stream_ctrl->buffer_pos = 0; - } - return len; - -} - -static int asf_mmst_streaming_seek( int fd, int64_t pos, streaming_ctrl_t *streaming_ctrl ) -{ - return -1; - // Shut up gcc warning - fd++; - pos++; - streaming_ctrl=NULL; -} - -int asf_mmst_streaming_start(stream_t *stream) -{ - char str[1024]; - char data[BUF_SIZE]; - uint8_t asf_header[HDR_BUF_SIZE]; - int asf_header_len; - int i, packet_length; - char *path, *unescpath; - URL_t *url1 = stream->streaming_ctrl->url; - int s = stream->fd; - - if( s>0 ) { - closesocket( stream->fd ); - stream->fd = -1; - } - - /* parse url */ - path = strchr(url1->file,'/') + 1; - - /* mmst filename are not url_escaped by MS MediaPlayer and are expected as - * "plain text" by the server, so need to decode it here - */ - unescpath=malloc(strlen(path)+1); - if (!unescpath) { - mp_tmsg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed.\n"); - return -1; - } - url_unescape_string(unescpath,path); - path=unescpath; - - - if( url1->port==0 ) { - url1->port=1755; - } - s = connect2Server( url1->hostname, url1->port, 1); - if( s<0 ) { - free(path); - return s; - } - mp_tmsg(MSGT_NETWORK,MSGL_INFO,"Connected\n"); - - seq_num=0; - - /* - * Send the initial connect info including player version no. Client GUID (random) and the host address being connected to. - * This command is sent at the very start of protocol initiation. It sends local information to the serve - * cmd 1 0x01 - * */ - - /* prepare for the url encoding conversion */ -#ifdef CONFIG_ICONV - url_conv = iconv_open("UTF-16LE", "UTF-8"); -#endif - - snprintf (str, 1023, "\034\003NSPlayer/7.0.0.1956; {33715801-BAB3-9D85-24E9-03B90328270A}; Host: %s", url1->hostname); - string_utf16 (data, str, strlen(str)); -// send_command(s, commandno ....) - send_command (s, 1, 0, 0x0004000b, strlen(str)*2+2, data); - - recv (s, data, BUF_SIZE, 0) ; - - /*This sends details of the local machine IP address to a Funnel system at the server. - * Also, the TCP or UDP transport selection is sent. - * - * here 192.168.0.1 is local ip address TCP/UDP states the tronsport we r using - * and 1037 is the local TCP or UDP socket number - * cmd 2 0x02 - * */ - - string_utf16 (&data[8], "\002\000\\\\192.168.0.1\\TCP\\1037", 24); - memset (data, 0, 8); - send_command (s, 2, 0, 0, 24*2+10, data); - - recv (s, data, BUF_SIZE, 0) ; - - /* This command sends file path (at server) and file name request to the server. - * 0x5 */ - - string_utf16 (&data[8], path, strlen(path)); - memset (data, 0, 8); - send_command (s, 5, 0, 0, strlen(path)*2+10, data); - free(path); - - get_answer (s); - - /* The ASF header chunk request. Includes ?session' variable for pre header value. - * After this command is sent, - * the server replies with 0x11 command and then the header chunk with header data follows. - * 0x15 */ - - memset (data, 0, 40); - data[32] = 2; - - send_command (s, 0x15, 1, 0, 40, data); - - num_stream_ids = 0; - /* get_headers(s, asf_header); */ - - asf_header_len = get_header (s, asf_header, stream->streaming_ctrl); -// mp_msg(MSGT_NETWORK,MSGL_INFO,"---------------------------------- asf_header %d\n",asf_header); - if (asf_header_len==0) { //error reading header - closesocket(s); - return -1; - } - packet_length = interp_header (asf_header, asf_header_len); - - - /* - * This command is the media stream MBR selector. Switches are always 6 bytes in length. - * After all switch elements, data ends with bytes [00 00] 00 20 ac 40 [02]. - * Where: - * [00 00] shows 0x61 0x00 (on the first 33 sent) or 0xff 0xff for ASF files, and with no ending data for WMV files. - * It is not yet understood what all this means. - * And the last [02] byte is probably the header ?session' value. - * - * 0x33 */ - - memset (data, 0, 40); - - int audio_id = stream->opts->audio_id; - if (audio_id > 0) { - data[2] = 0xFF; - data[3] = 0xFF; - data[4] = audio_id; - send_command(s, 0x33, num_stream_ids, 0xFFFF | audio_id << 16, 8, data); - } else { - for (i=1; i<num_stream_ids; i++) { - data [ (i-1) * 6 + 2 ] = 0xFF; - data [ (i-1) * 6 + 3 ] = 0xFF; - data [ (i-1) * 6 + 4 ] = stream_ids[i]; - data [ (i-1) * 6 + 5 ] = 0x00; - } - - send_command (s, 0x33, num_stream_ids, 0xFFFF | stream_ids[0] << 16, (num_stream_ids-1)*6+2 , data); - } - - get_answer (s); - - /* Start sending file from packet xx. - * This command is also used for resume downloads or requesting a lost packet. - * Also used for seeking by sending a play point value which seeks to the media time point. - * Includes ?session' value in pre header and the maximum media stream time. - * 0x07 */ - - memset (data, 0, 40); - - for (i=8; i<16; i++) - data[i] = 0xFF; - - data[20] = 0x04; - - send_command (s, 0x07, 1, 0xFFFF | stream_ids[0] << 16, 24, data); - - stream->fd = s; - stream->streaming_ctrl->streaming_read = asf_mmst_streaming_read; - stream->streaming_ctrl->streaming_seek = asf_mmst_streaming_seek; - stream->streaming_ctrl->status = streaming_playing_e; - stream->streaming = true; - - packet_length1 = packet_length; - mp_msg(MSGT_NETWORK,MSGL_INFO,"mmst packet_length = %d\n", packet_length); - -#ifdef CONFIG_ICONV - if (url_conv != (iconv_t)(-1)) - iconv_close(url_conv); -#endif - - return 0; -} diff --git a/stream/asf_mmst_streaming.h b/stream/asf_mmst_streaming.h deleted file mode 100644 index 204cf0a450..0000000000 --- a/stream/asf_mmst_streaming.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPLAYER_ASF_MMST_STREAMING_H -#define MPLAYER_ASF_MMST_STREAMING_H - -#include "stream.h" - -int asf_mmst_streaming_start(stream_t *stream); - -#endif /* MPLAYER_ASF_MMST_STREAMING_H */ diff --git a/stream/asf_streaming.c b/stream/asf_streaming.c deleted file mode 100644 index 862d7c3177..0000000000 --- a/stream/asf_streaming.c +++ /dev/null @@ -1,855 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <limits.h> - -#include <libavutil/intreadwrite.h> - -#include "config.h" -#include "core/mp_msg.h" -#include "core/options.h" - -#if HAVE_WINSOCK2_H -#include <winsock2.h> -#endif - -#include "url.h" -#include "http.h" -#include "demux/asf.h" - -#include "stream.h" -#include "demux/demux.h" -#include "asf_mmst_streaming.h" -#include "network.h" -#include "tcp.h" - -#include "demux/asfguid.h" - -static int asf_http_streaming_start(stream_t *stream, int *demuxer_type); - -static int asf_read_wrapper(int fd, void *buffer, int len, streaming_ctrl_t *stream_ctrl) { - uint8_t *buf = buffer; - while (len > 0) { - int got = nop_streaming_read(fd, buf, len, stream_ctrl); - if (got <= 0) { - mp_tmsg(MSGT_NETWORK, MSGL_ERR, "Error while reading network stream.\n"); - return got; - } - buf += got; - len -= got; - } - return 1; -} - -// We can try several protocol for asf streaming -// * First we can try TCP, but if there is a proxy for -// internet connection, the TCP connection will not get -// through -// * Then we can try HTTP. -// -// Note: Using WMP sequence MMST and then HTTP. - -static int asf_streaming_start( stream_t *stream, int *demuxer_type) { - char *proto = stream->streaming_ctrl->url->protocol; - int fd = -1; - int port = stream->streaming_ctrl->url->port; - - //Is protocol mms or mmst? - if (!strcasecmp(proto, "mp_mmst") || !strcasecmp(proto, "mp_mms")) - { - mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/TCP...\n"); - fd = asf_mmst_streaming_start( stream ); - stream->streaming_ctrl->url->port = port; - if( fd>-1 ) return fd; - mp_msg(MSGT_NETWORK,MSGL_V," ===> ASF/TCP failed\n"); - if( fd==-2 ) return -1; - } - - //Is protocol http, http_proxy, or mms? - if (!strcasecmp(proto, "mp_http_proxy") || !strcasecmp(proto, "mp_http") || - !strcasecmp(proto, "mp_mms") || !strcasecmp(proto, "mp_mmsh") || - !strcasecmp(proto, "mp_mmshttp")) - { - mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/HTTP...\n"); - fd = asf_http_streaming_start( stream, demuxer_type ); - stream->streaming_ctrl->url->port = port; - if( fd>-1 ) return fd; - mp_msg(MSGT_NETWORK,MSGL_V," ===> ASF/HTTP failed\n"); - if( fd==-2 ) return -1; - } - - //everything failed - return -1; -} - -static int asf_streaming(ASF_stream_chunck_t *stream_chunck, int *drop_packet ) { -/* -printf("ASF stream chunck size=%d\n", stream_chunck->size); -printf("length: %d\n", length ); -printf("0x%02X\n", stream_chunck->type ); -*/ - if( drop_packet!=NULL ) *drop_packet = 0; - - if( stream_chunck->size<8 ) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"Ahhhh, stream_chunck size is too small: %d\n", stream_chunck->size); - return -1; - } - if( stream_chunck->size!=stream_chunck->size_confirm ) { - mp_tmsg(MSGT_NETWORK,MSGL_ERR,"size_confirm mismatch!: %d %d\n", stream_chunck->size, stream_chunck->size_confirm); - return -1; - } -/* - printf(" type: 0x%02X\n", stream_chunck->type ); - printf(" size: %d (0x%02X)\n", stream_chunck->size, stream_chunck->size ); - printf(" sequence_number: 0x%04X\n", stream_chunck->sequence_number ); - printf(" unknown: 0x%02X\n", stream_chunck->unknown ); - printf(" size_confirm: 0x%02X\n", stream_chunck->size_confirm ); -*/ - switch(stream_chunck->type) { - case ASF_STREAMING_CLEAR: // $C Clear ASF configuration - mp_msg(MSGT_NETWORK,MSGL_V,"=====> Clearing ASF stream configuration!\n"); - if( drop_packet!=NULL ) *drop_packet = 1; - return stream_chunck->size; - break; - case ASF_STREAMING_DATA: // $D Data follows -// printf("=====> Data follows\n"); - break; - case ASF_STREAMING_END_TRANS: // $E Transfer complete - mp_msg(MSGT_NETWORK,MSGL_V,"=====> Transfer complete\n"); - if( drop_packet!=NULL ) *drop_packet = 1; - return stream_chunck->size; - break; - case ASF_STREAMING_HEADER: // $H ASF header chunk follows - mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF header chunk follows\n"); - break; - default: - mp_msg(MSGT_NETWORK,MSGL_V,"=====> Unknown stream type 0x%x\n", stream_chunck->type ); - } - return stream_chunck->size+4; -} - -static void close_s(stream_t *stream) { - closesocket(stream->fd); - stream->fd=-1; -} - -static int max_idx(int s_count, int *s_rates, int bound) { - int i, best = -1, rate = -1; - for (i = 0; i < s_count; i++) { - if (s_rates[i] > rate && s_rates[i] <= bound) { - rate = s_rates[i]; - best = i; - } - } - return best; -} - -static int asf_streaming_parse_header(stream_t *s, int fd) { - streaming_ctrl_t* streaming_ctrl = s->streaming_ctrl; - ASF_stream_chunck_t chunk; - asf_http_streaming_ctrl_t* asf_ctrl = streaming_ctrl->data; - char* buffer=NULL, *chunk_buffer=NULL; - int i,r,size,pos = 0; - int start; - int buffer_size = 0; - int chunk_size2read = 0; - int bw = streaming_ctrl->bandwidth; - int *v_rates = NULL, *a_rates = NULL; - int v_rate = 0, a_rate = 0, a_idx = -1, v_idx = -1; - - if(asf_ctrl == NULL) return -1; - - // The ASF header can be in several network chunks. For example if the content description - // is big, the ASF header will be split in 2 network chunk. - // So we need to retrieve all the chunk before starting to parse the header. - do { - if (asf_read_wrapper(fd, &chunk, sizeof(ASF_stream_chunck_t), streaming_ctrl) <= 0) |