mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Fixed breaking off replay in case the user hits "Play" or "Pause" too soon after going into "Pause live video" mode
This commit is contained in:
		
							
								
								
									
										7
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -2209,7 +2209,7 @@ Video Disk Recorder Revision History | ||||
| - It is now possible to directly delete a timer that is currently recording | ||||
|   (thanks to Alexander Damhuis for reporting this one). | ||||
|  | ||||
| 2003-05-29: Version 1.2.0pre1 | ||||
| 2003-05-30: Version 1.2.0pre1 | ||||
|  | ||||
| - Some corrections to the French OSD texts (thanks to Olivier Jacques). | ||||
| - Fixed some missing commas in i18n.c (thanks to Dimitrios Dimitrakos for | ||||
| @@ -2217,9 +2217,8 @@ Video Disk Recorder Revision History | ||||
| - Some corrections to the Finnish OSD texts (thanks to Niko Tarnanen and Rolf | ||||
|   Ahrenberg). | ||||
| - Completed the Italian OSD texts (thanks to Antonio Ospite). | ||||
| - Added an additional sleep() after going into "Pause live video" mode to avoid | ||||
|   breaking off replay in case the user hits "Play" or "Pause" too soon (thanks | ||||
|   to Karim Afifi for reporting ths one). | ||||
| - Fixed breaking off replay in case the user hits "Play" or "Pause" too soon after | ||||
|   going into "Pause live video" mode (thanks to Karim Afifi for reporting ths one). | ||||
| - Some corrections to the Catalanian OSD texts (thanks to Jordi Vil<69>). | ||||
| - Single event timers are now deleted if the recording they are doing is | ||||
|   deleted before the timer ends. | ||||
|   | ||||
							
								
								
									
										3
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								menu.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: menu.c 1.252 2003/05/29 11:43:36 kls Exp $ | ||||
|  * $Id: menu.c 1.253 2003/05/30 09:53:57 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "menu.h" | ||||
| @@ -3141,7 +3141,6 @@ bool cRecordControls::PauseLiveVideo(void) | ||||
|      sleep(1); // allow device to replay some frames, so we have a picture | ||||
|      Interface->Close(); | ||||
|      rc->ProcessKey(kPause); // pause, allowing replay mode display | ||||
|      sleep(3); // allow recorded file to fill up enough to continue replaying | ||||
|      return true; | ||||
|      } | ||||
|   Interface->Close(); | ||||
|   | ||||
							
								
								
									
										95
									
								
								recording.c
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								recording.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: recording.c 1.79 2003/05/24 11:22:34 kls Exp $ | ||||
|  * $Id: recording.c 1.80 2003/05/30 13:23:54 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "recording.h" | ||||
| @@ -769,6 +769,12 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi | ||||
|  | ||||
| #define INDEXFILESUFFIX     "/index.vdr" | ||||
|  | ||||
| // The number of frames to stay off the end in case of time shift: | ||||
| #define INDEXSAFETYLIMIT 100 // frames | ||||
|  | ||||
| // The maximum time to wait before giving up while catching up on an index file: | ||||
| #define MAXINDEXCATCHUP   8 // seconds | ||||
|  | ||||
| // The minimum age of an index file for considering it no longer to be written: | ||||
| #define MININDEXAGE    3600 // seconds | ||||
|  | ||||
| @@ -852,47 +858,50 @@ bool cIndexFile::CatchUp(int Index) | ||||
| { | ||||
|   // returns true unless something really goes wrong, so that 'index' becomes NULL | ||||
|   if (index && f >= 0) { | ||||
|      if (Index < 0 || Index >= last) { | ||||
|         struct stat buf; | ||||
|         if (fstat(f, &buf) == 0) { | ||||
|            if (time(NULL) - buf.st_mtime > MININDEXAGE) { | ||||
|               // apparently the index file is not being written any more | ||||
|               close(f); | ||||
|               f = -1; | ||||
|               return true; | ||||
|               } | ||||
|            int newLast = buf.st_size / sizeof(tIndex) - 1; | ||||
|            if (newLast > last) { | ||||
|               if (size <= newLast) { | ||||
|                  size *= 2; | ||||
|                  if (size <= newLast) | ||||
|                     size = newLast + 1; | ||||
|                  } | ||||
|               index = (tIndex *)realloc(index, size * sizeof(tIndex)); | ||||
|               if (index) { | ||||
|                  int offset = (last + 1) * sizeof(tIndex); | ||||
|                  int delta = (newLast - last) * sizeof(tIndex); | ||||
|                  if (lseek(f, offset, SEEK_SET) == offset) { | ||||
|                     if (safe_read(f, &index[last + 1], delta) != delta) { | ||||
|                        esyslog("ERROR: can't read from index"); | ||||
|                        free(index); | ||||
|                        index = NULL; | ||||
|                        close(f); | ||||
|                        f = -1; | ||||
|                        return true; | ||||
|                        } | ||||
|                     last = newLast; | ||||
|                     } | ||||
|                  else | ||||
|                     LOG_ERROR_STR(fileName); | ||||
|                  } | ||||
|               else | ||||
|                  esyslog("ERROR: can't realloc() index"); | ||||
|               } | ||||
|            } | ||||
|         else | ||||
|            LOG_ERROR_STR(fileName); | ||||
|         } | ||||
|      for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) { | ||||
|          struct stat buf; | ||||
|          if (fstat(f, &buf) == 0) { | ||||
|             if (time(NULL) - buf.st_mtime > MININDEXAGE) { | ||||
|                // apparently the index file is not being written any more | ||||
|                close(f); | ||||
|                f = -1; | ||||
|                break; | ||||
|                } | ||||
|             int newLast = buf.st_size / sizeof(tIndex) - 1; | ||||
|             if (newLast > last) { | ||||
|                if (size <= newLast) { | ||||
|                   size *= 2; | ||||
|                   if (size <= newLast) | ||||
|                      size = newLast + 1; | ||||
|                   } | ||||
|                index = (tIndex *)realloc(index, size * sizeof(tIndex)); | ||||
|                if (index) { | ||||
|                   int offset = (last + 1) * sizeof(tIndex); | ||||
|                   int delta = (newLast - last) * sizeof(tIndex); | ||||
|                   if (lseek(f, offset, SEEK_SET) == offset) { | ||||
|                      if (safe_read(f, &index[last + 1], delta) != delta) { | ||||
|                         esyslog("ERROR: can't read from index"); | ||||
|                         free(index); | ||||
|                         index = NULL; | ||||
|                         close(f); | ||||
|                         f = -1; | ||||
|                         break; | ||||
|                         } | ||||
|                      last = newLast; | ||||
|                      } | ||||
|                   else | ||||
|                      LOG_ERROR_STR(fileName); | ||||
|                   } | ||||
|                else | ||||
|                   esyslog("ERROR: can't realloc() index"); | ||||
|                } | ||||
|             } | ||||
|          else | ||||
|             LOG_ERROR_STR(fileName); | ||||
|          if (Index < last - (i ? 2 * INDEXSAFETYLIMIT : 0) || Index > 10 * INDEXSAFETYLIMIT) // keep off the end in case of "Pause live video" | ||||
|             break; | ||||
|          sleep(1); | ||||
|          } | ||||
|      } | ||||
|   return index != NULL; | ||||
| } | ||||
| @@ -940,7 +949,7 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uchar *FileNumber, int *F | ||||
|      int d = Forward ? 1 : -1; | ||||
|      for (;;) { | ||||
|          Index += d; | ||||
|          if (Index >= 0 && Index < last - ((Forward && StayOffEnd) ? 100 : 0)) { | ||||
|          if (Index >= 0 && Index < last - ((Forward && StayOffEnd) ? INDEXSAFETYLIMIT : 0)) { | ||||
|             if (index[Index].type == I_FRAME) { | ||||
|                if (FileNumber) | ||||
|                   *FileNumber = index[Index].number; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user