]> git.vomp.tv Git - vompclient.git/blob - recording.cc
Windows readme and makefile updated!
[vompclient.git] / recording.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "recording.h"
22
23 #include "recinfo.h"
24 #include "mark.h"
25 #include "log.h"
26 #include "demuxer.h"
27 #include "demuxerts.h"
28 #include "command.h"
29 #include "seriesinfo.h"
30 #include "movieinfo.h"
31
32 Recording* Recording::recInfoFor = NULL;
33 RecInfo* Recording::recInfo = NULL;
34 MovieInfo* Recording::movieInfo = NULL;
35 SeriesInfo* Recording::seriesInfo = NULL;
36
37 Recording::Recording()
38 {
39   logger = Log::getInstance();
40   vdr = VDR::getInstance();
41
42   isNew = false;
43   start = 0;
44   progName = NULL;
45   fileName = NULL;
46   index = -1;
47   markList = NULL;
48   movieID = 0;
49   seriesID = 0;
50   episodeID = 0;
51 }
52
53 Recording::~Recording()
54 {
55   if (progName) { delete[] progName; progName = NULL; }
56   if (fileName) { delete[] fileName; fileName = NULL; }
57   index = -1; // just in case
58
59   if (markList && markList->size())
60   {
61     for(UINT i = 0; i < markList->size(); i++)
62     {
63       delete (*markList)[i];
64     }
65     markList->clear();
66     Log::getInstance()->log("Recording", Log::DEBUG, "Recording destructor, marks list deleted");
67   }
68
69   if (markList) delete markList;
70 }
71
72 ULONG Recording::getStartTime() const
73 {
74   return start;
75 }
76
77 char* Recording::getProgName() const
78 {
79   return progName;
80 }
81
82 char* Recording::getFileName() const
83 {
84   return fileName;
85 }
86
87 void Recording::setNew(bool param)
88 {
89   isNew = param;
90 }
91
92 void Recording::setStartTime(ULONG tstartTime)
93 {
94   start = tstartTime;
95 }
96
97 void Recording::setProgName(char* tProgName)
98 {
99   if (progName) delete[] progName;
100
101   progName = new char[strlen(tProgName) + 1];
102   if (progName) strcpy(progName, tProgName);
103 }
104
105 void Recording::setFileName(char* tFileName)
106 {
107   if (fileName) delete[] fileName;
108
109   fileName = new char[strlen(tFileName) + 1];
110   if (fileName) strcpy(fileName, tFileName);
111 }
112
113 void Recording::loadRecInfo()
114 {
115   if (recInfoFor == this) return; // it already is loaded
116
117   if (recInfo) delete recInfo;
118   recInfoFor = this;
119   recInfo = vdr->getRecInfo(fileName);
120   Log::getInstance()->log("Recording", Log::DEBUG, "Recording has loaded recInfo %p", recInfo);
121   
122   if (!vdr->isConnected()) Command::getInstance()->connectionLost();
123
124   if (movieInfo) delete movieInfo;
125   if (seriesInfo) delete seriesInfo;
126
127   movieInfo = NULL;
128   seriesInfo = NULL;
129   movieID = 0;
130   seriesID =0;
131
132   vdr->getScraperEventType(fileName, movieID, seriesID, episodeID);
133   Log::getInstance()->log("Recording", Log::DEBUG, "Got Scraper EventType %d %d %d",
134                   movieID, seriesID, episodeID);
135
136   if (!vdr->isConnected()) Command::getInstance()->connectionLost();
137
138   if (movieID != 0)
139   {
140           movieInfo = vdr->getScraperMovieInfo(movieID);
141           Log::getInstance()->log("Recording", Log::DEBUG, "Got Scraper MovieInfo ");
142   }
143   else if (seriesID != 0)
144   {
145           seriesInfo = vdr->getScraperSeriesInfo(seriesID, episodeID);
146           Log::getInstance()->log("Recording", Log::DEBUG, "Got Scraper SeriesInfo ");
147   }
148
149
150   if (!vdr->isConnected()) Command::getInstance()->connectionLost();
151
152 }
153
154 void Recording::dropRecInfo()
155 {
156   if (recInfo) delete recInfo;
157   recInfo = NULL;
158   recInfoFor = NULL;
159   if (movieInfo) delete movieInfo;
160   if (seriesInfo) delete seriesInfo;
161
162   movieInfo = NULL;
163   seriesInfo = NULL;
164 }
165
166 void Recording::loadMarks()
167 {
168   markList = vdr->getMarks(fileName);
169   if (!VDR::getInstance()->isConnected()) Command::getInstance()->connectionLost();
170 }
171
172 bool Recording::isRadio(bool &h264)
173 {
174   ULONG lengthFrames = 0;
175   ULLONG lengthBytes = vdr->streamRecording(getFileName(), &lengthFrames, &IsPesRecording);
176   if (!lengthBytes || !lengthFrames) return false;
177
178   UINT thisRead;
179   UCHAR* buffer = vdr->getBlock(0ULL, 10000U, &thisRead);
180   if (!buffer) return false;
181
182   if (!thisRead)
183   {
184     free(buffer);
185     return false;
186   }
187
188   bool hasVideo = false;
189   bool ish264=false;
190   if (IsPesRecording)
191     hasVideo = Demuxer::scanForVideo(buffer, thisRead, ish264);
192   else
193     hasVideo = DemuxerTS::scanForVideo(buffer, thisRead,ish264);
194
195   h264=ish264;
196
197   free(buffer);
198
199   vdr->stopStreaming();
200   if (!VDR::getInstance()->isConnected()) Command::getInstance()->connectionLost();
201   
202   Log::getInstance()->log("Recording", Log::DEBUG, "Recording has messed about and worked out radio = %u", !hasVideo);
203
204
205   if (!hasVideo) return true;
206   return false;
207 }
208
209 int Recording::getPrevMark(int currentFrame)
210 {
211   MarkList::reverse_iterator i;
212   Mark* loopMark = NULL;
213
214   if (!markList || !markList->size()) return 0;
215
216   for(i = markList->rbegin(); i != markList->rend(); i++)
217   {
218     loopMark = *i;
219     logger->log("Recording", Log::NOTICE, "findprev:comparing Frame %i with current Frame %i",loopMark->pos,currentFrame);
220
221     if (loopMark->pos < currentFrame)
222     {
223       logger->log("Recording", Log::NOTICE, "findprev:setting pos %i to jumpframe_target",loopMark->pos);
224       return loopMark->pos;
225     }
226   }
227
228   // No previous mark
229   return 0;
230 }
231
232 int Recording::getNextMark(int currentFrame)
233 {
234   MarkList::iterator i;
235   Mark* loopMark = NULL;
236
237   if (!markList || !markList->size()) return 0;
238
239   for(i = markList->begin(); i != markList->end(); i++)
240   {
241     loopMark = *i;
242     logger->log("Recording", Log::NOTICE, "findnext:comparing Frame %i with current Frame %i",loopMark->pos,currentFrame);
243
244     if (loopMark->pos > currentFrame)
245     {
246       logger->log("Recording", Log::NOTICE, "findnext:setting pos %i to jumpframe_target",loopMark->pos);
247       return loopMark->pos;
248     }
249   }
250
251   // No next mark
252   return 0;
253 }
254
255 bool Recording::hasMarks()
256 {
257   return (markList && markList->size());
258 }
259
260 MarkList* Recording::getMarkList()
261 {
262   return markList;
263 }