Commit 7a0ac322 authored by Marian Ďurkovič's avatar Marian Ďurkovič

Implement TDT parsing in TS demux.

parent 6db314c1
...@@ -77,6 +77,17 @@ ...@@ -77,6 +77,17 @@
# include "tables/eit.h" # include "tables/eit.h"
# endif # endif
#endif #endif
/* TDT support */
#ifdef _DVBPSI_TOT_H_
# define TS_USE_TDT 1
# ifdef HAVE_DVBPSI_DR_H
# include <dvbpsi/tot.h>
# else
# include "tables/tot.h"
# endif
#endif
#include <time.h> #include <time.h>
#undef TS_DEBUG #undef TS_DEBUG
...@@ -357,6 +368,7 @@ struct demux_sys_t ...@@ -357,6 +368,7 @@ struct demux_sys_t
/* */ /* */
bool b_dvb_meta; bool b_dvb_meta;
int64_t i_tdt_delta;
int64_t i_dvb_start; int64_t i_dvb_start;
int64_t i_dvb_length; int64_t i_dvb_length;
...@@ -623,6 +635,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -623,6 +635,7 @@ static int Open( vlc_object_t *p_this )
p_sys->b_dvb_meta = true; p_sys->b_dvb_meta = true;
p_sys->b_access_control = true; p_sys->b_access_control = true;
p_sys->i_current_program = 0; p_sys->i_current_program = 0;
p_sys->i_tdt_delta = 0;
p_sys->i_dvb_start = 0; p_sys->i_dvb_start = 0;
p_sys->i_dvb_length = 0; p_sys->i_dvb_length = 0;
...@@ -653,6 +666,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -653,6 +666,7 @@ static int Open( vlc_object_t *p_this )
{ {
ts_pid_t *sdt = &p_sys->pid[0x11]; ts_pid_t *sdt = &p_sys->pid[0x11];
ts_pid_t *eit = &p_sys->pid[0x12]; ts_pid_t *eit = &p_sys->pid[0x12];
ts_pid_t *tdt = &p_sys->pid[0x14];
PIDInit( sdt, true, NULL ); PIDInit( sdt, true, NULL );
sdt->psi->handle = sdt->psi->handle =
...@@ -662,10 +676,20 @@ static int Open( vlc_object_t *p_this ) ...@@ -662,10 +676,20 @@ static int Open( vlc_object_t *p_this )
eit->psi->handle = eit->psi->handle =
dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack, dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack,
p_demux ); p_demux );
#ifdef TS_USE_TDT
PIDInit( tdt, true, NULL );
tdt->psi->handle =
dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack,
p_demux );
#endif
if( p_sys->b_access_control ) if( p_sys->b_access_control )
{ {
if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS, if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
ACCESS_SET_PRIVATE_ID_STATE, 0x11, true ) || ACCESS_SET_PRIVATE_ID_STATE, 0x11, true ) ||
#ifdef TS_USE_TDT
stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
ACCESS_SET_PRIVATE_ID_STATE, 0x14, true ) ||
#endif
stream_Control( p_demux->s, STREAM_CONTROL_ACCESS, stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
ACCESS_SET_PRIVATE_ID_STATE, 0x12, true ) ) ACCESS_SET_PRIVATE_ID_STATE, 0x12, true ) )
p_sys->b_access_control = false; p_sys->b_access_control = false;
...@@ -798,9 +822,9 @@ static void Close( vlc_object_t *p_this ) ...@@ -798,9 +822,9 @@ static void Close( vlc_object_t *p_this )
free( pid->psi ); free( pid->psi );
break; break;
default: default:
if( p_sys->b_dvb_meta && ( pid->i_pid == 0x11 || pid->i_pid == 0x12 ) ) if( p_sys->b_dvb_meta && ( pid->i_pid == 0x11 || pid->i_pid == 0x12 || pid->i_pid == 0x14 ) )
{ {
/* SDT or EIT */ /* SDT or EIT or TDT */
dvbpsi_DetachDemux( pid->psi->handle ); dvbpsi_DetachDemux( pid->psi->handle );
free( pid->psi ); free( pid->psi );
} }
...@@ -1081,7 +1105,7 @@ static int Demux( demux_t *p_demux ) ...@@ -1081,7 +1105,7 @@ static int Demux( demux_t *p_demux )
{ {
if( p_pid->psi ) if( p_pid->psi )
{ {
if( p_pid->i_pid == 0 || ( p_sys->b_dvb_meta && ( p_pid->i_pid == 0x11 || p_pid->i_pid == 0x12 ) ) ) if( p_pid->i_pid == 0 || ( p_sys->b_dvb_meta && ( p_pid->i_pid == 0x11 || p_pid->i_pid == 0x12 || p_pid->i_pid == 0x14 ) ) )
{ {
dvbpsi_PushPacket( p_pid->psi->handle, p_pkt->p_buffer ); dvbpsi_PushPacket( p_pid->psi->handle, p_pkt->p_buffer );
} }
...@@ -1144,8 +1168,7 @@ static int DVBEventInformation( demux_t *p_demux, int64_t *pi_time, int64_t *pi_ ...@@ -1144,8 +1168,7 @@ static int DVBEventInformation( demux_t *p_demux, int64_t *pi_time, int64_t *pi_
if( p_sys->i_dvb_length > 0 ) if( p_sys->i_dvb_length > 0 )
{ {
/* FIXME we should not use time() but read the date from the tdt */ const time_t t = time (NULL) + p_sys->i_tdt_delta;
const time_t t = time( NULL );
if( p_sys->i_dvb_start <= t && t < p_sys->i_dvb_start + p_sys->i_dvb_length ) if( p_sys->i_dvb_start <= t && t < p_sys->i_dvb_start + p_sys->i_dvb_length )
{ {
if( pi_length ) if( pi_length )
...@@ -2548,16 +2571,17 @@ static void ValidateDVBMeta( demux_t *p_demux, int i_pid ) ...@@ -2548,16 +2571,17 @@ static void ValidateDVBMeta( demux_t *p_demux, int i_pid )
{ {
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
if( !p_sys->b_dvb_meta || ( i_pid != 0x11 && i_pid != 0x12 ) ) if( !p_sys->b_dvb_meta || ( i_pid != 0x11 && i_pid != 0x12 && i_pid != 0x14 ) )
return; return;
msg_Warn( p_demux, "Switching to non DVB mode" ); msg_Warn( p_demux, "Switching to non DVB mode" );
/* This doesn't look like a DVB stream so don't try /* This doesn't look like a DVB stream so don't try
* parsing the SDT/EDT */ * parsing the SDT/EDT/TDT */
for( int i = 0x11; i <= 0x12; i++ ) for( int i = 0x11; i <= 0x14; i++ )
{ {
if( i == 0x13 ) continue;
ts_pid_t *p_pid = &p_sys->pid[i]; ts_pid_t *p_pid = &p_sys->pid[i];
if( p_pid->psi ) if( p_pid->psi )
{ {
...@@ -2907,6 +2931,16 @@ static int EITConvertDuration( uint32_t i_duration ) ...@@ -2907,6 +2931,16 @@ static int EITConvertDuration( uint32_t i_duration )
} }
#undef CVT_FROM_BCD #undef CVT_FROM_BCD
#ifdef TS_USE_TDT
static void TDTCallBack( demux_t *p_demux, dvbpsi_tot_t *p_tdt )
{
demux_sys_t *p_sys = p_demux->p_sys;
p_sys->i_tdt_delta = EITConvertStartTime( p_tdt->i_utc_time ) - time (NULL);
dvbpsi_DeleteTOT(p_tdt);
}
#endif
static void EITCallBack( demux_t *p_demux, static void EITCallBack( demux_t *p_demux,
dvbpsi_eit_t *p_eit, bool b_current_following ) dvbpsi_eit_t *p_eit, bool b_current_following )
...@@ -3083,6 +3117,17 @@ static void PSINewTableCallBack( demux_t *p_demux, dvbpsi_handle h, ...@@ -3083,6 +3117,17 @@ static void PSINewTableCallBack( demux_t *p_demux, dvbpsi_handle h,
(dvbpsi_eit_callback)EITCallBackSchedule; (dvbpsi_eit_callback)EITCallBackSchedule;
dvbpsi_AttachEIT( h, i_table_id, i_extension, cb, p_demux ); dvbpsi_AttachEIT( h, i_table_id, i_extension, cb, p_demux );
} }
#ifdef TS_USE_TDT
else if( p_demux->p_sys->pid[0x11].psi->i_sdt_version != -1 &&
i_table_id == 0x73 ) /* TDT */
{
msg_Dbg( p_demux, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
i_table_id, i_table_id, i_extension, i_extension );
dvbpsi_AttachTOT( h, i_table_id, i_extension,
(dvbpsi_tot_callback)TDTCallBack, p_demux);
}
#endif
} }
#endif #endif
......
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