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

📄 asfheader.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
// .asf fileformat docs from http://divx.euro.ru#include <stdio.h>#include <stdlib.h>#include <unistd.h>extern int verbose; // defined in mplayer.c#include "config.h"#include "mp_msg.h"#include "stream.h"#include "demuxer.h"#include "stheader.h"#include "asf.h"#ifdef ARCH_X86#define	ASF_LOAD_GUID_PREFIX(guid)	(*(uint32_t *)(guid))#else#define	ASF_LOAD_GUID_PREFIX(guid)	\	((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0])#endif#define ASF_GUID_PREFIX_audio_stream	0xF8699E40#define ASF_GUID_PREFIX_video_stream	0xBC19EFC0#define ASF_GUID_PREFIX_audio_conceal_none 0x49f1a440#define ASF_GUID_PREFIX_audio_conceal_interleave 0xbfc3cd50#define ASF_GUID_PREFIX_header		0x75B22630#define ASF_GUID_PREFIX_data_chunk	0x75b22636#define ASF_GUID_PREFIX_index_chunk	0x33000890#define ASF_GUID_PREFIX_stream_header	0xB7DC0791#define ASF_GUID_PREFIX_header_2_0	0xD6E229D1#define ASF_GUID_PREFIX_file_header	0x8CABDCA1#define	ASF_GUID_PREFIX_content_desc	0x75b22633#define	ASF_GUID_PREFIX_stream_group	0x7bf875ce/*const char asf_audio_stream_guid[16] = {0x40, 0x9e, 0x69, 0xf8,  0x4d, 0x5b, 0xcf, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b};const char asf_video_stream_guid[16] = {0xc0, 0xef, 0x19, 0xbc,  0x4d, 0x5b, 0xcf, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b};*/const char asf_stream_header_guid[16] = {0x91, 0x07, 0xdc, 0xb7,  0xb7, 0xa9, 0xcf, 0x11, 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65};const char asf_file_header_guid[16] = {0xa1, 0xdc, 0xab, 0x8c,  0x47, 0xa9, 0xcf, 0x11, 0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65};const char asf_content_desc_guid[16] = {0x33, 0x26, 0xb2, 0x75,  0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c};const char asf_stream_group_guid[16] = {0xce, 0x75, 0xf8, 0x7b,  0x8d, 0x46, 0xd1, 0x11, 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2};const char asf_data_chunk_guid[16] = {0x36, 0x26, 0xb2, 0x75,  0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c};static ASF_header_t asfh;unsigned char* asf_packet=NULL;int asf_scrambling_h=1;int asf_scrambling_w=1;int asf_scrambling_b=1;int asf_packetsize=0;double asf_packetrate=0;int asf_movielength=0;//int i;// the variable string is modify in this functionvoid pack_asf_string(char* string, int length) {  int i,j;  if( string==NULL ) return;  for( i=0, j=0; i<length && string[i]!='\0'; i+=2, j++) {    string[j]=string[i];  }  string[j]='\0';}// the variable string is modify in this functionvoid print_asf_string(const char* name, char* string, int length) {  pack_asf_string(string, length);  mp_msg(MSGT_HEADER,MSGL_V,"%s%s\n", name, string);}static char* asf_chunk_type(unsigned char* guid) {  static char tmp[60];  char *p;  int i;  switch(ASF_LOAD_GUID_PREFIX(guid)){    case ASF_GUID_PREFIX_audio_stream:      return "guid_audio_stream";    case ASF_GUID_PREFIX_video_stream:       return "guid_video_stream";    case ASF_GUID_PREFIX_audio_conceal_none:      return "guid_audio_conceal_none";    case ASF_GUID_PREFIX_audio_conceal_interleave:      return "guid_audio_conceal_interleave";    case ASF_GUID_PREFIX_header:      return "guid_header";    case ASF_GUID_PREFIX_data_chunk:      return "guid_data_chunk";    case ASF_GUID_PREFIX_index_chunk:      return "guid_index_chunk";    case ASF_GUID_PREFIX_stream_header:      return "guid_stream_header";    case ASF_GUID_PREFIX_header_2_0:       return "guid_header_2_0";    case ASF_GUID_PREFIX_file_header:      return "guid_file_header";    case ASF_GUID_PREFIX_content_desc:      return "guid_content_desc";    default:      strcpy(tmp, "unknown guid ");      p = tmp + strlen(tmp);      for (i = 0; i < 16; i++) {	if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-';	sprintf(p, "%02x", guid[i]);	p += 2;      }      return tmp;  }}int asf_check_header(demuxer_t *demuxer){  unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};  stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj  le2me_ASF_header_t(&asfh);			// swap to machine endian//  for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n");//  for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n");  if(memcmp(asfhdrguid,asfh.objh.guid,16)){    mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: not ASF guid!\n");    return 0; // not ASF guid  }  if(asfh.cno>256){    mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asfh.cno);    return 0; // invalid header???  }  return 1;}extern void print_wave_header(WAVEFORMATEX *h);extern void print_video_header(BITMAPINFOHEADER *h);int find_asf_guid(char *buf, const char *guid, int cur_pos, int buf_len){  int i;  for (i = cur_pos; i < buf_len - 19; i++) {    if (memcmp(&buf[i], guid, 16) == 0)      return i + 16 + 8; // point after guid + length  }  return -1;}int read_asf_header(demuxer_t *demuxer){  unsigned int hdr_len = asfh.objh.size - sizeof(asfh);  char *hdr = NULL;  char guid_buffer[16];  int pos, start = stream_tell(demuxer->stream);  uint32_t* streams = NULL;  int audio_streams=0;  int video_streams=0;  uint16_t stream_count=0;  int best_video = -1;  int best_audio = -1;  uint64_t data_len;  if (hdr_len > 64 * 1024) {    mp_msg(MSGT_HEADER, MSGL_FATAL,            "FATAL: header size bigger than 64 kB (%d)!\n"            "Please contact MPlayer authors, and upload/send this file.\n",             hdr_len);    return 0;  }  hdr = malloc(hdr_len);  if (!hdr) {    mp_msg(MSGT_HEADER, MSGL_FATAL, "Could not allocate %d bytes for header\n",            hdr_len);    return 0;  }  stream_read(demuxer->stream, hdr, hdr_len);  if (stream_eof(demuxer->stream)) {    mp_msg(MSGT_HEADER, MSGL_FATAL,           "EOF while reading asf header, broken/incomplete file?\n");    goto err_out;  }  // find stream headers  pos = 0;  while ((pos = find_asf_guid(hdr, asf_stream_header_guid, pos, hdr_len)) >= 0)  {    ASF_stream_header_t *streamh = (ASF_stream_header_t *)&hdr[pos];    char *buffer;    pos += sizeof(ASF_stream_header_t);    if (pos > hdr_len) goto len_err_out;    le2me_ASF_stream_header_t(streamh);    mp_msg(MSGT_HEADER, MSGL_V, "stream type: %s\n",            asf_chunk_type(streamh->type));    mp_msg(MSGT_HEADER, MSGL_V, "stream concealment: %s\n",            asf_chunk_type(streamh->concealment));    mp_msg(MSGT_HEADER, MSGL_V, "type: %d bytes,  stream: %d bytes  ID: %d\n",            (int)streamh->type_size, (int)streamh->stream_size,            (int)streamh->stream_no);    mp_msg(MSGT_HEADER, MSGL_V, "unk1: %lX  unk2: %X\n",            (unsigned long)streamh->unk1, (unsigned int)streamh->unk2);    mp_msg(MSGT_HEADER, MSGL_V, "FILEPOS=0x%X\n", pos + start);    // type-specific data:    buffer = &hdr[pos];    pos += streamh->type_size;    if (pos > hdr_len) goto len_err_out;    switch(ASF_LOAD_GUID_PREFIX(streamh->type)){      case ASF_GUID_PREFIX_audio_stream: {        sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F);        ++audio_streams;        sh_audio->wf=calloc((streamh->type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh->type_size,1);        memcpy(sh_audio->wf,buffer,streamh->type_size);	le2me_WAVEFORMATEX(sh_audio->wf);        if(verbose>=1) print_wave_header(sh_audio->wf);	if(ASF_LOAD_GUID_PREFIX(streamh->concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){          buffer = &hdr[pos];

⌨️ 快捷键说明

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