⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asf_mmst_streaming.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
// mmst implementation taken from the xine-mms plugin made by majormms (http://geocities.com/majormms/)// // ported to mplayer by Abhijeet Phatak <abhijeetphatak@yahoo.com>// date : 16 April 2002//// information about the mms protocol can be find at http://get.to/sdp//#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <inttypes.h>#include "config.h"#ifndef HAVE_WINSOCK2#define closesocket close#else#include <winsock2.h>#endif#ifndef USE_SETLOCALE#undef USE_ICONV#endif#ifdef USE_ICONV#include <iconv.h>#ifdef USE_LANGINFO#include <langinfo.h>#endif#endif#include "url.h"#include "asf.h"#include "stream.h"#include "network.h"#define BUF_SIZE 102400#define HDR_BUF_SIZE 8192#define MAX_STREAMS 20typedef 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)) {    printf ("write error\n");  }}#ifdef USE_ICONVstatic iconv_t url_conv;#endifstatic void string_utf16(char *dest, char *src, int len) {    int i;#ifdef USE_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 USE_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) {      printf ("\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) {//      printf ("[%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)) {      printf ("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;//      printf ("asf header packet detected, len=%d\n", packet_len);      if (packet_len < 0 || packet_len > HDR_BUF_SIZE - header_len) {        mp_msg(MSGT_NETWORK, MSGL_FATAL, "Invalid header size, giving up\n");        return 0;      }      if (!get_data (s, &header[header_len], packet_len)) {	printf ("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; 	 }     //	printf ("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)) {	printf ("packet_len read failed\n");	return 0;      }            packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;      //      printf ("command packet detected, len=%d\n", packet_len);      if (packet_len < 0 || packet_len > BUF_SIZE) {        mp_msg(MSGT_NETWORK, MSGL_FATAL,                "Invalid rtsp packet size, giving up\n");        return 0;      }            if (!get_data (s, data, packet_len)) {	printf ("command data read failed\n");	return 0;      }            command = get_32 (data, 24) & 0xFFFF;      //      printf ("command: %02x\n", command);            if (command == 0x1b) 	send_command (s, 0x1b, 0, 0, 0, data);          }//    printf ("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;    //    printf ("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) ) {      printf ("header object\n");    } else if ((guid_1 == 0x6cce6200aa00d9a6ULL) && (guid_2 == 0x11cf668e75b22636ULL)) {      printf ("data object\n");    } else if ((guid_1 == 0x6553200cc000e48eULL) && (guid_2 == 0x11cfa9478cabdca1ULL)) {      packet_length = get_32(header, i+92-24);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -