yta-video-opengl 0.0.20__tar.gz → 0.0.22__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.
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/PKG-INFO +2 -1
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/pyproject.toml +5 -1
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/audio.py +5 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/frame_combinator.py +1 -90
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/frame_generator.py +42 -1
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/frame_wrapper.py +13 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/timeline.py +199 -118
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/track/__init__.py +14 -7
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/track/parts.py +99 -62
- yta_video_opengl-0.0.22/src/yta_video_opengl/media.py +347 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/reader/cache/__init__.py +9 -5
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/tests.py +34 -1
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/LICENSE +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/README.md +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/classes.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/track/media/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/track/utils.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/nodes/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/nodes/audio/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/nodes/video/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/nodes/video/opengl.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/reader/__init__.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/reader/cache/audio.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/reader/cache/utils.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/reader/cache/video.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/t.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/utils.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/video.py +0 -0
- {yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/writer.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: yta-video-opengl
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.22
|
4
4
|
Summary: Youtube Autonomous Video OpenGL Module
|
5
5
|
Author: danialcala94
|
6
6
|
Author-email: danielalcalavalera@gmail.com
|
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
10
10
|
Requires-Dist: av (>=0.0.1,<19.0.0)
|
11
11
|
Requires-Dist: moderngl (>=0.0.1,<9.0.0)
|
12
12
|
Requires-Dist: numpy (>=0.0.1,<9.0.0)
|
13
|
+
Requires-Dist: pillow (>=0.0.1,<99.0.0)
|
13
14
|
Requires-Dist: quicktions (>=0.0.1,<9.0.0)
|
14
15
|
Requires-Dist: yta_timer (>0.0.1,<1.0.0)
|
15
16
|
Requires-Dist: yta_validation (>=0.0.1,<1.0.0)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "yta-video-opengl"
|
3
|
-
version = "0.0.
|
3
|
+
version = "0.0.22"
|
4
4
|
description = "Youtube Autonomous Video OpenGL Module"
|
5
5
|
authors = [
|
6
6
|
{name = "danialcala94",email = "danielalcalavalera@gmail.com"}
|
@@ -15,6 +15,10 @@ dependencies = [
|
|
15
15
|
"moderngl (>=0.0.1,<9.0.0)",
|
16
16
|
"numpy (>=0.0.1,<9.0.0)",
|
17
17
|
"quicktions (>=0.0.1,<9.0.0)",
|
18
|
+
# I need this 'pillow' just to read an image
|
19
|
+
# and transform into a numpy array to be able
|
20
|
+
# to handle the ImageMedia
|
21
|
+
"pillow (>=0.0.1,<99.0.0)"
|
18
22
|
]
|
19
23
|
|
20
24
|
[tool.poetry]
|
@@ -1,3 +1,8 @@
|
|
1
|
+
"""
|
2
|
+
TODO: This class has not been refactored nor
|
3
|
+
tested. I need to put some love on it to make
|
4
|
+
it work and test that it is working properly.
|
5
|
+
"""
|
1
6
|
from yta_video_opengl.reader import VideoReader
|
2
7
|
from yta_video_opengl.writer import VideoWriter
|
3
8
|
from yta_video_opengl.t import T
|
@@ -201,93 +201,4 @@ class AudioFrameCombinator:
|
|
201
201
|
)
|
202
202
|
out.sample_rate = sample_rate
|
203
203
|
|
204
|
-
return out
|
205
|
-
|
206
|
-
# TODO: This method below has been refactored
|
207
|
-
# to the 'sum_tracks_frames', so delete it
|
208
|
-
# when the one above is working well
|
209
|
-
def mix_audio_frames_by_index(
|
210
|
-
tracks_frames,
|
211
|
-
sample_rate: int,
|
212
|
-
layout = 'stereo',
|
213
|
-
):
|
214
|
-
"""
|
215
|
-
Combine all the columns of the given
|
216
|
-
matrix of audio frames 'tracks_frames'.
|
217
|
-
The rows are the different tracks and
|
218
|
-
the columns are the frame at that 't'
|
219
|
-
moment of each of those tracks.
|
220
|
-
|
221
|
-
The 'tracks_frames' matrix needs to be
|
222
|
-
pre-processed to have only 1 single
|
223
|
-
frame to combine, so we concatenate
|
224
|
-
all the frames if more than 1 per
|
225
|
-
column.
|
226
|
-
"""
|
227
|
-
# TODO: Please, improve and clean all this
|
228
|
-
# code is so sh*tty, and make utils to
|
229
|
-
# combine and those things, not here...
|
230
|
-
# Also the formats, make them dynamic and
|
231
|
-
# based on the output that is defined here
|
232
|
-
# in the Timeline class.
|
233
|
-
mixed_frames = []
|
234
|
-
|
235
|
-
# Iterate by columns (each row is a track)
|
236
|
-
for frames_at_index in zip(*tracks_frames):
|
237
|
-
arrays = []
|
238
|
-
for f in frames_at_index:
|
239
|
-
# Resample to output expected values
|
240
|
-
# TODO: This must be dynamic depending
|
241
|
-
# on the track values
|
242
|
-
resampler = AudioResampler(format = 'fltp', layout = 'stereo', rate = sample_rate)
|
243
|
-
arr = resampler.resample(f)
|
244
|
-
|
245
|
-
arr = f.to_ndarray()
|
246
|
-
|
247
|
-
# TODO: This below must change depending
|
248
|
-
# on the expected output, for us and now
|
249
|
-
# it is float32, fltp, stereo, 44_100
|
250
|
-
# Same format
|
251
|
-
if arr.dtype == np.int16:
|
252
|
-
arr = arr.astype(np.float32) / 32768.0
|
253
|
-
|
254
|
-
# Same layout (number of channels)
|
255
|
-
if arr.shape[0] == 1:
|
256
|
-
return np.repeat(arr, 2, axis = 0)
|
257
|
-
# elif arr.dtype == np.float32:
|
258
|
-
# # Ya está en [-1,1], no lo toques
|
259
|
-
# pass
|
260
|
-
|
261
|
-
arrays.append(arr)
|
262
|
-
|
263
|
-
# Alinear longitudes
|
264
|
-
max_len = max(a.shape[1] for a in arrays)
|
265
|
-
stacked = []
|
266
|
-
for a in arrays:
|
267
|
-
buf = np.zeros((a.shape[0], max_len), dtype = np.float32)
|
268
|
-
buf[:, :a.shape[1]] = a
|
269
|
-
stacked.append(buf)
|
270
|
-
|
271
|
-
# Mezcla
|
272
|
-
mix = np.sum(stacked, axis = 0) / len(stacked)
|
273
|
-
#mix = np.sum(stacked, axis = 0)
|
274
|
-
|
275
|
-
# Limitar al rango [-1,1]
|
276
|
-
mix = np.clip(mix, -1.0, 1.0)
|
277
|
-
|
278
|
-
# Crear frame de salida
|
279
|
-
# TODO: What about the 'format' if they
|
280
|
-
# are all different (?)
|
281
|
-
out = AudioFrame.from_ndarray(mix, format = 'fltp', layout = layout)
|
282
|
-
out.sample_rate = sample_rate
|
283
|
-
# TODO: This will be written later when
|
284
|
-
# encoding
|
285
|
-
# out.pts = frames_at_index[0].pts
|
286
|
-
# out.time_base = frames_at_index[0].time_base
|
287
|
-
|
288
|
-
print(mix.min(), mix.max())
|
289
|
-
|
290
|
-
mixed_frames.append(out)
|
291
|
-
|
292
|
-
return mixed_frames
|
293
|
-
|
204
|
+
return out
|
{yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/frame_generator.py
RENAMED
@@ -28,6 +28,9 @@ class _FrameGenerator:
|
|
28
28
|
Class to generate frames as numpy arrays.
|
29
29
|
"""
|
30
30
|
|
31
|
+
# TODO: I have some library doing this with
|
32
|
+
# colors and numpy frames, so please refactor
|
33
|
+
|
31
34
|
def full_black(
|
32
35
|
self,
|
33
36
|
size: tuple[int, int] = (1920, 1080),
|
@@ -57,8 +60,27 @@ class _FrameGenerator:
|
|
57
60
|
"""
|
58
61
|
# TODO: I think 'ones' only work if dtype
|
59
62
|
# is int
|
60
|
-
return np.
|
63
|
+
return np.full(
|
64
|
+
shape = (size[1], size[0], 3),
|
65
|
+
fill_value = (255, 255, 255),
|
66
|
+
dtype = dtype
|
67
|
+
)
|
68
|
+
|
69
|
+
def full_red(
|
70
|
+
self,
|
71
|
+
size: tuple[int, int] = (1920, 1080),
|
72
|
+
dtype: np.dtype = np.uint8
|
73
|
+
):
|
74
|
+
"""
|
75
|
+
Get a numpy array that represents a full
|
76
|
+
red frame of the given 'size' and with
|
77
|
+
the given 'dtype'.
|
78
|
+
"""
|
79
|
+
# TODO: I think 'ones' only work if dtype
|
80
|
+
# is int
|
81
|
+
return np.full(
|
61
82
|
shape = (size[1], size[0], 3),
|
83
|
+
fill_value = (255, 0, 0),
|
62
84
|
dtype = dtype
|
63
85
|
)
|
64
86
|
|
@@ -115,6 +137,25 @@ class _BackgroundFrameGenerator:
|
|
115
137
|
time_base = time_base
|
116
138
|
)
|
117
139
|
|
140
|
+
def full_red(
|
141
|
+
self,
|
142
|
+
size: tuple[int, int] = (1920, 1080),
|
143
|
+
dtype: np.dtype = np.uint8,
|
144
|
+
format: str = 'rgb24',
|
145
|
+
pts: Union[int, None] = None,
|
146
|
+
time_base: Union['Fraction', None] = None
|
147
|
+
) -> VideoFrame:
|
148
|
+
"""
|
149
|
+
Get a video frame that is completely red
|
150
|
+
and of the given 'size'.
|
151
|
+
"""
|
152
|
+
return numpy_to_video_frame(
|
153
|
+
frame = self._frame_generator.full_red(size, dtype),
|
154
|
+
format = format,
|
155
|
+
pts = pts,
|
156
|
+
time_base = time_base
|
157
|
+
)
|
158
|
+
|
118
159
|
class VideoFrameGenerator:
|
119
160
|
"""
|
120
161
|
Class to wrap the functionality related to
|
{yta_video_opengl-0.0.20 → yta_video_opengl-0.0.22}/src/yta_video_opengl/complete/frame_wrapper.py
RENAMED
@@ -5,6 +5,12 @@ from typing import Union
|
|
5
5
|
|
6
6
|
|
7
7
|
IS_FROM_EMPTY_PART_METADATA = 'is_from_empty_part'
|
8
|
+
"""
|
9
|
+
Metadata key to indicate if the frame
|
10
|
+
has been generated by an empty part
|
11
|
+
and should be ignored when trying to
|
12
|
+
combine with others.
|
13
|
+
"""
|
8
14
|
|
9
15
|
class _FrameWrappedBase:
|
10
16
|
"""
|
@@ -35,7 +41,14 @@ class _FrameWrappedBase:
|
|
35
41
|
ParameterValidator.validate_mandatory_dict('metadata', metadata)
|
36
42
|
|
37
43
|
self._frame: Union[VideoFrame, AudioFrame] = frame
|
44
|
+
"""
|
45
|
+
The VideoFrame or AudioFrame pyav instance.
|
46
|
+
"""
|
38
47
|
self.metadata: dict = metadata or {}
|
48
|
+
"""
|
49
|
+
The metadata we want to include with the
|
50
|
+
frame.
|
51
|
+
"""
|
39
52
|
|
40
53
|
def __getattr__(
|
41
54
|
self,
|