Skip to content

Commit

Permalink
Issue #495: begin seek well into the file by default
Browse files Browse the repository at this point in the history
  • Loading branch information
happycube committed May 31, 2020
1 parent 42b3525 commit cf79ed6
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 24 deletions.
2 changes: 1 addition & 1 deletion ld-cut
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ ldd = LDdecode(filename, None, loader, system=system, doDOD = False)
signal.signal(signal.SIGINT, original_sigint_handler)

if args.seek != -1:
startloc = ldd.seek(args.start, args.seek)
startloc = ldd.seek(args.seek if args.start == 0 else args.start, args.seek)
if startloc is None:
print("ERROR: Seeking failed")
exit(1)
Expand Down
4 changes: 2 additions & 2 deletions ld-decode
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ if system == 'NTSC' and not args.ntscj:
#print(ldd.blackIRE)

if args.seek != -1:
if ldd.seek(firstframe, args.seek) is None:
print("ERROR: Seeking failed")
if ldd.seek(args.seek if firstframe == 0 else firstframe, args.seek) is None:
print("ERROR: Seeking failed", file=sys.stderr)
exit(1)

if args.MTF is not None:
Expand Down
55 changes: 34 additions & 21 deletions lddecode/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -3088,42 +3088,55 @@ def buildmetadata(self, f):

return fi, False

# seek support function
def seek_getframenr(self, start):
self.roughseek(start)
def seek_getframenr(self, startfield):
""" Reads from file location startfield, returns first VBI frame # or None on failure and revised startfield """

''' Note that if startfield is not 0, and the read fails, it will automatically retry
at file location 0
'''

self.roughseek(startfield)

for fields in range(10):
self.fieldloc = self.fdoffset
f, offset = self.decodefield(initphase = True)

self.prevfield = self.curfield
self.curfield = f
self.fdoffset += offset
if f is None:
if startfield != 0:
startfield = 0
self.roughseek(startfield)
else:
return None, startfield
else:
self.prevfield = self.curfield
self.curfield = f
self.fdoffset += offset

if self.prevfield is not None and f is not None and f.valid:
fnum = self.decodeFrameNumber(self.prevfield, self.curfield)
if self.prevfield is not None and f.valid:
fnum = self.decodeFrameNumber(self.prevfield, self.curfield)

if self.earlyCLV:
logging.error("Cannot seek in early CLV disks w/o timecode")
return None
elif fnum is not None:
rawloc = np.floor((self.readloc / self.bytes_per_field) / 2)
logging.info('seeking: file loc %d frame # %d', rawloc, fnum)
return fnum

return False
if self.earlyCLV:
logging.error("Cannot seek in early CLV disks w/o timecode")
return None, startfield
elif fnum is not None:
rawloc = np.floor((self.readloc / self.bytes_per_field) / 2)
logging.info('seeking: file loc %d frame # %d', rawloc, fnum)
return fnum, startfield

def seek(self, start, target):
cur = start * 2
return None, None

def seek(self, startframe, target):
""" Attempts to find frame target from file location startframe """
logging.info("Beginning seek")

if not sys.warnoptions:
import warnings
warnings.simplefilter("ignore")

curfield = startframe * 2

for retries in range(3):
fnr = self.seek_getframenr(cur)
fnr, curfield = self.seek_getframenr(curfield)
if fnr is None:
return None

Expand All @@ -3134,7 +3147,7 @@ def seek(self, start, target):
self.roughseek(cur)
return cur

cur += ((target - fnr) * 2) - 1
curfield += ((target - fnr) * 2) - 1

return None

Expand Down

0 comments on commit cf79ed6

Please sign in to comment.