mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Fixed replaying ongoing recordings from other VDR instances
This commit is contained in:
		
							
								
								
									
										3
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -7417,7 +7417,7 @@ Video Disk Recorder Revision History | |||||||
|   plugins to display these items in a more elaborate way than just a simple line of |   plugins to display these items in a more elaborate way than just a simple line of | ||||||
|   text. |   text. | ||||||
|  |  | ||||||
| 2012-12-23: Version 1.7.34 | 2012-12-24: Version 1.7.34 | ||||||
|  |  | ||||||
| - Changed the type of the TimerMatch parameter in cSkinDisplayMenu::SetItemEvent() from | - Changed the type of the TimerMatch parameter in cSkinDisplayMenu::SetItemEvent() from | ||||||
|   'int' to 'eTimerEvent' (reported by Christoph Haubrich). |   'int' to 'eTimerEvent' (reported by Christoph Haubrich). | ||||||
| @@ -7458,3 +7458,4 @@ Video Disk Recorder Revision History | |||||||
|   Regel). |   Regel). | ||||||
| - Fixed cIndexFile::GetNextIFrame() to properly handle the case where the very last frame | - Fixed cIndexFile::GetNextIFrame() to properly handle the case where the very last frame | ||||||
|   is an I-frame (which normally shouldn't occur). |   is an I-frame (which normally shouldn't occur). | ||||||
|  | - Fixed replaying ongoing recordings from other VDR instances. | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								recording.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								recording.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: recording.c 2.80 2012/12/23 13:34:06 kls Exp $ |  * $Id: recording.c 2.81 2012/12/23 15:11:28 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "recording.h" | #include "recording.h" | ||||||
| @@ -1666,7 +1666,8 @@ void cIndexFileGenerator::Action(void) | |||||||
| #define INDEXFILESUFFIX     "/index" | #define INDEXFILESUFFIX     "/index" | ||||||
|  |  | ||||||
| // The maximum time to wait before giving up while catching up on an index file: | // The maximum time to wait before giving up while catching up on an index file: | ||||||
| #define MAXINDEXCATCHUP   8 // seconds | #define MAXINDEXCATCHUP    8 // number of retries | ||||||
|  | #define INDEXCATCHUPWAIT 100 // milliseconds | ||||||
|  |  | ||||||
| struct tIndexPes { | struct tIndexPes { | ||||||
|   uint32_t offset; |   uint32_t offset; | ||||||
| @@ -1693,9 +1694,6 @@ struct tIndexTs { | |||||||
| #define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file | #define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file | ||||||
| #define INDEXFILETESTINTERVAL   10 // ms between tests for the size of the index file in case of pausing live video | #define INDEXFILETESTINTERVAL   10 // ms between tests for the size of the index file in case of pausing live video | ||||||
|  |  | ||||||
| cMutex cIndexFile::indexListMutex; |  | ||||||
| cVector<const cIndexFile *> cIndexFile::indexList; |  | ||||||
|  |  | ||||||
| cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive) | cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive) | ||||||
| :resumeFile(FileName, IsPesRecording) | :resumeFile(FileName, IsPesRecording) | ||||||
| { | { | ||||||
| @@ -1776,13 +1774,10 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, b | |||||||
|            LOG_ERROR_STR(*fileName); |            LOG_ERROR_STR(*fileName); | ||||||
|         } |         } | ||||||
|      } |      } | ||||||
|   if (Record) |  | ||||||
|      AddToIndexList(this); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| cIndexFile::~cIndexFile() | cIndexFile::~cIndexFile() | ||||||
| { | { | ||||||
|   RemoveFromIndexList(this); |  | ||||||
|   if (f >= 0) |   if (f >= 0) | ||||||
|      close(f); |      close(f); | ||||||
|   free(index); |   free(index); | ||||||
| @@ -1829,11 +1824,6 @@ bool cIndexFile::CatchUp(int Index) | |||||||
|      for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) { |      for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) { | ||||||
|          struct stat buf; |          struct stat buf; | ||||||
|          if (fstat(f, &buf) == 0) { |          if (fstat(f, &buf) == 0) { | ||||||
|             if (!IsInIndexList(this)) { |  | ||||||
|                close(f); |  | ||||||
|                f = -1; |  | ||||||
|                break; |  | ||||||
|                } |  | ||||||
|             int newLast = int(buf.st_size / sizeof(tIndexTs) - 1); |             int newLast = int(buf.st_size / sizeof(tIndexTs) - 1); | ||||||
|             if (newLast > last) { |             if (newLast > last) { | ||||||
|                int NewSize = size; |                int NewSize = size; | ||||||
| @@ -1873,7 +1863,7 @@ bool cIndexFile::CatchUp(int Index) | |||||||
|             LOG_ERROR_STR(*fileName); |             LOG_ERROR_STR(*fileName); | ||||||
|          if (Index < last) |          if (Index < last) | ||||||
|             break; |             break; | ||||||
|          cCondWait::SleepMs(1000); |          cCondWait::SleepMs(INDEXCATCHUPWAIT); | ||||||
|          } |          } | ||||||
|      } |      } | ||||||
|   return index != NULL; |   return index != NULL; | ||||||
| @@ -2028,39 +2018,6 @@ int cIndexFile::GetLength(const char *FileName, bool IsPesRecording) | |||||||
|   return -1; |   return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| void cIndexFile::AddToIndexList(const cIndexFile *IndexFile) |  | ||||||
| { |  | ||||||
|   cMutexLock MutexLock(&indexListMutex); |  | ||||||
|   for (int i = 0; i < indexList.Size(); i++) { |  | ||||||
|       if (!indexList[i]) { |  | ||||||
|          indexList[i] = IndexFile; |  | ||||||
|          return; |  | ||||||
|          } |  | ||||||
|       } |  | ||||||
|   indexList.Append(IndexFile); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void cIndexFile::RemoveFromIndexList(const cIndexFile *IndexFile) |  | ||||||
| { |  | ||||||
|   cMutexLock MutexLock(&indexListMutex); |  | ||||||
|   for (int i = 0; i < indexList.Size(); i++) { |  | ||||||
|       if (indexList[i] == IndexFile) { |  | ||||||
|          indexList[i] = NULL; |  | ||||||
|          return; |  | ||||||
|          } |  | ||||||
|       } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool cIndexFile::IsInIndexList(const cIndexFile *IndexFile) |  | ||||||
| { |  | ||||||
|   cMutexLock MutexLock(&indexListMutex); |  | ||||||
|   for (int i = 0; i < indexList.Size(); i++) { |  | ||||||
|       if (indexList[i] && !strcmp(indexList[i]->fileName, IndexFile->fileName)) |  | ||||||
|          return true; |  | ||||||
|       } |  | ||||||
|   return false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool GenerateIndex(const char *FileName)  | bool GenerateIndex(const char *FileName)  | ||||||
| { | { | ||||||
|   if (DirectoryOk(FileName)) { |   if (DirectoryOk(FileName)) { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: recording.h 2.40 2012/11/13 11:43:59 kls Exp $ |  * $Id: recording.h 2.41 2012/12/23 15:11:53 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef __RECORDING_H | #ifndef __RECORDING_H | ||||||
| @@ -292,11 +292,6 @@ private: | |||||||
|   cResumeFile resumeFile; |   cResumeFile resumeFile; | ||||||
|   cIndexFileGenerator *indexFileGenerator; |   cIndexFileGenerator *indexFileGenerator; | ||||||
|   cMutex mutex; |   cMutex mutex; | ||||||
|   static cMutex indexListMutex; |  | ||||||
|   static cVector<const cIndexFile *> indexList; |  | ||||||
|   static void AddToIndexList(const cIndexFile *IndexFile); |  | ||||||
|   static void RemoveFromIndexList(const cIndexFile *IndexFile); |  | ||||||
|   static bool IsInIndexList(const cIndexFile *IndexFile); |  | ||||||
|   void ConvertFromPes(tIndexTs *IndexTs, int Count); |   void ConvertFromPes(tIndexTs *IndexTs, int Count); | ||||||
|   void ConvertToPes(tIndexTs *IndexTs, int Count); |   void ConvertToPes(tIndexTs *IndexTs, int Count); | ||||||
|   bool CatchUp(int Index = -1); |   bool CatchUp(int Index = -1); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user