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

📄 linux_dvb.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    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 = DecodeModulationOFDM( 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): %m", ret );        return -1;    }    return VLC_SUCCESS;}/***************************************************************************** * FrontendSetATSC : controls the FE device *****************************************************************************/static int FrontendSetATSC( access_t *p_access ){    access_sys_t *p_sys = p_access->p_sys;    struct dvb_frontend_parameters fep;    vlc_value_t val;    int i_ret;    /* Prepare the fep structure */    var_Get( p_access, "dvb-frequency", &val );    fep.frequency = val.i_int;    fep.u.vsb.modulation = DecodeModulationATSC( 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( (i_ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 )    {        msg_Err( p_access, "ATSC: setting frontend failed (%d): %m", i_ret );        return VLC_EGENERIC;    }    return VLC_SUCCESS;}/* * Demux *//***************************************************************************** * DMXSetFilter : controls the demux to add a filter *****************************************************************************/int 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 (%m)" );        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 (%m)", i_ret );        return VLC_EGENERIC;    }    return VLC_SUCCESS;}/***************************************************************************** * DMXUnsetFilter : removes a filter *****************************************************************************/int 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): %m", i_ret );        return i_ret;    }    msg_Dbg( p_access, "DMXUnsetFilter: closing demux %d", i_fd );    close( i_fd );    return VLC_SUCCESS;}/* * DVR device *//***************************************************************************** * DVROpen : *****************************************************************************/int 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 (%m)" );        return VLC_EGENERIC;    }    if( fcntl( p_sys->i_handle, F_SETFL, O_NONBLOCK ) == -1 )    {        msg_Warn( p_access, "DVROpen: couldn't set non-blocking mode (%m)" );    }    return VLC_SUCCESS;}/***************************************************************************** * DVRClose : *****************************************************************************/void DVRClose( access_t * p_access ){    access_sys_t *p_sys = p_access->p_sys;    close( p_sys->i_handle );}/* * CAM device *//***************************************************************************** * CAMOpen : *****************************************************************************/int CAMOpen( access_t *p_access ){    access_sys_t *p_sys = p_access->p_sys;    char ca[128];    int i_adapter, i_device;    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';    }    memset( &caps, 0, sizeof( ca_caps_t ));    msg_Dbg( p_access, "Opening device %s", ca );    if( (p_sys->i_ca_handle = open(ca, O_RDWR | O_NONBLOCK)) < 0 )    {        msg_Warn( p_access, "CAMInit: opening CAM device failed (%m)" );        p_sys->i_ca_handle = 0;        return VLC_EGENERIC;    }    if ( ioctl( p_sys->i_ca_handle, CA_GET_CAP, &caps ) != 0 )    {        msg_Err( p_access, "CAMInit: ioctl() error getting CAM capabilities" );        close( p_sys->i_ca_handle );        p_sys->i_ca_handle = 0;        return VLC_EGENERIC;    }    /* Output CA capabilities */    msg_Dbg( p_access, "CAMInit: CA interface with %d %s", caps.slot_num,        caps.slot_num == 1 ? "slot" : "slots" );    if ( caps.slot_type & CA_CI )        msg_Dbg( p_access, "CAMInit: CI high level interface type" );    if ( caps.slot_type & CA_CI_LINK )        msg_Dbg( p_access, "CAMInit: CI link layer level interface type" );    if ( caps.slot_type & CA_CI_PHYS )        msg_Dbg( p_access, "CAMInit: CI physical layer level interface type (not supported) " );    if ( caps.slot_type & CA_DESCR )        msg_Dbg( p_access, "CAMInit: built-in descrambler detected" );

⌨️ 快捷键说明

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