From c848ab793a302dc067663ec4a06395745e443c9d Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 6 Sep 2008 18:00:00 +0200 Subject: =?UTF-8?q?Version=201.7.1=20-=20Adapted=20the=20tuning=20code=20t?= =?UTF-8?q?o=20the=20new=20DVBFE=5FSET=5FDELSYS=20API=20(thanks=20to=20Rei?= =?UTF-8?q?nhard=20Nissl).=20=20=20VDR=20now=20uses=20the=20driver=20from?= =?UTF-8?q?=20http://jusst.de/hg/multiproto=5Fplus.=20-=20Updated=20the=20?= =?UTF-8?q?Italian=20OSD=20texts=20(thanks=20to=20Diego=20Pierotto).=20-?= =?UTF-8?q?=20Removed=20obsolete=20$(NCURSESLIB)=20from=20the=20Makefile.?= =?UTF-8?q?=20-=20Implemented=20handling=20the=20standard=20component=20de?= =?UTF-8?q?scriptor=20for=20AC3=20(stream=3D4),=20as=20it=20=20=20will=20s?= =?UTF-8?q?oon=20be=20used=20by=20the=20German=20ARD=20channels=20(thanks?= =?UTF-8?q?=20to=20Michael=20Pennewi=C3=9F=20for=20=20=20advance=20informa?= =?UTF-8?q?tion=20about=20this=20change).=20The=20previously=20used=20"Pre?= =?UTF-8?q?miere=20pseudo=20=20=20standard"=20(stream=3D2,=20type=3D5)=20s?= =?UTF-8?q?till=20works,=20but=20has=20apparently=20been=20wrongfully=20us?= =?UTF-8?q?ed=20=20=20by=20broadcasters=20from=20the=20beginning.=20-=20Ad?= =?UTF-8?q?ded=20missing=20description=20of=20the=20'S'=20channel=20parame?= =?UTF-8?q?ter=20to=20vdr.5=20(reported=20by=20=20=20Reinhard=20Nissl).=20?= =?UTF-8?q?-=20The=20SVDRP=20signon=20message=20now=20indicates=20the=20ch?= =?UTF-8?q?aracter=20encoding=20in=20use,=20as=20in=20=20=20"220=20video?= =?UTF-8?q?=20SVDRP=20VideoDiskRecorder=201.7.1;=20Fri=20May=20=202=2016:1?= =?UTF-8?q?7:10=202008;=20ISO-8859-1".=20=20=20This=20may=20be=20useful=20?= =?UTF-8?q?for=20instance=20for=20external=20tools=20that=20provide=20EPG?= =?UTF-8?q?=20data,=20so=20that=20=20=20they=20can=20correctly=20encode=20?= =?UTF-8?q?the=20strings.=20-=20No=20longer=20calling=20FcFini()=20to=20av?= =?UTF-8?q?oid=20problems=20with=20older=20(broken)=20versions=20of=20=20?= =?UTF-8?q?=20fontconfig=20(suggested=20by=20Edgar=20Toernig).=20-=20Remov?= =?UTF-8?q?ed=20the=20compile=20time=20option=20VFAT=20to=20allow=20users?= =?UTF-8?q?=20of=20precompiled=20binary=20=20=20distributions=20to=20have?= =?UTF-8?q?=20full=20control=20over=20whether=20or=20not=20to=20use=20the?= =?UTF-8?q?=20--vfat=20option=20=20=20at=20runtime=20(suggested=20by=20Mic?= =?UTF-8?q?hael=20Nork).=20-=20First=20step=20towards=20switching=20to=20T?= =?UTF-8?q?S=20(Transport=20Stream)=20as=20recording=20format:=20=20=20+?= =?UTF-8?q?=20The=20new=20function=20cDevice::PlayTs()=20is=20used=20to=20?= =?UTF-8?q?play=20TS=20packets.=20=20=20+=20The=20new=20functions=20cDevic?= =?UTF-8?q?e::PlayTsVideo()=20and=20cDevice::PlayTsAudio()=20=20=20=20=20a?= =?UTF-8?q?re=20used=20to=20play=20video=20and=20audio=20TS=20packets,=20r?= =?UTF-8?q?espectively.=20=20=20+=20The=20new=20function=20cAudio::PlayTs(?= =?UTF-8?q?)=20is=20used=20to=20play=20audio=20TS=20packets.=20=20=20+=20T?= =?UTF-8?q?he=20new=20class=20cPatPmtGenerator=20is=20used=20to=20generate?= =?UTF-8?q?=20a=20PAT/PMT=20pair=20that=20precedes=20=20=20=20=20the=20TS?= =?UTF-8?q?=20data=20in=20Transfer=20Mode.=20=20=20+=20The=20new=20class?= =?UTF-8?q?=20cPatPmtParser=20is=20used=20by=20cDevice=20to=20parse=20the?= =?UTF-8?q?=20PAT/PMT=20data=20in=20a=20=20=20=20=20TS=20in=20order=20to?= =?UTF-8?q?=20find=20out=20which=20streams=20it=20contains.=20=20=20+=20Th?= =?UTF-8?q?e=20new=20class=20cTsToPes=20is=20used=20to=20convert=20TS=20pa?= =?UTF-8?q?ckets=20to=20a=20PES=20packet.=20=20=20+=20cTransfer=20no=20lon?= =?UTF-8?q?ger=20uses=20cRemux,=20and=20doesn't=20run=20a=20separate=20thr?= =?UTF-8?q?ead=20any=20more.=20=20=20=20=20It=20just=20generates=20a=20PAT?= =?UTF-8?q?/PMT=20and=20sends=20all=20received=20TS=20packets=20to=20the?= =?UTF-8?q?=20primary=20=20=20=20=20device's=20PlayTs().=20=20=20+=20Live?= =?UTF-8?q?=20subtitle=20display=20no=20longer=20uses=20a=20ring=20buffer?= =?UTF-8?q?=20and=20separate=20thread.=20=20=20+=20cPesAssembler=20has=20b?= =?UTF-8?q?een=20removed.=20Old=20VDR=20recordings=20only=20contain=20comp?= =?UTF-8?q?lete=20PES=20=20=20=20=20packets.=20=20=20+=20Since=20a=20TS=20?= =?UTF-8?q?needs=20to=20have=20a=20PAT/PMT,=20which=20requires=20the=20vid?= =?UTF-8?q?eo=20stream=20type=20to=20=20=20=20=20be=20explicitly=20given,?= =?UTF-8?q?=20the=20format=20of=20the=20VPID=20field=20in=20the=20channels?= =?UTF-8?q?.conf=20file=20=20=20=20=20and=20the=20SVDRP=20commands=20NEWC/?= =?UTF-8?q?MODC/LSTC=20has=20been=20extended.=20The=20video=20stream=20typ?= =?UTF-8?q?e=20=20=20=20=20now=20follows=20the=20VPID=20and=20optional=20P?= =?UTF-8?q?PID,=20separated=20by=20an=20'=3D'=20sign.=20-=20Updated=20the?= =?UTF-8?q?=20sources.conf=20file=20(thanks=20to=20Oleg=20Roitburd).=20-?= =?UTF-8?q?=20Fixed=20a=20possible=20integer=20overflow=20in=20GetAbsTime(?= =?UTF-8?q?)=20(thanks=20to=20Alexander=20Rieger).=20-=20Fixed=20a=20probl?= =?UTF-8?q?em=20with=20calling=20isyslog()=20from=20within=20the=20SignalH?= =?UTF-8?q?andler()=20(thanks=20=20=20to=20Udo=20Richter).=20-=20Replaced?= =?UTF-8?q?=20the=20Finnish=20language=20code=20"smi"=20with=20"suo"=20(th?= =?UTF-8?q?anks=20to=20Rolf=20Ahrenberg).=20-=20Fixed=20wrong=20value=20fo?= =?UTF-8?q?r=20TableIdBAT=20in=20libsi/si.h=20(thanks=20to=20Winfried=20K?= =?UTF-8?q?=C3=B6hler).=20-=20Errors=20in=20config=20files=20no=20longer?= =?UTF-8?q?=20keep=20VDR=20from=20starting.=20-=20Removed=20unneeded=20inc?= =?UTF-8?q?lude=20files=20=20und=20=20from=20remu?= =?UTF-8?q?x.h=20=20=20(reported=20by=20Tobias=20Grimm).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- transfer.c | 95 +++++++++++++------------------------------------------------- 1 file changed, 19 insertions(+), 76 deletions(-) (limited to 'transfer.c') diff --git a/transfer.c b/transfer.c index 04d88a1..9a6aee3 100644 --- a/transfer.c +++ b/transfer.c @@ -4,109 +4,52 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: transfer.c 2.0 2007/01/05 10:45:28 kls Exp $ + * $Id: transfer.c 2.1 2008/08/15 14:32:12 kls Exp $ */ #include "transfer.h" -#define TRANSFERBUFSIZE MEGABYTE(2) -#define POLLTIMEOUTS_BEFORE_DEVICECLEAR 6 - // --- cTransfer ------------------------------------------------------------- cTransfer::cTransfer(tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids) :cReceiver(ChannelID, -1, VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids) -,cThread("transfer") { - ringBuffer = new cRingBufferLinear(TRANSFERBUFSIZE, TS_SIZE * 2, true, "Transfer"); - remux = new cRemux(VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids); + patPmtGenerator.GeneratePmt(ChannelID); } cTransfer::~cTransfer() { cReceiver::Detach(); cPlayer::Detach(); - delete remux; - delete ringBuffer; } void cTransfer::Activate(bool On) { - if (On) - Start(); - else { - Cancel(3); - cPlayer::Detach(); + if (On) { + PlayTs(patPmtGenerator.GetPat(), TS_SIZE); + int Index = 0; + while (uchar *pmt = patPmtGenerator.GetPmt(Index)) + PlayTs(pmt, TS_SIZE); } } void cTransfer::Receive(uchar *Data, int Length) { - if (cPlayer::IsAttached() && Running()) { - int p = ringBuffer->Put(Data, Length); - if (p != Length && Running()) - ringBuffer->ReportOverflow(Length - p); + if (cPlayer::IsAttached()) { + // Transfer Mode means "live tv", so there's no point in doing any additional + // buffering here. The TS packets *must* get through here! However, every + // now and then there may be conditions where the packet just can't be + // handled when offered the first time, so that's why we try several times: + for (int i = 0; i < 100; i++) { + if (PlayTs(Data, Length) > 0) + return; + fprintf(stderr, "-");//XXX just for testing - remove when stable + cCondWait::SleepMs(10); + } + esyslog("ERROR: TS packet not accepted in Transfer Mode"); } } -void cTransfer::Action(void) -{ - int PollTimeouts = 0; - uchar *p = NULL; - int Result = 0; - while (Running()) { - int Count; - uchar *b = ringBuffer->Get(Count); - if (b) { - if (ringBuffer->Available() > TRANSFERBUFSIZE * 9 / 10) { - // If the buffer runs full, we have no chance of ever catching up - // since the data comes in at the same rate as it goes out (it's "live"). - // So let's clear the buffer instead of suffering from permanent - // overflows. - dsyslog("clearing transfer buffer to avoid overflows"); - DeviceClear(); - ringBuffer->Clear(); - remux->Clear(); - PlayPes(NULL, 0); - p = NULL; - continue; - } - Count = remux->Put(b, Count); - if (Count) - ringBuffer->Del(Count); - } - if (!p) - p = remux->Get(Result); - if (p) { - cPoller Poller; - if (DevicePoll(Poller, 100)) { - PollTimeouts = 0; - int w = PlayPes(p, Result); - if (w > 0) { - p += w; - Result -= w; - remux->Del(w); - if (Result <= 0) - p = NULL; - } - else if (w < 0 && FATALERRNO) - LOG_ERROR; - } - else { - PollTimeouts++; - if (PollTimeouts == POLLTIMEOUTS_BEFORE_DEVICECLEAR) { - dsyslog("clearing device because of consecutive poll timeouts"); - DeviceClear(); - ringBuffer->Clear(); - remux->Clear(); - PlayPes(NULL, 0); - p = NULL; - } - } - } - } -} - // --- cTransferControl ------------------------------------------------------ cDevice *cTransferControl::receiverDevice = NULL; -- cgit v1.2.3