Some updates to the use of lang codes inside TVH.

This commit is contained in:
Adam Sutton 2012-09-08 19:32:03 +01:00
parent 2c8b10393c
commit 5e8d239a6a
5 changed files with 32 additions and 23 deletions

View file

@ -493,7 +493,7 @@ const lang_code_t lang_codes[] = {
* Functions
* *************************************************************************/
const char *lang_code_get ( const char *code )
const char *lang_code_get2 ( const char *code, size_t len )
{
int i;
char tmp[4];
@ -502,11 +502,12 @@ const char *lang_code_get ( const char *code )
/* Extract the code (lowercase) */
i = 0;
while (i < 3 && *code) {
while (i < 3 && *code && len) {
if (*code == ';' || *code == ',' || *code == '-') break;
if (*code != ' ')
tmp[i++] = *code | 0x20; // |0x20 = lower case
code++;
len--;
}
tmp[i] = '\0';
@ -524,6 +525,11 @@ const char *lang_code_get ( const char *code )
return lang_codes[0].code2b;
}
const char *lang_code_get ( const char *code )
{
return lang_code_get2(code, strlen(code));
}
const char **lang_code_split ( const char *codes )
{
int n;

View file

@ -31,6 +31,7 @@ extern const lang_code_t lang_codes[];
/* Convert code to preferred internal code */
const char *lang_code_get ( const char *code );
const char *lang_code_get2 ( const char *code, size_t len );
/* Split list of codes as per HTTP Language-Accept spec */
const char **lang_code_split ( const char *codes );

View file

@ -27,6 +27,7 @@
#include "dvb/dvb_support.h"
#include "tsdemux.h"
#include "parsers.h"
#include "lang_codes.h"
static int
psi_section_reassemble0(psi_section_t *ps, const uint8_t *data,
@ -329,6 +330,7 @@ psi_desc_teletext(service_t *t, const uint8_t *ptr, int size,
int parent_pid, int *position)
{
int r = 0;
const char *lang;
elementary_stream_t *st;
while(size >= 5) {
@ -348,10 +350,11 @@ psi_desc_teletext(service_t *t, const uint8_t *ptr, int size,
}
st->es_delete_me = 0;
if(memcmp(st->es_lang, ptr, 3)) {
r |= PMT_UPDATE_LANGUAGE;
memcpy(st->es_lang, ptr, 3);
lang = lang_code_get2((const char*)ptr, 3);
if(memcmp(st->es_lang,lang,3)) {
r |= PMT_UPDATE_LANGUAGE;
memcpy(st->es_lang, lang, 4);
}
if(st->es_parent_pid != parent_pid) {
@ -422,7 +425,6 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid,
uint16_t sid;
streaming_component_type_t hts_stream_type;
elementary_stream_t *st, *next;
char lang[4];
int update = 0;
int had_components;
int composition_id;
@ -430,6 +432,7 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid,
int version;
int position = 0;
int tt_position = 1000;
const char *lang = NULL;
caid_t *c, *cn;
@ -503,7 +506,6 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid,
len -= 5;
hts_stream_type = SCT_UNKNOWN;
memset(lang, 0, 4);
composition_id = -1;
ancillary_id = -1;
@ -558,8 +560,8 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid,
break;
case DVB_DESC_LANGUAGE:
memcpy(lang, ptr, 3);
break;
lang = lang_code_get2((const char*)ptr, 3);
break;
case DVB_DESC_TELETEXT:
if(estype == 0x06)
@ -581,14 +583,14 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid,
break;
case DVB_DESC_SUBTITLE:
if(dlen < 8)
break;
if(dlen < 8)
break;
memcpy(lang, ptr, 3);
composition_id = ptr[4] << 8 | ptr[5];
ancillary_id = ptr[6] << 8 | ptr[7];
hts_stream_type = SCT_DVBSUB;
break;
lang = lang_code_get2((const char*)ptr, 3);
composition_id = ptr[4] << 8 | ptr[5];
ancillary_id = ptr[6] << 8 | ptr[7];
hts_stream_type = SCT_DVBSUB;
break;
case DVB_DESC_EAC3:
if(estype == 0x06 || estype == 0x81)
@ -626,9 +628,9 @@ psi_parse_pmt(service_t *t, const uint8_t *ptr, int len, int chksvcid,
st->es_position = position;
}
if(memcmp(st->es_lang, lang, 4)) {
update |= PMT_UPDATE_LANGUAGE;
memcpy(st->es_lang, lang, 4);
if(lang && memcmp(st->es_lang, lang, 3)) {
update |= PMT_UPDATE_LANGUAGE;
memcpy(st->es_lang, lang, 4);
}
if(composition_id != -1 && st->es_composition_id != composition_id) {
@ -1108,7 +1110,7 @@ psi_load_service_settings(htsmsg_t *m, service_t *t)
st = service_stream_create(t, pid, type);
if((v = htsmsg_get_str(c, "language")) != NULL)
snprintf(st->es_lang, 4, "%s", v);
strncpy(st->es_lang, lang_code_get(v), 3);
if(!htsmsg_get_u32(c, "position", &u32))
st->es_position = u32;

View file

@ -891,7 +891,7 @@ service_build_stream_start(service_t *t)
ssc->ssc_index = st->es_index;
ssc->ssc_type = st->es_type;
memcpy(ssc->ssc_lang, lang_code_get(st->es_lang), 4);
memcpy(ssc->ssc_lang, st->es_lang, 4);
ssc->ssc_composition_id = st->es_composition_id;
ssc->ssc_ancillary_id = st->es_ancillary_id;
ssc->ssc_pid = st->es_pid;

View file

@ -81,7 +81,7 @@ typedef struct elementary_stream {
uint16_t es_aspect_num;
uint16_t es_aspect_den;
char es_lang[4]; /* ISO 639 3-letter language code */
char es_lang[4]; /* ISO 639 2B 3-letter language code */
uint16_t es_composition_id;
uint16_t es_ancillary_id;