summaryrefslogtreecommitdiff
path: root/recv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'recv.cpp')
-rw-r--r--recv.cpp393
1 files changed, 0 insertions, 393 deletions
diff --git a/recv.cpp b/recv.cpp
deleted file mode 100644
index 4dbbbd0..0000000
--- a/recv.cpp
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * recv.cpp: A plugin for the Video Disk Recorder
- *
- * See the README file for copyright information and how to reach the author.
- *
- */
-
-#include "recv.h"
-
-#if APIVERSNUM > 10711
-cMarkAdReceiver::cMarkAdReceiver(int RecvNumber, const char *Filename, cTimer *Timer)
- :
- cReceiver(NULL, -1),
- cThread("markad"),
- buffer(MEGATS(3)), running(false) // 3MB Buffer
-#else
-cMarkAdReceiver::cMarkAdReceiver(int RecvNumber, const char *Filename, cTimer *Timer)
- :
- cReceiver(Timer->Channel()->GetChannelID(), -1,
- Timer->Channel()->Vpid(),Timer->Channel()->Dpids()),
- cThread("markad"),
- buffer(MEGATS(3)), running(false) // 3MB Buffer
-#endif
-{
- if ((!Filename) || (!Timer)) return;
-
-#if APIVERSNUM > 10711
- AddPid(Timer->Channel()->Vpid());
- AddPid(Timer->Channel()->Dpid(0));
-#endif
-
- recvnumber=RecvNumber;
- filename=strdup(Filename);
-
- // 10 ms timeout on getting TS frames
- buffer.SetTimeouts(0, 10);
-
- memset(&macontext,0,sizeof(macontext));
- macontext.StandAlone.LogoExtraction=-1; // we are not standalone ;)
- macontext.General.VPid.Num=Timer->Channel()->Vpid();
-
-#if APIVERSNUM > 10700
- switch (Timer->Channel()->Vtype())
- {
- case 0x2:
- macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
- break;
- case 0x1b:
- macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H264;
- break;
- default:
- macontext.General.VPid.Num=0;
- macontext.General.VPid.Type=0;
- break;
- }
-#else
-#if APIVERSNUM < 10700
- macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
-#else
-#error "VDR-1.7.0 is still unsupported"
-#error "in plugin version, please use"
-#error "standalone version: make markad"
-#endif
-#endif
-
- macontext.General.DPid.Num=Timer->Channel()->Dpid(0); // ... better solution?
- macontext.General.DPid.Type=MARKAD_PIDTYPE_AUDIO_AC3;
-
- if (macontext.General.VPid.Num)
- {
- dsyslog("markad [%i]: using %s-video",recvnumber,
- (macontext.General.VPid.Type==MARKAD_PIDTYPE_VIDEO_H264) ? "H264": "H262");
- video=new cMarkAdVideo(RecvNumber,&macontext);
- video_demux = new cMarkAdDemux(RecvNumber);
- }
- else
- {
- video=NULL;
- video_demux=NULL;
- }
-
- if (macontext.General.DPid.Num)
- {
- dsyslog("markad [%i]: using AC3",recvnumber);
- ac3_demux = new cMarkAdDemux(RecvNumber);
- }
- else
- {
- ac3_demux=NULL;
- }
-
- if ((macontext.General.APid.Num) || (macontext.General.DPid.Num))
- {
- audio=new cMarkAdAudio(RecvNumber,&macontext);
- }
- else
- {
- audio=NULL;
- }
-
- streaminfo=new cMarkAdStreamInfo;
-
- marks.Load(Filename);
-
- Index=NULL;
- lastiframe=0;
- framecnt=-1;
- marksfound=false;
-
- if (!marks.Count())
- {
- MarkAdMark tempmark;
- char *buf;
- tempmark.Position=0;
- if (asprintf(&buf,"start of recording (0)")!=-1)
- {
- tempmark.Comment=buf;
- AddMark(&tempmark,0);
- isyslog("markad [%i]: %s",recvnumber,buf);
- free(buf);
- }
- }
- else
- {
- marksfound=true;
- }
-}
-
-cMarkAdReceiver::~cMarkAdReceiver()
-{
- cReceiver::Detach();
- if (running)
- {
- running=false;
- buffer.Signal();
- Cancel(2);
- }
- buffer.Clear();
-
- if (lastiframe)
- {
- MarkAdMark tempmark;
- tempmark.Position=lastiframe;
- char *buf;
-
- if (asprintf(&buf,"stop of recording (%i)",lastiframe)!=-1)
- {
- tempmark.Comment=buf;
- AddMark(&tempmark,0);
- isyslog("markad [%i]: %s",recvnumber,buf);
- free(buf);
- }
- }
-
- if (Index) delete Index;
- if (video_demux) delete video_demux;
- if (ac3_demux) delete ac3_demux;
- if (streaminfo) delete streaminfo;
- if (video) delete video;
- if (audio) delete audio;
- if (filename) free(filename);
-}
-
-char *cMarkAdReceiver::strcatrealloc(char *dest, const char *src)
-{
- if (!src || !*src)
- return dest;
-
- size_t l = (dest ? strlen(dest) : 0) + strlen(src) + 1;
- if (dest)
- {
- dest = (char *)realloc(dest, l);
- strcat(dest, src);
- }
- else
- {
- dest = (char*)malloc(l);
- strcpy(dest, src);
- }
- return dest;
-}
-
-int cMarkAdReceiver::LastIFrame()
-{
- if (!Index)
- {
- if (!filename) return 0;
- Index = new cIndexFile(filename,false);
- if (!Index)
- {
- esyslog("markad [%i]: ERROR can't allocate index",recvnumber);
- return 0;
- }
- else if (!Index->Ok())
- {
- // index file is not ready till now, try it later
- delete Index;
- Index=NULL;
- return 0;
- }
- }
- int iframe=Index->GetNextIFrame(Index->Last(),false,NULL,NULL,NULL,true);
- if (iframe>0)
- {
- return iframe;
- }
- else
- {
- return 0;
- }
-}
-
-void cMarkAdReceiver::Activate(bool On)
-{
- if (On)
- {
- if (!running)
- {
- running=true;
- Start();
- }
- }
- else if (running)
- {
- running = false;
- buffer.Signal();
- Cancel(2);
- }
-}
-
-void cMarkAdReceiver::Receive(uchar *Data, int Length)
-{
- int len = Length;
-
- if (!buffer.Check(len))
- {
- // Buffer overrun
- esyslog("markad [%i]: buffer overrun (Check)",recvnumber);
- buffer.Signal();
- return;
- }
-
- cFrame *frame=new cFrame(Data, len);
- if (frame && !buffer.Put(frame))
- {
- // Buffer overrun
- esyslog("markad [%i]: buffer overrun (Put)",recvnumber);
- delete frame;
- buffer.Signal();
- }
-}
-
-void cMarkAdReceiver::AddMark(MarkAdMark *mark, int Priority)
-{
- if (!mark) return;
- if (!mark->Comment) return;
- if (mark->Position<0) return;
-
- cMark *newmark=marks.Add(mark->Position);
- if (newmark)
- {
- char *buf;
- if (asprintf(&buf,"P%i %s",Priority,mark->Comment)!=-1)
- {
- if (newmark->comment) free(newmark->comment);
- newmark->comment=buf;
- }
- }
- marks.Save();
-
- if (!marksfound)
- {
- cMark *prevmark=marks.GetPrev(mark->Position);
- if (!prevmark) return;
- if (!prevmark->comment) return;
- if (prevmark->position==0) return;
-#define MAXPOSDIFF (25*60*13) // = 13 min
- if (abs(mark->Position-prevmark->position)>MAXPOSDIFF)
- {
- cMark *firstmark=marks.Get(0);
- if (firstmark)
- {
- marks.Del(firstmark,true);
- marks.Save();
- marksfound=true;
- }
- }
- else
- {
- marksfound=true;
- }
- }
-}
-
-void cMarkAdReceiver::Action()
-{
- while (running)
- {
- cFrame *frame=buffer.Get();
- if (frame)
- {
- lastiframe=LastIFrame();
- MarkAdMark *mark;
-
- if ((video_demux) && (streaminfo) && (video))
- {
- cTimeMs t;
- uchar *pkt;
- int pktlen;
-
- uchar *tspkt = frame->Data();
- int tslen = frame->Count();
-
- while (tslen>0)
- {
- int len=video_demux->Process(macontext.General.VPid,tspkt,tslen,&pkt,&pktlen);
- if (len<0)
- {
- break;
- }
- else
- {
- if (pkt)
- {
- if (streaminfo->FindVideoInfos(&macontext,pkt,pktlen))
- {
- if (macontext.Video.Info.Pict_Type==MA_I_TYPE)
- {
- if (framecnt==-1)
- {
- framecnt=0;
- }
- else
- {
- mark=video->Process(lastiframe);
- AddMark(mark,3);
- }
- }
- if (framecnt!=-1) framecnt++;
- }
- }
- tspkt+=len;
- tslen-=len;
- }
- }
- if (t.Elapsed()>100)
- {
- isyslog("markad [%i]: 100ms exceeded -> %llums",
- recvnumber,(unsigned long long) t.Elapsed());
- }
- }
-
- if ((ac3_demux) && (streaminfo) && (audio))
- {
- uchar *pkt;
- int pktlen;
-
- uchar *tspkt = frame->Data();
- int tslen = frame->Count();
-
- while (tslen>0)
- {
- int len=ac3_demux->Process(macontext.General.DPid,tspkt,tslen,&pkt,&pktlen);
- if (len<0)
- {
- break;
- }
- else
- {
- if (pkt)
- {
- if (streaminfo->FindAC3AudioInfos(&macontext,pkt,pktlen))
- {
- mark=audio->Process(lastiframe);
- AddMark(mark,2);
- }
- }
- tspkt+=len;
- tslen-=len;
- }
- }
- }
-
- buffer.Drop(frame);
- }
- else
- buffer.Wait();
- }
- buffer.Clear();
- running=false;
-}
-
-