📄 asfheader.c
字号:
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 + -