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

📄 linux_dvb.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 3 页
字号:
static fe_guard_interval_t DecodeGuardInterval( access_t *p_access ){    vlc_value_t         val;    fe_guard_interval_t fe_guard = 0;    var_Get( p_access, "dvb-guard", &val );    msg_Dbg( p_access, "using guard=%d", val.i_int );    switch( val.i_int )    {        case 0: fe_guard = GUARD_INTERVAL_AUTO; break;        case 4: fe_guard = GUARD_INTERVAL_1_4; break;        case 8: fe_guard = GUARD_INTERVAL_1_8; break;        case 16: fe_guard = GUARD_INTERVAL_1_16; break;        case 32: fe_guard = GUARD_INTERVAL_1_32; break;        default:            msg_Dbg( p_access, "terrestrial dvb has guard interval not set, using auto");            fe_guard = GUARD_INTERVAL_AUTO;            break;    }    return fe_guard;}static fe_hierarchy_t DecodeHierarchy( access_t *p_access ){    vlc_value_t         val;    fe_hierarchy_t      fe_hierarchy = 0;    var_Get( p_access, "dvb-hierarchy", &val );    msg_Dbg( p_access, "using hierarchy=%d", val.i_int );    switch( val.i_int )    {        case -1: fe_hierarchy = HIERARCHY_NONE; break;        case 0: fe_hierarchy = HIERARCHY_AUTO; break;        case 1: fe_hierarchy = HIERARCHY_1; break;        case 2: fe_hierarchy = HIERARCHY_2; break;        case 4: fe_hierarchy = HIERARCHY_4; break;        default:            msg_Dbg( p_access, "terrestrial dvb has hierarchy not set, using auto");            fe_hierarchy = HIERARCHY_AUTO;            break;    }    return fe_hierarchy;}static int FrontendSetOFDM( access_t * p_access ){    access_sys_t *p_sys = p_access->p_sys;    struct dvb_frontend_parameters fep;    vlc_value_t val;    int ret;    /* Prepare the fep structure */    var_Get( p_access, "dvb-frequency", &val );    fep.frequency = val.i_int;    fep.inversion = DecodeInversion( p_access );    fep.u.ofdm.bandwidth = DecodeBandwidth( p_access );    var_Get( p_access, "dvb-code-rate-hp", &val );    fep.u.ofdm.code_rate_HP = DecodeFEC( p_access, val.i_int );    var_Get( p_access, "dvb-code-rate-lp", &val );    fep.u.ofdm.code_rate_LP = DecodeFEC( p_access, val.i_int );    fep.u.ofdm.constellation = DecodeModulation( p_access );    fep.u.ofdm.transmission_mode = DecodeTransmission( p_access );    fep.u.ofdm.guard_interval = DecodeGuardInterval( p_access );    fep.u.ofdm.hierarchy_information = DecodeHierarchy( p_access );    /* Empty the event queue */    for( ; ; )    {        struct dvb_frontend_event event;        if ( ioctl( p_sys->i_frontend_handle, FE_GET_EVENT, &event ) < 0              && errno == EWOULDBLOCK )            break;    }    /* Now send it all to the frontend device */    if( (ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 )    {        msg_Err( p_access, "DVB-T: setting frontend failed (%d) %s", ret,                 strerror(errno) );        return -1;    }    return VLC_SUCCESS;}/* * Demux *//***************************************************************************** * DMXSetFilter : controls the demux to add a filter *****************************************************************************/int E_(DMXSetFilter)( access_t * p_access, int i_pid, int * pi_fd, int i_type ){    struct dmx_pes_filter_params s_filter_params;    int i_ret;    unsigned int i_adapter, i_device;    char dmx[128];    vlc_value_t val;    var_Get( p_access, "dvb-adapter", &val );    i_adapter = val.i_int;    var_Get( p_access, "dvb-device", &val );    i_device = val.i_int;    if( snprintf( dmx, sizeof(dmx), DMX, i_adapter, i_device )            >= (int)sizeof(dmx) )    {        msg_Err( p_access, "snprintf() truncated string for DMX" );        dmx[sizeof(dmx) - 1] = '\0';    }    msg_Dbg( p_access, "Opening device %s", dmx );    if( (*pi_fd = open(dmx, O_RDWR)) < 0 )    {        msg_Err( p_access, "DMXSetFilter: opening device failed (%s)",                 strerror(errno) );        return VLC_EGENERIC;    }    /* We fill the DEMUX structure : */    s_filter_params.pid     =   i_pid;    s_filter_params.input   =   DMX_IN_FRONTEND;    s_filter_params.output  =   DMX_OUT_TS_TAP;    s_filter_params.flags   =   DMX_IMMEDIATE_START;    switch ( i_type )    {   /* First device */        case 1:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO0 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_VIDEO0;            break;        case 2:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO0 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_AUDIO0;            break;        case 3:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT0 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_TELETEXT0;            break;        case 4:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE0 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_SUBTITLE0;            break;        case 5:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR0 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_PCR0;            break;        /* Second device */        case 6:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO1 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_VIDEO1;            break;        case 7:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO1 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_AUDIO1;            break;        case 8:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT1 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_TELETEXT1;            break;        case 9:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE1 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_SUBTITLE1;            break;        case 10:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR1 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_PCR1;            break;        /* Third device */        case 11:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO2 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_VIDEO2;            break;        case 12:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO2 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_AUDIO2;            break;        case 13:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT2 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_TELETEXT2;            break;        case 14:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE2 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_SUBTITLE2;            break;        case 15:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR2 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_PCR2;            break;        /* Forth device */        case 16:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO3 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_VIDEO3;            break;        case 17:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO3 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_AUDIO3;            break;        case 18:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT3 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_TELETEXT3;            break;        case 19:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE3 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_SUBTITLE3;            break;        case 20:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR3 for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_PCR3;            break;        /* Usually used by Nova cards */        case 21:        default:            msg_Dbg(p_access, "DMXSetFilter: DMX_PES_OTHER for PID %d", i_pid);            s_filter_params.pes_type = DMX_PES_OTHER;            break;    }    /* We then give the order to the device : */    if( (i_ret = ioctl( *pi_fd, DMX_SET_PES_FILTER, &s_filter_params )) < 0 )    {        msg_Err( p_access, "DMXSetFilter: failed with %d (%s)", i_ret,                 strerror(errno) );        return VLC_EGENERIC;    }    return VLC_SUCCESS;}/***************************************************************************** * DMXUnsetFilter : removes a filter *****************************************************************************/int E_(DMXUnsetFilter)( access_t * p_access, int i_fd ){    int i_ret;    if( (i_ret = ioctl( i_fd, DMX_STOP )) < 0 )    {        msg_Err( p_access, "DMX_STOP failed for demux (%d) %s",                 i_ret, strerror(errno) );        return i_ret;    }    msg_Dbg( p_access, "DMXUnsetFilter: closing demux %d", i_fd );    close( i_fd );    return VLC_SUCCESS;}/* * DVR device *//***************************************************************************** * DVROpen : *****************************************************************************/int E_(DVROpen)( access_t * p_access ){    access_sys_t *p_sys = p_access->p_sys;    unsigned int i_adapter, i_device;    char dvr[128];    vlc_value_t val;    var_Get( p_access, "dvb-adapter", &val );    i_adapter = val.i_int;    var_Get( p_access, "dvb-device", &val );    i_device = val.i_int;    if( snprintf( dvr, sizeof(dvr), DVR, i_adapter, i_device )            >= (int)sizeof(dvr) )    {        msg_Err( p_access, "snprintf() truncated string for DVR" );        dvr[sizeof(dvr) - 1] = '\0';    }    msg_Dbg( p_access, "Opening device %s", dvr );    if( (p_sys->i_handle = open(dvr, O_RDONLY)) < 0 )    {        msg_Err( p_access, "DVROpen: opening device failed (%s)",                 strerror(errno) );        return VLC_EGENERIC;    }    return VLC_SUCCESS;}/***************************************************************************** * DVRClose : *****************************************************************************/void E_(DVRClose)( access_t * p_access ){    access_sys_t *p_sys = p_access->p_sys;    close( p_sys->i_handle );}/* * CAM device *//***************************************************************************** * CAMOpen : *****************************************************************************/int E_(CAMOpen)( access_t *p_access ){    access_sys_t *p_sys = p_access->p_sys;    char ca[128];    int i_adapter, i_device, i_slot;    ca_caps_t caps;    i_adapter = var_GetInteger( p_access, "dvb-adapter" );    i_device = var_GetInteger( p_access, "dvb-device" );    if( snprintf( ca, sizeof(ca), CA, i_adapter, i_device ) >= (int)sizeof(ca) )    {        msg_Err( p_access, "snprintf() truncated string for CA" );        ca[sizeof(ca) - 1] = '\0';    }    msg_Dbg( p_access, "Opening device %s", ca );    if( (p_sys->i_ca_handle = open(ca, O_RDWR | O_NONBLOCK)) < 0 )    {        msg_Err( p_access, "CAMInit: opening device failed (%s)",                 strerror(errno) );        p_sys->i_ca_handle = 0;        return VLC_EGENERIC;    }    if ( ioctl( p_sys->i_ca_handle, CA_GET_CAP, &caps ) != 0          || caps.slot_num == 0 || caps.slot_type != CA_CI_LINK )    {        msg_Err( p_access, "CAMInit: no compatible CAM module" );        close( p_sys->i_ca_handle );        p_sys->i_ca_handle = 0;        return VLC_EGENERIC;    }    p_sys->i_nb_slots = caps.slot_num;    memset( p_sys->pb_active_slot, 0, sizeof(vlc_bool_t) * MAX_CI_SLOTS );    for ( i_slot = 0; i_slot < p_sys->i_nb_slots; i_slot++ )    {        if ( ioctl( p_sys->i_ca_handle, CA_RESET, 1 << i_slot) != 0 )        {            msg_Err( p_access, "CAMInit: couldn't reset slot %d", i_slot );        }    }    msg_Dbg( p_access, "CAMInit: found a CI handler with %d slots",             p_sys->i_nb_slots );    p_sys->i_ca_timeout = 100000;    /* Wait a bit otherwise it doesn't initialize properly... */    msleep( 1000000 );    return VLC_SUCCESS;}/***************************************************************************** * CAMPoll : *****************************************************************************/int E_(CAMPoll)( access_t * p_access ){    access_sys_t *p_sys = p_access->p_sys;    if ( p_sys->i_ca_handle == 0 )    {        return VLC_EGENERIC;    }    return E_(en50221_Poll)( p_access );}/***************************************************************************** * CAMSet : *****************************************************************************/int E_(CAMSet)( access_t * p_access, dvbpsi_pmt_t *p_pmt ){    access_sys_t *p_sys = p_access->p_sys;    if ( p_sys->i_ca_handle == 0 )    {        return VLC_EGENERIC;    }    E_(en50221_SetCAPMT)( p_access, p_pmt );    return VLC_SUCCESS;}/***************************************************************************** * CAMClose : *****************************************************************************/void E_(CAMClose)( access_t * p_access ){    access_sys_t *p_sys = p_access->p_sys;    E_(en50221_End)( p_access );    if ( p_sys->i_ca_handle )    {        close( p_sys->i_ca_handle );    }}

⌨️ 快捷键说明

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