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

📄 asfheader.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
          pos += streamh->stream_size;          if (pos > hdr_len) goto len_err_out;          asf_scrambling_h=buffer[0];          asf_scrambling_w=(buffer[2]<<8)|buffer[1];          asf_scrambling_b=(buffer[4]<<8)|buffer[3];  	  asf_scrambling_w/=asf_scrambling_b;	} else {	  asf_scrambling_b=asf_scrambling_h=asf_scrambling_w=1;	}	mp_msg(MSGT_HEADER,MSGL_V,"ASF: audio scrambling: %d x %d x %d\n",asf_scrambling_h,asf_scrambling_w,asf_scrambling_b);	//if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F;        break;        }      case ASF_GUID_PREFIX_video_stream: {        sh_video_t* sh_video=new_sh_video(demuxer,streamh->stream_no & 0x7F);        unsigned int len=streamh->type_size-(4+4+1+2);	++video_streams;//        sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize);        sh_video->bih=calloc((len<sizeof(BITMAPINFOHEADER))?sizeof(BITMAPINFOHEADER):len,1);        memcpy(sh_video->bih,&buffer[4+4+1+2],len);	le2me_BITMAPINFOHEADER(sh_video->bih);        //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;        //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;        if(verbose>=1) print_video_header(sh_video->bih);        //asf_video_id=streamh.stream_no & 0x7F;	//if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F;        break;        }      }      // stream-specific data:      // stream_read(demuxer->stream,(char*) buffer,streamh.stream_size);  }  // find file header  pos = find_asf_guid(hdr, asf_file_header_guid, 0, hdr_len);  if (pos >= 0) {      ASF_file_header_t *fileh = (ASF_file_header_t *)&hdr[pos];      pos += sizeof(ASF_file_header_t);      if (pos > hdr_len) goto len_err_out;      le2me_ASF_file_header_t(fileh);      mp_msg(MSGT_HEADER, MSGL_V, "ASF: packets: %d  flags: %d  "              "max_packet_size: %d  min_packet_size: %d  max_bitrate: %d  "              "preroll: %d\n",              (int)fileh->num_packets, (int)fileh->flags,               (int)fileh->min_packet_size, (int)fileh->max_packet_size,              (int)fileh->max_bitrate, (int)fileh->preroll);      asf_packetsize=fileh->max_packet_size;      asf_packet=malloc(asf_packetsize); // !!!      asf_packetrate=fileh->max_bitrate/8.0/(double)asf_packetsize;      asf_movielength=fileh->send_duration/10000000LL;  }  // find content header  pos = find_asf_guid(hdr, asf_content_desc_guid, 0, hdr_len);  if (pos >= 0) {        ASF_content_description_t *contenth = (ASF_content_description_t *)&hdr[pos];        char *string=NULL;        pos += sizeof(ASF_content_description_t);        if (pos > hdr_len) goto len_err_out;	le2me_ASF_content_description_t(contenth);	mp_msg(MSGT_HEADER,MSGL_V,"\n");        // extract the title        if( contenth->title_size!=0 ) {          string = &hdr[pos];          pos += contenth->title_size;          if (pos > hdr_len) goto len_err_out;          if(verbose>0)            print_asf_string(" Title: ", string, contenth->title_size);	  else	    pack_asf_string(string, contenth->title_size);	  demux_info_add(demuxer, "name", string);        }        // extract the author         if( contenth->author_size!=0 ) {          string = &hdr[pos];          pos += contenth->author_size;          if (pos > hdr_len) goto len_err_out;          if(verbose>0)            print_asf_string(" Author: ", string, contenth->author_size);	  else	    pack_asf_string(string, contenth->author_size);	  demux_info_add(demuxer, "author", string);        }        // extract the copyright        if( contenth->copyright_size!=0 ) {          string = &hdr[pos];          pos += contenth->copyright_size;          if (pos > hdr_len) goto len_err_out;          if(verbose>0)            print_asf_string(" Copyright: ", string, contenth->copyright_size);	  else	    pack_asf_string(string, contenth->copyright_size);	  demux_info_add(demuxer, "copyright", string);        }        // extract the comment        if( contenth->comment_size!=0 ) {          string = &hdr[pos];          pos += contenth->comment_size;          if (pos > hdr_len) goto len_err_out;          if(verbose>0)            print_asf_string(" Comment: ", string, contenth->comment_size);	  else	    pack_asf_string(string, contenth->comment_size);	  demux_info_add(demuxer, "comments", string);        }        // extract the rating        if( contenth->rating_size!=0 ) {          string = &hdr[pos];          pos += contenth->rating_size;          if (pos > hdr_len) goto len_err_out;          if(verbose>0)            print_asf_string(" Rating: ", string, contenth->rating_size);        }	mp_msg(MSGT_HEADER,MSGL_V,"\n");  }    // find content header  pos = find_asf_guid(hdr, asf_stream_group_guid, 0, hdr_len);  if (pos >= 0) {        uint16_t stream_id, i;        uint32_t max_bitrate;        char *ptr = &hdr[pos];        mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == START ===\n");        stream_count = le2me_16(*(uint16_t*)ptr);        ptr += sizeof(uint16_t);        if (ptr > &hdr[hdr_len]) goto len_err_out;        if(stream_count > 0)              streams = (uint32_t*)malloc(2*stream_count*sizeof(uint32_t));        mp_msg(MSGT_HEADER,MSGL_V," stream count=[0x%x][%u]\n", stream_count, stream_count );        for( i=0 ; i<stream_count ; i++ ) {          stream_id = le2me_16(*(uint16_t*)ptr);          ptr += sizeof(uint16_t);          if (ptr > &hdr[hdr_len]) goto len_err_out;          memcpy(&max_bitrate, ptr, sizeof(uint32_t));// workaround unaligment bug on sparc          max_bitrate = le2me_32(max_bitrate);          ptr += sizeof(uint32_t);          if (ptr > &hdr[hdr_len]) goto len_err_out;          mp_msg(MSGT_HEADER,MSGL_V,"   stream id=[0x%x][%u]\n", stream_id, stream_id );          mp_msg(MSGT_HEADER,MSGL_V,"   max bitrate=[0x%x][%u]\n", max_bitrate, max_bitrate );          streams[2*i] = stream_id;          streams[2*i+1] = max_bitrate;        }        mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == END ===\n");  }  free(hdr);  hdr = NULL;  start = stream_tell(demuxer->stream); // start of first data chunk  stream_read(demuxer->stream, guid_buffer, 16);  if (memcmp(guid_buffer, asf_data_chunk_guid, 16) != 0) {    mp_msg(MSGT_HEADER, MSGL_FATAL, "No data chunk following header!\n");    return 0;  }  // read length of chunk  stream_read(demuxer->stream, (char *)&data_len, sizeof(data_len));  le2me_64(data_len);  demuxer->movi_start = stream_tell(demuxer->stream) + 26;  demuxer->movi_end = start + data_len;  mp_msg(MSGT_HEADER, MSGL_V, "Found movie at 0x%X - 0x%X\n",          (int)demuxer->movi_start, (int)demuxer->movi_end);if(streams) {  // stream selection is done in the network code, it shouldn't be done here  // as the servers often do not care about what we requested.#if 0  uint32_t vr = 0, ar = 0,i;#ifdef MPLAYER_NETWORK  if( demuxer->stream->streaming_ctrl!=NULL ) {	  if( demuxer->stream->streaming_ctrl->bandwidth!=0 && demuxer->stream->streaming_ctrl->data!=NULL ) {		  best_audio = ((asf_http_streaming_ctrl_t*)demuxer->stream->streaming_ctrl->data)->audio_id;		  best_video = ((asf_http_streaming_ctrl_t*)demuxer->stream->streaming_ctrl->data)->video_id;	  }  } else#endif  for(i = 0; i < stream_count; i++) {    uint32_t id = streams[2*i];    uint32_t rate = streams[2*i+1];    if(demuxer->v_streams[id] && rate > vr) {      vr = rate;      best_video = id;    } else if(demuxer->a_streams[id] && rate > ar) {      ar = rate;      best_audio = id;    }  }#endif  free(streams);  streams = NULL;}mp_msg(MSGT_HEADER,MSGL_V,"ASF: %d audio and %d video streams found\n",audio_streams,video_streams);if(!audio_streams) demuxer->audio->id=-2;  // nosoundelse if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio;if(!video_streams){    if(!audio_streams){	mp_msg(MSGT_HEADER,MSGL_ERR,"ASF: no audio or video headers found - broken file?\n");	return 0;     }    demuxer->video->id=-2; // audio-only} else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video;#if 0if(verbose){    printf("ASF duration: %d\n",(int)fileh.duration);    printf("ASF start pts: %d\n",(int)fileh.start_timestamp);    printf("ASF end pts: %d\n",(int)fileh.end_timestamp);}#endifreturn 1;len_err_out:  mp_msg(MSGT_HEADER, MSGL_FATAL, "Invalid length in ASF header!\n");err_out:  if (hdr) free(hdr);  if (streams) free(streams);  return 0;}

⌨️ 快捷键说明

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