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

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 (390) hide show
  1. package/dist/interface/index.html +44 -44
  2. package/dist/interface/js/{@primevue.OhxoO3MD.0.0.50-internal.0.js → @primevue.BAIU_p3r.0.0.50-internal.2.js} +1 -1
  3. package/dist/interface/js/{@tanstack.D1IL6eOv.0.0.50-internal.0.js → @tanstack.mdCorqzE.0.0.50-internal.2.js} +1 -1
  4. package/dist/interface/js/{@vee-validate.BGPyWWTh.0.0.50-internal.0.js → @vee-validate.D0vsSsly.0.0.50-internal.2.js} +1 -1
  5. package/dist/interface/js/{@vueuse.BsKtqdiG.0.0.50-internal.0.js → @vueuse.we5ZpWr2.0.0.50-internal.2.js} +1 -1
  6. package/dist/interface/js/{Adminpanel.D93Kvbwp.0.0.50-internal.0.js → Adminpanel.9AEBJ3H1.0.0.50-internal.2.js} +1 -1
  7. package/dist/interface/js/{Camera.DF2l3OMA.0.0.50-internal.0.js → Camera.CZcnEH0C.0.0.50-internal.2.js} +1 -1
  8. package/dist/interface/js/{Cameras.YzvZccdv.0.0.50-internal.0.js → Cameras.DE0LkcGu.0.0.50-internal.2.js} +2 -2
  9. package/dist/interface/js/Cammesh.CVvmkelB.0.0.50-internal.2.js +1 -0
  10. package/dist/interface/js/{Camview.CB7_HnoQ.0.0.50-internal.0.js → Camview.CUr4pGoU.0.0.50-internal.2.js} +1 -1
  11. package/dist/interface/js/{Config.BwflsWTm.0.0.50-internal.0.js → Config.CaJhu4fF.0.0.50-internal.2.js} +2 -2
  12. package/dist/interface/js/{Console.DZM8pN8Q.0.0.50-internal.0.js → Console.5VUmgryj.0.0.50-internal.2.js} +1 -1
  13. package/dist/interface/js/{CuiConsole.BXXU7Gth.0.0.50-internal.0.js → CuiConsole.iYmUxAR5.0.0.50-internal.2.js} +1 -1
  14. package/dist/interface/js/{CuiPluginCard.YFOrpbVD.0.0.50-internal.0.js → CuiPluginCard.DXPyE5mF.0.0.50-internal.2.js} +1 -1
  15. package/dist/interface/js/{CuiTimeline.VV5KSJd5.0.0.50-internal.0.js → CuiTimeline.BqtlOFnV.0.0.50-internal.2.js} +1 -1
  16. package/dist/interface/js/{FirstSteps.b-nvymgb.0.0.50-internal.0.js → FirstSteps.C_RI-SDQ.0.0.50-internal.2.js} +1 -1
  17. package/dist/interface/js/{Plugin.BOMpVEwM.0.0.50-internal.0.js → Plugin.Ch_v02eN.0.0.50-internal.2.js} +1 -1
  18. package/dist/interface/js/{Plugins.DdPwaUDA.0.0.50-internal.0.js → Plugins.BpXAYgSG.0.0.50-internal.2.js} +1 -1
  19. package/dist/interface/js/Recordings.CIKHJytH.0.0.50-internal.2.js +1 -0
  20. package/dist/interface/js/{Settings.D24ttaPu.0.0.50-internal.0.js → Settings.BcLoGNEy.0.0.50-internal.2.js} +1 -1
  21. package/dist/interface/js/{SettingsAccount.ms3aqz4E.0.0.50-internal.0.js → SettingsAccount.DMROW8kx.0.0.50-internal.2.js} +1 -1
  22. package/dist/interface/js/SettingsAppearance.CUaHpihp.0.0.50-internal.2.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.BuKZ-Uco.0.0.50-internal.2.js} +1 -1
  24. package/dist/interface/js/{SettingsBackup.BPEc4Rjg.0.0.50-internal.0.js → SettingsBackup.0QdwFSpv.0.0.50-internal.2.js} +1 -1
  25. package/dist/interface/js/SettingsRecordings.B-aj0U8_.0.0.50-internal.2.js +1 -0
  26. package/dist/interface/js/{SettingsRemote.BL5nXbUT.0.0.50-internal.0.js → SettingsRemote.Bi1YAJ76.0.0.50-internal.2.js} +1 -1
  27. package/dist/interface/js/{SettingsSystem.D7T0AIpm.0.0.50-internal.0.js → SettingsSystem.CAx66Iir.0.0.50-internal.2.js} +1 -1
  28. package/dist/interface/js/{SettingsUsers.1u0vCOVG.0.0.50-internal.0.js → SettingsUsers.CQcDtGy1.0.0.50-internal.2.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.BhXMzIhV.0.0.50-internal.2.js} +1 -1
  30. package/dist/interface/js/{ace-builds.D1nmvCwb.0.0.50-internal.0.js → ace-builds.C0sCXSu5.0.0.50-internal.2.js} +2 -2
  31. package/dist/interface/js/{ace.config.G96T2z54.0.0.50-internal.0.js → ace.config.DNqPWa0Q.0.0.50-internal.2.js} +1 -1
  32. package/dist/interface/js/{backup.B_Gzxtp_.0.0.50-internal.0.js → backup.DAXgG3bP.0.0.50-internal.2.js} +1 -1
  33. package/dist/interface/js/{chart.js.CP_nMnnf.0.0.50-internal.0.js → chart.js.Bq3YocRX.0.0.50-internal.2.js} +1 -1
  34. package/dist/interface/js/{close-circle.DYLuVIOg.0.0.50-internal.0.js → close-circle.9rxyNw0z.0.0.50-internal.2.js} +1 -1
  35. package/dist/interface/js/{dnd-core.T9OeW7mu.0.0.50-internal.0.js → dnd-core.BuEvHAsS.0.0.50-internal.2.js} +1 -1
  36. package/dist/interface/js/{draggabilly.D3zGcBb3.0.0.50-internal.0.js → draggabilly.DUdE08x8.0.0.50-internal.2.js} +1 -1
  37. package/dist/interface/js/{engine.io-client.kITRnq-g.0.0.50-internal.0.js → engine.io-client.DWU6YI8o.0.0.50-internal.2.js} +1 -1
  38. package/dist/interface/js/{fast-deep-equal.Bpc9mIsj.0.0.50-internal.0.js → fast-deep-equal.BpPyC6E4.0.0.50-internal.2.js} +1 -1
  39. package/dist/interface/js/{highlight.js.BlSXU-Wb.0.0.50-internal.0.js → highlight.js.BoR2Rhdd.0.0.50-internal.2.js} +1 -1
  40. package/dist/interface/js/{linkify-it.C3N1lWsJ.0.0.50-internal.0.js → linkify-it.BXzPONHs.0.0.50-internal.2.js} +1 -1
  41. package/dist/interface/js/{main.D0YR3Jat.0.0.50-internal.0.js → main.DwcBYfWc.0.0.50-internal.2.js} +3 -3
  42. package/dist/interface/js/{markdown-it.Dj0dt5s2.0.0.50-internal.0.js → markdown-it.BUDVOjPt.0.0.50-internal.2.js} +1 -1
  43. package/dist/interface/js/{nprogress.BwQWDcGj.0.0.50-internal.0.js → nprogress.CsG-OBoI.0.0.50-internal.2.js} +1 -1
  44. package/dist/interface/js/{pinia.DRh7plEC.0.0.50-internal.0.js → pinia.CqEQao5R.0.0.50-internal.2.js} +1 -1
  45. package/dist/interface/js/{primevue.Cl58krXf.0.0.50-internal.0.js → primevue.D91sslRx.0.0.50-internal.2.js} +1 -1
  46. package/dist/interface/js/{qrcode.C1sDj6P8.0.0.50-internal.0.js → qrcode.SdSTPzZO.0.0.50-internal.2.js} +1 -1
  47. package/dist/interface/js/{react-dnd-touch-backend.BA4WhUJo.0.0.50-internal.0.js → react-dnd-touch-backend.BwroebQ4.0.0.50-internal.2.js} +1 -1
  48. package/dist/interface/js/{refresh-rounded.D_SmhhUf.0.0.50-internal.0.js → refresh-rounded.DxM48YSv.0.0.50-internal.2.js} +1 -1
  49. package/dist/interface/js/{rxjs.C-fTBwEO.0.0.50-internal.0.js → rxjs.Cmpbnzo4.0.0.50-internal.2.js} +1 -1
  50. package/dist/interface/js/{socket.io-client.DKrRxgjP.0.0.50-internal.0.js → socket.io-client.DF2YgZo1.0.0.50-internal.2.js} +1 -1
  51. package/dist/interface/js/{socket.io-parser.EXj3YDH2.0.0.50-internal.0.js → socket.io-parser.BUs2ineY.0.0.50-internal.2.js} +1 -1
  52. package/dist/interface/js/{system.CY8rGd-Q.0.0.50-internal.0.js → system.DmkT2LKx.0.0.50-internal.2.js} +1 -1
  53. package/dist/interface/js/{trash-fill.CMnCN3Oy.0.0.50-internal.0.js → trash-fill.dPzyZDVa.0.0.50-internal.2.js} +1 -1
  54. package/dist/interface/js/{unidragger.D0w6Tqtt.0.0.50-internal.0.js → unidragger.y2ZlFveS.0.0.50-internal.2.js} +1 -1
  55. package/dist/interface/js/{vee-validate.BeiObIH8.0.0.50-internal.0.js → vee-validate.Y-alCADW.0.0.50-internal.2.js} +1 -1
  56. package/dist/interface/js/{vue-chartjs.DtdZdiYw.0.0.50-internal.0.js → vue-chartjs.sRVFTqDf.0.0.50-internal.2.js} +1 -1
  57. package/dist/interface/js/{vue-i18n.BW2bx_6z.0.0.50-internal.0.js → vue-i18n.D5WrXOZa.0.0.50-internal.2.js} +1 -1
  58. package/dist/interface/js/{vue-inline-svg.BJkQGmKz.0.0.50-internal.0.js → vue-inline-svg.R0uz_abA.0.0.50-internal.2.js} +1 -1
  59. package/dist/interface/js/{vue-router.B2mOXHaC.0.0.50-internal.0.js → vue-router.65mnGy-o.0.0.50-internal.2.js} +1 -1
  60. package/dist/interface/js/{vue-zoomable.BKDyCJE7.0.0.50-internal.0.js → vue-zoomable.B1Qop6Uu.0.0.50-internal.2.js} +1 -1
  61. package/dist/interface/js/{vue3-dnd.DRK24CBp.0.0.50-internal.0.js → vue3-dnd.CwmyAcir.0.0.50-internal.2.js} +1 -1
  62. package/dist/interface/js/{zoom-out.DxvzgVEo.0.0.50-internal.0.js → zoom-out.CMPALvRh.0.0.50-internal.2.js} +1 -1
  63. package/dist/interface/sw.js +1 -1
  64. package/dist/server/package.json +1 -1
  65. package/dist/server/src/rpc/server.js +4 -1
  66. package/dist/server/src/rpc/server.js.map +1 -1
  67. package/package.json +1 -1
  68. package/.prettierignore +0 -12
  69. package/.prettierrc.json +0 -12
  70. package/artillery.yaml +0 -29
  71. package/bin/cameraui-server.ts +0 -11
  72. package/dist/interface/js/Cammesh.D-6dAROQ.0.0.50-internal.0.js +0 -1
  73. package/dist/interface/js/Recordings.DhxjIW7e.0.0.50-internal.0.js +0 -1
  74. package/dist/interface/js/SettingsAppearance.DsTjKXk1.0.0.50-internal.0.js +0 -1
  75. package/dist/interface/js/SettingsRecordings.DgW7M0jj.0.0.50-internal.0.js +0 -1
  76. package/eslint.config.js +0 -103
  77. package/localdeps.txt +0 -10
  78. package/mypy.ini +0 -30
  79. package/requirements.txt +0 -15
  80. package/ruff.toml +0 -90
  81. package/src/__init__.py +0 -0
  82. package/src/_camera_ui_tools/__init__.py +0 -0
  83. package/src/_camera_ui_tools/__pycache__/__init__.cpython-311.pyc +0 -0
  84. package/src/api/controllers/api.controller.ts +0 -19
  85. package/src/api/controllers/auth.controller.ts +0 -294
  86. package/src/api/controllers/backup.controller.ts +0 -72
  87. package/src/api/controllers/cameras.controller.ts +0 -1029
  88. package/src/api/controllers/config.controller.ts +0 -102
  89. package/src/api/controllers/files.controller.ts +0 -35
  90. package/src/api/controllers/frameWorkers.controller.ts +0 -109
  91. package/src/api/controllers/plugins.controller.ts +0 -1206
  92. package/src/api/controllers/system.controller.ts +0 -273
  93. package/src/api/controllers/users.controller.ts +0 -648
  94. package/src/api/database/checks.ts +0 -268
  95. package/src/api/database/constants.ts +0 -8
  96. package/src/api/database/index.ts +0 -262
  97. package/src/api/database/migration.ts +0 -62
  98. package/src/api/database/selfcheck.ts +0 -492
  99. package/src/api/database/types.ts +0 -104
  100. package/src/api/go2rtc/api/application.ts +0 -48
  101. package/src/api/go2rtc/api/config.ts +0 -61
  102. package/src/api/go2rtc/api/discover.ts +0 -197
  103. package/src/api/go2rtc/api/index.ts +0 -49
  104. package/src/api/go2rtc/api/snapshot.ts +0 -44
  105. package/src/api/go2rtc/api/streams.ts +0 -168
  106. package/src/api/go2rtc/index.ts +0 -43
  107. package/src/api/go2rtc/queue.ts +0 -50
  108. package/src/api/go2rtc/types.ts +0 -174
  109. package/src/api/index.ts +0 -286
  110. package/src/api/middlewares/authPermission.middleware.ts +0 -46
  111. package/src/api/middlewares/authValidation.middleware.ts +0 -160
  112. package/src/api/middlewares/pagination.middleware.ts +0 -67
  113. package/src/api/middlewares/socketAuth.middleware.ts +0 -136
  114. package/src/api/plugins/header.plugin.ts +0 -15
  115. package/src/api/plugins/logger.plugin.ts +0 -44
  116. package/src/api/plugins/proxy.plugin.ts +0 -255
  117. package/src/api/plugins/socket.plugin.ts +0 -28
  118. package/src/api/plugins/system.plugin.ts +0 -48
  119. package/src/api/plugins/useragent.plugin.ts +0 -19
  120. package/src/api/routes/api.routes.ts +0 -10
  121. package/src/api/routes/auth.routes.ts +0 -56
  122. package/src/api/routes/backup.routes.ts +0 -28
  123. package/src/api/routes/cameras.routes.ts +0 -281
  124. package/src/api/routes/config.routes.ts +0 -66
  125. package/src/api/routes/files.routes.ts +0 -15
  126. package/src/api/routes/frameWorkers.routes.ts +0 -39
  127. package/src/api/routes/index.ts +0 -37
  128. package/src/api/routes/plugins.routes.ts +0 -420
  129. package/src/api/routes/system.routes.ts +0 -101
  130. package/src/api/routes/users.routes.ts +0 -167
  131. package/src/api/schemas/backup.schema.ts +0 -112
  132. package/src/api/schemas/cameras.schema.ts +0 -479
  133. package/src/api/schemas/config.schema.ts +0 -38
  134. package/src/api/schemas/go2rtc.schema.ts +0 -189
  135. package/src/api/schemas/plugins.schema.ts +0 -126
  136. package/src/api/schemas/storage.schema.ts +0 -11
  137. package/src/api/schemas/system.schema.ts +0 -45
  138. package/src/api/schemas/users.schema.ts +0 -185
  139. package/src/api/services/auth.service.ts +0 -210
  140. package/src/api/services/backup.service.ts +0 -144
  141. package/src/api/services/cameras.service.ts +0 -671
  142. package/src/api/services/plugins.service.ts +0 -470
  143. package/src/api/services/system.service.ts +0 -85
  144. package/src/api/services/users.service.ts +0 -276
  145. package/src/api/types/index.ts +0 -675
  146. package/src/api/utils/cert.ts +0 -254
  147. package/src/api/utils/constants.ts +0 -17
  148. package/src/api/utils/fetch.ts +0 -21
  149. package/src/api/utils/moveFiles.ts +0 -45
  150. package/src/api/utils/parse.ts +0 -17
  151. package/src/api/websocket/index.ts +0 -110
  152. package/src/api/websocket/nsp/logs.ts +0 -240
  153. package/src/api/websocket/nsp/main.ts +0 -27
  154. package/src/api/websocket/nsp/metrics.ts +0 -301
  155. package/src/api/websocket/nsp/notifications.ts +0 -43
  156. package/src/api/websocket/nsp/plugins.ts +0 -37
  157. package/src/api/websocket/nsp/server.ts +0 -220
  158. package/src/api/websocket/nsp/status.ts +0 -77
  159. package/src/api/websocket/types.ts +0 -55
  160. package/src/api.ts +0 -163
  161. package/src/camera/classes.ts +0 -32
  162. package/src/camera/controller.ts +0 -579
  163. package/src/camera/device.ts +0 -422
  164. package/src/camera/frameWorker.ts +0 -403
  165. package/src/camera/index.ts +0 -679
  166. package/src/camera/interfaces.ts +0 -95
  167. package/src/camera/iou.ts +0 -153
  168. package/src/camera/polygon.ts +0 -226
  169. package/src/camera/python/__init__.py +0 -0
  170. package/src/camera/python/__pycache__/__init__.cpython-311.pyc +0 -0
  171. package/src/camera/python/__pycache__/classes.cpython-311.pyc +0 -0
  172. package/src/camera/python/__pycache__/delegate_controller.cpython-311.pyc +0 -0
  173. package/src/camera/python/__pycache__/interfaces.cpython-311.pyc +0 -0
  174. package/src/camera/python/__pycache__/iou.cpython-310.pyc +0 -0
  175. package/src/camera/python/__pycache__/iou.cpython-311.pyc +0 -0
  176. package/src/camera/python/__pycache__/iou2.cpython-310.pyc +0 -0
  177. package/src/camera/python/__pycache__/polygon.cpython-311.pyc +0 -0
  178. package/src/camera/python/__pycache__/typings.cpython-311.pyc +0 -0
  179. package/src/camera/python/__pycache__/video_frame.cpython-311.pyc +0 -0
  180. package/src/camera/python/classes.py +0 -41
  181. package/src/camera/python/interfaces.py +0 -130
  182. package/src/camera/python/iou.py +0 -158
  183. package/src/camera/python/polygon.py +0 -230
  184. package/src/camera/python/test/__pycache__/polygon.cpython-310.pyc +0 -0
  185. package/src/camera/python/test/iou_test.py +0 -799
  186. package/src/camera/python/test/polygon.py +0 -238
  187. package/src/camera/python/test/polygon_test.py +0 -256
  188. package/src/camera/python/test/polygon_test2.py +0 -484
  189. package/src/camera/python/typings.py +0 -50
  190. package/src/camera/python/video_frame.py +0 -143
  191. package/src/camera/session.ts +0 -192
  192. package/src/camera/streaming/fmp4-session.ts +0 -390
  193. package/src/camera/streaming/peer-connection.ts +0 -273
  194. package/src/camera/streaming/rtsp-session.ts +0 -331
  195. package/src/camera/streaming/webrtc-connection.ts +0 -260
  196. package/src/camera/streaming/werift-session.ts +0 -317
  197. package/src/camera/test/iou_test.ts +0 -761
  198. package/src/camera/test/polygon.test.ts +0 -611
  199. package/src/camera/test/polygon_test.ts +0 -210
  200. package/src/camera/types.ts +0 -48
  201. package/src/camera/utils.ts +0 -489
  202. package/src/camera/videoFrame.ts +0 -123
  203. package/src/cloud/index.ts +0 -61
  204. package/src/cloud/remote/cloudflare.ts +0 -18
  205. package/src/cloud/remote/upnp.ts +0 -18
  206. package/src/cloud/remote/utils.ts +0 -24
  207. package/src/cloud/types.ts +0 -16
  208. package/src/decoder/child.ts +0 -883
  209. package/src/decoder/imageUtils.ts +0 -275
  210. package/src/decoder/manager.ts +0 -251
  211. package/src/decoder/python/__init__.py +0 -0
  212. package/src/decoder/python/__pycache__/__init__.cpython-311.pyc +0 -0
  213. package/src/decoder/python/__pycache__/image_utils.cpython-311.pyc +0 -0
  214. package/src/decoder/python/__pycache__/typings.cpython-311.pyc +0 -0
  215. package/src/decoder/python/__pycache__/utils.cpython-311.pyc +0 -0
  216. package/src/decoder/python/child.py +0 -903
  217. package/src/decoder/python/image_utils.py +0 -196
  218. package/src/decoder/python/pool.py +0 -45
  219. package/src/decoder/python/test/group.py +0 -62
  220. package/src/decoder/python/test/motion.mp4 +0 -0
  221. package/src/decoder/python/test/motion2.mp4 +0 -0
  222. package/src/decoder/python/test/opencl.cl +0 -70
  223. package/src/decoder/python/test/opencl2.cl +0 -130
  224. package/src/decoder/python/test/test.py +0 -427
  225. package/src/decoder/python/test/test1.jpg +0 -0
  226. package/src/decoder/python/test/test1_resized.jpg +0 -0
  227. package/src/decoder/python/test/test2.jpg +0 -0
  228. package/src/decoder/python/test/test2.py +0 -451
  229. package/src/decoder/python/test/test2_resized.jpg +0 -0
  230. package/src/decoder/python/test/test3.jpg +0 -0
  231. package/src/decoder/python/test/utils.py +0 -50
  232. package/src/decoder/python/typings.py +0 -57
  233. package/src/decoder/python/utils.py +0 -70
  234. package/src/decoder/test/child.ts +0 -117
  235. package/src/decoder/test/ffmpeg.ts +0 -371
  236. package/src/decoder/test/test.ts +0 -182
  237. package/src/decoder/types.ts +0 -27
  238. package/src/decoder/utils.ts +0 -64
  239. package/src/decoder/wasm/asconfig.json +0 -28
  240. package/src/decoder/wasm/assembly/console.ts +0 -1
  241. package/src/decoder/wasm/assembly/index.ts +0 -890
  242. package/src/decoder/wasm/build/decoder.d.ts +0 -43
  243. package/src/decoder/wasm/build/decoder.js +0 -108
  244. package/src/decoder/wasm/build/decoder.wasm +0 -0
  245. package/src/decoder/wasm/tsconfig.json +0 -5
  246. package/src/decoder/worker.ts +0 -113
  247. package/src/go2rtc/index.ts +0 -324
  248. package/src/go2rtc/types.ts +0 -88
  249. package/src/main.ts +0 -267
  250. package/src/manager/coreManager.ts +0 -78
  251. package/src/manager/deviceManager.ts +0 -132
  252. package/src/manager/types.ts +0 -17
  253. package/src/plugins/index.ts +0 -443
  254. package/src/plugins/plugin.ts +0 -177
  255. package/src/plugins/runtime/base.ts +0 -282
  256. package/src/plugins/runtime/index.ts +0 -15
  257. package/src/plugins/runtime/node/child.ts +0 -193
  258. package/src/plugins/runtime/node/index.ts +0 -67
  259. package/src/plugins/runtime/node/plugin.ts +0 -122
  260. package/src/plugins/runtime/node/pluginApi.ts +0 -27
  261. package/src/plugins/runtime/node/proxy/cameraDevice.ts +0 -299
  262. package/src/plugins/runtime/node/proxy/coreManager.ts +0 -128
  263. package/src/plugins/runtime/node/proxy/deviceManager.ts +0 -187
  264. package/src/plugins/runtime/node/storage.ts +0 -312
  265. package/src/plugins/runtime/node/storageController.ts +0 -91
  266. package/src/plugins/runtime/python/__init__.py +0 -0
  267. package/src/plugins/runtime/python/__pycache__/__init__.cpython-311.pyc +0 -0
  268. package/src/plugins/runtime/python/__pycache__/camera_storage.cpython-311.pyc +0 -0
  269. package/src/plugins/runtime/python/__pycache__/config_service.cpython-311.pyc +0 -0
  270. package/src/plugins/runtime/python/__pycache__/constants.cpython-311.pyc +0 -0
  271. package/src/plugins/runtime/python/__pycache__/ipc.cpython-311.pyc +0 -0
  272. package/src/plugins/runtime/python/__pycache__/logger.cpython-311.pyc +0 -0
  273. package/src/plugins/runtime/python/__pycache__/message_queue.cpython-311.pyc +0 -0
  274. package/src/plugins/runtime/python/__pycache__/namespaces.cpython-311.pyc +0 -0
  275. package/src/plugins/runtime/python/__pycache__/plugin.cpython-311.pyc +0 -0
  276. package/src/plugins/runtime/python/__pycache__/plugin_api.cpython-311.pyc +0 -0
  277. package/src/plugins/runtime/python/__pycache__/plugin_logger.cpython-311.pyc +0 -0
  278. package/src/plugins/runtime/python/__pycache__/proxy_utils.cpython-311.pyc +0 -0
  279. package/src/plugins/runtime/python/__pycache__/schema.cpython-311.pyc +0 -0
  280. package/src/plugins/runtime/python/__pycache__/storage.cpython-311.pyc +0 -0
  281. package/src/plugins/runtime/python/__pycache__/storage_controller.cpython-311.pyc +0 -0
  282. package/src/plugins/runtime/python/__pycache__/typings.cpython-311.pyc +0 -0
  283. package/src/plugins/runtime/python/child.py +0 -248
  284. package/src/plugins/runtime/python/index.ts +0 -73
  285. package/src/plugins/runtime/python/namespaces.py +0 -101
  286. package/src/plugins/runtime/python/plugin.py +0 -155
  287. package/src/plugins/runtime/python/plugin_api.py +0 -29
  288. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-310.pyc +0 -0
  289. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-311.pyc +0 -0
  290. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-38.pyc +0 -0
  291. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-39.pyc +0 -0
  292. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-311.pyc +0 -0
  293. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-39.pyc +0 -0
  294. package/src/plugins/runtime/python/proxy/__pycache__/core_manager.cpython-311.pyc +0 -0
  295. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-310.pyc +0 -0
  296. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-311.pyc +0 -0
  297. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-38.pyc +0 -0
  298. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-39.pyc +0 -0
  299. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-310.pyc +0 -0
  300. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-311.pyc +0 -0
  301. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-38.pyc +0 -0
  302. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-39.pyc +0 -0
  303. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-310.pyc +0 -0
  304. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-311.pyc +0 -0
  305. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-38.pyc +0 -0
  306. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-39.pyc +0 -0
  307. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-310.pyc +0 -0
  308. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-311.pyc +0 -0
  309. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-38.pyc +0 -0
  310. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-39.pyc +0 -0
  311. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-310.pyc +0 -0
  312. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-311.pyc +0 -0
  313. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-38.pyc +0 -0
  314. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-39.pyc +0 -0
  315. package/src/plugins/runtime/python/proxy/camera_device.py +0 -1732
  316. package/src/plugins/runtime/python/proxy/core_manager.py +0 -126
  317. package/src/plugins/runtime/python/proxy/device_manager.py +0 -197
  318. package/src/plugins/runtime/python/schema.py +0 -99
  319. package/src/plugins/runtime/python/storage.py +0 -353
  320. package/src/plugins/runtime/python/storage_controller.py +0 -102
  321. package/src/plugins/runtime/python/typings.py +0 -195
  322. package/src/plugins/schema.ts +0 -472
  323. package/src/plugins/types.ts +0 -60
  324. package/src/plugins/worker.ts +0 -250
  325. package/src/rpc/index.ts +0 -149
  326. package/src/rpc/namespaces.ts +0 -79
  327. package/src/rpc/server.ts +0 -422
  328. package/src/rpc/types.ts +0 -119
  329. package/src/rpc/utils.ts +0 -16
  330. package/src/services/config/constants.ts +0 -47
  331. package/src/services/config/defaults.ts +0 -57
  332. package/src/services/config/index.ts +0 -744
  333. package/src/services/config/types.ts +0 -211
  334. package/src/services/logger/index.ts +0 -96
  335. package/src/types.ts +0 -47
  336. package/src/utils/path.ts +0 -16
  337. package/src/utils/pythonInstaller.ts +0 -597
  338. package/tsconfig.json +0 -37
  339. package/types/fastify.d.ts +0 -14
  340. package/updates.config.js +0 -3
  341. /package/dist/interface/assets/{@xterm.DYP7pi_n.0.0.50-internal.0.css → @xterm.DYP7pi_n.0.0.50-internal.2.css} +0 -0
  342. /package/dist/interface/assets/{Adminpanel.BKek2EMH.0.0.50-internal.0.css → Adminpanel.BKek2EMH.0.0.50-internal.2.css} +0 -0
  343. /package/dist/interface/assets/{Cameras.BDWZJqPN.0.0.50-internal.0.css → Cameras.BDWZJqPN.0.0.50-internal.2.css} +0 -0
  344. /package/dist/interface/assets/{Camview.BFUFMoNX.0.0.50-internal.0.css → Camview.BFUFMoNX.0.0.50-internal.2.css} +0 -0
  345. /package/dist/interface/assets/{CuiConsole.DCYyxdVg.0.0.50-internal.0.css → CuiConsole.DCYyxdVg.0.0.50-internal.2.css} +0 -0
  346. /package/dist/interface/assets/{CuiPluginCard.yF8V0SZY.0.0.50-internal.0.css → CuiPluginCard.yF8V0SZY.0.0.50-internal.2.css} +0 -0
  347. /package/dist/interface/assets/{CuiTimeline.BkIwlYtw.0.0.50-internal.0.css → CuiTimeline.BkIwlYtw.0.0.50-internal.2.css} +0 -0
  348. /package/dist/interface/assets/{Plugin.DJElsAn5.0.0.50-internal.0.css → Plugin.DJElsAn5.0.0.50-internal.2.css} +0 -0
  349. /package/dist/interface/assets/{Plugins.0h77qnmN.0.0.50-internal.0.css → Plugins.0h77qnmN.0.0.50-internal.2.css} +0 -0
  350. /package/dist/interface/assets/{Settings.CkgfRkQr.0.0.50-internal.0.css → Settings.CkgfRkQr.0.0.50-internal.2.css} +0 -0
  351. /package/dist/interface/assets/{SettingsAccount.DeFul3eQ.0.0.50-internal.0.css → SettingsAccount.DeFul3eQ.0.0.50-internal.2.css} +0 -0
  352. /package/dist/interface/assets/{SettingsBackup.CX0rT0QJ.0.0.50-internal.0.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.2.css} +0 -0
  353. /package/dist/interface/assets/{highlight.Ch2EwETz.0.0.50-internal.0.css → highlight.Ch2EwETz.0.0.50-internal.2.css} +0 -0
  354. /package/dist/interface/assets/{logo-256.BCQk9H1-.0.0.50-internal.0.png → logo-256.BCQk9H1-.0.0.50-internal.2.png} +0 -0
  355. /package/dist/interface/assets/{logo-512.DLKVOU2S.0.0.50-internal.0.png → logo-512.DLKVOU2S.0.0.50-internal.2.png} +0 -0
  356. /package/dist/interface/assets/{logo.DmEiRk0z.0.0.50-internal.0.png → logo.DmEiRk0z.0.0.50-internal.2.png} +0 -0
  357. /package/dist/interface/assets/{main.Cip9LkS3.0.0.50-internal.0.css → main.Cip9LkS3.0.0.50-internal.2.css} +0 -0
  358. /package/dist/interface/assets/{mode-json.Br7xisR1.0.0.50-internal.0.js → mode-json.Br7xisR1.0.0.50-internal.2.js} +0 -0
  359. /package/dist/interface/assets/{mode-yaml.CIYL8U3d.0.0.50-internal.0.js → mode-yaml.CIYL8U3d.0.0.50-internal.2.js} +0 -0
  360. /package/dist/interface/assets/{worker-base.jEXLGV2h.0.0.50-internal.0.js → worker-base.jEXLGV2h.0.0.50-internal.2.js} +0 -0
  361. /package/dist/interface/assets/{worker-json.DgwNIOck.0.0.50-internal.0.js → worker-json.DgwNIOck.0.0.50-internal.2.js} +0 -0
  362. /package/dist/interface/assets/{worker-yaml.B3uUYINB.0.0.50-internal.0.js → worker-yaml.B3uUYINB.0.0.50-internal.2.js} +0 -0
  363. /package/dist/interface/js/{@babel.l0sNRNKZ.0.0.50-internal.0.js → @babel.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  364. /package/dist/interface/js/{@intlify.BkGPX90O.0.0.50-internal.0.js → @intlify.BkGPX90O.0.0.50-internal.2.js} +0 -0
  365. /package/dist/interface/js/{@kurkle.D8fDXNIl.0.0.50-internal.0.js → @kurkle.D8fDXNIl.0.0.50-internal.2.js} +0 -0
  366. /package/dist/interface/js/{@primeuix.BFAY2Bk9.0.0.50-internal.0.js → @primeuix.BFAY2Bk9.0.0.50-internal.2.js} +0 -0
  367. /package/dist/interface/js/{@react-dnd.CcwRs9xb.0.0.50-internal.0.js → @react-dnd.CcwRs9xb.0.0.50-internal.2.js} +0 -0
  368. /package/dist/interface/js/{@socket.io.Dkula2eQ.0.0.50-internal.0.js → @socket.io.Dkula2eQ.0.0.50-internal.2.js} +0 -0
  369. /package/dist/interface/js/{@vue.B5vqhCp2.0.0.50-internal.0.js → @vue.B5vqhCp2.0.0.50-internal.2.js} +0 -0
  370. /package/dist/interface/js/{@xterm.CAa7rpjv.0.0.50-internal.0.js → @xterm.C-5Lxnx_.0.0.50-internal.2.js} +0 -0
  371. /package/dist/interface/js/{axios.DHr9lByg.0.0.50-internal.0.js → axios.DHr9lByg.0.0.50-internal.2.js} +0 -0
  372. /package/dist/interface/js/{birpc.l0sNRNKZ.0.0.50-internal.0.js → birpc.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  373. /package/dist/interface/js/{compare-versions.DqEOhma6.0.0.50-internal.0.js → compare-versions.DqEOhma6.0.0.50-internal.2.js} +0 -0
  374. /package/dist/interface/js/{dijkstrajs.C00ieaqj.0.0.50-internal.0.js → dijkstrajs.C00ieaqj.0.0.50-internal.2.js} +0 -0
  375. /package/dist/interface/js/{engine.io-parser.BiEtp6m2.0.0.50-internal.0.js → engine.io-parser.BiEtp6m2.0.0.50-internal.2.js} +0 -0
  376. /package/dist/interface/js/{entities.C20TfXL6.0.0.50-internal.0.js → entities.C20TfXL6.0.0.50-internal.2.js} +0 -0
  377. /package/dist/interface/js/{ev-emitter.X5f1qa-c.0.0.50-internal.0.js → ev-emitter.X5f1qa-c.0.0.50-internal.2.js} +0 -0
  378. /package/dist/interface/js/{get-size.D1dS-IaP.0.0.50-internal.0.js → get-size.D1dS-IaP.0.0.50-internal.2.js} +0 -0
  379. /package/dist/interface/js/{hookable.l0sNRNKZ.0.0.50-internal.0.js → hookable.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  380. /package/dist/interface/js/{mdurl.k9Sl0PQj.0.0.50-internal.0.js → mdurl.k9Sl0PQj.0.0.50-internal.2.js} +0 -0
  381. /package/dist/interface/js/{perfect-debounce.l0sNRNKZ.0.0.50-internal.0.js → perfect-debounce.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  382. /package/dist/interface/js/{primelocale.Bga3dOQu.0.0.50-internal.0.js → primelocale.Bga3dOQu.0.0.50-internal.2.js} +0 -0
  383. /package/dist/interface/js/{punycode.js.Dj65hjkv.0.0.50-internal.0.js → punycode.js.Dj65hjkv.0.0.50-internal.2.js} +0 -0
  384. /package/dist/interface/js/{react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.0.js → react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.2.js} +0 -0
  385. /package/dist/interface/js/{redux.BFxtlG_c.0.0.50-internal.0.js → redux.BFxtlG_c.0.0.50-internal.2.js} +0 -0
  386. /package/dist/interface/js/{tslib.9k7AwCpt.0.0.50-internal.0.js → tslib.9k7AwCpt.0.0.50-internal.2.js} +0 -0
  387. /package/dist/interface/js/{uc.micro.kMc2yuuw.0.0.50-internal.0.js → uc.micro.kMc2yuuw.0.0.50-internal.2.js} +0 -0
  388. /package/dist/interface/js/{uuid.C6aID195.0.0.50-internal.0.js → uuid.C6aID195.0.0.50-internal.2.js} +0 -0
  389. /package/dist/interface/js/{vue.l0sNRNKZ.0.0.50-internal.0.js → vue.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  390. /package/dist/interface/js/{zod.SKKegNRO.0.0.50-internal.0.js → zod.SKKegNRO.0.0.50-internal.2.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
- }