📄 asf.c
字号:
break; case VLC_FOURCC( 'w', 'm', 'a', 'l' ): tk->psz_name = "Windows Media Audio 9 Lossless"; tk->i_tag = WAVE_FORMAT_WMAL; tk->b_audio_correction = VLC_TRUE; break; /* raw codec */ case VLC_FOURCC( 'u', '8', ' ', ' ' ): tk->psz_name = "Raw audio 8bits"; tk->i_tag = WAVE_FORMAT_PCM; i_blockalign= p_input->p_fmt->audio.i_channels; i_bitspersample = 8; break; case VLC_FOURCC( 's', '1', '6', 'l' ): tk->psz_name = "Raw audio 16bits"; tk->i_tag = WAVE_FORMAT_PCM; i_blockalign= 2 * p_input->p_fmt->audio.i_channels; i_bitspersample = 16; break; case VLC_FOURCC( 's', '2', '4', 'l' ): tk->psz_name = "Raw audio 24bits"; tk->i_tag = WAVE_FORMAT_PCM; i_blockalign= 3 * p_input->p_fmt->audio.i_channels; i_bitspersample = 24; break; case VLC_FOURCC( 's', '3', '2', 'l' ): tk->psz_name = "Raw audio 32bits"; tk->i_tag = WAVE_FORMAT_PCM; i_blockalign= 4 * p_input->p_fmt->audio.i_channels; i_bitspersample = 32; break; default: return VLC_EGENERIC; } tk->i_extra = sizeof( WAVEFORMATEX ) + p_input->p_fmt->i_extra + i_extra; tk->p_extra = malloc( tk->i_extra ); bo_init( &bo, tk->p_extra, tk->i_extra ); bo_addle_u16( &bo, tk->i_tag ); bo_addle_u16( &bo, p_input->p_fmt->audio.i_channels ); bo_addle_u32( &bo, p_input->p_fmt->audio.i_rate ); bo_addle_u32( &bo, p_input->p_fmt->i_bitrate / 8 ); bo_addle_u16( &bo, i_blockalign ); tk->i_blockalign = i_blockalign; bo_addle_u16( &bo, i_bitspersample ); if( p_input->p_fmt->i_extra > 0 ) { bo_addle_u16( &bo, p_input->p_fmt->i_extra ); bo_add_mem ( &bo, p_input->p_fmt->p_extra, p_input->p_fmt->i_extra ); } else { bo_addle_u16( &bo, i_extra ); if( tk->i_tag == WAVE_FORMAT_MPEGLAYER3 ) { msg_Dbg( p_mux, "adding mp3 header" ); bo_addle_u16( &bo, 1 ); /* wId */ bo_addle_u32( &bo, 2 ); /* fdwFlags */ bo_addle_u16( &bo, 1152 ); /* nBlockSize */ bo_addle_u16( &bo, 1 ); /* nFramesPerBlock */ bo_addle_u16( &bo, 1393 ); /* nCodecDelay */ } else if( tk->i_tag == WAVE_FORMAT_MPEG ) { msg_Dbg( p_mux, "adding mp2 header" ); bo_addle_u16( &bo, 2 ); /* fwHeadLayer */ bo_addle_u32( &bo, p_input->p_fmt->i_bitrate ); bo_addle_u16( &bo, p_input->p_fmt->audio.i_channels == 2 ?1:8 ); bo_addle_u16( &bo, 0 ); /* fwHeadModeExt */ bo_addle_u16( &bo, 1 ); /* wHeadEmphasis */ bo_addle_u16( &bo, 16 ); /* fwHeadFlags */ bo_addle_u32( &bo, 0 ); /* dwPTSLow */ bo_addle_u32( &bo, 0 ); /* dwPTSHigh */ } } if( p_input->p_fmt->i_bitrate > 24000 ) { p_sys->i_bitrate += p_input->p_fmt->i_bitrate; } else { p_sys->i_bitrate += 512000; } break; } case VIDEO_ES: { tk->i_extra = 11 + sizeof( BITMAPINFOHEADER ) + p_input->p_fmt->i_extra; tk->p_extra = malloc( tk->i_extra ); bo_init( &bo, tk->p_extra, tk->i_extra ); bo_addle_u32( &bo, p_input->p_fmt->video.i_width ); bo_addle_u32( &bo, p_input->p_fmt->video.i_height ); bo_add_u8 ( &bo, 0x02 ); /* flags */ bo_addle_u16( &bo, sizeof( BITMAPINFOHEADER ) + p_input->p_fmt->i_extra ); bo_addle_u32( &bo, sizeof( BITMAPINFOHEADER ) + p_input->p_fmt->i_extra ); bo_addle_u32( &bo, p_input->p_fmt->video.i_width ); bo_addle_u32( &bo, p_input->p_fmt->video.i_height ); bo_addle_u16( &bo, 1 ); bo_addle_u16( &bo, 24 ); if( p_input->p_fmt->i_codec == VLC_FOURCC('m','p','4','v') ) { tk->psz_name = "MPEG-4 Video"; tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', 'S' ); } else if( p_input->p_fmt->i_codec == VLC_FOURCC('D','I','V','3') ) { tk->psz_name = "MSMPEG-4 V3 Video"; tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', '3' ); } else if( p_input->p_fmt->i_codec == VLC_FOURCC('D','I','V','2') ) { tk->psz_name = "MSMPEG-4 V2 Video"; tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', '2' ); } else if( p_input->p_fmt->i_codec == VLC_FOURCC('D','I','V','1') ) { tk->psz_name = "MSMPEG-4 V1 Video"; tk->i_fourcc = VLC_FOURCC( 'M', 'P', 'G', '4' ); } else if( p_input->p_fmt->i_codec == VLC_FOURCC('W','M','V','1') ) { tk->psz_name = "Windows Media Video 1"; tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '1' ); } else if( p_input->p_fmt->i_codec == VLC_FOURCC('W','M','V','2') ) { tk->psz_name = "Windows Media Video 2"; tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '2' ); } else if( p_input->p_fmt->i_codec == VLC_FOURCC('W','M','V','3') ) { tk->psz_name = "Windows Media Video 3"; tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '3' ); } else { tk->psz_name = _("Unknown Video"); tk->i_fourcc = p_input->p_fmt->i_codec; } bo_add_mem( &bo, (uint8_t*)&tk->i_fourcc, 4 ); bo_addle_u32( &bo, 0 ); bo_addle_u32( &bo, 0 ); bo_addle_u32( &bo, 0 ); bo_addle_u32( &bo, 0 ); bo_addle_u32( &bo, 0 ); if( p_input->p_fmt->i_extra > 0 ) { bo_add_mem ( &bo, p_input->p_fmt->p_extra, p_input->p_fmt->i_extra ); } if( p_input->p_fmt->i_bitrate > 50000 ) { p_sys->i_bitrate += p_input->p_fmt->i_bitrate; } else { p_sys->i_bitrate += 1000000; } break; } default: msg_Err(p_mux, "unhandled track type" ); return VLC_EGENERIC; } es_format_Copy( &tk->fmt, p_input->p_fmt ); p_sys->i_track++; return VLC_SUCCESS;}/***************************************************************************** * DelStream: *****************************************************************************/static int DelStream( sout_mux_t *p_mux, sout_input_t *p_input ){ msg_Dbg( p_mux, "removing input" ); return VLC_SUCCESS;}/***************************************************************************** * Mux: *****************************************************************************/static int Mux( sout_mux_t *p_mux ){ sout_mux_sys_t *p_sys = p_mux->p_sys; if( p_sys->b_write_header ) { block_t *out = asf_header_create( p_mux, VLC_TRUE ); out->i_flags |= BLOCK_FLAG_HEADER; sout_AccessOutWrite( p_mux->p_access, out ); p_sys->b_write_header = VLC_FALSE; } for( ;; ) { sout_input_t *p_input; asf_track_t *tk; int i_stream; mtime_t i_dts; block_t *data; block_t *pk; if( MuxGetStream( p_mux, &i_stream, &i_dts ) ) { /* not enough data */ return VLC_SUCCESS; } if( p_sys->i_dts_first < 0 ) { p_sys->i_dts_first = i_dts; } if( p_sys->i_dts_last < i_dts ) { p_sys->i_dts_last = i_dts; } p_input = p_mux->pp_inputs[i_stream]; tk = (asf_track_t*)p_input->p_sys; data = block_FifoGet( p_input->p_fifo ); if( ( pk = asf_packet_create( p_mux, tk, data ) ) ) { sout_AccessOutWrite( p_mux->p_access, pk ); } } return VLC_SUCCESS;}static int MuxGetStream( sout_mux_t *p_mux, int *pi_stream, mtime_t *pi_dts ){ mtime_t i_dts; int i_stream; int i; for( i = 0, i_dts = 0, i_stream = -1; i < p_mux->i_nb_inputs; i++ ) { sout_input_t *p_input = p_mux->pp_inputs[i]; block_t *p_data; if( p_input->p_fifo->i_depth <= 0 ) { if( p_input->p_fmt->i_cat == AUDIO_ES || p_input->p_fmt->i_cat == VIDEO_ES ) { /* We need that audio+video fifo contain at least 1 packet */ return VLC_EGENERIC; } /* SPU */ continue; } p_data = block_FifoShow( p_input->p_fifo ); if( i_stream == -1 || p_data->i_dts < i_dts ) { i_stream = i; i_dts = p_data->i_dts; } } *pi_stream = i_stream; *pi_dts = i_dts; return VLC_SUCCESS;}/**************************************************************************** * Asf header construction ****************************************************************************//**************************************************************************** * Buffer out ****************************************************************************/static void bo_init( bo_t *p_bo, uint8_t *p_buffer, int i_size ){ p_bo->i_buffer_size = i_size; p_bo->i_buffer = 0; p_bo->p_buffer = p_buffer;}static void bo_add_u8( bo_t *p_bo, uint8_t i ){ if( p_bo->i_buffer < p_bo->i_buffer_size ) { p_bo->p_buffer[p_bo->i_buffer] = i; } p_bo->i_buffer++;}static void bo_addle_u16( bo_t *p_bo, uint16_t i ){ bo_add_u8( p_bo, i &0xff ); bo_add_u8( p_bo, ( ( i >> 8) &0xff ) );}static void bo_addle_u32( bo_t *p_bo, uint32_t i ){ bo_addle_u16( p_bo, i &0xffff ); bo_addle_u16( p_bo, ( ( i >> 16) &0xffff ) );}static void bo_addle_u64( bo_t *p_bo, uint64_t i ){ bo_addle_u32( p_bo, i &0xffffffff ); bo_addle_u32( p_bo, ( ( i >> 32) &0xffffffff ) );}static void bo_add_mem( bo_t *p_bo, uint8_t *p_mem, int i_size ){ int i_copy = __MIN( i_size, p_bo->i_buffer_size - p_bo->i_buffer ); if( i_copy > 0 ) { memcpy( &p_bo->p_buffer[p_bo->i_buffer], p_mem, i_copy ); } p_bo->i_buffer += i_size;}static void bo_addle_str16( bo_t *bo, char *str ){ bo_addle_u16( bo, strlen( str ) + 1 ); for( ;; ) { uint16_t c = (uint8_t)*str++; bo_addle_u16( bo, c ); if( c == '\0' ) break; }}static void bo_addle_str16_nosize( bo_t *bo, char *str ){ for( ;; ) { uint16_t c = (uint8_t)*str++; bo_addle_u16( bo, c ); if( c == '\0' ) break; }}/**************************************************************************** * GUID definitions ****************************************************************************/static void bo_add_guid( bo_t *p_bo, const guid_t *id ){ int i; bo_addle_u32( p_bo, id->Data1 ); bo_addle_u16( p_bo, id->Data2 ); bo_addle_u16( p_bo, id->Data3 ); for( i = 0; i < 8; i++ ) { bo_add_u8( p_bo, id->Data4[i] ); }}static const guid_t asf_object_header_guid ={0x75B22630, 0x668E, 0x11CF, {0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}};static const guid_t asf_object_data_guid ={0x75B22636, 0x668E, 0x11CF, {0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}};static const guid_t asf_object_file_properties_guid ={0x8cabdca1, 0xa947, 0x11cf, {0x8e, 0xe4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}};static const guid_t asf_object_stream_properties_guid ={0xB7DC0791, 0xA9B7, 0x11CF, {0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}};static const guid_t asf_object_header_extention_guid ={0x5FBF03B5, 0xA92E, 0x11CF, {0x8E, 0xE3, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}};static const guid_t asf_object_stream_type_audio ={0xF8699E40, 0x5B4D, 0x11CF, {0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B}};static const guid_t asf_object_stream_type_video ={0xbc19efc0, 0x5B4D, 0x11CF, {0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B}};static const guid_t asf_guid_audio_conceal_none ={0x20FB5700, 0x5B55, 0x11CF, {0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B}};static const guid_t asf_guid_audio_conceal_spread ={0xBFC3CD50, 0x618F, 0x11CF, {0x8B, 0xB2, 0x00, 0xAA, 0x00, 0xB4, 0xE2, 0x20}};static const guid_t asf_guid_video_conceal_none ={0x20FB5700, 0x5B55, 0x11CF, {0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B}};static const guid_t asf_guid_reserved_1 ={0xABD3D211, 0xA9BA, 0x11cf, {0x8E, 0xE6, 0x00, 0xC0, 0x0C ,0x20, 0x53, 0x65}};static const guid_t asf_object_codec_list_guid ={0x86D15240, 0x311D, 0x11D0, {0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6}};static const guid_t asf_object_codec_list_reserved_guid ={0x86D15241, 0x311D, 0x11D0, {0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6}};static const guid_t asf_object_content_description_guid ={0x75B22633, 0x668E, 0x11CF, {0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}};static const guid_t asf_object_index_guid =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -