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

📄 asf.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 3 页
字号:
                    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 + -