From 7f9c4cc75ed2170f8981a7437940f332b8402ac3 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Wed, 4 Dec 2013 21:14:16 +0000 Subject: [PATCH] linuxdvb: fix backwards compatibility --- src/input/mpegts/dvb_psi.c | 32 +++++++---- src/input/mpegts/dvb_support.c | 53 ++++++++++++------- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 4 ++ src/input/mpegts/linuxdvb/linuxdvb_mux.c | 38 +++++++++++-- src/input/mpegts/linuxdvb/scanfile.c | 12 +++++ 5 files changed, 106 insertions(+), 33 deletions(-) diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 2829c479..01845a26 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -79,13 +79,13 @@ dvb_servicetype_lookup ( int t ) static const fe_code_rate_t fec_tab [16] = { FEC_AUTO, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) FEC_3_5, #else FEC_NONE, #endif FEC_4_5, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) FEC_9_10, #else FEC_NONE, @@ -125,7 +125,9 @@ dvb_desc_sat_del } memset(&dmc, 0, sizeof(dmc)); +#if DVB_VER_ATLEAST(5,0) dmc.dmc_fe_pilot = PILOT_AUTO; +#endif dmc.dmc_fe_params.inversion = INVERSION_AUTO; dmc.dmc_fe_params.frequency = frequency; dmc.dmc_fe_orbital_pos = bcdtoint(ptr[4]) * 100 + bcdtoint(ptr[5]); @@ -135,9 +137,15 @@ dvb_desc_sat_del dmc.dmc_fe_params.u.qpsk.symbol_rate = symrate * 100; dmc.dmc_fe_params.u.qpsk.fec_inner = fec_tab[ptr[10] & 0x0f]; -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) static int mtab[4] = { - 0, QPSK, PSK_8, QAM_16 + 0, QPSK, +#if DVB_VER_ATLEAST(5,3) + PSK_8, +#else + 0, +#endif + QAM_16 }; static int rtab[4] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO @@ -147,7 +155,7 @@ dvb_desc_sat_del dmc.dmc_fe_rolloff = rtab[(ptr[6] >> 3) & 0x3]; if (dmc.dmc_fe_delsys == SYS_DVBS && dmc.dmc_fe_rolloff != ROLLOFF_35) { - tvhlog(LOG_WARNING, "nit", "dvb-s rolloff error"); + tvhwarn("nit", "dvb-s rolloff error"); return NULL; } #endif @@ -155,7 +163,7 @@ dvb_desc_sat_del /* Debug */ const char *pol = dvb_pol2str(dmc.dmc_fe_polarisation); tvhdebug("nit", " dvb-s%c pos %d%c freq %d %c sym %d fec %s" -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) " mod %s roff %s" #endif , @@ -164,9 +172,9 @@ dvb_desc_sat_del dmc.dmc_fe_params.frequency, pol ? pol[0] : 'X', symrate, - dvb_fec2str(dmc.dmc_fe_params.u.qpsk.fec_inner), -#if DVB_API_VERSION >= 5 - dvb_qam2str(dmc.dmc_fe_modulation), + dvb_fec2str(dmc.dmc_fe_params.u.qpsk.fec_inner) +#if DVB_VER_ATLEAST(5,0) + , dvb_qam2str(dmc.dmc_fe_modulation), dvb_rolloff2str(dmc.dmc_fe_rolloff) #endif ); @@ -210,7 +218,9 @@ dvb_desc_cable_del } memset(&dmc, 0, sizeof(dmc)); +#if DVB_VER_ATLEAST(5,0) dmc.dmc_fe_delsys = SYS_DVBC_ANNEX_AC; +#endif dmc.dmc_fe_params.inversion = INVERSION_AUTO; dmc.dmc_fe_params.frequency = frequency * 100; @@ -253,7 +263,7 @@ dvb_desc_terr_del static const fe_transmit_mode_t ttab [4] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,1) TRANSMISSION_MODE_4K, #else TRANSMISSION_MODE_AUTO, @@ -279,7 +289,9 @@ dvb_desc_terr_del } memset(&dmc, 0, sizeof(dmc)); +#if DVB_VER_ATLEAST(5,0) dmc.dmc_fe_delsys = SYS_DVBT; +#endif dmc.dmc_fe_params.inversion = INVERSION_AUTO; dmc.dmc_fe_params.frequency = frequency * 10; diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index f7784f56..5d74b8ff 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -384,7 +384,7 @@ const char *dvb_##p##2str (int p) { return val2str(p, p##tab); }\ int dvb_str2##p (const char *p) { return str2val(p, p##tab); } const static struct strtab rollofftab[] = { -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) { "35", ROLLOFF_35 }, { "20", ROLLOFF_20 }, { "25", ROLLOFF_25 }, @@ -394,12 +394,11 @@ const static struct strtab rollofftab[] = { dvb_str2val(rolloff); const static struct strtab delsystab[] = { -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) { "UNDEFINED", SYS_UNDEFINED }, { "DVBC_ANNEX_AC", SYS_DVBC_ANNEX_AC }, { "DVBC_ANNEX_B", SYS_DVBC_ANNEX_B }, { "DVBT", SYS_DVBT }, - { "DSS", SYS_DSS }, { "DVBS", SYS_DVBS }, { "DVBS2", SYS_DVBS2 }, { "DVBH", SYS_DVBH }, @@ -411,6 +410,11 @@ const static struct strtab delsystab[] = { { "DMBTH", SYS_DMBTH }, { "CMMB", SYS_CMMB }, { "DAB", SYS_DAB }, +#endif +#if DVB_VER_ATLEAST(5,1) + { "DSS", SYS_DSS }, +#endif +#if DVB_VER_ATLEAST(5,4) { "DVBT2", SYS_DVBT2 }, { "TURBO", SYS_TURBO } #endif @@ -428,7 +432,7 @@ const static struct strtab fectab[] = { { "7/8", FEC_7_8 }, { "8/9", FEC_8_9 }, { "AUTO", FEC_AUTO }, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) { "3/5", FEC_3_5 }, { "9/10", FEC_9_10 } #endif @@ -445,11 +449,13 @@ const static struct strtab qamtab[] = { { "AUTO", QAM_AUTO }, { "8VSB", VSB_8 }, { "16VSB", VSB_16 }, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) + { "DQPSK", DQPSK }, +#endif +#if DVB_VER_ATLEAST(5,1) { "8PSK", PSK_8 }, { "16APSK", APSK_16 }, { "32APSK", APSK_32 }, - { "DQPSK", DQPSK } #endif }; dvb_str2val(qam); @@ -459,7 +465,7 @@ const static struct strtab bwtab[] = { { "7MHz", BANDWIDTH_7_MHZ }, { "6MHz", BANDWIDTH_6_MHZ }, { "AUTO", BANDWIDTH_AUTO }, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,3) { "5MHz", BANDWIDTH_5_MHZ }, { "10MHz", BANDWIDTH_10_MHZ }, { "1712kHz", BANDWIDTH_1_712_MHZ}, @@ -471,7 +477,10 @@ const static struct strtab modetab[] = { { "2k", TRANSMISSION_MODE_2K }, { "8k", TRANSMISSION_MODE_8K }, { "AUTO", TRANSMISSION_MODE_AUTO }, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,1) + { "4k", TRANSMISSION_MODE_4K }, +#endif +#if DVB_VER_ATLEAST(5,3) { "1k", TRANSMISSION_MODE_1K }, { "2k", TRANSMISSION_MODE_16K }, { "32k", TRANSMISSION_MODE_32K }, @@ -485,7 +494,7 @@ const static struct strtab guardtab[] = { { "1/8", GUARD_INTERVAL_1_8 }, { "1/4", GUARD_INTERVAL_1_4 }, { "AUTO", GUARD_INTERVAL_AUTO }, -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,3) { "1/128", GUARD_INTERVAL_1_128 }, { "19/128", GUARD_INTERVAL_19_128 }, { "19/256", GUARD_INTERVAL_19_256}, @@ -519,9 +528,11 @@ const static struct strtab typetab[] = { dvb_str2val(type); const static struct strtab pilottab[] = { +#if DVB_VER_ATLEAST(5,0) {"AUTO", PILOT_AUTO}, {"ON", PILOT_ON}, {"OFF", PILOT_OFF} +#endif }; dvb_str2val(pilot); #undef dvb_str2val @@ -616,7 +627,7 @@ dvb_mux_conf_load_dvbs ( dvb_mux_conf_t *dmc, htsmsg_t *m ) return "Invalid polarisation"; dmc->dmc_fe_polarisation = r; -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) s = htsmsg_get_str(m, "modulation"); if(s == NULL || (r = dvb_str2qam(s)) < 0) { r = QPSK; @@ -651,15 +662,17 @@ dvb_mux_conf_load_atsc ( dvb_mux_conf_t *dmc, htsmsg_t *m ) const char * dvb_mux_conf_load ( fe_type_t type, dvb_mux_conf_t *dmc, htsmsg_t *m ) { +#if DVB_VER_ATLEAST(5,0) int r; - uint32_t u32; const char *str; +#endif + uint32_t u32; memset(dmc, 0, sizeof(dvb_mux_conf_t)); dmc->dmc_fe_params.inversion = INVERSION_AUTO; /* Delivery system */ -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) str = htsmsg_get_str(m, "delsys"); if (!str || (r = dvb_str2delsys(str)) < 0) { if (type == FE_OFDM) r = SYS_DVBT; @@ -670,8 +683,8 @@ dvb_mux_conf_load ( fe_type_t type, dvb_mux_conf_t *dmc, htsmsg_t *m ) return "Invalid FE type"; tvhlog(LOG_INFO, "dvb", "no delsys, using default %s", dvb_delsys2str(r)); } -#endif dmc->dmc_fe_delsys = r; +#endif /* Frequency */ if (htsmsg_get_u32(m, "frequency", &u32)) @@ -723,7 +736,7 @@ dvb_mux_conf_save_dvbs ( dvb_mux_conf_t *dmc, htsmsg_t *m ) htsmsg_add_u32(m, "symbol_rate", qpsk->symbol_rate); htsmsg_add_str(m, "fec", dvb_fec2str(qpsk->fec_inner)); htsmsg_add_str(m, "polarisation", dvb_pol2str(dmc->dmc_fe_polarisation)); -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) htsmsg_add_str(m, "modulation", dvb_qam2str(dmc->dmc_fe_modulation)); htsmsg_add_str(m, "rolloff", dvb_rolloff2str(dmc->dmc_fe_rolloff)); #endif @@ -740,7 +753,7 @@ void dvb_mux_conf_save ( fe_type_t type, dvb_mux_conf_t *dmc, htsmsg_t *m ) { htsmsg_add_u32(m, "frequency", dmc->dmc_fe_params.frequency); -#if DVB_API_VERSION >= 5 +#if DVB_VER_ATLEAST(5,0) htsmsg_add_str(m, "delsys", dvb_delsys2str(dmc->dmc_fe_delsys)); #endif if (type == FE_OFDM) dvb_mux_conf_save_dvbt(dmc, m); @@ -753,18 +766,20 @@ int dvb_bandwidth ( fe_bandwidth_t bw ) { switch (bw) { +#if DVB_VER_ATLEAST(5,3) case BANDWIDTH_10_MHZ: return 10000000; + case BANDWIDTH_5_MHZ: + return 5000000; + case BANDWIDTH_1_712_MHZ: + return 1712000; +#endif case BANDWIDTH_8_MHZ: return 8000000; case BANDWIDTH_7_MHZ: return 7000000; case BANDWIDTH_6_MHZ: return 6000000; - case BANDWIDTH_5_MHZ: - return 5000000; - case BANDWIDTH_1_712_MHZ: - return 1712000; default: return 0; } diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 6e83bb0e..d7b01b00 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -709,12 +709,16 @@ linuxdvb_frontend_tune0 /* DVB-T */ if (lfe->lfe_info.type == FE_OFDM) { S2CMD(DTV_BANDWIDTH_HZ, dvb_bandwidth(p->u.ofdm.bandwidth)); +#if DVB_VER_ATLEAST(5,1) S2CMD(DTV_CODE_RATE_HP, p->u.ofdm.code_rate_HP); S2CMD(DTV_CODE_RATE_LP, p->u.ofdm.code_rate_LP); +#endif S2CMD(DTV_MODULATION, p->u.ofdm.constellation); +#if DVB_VER_ATLEAST(5,1) S2CMD(DTV_TRANSMISSION_MODE, p->u.ofdm.transmission_mode); S2CMD(DTV_GUARD_INTERVAL, p->u.ofdm.guard_interval); S2CMD(DTV_HIERARCHY, p->u.ofdm.hierarchy_information); +#endif /* DVB-C */ } else if (lfe->lfe_info.type == FE_QAM) { diff --git a/src/input/mpegts/linuxdvb/linuxdvb_mux.c b/src/input/mpegts/linuxdvb/linuxdvb_mux.c index 910fa56e..c6e69e4d 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_mux.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_mux.c @@ -84,17 +84,27 @@ static const void * linuxdvb_mux_class_delsys_get (void *o) { static const char *s; +#if DVB_VER_ATLEAST(5,0) linuxdvb_mux_t *lm = o; s = dvb_delsys2str(lm->lm_tuning.dmc_fe_delsys); +#else + s = NULL; +#endif return &s; } static int linuxdvb_mux_class_delsys_set (void *o, const void *v) { +#if DVB_VER_ATLEAST(5,0) const char *s = v; + int delsys = dvb_str2delsys(s); linuxdvb_mux_t *lm = o; - lm->lm_tuning.dmc_fe_delsys = dvb_str2delsys(s); - return 1; + if (delsys != lm->lm_tuning.dmc_fe_delsys) { + lm->lm_tuning.dmc_fe_delsys = dvb_str2delsys(s); + return 1; + } +#endif + return 0; } const idclass_t linuxdvb_mux_class = @@ -165,9 +175,13 @@ static htsmsg_t * linuxdvb_mux_dvbt_class_delsys_enum (void *o) { htsmsg_t *list = htsmsg_create_list(); +#if DVB_VER_ATLEAST(5,0) htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_DVBT)); +#endif +#if DVB_VER_ATLEAST(5,4) htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_DVBT2)); htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_TURBO)); +#endif return list; } @@ -233,8 +247,10 @@ static htsmsg_t * linuxdvb_mux_dvbc_class_delsys_enum (void *o) { htsmsg_t *list = htsmsg_create_list(); +#if DVB_VER_ATLEAST(5,0) htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_DVBC_ANNEX_AC)); htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_DVBC_ANNEX_B)); +#endif return list; } @@ -309,16 +325,24 @@ static const void * linuxdvb_mux_dvbs_class_modulation_get ( void *o ) { static const char *s; +#if DVB_VER_ATLEAST(5,0) linuxdvb_mux_t *lm = o; s = dvb_qam2str(lm->lm_tuning.dmc_fe_modulation); +#endif return &s; } static int linuxdvb_mux_dvbs_class_modulation_set (void *o, const void *s) { +#if DVB_VER_ATLEAST(5,0) + int mod = dvb_str2qam(s); linuxdvb_mux_t *lm = o; - lm->lm_tuning.dmc_fe_modulation = dvb_str2qam(s); - return 1; + if (mod != lm->lm_tuning.dmc_fe_modulation) { + lm->lm_tuning.dmc_fe_modulation = mod; + return 1; + } +#endif + return 0; } static htsmsg_t * linuxdvb_mux_dvbs_class_modulation_list ( void *o ) @@ -396,8 +420,10 @@ static htsmsg_t * linuxdvb_mux_dvbs_class_delsys_enum (void *o) { htsmsg_t *list = htsmsg_create_list(); +#if DVB_VER_ATLEAST(5,0) htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_DVBS)); htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_DVBS2)); +#endif return list; } @@ -509,8 +535,10 @@ static htsmsg_t * linuxdvb_mux_atsc_class_delsys_enum (void *o) { htsmsg_t *list = htsmsg_create_list(); +#if DVB_VER_ATLEAST(5,0) htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_ATSC)); htsmsg_add_str(list, NULL, dvb_delsys2str(SYS_ATSCMH)); +#endif return list; } @@ -629,7 +657,9 @@ linuxdvb_mux_create0 /* Defaults */ lm->lm_tuning.dmc_fe_params.inversion = INVERSION_AUTO; +#if DVB_VER_ATLEAST(5,0) lm->lm_tuning.dmc_fe_pilot = PILOT_AUTO; +#endif /* No config */ if (!conf) return lm; diff --git a/src/input/mpegts/linuxdvb/scanfile.c b/src/input/mpegts/linuxdvb/scanfile.c index 5bf75441..2bfc1feb 100644 --- a/src/input/mpegts/linuxdvb/scanfile.c +++ b/src/input/mpegts/linuxdvb/scanfile.c @@ -116,7 +116,9 @@ scanfile_load_atsc ( dvb_mux_conf_t *mux, const char *line ) r = sscanf(line, "%u %s", &p->frequency, qam); if (r != 2) return 1; +#if DVB_VER_ATLEAST(5,0) mux->dmc_fe_delsys = SYS_ATSC; +#endif if ((p->u.vsb.modulation = dvb_str2qam(qam)) == -1) return 1; return 0; @@ -134,12 +136,16 @@ scanfile_load_dvbt ( dvb_mux_conf_t *mux, const char *line ) r = sscanf(line+1, "%u %u %u %10s %10s %10s %10s %10s %10s %10s", &i, &i, &p->frequency, bw, fec, fec2, qam, mode, guard, hier); if(r != 10) return 1; +#if DVB_VER_ATLEAST(5,4) mux->dmc_fe_delsys = SYS_DVBT2; +#endif } else { r = sscanf(line, "%u %10s %10s %10s %10s %10s %10s %10s", &p->frequency, bw, fec, fec2, qam, mode, guard, hier); if(r != 8) return 1; +#if DVB_VER_ATLEAST(5,0) mux->dmc_fe_delsys = SYS_DVBT; +#endif } if ((p->u.ofdm.bandwidth = dvb_str2bw(bw)) == -1) return 1; @@ -172,6 +178,7 @@ scanfile_load_dvbs ( dvb_mux_conf_t *mux, const char *line ) if ((mux->dmc_fe_polarisation = dvb_str2pol(pol)) == -1) return 1; if ((p->u.qpsk.fec_inner = dvb_str2fec(fec)) == -1) return 1; +#if DVB_VER_ATLEAST(5,0) if (v2) { mux->dmc_fe_delsys = SYS_DVBS2; if ((mux->dmc_fe_rolloff = dvb_str2rolloff(rolloff)) == -1) return 1; @@ -181,6 +188,9 @@ scanfile_load_dvbs ( dvb_mux_conf_t *mux, const char *line ) mux->dmc_fe_rolloff = ROLLOFF_35; mux->dmc_fe_modulation = QPSK; } +#else + if (v2) return 1; +#endif return 0; } @@ -196,7 +206,9 @@ scanfile_load_dvbc ( dvb_mux_conf_t *mux, const char *line ) &p->frequency, &p->u.qam.symbol_rate, fec, qam); if(r != 4) return 1; +#if DVB_VER_ATLEAST(5,0) mux->dmc_fe_delsys = SYS_DVBC_ANNEX_AC; +#endif if ((p->u.qam.fec_inner = dvb_str2fec(fec)) == -1) return 1; if ((p->u.qam.modulation = dvb_str2qam(qam)) == -1) return 1;