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

📄 access.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
    msg_Dbg( p_input, "opening DVR device `%s'", psz_dvr );    if( (p_satellite->i_handle = open( psz_dvr,                                   /*O_NONBLOCK | O_LARGEFILE*/0 )) == (-1) )    {        msg_Warn( p_input, "cannot open `%s' (%s)", psz_dvr, strerror(errno) );        free( p_satellite );        return -1;    }    /* FIXME : this is from the Dreambox port. I have no idea whether it     * hurts or helps other DVB interfaces, so I just leave it here.     * Feel free to remove it if it breaks. --Meuuh */    ioctl_SetBufferSize( p_satellite->i_handle, DMX_BUFFER_SIZE );    /* Get antenna configuration options */    b_diseqc = config_GetInt( p_input, "diseqc" );    i_lnb_lof1 = config_GetInt( p_input, "lnb-lof1" );    i_lnb_lof2 = config_GetInt( p_input, "lnb-lof2" );    i_lnb_slof = config_GetInt( p_input, "lnb-slof" );    /* Initialize the Satellite Card */    if ( i_freq )    {        int i_tuner = config_GetInt( p_input, "dvb-tuner" );        msg_Dbg( p_input, "initializing Sat Card with Freq: %d, Pol: %d, "                          "FEC: %03f, Srate: %d", i_freq, b_pol, f_fec, i_srate );        if ( ioctl_SECControl( i_tuner, i_freq, b_pol, i_lnb_slof, b_diseqc ) < 0 )        {            msg_Err( p_input, "an error occurred when controling SEC" );            close( p_satellite->i_handle );            free( p_satellite );            return -1;        }        msg_Dbg( p_input, "initializing frontend device" );        switch (ioctl_SetQPSKFrontend ( i_tuner, i_freq, i_srate, f_fec,                    i_lnb_lof1, i_lnb_lof2, i_lnb_slof))        {            case -2:                msg_Err( p_input, "frontend returned an unexpected event" );                close( p_satellite->i_handle );                free( p_satellite );                return -1;                break;            case -3:                msg_Err( p_input, "frontend returned no event" );                close( p_satellite->i_handle );                free( p_satellite );                return -1;                break;            case -4:                msg_Err( p_input, "frontend: timeout when polling for event" );                close( p_satellite->i_handle );                free( p_satellite );                return -1;                break;            case -5:                msg_Err( p_input, "an error occured when polling frontend device" );                close( p_satellite->i_handle );                free( p_satellite );                return -1;                break;            case -1:                msg_Err( p_input, "frontend returned a failure event" );                close( p_satellite->i_handle );                free( p_satellite );                return -1;                break;            default:                break;        }    } /* i_freq */    msg_Dbg( p_input, "setting filter on PAT" );    AllocateDemux( p_input, 0, PAT_TYPE );    if( input_InitStream( p_input, sizeof( stream_ts_data_t ) ) == -1 )    {        msg_Err( p_input, "could not initialize stream structure" );        close( p_satellite->i_handle );        free( p_satellite );        return( -1 );    }    vlc_mutex_lock( &p_input->stream.stream_lock );    p_input->stream.b_pace_control = 1;    p_input->stream.b_seekable = 0;    p_input->stream.p_selected_area->i_tell = 0;    vlc_mutex_unlock( &p_input->stream.stream_lock );    p_input->i_mtu = SATELLITE_READ_ONCE;    p_input->stream.i_method = INPUT_METHOD_SATELLITE;    return 0;}/***************************************************************************** * Close : Close the device *****************************************************************************/void E_(Close) ( vlc_object_t *p_this ){    input_thread_t *    p_input = (input_thread_t *)p_this;    thread_sat_data_t * p_satellite = (thread_sat_data_t *)p_input->p_access_data;    msg_Dbg( p_input, "unsetting filters on all pids" );    CloseProgram( p_input );    close( p_satellite->p_demux_handles[0].i_handle );    close( p_satellite->i_handle );}/***************************************************************************** * SatelliteRead: reads data from the satellite card *****************************************************************************/static ssize_t SatelliteRead( input_thread_t * p_input, byte_t * p_buffer,                              size_t i_len ){    thread_sat_data_t * p_satellite = (thread_sat_data_t *)p_input->p_access_data;    ssize_t i_ret;    unsigned int i;    /* if not set, set filters to the PMTs */    /* This is kludgy and consumes way too much CPU power - the access     * module should have a callback from the demux when a new program     * is encountered. --Meuuh */    if ( !p_satellite->p_demux_handles[1].i_type )    {        int i_program = config_GetInt( p_input, "program" );        for( i = 0; i < p_input->stream.i_pgrm_number; i++ )        {            /* Only set a filter on the selected program : some boards             * (read: Dreambox) only have 8 filters, so you don't want to             * spend them on unwanted PMTs. --Meuuh */            if ( (!i_program || p_input->stream.pp_programs[i]->i_number == i_program) )            {                msg_Dbg( p_input, "setting filter on PMT pid %d",                         p_input->stream.pp_programs[i]->pp_es[0]->i_id );                AllocateDemux( p_input, p_input->stream.pp_programs[i]->pp_es[0]->i_id, PMT_TYPE );            }        }    }    i_ret = read( p_satellite->i_handle, p_buffer, i_len );     if( i_ret < 0 )    {#   ifdef HAVE_ERRNO_H        msg_Err( p_input, "read failed (%s)", strerror(errno) );#   else        msg_Err( p_input, "read failed" );#   endif    }     return i_ret;}/***************************************************************************** * SatelliteSetArea : Does nothing *****************************************************************************/static int SatelliteSetArea( input_thread_t * p_input, input_area_t * p_area ){    return -1;}/***************************************************************************** * SatelliteSetProgram : Sets the card filters according to the *                 selected program, *                 and makes the appropriate changes to stream structure. *****************************************************************************/int SatelliteSetProgram( input_thread_t    * p_input,                         pgrm_descriptor_t * p_new_prg ){    unsigned int i_es_index;    vlc_value_t val;    if ( p_input->stream.p_selected_program )    {        for ( i_es_index = 0 ; /* 0 should be the PMT */                i_es_index < p_input->stream.p_selected_program->                    i_es_number ;                i_es_index ++ )        {#define p_es p_input->stream.p_selected_program->pp_es[i_es_index]            if ( p_es->p_dec )            {                input_UnselectES( p_input , p_es );            }#undef p_es        }    }    msg_Dbg( p_input, "unsetting filters on all pids" );    CloseProgram( p_input );    msg_Dbg( p_input, "setting filter on PMT pid %d",             p_new_prg->pp_es[0]->i_id );    AllocateDemux( p_input, p_new_prg->pp_es[0]->i_id, PMT_TYPE );    for ( i_es_index = 1 ; i_es_index < p_new_prg->i_es_number ; i_es_index ++ )    {#define p_es p_new_prg->pp_es[i_es_index]        switch( p_es->i_cat )        {            case VIDEO_ES:                msg_Dbg(p_input, "setting filter on video ES 0x%x",                        p_es->i_id);                /* Always set the filter. This may seem a little odd, but                 * it allows you to stream the video with demuxstream                 * without having a decoder or a stream output behind.                 * The result is you'll sometimes filter a PID which you                 * don't really want, but in the most common cases it                 * should be OK. --Meuuh */                AllocateDemux( p_input, p_es->i_id, ES_TYPE );                input_SelectES( p_input , p_es );                break;            case AUDIO_ES:                msg_Dbg(p_input, "setting filter on audio ES 0x%x",                        p_es->i_id);                AllocateDemux( p_input, p_es->i_id, ES_TYPE );                input_SelectES( p_input , p_es );                break;            default:                /* Do not select private streams. This is to avoid the                 * limit of 8 filters on the Dreambox and possibly on                 * other boards. We should probably change that to                 * have the DVB subtitles, but filtering all private                 * streams including DVB tables and padding seems                 * nonsense to me. --Meuuh */#if 0                msg_Dbg(p_input, "setting filter on misc (0x%x) ES 0x%x",                        p_es->i_cat,                        p_es->i_id);                AllocateDemux( p_input, p_es->i_id, ES_TYPE );                input_SelectES( p_input , p_es );#endif                break;#undef p_es        }    }    p_input->stream.p_selected_program = p_new_prg;    /* Update the navigation variables without triggering a callback */    val.i_int = p_new_prg->i_number;    var_Change( p_input, "program", VLC_VAR_SETVALUE, &val, NULL );    return 0;}/***************************************************************************** * SatelliteSeek: does nothing (not a seekable stream *****************************************************************************/static void SatelliteSeek( input_thread_t * p_input, off_t i_off ){    ;}

⌨️ 快捷键说明

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