diff -X ignore-files -urN vls-org/src/modules/dvdreader/dvdreader.cpp vls-tsanalysis/src/modules/dvdreader/dvdreader.cpp --- vls-org/src/modules/dvdreader/dvdreader.cpp Thu Nov 29 17:11:42 2001 +++ vls-tsanalysis/src/modules/dvdreader/dvdreader.cpp Thu Mar 28 14:39:55 2002 @@ -38,8 +38,10 @@ #include #include +#include #include "../../mpeg/mpeg.h" #include "../../mpeg/ts.h" +#include "../../mpeg/tsanalysis.h" #include "../../mpeg/streamdescr.h" #include "../../mpeg/ps2ts.h" diff -X ignore-files -urN vls-org/src/modules/localinput/localinput.cpp vls-tsanalysis/src/modules/localinput/localinput.cpp --- vls-org/src/modules/localinput/localinput.cpp Thu Mar 21 15:09:19 2002 +++ vls-tsanalysis/src/modules/localinput/localinput.cpp Thu Mar 28 14:39:55 2002 @@ -35,8 +35,10 @@ #include "../../core/core.h" +#include #include "../../mpeg/mpeg.h" #include "../../mpeg/ts.h" +#include "../../mpeg/tsanalysis.h" #include "../../server/program.h" #include "../../server/buffer.h" diff -X ignore-files -urN vls-org/src/modules/ps2ts/ps2ts.cpp vls-tsanalysis/src/modules/ps2ts/ps2ts.cpp --- vls-org/src/modules/ps2ts/ps2ts.cpp Mon Mar 18 00:20:22 2002 +++ vls-tsanalysis/src/modules/ps2ts/ps2ts.cpp Thu Mar 28 14:56:26 2002 @@ -5,6 +5,7 @@ * $Id: ps2ts.cpp,v 1.3 2002/03/17 23:20:22 bozo Exp $ * * Authors: Arnaud de Bossoreille de Ribou +* Jean-Paul Saman * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -32,8 +33,10 @@ #include "../../core/core.h" +#include #include "../../mpeg/mpeg.h" #include "../../mpeg/ts.h" +#include "../../mpeg/tsanalysis.h" #include "../../mpeg/streamdescr.h" #include "../../mpeg/ps2ts.h" @@ -138,6 +141,11 @@ { C_TsPacket* pPacket = m_cConverter.GetPacket(); ASSERT(pPacket); + + // Check continuity of TS stream + if ( !m_cTsAnalysis.ContinuityCounterCheck(pPacket) ) + printf( "[ Ps2Ts ] Continuity Counter inconsistency found\n" ); + m_pHandler->HandlePacket(pPacket); if(m_cConverter.GetStatus()) { @@ -214,6 +222,10 @@ if(!iRc) { + // Check continuity of TS stream + if ( !m_cTsAnalysis.ContinuityCounterCheck(pPacket) ) + printf( "[ Ps2Ts ] Continuity Counter inconsistency found\n" ); + // Stores the packet in the buffer m_pHandler->HandlePacket(pPacket); } diff -X ignore-files -urN vls-org/src/modules/ps2ts/ps2ts.h vls-tsanalysis/src/modules/ps2ts/ps2ts.h --- vls-org/src/modules/ps2ts/ps2ts.h Wed Nov 28 20:32:23 2001 +++ vls-tsanalysis/src/modules/ps2ts/ps2ts.h Thu Mar 28 14:39:55 2002 @@ -65,6 +65,7 @@ C_Ps2Ts m_cConverter; bool m_bPreParse; + C_TsAnalysis m_cTsAnalysis; }; diff -X ignore-files -urN vls-org/src/modules/ts2ts/ts2ts.cpp vls-tsanalysis/src/modules/ts2ts/ts2ts.cpp --- vls-org/src/modules/ts2ts/ts2ts.cpp Mon Mar 18 00:20:22 2002 +++ vls-tsanalysis/src/modules/ts2ts/ts2ts.cpp Thu Mar 28 14:55:47 2002 @@ -5,6 +5,7 @@ * $Id: ts2ts.cpp,v 1.3 2002/03/17 23:20:22 bozo Exp $ * * Authors: Arnaud de Bossoreille de Ribou +* Jean-Paul Saman * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -32,8 +33,11 @@ #include "../../core/core.h" +#include #include "../../mpeg/mpeg.h" #include "../../mpeg/ts.h" +#include "../../mpeg/tsanalysis.h" + #include "../../server/buffer.h" #include "../../server/program.h" #include "../../server/broadcast.h" @@ -89,7 +93,6 @@ { // Inherited method C_MpegConverter::InitWork(); - int iRc = 0; if(m_iInitFill) @@ -98,15 +101,24 @@ C_TsPacket* pPacket = m_pTsProvider->GetPacket(); ASSERT(pPacket); iRc = SyncFillPacket(pPacket); + + if ( !m_cTsAnalysis.ContinuityCounterCheck(pPacket) ) + printf( "[ Ts2Ts ] Continuity Counter inconsistency found\n" ); + m_pHandler->HandlePacket(pPacket); if(!iRc) { - for(unsigned int ui = 1; ui < m_iInitFill; ui++) + for(unsigned int ui = 1; ui < (m_iInitFill); ui++) { C_TsPacket* pPacket = m_pTsProvider->GetPacket(); ASSERT(pPacket); iRc = SyncFillPacket(pPacket); + + // Check continuity of TS stream + if ( !m_cTsAnalysis.ContinuityCounterCheck(pPacket) ) + printf( "[ Ts2Ts ] Continuity Counter inconsistency found\n" ); + m_pHandler->HandlePacket(pPacket); if(iRc) break; @@ -174,6 +186,10 @@ if(!iRc) { + // Check continuity of TS stream + if ( !m_cTsAnalysis.ContinuityCounterCheck(pPacket) ) + printf( "[ Ts2Ts ] Continuity Counter inconsistency found\n" ); + // Stores the packet in the buffer m_pHandler->HandlePacket(pPacket); } @@ -190,7 +206,6 @@ m_pTsProvider->ReleasePacket(pPacket); } } - if(!m_bStop) { LogDbg(m_hLog, "Stopping converter by callback for program " + strPgrmName); diff -X ignore-files -urN vls-org/src/modules/ts2ts/ts2ts.h vls-tsanalysis/src/modules/ts2ts/ts2ts.h --- vls-org/src/modules/ts2ts/ts2ts.h Wed Nov 28 20:32:23 2001 +++ vls-tsanalysis/src/modules/ts2ts/ts2ts.h Thu Mar 28 14:39:55 2002 @@ -45,6 +45,8 @@ int FillPacket(C_TsPacket* pPacket); int SyncFillPacket(C_TsPacket* pPacket); +private: + C_TsAnalysis m_cTsAnalysis; }; diff -X ignore-files -urN vls-org/src/modules/videoinput/videoinput.cpp vls-tsanalysis/src/modules/videoinput/videoinput.cpp --- vls-org/src/modules/videoinput/videoinput.cpp Thu Mar 21 15:09:19 2002 +++ vls-tsanalysis/src/modules/videoinput/videoinput.cpp Thu Mar 28 14:39:55 2002 @@ -36,8 +36,11 @@ #include "../../core/core.h" +#include #include "../../mpeg/mpeg.h" #include "../../mpeg/ts.h" +#include "../../mpeg/tsanalysis.h" + #include "../../mpeg/streamdescr.h" #include "../../mpeg/ps2ts.h" diff -X ignore-files -urN vls-org/src/mpeg/dvbpsi.cpp vls-tsanalysis/src/mpeg/dvbpsi.cpp --- vls-org/src/mpeg/dvbpsi.cpp Thu Mar 21 20:03:54 2002 +++ vls-tsanalysis/src/mpeg/dvbpsi.cpp Thu Mar 28 14:48:39 2002 @@ -393,7 +393,6 @@ m_pTsProvider->ReleasePacket(pPacket); } - //****************************************************************************** // C_DvbPsiPmt class //****************************************************************************** diff -X ignore-files -urN vls-org/src/mpeg/dvbpsi.h vls-tsanalysis/src/mpeg/dvbpsi.h --- vls-org/src/mpeg/dvbpsi.h Thu Mar 21 15:09:19 2002 +++ vls-tsanalysis/src/mpeg/dvbpsi.h Thu Mar 28 14:48:38 2002 @@ -121,7 +121,6 @@ void Detach(); virtual void HandlePacket(C_TsPacket* pPacket); - private: static void Callback(C_DvbPsiPatDecoder *pThis, dvbpsi_pat_t* p_new_pat); @@ -207,7 +206,6 @@ void Detach(); virtual void HandlePacket(C_TsPacket* pPacket); - private: static void Callback(C_DvbPsiPmtDecoder *pThis, dvbpsi_pmt_t* p_new_pmt); diff -X ignore-files -urN vls-org/src/mpeg/ts.cpp vls-tsanalysis/src/mpeg/ts.cpp --- vls-org/src/mpeg/ts.cpp Mon Mar 18 00:20:22 2002 +++ vls-tsanalysis/src/mpeg/ts.cpp Thu Mar 28 15:00:11 2002 @@ -149,7 +149,16 @@ return ((bData[3] & 0x20) && bData[4] && (bData[5] & 0x80)); } - +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +// Get the ContinuityCounter +//------------------------------------------------------------------------------ +unsigned char C_TsPacket::GetContinuityCounter() const +{ + u8 iByte = bData[3]; + return(iByte & 0x0F) ; +} //------------------------------------------------------------------------------ // diff -X ignore-files -urN vls-org/src/mpeg/ts.h vls-tsanalysis/src/mpeg/ts.h --- vls-org/src/mpeg/ts.h Thu Mar 21 15:09:19 2002 +++ vls-tsanalysis/src/mpeg/ts.h Thu Mar 28 15:00:29 2002 @@ -54,6 +54,9 @@ bool IsDiscontinuity() const; s64 GetPCRTime() const; + // Packet consistency checks + unsigned char GetContinuityCounter() const; + // Reference counter unsigned int Ref() { diff -X ignore-files -urN vls-org/src/mpeg/tsanalysis.cpp vls-tsanalysis/src/mpeg/tsanalysis.cpp --- vls-org/src/mpeg/tsanalysis.cpp Thu Jan 1 01:00:00 1970 +++ vls-tsanalysis/src/mpeg/tsanalysis.cpp Thu Mar 28 14:39:55 2002 @@ -0,0 +1,80 @@ +/******************************************************************************* +* tsanalysis.cpp: TsAnalysis packet administration +*------------------------------------------------------------------------------- +* (c)1999-2001 VideoLAN +* $Id: ts.cpp,v 1.2 2002/03/22 23:20:22 jpsaman Exp $ +* +* Authors: Jean-Paul Saman +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +*------------------------------------------------------------------------------- +* +*******************************************************************************/ +#include "../core/defs.h" + +//#include "config.h" +#include "../core/core.h" +#include "mpeg.h" +#include +#include "ts.h" +#include "tsanalysis.h" + +//****************************************************************************** +// C_TsAnalysis class +//****************************************************************************** +// Class primarily used for debugging and analysis of a Ts stream. It currently checks +// the ContinuityCounter for all Pid found in the stream. +//****************************************************************************** +C_TsAnalysis::C_TsAnalysis() +{ +} + +C_TsAnalysis::~C_TsAnalysis() +{ +} + +//****************************************************************************** +// ContinuityCounterCheck - Analyze continuity counter for every Pid in the streamer +//****************************************************************************** +bool C_TsAnalysis::ContinuityCounterCheck(C_TsPacket* pPacket) +{ + int iContinuityCounter = -1; + + // Does pPacket->GetPid() already exists as key? + if ( m_aContinuity.find(pPacket->GetPid())!=m_aContinuity.end() ) + { + iContinuityCounter = m_aContinuity[pPacket->GetPid()]; + } + // Check continuity of TS stream + if (iContinuityCounter!=-1) + { + iContinuityCounter = (iContinuityCounter+1)%16; + if ( iContinuityCounter != pPacket->GetContinuityCounter() ) + { + printf(" [ TsAnalysis ] Continuity Counter mismatch for Pid(%d): found %d, expected %d\n", + pPacket->GetPid(),iContinuityCounter, pPacket->GetContinuityCounter() ); + iContinuityCounter = pPacket->GetContinuityCounter(); + return false; + } + } + else + { + iContinuityCounter = pPacket->GetContinuityCounter(); + } + m_aContinuity[pPacket->GetPid()] = iContinuityCounter; + return true; +} + diff -X ignore-files -urN vls-org/src/mpeg/tsanalysis.h vls-tsanalysis/src/mpeg/tsanalysis.h --- vls-org/src/mpeg/tsanalysis.h Thu Jan 1 01:00:00 1970 +++ vls-tsanalysis/src/mpeg/tsanalysis.h Thu Mar 28 14:39:55 2002 @@ -0,0 +1,50 @@ +/******************************************************************************* +* tsanalysis.h: TsAnalisys class definition +*------------------------------------------------------------------------------- +* (c)1999-2001 VideoLAN +* $Id: ts.h,v 1.3 2002/03/22 14:09:19 jpsaman Exp $ +* +* Authors: Jean-Paul Saman +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +*------------------------------------------------------------------------------- +* +*******************************************************************************/ + +#ifndef _TSANALYSIS_H_ +#define _TSANALYSIS_H_ + +//------------------------------------------------------------------------------ +// Analysis of TS stream +//------------------------------------------------------------------------------ +class C_TsAnalysis +{ + public: + C_TsAnalysis(); + ~C_TsAnalysis(); + + bool ContinuityCounterCheck( C_TsPacket* pPacket); + + private: + // The map contains (Pid, ContinuityCounter) pair of a TsPacket + map m_aContinuity; +}; + +#else +#error "Multiple inclusions of tsanalysis.h" +#endif + + diff -X ignore-files -urN vls-org/src/server/manager.cpp vls-tsanalysis/src/server/manager.cpp --- vls-org/src/server/manager.cpp Wed Mar 13 13:32:48 2002 +++ vls-tsanalysis/src/server/manager.cpp Thu Mar 28 14:39:55 2002 @@ -35,8 +35,10 @@ #include "../core/core.h" +#include #include "../mpeg/mpeg.h" #include "../mpeg/ts.h" +#include "../mpeg/tsanalysis.h" #include "program.h" #include "request.h" diff -X ignore-files -urN vls-org/src/server/tsstreamer.cpp vls-tsanalysis/src/server/tsstreamer.cpp --- vls-org/src/server/tsstreamer.cpp Thu Mar 21 15:09:19 2002 +++ vls-tsanalysis/src/server/tsstreamer.cpp Thu Mar 28 14:54:37 2002 @@ -6,6 +6,7 @@ * * Authors: Benoit Steiner * Arnaud de Bossoreille de Ribou +* Jean-Paul Saman * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -35,8 +36,11 @@ #include #include "../core/core.h" +#include #include "../mpeg/mpeg.h" #include "../mpeg/ts.h" +#include "../mpeg/tsanalysis.h" + #include "program.h" #include "buffer.h" #include "output.h" @@ -142,55 +146,59 @@ //------------------------------------------------------------------------------ void C_TsStreamer::DoWork() { - int iRc = NO_ERR; + int iRc = NO_ERR; // Get the packet from the buffer and send them to the output while(!m_bStop && iRc >= 0) { - C_TsPacket* pPacket = m_pBuffer->Pop(); - ASSERT(pPacket); + C_TsPacket* pPacket = m_pBuffer->Pop(); + ASSERT(pPacket); - if(m_bUsePcr) - { - // Increases the counters - m_uiByteRead += TS_PACKET_LEN; - m_iHowMany ++; - - // Read the PCR info if any - if(pPacket->HasPCR()) + if(m_bUsePcr) { - if(m_bFirstPCR) + // Increases the counters + m_uiByteRead += TS_PACKET_LEN; + m_iHowMany ++; + + // Check continuity of TS stream + if ( !m_cTsAnalysis.ContinuityCounterCheck(pPacket) ) + printf( "[ TsStreamer ] Continuity Counter inconsistency found\n" ); + + // Read the PCR info if any + if(pPacket->HasPCR()) + { + if(m_bFirstPCR) + { + InitClock(pPacket); + m_bFirstPCR = 0; + } + else + AdjustClock(pPacket); + } + + // Wait until the date at which the packet must be sent is reached + // For better perf, doesn't sleep for each TS but only when the output + // buffer is ready to be send + if(m_iHowMany == m_pOutput->GetBuffCapacity()) { - InitClock(pPacket); - m_bFirstPCR = 0; + WaitSendDate(); + m_iHowMany = 0; } else - AdjustClock(pPacket); - } + m_iHowMany++; - // Wait until the date at which the packet must be sent is reached - // For better perf, doesn't sleep for each TS but only when the output - // buffer is ready to be send - if(m_iHowMany == m_pOutput->GetBuffCapacity()) + // TS packet is ok, send it + try { - WaitSendDate(); - m_iHowMany = 0; + m_pOutput->Send(pPacket); + } + catch(E_Exception e) + { + iRc = GEN_ERR; + C_String strPgrmName = m_pBroadcast->GetProgram()->GetName(); + Log(m_hLog, LOG_NOTE, C_String("Unable to send stream for pgrm ")+ + strPgrmName + ": "/* + e.Dump()*/); } - else - m_iHowMany++; - } - - // TS packet is ok, send it - try - { - m_pOutput->Send(pPacket); - } - catch(E_Exception e) - { - iRc = GEN_ERR; - C_String strPgrmName = m_pBroadcast->GetProgram()->GetName(); - Log(m_hLog, LOG_NOTE, C_String("Unable to send stream for pgrm ")+ - strPgrmName + ": "/* + e.Dump()*/); } } diff -X ignore-files -urN vls-org/src/server/tsstreamer.h vls-tsanalysis/src/server/tsstreamer.h --- vls-org/src/server/tsstreamer.h Thu Mar 21 15:09:19 2002 +++ vls-tsanalysis/src/server/tsstreamer.h Thu Mar 28 14:39:55 2002 @@ -78,6 +78,8 @@ double m_dSlope; unsigned int m_iHowMany; + // TsAnalysis + C_TsAnalysis m_cTsAnalysis; }; #else --- vls-org/Makefile Thu Mar 21 19:56:38 2002 +++ vls-tsanalysis/Makefile Thu Mar 28 14:57:23 2002 @@ -64,6 +64,7 @@ ifeq ($(NEEDSRC_mpegbase),1) SRC+= src/mpeg/ts.cpp \ + src/mpeg/tsanalysis.cpp \ src/mpeg/streamdescr.cpp \ src/mpeg/reader.cpp \ src/mpeg/converter.cpp \