1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed handling the very last entry in a recording index

This commit is contained in:
Klaus Schmidinger 2012-11-12 14:50:02 +01:00
parent 1a1b7234ea
commit b951ca48a5
2 changed files with 22 additions and 17 deletions

View File

@ -7272,7 +7272,7 @@ Video Disk Recorder Revision History
".keep" to prevent a directory from being deleted when it is empty. Currently the
only file name that is ignored is ".sort".
2012-11-06: Version 1.7.32
2012-11-12: Version 1.7.32
- Pressing the Play key during normal live viewing mode now opens the Recordings menu
if there is no "last viewed" recording (thanks to Alexander Wenzel).
@ -7311,3 +7311,4 @@ Video Disk Recorder Revision History
complete GOP has been seen. This makes recordings and especially pausing live video
start up to twice as fast as before.
- Updated the Romanian OSD texts (thanks to Lucian Muresan).
- Fixed handling the very last entry in a recording index.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: recording.c 2.70 2012/11/04 15:27:44 kls Exp $
* $Id: recording.c 2.71 2012/11/12 14:48:12 kls Exp $
*/
#include "recording.h"
@ -1560,7 +1560,7 @@ void cIndexFileGenerator::Action(void)
uchar *p = Data;
while (Length >= TS_SIZE) {
int Pid = TsPid(p);
if (Pid == 0)
if (Pid == PATPID)
PatPmtParser.ParsePat(p, TS_SIZE);
else if (Pid == PatPmtParser.PmtPid())
PatPmtParser.ParsePmt(p, TS_SIZE);
@ -1768,7 +1768,7 @@ bool cIndexFile::CatchUp(int Index)
// returns true unless something really goes wrong, so that 'index' becomes NULL
if (index && f >= 0) {
cMutexLock MutexLock(&mutex);
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;
if (fstat(f, &buf) == 0) {
if (!IsInIndexList(this)) {
@ -1813,7 +1813,7 @@ bool cIndexFile::CatchUp(int Index)
}
else
LOG_ERROR_STR(*fileName);
if (Index < last)
if (Index <= last)
break;
cCondWait::SleepMs(1000);
}
@ -1841,12 +1841,13 @@ bool cIndexFile::Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
bool cIndexFile::Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent, int *Length)
{
if (CatchUp(Index)) {
if (Index >= 0 && Index < last) {
if (Index >= 0 && Index <= last) {
*FileNumber = index[Index].number;
*FileOffset = index[Index].offset;
if (Independent)
*Independent = index[Index].independent;
if (Length) {
if (Index < last) {
uint16_t fn = index[Index + 1].number;
off_t fo = index[Index + 1].offset;
if (fn == *FileNumber)
@ -1854,6 +1855,9 @@ bool cIndexFile::Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *I
else
*Length = -1; // this means "everything up to EOF" (the buffer's Read function will act accordingly)
}
else
*Length = -1;
}
return true;
}
}
@ -1866,7 +1870,7 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off
int d = Forward ? 1 : -1;
for (;;) {
Index += d;
if (Index >= 0 && Index < last) {
if (Index >= 0 && Index <= last) {
if (index[Index].independent) {
uint16_t fn;
if (!FileNumber)
@ -1900,7 +1904,7 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off
int cIndexFile::GetClosestIFrame(int Index)
{
if (last > 0) {
Index = constrain(Index, 0, last - 1);
Index = constrain(Index, 0, last);
if (index[Index].independent)
return Index;
int il = Index - 1;
@ -1911,9 +1915,9 @@ int cIndexFile::GetClosestIFrame(int Index)
return il;
il--;
}
else if (ih >= last)
else if (ih > last)
break;
if (ih < last) {
if (ih <= last) {
if (index[ih].independent)
return ih;
ih++;
@ -1930,7 +1934,7 @@ int cIndexFile::Get(uint16_t FileNumber, off_t FileOffset)
if (CatchUp()) {
//TODO implement binary search!
int i;
for (i = 0; i < last; i++) {
for (i = 0; i <= last; i++) {
if (index[i].number > FileNumber || (index[i].number == FileNumber) && off_t(index[i].offset) >= FileOffset)
break;
}
@ -2082,7 +2086,7 @@ bool cFileName::GetLastPatPmtVersions(int &PatVersion, int &PmtVersion)
while (read(fd, buf, sizeof(buf)) == sizeof(buf)) {
if (buf[0] == TS_SYNC_BYTE) {
int Pid = TsPid(buf);
if (Pid == 0)
if (Pid == PATPID)
PatPmtParser.ParsePat(buf, sizeof(buf));
else if (Pid == PatPmtParser.PmtPid()) {
PatPmtParser.ParsePmt(buf, sizeof(buf));