numpyimage 3.0.0__tar.gz → 3.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {numpyimage-3.0.0/numpyimage.egg-info → numpyimage-3.0.2}/PKG-INFO +1 -1
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/vidio.py +22 -12
- {numpyimage-3.0.0 → numpyimage-3.0.2/numpyimage.egg-info}/PKG-INFO +1 -1
- {numpyimage-3.0.0 → numpyimage-3.0.2}/pyproject.toml +1 -1
- {numpyimage-3.0.0 → numpyimage-3.0.2}/LICENSE +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/README.md +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/__init__.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/align.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/graphics.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/imageio.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/nrrd_utils.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/operations.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/npimage/utils.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/numpyimage.egg-info/SOURCES.txt +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/numpyimage.egg-info/dependency_links.txt +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/numpyimage.egg-info/requires.txt +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/numpyimage.egg-info/top_level.txt +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/setup.cfg +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/tests/test_heic.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/tests/test_pbm.py +0 -0
- {numpyimage-3.0.0 → numpyimage-3.0.2}/tests/test_video_writers.py +0 -0
|
@@ -42,7 +42,7 @@ codec_aliases = {
|
|
|
42
42
|
'H.265': 'libx265',
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
supported_extensions = ['mp4', 'mkv', 'avi', 'mov']
|
|
45
|
+
supported_extensions = ['mp4', 'mkv', 'avi', 'mov', 'webm']
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
def load_video(filename,
|
|
@@ -313,13 +313,14 @@ class VideoStreamer:
|
|
|
313
313
|
return float(1.0 / self._framerate)
|
|
314
314
|
|
|
315
315
|
def frame_number_to_pts(self, frame_number: int) -> int:
|
|
316
|
+
frame_number = self._normalize_frame_number(frame_number)
|
|
316
317
|
if self._framerate == 'variable':
|
|
317
318
|
return self.frames_pts[frame_number]
|
|
318
319
|
else:
|
|
319
320
|
return int(frame_number) * self.pts_delta + self.pts0
|
|
320
321
|
|
|
321
322
|
def frame_number_to_time(self, frame_number: int) -> float:
|
|
322
|
-
return self.frame_number_to_pts(frame_number) * self.time_base
|
|
323
|
+
return float(self.frame_number_to_pts(frame_number) * self.time_base)
|
|
323
324
|
|
|
324
325
|
def __getitem__(self, key) -> np.ndarray:
|
|
325
326
|
if isinstance(key, tuple):
|
|
@@ -366,16 +367,7 @@ class VideoStreamer:
|
|
|
366
367
|
start, stop, step = frame_number.indices(self.n_frames)
|
|
367
368
|
return np.array([self._get_frame(i) for i in range(start, stop, step)])
|
|
368
369
|
with self._lock:
|
|
369
|
-
|
|
370
|
-
if frame_number < 0 and frame_number + self.n_frames >= 0:
|
|
371
|
-
frame_number += self.n_frames
|
|
372
|
-
elif frame_number >= self.n_frames:
|
|
373
|
-
raise IndexError(f'Frame {frame_number} out of range:'
|
|
374
|
-
f' [0, {self.n_frames-1}]')
|
|
375
|
-
elif frame_number < 0:
|
|
376
|
-
raise IndexError(f'Negative frame {frame_number} out of'
|
|
377
|
-
f' range: [-{self.n_frames}, -1]')
|
|
378
|
-
|
|
370
|
+
frame_number = self._normalize_frame_number(frame_number)
|
|
379
371
|
if (self._current_frame_number is None
|
|
380
372
|
or frame_number <= self._current_frame_number
|
|
381
373
|
or frame_number > self._current_frame_number + 100):
|
|
@@ -391,6 +383,24 @@ class VideoStreamer:
|
|
|
391
383
|
image = np.rot90(image, k=-int(self.rotation) // 90)
|
|
392
384
|
return image
|
|
393
385
|
|
|
386
|
+
def _normalize_frame_number(self, frame_number: int) -> int:
|
|
387
|
+
"""
|
|
388
|
+
Normalize frame number to be within the valid range.
|
|
389
|
+
"""
|
|
390
|
+
if not isinstance(frame_number, int):
|
|
391
|
+
raise TypeError(f'Frame number must be an integer, not {type(frame_number)}')
|
|
392
|
+
if frame_number < -self.n_frames:
|
|
393
|
+
raise IndexError(f'Negative frame {frame_number} not in'
|
|
394
|
+
f' valid range [-{self.n_frames}, -1]')
|
|
395
|
+
elif -self.n_frames <= frame_number and frame_number < 0:
|
|
396
|
+
return frame_number + self.n_frames
|
|
397
|
+
elif 0 <= frame_number and frame_number < self.n_frames:
|
|
398
|
+
return frame_number
|
|
399
|
+
elif self.n_frames <= frame_number:
|
|
400
|
+
raise IndexError(f'Frame {frame_number} not in'
|
|
401
|
+
f' valid range [0, {self.n_frames-1}]')
|
|
402
|
+
raise IndexError(f'Frame {frame_number} not understood')
|
|
403
|
+
|
|
394
404
|
@property
|
|
395
405
|
def first_frame(self):
|
|
396
406
|
if self._first_frame is None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|