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

📄 nsv.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
        if( p_sys->fmt_audio.i_codec == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )        {            uint8_t h[4];            stream_Read( p_demux->s, h, 4 );            p_sys->fmt_audio.audio.i_channels = h[1];            p_sys->fmt_audio.audio.i_rate = GetWLE( &h[2] );            i_size -= 4;        }        if( p_sys->p_audio == NULL )        {            p_sys->p_audio = es_out_Add( p_demux->out, &p_sys->fmt_audio );        }        if( ( p_frame = stream_Block( p_demux->s, i_size ) ) )        {            p_frame->i_dts =            p_frame->i_pts = p_sys->i_pcr;            es_out_Send( p_demux->out, p_sys->p_audio, p_frame );        }    }    p_sys->i_pcr += p_sys->i_pcr_inc;    if( p_sys->i_time >= 0 )    {        p_sys->i_time += p_sys->i_pcr_inc;    }    return 1;}/***************************************************************************** * Control: *****************************************************************************/static int Control( demux_t *p_demux, int i_query, va_list args ){    demux_sys_t *p_sys = p_demux->p_sys;    double f, *pf;    int64_t i64, *pi64;    switch( i_query )    {        case DEMUX_GET_POSITION:            pf = (double*) va_arg( args, double* );            i64 = stream_Size( p_demux->s );            if( i64 > 0 )            {                *pf = (double)stream_Tell( p_demux->s ) / (double)i64;            }            else            {                *pf = 0.0;            }            return VLC_SUCCESS;        case DEMUX_SET_POSITION:            f = (double) va_arg( args, double );            i64 = stream_Size( p_demux->s );            es_out_Control( p_demux->out, ES_OUT_RESET_PCR );            if( stream_Seek( p_demux->s, (int64_t)(i64 * f) ) || ReSynch( p_demux ) )            {                return VLC_EGENERIC;            }            p_sys->i_time = -1; /* Invalidate time display */            return VLC_SUCCESS;        case DEMUX_GET_TIME:            pi64 = (int64_t*)va_arg( args, int64_t * );            if( p_sys->i_time < 0 )            {                *pi64 = 0;                return VLC_EGENERIC;            }            *pi64 = p_sys->i_time;            return VLC_SUCCESS;#if 0        case DEMUX_GET_LENGTH:            pi64 = (int64_t*)va_arg( args, int64_t * );            if( p_sys->i_mux_rate > 0 )            {                *pi64 = (int64_t)1000000 * ( stream_Size( p_demux->s ) / 50 ) / p_sys->i_mux_rate;                return VLC_SUCCESS;            }            *pi64 = 0;            return VLC_EGENERIC;#endif        case DEMUX_GET_FPS:            pf = (double*)va_arg( args, double * );            *pf = (double)1000000.0 / (double)p_sys->i_pcr_inc;            return VLC_SUCCESS;        case DEMUX_SET_TIME:        default:            return VLC_EGENERIC;    }}/***************************************************************************** * ReSynch: *****************************************************************************/static int ReSynch( demux_t *p_demux ){    uint8_t *p_peek;    int      i_skip;    int      i_peek;    while( !p_demux->b_die )    {        if( ( i_peek = stream_Peek( p_demux->s, &p_peek, 1024 ) ) < 8 )        {            return VLC_EGENERIC;        }        i_skip = 0;        while( i_skip < i_peek - 4 )        {            if( !strncmp( p_peek, "NSVf", 4 ) || !strncmp( p_peek, "NSVs", 4 ) )            {                if( i_skip > 0 )                {                    stream_Read( p_demux->s, NULL, i_skip );                }                return VLC_SUCCESS;            }            p_peek++;            i_skip++;        }        stream_Read( p_demux->s, NULL, i_skip );    }    return VLC_EGENERIC;}/***************************************************************************** * ReadNSVf: *****************************************************************************/static int ReadNSVf( demux_t *p_demux ){    /* demux_sys_t *p_sys = p_demux->p_sys; */    uint8_t     *p;    int         i_size;    msg_Dbg( p_demux, "new NSVf chunk" );    if( stream_Peek( p_demux->s, &p, 8 ) < 8 )    {        return VLC_EGENERIC;    }    i_size = GetDWLE( &p[4] );    msg_Dbg( p_demux, "    - size=%d", i_size );    return stream_Read( p_demux->s, NULL, i_size ) == i_size ? VLC_SUCCESS : VLC_EGENERIC;}/***************************************************************************** * ReadNSVf: *****************************************************************************/static int ReadNSVs( demux_t *p_demux ){    demux_sys_t *p_sys = p_demux->p_sys;    uint8_t      header[19];    vlc_fourcc_t fcc;    if( stream_Read( p_demux->s, header, 19 ) < 19 )    {        msg_Warn( p_demux, "cannot read" );        return VLC_EGENERIC;    }    msg_Dbg( p_demux, "new NSVs chunk" );    /* Video */    switch( ( fcc = VLC_FOURCC( header[4], header[5], header[6], header[7] ) ) )    {        case VLC_FOURCC( 'V', 'P', '3', ' ' ):        case VLC_FOURCC( 'V', 'P', '3', '1' ):            fcc = VLC_FOURCC( 'V', 'P', '3', '1' );            break;        case VLC_FOURCC( 'N', 'O', 'N', 'E' ):            break;        default:            msg_Warn( p_demux, "unknown codec" );            break;    }    if( fcc != VLC_FOURCC( 'N', 'O', 'N', 'E' ) && fcc != p_sys->fmt_video.i_codec  )    {        es_format_Init( &p_sys->fmt_video, VIDEO_ES, fcc );        p_sys->fmt_video.video.i_width = GetWLE( &header[12] );        p_sys->fmt_video.video.i_height = GetWLE( &header[14] );        if( p_sys->p_video )        {            es_out_Del( p_demux->out, p_sys->p_video );        }        p_sys->p_video = es_out_Add( p_demux->out, &p_sys->fmt_video );        msg_Dbg( p_demux, "    - video `%4.4s' %dx%d",                 (char*)&fcc,                 p_sys->fmt_video.video.i_width,                 p_sys->fmt_video.video.i_height );    }    /* Audio */    switch( ( fcc = VLC_FOURCC( header[8], header[9], header[10], header[11] ) ) )    {        case VLC_FOURCC( 'M', 'P', '3', ' ' ):            fcc = VLC_FOURCC( 'm', 'p', 'g', 'a' );            break;        case VLC_FOURCC( 'P', 'C', 'M', ' ' ):            fcc = VLC_FOURCC( 'a', 'r', 'a', 'w' );            break;        case VLC_FOURCC( 'A', 'A', 'C', ' ' ):        case VLC_FOURCC( 'A', 'A', 'C', 'P' ):            fcc = VLC_FOURCC( 'm', 'p', '4', 'a' );            break;        case VLC_FOURCC( 'N', 'O', 'N', 'E' ):            break;        default:            msg_Warn( p_demux, "unknown codec" );            break;    }    if( fcc != VLC_FOURCC( 'N', 'O', 'N', 'E' ) && fcc != p_sys->fmt_audio.i_codec )    {        msg_Dbg( p_demux, "    - audio `%4.4s'", (char*)&fcc );        if( p_sys->p_audio )        {            es_out_Del( p_demux->out, p_sys->p_audio );            p_sys->p_audio = NULL;        }        es_format_Init( &p_sys->fmt_audio, AUDIO_ES, fcc );    }    if( header[16]&0x80 )    {        /* Fractional frame rate */        switch( header[16]&0x03 )        {            case 0: /* 30 fps */                p_sys->i_pcr_inc = 33333; /* 300000/9 */                break;            case 1: /* 29.97 fps */                p_sys->i_pcr_inc = 33367; /* 300300/9 */                break;            case 2: /* 25 fps */                p_sys->i_pcr_inc = 40000; /* 360000/9 */                break;            case 3: /* 23.98 fps */                p_sys->i_pcr_inc = 41700; /* 375300/9 */                break;        }        if( header[16] < 0xc0 )            p_sys->i_pcr_inc = p_sys->i_pcr_inc * (((header[16] ^ 0x80) >> 2 ) +1 );        else            p_sys->i_pcr_inc = p_sys->i_pcr_inc / (((header[16] ^ 0xc0) >> 2 ) +1 );    }    else if( header[16] != 0 )    {        /* Integer frame rate */        p_sys->i_pcr_inc = 1000000 / header[16];    }    else    {        msg_Dbg( p_demux, "invalid fps (0x00)" );        p_sys->i_pcr_inc = 40000;    }    msg_Dbg( p_demux, "    - fps=%.3f", 1000000.0 / (double)p_sys->i_pcr_inc );    return VLC_SUCCESS;}

⌨️ 快捷键说明

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