Commit 4fa1af77 authored by Francois Cartegnie's avatar Francois Cartegnie

demux: ts: support ARIB TOT and EIT running status

Signed-off-by: default avatarFrancois Cartegnie <fcvlcdev@free.fr>
Fixed-by: default avatarFrancois Cartegnie <fcvlcdev@free.fr>
parent 1d0f949a
...@@ -224,6 +224,10 @@ demux_LTLIBRARIES += libplaylist_plugin.la ...@@ -224,6 +224,10 @@ demux_LTLIBRARIES += libplaylist_plugin.la
libts_plugin_la_SOURCES = demux/ts.c mux/mpeg/csa.c mux/mpeg/dvbpsi_compat.h demux/dvb-text.h libts_plugin_la_SOURCES = demux/ts.c mux/mpeg/csa.c mux/mpeg/dvbpsi_compat.h demux/dvb-text.h
libts_plugin_la_CFLAGS = $(AM_CFLAGS) $(DVBPSI_CFLAGS) libts_plugin_la_CFLAGS = $(AM_CFLAGS) $(DVBPSI_CFLAGS)
libts_plugin_la_LIBADD = $(DVBPSI_LIBS) $(SOCKET_LIBS) libts_plugin_la_LIBADD = $(DVBPSI_LIBS) $(SOCKET_LIBS)
if HAVE_ARIBB24
libts_plugin_la_CFLAGS += $(ARIBB24_CFLAGS)
libts_plugin_la_LIBADD += $(ARIBB24_LIBS)
endif
if HAVE_DVBPSI if HAVE_DVBPSI
demux_LTLIBRARIES += libts_plugin.la demux_LTLIBRARIES += libts_plugin.la
endif endif
...@@ -74,6 +74,11 @@ VLC_FORMAT(1, 2) static void ts_debug(const char *format, ...) ...@@ -74,6 +74,11 @@ VLC_FORMAT(1, 2) static void ts_debug(const char *format, ...)
#endif #endif
} }
#ifdef HAVE_ARIBB24
#include <aribb24/aribb24.h>
#include <aribb24/decoder.h>
#endif
typedef enum arib_modes_e typedef enum arib_modes_e
{ {
ARIBMODE_AUTO = -1, ARIBMODE_AUTO = -1,
...@@ -320,6 +325,9 @@ struct demux_sys_t ...@@ -320,6 +325,9 @@ struct demux_sys_t
struct struct
{ {
arib_modes_e e_mode; arib_modes_e e_mode;
#ifdef HAVE_ARIBB24
arib_instance_t *p_instance;
#endif
} arib; } arib;
/* All pid */ /* All pid */
...@@ -894,6 +902,11 @@ static void Close( vlc_object_t *p_this ) ...@@ -894,6 +902,11 @@ static void Close( vlc_object_t *p_this )
free( p_sys->p_pcrs ); free( p_sys->p_pcrs );
free( p_sys->p_pos ); free( p_sys->p_pos );
#ifdef HAVE_ARIBB24
if ( p_sys->arib.p_instance )
arib_instance_destroy( p_sys->arib.p_instance );
#endif
vlc_mutex_destroy( &p_sys->csa_lock ); vlc_mutex_destroy( &p_sys->csa_lock );
free( p_sys ); free( p_sys );
} }
...@@ -2801,7 +2814,35 @@ static char *EITConvertToUTF8( demux_t *p_demux, ...@@ -2801,7 +2814,35 @@ static char *EITConvertToUTF8( demux_t *p_demux,
bool b_broken ) bool b_broken )
{ {
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
#ifdef HAVE_ARIBB24
if( p_sys->arib.e_mode == ARIBMODE_ENABLED )
{
if ( !p_sys->arib.p_instance )
p_sys->arib.p_instance = arib_instance_new( p_demux );
if ( !p_sys->arib.p_instance )
return NULL;
arib_decoder_t *p_decoder = arib_get_decoder( p_sys->arib.p_instance );
if ( !p_decoder )
return NULL;
char *psz_outstring = NULL;
size_t i_out;
i_out = i_length * 4;
psz_outstring = (char*) calloc( i_out + 1, sizeof(char) );
if( !psz_outstring )
return NULL;
arib_initialize_decoder( p_decoder );
i_out = arib_decode_buffer( p_decoder, psz_instring, i_length,
psz_outstring, i_out );
arib_finalize_decoder( p_decoder );
return psz_outstring;
}
#else
VLC_UNUSED(p_sys); VLC_UNUSED(p_sys);
#endif
/* Deal with no longer broken providers (no switch byte /* Deal with no longer broken providers (no switch byte
but sending ISO_8859-1 instead of ISO_6937) without but sending ISO_8859-1 instead of ISO_6937) without
removing them from the broken providers table removing them from the broken providers table
...@@ -3059,10 +3100,32 @@ static void EITCallBack( demux_t *p_demux, ...@@ -3059,10 +3100,32 @@ static void EITCallBack( demux_t *p_demux,
int64_t i_start; int64_t i_start;
int i_duration; int i_duration;
int i_min_age = 0; int i_min_age = 0;
int64_t i_tot_time = 0;
i_start = EITConvertStartTime( p_evt->i_start_time ); i_start = EITConvertStartTime( p_evt->i_start_time );
i_duration = EITConvertDuration( p_evt->i_duration ); i_duration = EITConvertDuration( p_evt->i_duration );
if( p_sys->arib.e_mode == ARIBMODE_ENABLED )
{
if( p_sys->i_tdt_delta == 0 )
p_sys->i_tdt_delta = CLOCK_FREQ * (i_start + i_duration - 5) - mdate();
//i_start -= 9 * 60 * 60; // JST -> UTC
time_t timer = time( NULL );
int64_t diff = difftime( mktime( localtime( &timer ) ),
mktime( gmtime( &timer ) ) );
i_start -= diff;
i_tot_time = (mdate() + p_sys->i_tdt_delta) / CLOCK_FREQ - diff;
if( p_evt->i_running_status == 0x00 &&
(i_start - 5 < i_tot_time &&
i_tot_time < i_start + i_duration + 5) )
{
p_evt->i_running_status = 0x04;
msg_Dbg( p_demux, " EIT running status 0x00 -> 0x04" );
}
}
msg_Dbg( p_demux, " * event id=%d start_time:%d duration=%d " msg_Dbg( p_demux, " * event id=%d start_time:%d duration=%d "
"running=%d free_ca=%d", "running=%d free_ca=%d",
p_evt->i_event_id, (int)i_start, (int)i_duration, p_evt->i_event_id, (int)i_start, (int)i_duration,
...@@ -3175,12 +3238,12 @@ static void EITCallBack( demux_t *p_demux, ...@@ -3175,12 +3238,12 @@ static void EITCallBack( demux_t *p_demux,
} }
/* */ /* */
if( i_start > 0 ) if( i_start > 0 && psz_name && psz_text)
vlc_epg_AddEvent( p_epg, i_start, i_duration, psz_name, psz_text, vlc_epg_AddEvent( p_epg, i_start, i_duration, psz_name, psz_text,
*psz_extra ? psz_extra : NULL, i_min_age ); *psz_extra ? psz_extra : NULL, i_min_age );
/* Update "now playing" field */ /* Update "now playing" field */
if( p_evt->i_running_status == 0x04 && i_start > 0 ) if( p_evt->i_running_status == 0x04 && i_start > 0 && psz_name && psz_text )
vlc_epg_SetCurrent( p_epg, i_start ); vlc_epg_SetCurrent( p_epg, i_start );
free( psz_name ); free( psz_name );
...@@ -3273,7 +3336,7 @@ static void PSINewTableCallBack( demux_t *p_demux, dvbpsi_handle h, ...@@ -3273,7 +3336,7 @@ static void PSINewTableCallBack( demux_t *p_demux, dvbpsi_handle h,
#endif #endif
} }
else if( p_demux->p_sys->pid[0x11].psi->i_sdt_version != -1 && else if( p_demux->p_sys->pid[0x11].psi->i_sdt_version != -1 &&
i_table_id == 0x70 ) /* TDT */ (i_table_id == 0x70 /* TDT */ || i_table_id == 0x73 /* TOT */) )
{ {
msg_Dbg( p_demux, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)", msg_Dbg( p_demux, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
i_table_id, i_table_id, i_extension, i_extension ); i_table_id, i_table_id, i_extension, i_extension );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment