bmdwire 1.5.1__tar.gz → 1.5.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.
- {bmdwire-1.5.1/bmdwire.egg-info → bmdwire-1.5.2}/PKG-INFO +2 -2
- {bmdwire-1.5.1 → bmdwire-1.5.2}/README.md +1 -1
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/docs/MEDIA_LOCK.md +7 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/docs/SURFACE.md +7 -1
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/protocol.py +14 -7
- {bmdwire-1.5.1 → bmdwire-1.5.2/bmdwire.egg-info}/PKG-INFO +2 -2
- {bmdwire-1.5.1 → bmdwire-1.5.2}/pyproject.toml +1 -1
- {bmdwire-1.5.1 → bmdwire-1.5.2}/LICENSE +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/LICENSE +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/LICENSE-gpl3.txt +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/NOTICE +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/_socketqueue.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/_transfer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/atem.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/connection.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/docs/MACRO_FORMAT.md +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/docs/PROFILE_FORMAT.md +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/docs/PROFILE_SAVE_RESTORE.md +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/helpers.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/imaging.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/_helpers.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/_io.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/downstream_keyer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/fairlight.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/flow.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/hyperdeck.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/media.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/switching.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/macrotransfer/upstream_keyer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/mediaconvertmodule.c +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/_dsl.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/audio_legacy.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/camera_control.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/color_generator.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/downstream_keyer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/fade_to_black.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/fairlight.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/file_transfer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/hyperdeck.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/input_video.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/lock.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/macros.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/manual.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/media.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/meters.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/multiviewer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/recording.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/streaming.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/supersource.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/switching.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/system_info.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/tally.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/transition.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/messages/upstream_keyer.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/pool.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/probe.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/_common.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/_enums.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/_xml.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/apply.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/options.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/profile/save.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/py.typed +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/ready.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/state.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/testing.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/atemwire/transport.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/bmdwire.egg-info/SOURCES.txt +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/bmdwire.egg-info/dependency_links.txt +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/bmdwire.egg-info/requires.txt +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/bmdwire.egg-info/top_level.txt +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/hyperdeckwire/LICENSE +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/hyperdeckwire/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/hyperdeckwire/client.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/hyperdeckwire/setup.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/hyperdeckwire/upload.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/setup.cfg +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/setup.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/LICENSE +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/_preamble.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/_protocol.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/network.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/profile/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/profile/_ranges.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/profile/archive.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/ultimattewire/profile/restore.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/videohubwire/LICENSE +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/videohubwire/__init__.py +0 -0
- {bmdwire-1.5.1 → bmdwire-1.5.2}/videohubwire/client.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bmdwire
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.2
|
|
4
4
|
Summary: Python libraries for Blackmagic Design broadcast devices: ATEM switchers, HyperDeck recorders, Ultimatte keyers and Videohub routers
|
|
5
5
|
Author: Lucas Romanenko, Martijn Braam and the OpenAtem contributors
|
|
6
6
|
License-Expression: LGPL-3.0-only AND MIT
|
|
@@ -49,7 +49,7 @@ pip install bmdwire
|
|
|
49
49
|
| **`ultimattewire`** | Ultimatte 12 keyers: archive and restore over the native TCP protocol, Smart Remote 4 compatible zips | MIT | [ultimattewire/README.md](ultimattewire/README.md) |
|
|
50
50
|
| **`videohubwire`** | Videohub routers: state snapshot, crosspoint routing, labels over TCP 9990 | MIT | [videohubwire/README.md](videohubwire/README.md) |
|
|
51
51
|
|
|
52
|
-
All four are pure standard library except atemwire, whose small C extension ships prebuilt for Linux, macOS and Windows on CPython 3.10 to 3.14, so installing needs no compiler. Pin the version in a requirements file (`bmdwire==1.5.
|
|
52
|
+
All four are pure standard library except atemwire, whose small C extension ships prebuilt for Linux, macOS and Windows on CPython 3.10 to 3.14, so installing needs no compiler. Pin the version in a requirements file (`bmdwire==1.5.2`) so a later release cannot change your install under you.
|
|
53
53
|
|
|
54
54
|
## atemwire stands on pyatem
|
|
55
55
|
|
|
@@ -15,7 +15,7 @@ pip install bmdwire
|
|
|
15
15
|
| **`ultimattewire`** | Ultimatte 12 keyers: archive and restore over the native TCP protocol, Smart Remote 4 compatible zips | MIT | [ultimattewire/README.md](ultimattewire/README.md) |
|
|
16
16
|
| **`videohubwire`** | Videohub routers: state snapshot, crosspoint routing, labels over TCP 9990 | MIT | [videohubwire/README.md](videohubwire/README.md) |
|
|
17
17
|
|
|
18
|
-
All four are pure standard library except atemwire, whose small C extension ships prebuilt for Linux, macOS and Windows on CPython 3.10 to 3.14, so installing needs no compiler. Pin the version in a requirements file (`bmdwire==1.5.
|
|
18
|
+
All four are pure standard library except atemwire, whose small C extension ships prebuilt for Linux, macOS and Windows on CPython 3.10 to 3.14, so installing needs no compiler. Pin the version in a requirements file (`bmdwire==1.5.2`) so a later release cannot change your install under you.
|
|
19
19
|
|
|
20
20
|
## atemwire stands on pyatem
|
|
21
21
|
|
|
@@ -227,6 +227,13 @@ two of them captured on the ASC machine.
|
|
|
227
227
|
thumbnails while the other client downloaded; the download paused 38 s
|
|
228
228
|
for ASC's 20 and went on. Alone, 20 uploads take 14.2 s, against
|
|
229
229
|
12.7 s with 1.5.0 and about 12 s for ASC.
|
|
230
|
+
* That has to follow every release, work queued or not (`1b30449`).
|
|
231
|
+
WebATEM's media pool watcher queues one still at a time, the next
|
|
232
|
+
after decoding the last, so nothing is queued at the release; 1.5.1
|
|
233
|
+
yielded only when something was, and the watcher's next request went
|
|
234
|
+
out a moment after the release, beside ASC's. With the yield after
|
|
235
|
+
every release, ASC loaded all 20 thumbnails while a client downloaded
|
|
236
|
+
as the watcher does.
|
|
230
237
|
* atemwire 1.4.0 waited for its own release's `LKST` echo before asking
|
|
231
238
|
again, so it waited out a client handed the store too, by accident.
|
|
232
239
|
bmdctl, which mirrors this code, saw that as unexplained pauses of 2 to
|
|
@@ -918,7 +918,7 @@ Items 1, 2 and 4 were fixed after 1.2.0, in the commits named in each; they stil
|
|
|
918
918
|
10, the split-mono bullet of item 8, the float and `sourceId` bullets of item 9, items 15, 16,
|
|
919
919
|
18, 19 and 20, and part of item 17 were fixed after 1.3.0 and still apply to it. Items 21 to 25
|
|
920
920
|
were fixed after 1.4.0 and still apply to it. Item 26 was fixed after 1.5.0 and still applies to
|
|
921
|
-
it.
|
|
921
|
+
it; item 27 was fixed after 1.5.1.
|
|
922
922
|
|
|
923
923
|
1. **Profile video mode does not round-trip at fractional rates** (1.2.0). Save writes
|
|
924
924
|
`get_label()` (`1080p59.94`); apply only knows `1080p5994`-style names, so it skips the mode as
|
|
@@ -1089,6 +1089,12 @@ it.
|
|
|
1089
1089
|
while another client is seen holding the store, and with no announcement waits while anyone
|
|
1090
1090
|
is seen at work, asking after `LOCK_QUIET` (10 s) of quiet. `UdpProtocol.wake_at` wakes the
|
|
1091
1091
|
protocol for it.
|
|
1092
|
+
27. **A transfer queued after the release doesn't wait its turn** (1.5.1). Item 26's fix starts
|
|
1093
|
+
the wait only after a release with more work queued. A caller that queues its transfers one at
|
|
1094
|
+
a time (WebATEM's media pool watcher, the next still after decoding the last) has nothing
|
|
1095
|
+
queued at the release, and its next request goes out at once, beside another client's,
|
|
1096
|
+
aborting it as before. *Fixed in `1b30449`:* every per-frame release starts the wait, after an
|
|
1097
|
+
FTDE 6 too, and so does any client's announced release.
|
|
1092
1098
|
|
|
1093
1099
|
## Counts
|
|
1094
1100
|
|
|
@@ -397,11 +397,11 @@ class AtemProtocol:
|
|
|
397
397
|
# and abort their transfer (TEST ATEM 2, 2026-10-15).
|
|
398
398
|
y = self._yielding.get(contents.store)
|
|
399
399
|
now = time.monotonic()
|
|
400
|
-
if y is None and self.
|
|
400
|
+
if y is None and self._can_wake():
|
|
401
401
|
self._yielding[contents.store] = [now, now]
|
|
402
|
-
self._wake_at(now + LOCK_COURTESY)
|
|
403
402
|
elif y is not None and y[1] is None:
|
|
404
403
|
y[1] = now
|
|
404
|
+
if contents.store in self._yielding and self.transfer_queue.get(contents.store):
|
|
405
405
|
self._wake_at(now + LOCK_COURTESY)
|
|
406
406
|
# The lock is free: whatever request we had outstanding is
|
|
407
407
|
# either about to be granted (a queued PLCK — the switcher
|
|
@@ -955,11 +955,16 @@ class AtemProtocol:
|
|
|
955
955
|
self.send_commands([LockCommand(store, False)])
|
|
956
956
|
except Exception:
|
|
957
957
|
self.log.exception('per-frame unlock send failed')
|
|
958
|
+
if self._can_wake():
|
|
959
|
+
# Every release, whether or not more work is queued now: a
|
|
960
|
+
# caller that queues its transfers one at a time (WebATEM's
|
|
961
|
+
# media pool watcher queues the next still after decoding the
|
|
962
|
+
# last) asks again a moment after the release, with nothing
|
|
963
|
+
# queued at it, and that request must wait its turn too. The
|
|
964
|
+
# trigger defers it and asks to be woken.
|
|
965
|
+
self._yielding[store] = [time.monotonic(), None]
|
|
958
966
|
if not request_next:
|
|
959
967
|
return # the store's release broadcast continues the queue
|
|
960
|
-
if self.transfer_queue.get(store) and self._can_wake():
|
|
961
|
-
# The trigger below defers the request and asks to be woken.
|
|
962
|
-
self._yielding[store] = [time.monotonic(), None]
|
|
963
968
|
self._transfer_trigger(store)
|
|
964
969
|
|
|
965
970
|
def _can_wake(self):
|
|
@@ -986,10 +991,12 @@ class AtemProtocol:
|
|
|
986
991
|
y[0] = now
|
|
987
992
|
|
|
988
993
|
def _service_yields(self):
|
|
989
|
-
"""Ask for each store we left free whose yield is over
|
|
994
|
+
"""Ask for each store we left free whose yield is over; forget a
|
|
995
|
+
yield that is over with nothing waiting on it."""
|
|
990
996
|
for store in list(self._yielding):
|
|
991
997
|
if not self.transfer_queue.get(store):
|
|
992
|
-
|
|
998
|
+
if time.monotonic() >= self._yield_due(store):
|
|
999
|
+
del self._yielding[store]
|
|
993
1000
|
elif not self.transfer_requested and not self.locks.get(store):
|
|
994
1001
|
self._transfer_trigger(store)
|
|
995
1002
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bmdwire
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.2
|
|
4
4
|
Summary: Python libraries for Blackmagic Design broadcast devices: ATEM switchers, HyperDeck recorders, Ultimatte keyers and Videohub routers
|
|
5
5
|
Author: Lucas Romanenko, Martijn Braam and the OpenAtem contributors
|
|
6
6
|
License-Expression: LGPL-3.0-only AND MIT
|
|
@@ -49,7 +49,7 @@ pip install bmdwire
|
|
|
49
49
|
| **`ultimattewire`** | Ultimatte 12 keyers: archive and restore over the native TCP protocol, Smart Remote 4 compatible zips | MIT | [ultimattewire/README.md](ultimattewire/README.md) |
|
|
50
50
|
| **`videohubwire`** | Videohub routers: state snapshot, crosspoint routing, labels over TCP 9990 | MIT | [videohubwire/README.md](videohubwire/README.md) |
|
|
51
51
|
|
|
52
|
-
All four are pure standard library except atemwire, whose small C extension ships prebuilt for Linux, macOS and Windows on CPython 3.10 to 3.14, so installing needs no compiler. Pin the version in a requirements file (`bmdwire==1.5.
|
|
52
|
+
All four are pure standard library except atemwire, whose small C extension ships prebuilt for Linux, macOS and Windows on CPython 3.10 to 3.14, so installing needs no compiler. Pin the version in a requirements file (`bmdwire==1.5.2`) so a later release cannot change your install under you.
|
|
53
53
|
|
|
54
54
|
## atemwire stands on pyatem
|
|
55
55
|
|
|
@@ -13,7 +13,7 @@ build-backend = "setuptools.build_meta"
|
|
|
13
13
|
|
|
14
14
|
[project]
|
|
15
15
|
name = "bmdwire"
|
|
16
|
-
version = "1.5.
|
|
16
|
+
version = "1.5.2"
|
|
17
17
|
description = "Python libraries for Blackmagic Design broadcast devices: ATEM switchers, HyperDeck recorders, Ultimatte keyers and Videohub routers"
|
|
18
18
|
readme = "README.md"
|
|
19
19
|
# atemwire is a fork of pyatem and stays LGPL-3.0-only; the other three were
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|