2
* Simple MPEG/DVB parser to achieve network/service information without initial tuning data
4
* Copyright (C) 2006, 2007, 2008, 2009 Winfried Koehler
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
* Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21
* The author can be reached at: handygewinnspiel AT gmx DOT de
23
* The project's page is http://wirbel.htpc-forum.de/w_scan/index2.html
24
* country.c/h, added 20090101
25
* last update 20091230
28
#include "countries.h"
34
#include <linux/videodev.h>
35
#include <linux/dvb/frontend.h>
41
/**************************************************************************************************
42
* FREQUENCY CALCULATION SCHEME:
43
* each frequency used by w_scan is calculated as follows:
45
* frequency(channellist, channel, frequency_offset_index) =
46
* base_offset(channel, channellist) +
47
* channel * freq_step(channel, channellist) +
48
* freq_offset(channel, channellist, frequency_offset_index);
51
* - channellist is choosen by user, if not choosen defaults are used.
52
* - channel = 0..133 (might be extended if needed)
53
* - frequency_offset_index = 0 (no offset) -> 1 (pos offset) -> 2 (neg offset)
55
* if base_offset(channel, channellist) returns -1 this channel will be skipped.
56
* if freq_offset(channel, channellist, frequency_offset_index) returns -1 this offset will be skipped.
59
* channellist = 4; channel = 12
61
* base_offset(12, 4) = 142500000
62
* freq_step(12, 4) = 7000000
63
* freq_offset(12, 4, 0) = 0
64
* freq_offset(12, 4, 1) = -1
65
* freq_offset(12, 4, 2) = -1
67
* frequency = 142500000 + 12 * 7000000 = 226500000
68
* since freq_offset returns -1 for frequency_offset_index = (1,2) no frequency offset is applied.
71
**************************************************************************************************/
76
* User selects a country specific channellist.
78
* - frontend type DVB or ATSC
79
* - used frequency list (base_offsets, freq_step)
80
* - other country-specific things (transmission mode, frequency offsets from center..)
81
* use two letter uppercase for 'country', as defined by ISO 3166-1
83
int choose_country (const char * country,
86
uint16_t * frontend_type,
88
verbose("%s atsc%d dvb%d frontend%d\n",
89
country, *atsc, *dvb, *frontend_type);
90
if (strcasecmp(country_to_short_name(txt_to_country(country)), country)) {
91
warning("\n\nCOUNTRY CODE IS NOT DEFINED. FALLING BACK TO \"DE\"\n\n");
94
info("using settings for %s\n", country_to_full_name(txt_to_country(country)));
97
* choose DVB or ATSC frontend type
99
switch(txt_to_country(country)) {
103
case CH: // SWITZERLAND
104
case CZ: // CZECH REPUBLIC
110
case GB: // UNITED KINGDOM
113
case HK: // HONG KONG
116
case LU: // LUXEMBOURG
118
case NL: // NETHERLANDS
120
case NZ: // NEW ZEALAND
124
case TW: // TAIWAN, DVB-T w. ATSC freq list (thanks for freqlist to mkrufky)
125
case AU: // AUSTRALIA, DVB-T w. 7MHz step
128
*frontend_type = FE_QAM;
132
*frontend_type = FE_OFDM;
133
info("DVB aerial\n");
138
case US: // UNITED STATES
140
*frontend_type = FE_ATSC;
145
info("Country identifier %s not defined. Using defaults.\n", country);
152
* choose channellist name
154
switch(txt_to_country(country)) {
155
//**********DVB freq lists*******************************************//
158
case CH: // SWITZERLAND
164
case HK: // HONG KONG
167
case LU: // LUXEMBOURG
169
case NL: // NETHERLANDS
171
case NZ: // NEW ZEALAND
177
*channellist = DVBC_QAM;
181
*channellist = DVBT_DE;
182
info("DVB-T Europe\n");
186
case CZ: // CZECH REPUBLIC
190
*channellist = DVBC_FI;
194
*channellist = DVBT_DE;
195
info("DVB-T Europe\n");
202
*channellist = DVBC_FR;
206
*channellist = DVBT_FR;
211
case GB: // UNITED KINGDOM
214
*channellist = DVBC_QAM;
218
*channellist = DVBT_GB;
223
case AU: // AUSTRALIA
226
info("cable australia not yet defined.\n");
229
*channellist = DVBT_AU;
234
//**********ATSC freq lists******************************************//
235
case US: // UNITED STATES
237
case TW: // TAIWAN, DVB-T w. ATSC freq list
238
if (atsc_is_vsb(*atsc)) {
239
*channellist = ATSC_VSB;
240
info("VSB US/CA, DVB-T TW\n");
242
if (atsc_is_qam(*atsc)) {
243
*channellist = ATSC_QAM;
247
//******************************************************************//
249
info("Country identifier %s not defined. Using default freq lists.\n", country);
257
* return the base offsets for specified channellist and channel.
259
int base_offset(int channel, int channellist) {
260
switch (channellist) {
261
case ATSC_QAM: //ATSC cable, US EIA/NCTA Std Cable center freqs + IRC list
263
case 02 ... 04: return 45000000;
264
case 05 ... 06: return 49000000;
265
case 07 ... 13: return 135000000;
266
case 14 ... 22: return 39000000;
267
case 23 ... 94: return 81000000;
268
case 95 ... 99: return -477000000;
269
case 100 ... 133: return 51000000;
270
default: return SKIP_CHANNEL;
272
case ATSC_VSB: //ATSC terrestrial, US NTSC center freqs
274
case 02 ... 04: return 45000000;
275
case 05 ... 06: return 49000000;
276
case 07 ... 13: return 135000000;
277
case 14 ... 69: return 389000000;
278
default: return SKIP_CHANNEL;
280
case DVBT_AU: //AUSTRALIA, 7MHz step list
282
case 05 ... 12: return 142500000;
283
case 21 ... 69: return 333500000;
284
default: return SKIP_CHANNEL;
286
case DVBT_DE: //GERMANY
287
case DVBT_FR: //FRANCE, +/- offset
288
case DVBT_GB: //UNITED KINGDOM, +/- offset
290
case 05 ... 12: return 142500000;
291
case 21 ... 69: return 306000000;
292
default: return SKIP_CHANNEL;
294
case DVBC_QAM: //EUROPE
297
case 5 ... 12: return 73000000;
298
case 22 ... 90: return 138000000;
299
default: return SKIP_CHANNEL;
301
case DVBC_FI: //FINLAND, QAM128
303
case 1 ... 90: return 138000000;
304
default: return SKIP_CHANNEL;
306
case DVBC_FR: //FRANCE, needs user response.
308
case 1 ... 39: return 107000000;
309
case 40 ... 89: return 138000000;
310
default: return SKIP_CHANNEL;
313
fatal("%s: undefined channellist %d\n", __FUNCTION__, channellist);
319
* return the freq step size for specified channellist
321
int freq_step(int channel, int channellist) {
322
switch (channellist) {
324
case ATSC_VSB: return 6000000; // atsc, 6MHz step
325
case DVBT_AU: return 7000000; // dvb-t australia, 7MHz step
328
case DVBT_GB: switch (channel) {// dvb-t europe, 7MHz VHF ch5..12, all other 8MHz
329
case 05 ... 12: return 7000000;
330
case 21 ... 69: return 8000000;
331
default: return 8000000; // should be never reached.
335
case DVBC_FR: return 8000000; // dvb-c, 8MHz step
337
fatal("%s: undefined channellist %d\n", __FUNCTION__, channellist);
343
int bandwidth(int channel, int channellist) {
344
switch(freq_step(channel, channellist)) {
345
case 8000000: return BANDWIDTH_8_MHZ;
346
case 7000000: return BANDWIDTH_7_MHZ;
347
case 6000000: return BANDWIDTH_6_MHZ;
348
#ifdef BANDWIDTH_5_MHZ
349
//missing in Linux DVB API
350
case 5000000: return BANDWIDTH_5_MHZ;
353
fatal("%s: undefined result\n", __FUNCTION__);
359
* some countries use constant offsets around center frequency.
362
int freq_offset(int channel, int channellist, int index) {
363
switch (channellist) {
370
case NO_OFFSET: return 0; //Incrementally Related Carriers (IRC)
371
case POS_OFFSET: return 12500; //US EIA/NCTA Standard Cable center frequencies
372
default: return STOP_OFFSET_LOOP;
374
default: // IRC = standard cable center
376
case NO_OFFSET: return 0; //center freq
377
default: return STOP_OFFSET_LOOP;
383
case 05 ... 12: //VHF channels
385
case NO_OFFSET: return 0; //no offset
386
default: return STOP_OFFSET_LOOP;
388
default: //UHF channels
390
case NO_OFFSET: return 0; //center freq
391
case POS_OFFSET: return +167000; //center+offset
392
case NEG_OFFSET: return -167000; //center-offset
393
default: return STOP_OFFSET_LOOP;
398
case NO_OFFSET: return 0; //center freq
399
case POS_OFFSET: return +125000; //center+offset
400
default: return STOP_OFFSET_LOOP;
406
case NO_OFFSET: return 0; //center freq
407
case POS_OFFSET: return +125000; //center+offset
408
default: return STOP_OFFSET_LOOP;
413
case NO_OFFSET: return 0;
414
default: return STOP_OFFSET_LOOP;
420
case NO_OFFSET: return 0;
421
default: return STOP_OFFSET_LOOP;
428
* DVB-T: default value if transmission mode AUTO
431
int dvbt_transmission_mode(int channel, int channellist) {
432
switch (channellist) {
433
// GB seems to use 8k since 12/2009
434
default: return TRANSMISSION_MODE_8K;
440
* start/stop values for dvbc qam loop
441
* 0 == QAM_64, 1 == QAM_256, 2 == QAM_128
443
int dvbc_qam_max(int channel, int channellist) {
444
switch(channellist) {
445
case DVBC_FI: return 2; //QAM128
447
case DVBC_QAM: return 1; //QAM256
448
default: return 0; //no qam loop
453
int dvbc_qam_min(int channel, int channellist) {
454
switch(channellist) {
457
case DVBC_QAM: return 0; //QAM64
458
default: return 0; //no qam loop
462
int atsc_is_vsb(int atsc) {
463
return (atsc & ATSC_VSB);
466
int atsc_is_qam(int atsc) {
467
return (atsc & ATSC_QAM);
471
* two letters constants from ISO 3166-1.
472
* sorted alphabetically by long country name
475
struct cCountry country_list[] = {
476
/*- ISO 3166-1 - unique id - long country name */
477
{"AF", AF , "AFGHANISTAN"},
478
{"AX", AX , "�LAND ISLANDS"},
479
{"AL", AL , "ALBANIA"},
480
{"DZ", DZ , "ALGERIA"},
481
{"AS", AS , "AMERICAN SAMOA"},
482
{"AD", AD , "ANDORRA"},
483
{"AO", AO , "ANGOLA"},
484
{"AI", AI , "ANGUILLA"},
485
{"AQ", AQ , "ANTARCTICA"},
486
{"AG", AG , "ANTIGUA AND BARBUDA"},
487
{"AR", AR , "ARGENTINA"},
488
{"AM", AM , "ARMENIA"},
489
{"AW", AW , "ARUBA"},
490
{"AU", AU , "AUSTRALIA"},
491
{"AT", AT , "AUSTRIA"},
492
{"AZ", AZ , "AZERBAIJAN"},
493
{"BS", BS , "BAHAMAS"},
494
{"BH", BH , "BAHRAIN"},
495
{"BD", BD , "BANGLADESH"},
496
{"BB", BB , "BARBADOS"},
497
{"BY", BY , "BELARUS"},
498
{"BE", BE , "BELGIUM"},
499
{"BZ", BZ , "BELIZE"},
500
{"BJ", BJ , "BENIN"},
501
{"BM", BM , "BERMUDA"},
502
{"BT", BT , "BHUTAN"},
503
{"BO", BO , "BOLIVIA"},
504
{"BA", BA , "BOSNIA AND HERZEGOVINA"},
505
{"BW", BW , "BOTSWANA"},
506
{"BV", BV , "BOUVET ISLAND"},
507
{"BR", BR , "BRAZIL"},
508
{"IO", IO , "BRITISH INDIAN OCEAN TERRITORY"},
509
{"BN", BN , "BRUNEI DARUSSALAM"},
510
{"BG", BG , "BULGARIA"},
511
{"BF", BF , "BURKINA FASO"},
512
{"BI", BI , "BURUNDI"},
513
{"KH", KH , "CAMBODIA"},
514
{"CM", CM , "CAMEROON"},
515
{"CA", CA , "CANADA"},
516
{"CV", CV , "CAPE VERDE"},
517
{"KY", KY , "CAYMAN ISLANDS"},
518
{"CF", CF , "CENTRAL AFRICAN REPUBLIC"},
520
{"CL", CL , "CHILE"},
521
{"CN", CN , "CHINA"},
522
{"CX", CX , "CHRISTMAS ISLAND"},
523
{"CC", CC , "COCOS (KEELING) ISLANDS"},
524
{"CO", CO , "COLOMBIA"},
525
{"KM", KM , "COMOROS"},
526
{"CG", CG , "CONGO"},
527
{"CD", CD , "CONGO, THE DEMOCRATIC REPUBLIC OF THE"},
528
{"CK", CK , "COOK ISLANDS"},
529
{"CR", CR , "COSTA RICA"},
530
{"CI", CI , "C�TE D'IVOIRE"},
531
{"HR", HR , "CROATIA"},
533
{"CY", CY , "CYPRUS"},
534
{"CZ", CZ , "CZECH REPUBLIC"},
535
{"DK", DK , "DENMARK"},
536
{"DJ", DJ , "DJIBOUTI"},
537
{"DM", DM , "DOMINICA"},
538
{"DO", DO , "DOMINICAN REPUBLIC"},
539
{"EC", EC , "ECUADOR"},
540
{"EG", EG , "EGYPT"},
541
{"SV", SV , "EL SALVADOR"},
542
{"GQ", GQ , "EQUATORIAL GUINEA"},
543
{"ER", ER , "ERITREA"},
544
{"EE", EE , "ESTONIA"},
545
{"ET", ET , "ETHIOPIA"},
546
{"FK", FK , "FALKLAND ISLANDS (MALVINAS)"},
547
{"FO", FO , "FAROE ISLANDS"},
549
{"FI", FI , "FINLAND"},
550
{"FR", FR , "FRANCE"},
551
{"GF", GF , "FRENCH GUIANA"},
552
{"PF", PF , "FRENCH POLYNESIA"},
553
{"TF", TF , "FRENCH SOUTHERN TERRITORIES"},
554
{"GA", GA , "GABON"},
555
{"GM", GM , "GAMBIA"},
556
{"GE", GE , "GEORGIA"},
557
{"DE", DE , "GERMANY"},
558
{"GH", GH , "GHANA"},
559
{"GI", GI , "GIBRALTAR"},
560
{"GR", GR , "GREECE"},
561
{"GL", GL , "GREENLAND"},
562
{"GD", GD , "GRENADA"},
563
{"GP", GP , "GUADELOUPE"},
565
{"GT", GT , "GUATEMALA"},
566
{"GG", GG , "GUERNSEY"},
567
{"GN", GN , "GUINEA"},
568
{"GW", GW , "GUINEA-BISSAU"},
569
{"GY", GY , "GUYANA"},
570
{"HT", HT , "HAITI"},
571
{"HM", HM , "HEARD ISLAND AND MCDONALD ISLANDS"},
572
{"VA", VA , "HOLY SEE (VATICAN CITY STATE)"},
573
{"HN", HN , "HONDURAS"},
574
{"HK", HK , "HONG KONG"},
575
{"HU", HU , "HUNGARY"},
576
{"IS", IS , "ICELAND"},
577
{"IN", IN , "INDIA"},
578
{"ID", ID , "INDONESIA"},
579
{"IR", IR , "IRAN, ISLAMIC REPUBLIC OF"},
581
{"IE", IE , "IRELAND"},
582
{"IM", IM , "ISLE OF MAN"},
583
{"IL", IL , "ISRAEL"},
584
{"IT", IT , "ITALY"},
585
{"JM", JM , "JAMAICA"},
586
{"JP", JP , "JAPAN"},
587
{"JE", JE , "JERSEY"},
588
{"JO", JO , "JORDAN"},
589
{"KZ", KZ , "KAZAKHSTAN"},
590
{"KE", KE , "KENYA"},
591
{"KI", KI , "KIRIBATI"},
592
{"KP", KP , "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF"},
593
{"KR", KR , "KOREA, REPUBLIC OF"},
594
{"KW", KW , "KUWAIT"},
595
{"KG", KG , "KYRGYZSTAN"},
596
{"LA", LA , "LAO PEOPLE'S DEMOCRATIC REPUBLIC"},
597
{"LV", LV , "LATVIA"},
598
{"LB", LB , "LEBANON"},
599
{"LS", LS , "LESOTHO"},
600
{"LR", LR , "LIBERIA"},
601
{"LY", LY , "LIBYAN ARAB JAMAHIRIYA"},
602
{"LI", LI , "LIECHTENSTEIN"},
603
{"LT", LT , "LITHUANIA"},
604
{"LU", LU , "LUXEMBOURG"},
605
{"MO", MO , "MACAO"},
606
{"MK", MK , "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF"},
607
{"MG", MG , "MADAGASCAR"},
608
{"MW", MW , "MALAWI"},
609
{"MY", MY , "MALAYSIA"},
610
{"MV", MV , "MALDIVES"},
612
{"MT", MT , "MALTA"},
613
{"MH", MH , "MARSHALL ISLANDS"},
614
{"MQ", MQ , "MARTINIQUE"},
615
{"MR", MR , "MAURITANIA"},
616
{"MU", MU , "MAURITIUS"},
617
{"YT", YT , "MAYOTTE"},
618
{"MX", MX , "MEXICO"},
619
{"FM", FM , "MICRONESIA, FEDERATED STATES OF"},
620
{"MD", MD , "MOLDOVA"},
621
{"MC", MC , "MONACO"},
622
{"MN", MN , "MONGOLIA"},
623
{"ME", ME , "MONTENEGRO"},
624
{"MS", MS , "MONTSERRAT"},
625
{"MA", MA , "MOROCCO"},
626
{"MZ", MZ , "MOZAMBIQUE"},
627
{"MM", MM , "MYANMAR"},
628
{"NA", NA , "NAMIBIA"},
629
{"NR", NR , "NAURU"},
630
{"NP", NP , "NEPAL"},
631
{"NL", NL , "NETHERLANDS"},
632
{"AN", AN , "NETHERLANDS ANTILLES"},
633
{"NC", NC , "NEW CALEDONIA"},
634
{"NZ", NZ , "NEW ZEALAND"},
635
{"NI", NI , "NICARAGUA"},
636
{"NE", NE , "NIGER"},
637
{"NG", NG , "NIGERIA"},
639
{"NF", NF , "NORFOLK ISLAND"},
640
{"MP", MP , "NORTHERN MARIANA ISLANDS"},
641
{"NO", NO , "NORWAY"},
643
{"PK", PK , "PAKISTAN"},
644
{"PW", PW , "PALAU"},
645
{"PS", PS , "PALESTINIAN TERRITORY, OCCUPIED"},
646
{"PA", PA , "PANAMA"},
647
{"PG", PG , "PAPUA NEW GUINEA"},
648
{"PY", PY , "PARAGUAY"},
650
{"PH", PH , "PHILIPPINES"},
651
{"PN", PN , "PITCAIRN"},
652
{"PL", PL , "POLAND"},
653
{"PT", PT , "PORTUGAL"},
654
{"PR", PR , "PUERTO RICO"},
656
{"RE", RE , "R�UNION"},
657
{"RO", RO , "ROMANIA"},
658
{"RU", RU , "RUSSIAN FEDERATION"},
659
{"RW", RW , "RWANDA"},
660
{"BL", BL , "SAINT BARTH�LEMY"},
661
{"SH", SH , "SAINT HELENA"},
662
{"KN", KN , "SAINT KITTS AND NEVIS"},
663
{"LC", LC , "SAINT LUCIA"},
664
{"MF", MF , "SAINT MARTIN"},
665
{"PM", PM , "SAINT PIERRE AND MIQUELON"},
666
{"VC", VC , "SAINT VINCENT AND THE GRENADINES"},
667
{"WS", WS , "SAMOA"},
668
{"SM", SM , "SAN MARINO"},
669
{"ST", ST , "SAO TOME AND PRINCIPE"},
670
{"SA", SA , "SAUDI ARABIA"},
671
{"SN", SN , "SENEGAL"},
672
{"RS", RS , "SERBIA"},
673
{"SC", SC , "SEYCHELLES"},
674
{"SL", SL , "SIERRA LEONE"},
675
{"SG", SG , "SINGAPORE"},
676
{"SK", SK , "SLOVAKIA"},
677
{"SI", SI , "SLOVENIA"},
678
{"SB", SB , "SOLOMON ISLANDS"},
679
{"SO", SO , "SOMALIA"},
680
{"ZA", ZA , "SOUTH AFRICA"},
681
{"GS", GS , "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS"},
682
{"ES", ES , "SPAIN"},
683
{"LK", LK , "SRI LANKA"},
684
{"SD", SD , "SUDAN"},
685
{"SR", SR , "SURINAME"},
686
{"SJ", SJ , "SVALBARD AND JAN MAYEN"},
687
{"SZ", SZ , "SWAZILAND"},
688
{"SE", SE , "SWEDEN"},
689
{"CH", CH , "SWITZERLAND"},
690
{"SY", SY , "SYRIAN ARAB REPUBLIC"},
691
{"TW", TW , "TAIWAN"},
692
{"TJ", TJ , "TAJIKISTAN"},
693
{"TZ", TZ , "TANZANIA, UNITED REPUBLIC OF"},
694
{"TH", TH , "THAILAND"},
695
{"TL", TL , "TIMOR-LESTE"},
697
{"TK", TK , "TOKELAU"},
698
{"TO", TO , "TONGA"},
699
{"TT", TT , "TRINIDAD AND TOBAGO"},
700
{"TN", TN , "TUNISIA"},
701
{"TR", TR , "TURKEY"},
702
{"TM", TM , "TURKMENISTAN"},
703
{"TC", TC , "TURKS AND CAICOS ISLANDS"},
704
{"TV", TV , "TUVALU"},
705
{"UG", UG , "UGANDA"},
706
{"UA", UA , "UKRAINE"},
707
{"AE", AE , "UNITED ARAB EMIRATES"},
708
{"GB", GB , "UNITED KINGDOM"},
709
{"US", US , "UNITED STATES"},
710
{"UM", UM , "UNITED STATES MINOR OUTLYING ISLANDS"},
711
{"UY", UY , "URUGUAY"},
712
{"UZ", UZ , "UZBEKISTAN"},
713
{"VU", VU , "VANUATU"},
714
{"VE", VE , "VENEZUELA"},
715
{"VN", VN , "VIET NAM"},
716
{"VG", VG , "VIRGIN ISLANDS, BRITISH"},
717
{"VI", VI , "VIRGIN ISLANDS, U.S."},
718
{"WF", WF , "WALLIS AND FUTUNA"},
719
{"EH", EH , "WESTERN SAHARA"},
720
{"YE", YE , "YEMEN"},
721
{"ZM", ZM , "ZAMBIA"},
725
/* convert ISO 3166-1 two-letter constant
728
int txt_to_country(const char * id) {
730
for (i = 0; i < COUNTRY_COUNT(country_list); i++)
731
if (! strcasecmp(id,country_list[i].short_name))
732
return country_list[i].id;
733
return DE; // w_scan defaults to DVB-t de_DE
737
/* convert index number
738
* to ISO 3166-1 two-letter constant
740
const char * country_to_short_name(int idx) {
742
for (i = 0; i < COUNTRY_COUNT(country_list); i++)
743
if (idx == country_list[i].id)
744
return country_list[i].short_name;
745
return "DE"; // w_scan defaults to DVB-t de_DE
748
/* convert index number
751
const char * country_to_full_name(int idx) {
753
for (i = 0; i < COUNTRY_COUNT(country_list); i++)
754
if (idx == country_list[i].id)
755
return country_list[i].full_name;
756
warning("COUNTRY CODE NOT DEFINED. PLEASE RE-CHECK WETHER YOU TYPED CORRECTLY.\n");
758
return "GERMANY"; // w_scan defaults to DVB-t de_DE
761
void print_countries(void) {
763
for (i = 0; i < COUNTRY_COUNT(country_list); i++)
764
info("\t%s\t\t%s\n", country_list[i].short_name, country_list[i].full_name);
767
int country_count() {
768
return COUNTRY_COUNT(country_list);
772
} // end namespace COUNTRY