@camera.ui/server 0.0.50-internal.0 → 0.0.50-internal.1

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.
Files changed (387) hide show
  1. package/dist/interface/index.html +44 -44
  2. package/dist/interface/js/{@primevue.OhxoO3MD.0.0.50-internal.0.js → @primevue.CiB2EGly.0.0.50-internal.1.js} +1 -1
  3. package/dist/interface/js/{@tanstack.D1IL6eOv.0.0.50-internal.0.js → @tanstack.DxMw_rJn.0.0.50-internal.1.js} +1 -1
  4. package/dist/interface/js/{@vee-validate.BGPyWWTh.0.0.50-internal.0.js → @vee-validate.RxZ3hn6V.0.0.50-internal.1.js} +1 -1
  5. package/dist/interface/js/{@vueuse.BsKtqdiG.0.0.50-internal.0.js → @vueuse.C-k73ACm.0.0.50-internal.1.js} +1 -1
  6. package/dist/interface/js/{Adminpanel.D93Kvbwp.0.0.50-internal.0.js → Adminpanel.DumNu6GD.0.0.50-internal.1.js} +1 -1
  7. package/dist/interface/js/{Camera.DF2l3OMA.0.0.50-internal.0.js → Camera.BuosoqFl.0.0.50-internal.1.js} +1 -1
  8. package/dist/interface/js/{Cameras.YzvZccdv.0.0.50-internal.0.js → Cameras.A7NJflGG.0.0.50-internal.1.js} +2 -2
  9. package/dist/interface/js/Cammesh.Dv3C0UiR.0.0.50-internal.1.js +1 -0
  10. package/dist/interface/js/{Camview.CB7_HnoQ.0.0.50-internal.0.js → Camview.GgjJp7JR.0.0.50-internal.1.js} +1 -1
  11. package/dist/interface/js/{Config.BwflsWTm.0.0.50-internal.0.js → Config.BL3L-BFE.0.0.50-internal.1.js} +2 -2
  12. package/dist/interface/js/{Console.DZM8pN8Q.0.0.50-internal.0.js → Console.CxwRmUVF.0.0.50-internal.1.js} +1 -1
  13. package/dist/interface/js/{CuiConsole.BXXU7Gth.0.0.50-internal.0.js → CuiConsole.D16kkT6R.0.0.50-internal.1.js} +1 -1
  14. package/dist/interface/js/{CuiPluginCard.YFOrpbVD.0.0.50-internal.0.js → CuiPluginCard.Bkp__d8n.0.0.50-internal.1.js} +1 -1
  15. package/dist/interface/js/{CuiTimeline.VV5KSJd5.0.0.50-internal.0.js → CuiTimeline.C9HKvo0G.0.0.50-internal.1.js} +1 -1
  16. package/dist/interface/js/{FirstSteps.b-nvymgb.0.0.50-internal.0.js → FirstSteps.QuJjtAtF.0.0.50-internal.1.js} +1 -1
  17. package/dist/interface/js/{Plugin.BOMpVEwM.0.0.50-internal.0.js → Plugin.BLUUbEej.0.0.50-internal.1.js} +1 -1
  18. package/dist/interface/js/{Plugins.DdPwaUDA.0.0.50-internal.0.js → Plugins.DviCIk7w.0.0.50-internal.1.js} +1 -1
  19. package/dist/interface/js/Recordings.Dsp07cHs.0.0.50-internal.1.js +1 -0
  20. package/dist/interface/js/{Settings.D24ttaPu.0.0.50-internal.0.js → Settings.Clx4y9gP.0.0.50-internal.1.js} +1 -1
  21. package/dist/interface/js/{SettingsAccount.ms3aqz4E.0.0.50-internal.0.js → SettingsAccount.cfY4-PYd.0.0.50-internal.1.js} +1 -1
  22. package/dist/interface/js/SettingsAppearance.CBGZAazb.0.0.50-internal.1.js +1 -0
  23. package/dist/interface/js/{SettingsAppearance.vue_vue_type_script_setup_true_lang.CBQ6lL3T.0.0.50-internal.0.js → SettingsAppearance.vue_vue_type_script_setup_true_lang.kxAPXcBy.0.0.50-internal.1.js} +1 -1
  24. package/dist/interface/js/{SettingsBackup.BPEc4Rjg.0.0.50-internal.0.js → SettingsBackup.DOaJA4pp.0.0.50-internal.1.js} +1 -1
  25. package/dist/interface/js/SettingsRecordings.BGcwL6tk.0.0.50-internal.1.js +1 -0
  26. package/dist/interface/js/{SettingsRemote.BL5nXbUT.0.0.50-internal.0.js → SettingsRemote.BVU_w1Jm.0.0.50-internal.1.js} +1 -1
  27. package/dist/interface/js/{SettingsSystem.D7T0AIpm.0.0.50-internal.0.js → SettingsSystem.P0vy90vA.0.0.50-internal.1.js} +1 -1
  28. package/dist/interface/js/{SettingsUsers.1u0vCOVG.0.0.50-internal.0.js → SettingsUsers.DaP5m7eo.0.0.50-internal.1.js} +1 -1
  29. package/dist/interface/js/{VersionsHandler.vue_vue_type_script_setup_true_lang.xDishkkS.0.0.50-internal.0.js → VersionsHandler.vue_vue_type_script_setup_true_lang.MmrWYW3K.0.0.50-internal.1.js} +1 -1
  30. package/dist/interface/js/{ace-builds.D1nmvCwb.0.0.50-internal.0.js → ace-builds.C0aqA_3x.0.0.50-internal.1.js} +2 -2
  31. package/dist/interface/js/{ace.config.G96T2z54.0.0.50-internal.0.js → ace.config.C9wgzklI.0.0.50-internal.1.js} +1 -1
  32. package/dist/interface/js/{backup.B_Gzxtp_.0.0.50-internal.0.js → backup.BeH6lJ5t.0.0.50-internal.1.js} +1 -1
  33. package/dist/interface/js/{chart.js.CP_nMnnf.0.0.50-internal.0.js → chart.js.BQHSWV_g.0.0.50-internal.1.js} +1 -1
  34. package/dist/interface/js/{close-circle.DYLuVIOg.0.0.50-internal.0.js → close-circle.DDKMxauw.0.0.50-internal.1.js} +1 -1
  35. package/dist/interface/js/{dnd-core.T9OeW7mu.0.0.50-internal.0.js → dnd-core.dWz9rJqH.0.0.50-internal.1.js} +1 -1
  36. package/dist/interface/js/{draggabilly.D3zGcBb3.0.0.50-internal.0.js → draggabilly.D-iZIS1n.0.0.50-internal.1.js} +1 -1
  37. package/dist/interface/js/{engine.io-client.kITRnq-g.0.0.50-internal.0.js → engine.io-client.BwxOddB_.0.0.50-internal.1.js} +1 -1
  38. package/dist/interface/js/{fast-deep-equal.Bpc9mIsj.0.0.50-internal.0.js → fast-deep-equal.Dz96RC_N.0.0.50-internal.1.js} +1 -1
  39. package/dist/interface/js/{highlight.js.BlSXU-Wb.0.0.50-internal.0.js → highlight.js.CmcM8OM6.0.0.50-internal.1.js} +1 -1
  40. package/dist/interface/js/{linkify-it.C3N1lWsJ.0.0.50-internal.0.js → linkify-it.BgLcBzlw.0.0.50-internal.1.js} +1 -1
  41. package/dist/interface/js/{main.D0YR3Jat.0.0.50-internal.0.js → main.6bOgRV7D.0.0.50-internal.1.js} +3 -3
  42. package/dist/interface/js/{markdown-it.Dj0dt5s2.0.0.50-internal.0.js → markdown-it.CTgfs-3p.0.0.50-internal.1.js} +1 -1
  43. package/dist/interface/js/{nprogress.BwQWDcGj.0.0.50-internal.0.js → nprogress.CMhnq8jS.0.0.50-internal.1.js} +1 -1
  44. package/dist/interface/js/{pinia.DRh7plEC.0.0.50-internal.0.js → pinia.CuC5ZfNs.0.0.50-internal.1.js} +1 -1
  45. package/dist/interface/js/{primevue.Cl58krXf.0.0.50-internal.0.js → primevue.DmwjJ4xV.0.0.50-internal.1.js} +1 -1
  46. package/dist/interface/js/{qrcode.C1sDj6P8.0.0.50-internal.0.js → qrcode.DGZO3j1c.0.0.50-internal.1.js} +1 -1
  47. package/dist/interface/js/{react-dnd-touch-backend.BA4WhUJo.0.0.50-internal.0.js → react-dnd-touch-backend.CEGHlD-T.0.0.50-internal.1.js} +1 -1
  48. package/dist/interface/js/{refresh-rounded.D_SmhhUf.0.0.50-internal.0.js → refresh-rounded.D0keXzBc.0.0.50-internal.1.js} +1 -1
  49. package/dist/interface/js/{rxjs.C-fTBwEO.0.0.50-internal.0.js → rxjs.CiDbFOB0.0.0.50-internal.1.js} +1 -1
  50. package/dist/interface/js/{socket.io-client.DKrRxgjP.0.0.50-internal.0.js → socket.io-client.BPcXPAHG.0.0.50-internal.1.js} +1 -1
  51. package/dist/interface/js/{socket.io-parser.EXj3YDH2.0.0.50-internal.0.js → socket.io-parser.DSGzrW_l.0.0.50-internal.1.js} +1 -1
  52. package/dist/interface/js/{system.CY8rGd-Q.0.0.50-internal.0.js → system.BKlEObmx.0.0.50-internal.1.js} +1 -1
  53. package/dist/interface/js/{trash-fill.CMnCN3Oy.0.0.50-internal.0.js → trash-fill.BDFILs86.0.0.50-internal.1.js} +1 -1
  54. package/dist/interface/js/{unidragger.D0w6Tqtt.0.0.50-internal.0.js → unidragger.DcxsxHCS.0.0.50-internal.1.js} +1 -1
  55. package/dist/interface/js/{vee-validate.BeiObIH8.0.0.50-internal.0.js → vee-validate.BGRg3oQ8.0.0.50-internal.1.js} +1 -1
  56. package/dist/interface/js/{vue-chartjs.DtdZdiYw.0.0.50-internal.0.js → vue-chartjs.B9yk2de7.0.0.50-internal.1.js} +1 -1
  57. package/dist/interface/js/{vue-i18n.BW2bx_6z.0.0.50-internal.0.js → vue-i18n.DXDZITpf.0.0.50-internal.1.js} +1 -1
  58. package/dist/interface/js/{vue-inline-svg.BJkQGmKz.0.0.50-internal.0.js → vue-inline-svg.BDYaTfbi.0.0.50-internal.1.js} +1 -1
  59. package/dist/interface/js/{vue-router.B2mOXHaC.0.0.50-internal.0.js → vue-router.CFEDA008.0.0.50-internal.1.js} +1 -1
  60. package/dist/interface/js/{vue-zoomable.BKDyCJE7.0.0.50-internal.0.js → vue-zoomable.zqTafMgD.0.0.50-internal.1.js} +1 -1
  61. package/dist/interface/js/{vue3-dnd.DRK24CBp.0.0.50-internal.0.js → vue3-dnd.BxM3dbYs.0.0.50-internal.1.js} +1 -1
  62. package/dist/interface/js/{zoom-out.DxvzgVEo.0.0.50-internal.0.js → zoom-out.B6SY9IIj.0.0.50-internal.1.js} +1 -1
  63. package/dist/interface/sw.js +1 -1
  64. package/dist/server/package.json +1 -1
  65. package/package.json +1 -1
  66. package/.prettierignore +0 -12
  67. package/.prettierrc.json +0 -12
  68. package/artillery.yaml +0 -29
  69. package/bin/cameraui-server.ts +0 -11
  70. package/dist/interface/js/Cammesh.D-6dAROQ.0.0.50-internal.0.js +0 -1
  71. package/dist/interface/js/Recordings.DhxjIW7e.0.0.50-internal.0.js +0 -1
  72. package/dist/interface/js/SettingsAppearance.DsTjKXk1.0.0.50-internal.0.js +0 -1
  73. package/dist/interface/js/SettingsRecordings.DgW7M0jj.0.0.50-internal.0.js +0 -1
  74. package/eslint.config.js +0 -103
  75. package/localdeps.txt +0 -10
  76. package/mypy.ini +0 -30
  77. package/requirements.txt +0 -15
  78. package/ruff.toml +0 -90
  79. package/src/__init__.py +0 -0
  80. package/src/_camera_ui_tools/__init__.py +0 -0
  81. package/src/_camera_ui_tools/__pycache__/__init__.cpython-311.pyc +0 -0
  82. package/src/api/controllers/api.controller.ts +0 -19
  83. package/src/api/controllers/auth.controller.ts +0 -294
  84. package/src/api/controllers/backup.controller.ts +0 -72
  85. package/src/api/controllers/cameras.controller.ts +0 -1029
  86. package/src/api/controllers/config.controller.ts +0 -102
  87. package/src/api/controllers/files.controller.ts +0 -35
  88. package/src/api/controllers/frameWorkers.controller.ts +0 -109
  89. package/src/api/controllers/plugins.controller.ts +0 -1206
  90. package/src/api/controllers/system.controller.ts +0 -273
  91. package/src/api/controllers/users.controller.ts +0 -648
  92. package/src/api/database/checks.ts +0 -268
  93. package/src/api/database/constants.ts +0 -8
  94. package/src/api/database/index.ts +0 -262
  95. package/src/api/database/migration.ts +0 -62
  96. package/src/api/database/selfcheck.ts +0 -492
  97. package/src/api/database/types.ts +0 -104
  98. package/src/api/go2rtc/api/application.ts +0 -48
  99. package/src/api/go2rtc/api/config.ts +0 -61
  100. package/src/api/go2rtc/api/discover.ts +0 -197
  101. package/src/api/go2rtc/api/index.ts +0 -49
  102. package/src/api/go2rtc/api/snapshot.ts +0 -44
  103. package/src/api/go2rtc/api/streams.ts +0 -168
  104. package/src/api/go2rtc/index.ts +0 -43
  105. package/src/api/go2rtc/queue.ts +0 -50
  106. package/src/api/go2rtc/types.ts +0 -174
  107. package/src/api/index.ts +0 -286
  108. package/src/api/middlewares/authPermission.middleware.ts +0 -46
  109. package/src/api/middlewares/authValidation.middleware.ts +0 -160
  110. package/src/api/middlewares/pagination.middleware.ts +0 -67
  111. package/src/api/middlewares/socketAuth.middleware.ts +0 -136
  112. package/src/api/plugins/header.plugin.ts +0 -15
  113. package/src/api/plugins/logger.plugin.ts +0 -44
  114. package/src/api/plugins/proxy.plugin.ts +0 -255
  115. package/src/api/plugins/socket.plugin.ts +0 -28
  116. package/src/api/plugins/system.plugin.ts +0 -48
  117. package/src/api/plugins/useragent.plugin.ts +0 -19
  118. package/src/api/routes/api.routes.ts +0 -10
  119. package/src/api/routes/auth.routes.ts +0 -56
  120. package/src/api/routes/backup.routes.ts +0 -28
  121. package/src/api/routes/cameras.routes.ts +0 -281
  122. package/src/api/routes/config.routes.ts +0 -66
  123. package/src/api/routes/files.routes.ts +0 -15
  124. package/src/api/routes/frameWorkers.routes.ts +0 -39
  125. package/src/api/routes/index.ts +0 -37
  126. package/src/api/routes/plugins.routes.ts +0 -420
  127. package/src/api/routes/system.routes.ts +0 -101
  128. package/src/api/routes/users.routes.ts +0 -167
  129. package/src/api/schemas/backup.schema.ts +0 -112
  130. package/src/api/schemas/cameras.schema.ts +0 -479
  131. package/src/api/schemas/config.schema.ts +0 -38
  132. package/src/api/schemas/go2rtc.schema.ts +0 -189
  133. package/src/api/schemas/plugins.schema.ts +0 -126
  134. package/src/api/schemas/storage.schema.ts +0 -11
  135. package/src/api/schemas/system.schema.ts +0 -45
  136. package/src/api/schemas/users.schema.ts +0 -185
  137. package/src/api/services/auth.service.ts +0 -210
  138. package/src/api/services/backup.service.ts +0 -144
  139. package/src/api/services/cameras.service.ts +0 -671
  140. package/src/api/services/plugins.service.ts +0 -470
  141. package/src/api/services/system.service.ts +0 -85
  142. package/src/api/services/users.service.ts +0 -276
  143. package/src/api/types/index.ts +0 -675
  144. package/src/api/utils/cert.ts +0 -254
  145. package/src/api/utils/constants.ts +0 -17
  146. package/src/api/utils/fetch.ts +0 -21
  147. package/src/api/utils/moveFiles.ts +0 -45
  148. package/src/api/utils/parse.ts +0 -17
  149. package/src/api/websocket/index.ts +0 -110
  150. package/src/api/websocket/nsp/logs.ts +0 -240
  151. package/src/api/websocket/nsp/main.ts +0 -27
  152. package/src/api/websocket/nsp/metrics.ts +0 -301
  153. package/src/api/websocket/nsp/notifications.ts +0 -43
  154. package/src/api/websocket/nsp/plugins.ts +0 -37
  155. package/src/api/websocket/nsp/server.ts +0 -220
  156. package/src/api/websocket/nsp/status.ts +0 -77
  157. package/src/api/websocket/types.ts +0 -55
  158. package/src/api.ts +0 -163
  159. package/src/camera/classes.ts +0 -32
  160. package/src/camera/controller.ts +0 -579
  161. package/src/camera/device.ts +0 -422
  162. package/src/camera/frameWorker.ts +0 -403
  163. package/src/camera/index.ts +0 -679
  164. package/src/camera/interfaces.ts +0 -95
  165. package/src/camera/iou.ts +0 -153
  166. package/src/camera/polygon.ts +0 -226
  167. package/src/camera/python/__init__.py +0 -0
  168. package/src/camera/python/__pycache__/__init__.cpython-311.pyc +0 -0
  169. package/src/camera/python/__pycache__/classes.cpython-311.pyc +0 -0
  170. package/src/camera/python/__pycache__/delegate_controller.cpython-311.pyc +0 -0
  171. package/src/camera/python/__pycache__/interfaces.cpython-311.pyc +0 -0
  172. package/src/camera/python/__pycache__/iou.cpython-310.pyc +0 -0
  173. package/src/camera/python/__pycache__/iou.cpython-311.pyc +0 -0
  174. package/src/camera/python/__pycache__/iou2.cpython-310.pyc +0 -0
  175. package/src/camera/python/__pycache__/polygon.cpython-311.pyc +0 -0
  176. package/src/camera/python/__pycache__/typings.cpython-311.pyc +0 -0
  177. package/src/camera/python/__pycache__/video_frame.cpython-311.pyc +0 -0
  178. package/src/camera/python/classes.py +0 -41
  179. package/src/camera/python/interfaces.py +0 -130
  180. package/src/camera/python/iou.py +0 -158
  181. package/src/camera/python/polygon.py +0 -230
  182. package/src/camera/python/test/__pycache__/polygon.cpython-310.pyc +0 -0
  183. package/src/camera/python/test/iou_test.py +0 -799
  184. package/src/camera/python/test/polygon.py +0 -238
  185. package/src/camera/python/test/polygon_test.py +0 -256
  186. package/src/camera/python/test/polygon_test2.py +0 -484
  187. package/src/camera/python/typings.py +0 -50
  188. package/src/camera/python/video_frame.py +0 -143
  189. package/src/camera/session.ts +0 -192
  190. package/src/camera/streaming/fmp4-session.ts +0 -390
  191. package/src/camera/streaming/peer-connection.ts +0 -273
  192. package/src/camera/streaming/rtsp-session.ts +0 -331
  193. package/src/camera/streaming/webrtc-connection.ts +0 -260
  194. package/src/camera/streaming/werift-session.ts +0 -317
  195. package/src/camera/test/iou_test.ts +0 -761
  196. package/src/camera/test/polygon.test.ts +0 -611
  197. package/src/camera/test/polygon_test.ts +0 -210
  198. package/src/camera/types.ts +0 -48
  199. package/src/camera/utils.ts +0 -489
  200. package/src/camera/videoFrame.ts +0 -123
  201. package/src/cloud/index.ts +0 -61
  202. package/src/cloud/remote/cloudflare.ts +0 -18
  203. package/src/cloud/remote/upnp.ts +0 -18
  204. package/src/cloud/remote/utils.ts +0 -24
  205. package/src/cloud/types.ts +0 -16
  206. package/src/decoder/child.ts +0 -883
  207. package/src/decoder/imageUtils.ts +0 -275
  208. package/src/decoder/manager.ts +0 -251
  209. package/src/decoder/python/__init__.py +0 -0
  210. package/src/decoder/python/__pycache__/__init__.cpython-311.pyc +0 -0
  211. package/src/decoder/python/__pycache__/image_utils.cpython-311.pyc +0 -0
  212. package/src/decoder/python/__pycache__/typings.cpython-311.pyc +0 -0
  213. package/src/decoder/python/__pycache__/utils.cpython-311.pyc +0 -0
  214. package/src/decoder/python/child.py +0 -903
  215. package/src/decoder/python/image_utils.py +0 -196
  216. package/src/decoder/python/pool.py +0 -45
  217. package/src/decoder/python/test/group.py +0 -62
  218. package/src/decoder/python/test/motion.mp4 +0 -0
  219. package/src/decoder/python/test/motion2.mp4 +0 -0
  220. package/src/decoder/python/test/opencl.cl +0 -70
  221. package/src/decoder/python/test/opencl2.cl +0 -130
  222. package/src/decoder/python/test/test.py +0 -427
  223. package/src/decoder/python/test/test1.jpg +0 -0
  224. package/src/decoder/python/test/test1_resized.jpg +0 -0
  225. package/src/decoder/python/test/test2.jpg +0 -0
  226. package/src/decoder/python/test/test2.py +0 -451
  227. package/src/decoder/python/test/test2_resized.jpg +0 -0
  228. package/src/decoder/python/test/test3.jpg +0 -0
  229. package/src/decoder/python/test/utils.py +0 -50
  230. package/src/decoder/python/typings.py +0 -57
  231. package/src/decoder/python/utils.py +0 -70
  232. package/src/decoder/test/child.ts +0 -117
  233. package/src/decoder/test/ffmpeg.ts +0 -371
  234. package/src/decoder/test/test.ts +0 -182
  235. package/src/decoder/types.ts +0 -27
  236. package/src/decoder/utils.ts +0 -64
  237. package/src/decoder/wasm/asconfig.json +0 -28
  238. package/src/decoder/wasm/assembly/console.ts +0 -1
  239. package/src/decoder/wasm/assembly/index.ts +0 -890
  240. package/src/decoder/wasm/build/decoder.d.ts +0 -43
  241. package/src/decoder/wasm/build/decoder.js +0 -108
  242. package/src/decoder/wasm/build/decoder.wasm +0 -0
  243. package/src/decoder/wasm/tsconfig.json +0 -5
  244. package/src/decoder/worker.ts +0 -113
  245. package/src/go2rtc/index.ts +0 -324
  246. package/src/go2rtc/types.ts +0 -88
  247. package/src/main.ts +0 -267
  248. package/src/manager/coreManager.ts +0 -78
  249. package/src/manager/deviceManager.ts +0 -132
  250. package/src/manager/types.ts +0 -17
  251. package/src/plugins/index.ts +0 -443
  252. package/src/plugins/plugin.ts +0 -177
  253. package/src/plugins/runtime/base.ts +0 -282
  254. package/src/plugins/runtime/index.ts +0 -15
  255. package/src/plugins/runtime/node/child.ts +0 -193
  256. package/src/plugins/runtime/node/index.ts +0 -67
  257. package/src/plugins/runtime/node/plugin.ts +0 -122
  258. package/src/plugins/runtime/node/pluginApi.ts +0 -27
  259. package/src/plugins/runtime/node/proxy/cameraDevice.ts +0 -299
  260. package/src/plugins/runtime/node/proxy/coreManager.ts +0 -128
  261. package/src/plugins/runtime/node/proxy/deviceManager.ts +0 -187
  262. package/src/plugins/runtime/node/storage.ts +0 -312
  263. package/src/plugins/runtime/node/storageController.ts +0 -91
  264. package/src/plugins/runtime/python/__init__.py +0 -0
  265. package/src/plugins/runtime/python/__pycache__/__init__.cpython-311.pyc +0 -0
  266. package/src/plugins/runtime/python/__pycache__/camera_storage.cpython-311.pyc +0 -0
  267. package/src/plugins/runtime/python/__pycache__/config_service.cpython-311.pyc +0 -0
  268. package/src/plugins/runtime/python/__pycache__/constants.cpython-311.pyc +0 -0
  269. package/src/plugins/runtime/python/__pycache__/ipc.cpython-311.pyc +0 -0
  270. package/src/plugins/runtime/python/__pycache__/logger.cpython-311.pyc +0 -0
  271. package/src/plugins/runtime/python/__pycache__/message_queue.cpython-311.pyc +0 -0
  272. package/src/plugins/runtime/python/__pycache__/namespaces.cpython-311.pyc +0 -0
  273. package/src/plugins/runtime/python/__pycache__/plugin.cpython-311.pyc +0 -0
  274. package/src/plugins/runtime/python/__pycache__/plugin_api.cpython-311.pyc +0 -0
  275. package/src/plugins/runtime/python/__pycache__/plugin_logger.cpython-311.pyc +0 -0
  276. package/src/plugins/runtime/python/__pycache__/proxy_utils.cpython-311.pyc +0 -0
  277. package/src/plugins/runtime/python/__pycache__/schema.cpython-311.pyc +0 -0
  278. package/src/plugins/runtime/python/__pycache__/storage.cpython-311.pyc +0 -0
  279. package/src/plugins/runtime/python/__pycache__/storage_controller.cpython-311.pyc +0 -0
  280. package/src/plugins/runtime/python/__pycache__/typings.cpython-311.pyc +0 -0
  281. package/src/plugins/runtime/python/child.py +0 -248
  282. package/src/plugins/runtime/python/index.ts +0 -73
  283. package/src/plugins/runtime/python/namespaces.py +0 -101
  284. package/src/plugins/runtime/python/plugin.py +0 -155
  285. package/src/plugins/runtime/python/plugin_api.py +0 -29
  286. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-310.pyc +0 -0
  287. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-311.pyc +0 -0
  288. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-38.pyc +0 -0
  289. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-39.pyc +0 -0
  290. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-311.pyc +0 -0
  291. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-39.pyc +0 -0
  292. package/src/plugins/runtime/python/proxy/__pycache__/core_manager.cpython-311.pyc +0 -0
  293. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-310.pyc +0 -0
  294. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-311.pyc +0 -0
  295. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-38.pyc +0 -0
  296. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-39.pyc +0 -0
  297. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-310.pyc +0 -0
  298. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-311.pyc +0 -0
  299. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-38.pyc +0 -0
  300. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-39.pyc +0 -0
  301. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-310.pyc +0 -0
  302. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-311.pyc +0 -0
  303. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-38.pyc +0 -0
  304. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-39.pyc +0 -0
  305. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-310.pyc +0 -0
  306. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-311.pyc +0 -0
  307. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-38.pyc +0 -0
  308. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-39.pyc +0 -0
  309. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-310.pyc +0 -0
  310. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-311.pyc +0 -0
  311. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-38.pyc +0 -0
  312. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-39.pyc +0 -0
  313. package/src/plugins/runtime/python/proxy/camera_device.py +0 -1732
  314. package/src/plugins/runtime/python/proxy/core_manager.py +0 -126
  315. package/src/plugins/runtime/python/proxy/device_manager.py +0 -197
  316. package/src/plugins/runtime/python/schema.py +0 -99
  317. package/src/plugins/runtime/python/storage.py +0 -353
  318. package/src/plugins/runtime/python/storage_controller.py +0 -102
  319. package/src/plugins/runtime/python/typings.py +0 -195
  320. package/src/plugins/schema.ts +0 -472
  321. package/src/plugins/types.ts +0 -60
  322. package/src/plugins/worker.ts +0 -250
  323. package/src/rpc/index.ts +0 -149
  324. package/src/rpc/namespaces.ts +0 -79
  325. package/src/rpc/server.ts +0 -422
  326. package/src/rpc/types.ts +0 -119
  327. package/src/rpc/utils.ts +0 -16
  328. package/src/services/config/constants.ts +0 -47
  329. package/src/services/config/defaults.ts +0 -57
  330. package/src/services/config/index.ts +0 -744
  331. package/src/services/config/types.ts +0 -211
  332. package/src/services/logger/index.ts +0 -96
  333. package/src/types.ts +0 -47
  334. package/src/utils/path.ts +0 -16
  335. package/src/utils/pythonInstaller.ts +0 -597
  336. package/tsconfig.json +0 -37
  337. package/updates.config.js +0 -3
  338. /package/dist/interface/assets/{@xterm.DYP7pi_n.0.0.50-internal.0.css → @xterm.DYP7pi_n.0.0.50-internal.1.css} +0 -0
  339. /package/dist/interface/assets/{Adminpanel.BKek2EMH.0.0.50-internal.0.css → Adminpanel.BKek2EMH.0.0.50-internal.1.css} +0 -0
  340. /package/dist/interface/assets/{Cameras.BDWZJqPN.0.0.50-internal.0.css → Cameras.BDWZJqPN.0.0.50-internal.1.css} +0 -0
  341. /package/dist/interface/assets/{Camview.BFUFMoNX.0.0.50-internal.0.css → Camview.BFUFMoNX.0.0.50-internal.1.css} +0 -0
  342. /package/dist/interface/assets/{CuiConsole.DCYyxdVg.0.0.50-internal.0.css → CuiConsole.DCYyxdVg.0.0.50-internal.1.css} +0 -0
  343. /package/dist/interface/assets/{CuiPluginCard.yF8V0SZY.0.0.50-internal.0.css → CuiPluginCard.yF8V0SZY.0.0.50-internal.1.css} +0 -0
  344. /package/dist/interface/assets/{CuiTimeline.BkIwlYtw.0.0.50-internal.0.css → CuiTimeline.BkIwlYtw.0.0.50-internal.1.css} +0 -0
  345. /package/dist/interface/assets/{Plugin.DJElsAn5.0.0.50-internal.0.css → Plugin.DJElsAn5.0.0.50-internal.1.css} +0 -0
  346. /package/dist/interface/assets/{Plugins.0h77qnmN.0.0.50-internal.0.css → Plugins.0h77qnmN.0.0.50-internal.1.css} +0 -0
  347. /package/dist/interface/assets/{Settings.CkgfRkQr.0.0.50-internal.0.css → Settings.CkgfRkQr.0.0.50-internal.1.css} +0 -0
  348. /package/dist/interface/assets/{SettingsAccount.DeFul3eQ.0.0.50-internal.0.css → SettingsAccount.DeFul3eQ.0.0.50-internal.1.css} +0 -0
  349. /package/dist/interface/assets/{SettingsBackup.CX0rT0QJ.0.0.50-internal.0.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.1.css} +0 -0
  350. /package/dist/interface/assets/{highlight.Ch2EwETz.0.0.50-internal.0.css → highlight.Ch2EwETz.0.0.50-internal.1.css} +0 -0
  351. /package/dist/interface/assets/{logo-256.BCQk9H1-.0.0.50-internal.0.png → logo-256.BCQk9H1-.0.0.50-internal.1.png} +0 -0
  352. /package/dist/interface/assets/{logo-512.DLKVOU2S.0.0.50-internal.0.png → logo-512.DLKVOU2S.0.0.50-internal.1.png} +0 -0
  353. /package/dist/interface/assets/{logo.DmEiRk0z.0.0.50-internal.0.png → logo.DmEiRk0z.0.0.50-internal.1.png} +0 -0
  354. /package/dist/interface/assets/{main.Cip9LkS3.0.0.50-internal.0.css → main.Cip9LkS3.0.0.50-internal.1.css} +0 -0
  355. /package/dist/interface/assets/{mode-json.Br7xisR1.0.0.50-internal.0.js → mode-json.Br7xisR1.0.0.50-internal.1.js} +0 -0
  356. /package/dist/interface/assets/{mode-yaml.CIYL8U3d.0.0.50-internal.0.js → mode-yaml.CIYL8U3d.0.0.50-internal.1.js} +0 -0
  357. /package/dist/interface/assets/{worker-base.jEXLGV2h.0.0.50-internal.0.js → worker-base.jEXLGV2h.0.0.50-internal.1.js} +0 -0
  358. /package/dist/interface/assets/{worker-json.DgwNIOck.0.0.50-internal.0.js → worker-json.DgwNIOck.0.0.50-internal.1.js} +0 -0
  359. /package/dist/interface/assets/{worker-yaml.B3uUYINB.0.0.50-internal.0.js → worker-yaml.B3uUYINB.0.0.50-internal.1.js} +0 -0
  360. /package/dist/interface/js/{@babel.l0sNRNKZ.0.0.50-internal.0.js → @babel.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  361. /package/dist/interface/js/{@intlify.BkGPX90O.0.0.50-internal.0.js → @intlify.BkGPX90O.0.0.50-internal.1.js} +0 -0
  362. /package/dist/interface/js/{@kurkle.D8fDXNIl.0.0.50-internal.0.js → @kurkle.D8fDXNIl.0.0.50-internal.1.js} +0 -0
  363. /package/dist/interface/js/{@primeuix.BFAY2Bk9.0.0.50-internal.0.js → @primeuix.BFAY2Bk9.0.0.50-internal.1.js} +0 -0
  364. /package/dist/interface/js/{@react-dnd.CcwRs9xb.0.0.50-internal.0.js → @react-dnd.CcwRs9xb.0.0.50-internal.1.js} +0 -0
  365. /package/dist/interface/js/{@socket.io.Dkula2eQ.0.0.50-internal.0.js → @socket.io.Dkula2eQ.0.0.50-internal.1.js} +0 -0
  366. /package/dist/interface/js/{@vue.B5vqhCp2.0.0.50-internal.0.js → @vue.B5vqhCp2.0.0.50-internal.1.js} +0 -0
  367. /package/dist/interface/js/{@xterm.CAa7rpjv.0.0.50-internal.0.js → @xterm.DIUBesyz.0.0.50-internal.1.js} +0 -0
  368. /package/dist/interface/js/{axios.DHr9lByg.0.0.50-internal.0.js → axios.DHr9lByg.0.0.50-internal.1.js} +0 -0
  369. /package/dist/interface/js/{birpc.l0sNRNKZ.0.0.50-internal.0.js → birpc.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  370. /package/dist/interface/js/{compare-versions.DqEOhma6.0.0.50-internal.0.js → compare-versions.DqEOhma6.0.0.50-internal.1.js} +0 -0
  371. /package/dist/interface/js/{dijkstrajs.C00ieaqj.0.0.50-internal.0.js → dijkstrajs.C00ieaqj.0.0.50-internal.1.js} +0 -0
  372. /package/dist/interface/js/{engine.io-parser.BiEtp6m2.0.0.50-internal.0.js → engine.io-parser.BiEtp6m2.0.0.50-internal.1.js} +0 -0
  373. /package/dist/interface/js/{entities.C20TfXL6.0.0.50-internal.0.js → entities.C20TfXL6.0.0.50-internal.1.js} +0 -0
  374. /package/dist/interface/js/{ev-emitter.X5f1qa-c.0.0.50-internal.0.js → ev-emitter.X5f1qa-c.0.0.50-internal.1.js} +0 -0
  375. /package/dist/interface/js/{get-size.D1dS-IaP.0.0.50-internal.0.js → get-size.D1dS-IaP.0.0.50-internal.1.js} +0 -0
  376. /package/dist/interface/js/{hookable.l0sNRNKZ.0.0.50-internal.0.js → hookable.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  377. /package/dist/interface/js/{mdurl.k9Sl0PQj.0.0.50-internal.0.js → mdurl.k9Sl0PQj.0.0.50-internal.1.js} +0 -0
  378. /package/dist/interface/js/{perfect-debounce.l0sNRNKZ.0.0.50-internal.0.js → perfect-debounce.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  379. /package/dist/interface/js/{primelocale.Bga3dOQu.0.0.50-internal.0.js → primelocale.Bga3dOQu.0.0.50-internal.1.js} +0 -0
  380. /package/dist/interface/js/{punycode.js.Dj65hjkv.0.0.50-internal.0.js → punycode.js.Dj65hjkv.0.0.50-internal.1.js} +0 -0
  381. /package/dist/interface/js/{react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.0.js → react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.1.js} +0 -0
  382. /package/dist/interface/js/{redux.BFxtlG_c.0.0.50-internal.0.js → redux.BFxtlG_c.0.0.50-internal.1.js} +0 -0
  383. /package/dist/interface/js/{tslib.9k7AwCpt.0.0.50-internal.0.js → tslib.9k7AwCpt.0.0.50-internal.1.js} +0 -0
  384. /package/dist/interface/js/{uc.micro.kMc2yuuw.0.0.50-internal.0.js → uc.micro.kMc2yuuw.0.0.50-internal.1.js} +0 -0
  385. /package/dist/interface/js/{uuid.C6aID195.0.0.50-internal.0.js → uuid.C6aID195.0.0.50-internal.1.js} +0 -0
  386. /package/dist/interface/js/{vue.l0sNRNKZ.0.0.50-internal.0.js → vue.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  387. /package/dist/interface/js/{zod.SKKegNRO.0.0.50-internal.0.js → zod.SKKegNRO.0.0.50-internal.1.js} +0 -0
@@ -1,117 +0,0 @@
1
- import { DEFAULT_FFMPEG_ARGS, FFmpegStream } from './ffmpeg.js';
2
-
3
- import type { FfmpegArgs, ImageOptions } from '@camera.ui/types';
4
- import type { ImageUtils } from '../../../polyglot/node/decoder/imageUtils.js';
5
- import type { FFmpegStreamConfig } from './ffmpeg.js';
6
-
7
- export class FrameWorkerChild {
8
- private ffmpegStream: FFmpegStream;
9
-
10
- constructor(
11
- private config: FFmpegStreamConfig,
12
- private imageUtils: ImageUtils, // Replace with your ImageUtils type
13
- private ffmpegArgs: FfmpegArgs = DEFAULT_FFMPEG_ARGS,
14
- ) {
15
- this.imageUtils = imageUtils;
16
- this.ffmpegStream = new FFmpegStream(config, ffmpegArgs);
17
-
18
- // Error handling
19
- this.ffmpegStream.on('error', async (error) => {
20
- console.error('FFmpeg Error:', error);
21
-
22
- // Versuche FFmpeg neu zu starten
23
- try {
24
- await this.ffmpegStream.restart();
25
- } catch (restartError) {
26
- console.error('Failed to restart FFmpeg:', restartError);
27
- }
28
- });
29
- }
30
-
31
- async *generateFrames(options?: ImageOptions): AsyncIterableIterator<{
32
- data: Uint8Array;
33
- timestamp: number;
34
- }> {
35
- this.ffmpegStream.registerConsumer();
36
-
37
- try {
38
- if (!this.ffmpegStream.isRunning) {
39
- await this.ffmpegStream.start();
40
- }
41
-
42
- const [width, height] = this.config.resolution.split('x').map(Number);
43
-
44
- // Listener außerhalb der while-Schleife definieren
45
- const framePromise = () =>
46
- new Promise<{ data: Buffer; timestamp: number; release: () => void }>((resolve) => {
47
- this.ffmpegStream.once('frame', resolve);
48
- });
49
-
50
- while (true) {
51
- const frame = await framePromise();
52
-
53
- try {
54
- if (options) {
55
- const processedData = await this.imageUtils.processImage(frame.data, width, height, 'yuv420p', options);
56
- yield { data: processedData, timestamp: frame.timestamp };
57
- } else {
58
- yield { data: frame.data, timestamp: frame.timestamp };
59
- }
60
- } finally {
61
- // Buffer nach Verwendung zurückgeben
62
- frame.release();
63
- }
64
- }
65
- } finally {
66
- this.ffmpegStream.unregisterConsumer();
67
- }
68
- }
69
-
70
- /**
71
- * Start FFmpeg process manually
72
- */
73
- async start(): Promise<void> {
74
- await this.ffmpegStream.start();
75
- }
76
-
77
- /**
78
- * Stop FFmpeg process manually
79
- */
80
- async stop(): Promise<void> {
81
- await this.ffmpegStream.stop();
82
- }
83
-
84
- /**
85
- * Restart FFmpeg process manually
86
- */
87
- async restart(): Promise<void> {
88
- await this.ffmpegStream.restart();
89
- }
90
-
91
- /**
92
- * Update FFmpeg configuration
93
- * This will restart the FFmpeg process if it's running
94
- */
95
- async updateConfig(config: Partial<FFmpegStreamConfig>): Promise<void> {
96
- const wasRunning = this.ffmpegStream.isRunning;
97
-
98
- if (wasRunning) {
99
- await this.stop();
100
- }
101
-
102
- // Create new FFmpegStream with updated config
103
- this.config = { ...this.config, ...config };
104
- this.ffmpegStream = new FFmpegStream(this.config, this.ffmpegArgs);
105
-
106
- if (wasRunning) {
107
- await this.start();
108
- }
109
- }
110
-
111
- /**
112
- * Check if FFmpeg process is running
113
- */
114
- isRunning(): boolean {
115
- return this.ffmpegStream.isRunning;
116
- }
117
- }
@@ -1,371 +0,0 @@
1
- import { ChildProcess, spawn } from 'node:child_process';
2
- import { Transform } from 'node:stream';
3
-
4
- import type { TransformCallback, TransformOptions } from 'node:stream';
5
-
6
- export type CameraFrameWorkerDecoder = 'pillow' | 'wasm' | 'rust';
7
-
8
- export type CameraFrameWorkerResolution =
9
- | '3840x2160'
10
- | '3072x1728'
11
- | '2560x1440'
12
- | '1920x1080'
13
- | '1440x1080'
14
- | '1280x720'
15
- | '960x540'
16
- | '640x480'
17
- | '640x360'
18
- | '320x240'
19
- | '320x180';
20
-
21
- export interface FFmpegStreamConfig {
22
- frameWorkerId: string;
23
- cameraId: string;
24
- cameraName: string;
25
- ffmpegPath: string;
26
- auth: { user: string; password: string };
27
- proxyEndpoints: string[];
28
- fps: number;
29
- resolution: CameraFrameWorkerResolution;
30
- decoder: CameraFrameWorkerDecoder;
31
- }
32
-
33
- export interface FfmpegArgs {
34
- codec: string;
35
- hwaccel: string;
36
- hwaccelArgs: string[];
37
- hwaccelFilters: string[];
38
- hwDeviceArgs: string[];
39
- threads: string;
40
- }
41
-
42
- export type DecoderFormat = 'yuv' | 'rgb';
43
-
44
- export interface FrameMetadata {
45
- format: DecoderFormat;
46
- frameSize: number;
47
- width: number;
48
- origWidth: number;
49
- height: number;
50
- origHeight: number;
51
- }
52
-
53
- export const PIX_FMT: 'yuv420p' | 'rgb24' | 'nv12' = 'yuv420p';
54
-
55
- export const DEFAULT_FFMPEG_ARGS: FfmpegArgs = {
56
- codec: 'h264',
57
- hwaccel: 'auto',
58
- hwaccelArgs: [],
59
- hwaccelFilters: ['scale=640:360'],
60
- hwDeviceArgs: [],
61
- threads: '1',
62
- };
63
-
64
- const CAMERA_SOURCE = 'rtsp://localhost:2101/keller_fullhd?video';
65
- // const CAMERA_SOURCE = 'rtsp://192.168.178.76:554/11';
66
-
67
- export class FFmpegStream extends Transform {
68
- public isRunning = false;
69
-
70
- private readonly frameSize: number;
71
- private readonly ringBuffer: Buffer;
72
- private writePos = 0;
73
- private readPos = 0;
74
- private bytesInBuffer = 0;
75
-
76
- // Neu: Frame Buffer Pool
77
- private readonly frameBufferPool: Buffer[] = [];
78
- private readonly poolSize = 4; // Anzahl der Buffer im Pool
79
-
80
- private process?: ChildProcess;
81
- private activeConsumers = 0;
82
-
83
- private metadata?: FrameMetadata;
84
-
85
- constructor(
86
- private config: FFmpegStreamConfig,
87
- private ffmpegArgs: FfmpegArgs = DEFAULT_FFMPEG_ARGS,
88
- options: TransformOptions = {},
89
- ) {
90
- super({
91
- ...options,
92
- objectMode: false,
93
- highWaterMark: 1024 * 1024, // 1MB chunks
94
- });
95
-
96
- const [width, height] = config.resolution.split('x').map(Number);
97
- this.frameSize = width * height * this.getBytesPerPixel();
98
-
99
- // Ring-Buffer für 4 Frames
100
- this.ringBuffer = Buffer.allocUnsafe(this.frameSize * 4);
101
-
102
- this.initializeBufferPool();
103
- }
104
-
105
- public async start(): Promise<void> {
106
- if (this.isRunning) return;
107
-
108
- const args = this.buildFfmpegArgs();
109
-
110
- this.process = spawn('ffmpeg', args, {
111
- stdio: ['ignore', 'pipe', 'pipe'],
112
- });
113
-
114
- this.isRunning = true;
115
-
116
- // Pipe FFmpeg output to our transform stream
117
- this.process.stdout?.pipe(this);
118
- this.process.stderr?.on('data', this.parseFrameInfo.bind(this));
119
-
120
- this.process.on('exit', (code) => {
121
- if (code !== 0 && code !== null) {
122
- this.emit('error', new Error(`FFmpeg process exited with code ${code}`));
123
- }
124
- this.isRunning = false;
125
- });
126
-
127
- this.metadata = await new Promise<FrameMetadata>((resolve, reject) => {
128
- const timeout = setTimeout(() => {
129
- reject(new Error('FFmpeg stream start timeout'));
130
- }, 10000);
131
-
132
- this.once('metadata', (metadata: FrameMetadata) => {
133
- this.process?.stderr?.removeAllListeners('data');
134
- this.process?.stderr?.resume();
135
- this.process?.stderr?.destroy();
136
-
137
- clearTimeout(timeout);
138
- resolve(metadata);
139
- });
140
- });
141
-
142
- console.log('FFmpegStream metadata:', this.metadata);
143
- }
144
-
145
- public stop(): void {
146
- if (!this.isRunning) return;
147
-
148
- this.process?.kill('SIGKILL');
149
-
150
- this.bytesInBuffer = 0;
151
- this.readPos = 0;
152
- this.writePos = 0;
153
-
154
- // Neu: Leere den Buffer Pool beim Stoppen
155
- this.frameBufferPool.length = 0;
156
- this.initializeBufferPool();
157
-
158
- this.isRunning = false;
159
- }
160
-
161
- public async restart(): Promise<void> {
162
- this.stop();
163
- // Warte kurz bevor Neustart
164
- await new Promise((resolve) => setTimeout(resolve, 1000));
165
- await this.start();
166
- }
167
-
168
- public registerConsumer(): void {
169
- this.activeConsumers++;
170
- }
171
-
172
- public unregisterConsumer(): void {
173
- this.activeConsumers--;
174
- if (this.activeConsumers <= 0) {
175
- this.activeConsumers = 0;
176
- this.stop();
177
- }
178
- }
179
-
180
- public _transform(chunk: Buffer, encoding: string, callback: TransformCallback): void {
181
- if (!this.isRunning) {
182
- return callback();
183
- }
184
-
185
- try {
186
- // Direkt in den Ring-Buffer schreiben
187
- if (this.writePos + chunk.length > this.ringBuffer.length) {
188
- // Buffer wrapping
189
- const firstPart = this.ringBuffer.length - this.writePos;
190
- chunk.copy(this.ringBuffer, this.writePos, 0, firstPart);
191
- chunk.copy(this.ringBuffer, 0, firstPart);
192
- this.writePos = chunk.length - firstPart;
193
- } else {
194
- chunk.copy(this.ringBuffer, this.writePos);
195
- this.writePos = (this.writePos + chunk.length) % this.ringBuffer.length;
196
- }
197
-
198
- this.bytesInBuffer += chunk.length;
199
-
200
- // Komplette Frames emittieren
201
- while (this.bytesInBuffer >= this.frameSize) {
202
- // Frame aus Pool holen statt neu zu allozieren
203
- const frame = this.getFrameBuffer();
204
-
205
- if (this.readPos + this.frameSize > this.ringBuffer.length) {
206
- // Frame wrapped around buffer end
207
- const firstPart = this.ringBuffer.length - this.readPos;
208
- this.ringBuffer.copy(frame, 0, this.readPos, this.ringBuffer.length);
209
- this.ringBuffer.copy(frame, firstPart, 0, this.frameSize - firstPart);
210
- } else {
211
- this.ringBuffer.copy(frame, 0, this.readPos, this.readPos + this.frameSize);
212
- }
213
-
214
- this.readPos = (this.readPos + this.frameSize) % this.ringBuffer.length;
215
- this.bytesInBuffer -= this.frameSize;
216
-
217
- // Frame emittieren
218
- this.emit('frame', {
219
- data: frame,
220
- timestamp: Date.now(),
221
- // Neu: Callback zum Zurückgeben des Buffers
222
- release: () => this.releaseFrameBuffer(frame),
223
- });
224
- }
225
-
226
- callback();
227
- } catch (error) {
228
- callback(error as Error);
229
- }
230
- }
231
-
232
- public _flush(callback: TransformCallback): void {
233
- this.bytesInBuffer = 0;
234
- this.readPos = 0;
235
- this.writePos = 0;
236
-
237
- // Neu: Buffer Pool leeren
238
- this.frameBufferPool.length = 0;
239
- this.initializeBufferPool();
240
-
241
- callback();
242
- }
243
-
244
- private parseFrameInfo(data: Buffer): FrameMetadata | undefined {
245
- const stderr = data.toString();
246
- if (!stderr) {
247
- return;
248
- }
249
-
250
- const patterns: Record<string, RegExp> = {
251
- s: /s:\s*(\d+x\d+)/,
252
- };
253
-
254
- const matches = Object.entries(patterns).reduce(
255
- (acc, [key, pattern]) => {
256
- const match = stderr.match(pattern);
257
- if (match) {
258
- acc[key] = match[1];
259
- }
260
- return acc;
261
- },
262
- {} as Record<string, string>,
263
- );
264
-
265
- if (!matches.s) {
266
- return;
267
- }
268
-
269
- const [width, height] = matches.s.split('x').map((v) => parseInt(v, 10));
270
- const [cameraWidth, cameraHeight] = this.config.resolution.split('x').map((v) => parseInt(v, 10));
271
- const format: DecoderFormat = PIX_FMT === 'yuv420p' ? 'yuv' : 'rgb';
272
- const bytesPerPixel = format === 'yuv' ? 1.5 : 3; // YUV420P or RGB24
273
- const frameSize = cameraWidth * cameraHeight * bytesPerPixel;
274
-
275
- const metadata: FrameMetadata = {
276
- format,
277
- frameSize,
278
- width: cameraWidth,
279
- height: cameraHeight,
280
- origHeight: height,
281
- origWidth: width,
282
- };
283
-
284
- this.emit('metadata', metadata);
285
- }
286
-
287
- // Neue Methode: Initialisierung des Buffer Pools
288
- private initializeBufferPool(): void {
289
- for (let i = 0; i < this.poolSize; i++) {
290
- this.frameBufferPool.push(Buffer.allocUnsafe(this.frameSize));
291
- }
292
- }
293
-
294
- // Neue Methode: Buffer aus dem Pool holen
295
- private getFrameBuffer(): Buffer {
296
- const buffer = this.frameBufferPool.pop();
297
- if (buffer) {
298
- return buffer;
299
- }
300
- // Falls Pool leer, neuen Buffer erstellen
301
- return Buffer.allocUnsafe(this.frameSize);
302
- }
303
-
304
- // Neue Methode: Buffer in den Pool zurückgeben
305
- private releaseFrameBuffer(buffer: Buffer): void {
306
- if (this.frameBufferPool.length < this.poolSize) {
307
- this.frameBufferPool.push(buffer);
308
- }
309
- }
310
-
311
- private buildFfmpegArgs(): string[] {
312
- const filters: string[] = ['showinfo=checksum=0'];
313
- const [width, height] = this.config.resolution.split('x');
314
-
315
- this.ffmpegArgs.hwaccelFilters = this.ffmpegArgs.hwaccelFilters.map((filter) => {
316
- if (filter.includes('scale')) {
317
- filter = filter.replace('640', width).replace('360', height);
318
- }
319
- return filter;
320
- });
321
-
322
- filters.push(...this.ffmpegArgs.hwaccelFilters);
323
-
324
- if (this.config.fps > 0) {
325
- filters.push(`fps=fps=${this.config.fps}`);
326
- }
327
-
328
- return [
329
- '-hide_banner',
330
- '-err_detect',
331
- 'ignore_err',
332
- ...this.ffmpegArgs.hwaccelArgs,
333
- '-fflags',
334
- '+discardcorrupt+flush_packets+nobuffer',
335
- '-flags',
336
- 'low_delay',
337
- '-probesize',
338
- '500000',
339
- '-analyzeduration',
340
- '0',
341
- '-user_agent',
342
- 'camera.ui/decoder',
343
- '-avioflags',
344
- 'direct',
345
- '-rtsp_transport',
346
- 'tcp',
347
- '-i',
348
- CAMERA_SOURCE,
349
- '-vf',
350
- filters.join(','),
351
- '-f',
352
- 'rawvideo',
353
- '-pix_fmt',
354
- PIX_FMT,
355
- '-an',
356
- '-dn',
357
- '-sn',
358
- '-',
359
- ];
360
- }
361
-
362
- private getBytesPerPixel(): number {
363
- switch (PIX_FMT) {
364
- case 'yuv420p':
365
- case 'nv12':
366
- return 1.5;
367
- case 'rgb24':
368
- return 3;
369
- }
370
- }
371
- }
@@ -1,182 +0,0 @@
1
- import { dirname, resolve } from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
-
4
- import { FrameWorkerChild } from './child.js';
5
-
6
- import { Logger } from '@camera.ui/common';
7
- import { ImageUtils } from '../../../polyglot/node/decoder/imageUtils.js';
8
- import type { FFmpegStreamConfig } from './ffmpeg.js';
9
-
10
- const __filename = fileURLToPath(import.meta.url);
11
- const __dirname = dirname(__filename);
12
-
13
- const config: FFmpegStreamConfig = {
14
- auth: {
15
- user: '',
16
- password: '',
17
- },
18
- cameraId: '1',
19
- cameraName: 'Test Camera',
20
- decoder: 'rust',
21
- ffmpegPath: resolve(__dirname, '../../../../../../../server/node_modules/@camera.ui/ffmpeg/binary/ffmpeg'),
22
- fps: 0,
23
- frameWorkerId: '1',
24
- proxyEndpoints: [],
25
- resolution: '640x360',
26
- };
27
-
28
- const logger = new Logger({
29
- debugEnabled: true,
30
- traceEnabled: true,
31
- disablePrefix: true,
32
- disableTimestamps: false,
33
- });
34
-
35
- const imageUtils = new ImageUtils(config.decoder, logger);
36
-
37
- class FPSMonitor {
38
- private frameTimestamps: number[] = [];
39
- private readonly windowSize: number;
40
- private lastLogTime = 0;
41
- private logInterval: number;
42
-
43
- constructor(windowSize = 30, logInterval = 1000) {
44
- this.windowSize = windowSize;
45
- this.logInterval = logInterval;
46
- }
47
-
48
- addFrame(generatorId: number) {
49
- const now = Date.now();
50
- this.frameTimestamps.push(now);
51
-
52
- while (this.frameTimestamps.length > this.windowSize) {
53
- this.frameTimestamps.shift();
54
- }
55
-
56
- if (now - this.lastLogTime >= this.logInterval) {
57
- this.logFPS(generatorId);
58
- this.lastLogTime = now;
59
- }
60
- }
61
-
62
- private logFPS(generatorId: number) {
63
- if (this.frameTimestamps.length >= 2) {
64
- const timeWindow = (this.frameTimestamps[this.frameTimestamps.length - 1] - this.frameTimestamps[0]) / 1000;
65
- const fps = (this.frameTimestamps.length - 1) / timeWindow;
66
- console.log(`Generator ${generatorId} - Average FPS: ${fps.toFixed(1)}`);
67
- }
68
- }
69
- }
70
-
71
- async function generator(id: number, worker: FrameWorkerChild) {
72
- let frameCount = 0;
73
- let lastTime = Date.now();
74
- let fpsCounter = 0;
75
-
76
- console.log(`Starting generator ${id}`);
77
-
78
- try {
79
- for await (const frame of worker.generateFrames()) {
80
- frameCount++;
81
- fpsCounter++;
82
-
83
- // Alle Sekunde FPS ausgeben
84
- const currentTime = Date.now();
85
- if (currentTime - lastTime >= 1000) {
86
- const fps = fpsCounter;
87
- console.log(`${id}) Current FPS: ${fps}`);
88
- fpsCounter = 0;
89
- lastTime = currentTime;
90
- }
91
-
92
- console.log(`${id}) Frame timestamp=${frame.timestamp}, length=${frame.data.length}, frame=${frameCount}`);
93
- }
94
- } catch (error) {
95
- console.error(`Generator ${id} error:`, error);
96
- }
97
- }
98
-
99
- async function generator2(id: number, worker: FrameWorkerChild) {
100
- let frameCount = 0;
101
- const frameTimestamps: number[] = [];
102
- const windowSize = 30; // Anzahl der Frames für den Durchschnitt
103
-
104
- console.log(`Starting generator ${id}`);
105
-
106
- try {
107
- for await (const frame of worker.generateFrames({
108
- crop: { left: 0, top: 0, width: 300, height: 300 },
109
- resize: { width: 100, height: 100 },
110
- format: { to: 'gray' },
111
- })) {
112
- frameCount++;
113
- const now = Date.now();
114
-
115
- // Füge aktuellen Timestamp hinzu
116
- frameTimestamps.push(now);
117
-
118
- // Entferne alte Timestamps außerhalb des Fensters
119
- while (frameTimestamps.length > windowSize) {
120
- frameTimestamps.shift();
121
- }
122
-
123
- // Berechne FPS über das Zeitfenster
124
- if (frameTimestamps.length >= 2) {
125
- const timeWindow = (frameTimestamps[frameTimestamps.length - 1] - frameTimestamps[0]) / 1000;
126
- const fps = (frameTimestamps.length - 1) / timeWindow;
127
-
128
- // Nur jede Sekunde ausgeben
129
- if (frameCount % 10 === 0) {
130
- console.log(`${id}) Average FPS: ${fps.toFixed(1)}, Current frame length: ${frame.data.length}`);
131
- }
132
- }
133
-
134
- console.log(`${id}) Frame timestamp=${frame.timestamp}, length=${frame.data.length}, frame=${frameCount}`);
135
- }
136
- } catch (error) {
137
- console.error(`Generator ${id} error:`, error);
138
- }
139
- }
140
-
141
- async function generator3(id: number, worker: FrameWorkerChild, fpsMonitor: FPSMonitor) {
142
- let frameCount = 0;
143
- console.log(`Starting generator ${id}`);
144
-
145
- try {
146
- for await (const frame of worker.generateFrames()) {
147
- frameCount++;
148
- fpsMonitor.addFrame(id);
149
- console.log(`${id}) Frame timestamp=${frame.timestamp}, length=${frame.data.length}, frame=${frameCount}`);
150
- }
151
- } catch (error) {
152
- console.error(`Generator ${id} error:`, error);
153
- }
154
- }
155
-
156
- async function test() {
157
- try {
158
- await imageUtils.initiate();
159
-
160
- const worker = new FrameWorkerChild(config, imageUtils);
161
-
162
- // Start beide Generatoren parallel
163
- // await Promise.all([generator(1, worker), generator(2, worker)]);
164
- // await generator2(1, worker);
165
- await generator3(1, worker, new FPSMonitor());
166
- } catch (error) {
167
- logger.error('Error:', error);
168
- }
169
- }
170
-
171
- // Process Event Handler für sauberes Beenden
172
- process.on('SIGINT', () => {
173
- console.log('Received SIGINT. Cleaning up...');
174
- process.exit(0);
175
- });
176
-
177
- process.on('SIGTERM', () => {
178
- console.log('Received SIGTERM. Cleaning up...');
179
- process.exit(0);
180
- });
181
-
182
- test().catch(logger.error);
@@ -1,27 +0,0 @@
1
- import type { AuthConfig } from '@camera.ui/rpc-common';
2
- import type { CameraFrameWorkerDecoder, CameraFrameWorkerResolution, DecoderFormat, FrameBuffer, FrameData, ImageOptions } from '@camera.ui/types';
3
-
4
- export type PixelFormat = 'yuv420p' | 'rgb24' | 'nv12';
5
-
6
- export interface BaseFrameWorkerConfig {
7
- cameraId: string;
8
- cameraName: string;
9
- cameraSource: string;
10
- ffmpegPath: string;
11
- auth: AuthConfig;
12
- proxyEndpoints: string[];
13
- fps: number;
14
- resolution: CameraFrameWorkerResolution;
15
- decoder: CameraFrameWorkerDecoder;
16
- }
17
-
18
- export interface WorkerToMainMessage {
19
- message: 'started';
20
- data: Record<string, any>;
21
- }
22
-
23
- export interface FrameWorkerInterface {
24
- generateFrames(options?: ImageOptions): AsyncGenerator<FrameData>;
25
- processFrame(frame: Buffer | Uint8Array, width: number, height: number, format: DecoderFormat | 'rgba' | 'gray', options: ImageOptions): Promise<FrameBuffer>;
26
- getPrebufferedFrame(timestamp: number, options?: ImageOptions, maxDifference?: number): Promise<FrameData | undefined>;
27
- }