Adding packet trailer support to python SDK#658
Conversation
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
| elif which == "local_track_republished": | ||
| republished = event.local_track_republished | ||
| publications = self.local_participant._track_publications | ||
| lpublication = publications.pop(republished.previous_sid, None) | ||
| if lpublication is None: | ||
| logging.warning( | ||
| "received local_track_republished for unknown publication sid %s", | ||
| republished.previous_sid, | ||
| ) | ||
| return | ||
|
|
||
| lpublication._ffi_handle.dispose() | ||
| lpublication._ffi_handle = FfiHandle(republished.publication_handle) | ||
| lpublication._info.CopyFrom(republished.info) | ||
| if lpublication.track is not None: | ||
| lpublication.track._info.sid = lpublication.sid | ||
| publications[lpublication.sid] = lpublication |
There was a problem hiding this comment.
🔴 _first_subscription Future not reset after republish causes InvalidStateError on re-subscribe
After a full reconnect, the local_track_republished handler reuses the existing LocalTrackPublication object but does not reset its _first_subscription future (livekit-rtc/livekit/rtc/track_publication.py:87). When the track is subsequently re-subscribed by a remote participant, the local_track_subscribed handler at livekit-rtc/livekit/rtc/room.py:748 calls lpublication._first_subscription.set_result(None) on an already-completed asyncio.Future, raising InvalidStateError. This exception is caught by _listen_task at livekit-rtc/livekit/rtc/room.py:668-675, but it prevents the self.emit("local_track_subscribed", lpublication.track) call at line 749 from executing, silently suppressing the event for any listeners.
| elif which == "local_track_republished": | |
| republished = event.local_track_republished | |
| publications = self.local_participant._track_publications | |
| lpublication = publications.pop(republished.previous_sid, None) | |
| if lpublication is None: | |
| logging.warning( | |
| "received local_track_republished for unknown publication sid %s", | |
| republished.previous_sid, | |
| ) | |
| return | |
| lpublication._ffi_handle.dispose() | |
| lpublication._ffi_handle = FfiHandle(republished.publication_handle) | |
| lpublication._info.CopyFrom(republished.info) | |
| if lpublication.track is not None: | |
| lpublication.track._info.sid = lpublication.sid | |
| publications[lpublication.sid] = lpublication | |
| elif which == "local_track_republished": | |
| republished = event.local_track_republished | |
| publications = self.local_participant._track_publications | |
| lpublication = publications.pop(republished.previous_sid, None) | |
| if lpublication is None: | |
| logging.warning( | |
| "received local_track_republished for unknown publication sid %s", | |
| republished.previous_sid, | |
| ) | |
| return | |
| lpublication._ffi_handle.dispose() | |
| lpublication._ffi_handle = FfiHandle(republished.publication_handle) | |
| lpublication._info.CopyFrom(republished.info) | |
| lpublication._first_subscription = asyncio.Future() | |
| if lpublication.track is not None: | |
| lpublication.track._info.sid = lpublication.sid | |
| publications[lpublication.sid] = lpublication |
Was this helpful? React with 👍 or 👎 to provide feedback.
examples/local_videoto demonstrate publishing video from webcam with timestamping & frame ID.