From patchwork Sun Oct 26 11:46:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiro TSUKADA X-Patchwork-Id: 5153851 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 5F468C11AC for ; Sun, 26 Oct 2014 11:47:36 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2300720340 for ; Sun, 26 Oct 2014 11:47:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9BA9820303 for ; Sun, 26 Oct 2014 11:47:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751597AbaJZLra (ORCPT ); Sun, 26 Oct 2014 07:47:30 -0400 Received: from mail-pd0-f174.google.com ([209.85.192.174]:50703 "EHLO mail-pd0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751593AbaJZLr0 (ORCPT ); Sun, 26 Oct 2014 07:47:26 -0400 Received: by mail-pd0-f174.google.com with SMTP id p10so3959761pdj.19 for ; Sun, 26 Oct 2014 04:47:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=7CVWp+z68+f0ArHvvwSekr+oRif7bWTWxvH4qT6cN/Y=; b=aOBWm9FYq4WfW3P/WeXI5ekUiWu4qVvKQ0phhJroAbZ2d+PXIjfR1TEeyJ1H9vgXm5 I8t0dXO5FWzsY7De23Zz8fkHJl+qe4sXu/F1uv5RTef9UiyEAZnOXwoYv0FOBaPwKpMe HkYsYFrHaKm28b39P4vj38Ilg8JumoRMeJQMGSaP6tp7TAlpH6EV7TZCFJUFEK24X3oX /QI4J7r9cSgWDVx9ZpfZUzwcJpMZSlu4t4sc2g80MT117WtHn29ZtE5jVBUx0pLz2Lr4 aGSPXclnrU4cpKIvYOUw90XbTTeuptFA5kT2shcOHhHaz7cnLIK70fyljgZ7zZggiZ3y vFEQ== X-Received: by 10.66.252.193 with SMTP id zu1mr445280pac.153.1414324046147; Sun, 26 Oct 2014 04:47:26 -0700 (PDT) Received: from seabird.localdomain.localdomain (softbank219203027033.bbtec.net. [219.203.27.33]) by mx.google.com with ESMTPSA id dp4sm8203581pbc.21.2014.10.26.04.47.23 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 26 Oct 2014 04:47:25 -0700 (PDT) From: tskd08@gmail.com To: linux-media@vger.kernel.org Cc: m.chehab@samsung.com, Akihiro Tsukada Subject: [PATCH v2 4/7] v4l-utils/dvb: add COUNTRY property Date: Sun, 26 Oct 2014 20:46:20 +0900 Message-Id: <1414323983-15996-5-git-send-email-tskd08@gmail.com> X-Mailer: git-send-email 2.1.2 In-Reply-To: <1414323983-15996-1-git-send-email-tskd08@gmail.com> References: <1414323983-15996-1-git-send-email-tskd08@gmail.com> MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Akihiro Tsukada to distinguish country variants of delivery systems like ISDB-T. --- configure.ac | 4 + lib/include/libdvbv5/countries.h | 308 +++++++++++++++++++++++++++++ lib/include/libdvbv5/dvb-fe.h | 4 + lib/include/libdvbv5/dvb-v5-std.h | 7 +- lib/libdvbv5/Makefile.am | 2 + lib/libdvbv5/countries.c | 403 ++++++++++++++++++++++++++++++++++++++ lib/libdvbv5/dvb-fe.c | 42 +++- lib/libdvbv5/dvb-file.c | 19 ++ lib/libdvbv5/dvb-v5-std.c | 2 + utils/dvb/dvbv5-scan.c | 11 ++ utils/dvb/dvbv5-zap.c | 11 ++ 11 files changed, 810 insertions(+), 3 deletions(-) create mode 100644 lib/include/libdvbv5/countries.h create mode 100644 lib/libdvbv5/countries.c diff --git a/configure.ac b/configure.ac index 94a857e..b1c5e54 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,8 @@ AC_CONFIG_FILES([Makefile utils/media-ctl/libv4l2subdev.pc ]) +AC_GNU_SOURCE + AM_INIT_AUTOMAKE([1.9 subdir-objects no-dist-gzip dist-bzip2 -Wno-portability]) # 1.10 is needed for target_LIBTOOLFLAGS AM_MAINTAINER_MODE @@ -73,6 +75,8 @@ gl_VISIBILITY AC_CHECK_HEADERS([sys/klog.h]) AC_CHECK_FUNCS([klogctl]) +AC_CHECK_FUNCS([__secure_getenv secure_getenv]) + # Check host os case "$host_os" in linux*) diff --git a/lib/include/libdvbv5/countries.h b/lib/include/libdvbv5/countries.h new file mode 100644 index 0000000..945094f --- /dev/null +++ b/lib/include/libdvbv5/countries.h @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2006, 2007, 2008, 2009 Winfried Koehler + * Copyright (C) 2014 Akihiro Tsukada + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +/** + * @file countries.h + * @ingroup ancillary + * @brief Provides ancillary code to convert ISO 3166-1 country codes + * @copyright GNU General Public License version 2 (GPLv2) + * @author Winfried Koehler + * @author Akihiro Tsukada + * + * @par Bug Report + * Please submit bug reports and patches to linux-media@vger.kernel.org + */ + +#ifndef _COUNTRIES_H_ +#define _COUNTRIES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Every country has its own number here. if adding new one + * simply append to enum. + */ +enum country_t { + COUNTRY_UNKNOWN, + + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SX, + SG, + SK, + SI, + SB, + SO, + ZA, + GS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW +}; + +extern int dvb_country_to_id (const char * name); + +extern const char * dvb_country_to_short_name(int id); +extern const char * dvb_country_to_full_name(int id); + +extern enum country_t dvb_guess_user_country(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/libdvbv5/dvb-fe.h b/lib/include/libdvbv5/dvb-fe.h index ba4c2dc..929b830 100644 --- a/lib/include/libdvbv5/dvb-fe.h +++ b/lib/include/libdvbv5/dvb-fe.h @@ -101,6 +101,7 @@ * DVBv3 only mode was forced by the client (RO) * @param abort Client should set it to abort a pending * operation like DTV scan (RW) + * @param country Country variant of the delivery system (RW) * @param lna: Sets the LNA mode 0 disables; 1 enables, -1 uses * auto mode (RW) * @param lnb LNBf description (RW) @@ -130,6 +131,9 @@ struct dvb_v5_fe_parms { /* Flags from the client to the library */ int abort; + /* Country variant of the international delsys standard. */ + int country; + /* Linear Amplifier settings */ int lna; diff --git a/lib/include/libdvbv5/dvb-v5-std.h b/lib/include/libdvbv5/dvb-v5-std.h index c03b0d3..6ca8c90 100644 --- a/lib/include/libdvbv5/dvb-v5-std.h +++ b/lib/include/libdvbv5/dvb-v5-std.h @@ -93,6 +93,10 @@ * @brief DVB-T2 PLS mode. Not used internally. It is needed * only for file conversion. * @ingroup frontend + * @def DTV_COUNTRY_CODE + * @brief Country variant of international delivery system standard. + in ISO 3166-1 two letter code. + * @ingroup frontend * @def DTV_MAX_USER_COMMAND * @brief Last user command * @ingroup frontend @@ -115,8 +119,9 @@ #define DTV_FREQ_BPF (DTV_USER_COMMAND_START + 9) #define DTV_PLS_CODE (DTV_USER_COMMAND_START + 10) #define DTV_PLS_MODE (DTV_USER_COMMAND_START + 11) +#define DTV_COUNTRY_CODE (DTV_USER_COMMAND_START + 12) -#define DTV_MAX_USER_COMMAND DTV_PLS_MODE +#define DTV_MAX_USER_COMMAND DTV_COUNTRY_CODE #define DTV_USER_NAME_SIZE (1 + DTV_MAX_USER_COMMAND - DTV_USER_COMMAND_START) diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am index fd21236..c95da04 100644 --- a/lib/libdvbv5/Makefile.am +++ b/lib/libdvbv5/Makefile.am @@ -6,6 +6,7 @@ otherinclude_HEADERS = \ ../include/libdvbv5/dvb-demux.h \ ../include/libdvbv5/dvb-v5-std.h \ ../include/libdvbv5/dvb-file.h \ + ../include/libdvbv5/countries.h \ ../include/libdvbv5/crc32.h \ ../include/libdvbv5/dvb-frontend.h \ ../include/libdvbv5/dvb-fe.h \ @@ -57,6 +58,7 @@ endif libdvbv5_la_SOURCES = \ crc32.c \ + countries.c \ dvb-legacy-channel-format.c \ dvb-zap-format.c \ dvb-vdr-format.c \ diff --git a/lib/libdvbv5/countries.c b/lib/libdvbv5/countries.c new file mode 100644 index 0000000..04d1195 --- /dev/null +++ b/lib/libdvbv5/countries.c @@ -0,0 +1,403 @@ +/* + * Copyright (C) 2006, 2007, 2008, 2009 Winfried Koehler + * Copyright (C) 2014 Akihiro Tsukada + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#include +#include "libdvbv5/countries.h" + +#include +#include +#include +#include + +typedef struct cCountry { + const char * short_name; + enum country_t id; + const char* full_name; +} _country; + +/* + * two letters constants from ISO 3166-1. + * sorted alphabetically by long country name + */ + +struct cCountry country_list[] = { +/*- ISO 3166-1 - unique id - long country name alpha-3 numeric */ + {"AF", AF, "AFGHANISTAN"}, /*AFG, 4 },*/ + {"AX", AX, "?LAND ISLANDS"}, /*ALA, 248},*/ + {"AL", AL, "ALBANIA"}, /*ALB, 8 },*/ + {"DZ", DZ, "ALGERIA"}, /*DZA, 12 },*/ + {"AS", AS, "AMERICAN SAMOA"}, /*ASM, 16 },*/ + {"AD", AD, "ANDORRA"}, /*AND, 20 },*/ + {"AO", AO, "ANGOLA"}, /*AGO, 24 },*/ + {"AI", AI, "ANGUILLA"}, /*AIA, 660},*/ + {"AQ", AQ, "ANTARCTICA"}, /*ATA, 10 },*/ + {"AG", AG, "ANTIGUA AND BARBUDA"}, /*ATG, 28 },*/ + {"AR", AR, "ARGENTINA"}, /*ARG, 32 },*/ + {"AM", AM, "ARMENIA"}, /*ARM, 51 },*/ + {"AW", AW, "ARUBA"}, /*ABW, 533},*/ + {"AU", AU, "AUSTRALIA"}, /*AUS, 36 },*/ + {"AT", AT, "AUSTRIA"}, /*AUT, 40 },*/ + {"AZ", AZ, "AZERBAIJAN"}, /*AZE, 31 },*/ + {"BS", BS, "BAHAMAS"}, /*BHS, 44 },*/ + {"BH", BH, "BAHRAIN"}, /*BHR, 48 },*/ + {"BD", BD, "BANGLADESH"}, /*BGD, 50 },*/ + {"BB", BB, "BARBADOS"}, /*BRB, 52 },*/ + {"BY", BY, "BELARUS"}, /*BLR, 112},*/ + {"BE", BE, "BELGIUM"}, /*BEL, 56 },*/ + {"BZ", BZ, "BELIZE"}, /*BLZ, 84 },*/ + {"BJ", BJ, "BENIN"}, /*BEN, 204},*/ + {"BM", BM, "BERMUDA"}, /*BMU, 60 },*/ + {"BT", BT, "BHUTAN"}, /*BTN, 64 },*/ + {"BO", BO, "BOLIVIA"}, /*BOL, 68 },*/ + {"BQ", BQ, "BONAIRE"}, /*BES, 535},*/ + {"BA", BA, "BOSNIA AND HERZEGOVINA"}, /*BIH, 70 },*/ + {"BW", BW, "BOTSWANA"}, /*BWA, 72 },*/ + {"BV", BV, "BOUVET ISLAND"}, /*BVT, 74 },*/ + {"BR", BR, "BRAZIL"}, /*BRA, 76 },*/ + {"IO", IO, "BRITISH INDIAN OCEAN TERRITORY"}, /*IOT, 86 },*/ + {"BN", BN, "BRUNEI DARUSSALAM"}, /*BRN, 96 },*/ + {"BG", BG, "BULGARIA"}, /*BGR, 100},*/ + {"BF", BF, "BURKINA FASO"}, /*BFA, 854},*/ + {"BI", BI, "BURUNDI"}, /*BDI, 108},*/ + {"KH", KH, "CAMBODIA"}, /*KHM, 116},*/ + {"CM", CM, "CAMEROON"}, /*CMR, 120},*/ + {"CA", CA, "CANADA"}, /*CAN, 124},*/ + {"CV", CV, "CAPE VERDE"}, /*CPV, 132},*/ + {"KY", KY, "CAYMAN ISLANDS"}, /*CYM, 136},*/ + {"CF", CF, "CENTRAL AFRICAN REPUBLIC"}, /*CAF, 140},*/ + {"TD", TD, "CHAD"}, /*TCD, 148},*/ + {"CL", CL, "CHILE"}, /*CHL, 152},*/ + {"CN", CN, "CHINA"}, /*CHN, 156},*/ + {"CX", CX, "CHRISTMAS ISLAND"}, /*CXR, 162},*/ + {"CC", CC, "COCOS (KEELING) ISLANDS"}, /*CCK, 166},*/ + {"CO", CO, "COLOMBIA"}, /*COL, 170},*/ + {"KM", KM, "COMOROS"}, /*COM, 174},*/ + {"CG", CG, "CONGO"}, /*COG, 178},*/ + {"CD", CD, "CONGO, THE DEMOCRATIC REPUBLIC OF THE"}, /*COD, 180},*/ + {"CK", CK, "COOK ISLANDS"}, /*COK, 184},*/ + {"CR", CR, "COSTA RICA"}, /*CRI, 188},*/ + {"CI", CI, "C?TE D'IVOIRE"}, /*CIV, 384},*/ + {"HR", HR, "CROATIA"}, /*HRV, 191},*/ + {"CU", CU, "CUBA"}, /*CUB, 192},*/ + {"CW", CW, "CURA?AO"}, /*CUW, 531},*/ + {"CY", CY, "CYPRUS"}, /*CYP, 196},*/ + {"CZ", CZ, "CZECH REPUBLIC"}, /*CZE, 203},*/ + {"DK", DK, "DENMARK"}, /*DNK, 208},*/ + {"DJ", DJ, "DJIBOUTI"}, /*DJI, 262},*/ + {"DM", DM, "DOMINICA"}, /*DMA, 212},*/ + {"DO", DO, "DOMINICAN REPUBLIC"}, /*DOM, 214},*/ + {"EC", EC, "ECUADOR"}, /*ECU, 218},*/ + {"EG", EG, "EGYPT"}, /*EGY, 818},*/ + {"SV", SV, "EL SALVADOR"}, /*SLV, 222},*/ + {"GQ", GQ, "EQUATORIAL GUINEA"}, /*GNQ, 226},*/ + {"ER", ER, "ERITREA"}, /*ERI, 232},*/ + {"EE", EE, "ESTONIA"}, /*EST, 233},*/ + {"ET", ET, "ETHIOPIA"}, /*ETH, 231},*/ + {"FK", FK, "FALKLAND ISLANDS (MALVINAS)"}, /*FLK, 238},*/ + {"FO", FO, "FAROE ISLANDS"}, /*FRO, 234},*/ + {"FJ", FJ, "FIJI"}, /*FJI, 242},*/ + {"FI", FI, "FINLAND"}, /*FIN, 246},*/ + {"FR", FR, "FRANCE"}, /*FRA, 250},*/ + {"GF", GF, "FRENCH GUIANA"}, /*GUF, 254},*/ + {"PF", PF, "FRENCH POLYNESIA"}, /*PYF, 258},*/ + {"TF", TF, "FRENCH SOUTHERN TERRITORIES"}, /*ATF, 260},*/ + {"GA", GA, "GABON"}, /*GAB, 266},*/ + {"GM", GM, "GAMBIA"}, /*GMB, 270},*/ + {"GE", GE, "GEORGIA"}, /*GEO, 268},*/ + {"DE", DE, "GERMANY"}, /*DEU, 276},*/ + {"GH", GH, "GHANA"}, /*GHA, 288},*/ + {"GI", GI, "GIBRALTAR"}, /*GIB, 292},*/ + {"GR", GR, "GREECE"}, /*GRC, 300},*/ + {"GL", GL, "GREENLAND"}, /*GRL, 304},*/ + {"GD", GD, "GRENADA"}, /*GRD, 308},*/ + {"GP", GP, "GUADELOUPE"}, /*GLP, 312},*/ + {"GU", GU, "GUAM"}, /*GUM, 316},*/ + {"GT", GT, "GUATEMALA"}, /*GTM, 320},*/ + {"GG", GG, "GUERNSEY"}, /*GGY, 831},*/ + {"GN", GN, "GUINEA"}, /*GIN, 324},*/ + {"GW", GW, "GUINEA-BISSAU"}, /*GNB, 624},*/ + {"GY", GY, "GUYANA"}, /*GUY, 328},*/ + {"HT", HT, "HAITI"}, /*HTI, 332},*/ + {"HM", HM, "HEARD ISLAND AND MCDONALD ISLANDS"}, /*HMD, 334},*/ + {"VA", VA, "HOLY SEE (VATICAN CITY STATE)"}, /*VAT, 336},*/ + {"HN", HN, "HONDURAS"}, /*HND, 340},*/ + {"HK", HK, "HONG KONG"}, /*HKG, 344},*/ + {"HU", HU, "HUNGARY"}, /*HUN, 348},*/ + {"IS", IS, "ICELAND"}, /*ISL, 352},*/ + {"IN", IN, "INDIA"}, /*IND, 356},*/ + {"ID", ID, "INDONESIA"}, /*IDN, 360},*/ + {"IR", IR, "IRAN, ISLAMIC REPUBLIC OF"}, /*IRN, 364},*/ + {"IQ", IQ, "IRAQ"}, /*IRQ, 368},*/ + {"IE", IE, "IRELAND"}, /*IRL, 372},*/ + {"IM", IM, "ISLE OF MAN"}, /*IMN, 833},*/ + {"IL", IL, "ISRAEL"}, /*ISR, 376},*/ + {"IT", IT, "ITALY"}, /*ITA, 380},*/ + {"JM", JM, "JAMAICA"}, /*JAM, 388},*/ + {"JP", JP, "JAPAN"}, /*JPN, 392},*/ + {"JE", JE, "JERSEY"}, /*JEY, 832},*/ + {"JO", JO, "JORDAN"}, /*JOR, 400},*/ + {"KZ", KZ, "KAZAKHSTAN"}, /*KAZ, 398},*/ + {"KE", KE, "KENYA"}, /*KEN, 404},*/ + {"KI", KI, "KIRIBATI"}, /*KIR, 296},*/ + {"KP", KP, "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF"}, /*PRK, 408},*/ + {"KR", KR, "KOREA, REPUBLIC OF"}, /*KOR, 410},*/ + {"KW", KW, "KUWAIT"}, /*KWT, 414},*/ + {"KG", KG, "KYRGYZSTAN"}, /*KGZ, 417},*/ + {"LA", LA, "LAO PEOPLE'S DEMOCRATIC REPUBLIC"}, /*LAO, 418},*/ + {"LV", LV, "LATVIA"}, /*LVA, 428},*/ + {"LB", LB, "LEBANON"}, /*LBN, 422},*/ + {"LS", LS, "LESOTHO"}, /*LSO, 426},*/ + {"LR", LR, "LIBERIA"}, /*LBR, 430},*/ + {"LY", LY, "LIBYAN ARAB JAMAHIRIYA"}, /*LBY, 434},*/ + {"LI", LI, "LIECHTENSTEIN"}, /*LIE, 438},*/ + {"LT", LT, "LITHUANIA"}, /*LTU, 440},*/ + {"LU", LU, "LUXEMBOURG"}, /*LUX, 442},*/ + {"MO", MO, "MACAO"}, /*MAC, 446},*/ + {"MK", MK, "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF"}, /*MKD, 807},*/ + {"MG", MG, "MADAGASCAR"}, /*MDG, 450},*/ + {"MW", MW, "MALAWI"}, /*MWI, 454},*/ + {"MY", MY, "MALAYSIA"}, /*MYS, 458},*/ + {"MV", MV, "MALDIVES"}, /*MDV, 462},*/ + {"ML", ML, "MALI"}, /*MLI, 466},*/ + {"MT", MT, "MALTA"}, /*MLT, 470},*/ + {"MH", MH, "MARSHALL ISLANDS"}, /*MHL, 584},*/ + {"MQ", MQ, "MARTINIQUE"}, /*MTQ, 474},*/ + {"MR", MR, "MAURITANIA"}, /*MRT, 478},*/ + {"MU", MU, "MAURITIUS"}, /*MUS, 480},*/ + {"YT", YT, "MAYOTTE"}, /*MYT, 175},*/ + {"MX", MX, "MEXICO"}, /*MEX, 484},*/ + {"FM", FM, "MICRONESIA, FEDERATED STATES OF"}, /*FSM, 583},*/ + {"MD", MD, "MOLDOVA"}, /*MDA, 498},*/ + {"MC", MC, "MONACO"}, /*MCO, 492},*/ + {"MN", MN, "MONGOLIA"}, /*MNG, 496},*/ + {"ME", ME, "MONTENEGRO"}, /*MNE, 499},*/ + {"MS", MS, "MONTSERRAT"}, /*MSR, 500},*/ + {"MA", MA, "MOROCCO"}, /*MAR, 504},*/ + {"MZ", MZ, "MOZAMBIQUE"}, /*MOZ, 508},*/ + {"MM", MM, "MYANMAR"}, /*MMR, 104},*/ + {"NA", NA, "NAMIBIA"}, /*NAM, 516},*/ + {"NR", NR, "NAURU"}, /*NRU, 520},*/ + {"NP", NP, "NEPAL"}, /*NPL, 524},*/ + {"NL", NL, "NETHERLANDS"}, /*NLD, 528},*/ + {"NC", NC, "NEW CALEDONIA"}, /*NCL, 540},*/ + {"NZ", NZ, "NEW ZEALAND"}, /*NZL, 554},*/ + {"NI", NI, "NICARAGUA"}, /*NIC, 558},*/ + {"NE", NE, "NIGER"}, /*NER, 562},*/ + {"NG", NG, "NIGERIA"}, /*NGA, 566},*/ + {"NU", NU, "NIUE"}, /*NIU, 570},*/ + {"NF", NF, "NORFOLK ISLAND"}, /*NFK, 574},*/ + {"MP", MP, "NORTHERN MARIANA ISLANDS"}, /*MNP, 580},*/ + {"NO", NO, "NORWAY"}, /*NOR, 578},*/ + {"OM", OM, "OMAN"}, /*OMN, 512},*/ + {"PK", PK, "PAKISTAN"}, /*PAK, 586},*/ + {"PW", PW, "PALAU"}, /*PLW, 585},*/ + {"PS", PS, "PALESTINIAN TERRITORY, OCCUPIED"}, /*PSE, 275},*/ + {"PA", PA, "PANAMA"}, /*PAN, 591},*/ + {"PG", PG, "PAPUA NEW GUINEA"}, /*PNG, 598},*/ + {"PY", PY, "PARAGUAY"}, /*PRY, 600},*/ + {"PE", PE, "PERU"}, /*PER, 604},*/ + {"PH", PH, "PHILIPPINES"}, /*PHL, 608},*/ + {"PN", PN, "PITCAIRN"}, /*PCN, 612},*/ + {"PL", PL, "POLAND"}, /*POL, 616},*/ + {"PT", PT, "PORTUGAL"}, /*PRT, 620},*/ + {"PR", PR, "PUERTO RICO"}, /*PRI, 630},*/ + {"QA", QA, "QATA"}, /*QAT, 634},*/ + {"RE", RE, "R?UNION"}, /*REU, 638},*/ + {"RO", RO, "ROMANIA"}, /*ROU, 642},*/ + {"RU", RU, "RUSSIAN FEDERATION"}, /*RUS, 643},*/ + {"RW", RW, "RWANDA"}, /*RWA, 646},*/ + {"BL", BL, "SAINT BARTH?LEMY"}, /*BLM, 652},*/ + {"SH", SH, "SAINT HELENA"}, /*SHN, 654},*/ + {"KN", KN, "SAINT KITTS AND NEVIS"}, /*KNA, 659},*/ + {"LC", LC, "SAINT LUCIA"}, /*LCA, 662},*/ + {"MF", MF, "SAINT MARTIN"}, /*MAF, 663},*/ + {"PM", PM, "SAINT PIERRE AND MIQUELON"}, /*SPM, 666},*/ + {"VC", VC, "SAINT VINCENT AND THE GRENADINES"}, /*VCT, 670},*/ + {"WS", WS, "SAMOA"}, /*WSM, 882},*/ + {"SM", SM, "SAN MARINO"}, /*SMR, 674},*/ + {"ST", ST, "SAO TOME AND PRINCIPE"}, /*STP, 678},*/ + {"SA", SA, "SAUDI ARABIA"}, /*SAU, 682},*/ + {"SN", SN, "SENEGAL"}, /*SEN, 686},*/ + {"RS", RS, "SERBIA"}, /*SRB, 688},*/ + {"SC", SC, "SEYCHELLES"}, /*SYC, 690},*/ + {"SL", SL, "SIERRA LEONE"}, /*SLE, 694},*/ + {"SX", SX, "SINT MAARTEN"}, /*SXM, 534},*/ + {"SG", SG, "SINGAPORE"}, /*SGP, 702},*/ + {"SK", SK, "SLOVAKIA"}, /*SVK, 703},*/ + {"SI", SI, "SLOVENIA"}, /*SVN, 705},*/ + {"SB", SB, "SOLOMON ISLANDS"}, /*SLB, 90 },*/ + {"SO", SO, "SOMALIA"}, /*SOM, 706},*/ + {"ZA", ZA, "SOUTH AFRICA"}, /*ZAF, 710},*/ + {"GS", GS, "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS"}, /*SGS, 239},*/ + {"ES", ES, "SPAIN"}, /*ESP, 724},*/ + {"LK", LK, "SRI LANKA"}, /*LKA, 144},*/ + {"SD", SD, "SUDAN"}, /*SDN, 736},*/ + {"SR", SR, "SURINAME"}, /*SUR, 740},*/ + {"SJ", SJ, "SVALBARD AND JAN MAYEN"}, /*SJM, 744},*/ + {"SZ", SZ, "SWAZILAND"}, /*SWZ, 748},*/ + {"SE", SE, "SWEDEN"}, /*SWE, 752},*/ + {"CH", CH, "SWITZERLAND"}, /*CHE, 756},*/ + {"SY", SY, "SYRIAN ARAB REPUBLIC"}, /*SYR, 760},*/ + {"TW", TW, "TAIWAN"}, /*TWN, 158},*/ + {"TJ", TJ, "TAJIKISTAN"}, /*TJK, 762},*/ + {"TZ", TZ, "TANZANIA, UNITED REPUBLIC OF"}, /*TZA, 834},*/ + {"TH", TH, "THAILAND"}, /*THA, 764},*/ + {"TL", TL, "TIMOR-LESTE"}, /*TLS, 626},*/ + {"TG", TG, "TOGO"}, /*TGO, 768},*/ + {"TK", TK, "TOKELAU"}, /*TKL, 772},*/ + {"TO", TO, "TONGA"}, /*TON, 776},*/ + {"TT", TT, "TRINIDAD AND TOBAGO"}, /*TTO, 780},*/ + {"TN", TN, "TUNISIA"}, /*TUN, 788},*/ + {"TR", TR, "TURKEY"}, /*TUR, 792},*/ + {"TM", TM, "TURKMENISTAN"}, /*TKM, 795},*/ + {"TC", TC, "TURKS AND CAICOS ISLANDS"}, /*TCA, 796},*/ + {"TV", TV, "TUVALU"}, /*TUV, 798},*/ + {"UG", UG, "UGANDA"}, /*UGA, 800},*/ + {"UA", UA, "UKRAINE"}, /*UKR, 804},*/ + {"AE", AE, "UNITED ARAB EMIRATES"}, /*ARE, 784},*/ + {"GB", GB, "UNITED KINGDOM"}, /*GBR, 826},*/ + {"US", US, "UNITED STATES"}, /*USA, 840},*/ + {"UM", UM, "UNITED STATES MINOR OUTLYING ISLANDS"}, /*UMI, 581},*/ + {"UY", UY, "URUGUAY"}, /*URY, 858},*/ + {"UZ", UZ, "UZBEKISTAN"}, /*UZB, 860},*/ + {"VU", VU, "VANUATU"}, /*VUT, 548},*/ + {"VE", VE, "VENEZUELA"}, /*VEN, 862},*/ + {"VN", VN, "VIET NAM"}, /*VNM, 704},*/ + {"VG", VG, "VIRGIN ISLANDS, BRITISH"}, /*VGB, 92 },*/ + {"VI", VI, "VIRGIN ISLANDS, U.S."}, /*VIR, 850},*/ + {"WF", WF, "WALLIS AND FUTUNA"}, /*WLF, 876},*/ + {"EH", EH, "WESTERN SAHARA"}, /*ESH, 732},*/ + {"YE", YE, "YEMEN"}, /*YEM, 887},*/ + {"ZM", ZM, "ZAMBIA"}, /*ZMB, 894},*/ + {"ZW", ZW, "ZIMBABWE"} /*ZWE, 716},*/ +}; + +#define COUNTRY_COUNT(x) (sizeof(x)/sizeof(struct cCountry)) + + + +/* convert ISO 3166-1 two-letter constant + * to index number + * return -1 if not found. + */ +int dvb_country_to_id(const char * name) +{ + unsigned int i; + + for (i = 0; i < COUNTRY_COUNT(country_list); i++) { + if (! strcasecmp(name, country_list[i].short_name)) + return country_list[i].id; + } + return COUNTRY_UNKNOWN; +} + + +/* convert index number + * to ISO 3166-1 two-letter constant + */ +const char * dvb_country_to_short_name(int idx) +{ + unsigned int i; + + for (i = 0; i < COUNTRY_COUNT(country_list); i++) + if (idx == country_list[i].id) + return country_list[i].short_name; + return NULL; +} + +/* convert index number + * to country name + */ +const char * dvb_country_to_full_name(int idx) +{ + unsigned int i; + + for (i = 0; i < COUNTRY_COUNT(country_list); i++) + if (idx == country_list[i].id) + return country_list[i].full_name; + return NULL; +} + +#ifndef HAVE_SECURE_GETENV +# ifdef HAVE___SECURE_GETENV +# define secure_getenv __secure_getenv +# else +# define secure_getenv getenv +# endif +#endif + +#define MIN(X,Y) (X < Y ? X : Y) + +static const char * cats[] = { + "LC_ALL", "LC_CTYPE", "LC_COLLATE", "LC_MESSAGES", "LANG" +}; + +enum country_t dvb_guess_user_country(void) +{ + char * buf, * pch, * pbuf; + unsigned cat; + enum country_t id = COUNTRY_UNKNOWN; + + for (cat = 0; cat < sizeof(cats)/sizeof(cats[0]); cat++) { + + // the returned char * should be "C", "POSIX" or something valid. + // If valid, we can only *guess* which format is returned. + // Assume here something like "de_DE.iso8859-1@euro" or "de_DE.utf-8" + buf = secure_getenv(cats[cat]); + if (! buf || strlen(buf) < 2) + continue; + + buf = strdup(buf); + pbuf= buf; + + if (! strncmp(buf, "POSIX", MIN(strlen(buf), 5)) || + ! (strncmp(buf, "en", MIN(strlen(buf), 2)) && !isalpha(buf[2])) ) + continue; + + // assuming 'language_country.encoding@variant' + + // country after '_', if given + if ((pch = strchr(buf, '_'))) + pbuf = pch + 1; + + // remove all after '@', including '@' + if ((pch = strchr(pbuf, '@'))) + *pch = 0; + + // remove all after '.', including '.' + if ((pch = strchr(pbuf, '.'))) + *pch = 0; + + if (strlen(pbuf) == 2) { + unsigned int i; + for (i = 0; i < COUNTRY_COUNT(country_list); i++) + if (! strcasecmp(pbuf, country_list[i].short_name)) { + id = country_list[i].id; + break; + } + } + free(buf); + if (id != COUNTRY_UNKNOWN) + return id; + } + + return COUNTRY_UNKNOWN; +} diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c index 93c0b9b..05f7d03 100644 --- a/lib/libdvbv5/dvb-fe.c +++ b/lib/libdvbv5/dvb-fe.c @@ -20,6 +20,7 @@ #include "dvb-fe-priv.h" #include "dvb-v5.h" +#include #include #include @@ -113,6 +114,7 @@ struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int frontend, parms->p.lna = LNA_AUTO; parms->p.sat_number = -1; parms->p.abort = 0; + parms->p.country = COUNTRY_UNKNOWN; if (ioctl(fd, FE_GET_INFO, &parms->p.info) == -1) { dvb_perror("FE_GET_INFO"); @@ -372,8 +374,6 @@ int dvb_set_sys(struct dvb_v5_fe_parms *p, fe_delivery_system_t sys) parms->p.current_sys = sys; parms->n_props = rc; - if (sys == SYS_ISDBS /* || sys == SYS_ISDBT */) - parms->p.default_charset = "arib-std-b24"; return 0; } @@ -658,6 +658,42 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *p) return 0; } +/* set the delsys default/fixed parameters and replace DVBv5 default values */ +static void dvb_setup_delsys_default(struct dvb_v5_fe_parms *p) +{ + uint32_t cc; + + switch (p->current_sys) { + case SYS_ISDBT: + /* Set country code. */ + /* if the default country is not known, fallback to JP */ + cc = COUNTRY_UNKNOWN; + dvb_fe_retrieve_parm(p, DTV_COUNTRY_CODE, &cc); + if (cc == COUNTRY_UNKNOWN) { + cc = (p->country == COUNTRY_UNKNOWN) + ? JP : p->country; + dvb_fe_store_parm(p, DTV_COUNTRY_CODE, cc); + } + switch (cc) { + case BR: + p->default_charset = "iso8859-15"; + break; + case JP: + p->default_charset = "arib-std-b24"; + dvb_fe_store_parm(p, DTV_BANDWIDTH_HZ, 6000000); + break; + } + break; + case SYS_ISDBS: + p->default_charset = "arib-std-b24"; + if (!p->lnb); + p->lnb = dvb_sat_get_lnb(dvb_sat_search_lnb("110BS")); + break; + default: + break; + } +} + int dvb_fe_set_parms(struct dvb_v5_fe_parms *p) { struct dvb_v5_fe_parms_priv *parms = (void *)p; @@ -690,6 +726,8 @@ int dvb_fe_set_parms(struct dvb_v5_fe_parms *p) parms->freq_offset = tmp_parms.freq_offset; } + dvb_setup_delsys_default(p); + /* Filter out any user DTV_foo property such as DTV_POLARIZATION */ tmp_parms.n_props = dvb_copy_fe_props(tmp_parms.dvb_prop, tmp_parms.n_props, diff --git a/lib/libdvbv5/dvb-file.c b/lib/libdvbv5/dvb-file.c index fa4d370..41e20bb 100644 --- a/lib/libdvbv5/dvb-file.c +++ b/lib/libdvbv5/dvb-file.c @@ -49,6 +49,7 @@ #include #include #include +#include int dvb_store_entry_prop(struct dvb_entry *entry, uint32_t cmd, uint32_t value) @@ -150,6 +151,9 @@ static uint32_t dvbv5_default_value(int cmd) case DTV_ROLLOFF: return ROLLOFF_AUTO; + case DTV_COUNTRY_CODE: + return COUNTRY_UNKNOWN; + default: return (uint32_t)-1; } @@ -616,6 +620,14 @@ static int fill_entry(struct dvb_entry *entry, char *key, char *value) return 0; } + if (!strcasecmp(key, "COUNTRY")) { + int id = dvb_country_to_id(value); + if (id < 0) + return -2; + dvb_store_entry_prop(entry, DTV_COUNTRY_CODE, id); + return 0; + } + if (!strcasecmp(key, "VIDEO_PID")) is_video = 1; else if (!strcasecmp(key, "AUDIO_PID")) @@ -879,6 +891,8 @@ int dvb_write_file(const char *fname, struct dvb_file *dvb_file) for (i = 0; i < entry->n_props; i++) { const char * const *attr_name = dvb_attr_names(entry->props[i].cmd); + const char *buf; + if (attr_name) { int j; @@ -889,6 +903,11 @@ int dvb_write_file(const char *fname, struct dvb_file *dvb_file) } } + if (entry->props[i].cmd == DTV_COUNTRY_CODE) { + buf = dvb_country_to_short_name(entry->props[i].u.data); + attr_name = &buf; + } + /* Handle parameters with optional values */ switch (entry->props[i].cmd) { case DTV_PLS_CODE: diff --git a/lib/libdvbv5/dvb-v5-std.c b/lib/libdvbv5/dvb-v5-std.c index 50365cb..5de6b46 100644 --- a/lib/libdvbv5/dvb-v5-std.c +++ b/lib/libdvbv5/dvb-v5-std.c @@ -75,6 +75,7 @@ const unsigned int sys_isdbt_props[] = { DTV_ISDBT_LAYERC_MODULATION, DTV_ISDBT_LAYERC_SEGMENT_COUNT, DTV_ISDBT_LAYERC_TIME_INTERLEAVING, + DTV_COUNTRY_CODE, 0 }; @@ -226,6 +227,7 @@ const char *dvb_user_name[DTV_USER_NAME_SIZE + 1] = { [DTV_FREQ_BPF - DTV_USER_COMMAND_START] = "FREQ BPF", [DTV_PLS_CODE - DTV_USER_COMMAND_START] = "PLS CODE", [DTV_PLS_MODE - DTV_USER_COMMAND_START] = "PLS MODE", + [DTV_COUNTRY_CODE - DTV_USER_COMMAND_START] = "COUNTRY", [DTV_USER_NAME_SIZE] = NULL, }; diff --git a/utils/dvb/dvbv5-scan.c b/utils/dvb/dvbv5-scan.c index 45c8516..e87c983 100644 --- a/utils/dvb/dvbv5-scan.c +++ b/utils/dvb/dvbv5-scan.c @@ -37,6 +37,7 @@ #include "libdvbv5/dvb-demux.h" #include "libdvbv5/dvb-v5-std.h" #include "libdvbv5/dvb-scan.h" +#include "libdvbv5/countries.h" #define PROGRAM_NAME "dvbv5-scan" #define DEFAULT_OUTPUT "dvb_channel.conf" @@ -51,6 +52,7 @@ struct arguments { unsigned diseqc_wait, dont_add_new_freqs, timeout_multiply; unsigned other_nit; enum dvb_file_formats input_format, output_format; + const char *cc; /* Used by status print */ unsigned n_status_lines; @@ -75,6 +77,7 @@ static const struct argp_option options[] = { {"input-format", 'I', "format", 0, "Input format: CHANNEL, DVBV5 (default: DVBV5)", 0}, {"output-format", 'O', "format", 0, "Output format: CHANNEL, ZAP, DVBV5 (default: DVBV5)", 0}, {"dvbv3", '3', 0, 0, "Use DVBv3 only", 0}, + {"cc", 'C', "country_code", 0, "use default parameters for given country", 0}, { 0, 0, 0, 0, 0, 0 } }; @@ -400,6 +403,9 @@ static error_t parse_opt(int k, char *optarg, struct argp_state *state) case '3': args->force_dvbv3 = 1; break; + case 'C': + args->cc = strndup(optarg, 2); + break; default: return ARGP_ERR_UNKNOWN; }; @@ -503,6 +509,11 @@ int main(int argc, char **argv) parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; parms->lna = args.lna; + parms->country = args.cc ? dvb_country_to_id(args.cc) + : dvb_guess_user_country(); + if (verbose && !args.cc) + fprintf(stderr, "Assumign you're in '%s'\n", + dvb_country_to_short_name(parms->country)); timeout_flag = &parms->abort; signal(SIGTERM, do_timeout); diff --git a/utils/dvb/dvbv5-zap.c b/utils/dvb/dvbv5-zap.c index 498d3dd..c961b89 100644 --- a/utils/dvb/dvbv5-zap.c +++ b/utils/dvb/dvbv5-zap.c @@ -41,6 +41,7 @@ #include "libdvbv5/dvb-demux.h" #include "libdvbv5/dvb-scan.h" #include "libdvbv5/header.h" +#include "libdvbv5/countries.h" #define CHANNEL_FILE "channels.conf" #define PROGRAM_NAME "dvbv5-zap" @@ -59,6 +60,7 @@ struct arguments { enum dvb_file_formats input_format, output_format; unsigned traffic_monitor, low_traffic; char *search; + const char *cc; /* Used by status print */ unsigned n_status_lines; @@ -89,6 +91,7 @@ static const struct argp_option options[] = { {"wait", 'W', "time", 0, "adds additional wait time for DISEqC command completion", 0}, {"exit", 'x', NULL, 0, "exit after tuning", 0}, {"low_traffic", 'X', NULL, 0, "also shows DVB traffic with less then 1 packet per second", 0}, + {"cc", 'C', "country_code", 0, "use default parameters for given country", 0}, { 0, 0, 0, 0, 0, 0 } }; @@ -549,6 +552,9 @@ static error_t parse_opt(int k, char *optarg, struct argp_state *state) case 'L': args->search = strdup(optarg); break; + case 'C': + args->cc = strndup(optarg, 2); + break; default: return ARGP_ERR_UNKNOWN; }; @@ -803,6 +809,11 @@ int main(int argc, char **argv) parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; parms->lna = args.lna; + parms->country = args.cc ? dvb_country_to_id(args.cc) + : dvb_guess_user_country(); + if (args.verbose > 0 && !args.cc) + fprintf(stderr, "Assumign you're in '%s'\n", + dvb_country_to_short_name(parms->country)); if (parse(&args, parms, channel, &vpid, &apid, &sid)) goto err;