Fixed cIndexFile::GetNextIFrame() to properly handle the case where the very last frame is an I-frame

This commit is contained in:
Klaus Schmidinger 2012-12-23 13:37:13 +01:00
parent d6efa529c9
commit dee67e7061
2 changed files with 12 additions and 9 deletions

View File

@ -7456,3 +7456,5 @@ Video Disk Recorder Revision History
- Updated the Italian OSD texts (thanks to Diego Pierotto). - Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed replay stuttering close to the end of an ongoing recording (reported by Andreas - Fixed replay stuttering close to the end of an ongoing recording (reported by Andreas
Regel). Regel).
- Fixed cIndexFile::GetNextIFrame() to properly handle the case where the very last frame
is an I-frame (which normally shouldn't occur).

View File

@ -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.79 2012/12/23 13:30:37 kls Exp $ * $Id: recording.c 2.80 2012/12/23 13:34:06 kls Exp $
*/ */
#include "recording.h" #include "recording.h"
@ -1939,15 +1939,16 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off
*FileNumber = index[Index].number; *FileNumber = index[Index].number;
*FileOffset = index[Index].offset; *FileOffset = index[Index].offset;
if (Length) { if (Length) {
// all recordings end with a non-independent frame, so the following should be safe: if (Index < last) {
uint16_t fn = index[Index + 1].number; uint16_t fn = index[Index + 1].number;
off_t fo = index[Index + 1].offset; off_t fo = index[Index + 1].offset;
if (fn == *FileNumber) if (fn == *FileNumber)
*Length = int(fo - *FileOffset); *Length = int(fo - *FileOffset);
else { else
esyslog("ERROR: 'I' frame at end of file #%d", *FileNumber); *Length = -1; // this means "everything up to EOF" (the buffer's Read function will act accordingly)
*Length = -1;
} }
else
*Length = -1;
} }
return Index; return Index;
} }