You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kaffeine/kaffeine/src/input/dvb/lib/libucsi/dvb/types.c

271 lines
5.4 KiB

/*
* section and descriptor parser
*
* Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <string.h>
#include "types.h"
time_t dvbdate_to_unixtime(dvbdate_t dvbdate)
{
int k = 0;
struct tm tm;
double mjd;
/* check for the undefined value */
if ((dvbdate[0] == 0xff) &&
(dvbdate[1] == 0xff) &&
(dvbdate[2] == 0xff) &&
(dvbdate[3] == 0xff) &&
(dvbdate[4] == 0xff)) {
return -1;
}
memset(&tm, 0, sizeof(tm));
mjd = (dvbdate[0] << 8) | dvbdate[1];
tm.tm_year = (int) ((mjd - 15078.2) / 365.25);
tm.tm_mon = (int) (((mjd - 14956.1) - (int) (tm.tm_year * 365.25)) / 30.6001);
tm.tm_mday = (int) mjd - 14956 - (int) (tm.tm_year * 365.25) - (int) (tm.tm_mon * 30.6001);
if ((tm.tm_mon == 14) || (tm.tm_mon == 15)) k = 1;
tm.tm_year += k;
tm.tm_mon = tm.tm_mon - 2 - k * 12;
tm.tm_sec = bcd_to_integer(dvbdate[4]);
tm.tm_min = bcd_to_integer(dvbdate[3]);
tm.tm_hour = bcd_to_integer(dvbdate[2]);
return mktime(&tm);
}
void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate)
{
struct tm tm;
double l = 0;
int mjd;
/* the undefined value */
if (unixtime == -1) {
memset(dvbdate, 0xff, 5);
return;
}
gmtime_r(&unixtime, &tm);
tm.tm_mon++;
if ((tm.tm_mon == 1) || (tm.tm_mon == 2)) l = 1;
mjd = 14956 + tm.tm_mday + (int) ((tm.tm_year - l) * 365.25) + (int) ((tm.tm_mon + 1 + l * 12) * 30.6001);
dvbdate[0] = (mjd & 0xff00) >> 8;
dvbdate[1] = mjd & 0xff;
dvbdate[2] = integer_to_bcd(tm.tm_hour);
dvbdate[3] = integer_to_bcd(tm.tm_min);
dvbdate[4] = integer_to_bcd(tm.tm_sec);
}
int dvbduration_to_seconds(dvbduration_t dvbduration)
{
int seconds = 0;
seconds += (bcd_to_integer(dvbduration[0]) * 60 * 60);
seconds += (bcd_to_integer(dvbduration[1]) * 60);
seconds += bcd_to_integer(dvbduration[2]);
return seconds;
}
void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration)
{
int hours, mins;
hours = seconds / (60*60);
seconds -= (hours * 60 * 60);
mins = seconds / 60;
seconds -= (mins * 60);
dvbduration[0] = integer_to_bcd(hours);
dvbduration[1] = integer_to_bcd(mins);
dvbduration[2] = integer_to_bcd(seconds);
}
int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm)
{
int seconds = 0;
seconds += (bcd_to_integer(dvbhhmm[0]) * 60 * 60);
seconds += (bcd_to_integer(dvbhhmm[1]) * 60);
return seconds;
}
void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm)
{
int hours, mins;
hours = seconds / (60*60);
seconds -= (hours * 60 * 60);
mins = seconds / 60;
dvbhhmm[0] = integer_to_bcd(hours);
dvbhhmm[1] = integer_to_bcd(mins);
}
uint32_t integer_to_bcd(uint32_t intval)
{
uint32_t val = 0;
int i;
for(i=0; i<=28;i+=4) {
val |= ((intval % 10) << i);
intval /= 10;
}
return val;
}
uint32_t bcd_to_integer(uint32_t bcdval)
{
uint32_t val = 0;
int i;
for(i=28; i>=0;i-=4) {
val += ((bcdval >> i) & 0x0f);
if (i != 0) val *= 10;
}
return val;
}
const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed)
{
char *charset = "ISO6937";
int used = 0;
if (dvb_text_length == 0)
goto exit;
if (dvb_text[0] >= 32)
goto exit;
if (dvb_text[0] == 0x10) {
if (dvb_text_length < 3)
goto exit;
used = 3;
uint16_t ext = (dvb_text[1] << 8) | dvb_text[2];
switch(ext) {
case 0x01:
charset = "ISO8859-1";
break;
case 0x02:
charset = "ISO8859-2";
break;
case 0x03:
charset = "ISO8859-3";
break;
case 0x04:
charset = "ISO8859-4";
break;
case 0x05:
charset = "ISO8859-5";
break;
case 0x06:
charset = "ISO8859-6";
break;
case 0x07:
charset = "ISO8859-7";
break;
case 0x08:
charset = "ISO8859-8";
break;
case 0x09:
charset = "ISO8859-9";
break;
case 0x0a:
charset = "ISO8859-10";
break;
case 0x0b:
charset = "ISO8859-11";
break;
case 0x0d:
charset = "ISO8859-13";
break;
case 0x0e:
charset = "ISO8859-14";
break;
case 0x0f:
charset = "ISO8859-15";
break;
default:
used = 0;
break;
}
} else {
used = 1;
switch(dvb_text[0]) {
case 0x01:
charset = "ISO8859-5";
break;
case 0x02:
charset = "ISO8859-6";
break;
case 0x03:
charset = "ISO8859-7";
break;
case 0x04:
charset = "ISO8859-8";
break;
case 0x05:
charset = "ISO8859-9";
break;
case 0x06:
charset = "ISO8859-10";
break;
case 0x07:
charset = "ISO8859-11";
break;
case 0x09:
charset = "ISO8859-13";
break;
case 0x0a:
charset = "ISO8859-14";
break;
case 0x0b:
charset = "ISO8859-15";
break;
case 0x11:
charset = "UTF16";
break;
case 0x12:
charset = "EUC-KR";
break;
case 0x13:
charset = "GB2312";
break;
case 0x14:
charset = "GBK";
break;
case 0x15:
charset = "UTF8";
break;
default:
used = 0;
break;
}
}
exit:
*consumed = used;
return charset;
}