[vlc-commits] demux: ts: workaround incorrect scrambling flags
Francois Cartegnie
git at videolan.org
Fri Jul 15 13:16:24 CEST 2016
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Jul 15 12:51:15 2016 +0200| [627050755dfbff8dcbdfdc2aef680e46e3190f26] | committer: Francois Cartegnie
demux: ts: workaround incorrect scrambling flags
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=627050755dfbff8dcbdfdc2aef680e46e3190f26
---
modules/demux/mpeg/ts.c | 31 ++++++++++++++++++++-----------
modules/demux/mpeg/ts.h | 1 +
modules/demux/mpeg/ts_pid.c | 6 ++++++
modules/demux/mpeg/ts_pid.h | 1 +
4 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index b6ce759..3cda63f 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -627,6 +627,8 @@ static int Demux( demux_t *p_demux )
if( p_pid->type == TYPE_FREE )
msg_Dbg( p_demux, "pid[%d] unknown", p_pid->i_pid );
p_pid->i_flags |= FLAG_SEEN;
+ if( p_pid->i_pid == 0x01 )
+ p_sys->b_valid_scrambling = true;
}
/* Adaptation field cannot be scrambled */
@@ -634,7 +636,7 @@ static int Demux( demux_t *p_demux )
if( i_pcr > VLC_TS_INVALID )
PCRHandle( p_demux, p_pid, i_pcr );
- if ( SCRAMBLED(*p_pid) && !p_demux->p_sys->csa )
+ if ( SCRAMBLED(*p_pid) && !p_demux->p_sys->csa && p_sys->b_valid_scrambling )
{
block_Release( p_pkt );
continue;
@@ -688,6 +690,7 @@ static int Demux( demux_t *p_demux )
block_Release( p_pkt );
break;
+ case TYPE_CAT:
default:
/* We have to handle PCR if present */
block_Release( p_pkt );
@@ -1236,8 +1239,13 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
return;
}
- if( (p_pes->i_flags & BLOCK_FLAG_SCRAMBLED) ||
- header[0] != 0 || header[1] != 0 || header[2] != 1 )
+ if( (p_pes->i_flags & BLOCK_FLAG_SCRAMBLED) && p_demux->p_sys->b_valid_scrambling )
+ {
+ block_ChainRelease( p_pes );
+ return;
+ }
+
+ if( header[0] != 0 || header[1] != 0 || header[2] != 1 )
{
if ( !(p_pes->i_flags & BLOCK_FLAG_SCRAMBLED) )
msg_Warn( p_demux, "invalid header [0x%02x:%02x:%02x:%02x] (pid: %d)",
@@ -1245,6 +1253,11 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
block_ChainRelease( p_pes );
return;
}
+ else
+ {
+ /* Incorrect transport scrambling flag set by german boxes */
+ p_pes->i_flags &= ~BLOCK_FLAG_SCRAMBLED;
+ }
ts_pes_es_t *p_es = pid->u.p_pes->p_es;
@@ -2284,7 +2297,7 @@ static bool ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt )
csa_Decrypt( p_demux->p_sys->csa, p_pkt->p_buffer, p_demux->p_sys->i_csa_pkt_size );
vlc_mutex_unlock( &p_demux->p_sys->csa_lock );
}
- else
+ else if( p_demux->p_sys->b_valid_scrambling )
{
p_pkt->i_flags |= BLOCK_FLAG_SCRAMBLED;
}
@@ -2359,16 +2372,12 @@ static bool ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt )
return i_ret;
}
- if( p_pkt->i_flags & BLOCK_FLAG_SCRAMBLED )
- {
- block_Release( p_pkt );
- return VLC_DEMUXER_SUCCESS;
- }
- else if( pid->u.p_pes->transport == TS_TRANSPORT_PES )
+ if( pid->u.p_pes->transport == TS_TRANSPORT_PES )
{
return GatherPESData( p_demux, pid, p_pkt, i_skip, b_unit_start );
}
- else if( pid->u.p_pes->transport == TS_TRANSPORT_SECTIONS )
+ else if( pid->u.p_pes->transport == TS_TRANSPORT_SECTIONS &&
+ !(p_pkt->i_flags & BLOCK_FLAG_SCRAMBLED) )
{
ts_sections_processor_Push( pid->u.p_pes->p_sections_proc, p_pkt );
return VLC_DEMUXER_SUCCESS;
diff --git a/modules/demux/mpeg/ts.h b/modules/demux/mpeg/ts.h
index 6254d3c..28f8284 100644
--- a/modules/demux/mpeg/ts.h
+++ b/modules/demux/mpeg/ts.h
@@ -94,6 +94,7 @@ struct demux_sys_t
csa_t *csa;
int i_csa_pkt_size;
bool b_split_es;
+ bool b_valid_scrambling;
bool b_trust_pcr;
diff --git a/modules/demux/mpeg/ts_pid.c b/modules/demux/mpeg/ts_pid.c
index 5622cfa..92de329 100644
--- a/modules/demux/mpeg/ts_pid.c
+++ b/modules/demux/mpeg/ts_pid.c
@@ -145,6 +145,9 @@ bool PIDSetup( demux_t *p_demux, ts_pid_type_t i_type, ts_pid_t *pid, ts_pid_t *
PIDReset( pid );
return true;
+ case TYPE_CAT:
+ return true;
+
case TYPE_PAT:
PIDReset( pid );
pid->u.p_pat = ts_pat_New( p_demux );
@@ -228,6 +231,9 @@ void PIDRelease( demux_t *p_demux, ts_pid_t *pid )
assert( pid->type != TYPE_FREE );
break;
+ case TYPE_CAT:
+ break;
+
case TYPE_PAT:
ts_pat_Del( p_demux, pid->u.p_pat );
pid->u.p_pat = NULL;
diff --git a/modules/demux/mpeg/ts_pid.h b/modules/demux/mpeg/ts_pid.h
index 2034d98..3787b2b 100644
--- a/modules/demux/mpeg/ts_pid.h
+++ b/modules/demux/mpeg/ts_pid.h
@@ -29,6 +29,7 @@
typedef enum
{
TYPE_FREE = 0,
+ TYPE_CAT,
TYPE_PAT,
TYPE_PMT,
TYPE_PES,
More information about the vlc-commits
mailing list