diff --git a/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.py b/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.py index 02db57c2..74124674 100644 --- a/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.py +++ b/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.py @@ -14,7 +14,7 @@ from . import handle_pb2 as handle__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11video_frame.proto\x12\rlivekit.proto\x1a\x0chandle.proto\"k\n\x17\x41llocVideoBufferRequest\x12\x31\n\x04type\x18\x01 \x01(\x0e\x32#.livekit.proto.VideoFrameBufferType\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\"P\n\x18\x41llocVideoBufferResponse\x12\x34\n\x06\x62uffer\x18\x01 \x01(\x0b\x32$.livekit.proto.OwnedVideoFrameBuffer\"[\n\x15NewVideoStreamRequest\x12\x14\n\x0ctrack_handle\x18\x01 \x01(\x04\x12,\n\x04type\x18\x02 \x01(\x0e\x32\x1e.livekit.proto.VideoStreamType\"I\n\x16NewVideoStreamResponse\x12/\n\x06stream\x18\x01 \x01(\x0b\x32\x1f.livekit.proto.OwnedVideoStream\"\x7f\n\x15NewVideoSourceRequest\x12,\n\x04type\x18\x01 \x01(\x0e\x32\x1e.livekit.proto.VideoSourceType\x12\x38\n\nresolution\x18\x02 \x01(\x0b\x32$.livekit.proto.VideoSourceResolution\"I\n\x16NewVideoSourceResponse\x12/\n\x06source\x18\x01 \x01(\x0b\x32\x1f.livekit.proto.OwnedVideoSource\"v\n\x18\x43\x61ptureVideoFrameRequest\x12\x15\n\rsource_handle\x18\x01 \x01(\x04\x12,\n\x05\x66rame\x18\x02 \x01(\x0b\x32\x1d.livekit.proto.VideoFrameInfo\x12\x15\n\rbuffer_handle\x18\x03 \x01(\x04\"\x1b\n\x19\x43\x61ptureVideoFrameResponse\"l\n\rToI420Request\x12\x0e\n\x06\x66lip_y\x18\x01 \x01(\x08\x12-\n\x04\x61rgb\x18\x02 \x01(\x0b\x32\x1d.livekit.proto.ArgbBufferInfoH\x00\x12\x14\n\nyuv_handle\x18\x03 \x01(\x04H\x00\x42\x06\n\x04\x66rom\"F\n\x0eToI420Response\x12\x34\n\x06\x62uffer\x18\x01 \x01(\x0b\x32$.livekit.proto.OwnedVideoFrameBuffer\"\xb6\x01\n\rToArgbRequest\x12\x15\n\rbuffer_handle\x18\x01 \x01(\x04\x12\x0f\n\x07\x64st_ptr\x18\x02 \x01(\x04\x12\x32\n\ndst_format\x18\x03 \x01(\x0e\x32\x1e.livekit.proto.VideoFormatType\x12\x12\n\ndst_stride\x18\x04 \x01(\r\x12\x11\n\tdst_width\x18\x05 \x01(\r\x12\x12\n\ndst_height\x18\x06 \x01(\r\x12\x0e\n\x06\x66lip_y\x18\x07 \x01(\x08\"\x10\n\x0eToArgbResponse\"D\n\x0fVideoResolution\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\x12\x12\n\nframe_rate\x18\x03 \x01(\x01\"|\n\x0e\x41rgbBufferInfo\x12\x0b\n\x03ptr\x18\x01 \x01(\x04\x12.\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x1e.livekit.proto.VideoFormatType\x12\x0e\n\x06stride\x18\x03 \x01(\r\x12\r\n\x05width\x18\x04 \x01(\r\x12\x0e\n\x06height\x18\x05 \x01(\r\"V\n\x0eVideoFrameInfo\x12\x14\n\x0ctimestamp_us\x18\x01 \x01(\x03\x12.\n\x08rotation\x18\x02 \x01(\x0e\x32\x1c.livekit.proto.VideoRotation\"\x97\x02\n\x14VideoFrameBufferInfo\x12\x38\n\x0b\x62uffer_type\x18\x01 \x01(\x0e\x32#.livekit.proto.VideoFrameBufferType\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x31\n\x03yuv\x18\x04 \x01(\x0b\x32\".livekit.proto.PlanarYuvBufferInfoH\x00\x12\x36\n\x06\x62i_yuv\x18\x05 \x01(\x0b\x32$.livekit.proto.BiplanarYuvBufferInfoH\x00\x12\x31\n\x06native\x18\x06 \x01(\x0b\x32\x1f.livekit.proto.NativeBufferInfoH\x00\x42\x08\n\x06\x62uffer\"y\n\x15OwnedVideoFrameBuffer\x12-\n\x06handle\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12\x31\n\x04info\x18\x02 \x01(\x0b\x32#.livekit.proto.VideoFrameBufferInfo\"\xda\x01\n\x13PlanarYuvBufferInfo\x12\x14\n\x0c\x63hroma_width\x18\x01 \x01(\r\x12\x15\n\rchroma_height\x18\x02 \x01(\r\x12\x10\n\x08stride_y\x18\x03 \x01(\r\x12\x10\n\x08stride_u\x18\x04 \x01(\r\x12\x10\n\x08stride_v\x18\x05 \x01(\r\x12\x10\n\x08stride_a\x18\x06 \x01(\r\x12\x12\n\ndata_y_ptr\x18\x07 \x01(\x04\x12\x12\n\ndata_u_ptr\x18\x08 \x01(\x04\x12\x12\n\ndata_v_ptr\x18\t \x01(\x04\x12\x12\n\ndata_a_ptr\x18\n \x01(\x04\"\x92\x01\n\x15\x42iplanarYuvBufferInfo\x12\x14\n\x0c\x63hroma_width\x18\x01 \x01(\r\x12\x15\n\rchroma_height\x18\x02 \x01(\r\x12\x10\n\x08stride_y\x18\x03 \x01(\r\x12\x11\n\tstride_uv\x18\x04 \x01(\r\x12\x12\n\ndata_y_ptr\x18\x05 \x01(\x04\x12\x13\n\x0b\x64\x61ta_uv_ptr\x18\x06 \x01(\x04\"\x12\n\x10NativeBufferInfo\"?\n\x0fVideoStreamInfo\x12,\n\x04type\x18\x01 \x01(\x0e\x32\x1e.livekit.proto.VideoStreamType\"o\n\x10OwnedVideoStream\x12-\n\x06handle\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x01(\x0b\x32\x1e.livekit.proto.VideoStreamInfo\"\x9f\x01\n\x10VideoStreamEvent\x12\x15\n\rstream_handle\x18\x01 \x01(\x04\x12;\n\x0e\x66rame_received\x18\x02 \x01(\x0b\x32!.livekit.proto.VideoFrameReceivedH\x00\x12,\n\x03\x65os\x18\x03 \x01(\x0b\x32\x1d.livekit.proto.VideoStreamEOSH\x00\x42\t\n\x07message\"x\n\x12VideoFrameReceived\x12,\n\x05\x66rame\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.VideoFrameInfo\x12\x34\n\x06\x62uffer\x18\x02 \x01(\x0b\x32$.livekit.proto.OwnedVideoFrameBuffer\"\x10\n\x0eVideoStreamEOS\"6\n\x15VideoSourceResolution\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\"?\n\x0fVideoSourceInfo\x12,\n\x04type\x18\x01 \x01(\x0e\x32\x1e.livekit.proto.VideoSourceType\"o\n\x10OwnedVideoSource\x12-\n\x06handle\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x01(\x0b\x32\x1e.livekit.proto.VideoSourceInfo*(\n\nVideoCodec\x12\x07\n\x03VP8\x10\x00\x12\x08\n\x04H264\x10\x01\x12\x07\n\x03\x41V1\x10\x02*l\n\rVideoRotation\x12\x14\n\x10VIDEO_ROTATION_0\x10\x00\x12\x15\n\x11VIDEO_ROTATION_90\x10\x01\x12\x16\n\x12VIDEO_ROTATION_180\x10\x02\x12\x16\n\x12VIDEO_ROTATION_270\x10\x03*U\n\x0fVideoFormatType\x12\x0f\n\x0b\x46ORMAT_ARGB\x10\x00\x12\x0f\n\x0b\x46ORMAT_BGRA\x10\x01\x12\x0f\n\x0b\x46ORMAT_ABGR\x10\x02\x12\x0f\n\x0b\x46ORMAT_RGBA\x10\x03*_\n\x14VideoFrameBufferType\x12\n\n\x06NATIVE\x10\x00\x12\x08\n\x04I420\x10\x01\x12\t\n\x05I420A\x10\x02\x12\x08\n\x04I422\x10\x03\x12\x08\n\x04I444\x10\x04\x12\x08\n\x04I010\x10\x05\x12\x08\n\x04NV12\x10\x06*Y\n\x0fVideoStreamType\x12\x17\n\x13VIDEO_STREAM_NATIVE\x10\x00\x12\x16\n\x12VIDEO_STREAM_WEBGL\x10\x01\x12\x15\n\x11VIDEO_STREAM_HTML\x10\x02**\n\x0fVideoSourceType\x12\x17\n\x13VIDEO_SOURCE_NATIVE\x10\x00\x42\x10\xaa\x02\rLiveKit.Protob\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11video_frame.proto\x12\rlivekit.proto\x1a\x0chandle.proto\"k\n\x17\x41llocVideoBufferRequest\x12\x31\n\x04type\x18\x01 \x01(\x0e\x32#.livekit.proto.VideoFrameBufferType\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\"P\n\x18\x41llocVideoBufferResponse\x12\x34\n\x06\x62uffer\x18\x01 \x01(\x0b\x32$.livekit.proto.OwnedVideoFrameBuffer\"[\n\x15NewVideoStreamRequest\x12\x14\n\x0ctrack_handle\x18\x01 \x01(\x04\x12,\n\x04type\x18\x02 \x01(\x0e\x32\x1e.livekit.proto.VideoStreamType\"I\n\x16NewVideoStreamResponse\x12/\n\x06stream\x18\x01 \x01(\x0b\x32\x1f.livekit.proto.OwnedVideoStream\"\x7f\n\x15NewVideoSourceRequest\x12,\n\x04type\x18\x01 \x01(\x0e\x32\x1e.livekit.proto.VideoSourceType\x12\x38\n\nresolution\x18\x02 \x01(\x0b\x32$.livekit.proto.VideoSourceResolution\"I\n\x16NewVideoSourceResponse\x12/\n\x06source\x18\x01 \x01(\x0b\x32\x1f.livekit.proto.OwnedVideoSource\"\xae\x01\n\x18\x43\x61ptureVideoFrameRequest\x12\x15\n\rsource_handle\x18\x01 \x01(\x04\x12,\n\x05\x66rame\x18\x02 \x01(\x0b\x32\x1d.livekit.proto.VideoFrameInfo\x12\x33\n\x04info\x18\x03 \x01(\x0b\x32#.livekit.proto.VideoFrameBufferInfoH\x00\x12\x10\n\x06handle\x18\x04 \x01(\x04H\x00\x42\x06\n\x04\x66rom\"\x1b\n\x19\x43\x61ptureVideoFrameResponse\"\x9f\x01\n\rToI420Request\x12\x0e\n\x06\x66lip_y\x18\x01 \x01(\x08\x12-\n\x04\x61rgb\x18\x02 \x01(\x0b\x32\x1d.livekit.proto.ArgbBufferInfoH\x00\x12\x35\n\x06\x62uffer\x18\x03 \x01(\x0b\x32#.livekit.proto.VideoFrameBufferInfoH\x00\x12\x10\n\x06handle\x18\x04 \x01(\x04H\x00\x42\x06\n\x04\x66rom\"F\n\x0eToI420Response\x12\x34\n\x06\x62uffer\x18\x01 \x01(\x0b\x32$.livekit.proto.OwnedVideoFrameBuffer\"\xd4\x01\n\rToArgbRequest\x12\x33\n\x06\x62uffer\x18\x01 \x01(\x0b\x32#.livekit.proto.VideoFrameBufferInfo\x12\x0f\n\x07\x64st_ptr\x18\x02 \x01(\x04\x12\x32\n\ndst_format\x18\x03 \x01(\x0e\x32\x1e.livekit.proto.VideoFormatType\x12\x12\n\ndst_stride\x18\x04 \x01(\r\x12\x11\n\tdst_width\x18\x05 \x01(\r\x12\x12\n\ndst_height\x18\x06 \x01(\r\x12\x0e\n\x06\x66lip_y\x18\x07 \x01(\x08\"\x10\n\x0eToArgbResponse\"D\n\x0fVideoResolution\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\x12\x12\n\nframe_rate\x18\x03 \x01(\x01\"|\n\x0e\x41rgbBufferInfo\x12\x0b\n\x03ptr\x18\x01 \x01(\x04\x12.\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x1e.livekit.proto.VideoFormatType\x12\x0e\n\x06stride\x18\x03 \x01(\r\x12\r\n\x05width\x18\x04 \x01(\r\x12\x0e\n\x06height\x18\x05 \x01(\r\"V\n\x0eVideoFrameInfo\x12\x14\n\x0ctimestamp_us\x18\x01 \x01(\x03\x12.\n\x08rotation\x18\x02 \x01(\x0e\x32\x1c.livekit.proto.VideoRotation\"\x97\x02\n\x14VideoFrameBufferInfo\x12\x38\n\x0b\x62uffer_type\x18\x01 \x01(\x0e\x32#.livekit.proto.VideoFrameBufferType\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x31\n\x03yuv\x18\x04 \x01(\x0b\x32\".livekit.proto.PlanarYuvBufferInfoH\x00\x12\x36\n\x06\x62i_yuv\x18\x05 \x01(\x0b\x32$.livekit.proto.BiplanarYuvBufferInfoH\x00\x12\x31\n\x06native\x18\x06 \x01(\x0b\x32\x1f.livekit.proto.NativeBufferInfoH\x00\x42\x08\n\x06\x62uffer\"y\n\x15OwnedVideoFrameBuffer\x12-\n\x06handle\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12\x31\n\x04info\x18\x02 \x01(\x0b\x32#.livekit.proto.VideoFrameBufferInfo\"\xda\x01\n\x13PlanarYuvBufferInfo\x12\x14\n\x0c\x63hroma_width\x18\x01 \x01(\r\x12\x15\n\rchroma_height\x18\x02 \x01(\r\x12\x10\n\x08stride_y\x18\x03 \x01(\r\x12\x10\n\x08stride_u\x18\x04 \x01(\r\x12\x10\n\x08stride_v\x18\x05 \x01(\r\x12\x10\n\x08stride_a\x18\x06 \x01(\r\x12\x12\n\ndata_y_ptr\x18\x07 \x01(\x04\x12\x12\n\ndata_u_ptr\x18\x08 \x01(\x04\x12\x12\n\ndata_v_ptr\x18\t \x01(\x04\x12\x12\n\ndata_a_ptr\x18\n \x01(\x04\"\x92\x01\n\x15\x42iplanarYuvBufferInfo\x12\x14\n\x0c\x63hroma_width\x18\x01 \x01(\r\x12\x15\n\rchroma_height\x18\x02 \x01(\r\x12\x10\n\x08stride_y\x18\x03 \x01(\r\x12\x11\n\tstride_uv\x18\x04 \x01(\r\x12\x12\n\ndata_y_ptr\x18\x05 \x01(\x04\x12\x13\n\x0b\x64\x61ta_uv_ptr\x18\x06 \x01(\x04\"\x12\n\x10NativeBufferInfo\"?\n\x0fVideoStreamInfo\x12,\n\x04type\x18\x01 \x01(\x0e\x32\x1e.livekit.proto.VideoStreamType\"o\n\x10OwnedVideoStream\x12-\n\x06handle\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x01(\x0b\x32\x1e.livekit.proto.VideoStreamInfo\"\x9f\x01\n\x10VideoStreamEvent\x12\x15\n\rstream_handle\x18\x01 \x01(\x04\x12;\n\x0e\x66rame_received\x18\x02 \x01(\x0b\x32!.livekit.proto.VideoFrameReceivedH\x00\x12,\n\x03\x65os\x18\x03 \x01(\x0b\x32\x1d.livekit.proto.VideoStreamEOSH\x00\x42\t\n\x07message\"x\n\x12VideoFrameReceived\x12,\n\x05\x66rame\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.VideoFrameInfo\x12\x34\n\x06\x62uffer\x18\x02 \x01(\x0b\x32$.livekit.proto.OwnedVideoFrameBuffer\"\x10\n\x0eVideoStreamEOS\"6\n\x15VideoSourceResolution\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\"?\n\x0fVideoSourceInfo\x12,\n\x04type\x18\x01 \x01(\x0e\x32\x1e.livekit.proto.VideoSourceType\"o\n\x10OwnedVideoSource\x12-\n\x06handle\x18\x01 \x01(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x01(\x0b\x32\x1e.livekit.proto.VideoSourceInfo*(\n\nVideoCodec\x12\x07\n\x03VP8\x10\x00\x12\x08\n\x04H264\x10\x01\x12\x07\n\x03\x41V1\x10\x02*l\n\rVideoRotation\x12\x14\n\x10VIDEO_ROTATION_0\x10\x00\x12\x15\n\x11VIDEO_ROTATION_90\x10\x01\x12\x16\n\x12VIDEO_ROTATION_180\x10\x02\x12\x16\n\x12VIDEO_ROTATION_270\x10\x03*U\n\x0fVideoFormatType\x12\x0f\n\x0b\x46ORMAT_ARGB\x10\x00\x12\x0f\n\x0b\x46ORMAT_BGRA\x10\x01\x12\x0f\n\x0b\x46ORMAT_ABGR\x10\x02\x12\x0f\n\x0b\x46ORMAT_RGBA\x10\x03*_\n\x14VideoFrameBufferType\x12\n\n\x06NATIVE\x10\x00\x12\x08\n\x04I420\x10\x01\x12\t\n\x05I420A\x10\x02\x12\x08\n\x04I422\x10\x03\x12\x08\n\x04I444\x10\x04\x12\x08\n\x04I010\x10\x05\x12\x08\n\x04NV12\x10\x06*Y\n\x0fVideoStreamType\x12\x17\n\x13VIDEO_STREAM_NATIVE\x10\x00\x12\x16\n\x12VIDEO_STREAM_WEBGL\x10\x01\x12\x15\n\x11VIDEO_STREAM_HTML\x10\x02**\n\x0fVideoSourceType\x12\x17\n\x13VIDEO_SOURCE_NATIVE\x10\x00\x42\x10\xaa\x02\rLiveKit.Protob\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -23,18 +23,18 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\252\002\rLiveKit.Proto' - _globals['_VIDEOCODEC']._serialized_start=2940 - _globals['_VIDEOCODEC']._serialized_end=2980 - _globals['_VIDEOROTATION']._serialized_start=2982 - _globals['_VIDEOROTATION']._serialized_end=3090 - _globals['_VIDEOFORMATTYPE']._serialized_start=3092 - _globals['_VIDEOFORMATTYPE']._serialized_end=3177 - _globals['_VIDEOFRAMEBUFFERTYPE']._serialized_start=3179 - _globals['_VIDEOFRAMEBUFFERTYPE']._serialized_end=3274 - _globals['_VIDEOSTREAMTYPE']._serialized_start=3276 - _globals['_VIDEOSTREAMTYPE']._serialized_end=3365 - _globals['_VIDEOSOURCETYPE']._serialized_start=3367 - _globals['_VIDEOSOURCETYPE']._serialized_end=3409 + _globals['_VIDEOCODEC']._serialized_start=3079 + _globals['_VIDEOCODEC']._serialized_end=3119 + _globals['_VIDEOROTATION']._serialized_start=3121 + _globals['_VIDEOROTATION']._serialized_end=3229 + _globals['_VIDEOFORMATTYPE']._serialized_start=3231 + _globals['_VIDEOFORMATTYPE']._serialized_end=3316 + _globals['_VIDEOFRAMEBUFFERTYPE']._serialized_start=3318 + _globals['_VIDEOFRAMEBUFFERTYPE']._serialized_end=3413 + _globals['_VIDEOSTREAMTYPE']._serialized_start=3415 + _globals['_VIDEOSTREAMTYPE']._serialized_end=3504 + _globals['_VIDEOSOURCETYPE']._serialized_start=3506 + _globals['_VIDEOSOURCETYPE']._serialized_end=3548 _globals['_ALLOCVIDEOBUFFERREQUEST']._serialized_start=50 _globals['_ALLOCVIDEOBUFFERREQUEST']._serialized_end=157 _globals['_ALLOCVIDEOBUFFERRESPONSE']._serialized_start=159 @@ -47,48 +47,48 @@ _globals['_NEWVIDEOSOURCEREQUEST']._serialized_end=536 _globals['_NEWVIDEOSOURCERESPONSE']._serialized_start=538 _globals['_NEWVIDEOSOURCERESPONSE']._serialized_end=611 - _globals['_CAPTUREVIDEOFRAMEREQUEST']._serialized_start=613 - _globals['_CAPTUREVIDEOFRAMEREQUEST']._serialized_end=731 - _globals['_CAPTUREVIDEOFRAMERESPONSE']._serialized_start=733 - _globals['_CAPTUREVIDEOFRAMERESPONSE']._serialized_end=760 - _globals['_TOI420REQUEST']._serialized_start=762 - _globals['_TOI420REQUEST']._serialized_end=870 - _globals['_TOI420RESPONSE']._serialized_start=872 - _globals['_TOI420RESPONSE']._serialized_end=942 - _globals['_TOARGBREQUEST']._serialized_start=945 - _globals['_TOARGBREQUEST']._serialized_end=1127 - _globals['_TOARGBRESPONSE']._serialized_start=1129 - _globals['_TOARGBRESPONSE']._serialized_end=1145 - _globals['_VIDEORESOLUTION']._serialized_start=1147 - _globals['_VIDEORESOLUTION']._serialized_end=1215 - _globals['_ARGBBUFFERINFO']._serialized_start=1217 - _globals['_ARGBBUFFERINFO']._serialized_end=1341 - _globals['_VIDEOFRAMEINFO']._serialized_start=1343 - _globals['_VIDEOFRAMEINFO']._serialized_end=1429 - _globals['_VIDEOFRAMEBUFFERINFO']._serialized_start=1432 - _globals['_VIDEOFRAMEBUFFERINFO']._serialized_end=1711 - _globals['_OWNEDVIDEOFRAMEBUFFER']._serialized_start=1713 - _globals['_OWNEDVIDEOFRAMEBUFFER']._serialized_end=1834 - _globals['_PLANARYUVBUFFERINFO']._serialized_start=1837 - _globals['_PLANARYUVBUFFERINFO']._serialized_end=2055 - _globals['_BIPLANARYUVBUFFERINFO']._serialized_start=2058 - _globals['_BIPLANARYUVBUFFERINFO']._serialized_end=2204 - _globals['_NATIVEBUFFERINFO']._serialized_start=2206 - _globals['_NATIVEBUFFERINFO']._serialized_end=2224 - _globals['_VIDEOSTREAMINFO']._serialized_start=2226 - _globals['_VIDEOSTREAMINFO']._serialized_end=2289 - _globals['_OWNEDVIDEOSTREAM']._serialized_start=2291 - _globals['_OWNEDVIDEOSTREAM']._serialized_end=2402 - _globals['_VIDEOSTREAMEVENT']._serialized_start=2405 - _globals['_VIDEOSTREAMEVENT']._serialized_end=2564 - _globals['_VIDEOFRAMERECEIVED']._serialized_start=2566 - _globals['_VIDEOFRAMERECEIVED']._serialized_end=2686 - _globals['_VIDEOSTREAMEOS']._serialized_start=2688 - _globals['_VIDEOSTREAMEOS']._serialized_end=2704 - _globals['_VIDEOSOURCERESOLUTION']._serialized_start=2706 - _globals['_VIDEOSOURCERESOLUTION']._serialized_end=2760 - _globals['_VIDEOSOURCEINFO']._serialized_start=2762 - _globals['_VIDEOSOURCEINFO']._serialized_end=2825 - _globals['_OWNEDVIDEOSOURCE']._serialized_start=2827 - _globals['_OWNEDVIDEOSOURCE']._serialized_end=2938 + _globals['_CAPTUREVIDEOFRAMEREQUEST']._serialized_start=614 + _globals['_CAPTUREVIDEOFRAMEREQUEST']._serialized_end=788 + _globals['_CAPTUREVIDEOFRAMERESPONSE']._serialized_start=790 + _globals['_CAPTUREVIDEOFRAMERESPONSE']._serialized_end=817 + _globals['_TOI420REQUEST']._serialized_start=820 + _globals['_TOI420REQUEST']._serialized_end=979 + _globals['_TOI420RESPONSE']._serialized_start=981 + _globals['_TOI420RESPONSE']._serialized_end=1051 + _globals['_TOARGBREQUEST']._serialized_start=1054 + _globals['_TOARGBREQUEST']._serialized_end=1266 + _globals['_TOARGBRESPONSE']._serialized_start=1268 + _globals['_TOARGBRESPONSE']._serialized_end=1284 + _globals['_VIDEORESOLUTION']._serialized_start=1286 + _globals['_VIDEORESOLUTION']._serialized_end=1354 + _globals['_ARGBBUFFERINFO']._serialized_start=1356 + _globals['_ARGBBUFFERINFO']._serialized_end=1480 + _globals['_VIDEOFRAMEINFO']._serialized_start=1482 + _globals['_VIDEOFRAMEINFO']._serialized_end=1568 + _globals['_VIDEOFRAMEBUFFERINFO']._serialized_start=1571 + _globals['_VIDEOFRAMEBUFFERINFO']._serialized_end=1850 + _globals['_OWNEDVIDEOFRAMEBUFFER']._serialized_start=1852 + _globals['_OWNEDVIDEOFRAMEBUFFER']._serialized_end=1973 + _globals['_PLANARYUVBUFFERINFO']._serialized_start=1976 + _globals['_PLANARYUVBUFFERINFO']._serialized_end=2194 + _globals['_BIPLANARYUVBUFFERINFO']._serialized_start=2197 + _globals['_BIPLANARYUVBUFFERINFO']._serialized_end=2343 + _globals['_NATIVEBUFFERINFO']._serialized_start=2345 + _globals['_NATIVEBUFFERINFO']._serialized_end=2363 + _globals['_VIDEOSTREAMINFO']._serialized_start=2365 + _globals['_VIDEOSTREAMINFO']._serialized_end=2428 + _globals['_OWNEDVIDEOSTREAM']._serialized_start=2430 + _globals['_OWNEDVIDEOSTREAM']._serialized_end=2541 + _globals['_VIDEOSTREAMEVENT']._serialized_start=2544 + _globals['_VIDEOSTREAMEVENT']._serialized_end=2703 + _globals['_VIDEOFRAMERECEIVED']._serialized_start=2705 + _globals['_VIDEOFRAMERECEIVED']._serialized_end=2825 + _globals['_VIDEOSTREAMEOS']._serialized_start=2827 + _globals['_VIDEOSTREAMEOS']._serialized_end=2843 + _globals['_VIDEOSOURCERESOLUTION']._serialized_start=2845 + _globals['_VIDEOSOURCERESOLUTION']._serialized_end=2899 + _globals['_VIDEOSOURCEINFO']._serialized_start=2901 + _globals['_VIDEOSOURCEINFO']._serialized_end=2964 + _globals['_OWNEDVIDEOSOURCE']._serialized_start=2966 + _globals['_OWNEDVIDEOSOURCE']._serialized_end=3077 # @@protoc_insertion_point(module_scope) diff --git a/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.pyi b/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.pyi index 9b523223..106c3a21 100644 --- a/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.pyi +++ b/livekit-rtc/livekit/rtc/_proto/video_frame_pb2.pyi @@ -275,20 +275,25 @@ class CaptureVideoFrameRequest(google.protobuf.message.Message): SOURCE_HANDLE_FIELD_NUMBER: builtins.int FRAME_FIELD_NUMBER: builtins.int - BUFFER_HANDLE_FIELD_NUMBER: builtins.int + INFO_FIELD_NUMBER: builtins.int + HANDLE_FIELD_NUMBER: builtins.int source_handle: builtins.int @property def frame(self) -> global___VideoFrameInfo: ... - buffer_handle: builtins.int + @property + def info(self) -> global___VideoFrameBufferInfo: ... + handle: builtins.int def __init__( self, *, source_handle: builtins.int = ..., frame: global___VideoFrameInfo | None = ..., - buffer_handle: builtins.int = ..., + info: global___VideoFrameBufferInfo | None = ..., + handle: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["frame", b"frame"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["buffer_handle", b"buffer_handle", "frame", b"frame", "source_handle", b"source_handle"]) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["frame", b"frame", "from", b"from", "handle", b"handle", "info", b"info"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["frame", b"frame", "from", b"from", "handle", b"handle", "info", b"info", "source_handle", b"source_handle"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["from", b"from"]) -> typing_extensions.Literal["info", "handle"] | None: ... global___CaptureVideoFrameRequest = CaptureVideoFrameRequest @@ -312,22 +317,25 @@ class ToI420Request(google.protobuf.message.Message): FLIP_Y_FIELD_NUMBER: builtins.int ARGB_FIELD_NUMBER: builtins.int - YUV_HANDLE_FIELD_NUMBER: builtins.int + BUFFER_FIELD_NUMBER: builtins.int + HANDLE_FIELD_NUMBER: builtins.int flip_y: builtins.bool @property def argb(self) -> global___ArgbBufferInfo: ... - yuv_handle: builtins.int - """Another yuv buffer""" + @property + def buffer(self) -> global___VideoFrameBufferInfo: ... + handle: builtins.int def __init__( self, *, flip_y: builtins.bool = ..., argb: global___ArgbBufferInfo | None = ..., - yuv_handle: builtins.int = ..., + buffer: global___VideoFrameBufferInfo | None = ..., + handle: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["argb", b"argb", "from", b"from", "yuv_handle", b"yuv_handle"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["argb", b"argb", "flip_y", b"flip_y", "from", b"from", "yuv_handle", b"yuv_handle"]) -> None: ... - def WhichOneof(self, oneof_group: typing_extensions.Literal["from", b"from"]) -> typing_extensions.Literal["argb", "yuv_handle"] | None: ... + def HasField(self, field_name: typing_extensions.Literal["argb", b"argb", "buffer", b"buffer", "from", b"from", "handle", b"handle"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["argb", b"argb", "buffer", b"buffer", "flip_y", b"flip_y", "from", b"from", "handle", b"handle"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["from", b"from"]) -> typing_extensions.Literal["argb", "buffer", "handle"] | None: ... global___ToI420Request = ToI420Request @@ -356,14 +364,15 @@ class ToArgbRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - BUFFER_HANDLE_FIELD_NUMBER: builtins.int + BUFFER_FIELD_NUMBER: builtins.int DST_PTR_FIELD_NUMBER: builtins.int DST_FORMAT_FIELD_NUMBER: builtins.int DST_STRIDE_FIELD_NUMBER: builtins.int DST_WIDTH_FIELD_NUMBER: builtins.int DST_HEIGHT_FIELD_NUMBER: builtins.int FLIP_Y_FIELD_NUMBER: builtins.int - buffer_handle: builtins.int + @property + def buffer(self) -> global___VideoFrameBufferInfo: ... dst_ptr: builtins.int dst_format: global___VideoFormatType.ValueType dst_stride: builtins.int @@ -373,7 +382,7 @@ class ToArgbRequest(google.protobuf.message.Message): def __init__( self, *, - buffer_handle: builtins.int = ..., + buffer: global___VideoFrameBufferInfo | None = ..., dst_ptr: builtins.int = ..., dst_format: global___VideoFormatType.ValueType = ..., dst_stride: builtins.int = ..., @@ -381,7 +390,8 @@ class ToArgbRequest(google.protobuf.message.Message): dst_height: builtins.int = ..., flip_y: builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["buffer_handle", b"buffer_handle", "dst_format", b"dst_format", "dst_height", b"dst_height", "dst_ptr", b"dst_ptr", "dst_stride", b"dst_stride", "dst_width", b"dst_width", "flip_y", b"flip_y"]) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["buffer", b"buffer"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["buffer", b"buffer", "dst_format", b"dst_format", "dst_height", b"dst_height", "dst_ptr", b"dst_ptr", "dst_stride", b"dst_stride", "dst_width", b"dst_width", "flip_y", b"flip_y"]) -> None: ... global___ToArgbRequest = ToArgbRequest diff --git a/livekit-rtc/livekit/rtc/_utils.py b/livekit-rtc/livekit/rtc/_utils.py index aa44798e..8d80441e 100644 --- a/livekit-rtc/livekit/rtc/_utils.py +++ b/livekit-rtc/livekit/rtc/_utils.py @@ -2,12 +2,11 @@ from collections import deque import ctypes from typing import Callable, Generic, List, TypeVar -from typing_extensions import Buffer -import numpy -def get_address(data: bytearray) -> int: +def get_address(data: memoryview) -> int: """ Get the address of a buffer using ctypes """ - buffer = (ctypes.c_int8 * len(data)).from_buffer(data) + nbytes = data.nbytes + buffer = (ctypes.c_int8 * nbytes).from_buffer(data) return ctypes.addressof(buffer) diff --git a/livekit-rtc/livekit/rtc/video_frame.py b/livekit-rtc/livekit/rtc/video_frame.py index 64001c45..a4a08d35 100644 --- a/livekit-rtc/livekit/rtc/video_frame.py +++ b/livekit-rtc/livekit/rtc/video_frame.py @@ -17,9 +17,10 @@ from ._ffi_client import FfiHandle, ffi_client from ._proto import ffi_pb2 as proto_ffi +from ._utils import get_address from ._proto import video_frame_pb2 as proto_video_frame -from ._proto.video_frame_pb2 import VideoFormatType, VideoFrameBufferType, VideoFrameReceived, VideoRotation -from abc import ABC +from ._proto.video_frame_pb2 import VideoFormatType, VideoFrameBufferType, VideoRotation +from abc import ABC, abstractmethod class VideoFrame: @@ -51,24 +52,30 @@ def width(self) -> int: def height(self) -> int: return self._height + @property + def data(self) -> bytearray: + return self._data + @property def type(self) -> VideoFrameBufferType.ValueType: return self._buffer_type - # TODO(theomonnom): Need Rust modification + @abstractmethod + def _proto_info(self) -> proto_video_frame.VideoFrameBufferInfo: + pass + def to_i420(self) -> 'I420Buffer': req = proto_ffi.FfiRequest() - req.to_i420.yuv_handle = self._ffi_handle.handle + req.to_i420.buffer.CopyFrom(self._proto_info()) resp = ffi_client.request(req) - return I420Buffer(resp.to_i420.buffer) + return I420Buffer._from_owned_info(resp.to_i420.buffer) - # TODO(theomonnom): Need Rust modification def to_argb(self, dst: 'ArgbFrame') -> None: req = proto_ffi.FfiRequest() - req.to_argb.buffer_handle = self._ffi_handle.handle - req.to_argb.dst_ptr = ctypes.addressof(dst.data) + req.to_argb.buffer.CopyFrom(self._proto_info()) + req.to_argb.dst_ptr = get_address(memoryview(self._data)) req.to_argb.dst_format = dst.format - req.to_argb.dst_stride = dst.width * 4 + req.to_argb.dst_stride = dst.stride req.to_argb.dst_width = dst.width req.to_argb.dst_height = dst.height ffi_client.request(req) @@ -82,27 +89,48 @@ def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) \ info = owned_info.info if info.buffer_type == VideoFrameBufferType.NATIVE: - return NativeVideoFrameBuffer(owned_info) + return NativeVideoBuffer._from_owned_info(owned_info) elif info.buffer_type == VideoFrameBufferType.I420: - return I420Buffer(owned_info) + return I420Buffer._from_owned_info(owned_info) elif info.buffer_type == VideoFrameBufferType.I420A: - return I420ABuffer(owned_info) + return I420ABuffer._from_owned_info(owned_info) elif info.buffer_type == VideoFrameBufferType.I422: - return I422Buffer(owned_info) + return I422Buffer._from_owned_info(owned_info) elif info.buffer_type == VideoFrameBufferType.I444: - return I444Buffer(owned_info) + return I444Buffer._from_owned_info(owned_info) elif info.buffer_type == VideoFrameBufferType.I010: - return I010Buffer(owned_info) + return I010Buffer._from_owned_info(owned_info) elif info.buffer_type == VideoFrameBufferType.NV12: - return NV12Buffer(owned_info) + return NV12Buffer._from_owned_info(owned_info) else: raise Exception('Unsupported VideoFrameBufferType') # TODO(theomonnom): Ability to get GPU texture directly -class NativeVideoFrameBuffer(VideoFrameBuffer): - def __init__(self, width: int, height: int) -> None: - super().__init__(bytearray(), width, height, VideoFrameBufferType.NATIVE) +class NativeVideoBuffer(VideoFrameBuffer): + def __init__(self, owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> None: + self._info = owned_info.info + self._ffi_handle = FfiHandle(owned_info.handle.id) + super().__init__(bytearray(), self._info.width, + self._info.height, VideoFrameBufferType.NATIVE) + + def _proto_info(self) -> proto_video_frame.VideoFrameBufferInfo: + return self._info + + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) \ + -> 'NativeVideoBuffer': + return NativeVideoBuffer(owned_info) + + def to_i420(self) -> 'I420Buffer': + req = proto_ffi.FfiRequest() + req.to_i420.handle = self._ffi_handle.handle + resp = ffi_client.request(req) + return I420Buffer._from_owned_info(resp.to_i420.buffer) + + def to_argb(self, dst: 'ArgbFrame') -> None: + self.to_i420().to_argb(dst) + class PlanarYuvBuffer(VideoFrameBuffer, ABC): @@ -123,6 +151,16 @@ def __init__(self, self._chroma_width = chroma_width self._chroma_height = chroma_height + def _proto_info(self) -> proto_video_frame.VideoFrameBufferInfo: + info = proto_video_frame.VideoFrameBufferInfo() + info.width = self._width + info.height = self._height + info.buffer_type = self._buffer_type + info.yuv.stride_y = self._stride_y + info.yuv.stride_u = self._stride_u + info.yuv.stride_v = self._stride_v + return info + @property def chroma_width(self) -> int: return self._chroma_width @@ -158,6 +196,13 @@ def __init__(self, super().__init__(data, width, height, buffer_type, stride_u, stride_y, stride_v, chroma_width, chroma_height) + def _proto_info(self) -> proto_video_frame.VideoFrameBufferInfo: + info = super()._proto_info() + info.yuv.data_y_ptr = get_address(self.data_y) + info.yuv.data_u_ptr = get_address(self.data_u) + info.yuv.data_v_ptr = get_address(self.data_v) + return info + @property def data_y(self) -> memoryview: return memoryview(self._data)[0:self._stride_y * self._height] @@ -191,6 +236,13 @@ def __init__(self, super().__init__(data, width, height, buffer_type, stride_y, stride_u, stride_v, chroma_width, chroma_height) + def _proto_info(self) -> proto_video_frame.VideoFrameBufferInfo: + info = super()._proto_info() + info.yuv.data_y_ptr = get_address(self.data_y) + info.yuv.data_u_ptr = get_address(self.data_u) + info.yuv.data_v_ptr = get_address(self.data_v) + return info + @property def data_y(self) -> memoryview: return memoryview(self._data)[0:self._stride_y * self._height].cast('H') @@ -226,6 +278,17 @@ def __init__(self, self._chroma_width = chroma_width self._chroma_height = chroma_height + def _proto_info(self) -> proto_video_frame.VideoFrameBufferInfo: + info = proto_video_frame.VideoFrameBufferInfo() + info.width = self._width + info.height = self._height + info.buffer_type = self._buffer_type + info.bi_yuv.stride_y = self._stride_y + info.bi_yuv.stride_uv = self._stride_uv + info.bi_yuv.data_y_ptr = get_address(self.data_y) + info.bi_yuv.data_uv_ptr = get_address(self.data_uv) + return info + @property def chroma_width(self) -> int: return self._chroma_width @@ -272,6 +335,18 @@ def __init__(self, super().__init__(data, width, height, VideoFrameBufferType.I420, stride_y, stride_u, stride_v, chroma_width, chroma_height) + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> 'I420Buffer': + info = owned_info.info + stride_y = info.yuv.stride_y + stride_u = info.yuv.stride_u + stride_v = info.yuv.stride_v + cdata = (ctypes.c_uint8 * I420Buffer.calc_data_size(info.height, + stride_y, stride_u, stride_v)).from_address(info.yuv.data_y_ptr) + data = bytearray(cdata) + FfiHandle(owned_info.handle.id) + return I420Buffer(data, info.width, info.height, stride_y, stride_u, stride_v) + @staticmethod def calc_data_size(height: int, stride_y: int, stride_u: int, stride_v: int) -> int: return stride_y * height + (stride_u + stride_v) * ((height + 1) // 2) @@ -308,6 +383,19 @@ def __init__(self, stride_y, stride_u, stride_v, chroma_width, chroma_height) self._stride_a = stride_a + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> 'I420ABuffer': + info = owned_info.info + stride_y = info.yuv.stride_y + stride_u = info.yuv.stride_u + stride_v = info.yuv.stride_v + stride_a = info.yuv.stride_a + cdata = (ctypes.c_uint8 * I420ABuffer.calc_data_size(info.height, + stride_y, stride_u, stride_v, stride_a)).from_address(info.yuv.data_y_ptr) + data = bytearray(cdata) + FfiHandle(owned_info.handle.id) + return I420ABuffer(data, info.width, info.height, stride_y, stride_u, stride_v, stride_a) + @staticmethod def calc_data_size(height: int, stride_y: int, stride_u: int, stride_v: int, stride_a: int) -> int: return (stride_y + stride_a) * height + (stride_u + stride_v) * ((height + 1) // 2) @@ -346,6 +434,18 @@ def __init__(self, super().__init__(data, width, height, VideoFrameBufferType.I422, stride_y, stride_u, stride_v, chroma_width, chroma_height) + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> 'I422Buffer': + info = owned_info.info + stride_y = info.yuv.stride_y + stride_u = info.yuv.stride_u + stride_v = info.yuv.stride_v + cdata = (ctypes.c_uint8 * I422Buffer.calc_data_size(info.height, + stride_y, stride_u, stride_v)).from_address(info.yuv.data_y_ptr) + data = bytearray(cdata) + FfiHandle(owned_info.handle.id) + return I422Buffer(data, info.width, info.height, stride_y, stride_u, stride_v) + @staticmethod def calc_data_size(height: int, stride_y: int, stride_u: int, stride_v: int) -> int: return stride_y * height + stride_u * height + stride_v * height @@ -370,6 +470,18 @@ def __init__(self, super().__init__(data, width, height, VideoFrameBufferType.I444, stride_y, stride_u, stride_v, chroma_width, chroma_height) + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> 'I444Buffer': + info = owned_info.info + stride_y = info.yuv.stride_y + stride_u = info.yuv.stride_u + stride_v = info.yuv.stride_v + cdata = (ctypes.c_uint8 * I444Buffer.calc_data_size(info.height, + stride_y, stride_u, stride_v)).from_address(info.yuv.data_y_ptr) + data = bytearray(cdata) + FfiHandle(owned_info.handle.id) + return I444Buffer(data, info.width, info.height, stride_y, stride_u, stride_v) + @staticmethod def calc_data_size(height: int, stride_y: int, stride_u: int, stride_v: int) -> int: return stride_y * height + stride_u * height + stride_v * height @@ -393,6 +505,18 @@ def __init__(self, data: bytearray, super().__init__(data, width, height, VideoFrameBufferType.I010, stride_y, stride_u, stride_v, chroma_width, chroma_height) + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> 'I010Buffer': + info = owned_info.info + stride_y = info.yuv.stride_y + stride_u = info.yuv.stride_u + stride_v = info.yuv.stride_v + cdata = (ctypes.c_uint8 * I010Buffer.calc_data_size(info.height, + stride_y, stride_u, stride_v)).from_address(info.yuv.data_y_ptr) + data = bytearray(cdata) + FfiHandle(owned_info.handle.id) + return I010Buffer(data, info.width, info.height, stride_y, stride_u, stride_v) + @staticmethod def calc_data_size(height: int, stride_y: int, stride_u: int, stride_v: int) -> int: return stride_y * height * 2 + stride_u * ((height + 1) // 2) * 2 + stride_v * ((height + 1) // 2) * 2 @@ -415,6 +539,17 @@ def __init__(self, data: bytearray, super().__init__(data, width, height, VideoFrameBufferType.NV12, stride_y, stride_uv, chroma_width, chroma_height) + @staticmethod + def _from_owned_info(owned_info: proto_video_frame.OwnedVideoFrameBuffer) -> 'NV12Buffer': + info = owned_info.info + stride_y = info.bi_yuv.stride_y + stride_uv = info.bi_yuv.stride_uv + cdata = (ctypes.c_uint8 * NV12Buffer.calc_data_size(info.height, + stride_y, stride_uv)).from_address(info.yuv.data_y_ptr) + data = bytearray(cdata) + FfiHandle(owned_info.handle.id) + return NV12Buffer(data, info.width, info.height, stride_y, stride_uv) + @staticmethod def calc_data_size(height: int, stride_y: int, stride_uv: int) -> int: return stride_y * height + stride_uv * ((height + 1) // 2) @@ -443,15 +578,30 @@ def __init__(self, def to_i420(self) -> I420Buffer: # TODO(theomonnom): avoid unnecessary buffer allocation req = proto_ffi.FfiRequest() - req.to_i420.argb.format = self._format + req.to_i420.argb.format = self.format req.to_i420.argb.width = self.width req.to_i420.argb.height = self.height - req.to_i420.argb.stride = self.width * 4 - req.to_i420.argb.ptr = ctypes.addressof(self.data) - + req.to_i420.argb.stride = self.stride + req.to_i420.argb.ptr = get_address(memoryview(self._data)) res = ffi_client.request(req) - return I420Buffer(res.to_i420.buffer) + return I420Buffer._from_owned_info(res.to_i420.buffer) - @ property + @property + def data(self) -> bytearray: + return self._data + + @property + def width(self) -> int: + return self._width + + @property + def height(self) -> int: + return self._height + + @property + def stride(self) -> int: + return self._stride + + @property def format(self) -> VideoFormatType.ValueType: return self._format diff --git a/livekit-rtc/rust-sdks b/livekit-rtc/rust-sdks index 327472c8..06b024af 160000 --- a/livekit-rtc/rust-sdks +++ b/livekit-rtc/rust-sdks @@ -1 +1 @@ -Subproject commit 327472c8fc4d5d66c97a9cc20b7f48d754bb2d01 +Subproject commit 06b024af8975741e97c1450f9a1de6993479173b