diff options
author | Jochen Dolze <vdr@dolze.de> | 2009-09-27 12:57:15 +0200 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2009-09-27 12:57:15 +0200 |
commit | 36cba6f238db17094e18ca3144bd7d5d8a4ffdf0 (patch) | |
tree | 2cc5000cf77bc1d0f0715699bcbc68adb572124d /recv.cpp | |
parent | 960085e4f2cf759a61a46cf10e4d027ca8e96214 (diff) | |
download | vdr-plugin-markad-36cba6f238db17094e18ca3144bd7d5d8a4ffdf0.tar.gz vdr-plugin-markad-36cba6f238db17094e18ca3144bd7d5d8a4ffdf0.tar.bz2 |
Change marks upon priorityv0.0.4release/v0.0.4
Diffstat (limited to 'recv.cpp')
-rw-r--r-- | recv.cpp | 72 |
1 files changed, 63 insertions, 9 deletions
@@ -132,7 +132,7 @@ cMarkAdReceiver::~cMarkAdReceiver() if (buf) { tempmark.Comment=buf; - AddMark(&tempmark); + AddMark(&tempmark,0); isyslog("markad [%i]: %s",recvnumber,buf); free(buf); } @@ -148,6 +148,25 @@ cMarkAdReceiver::~cMarkAdReceiver() 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) @@ -210,7 +229,8 @@ void cMarkAdReceiver::Receive(uchar *Data, int Length) buffer.Signal(); } } -void cMarkAdReceiver::AddMark(MarkAdMark *mark) + +void cMarkAdReceiver::AddMark(MarkAdMark *mark, int Priority) { if (!mark) return; if (!mark->Position) return; @@ -218,8 +238,43 @@ void cMarkAdReceiver::AddMark(MarkAdMark *mark) cMark *newmark=marks.Add(mark->Position); if (newmark) { - if (newmark->comment) free(newmark->comment); - newmark->comment=strdup(mark->Comment); + char *buf; + asprintf(&buf,"P%i %s",Priority,mark->Comment); + if (buf) + { + if (newmark->comment) free(newmark->comment); + newmark->comment=buf; + } + } + marks.Save(); + +#define MAXPOSDIFF 10500 // = 7 min + + cMark *prevmark=marks.GetPrev(mark->Position); + if (!prevmark) return; + if (!prevmark->comment) return; + if (abs(mark->Position-prevmark->position)>MAXPOSDIFF) return; + + int prevPriority=atoi(prevmark->comment+1); + if (prevPriority==Priority) return; + + if (prevPriority>Priority) + { + // add text from mark to prevmark + prevmark->comment=strcatrealloc(prevmark->comment," "); + prevmark->comment=strcatrealloc(prevmark->comment,mark->Comment); + + marks.Del(newmark,true); + dsyslog("markad [%i]: delete mark %i",recvnumber,newmark->position); + } + else + { + // add text from prevmark to mark + mark->Comment=strcatrealloc(mark->Comment," "); + mark->Comment=strcatrealloc(mark->Comment,prevmark->comment); + + marks.Del(prevmark,true); + dsyslog("markad [%i]: delete previous mark %i",recvnumber,prevmark->position); } marks.Save(); } @@ -237,7 +292,7 @@ void cMarkAdReceiver::Action() if (common) { mark=common->Process(lastiframe); - AddMark(mark); + AddMark(mark,0); } if ((video_demux) && (decoder) && (video)) @@ -264,8 +319,7 @@ void cMarkAdReceiver::Action() if (decoder->DecodeVideo(&macontext,pkt,pktlen)) { mark=video->Process(lastiframe); - AddMark(mark); - + AddMark(mark,3); } } tspkt+=len; @@ -301,7 +355,7 @@ void cMarkAdReceiver::Action() if (decoder->DecodeMP2(&macontext,pkt,pktlen)) { mark=audio->Process(lastiframe); - AddMark(mark); + AddMark(mark,1); } } tspkt+=len; @@ -333,7 +387,7 @@ void cMarkAdReceiver::Action() if (decoder->DecodeAC3(&macontext,pkt,pktlen)) { mark=audio->Process(lastiframe); - AddMark(mark); + AddMark(mark,2); } } tspkt+=len; |