seg-cam 0.4.7 → 0.4.9

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.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var K=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var he=Object.prototype.hasOwnProperty;var De=(e,n)=>{for(var u in n)K(e,u,{get:n[u],enumerable:!0})},be=(e,n,u,y)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of Ee(n))!he.call(e,s)&&s!==u&&K(e,s,{get:()=>n[s],enumerable:!(y=Te(n,s))||y.enumerable});return e};var ke=e=>be(K({},"__esModule",{value:!0}),e);var W=(e,n,u)=>new Promise((y,s)=>{var O=l=>{try{D(u.next(l))}catch(b){s(b)}},E=l=>{try{D(u.throw(l))}catch(b){s(b)}},D=l=>l.done?y(l.value):Promise.resolve(l.value).then(O,E);D((u=u.apply(e,n)).next())});var we={};De(we,{DEFAULT_CONFIG:()=>c,JerseyDetector:()=>ee,useJerseyWorker:()=>$});module.exports=ke(we);var t=require("react");var f=require("react");var m=null,v=!1,F=null,Q=0,Z=null,T=new Map,Ie=0,X=new Map;function $(e,n){let u=(0,f.useRef)(!1),[y,s]=(0,f.useState)(!1),[O,E]=(0,f.useState)(null),D=(0,f.useRef)(!0),l=(0,f.useRef)(!1),b=(0,f.useRef)(`instance_${Math.random().toString(36).substr(2,9)}`),A=(0,f.useRef)(0);(0,f.useEffect)(()=>{var w;if(!e)return;D.current=!0,A.current++;let R=A.current,M=b.current,N=(w=X.get(M))!=null?w:0;return R>N&&(Q++,X.set(M,R)),W(null,null,function*(){var d;if(!m||!Re(Z,e)){m&&(m.terminate(),m=null,v=!1);try{l.current=(d=e.verbose)!=null?d:l.current;let a=n||"/jersey-detector-worker.js";m=new Worker(a),Z=e,v=!1,F=null,s(!1),E(null),m.onmessage=g=>{let i=g.data;switch(i.type){case"ready":v=!0,s(!0);break;case"loading_progress":l.current&&console.log(`[v0 useJerseyWorker] Loaded ${i.progress}% of ${i.file}`);break;case"debug":l.current&&console.log(i.debug_message);break;case"error":let _=i.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",_),v=!1,F=_,s(!1),E(_);break;case"detect_response":if(i.requestId&&T.has(i.requestId)){let p=T.get(i.requestId);p&&(p.resolve(i),T.delete(i.requestId))}else if(T.size>0){let p=T.entries().next();if(!p.done){let[B,x]=p.value;x.resolve(i),T.delete(B)}}break}},m.onerror=g=>{let i=g.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",i),v=!1,F=i,s(!1),E(i)},m.postMessage({type:"init",config:e})}catch(a){let g=(a==null?void 0:a.message)||String(a);console.error("[useJerseyWorker] Failed to create worker:",g),s(!1),E(g)}}else s(v),E(F)}),()=>{D.current=!1;let d=b.current,a=X.get(d),g=A.current;a===g&&(Q--,X.delete(d),Q<=0&&m&&(m.terminate(),m=null,v=!1,F=null,Z=null,T.clear()))}},[]);let G=(0,f.useCallback)((R,M,N=.5)=>W(null,null,function*(){if(!m||!v)throw new Error("Worker not ready");if(u.current)return null;let k=`req_${++Ie}_${Date.now()}`;return new Promise((w,d)=>{T.set(k,{resolve:w,reject:d});try{u.current=!0,m.postMessage({type:"detect",requestId:k,dimensions:M,bitmap:R,threshold:N},[R])}catch(a){T.delete(k);let g=`Failed to send detect: ${a==null?void 0:a.message}`;d(new Error(g))}finally{u.current=!1}setTimeout(()=>{T.has(k)&&(T.delete(k),d(new Error("Detection timeout")))},1e4)})}),[y]);return{isReady:y,workerReady:y,lastError:O,detect:G}}function Re(e,n){return e?JSON.stringify(e)===JSON.stringify(n):!1}var c={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1};var ue=require("react/jsx-runtime"),ee=(0,t.forwardRef)(({videoRef:e,onWorkerReady:n,onWorkerError:u,onStatsUpdate:y,onSegmentedImage:s,task:O=c.TASK,model:E=c.MODEL,verbose:D=c.VERBOSE,bodyPixArchitecture:l=c.BODYPIX_ARCHITECTURE,bodyPixMultiplier:b=c.BODYPIX_MULTIPLIER,bodyPixQuantBytes:A=c.BODYPIX_QUANT_BYTES,bodyPixStride:G=c.BODYPIX_STRIDE,multiSegmentation:R=c.MULTI_SEGMENTATION,segmentBodyParts:M=c.SEGMENT_BODY_PARTS,backgroundShade:N=c.BACKGROUND_SHADE,shirtShade:k=c.SHIRT_SHADE,threshold:w=c.DETECTION_THRESHOLD,targetPartId:d=c.TARGET_PART_ID,imagesToReturn:a=c.IMAGES_TO_RETURN,workerUrl:g},i)=>{var te,ne;let _=(0,t.useRef)(null),p=(0,t.useRef)(null),B=(0,t.useRef)(!1),x=(0,t.useRef)([]),le=(0,t.useRef)(null),J=(0,t.useRef)(!1),Y=(0,t.useRef)(void 0);Y.current=u;let z=(0,t.useRef)({jerseyCount:0,confidence:0,fps:0,processingTime:0}),re=(0,t.useRef)(0),me=500,fe=(0,t.useMemo)(()=>({task:O,model:E,verbose:D,bodyPixArchitecture:l,bodyPixMultiplier:b,bodyPixQuantBytes:A,bodyPixStride:G,multiSegmentation:R,segmentBodyParts:M,backgroundShade:N,shirtShade:k,threshold:w,targetPartId:d,imagesToReturn:a}),[O,E,D,l,b,A,G,R,M,N,k,w,d,a]),de=(0,t.useMemo)(()=>{var r,o;return{width:((r=e.current)==null?void 0:r.videoWidth)||0,height:((o=e.current)==null?void 0:o.videoHeight)||0}},[(te=e.current)==null?void 0:te.videoWidth,(ne=e.current)==null?void 0:ne.videoHeight]),{isReady:H,workerReady:S,lastError:L,detect:ge}=$(fe,g);(0,t.useEffect)(()=>{n==null||n(S)},[S,n]),(0,t.useEffect)(()=>{var r;L&&(J.current=!0,(r=Y.current)==null||r.call(Y,L))},[L]);let ye=()=>W(null,null,function*(){var se,oe,ie;let r=e.current,o=_.current;if(J.current||!H||!S||!r||!o||B.current||r.readyState<2||r.paused||r.ended||r.videoWidth===0||r.videoHeight===0)return;let I=o.getContext("2d");if(!I||o.width<=0||o.height<=0)return;let C=null,P=null;try{B.current=!0;let U=r.videoWidth,j=r.videoHeight;le.current={width:U,height:j},C=yield createImageBitmap(r);let h=yield ge(C,de,w);if((h==null?void 0:h.type)==="detect_response"&&h.bitmap){P=h.bitmap,(o.width!==U||o.height!==j)&&(o.width=U,o.height=j),a==="mask"&&I.clearRect(0,0,U,j),P&&I.drawImage(P,0,0),x.current.push(Date.now()),x.current=x.current.filter(V=>Date.now()-V<1e3);let q={jerseyCount:((se=h.stats)==null?void 0:se.detectionCount)||0,confidence:((oe=h.stats)==null?void 0:oe.averageConfidence)||0,fps:x.current.length,processingTime:((ie=h.stats)==null?void 0:ie.processingTime)||0},ae=z.current;z.current=q;let ce=Date.now();if((ce-re.current>me||q.jerseyCount!==ae.jerseyCount||q.confidence!==ae.confidence)&&y&&(y(q),re.current=ce),h.segmentedImages){let V=h.segmentedImages;W(null,null,function*(){try{yield s==null?void 0:s(V)}finally{V.forEach(pe=>pe.close())}})}}}catch(U){J.current=!0}finally{C==null||C.close(),P==null||P.close(),B.current=!1}});return(0,t.useImperativeHandle)(i,()=>({get isReady(){return H},get lastError(){return L},get stats(){return z.current},capture:(r="image/jpeg",o=.92)=>{let I=_.current;if(!I)throw new Error("Canvas not ready for capture");return I.toDataURL(r,o)}}),[H,L,S]),(0,t.useEffect)(()=>{if(!S||!H||J.current)return;let r=e.current,o=_.current;if(!r||!o||r.videoWidth===0||r.videoHeight===0){let C=setTimeout(()=>{p.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(C)}(o.width!==r.videoWidth||o.height!==r.videoHeight)&&(o.width=r.videoWidth,o.height=r.videoHeight);let I=()=>W(null,null,function*(){!S||!H||J.current||(yield ye(),p.current=requestAnimationFrame(I))});return p.current=requestAnimationFrame(I),()=>{p.current&&cancelAnimationFrame(p.current)}},[S,H]),(0,ue.jsx)("canvas",{ref:_,className:"absolute inset-0 pointer-events-none",style:{zIndex:10,width:"100%",height:"100%"}})});ee.displayName="JerseyDetector";0&&(module.exports={DEFAULT_CONFIG,JerseyDetector,useJerseyWorker});
1
+ "use strict";var De=Object.create;var X=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var ve=(r,s)=>{for(var i in s)X(r,i,{get:s[i],enumerable:!0})},ce=(r,s,i,T)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of ke(s))!be.call(r,o)&&o!==i&&X(r,o,{get:()=>s[o],enumerable:!(T=Ie(s,o))||T.enumerable});return r};var Re=(r,s,i)=>(i=r!=null?De(we(r)):{},ce(s||!r||!r.__esModule?X(i,"default",{value:r,enumerable:!0}):i,r)),_e=r=>ce(X({},"__esModule",{value:!0}),r);var W=(r,s,i)=>new Promise((T,o)=>{var x=f=>{try{w(i.next(f))}catch(b){o(b)}},I=f=>{try{w(i.throw(f))}catch(b){o(b)}},w=f=>f.done?T(f.value):Promise.resolve(f.value).then(x,I);w((i=i.apply(r,s)).next())});var Se={};ve(Se,{DEFAULT_CONFIG:()=>l,JerseyDetector:()=>ee,useJerseyWorker:()=>z});module.exports=_e(Se);var n=require("react");var p=require("react");var g=null,C=!1,F=null,Q=0,Z=null,D=new Map,Me=0,$=new Map;function z(r,s){let i=(0,p.useRef)(!1),[T,o]=(0,p.useState)(!1),[x,I]=(0,p.useState)(null),w=(0,p.useRef)(!0),f=(0,p.useRef)(!1),b=(0,p.useRef)(`instance_${Math.random().toString(36).substr(2,9)}`),N=(0,p.useRef)(0);(0,p.useEffect)(()=>{var _;if(!r)return;w.current=!0,N.current++;let R=N.current,S=b.current,A=(_=$.get(S))!=null?_:0;return R>A&&(Q++,$.set(S,R)),W(null,null,function*(){var y;if(!g||!Ce(Z,r)){g&&(g.terminate(),g=null,C=!1);try{f.current=(y=r.verbose)!=null?y:f.current;let c=s||"/jersey-detector-worker.js";g=new Worker(c),Z=r,C=!1,F=null,o(!1),I(null),g.onmessage=h=>{let u=h.data;switch(u.type){case"ready":C=!0,o(!0);break;case"loading_progress":f.current&&console.log(`[v0 useJerseyWorker] Loaded ${u.progress}% of ${u.file}`);break;case"debug":f.current&&console.log(u.debug_message);break;case"error":let M=u.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",M),C=!1,F=M,o(!1),I(M);break;case"detect_response":if(u.requestId&&D.has(u.requestId)){let E=D.get(u.requestId);E&&(E.resolve(u),D.delete(u.requestId))}else if(D.size>0){let E=D.entries().next();if(!E.done){let[J,H]=E.value;H.resolve(u),D.delete(J)}}break}},g.onerror=h=>{let u=h.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",u),C=!1,F=u,o(!1),I(u)},g.postMessage({type:"init",config:r})}catch(c){let h=(c==null?void 0:c.message)||String(c);console.error("[useJerseyWorker] Failed to create worker:",h),o(!1),I(h)}}else o(C),I(F)}),()=>{w.current=!1;let y=b.current,c=$.get(y),h=N.current;c===h&&(Q--,$.delete(y),Q<=0&&g&&(g.terminate(),g=null,C=!1,F=null,Z=null,D.clear()))}},[]);let V=(0,p.useCallback)((R,S,A=.5)=>W(null,null,function*(){if(!g||!C)throw new Error("Worker not ready");if(i.current)return null;let v=`req_${++Me}_${Date.now()}`;return new Promise((_,y)=>{D.set(v,{resolve:_,reject:y});try{i.current=!0,g.postMessage({type:"detect",requestId:v,dimensions:S,bitmap:R,threshold:A},[R])}catch(c){D.delete(v);let h=`Failed to send detect: ${c==null?void 0:c.message}`;y(new Error(h))}finally{i.current=!1}setTimeout(()=>{D.has(v)&&(D.delete(v),y(new Error("Detection timeout")))},1e4)})}),[T]);return{isReady:T,workerReady:T,lastError:x,detect:V}}function Ce(r,s){return r?JSON.stringify(r)===JSON.stringify(s):!1}var l={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1};var ue=Re(require("p-limit"));var le=require("react/jsx-runtime"),ee=(0,n.forwardRef)(({videoRef:r,onWorkerReady:s,onWorkerError:i,onStatsUpdate:T,onSegmentedImage:o,task:x=l.TASK,model:I=l.MODEL,verbose:w=l.VERBOSE,bodyPixArchitecture:f=l.BODYPIX_ARCHITECTURE,bodyPixMultiplier:b=l.BODYPIX_MULTIPLIER,bodyPixQuantBytes:N=l.BODYPIX_QUANT_BYTES,bodyPixStride:V=l.BODYPIX_STRIDE,multiSegmentation:R=l.MULTI_SEGMENTATION,segmentBodyParts:S=l.SEGMENT_BODY_PARTS,backgroundShade:A=l.BACKGROUND_SHADE,shirtShade:v=l.SHIRT_SHADE,threshold:_=l.DETECTION_THRESHOLD,targetPartId:y=l.TARGET_PART_ID,imagesToReturn:c=l.IMAGES_TO_RETURN,workerUrl:h},u)=>{let M=(0,n.useRef)(null),E=(0,n.useRef)(null),J=(0,n.useRef)(!1),H=(0,n.useRef)([]),fe=(0,n.useRef)(null),L=(0,n.useRef)(!1),Y=(0,n.useRef)(void 0);Y.current=i;let K=(0,n.useRef)({jerseyCount:0,confidence:0,fps:0,processingTime:0}),re=(0,n.useRef)(0),de=500,te=5,ne=(0,n.useMemo)(()=>(0,ue.default)(te),[]),me=(0,n.useMemo)(()=>({task:x,model:I,verbose:w,bodyPixArchitecture:f,bodyPixMultiplier:b,bodyPixQuantBytes:N,bodyPixStride:V,multiSegmentation:R,segmentBodyParts:S,backgroundShade:A,shirtShade:v,threshold:_,targetPartId:y,imagesToReturn:c}),[x,I,w,f,b,N,V,R,S,A,v,_,y,c]),ge=()=>{var t,e;return{width:((t=r.current)==null?void 0:t.videoWidth)||0,height:((e=r.current)==null?void 0:e.videoHeight)||0}},{isReady:B,workerReady:O,lastError:U,detect:pe}=z(me,h);(0,n.useEffect)(()=>{s==null||s(O)},[O,s]),(0,n.useEffect)(()=>{var t;U&&(L.current=!0,(t=Y.current)==null||t.call(Y,U))},[U]);let ye=(0,n.useCallback)(t=>{if(ne.activeCount>=te){t.forEach(e=>{var a;return(a=e==null?void 0:e.close)==null?void 0:a.call(e)}),console.warn("[JerseyDetector] Dropped new segmented images \u2014 max 5 classifications running");return}ne(()=>W(null,null,function*(){try{yield o==null?void 0:o(t)}catch(e){console.error("[JerseyDetector] Classification error:",e)}finally{t.forEach(e=>{var a;return(a=e==null?void 0:e.close)==null?void 0:a.call(e)})}}))},[o]),he=()=>W(null,null,function*(){var P,se,oe;let t=r.current,e=M.current;if(L.current||!B||!O||!t||!e||J.current||t.readyState<2||t.paused||t.ended||t.videoWidth===0||t.videoHeight===0)return;let a=e.getContext("2d");if(!a||e.width<=0||e.height<=0)return;let m=null,d=null;try{J.current=!0;let G=t.videoWidth,j=t.videoHeight;fe.current={width:G,height:j},m=yield createImageBitmap(t);let Te=ge(),k=yield pe(m,Te,_);if((k==null?void 0:k.type)==="detect_response"){k.bitmap&&c!=="none"&&(d=k.bitmap,(e.width!==G||e.height!==j)&&(e.width=G,e.height=j),a.clearRect(0,0,G,j),c==="mask_with_image"&&a.drawImage(m,0,0),(c==="mask"||c==="mask_with_image")&&a.drawImage(d,0,0)),H.current.push(Date.now()),H.current=H.current.filter(Ee=>Date.now()-Ee<1e3);let q={jerseyCount:((P=k.stats)==null?void 0:P.detectionCount)||0,confidence:((se=k.stats)==null?void 0:se.averageConfidence)||0,fps:H.current.length,processingTime:((oe=k.stats)==null?void 0:oe.processingTime)||0},ae=K.current;K.current=q;let ie=Date.now();(ie-re.current>de||q.jerseyCount!==ae.jerseyCount||q.confidence!==ae.confidence)&&T&&(T(q),re.current=ie),k.segmentedImages&&o&&ye(k.segmentedImages)}}catch(G){L.current=!0}finally{m==null||m.close(),d==null||d.close(),J.current=!1}});return(0,n.useImperativeHandle)(u,()=>({get isReady(){return B},get lastError(){return U},get stats(){return K.current},capture:(t="image/jpeg",e=.92)=>{let a=r.current,m=M.current;if(!a||a.videoWidth<=0||a.videoHeight<=0)throw new Error("Video not ready for capture");let d=document.createElement("canvas");d.width=a.videoWidth,d.height=a.videoHeight;let P=d.getContext("2d");if(!P)throw new Error("Failed to get context for capture canvas");return P.drawImage(a,0,0,d.width,d.height),m&&m.width>0&&m.height>0?P.drawImage(m,0,0,d.width,d.height):console.warn("[capture] Mask canvas not available \u2014 returning raw video frame"),d.toDataURL(t,e)}}),[B,U,O]),(0,n.useEffect)(()=>{if(!O||!B||L.current)return;let t=r.current,e=M.current;if(!t||!e||t.videoWidth===0||t.videoHeight===0){let m=setTimeout(()=>{E.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(m)}(e.width!==t.videoWidth||e.height!==t.videoHeight)&&(e.width=t.videoWidth,e.height=t.videoHeight);let a=()=>W(null,null,function*(){!O||!B||L.current||(yield he(),E.current=requestAnimationFrame(a))});return E.current=requestAnimationFrame(a),()=>{E.current&&cancelAnimationFrame(E.current)}},[O,B]),(0,le.jsx)("canvas",{ref:M,className:"absolute inset-0 pointer-events-none",style:{zIndex:10,width:"100%",height:"100%"}})});ee.displayName="JerseyDetector";0&&(module.exports={DEFAULT_CONFIG,JerseyDetector,useJerseyWorker});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var C=(t,d,g)=>new Promise((k,a)=>{var W=o=>{try{T(g.next(o))}catch(E){a(E)}},y=o=>{try{T(g.throw(o))}catch(E){a(E)}},T=o=>o.done?k(o.value):Promise.resolve(o.value).then(W,y);T((g=g.apply(t,d)).next())});import{forwardRef as ke,useImperativeHandle as Ie,useRef as b,useEffect as Z,useMemo as ue}from"react";import{useEffect as Ee,useState as ce,useCallback as he,useRef as U}from"react";var c=null,_=!1,F=null,z=0,K=null,f=new Map,De=0,X=new Map;function Q(t,d){let g=U(!1),[k,a]=ce(!1),[W,y]=ce(null),T=U(!0),o=U(!1),E=U(`instance_${Math.random().toString(36).substr(2,9)}`),O=U(0);Ee(()=>{var R;if(!t)return;T.current=!0,O.current++;let I=O.current,v=E.current,A=(R=X.get(v))!=null?R:0;return I>A&&(z++,X.set(v,I)),C(null,null,function*(){var u;if(!c||!be(K,t)){c&&(c.terminate(),c=null,_=!1);try{o.current=(u=t.verbose)!=null?u:o.current;let s=d||"/jersey-detector-worker.js";c=new Worker(s),K=t,_=!1,F=null,a(!1),y(null),c.onmessage=l=>{let n=l.data;switch(n.type){case"ready":_=!0,a(!0);break;case"loading_progress":o.current&&console.log(`[v0 useJerseyWorker] Loaded ${n.progress}% of ${n.file}`);break;case"debug":o.current&&console.log(n.debug_message);break;case"error":let w=n.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",w),_=!1,F=w,a(!1),y(w);break;case"detect_response":if(n.requestId&&f.has(n.requestId)){let m=f.get(n.requestId);m&&(m.resolve(n),f.delete(n.requestId))}else if(f.size>0){let m=f.entries().next();if(!m.done){let[P,N]=m.value;N.resolve(n),f.delete(P)}}break}},c.onerror=l=>{let n=l.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",n),_=!1,F=n,a(!1),y(n)},c.postMessage({type:"init",config:t})}catch(s){let l=(s==null?void 0:s.message)||String(s);console.error("[useJerseyWorker] Failed to create worker:",l),a(!1),y(l)}}else a(_),y(F)}),()=>{T.current=!1;let u=E.current,s=X.get(u),l=O.current;s===l&&(z--,X.delete(u),z<=0&&c&&(c.terminate(),c=null,_=!1,F=null,K=null,f.clear()))}},[]);let G=he((I,v,A=.5)=>C(null,null,function*(){if(!c||!_)throw new Error("Worker not ready");if(g.current)return null;let h=`req_${++De}_${Date.now()}`;return new Promise((R,u)=>{f.set(h,{resolve:R,reject:u});try{g.current=!0,c.postMessage({type:"detect",requestId:h,dimensions:v,bitmap:I,threshold:A},[I])}catch(s){f.delete(h);let l=`Failed to send detect: ${s==null?void 0:s.message}`;u(new Error(l))}finally{g.current=!1}setTimeout(()=>{f.has(h)&&(f.delete(h),u(new Error("Detection timeout")))},1e4)})}),[k]);return{isReady:k,workerReady:k,lastError:W,detect:G}}function be(t,d){return t?JSON.stringify(t)===JSON.stringify(d):!1}var i={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1};import{jsx as Re}from"react/jsx-runtime";var le=ke(({videoRef:t,onWorkerReady:d,onWorkerError:g,onStatsUpdate:k,onSegmentedImage:a,task:W=i.TASK,model:y=i.MODEL,verbose:T=i.VERBOSE,bodyPixArchitecture:o=i.BODYPIX_ARCHITECTURE,bodyPixMultiplier:E=i.BODYPIX_MULTIPLIER,bodyPixQuantBytes:O=i.BODYPIX_QUANT_BYTES,bodyPixStride:G=i.BODYPIX_STRIDE,multiSegmentation:I=i.MULTI_SEGMENTATION,segmentBodyParts:v=i.SEGMENT_BODY_PARTS,backgroundShade:A=i.BACKGROUND_SHADE,shirtShade:h=i.SHIRT_SHADE,threshold:R=i.DETECTION_THRESHOLD,targetPartId:u=i.TARGET_PART_ID,imagesToReturn:s=i.IMAGES_TO_RETURN,workerUrl:l},n)=>{var re,te;let w=b(null),m=b(null),P=b(!1),N=b([]),me=b(null),B=b(!1),Y=b(void 0);Y.current=g;let $=b({jerseyCount:0,confidence:0,fps:0,processingTime:0}),ee=b(0),fe=500,de=ue(()=>({task:W,model:y,verbose:T,bodyPixArchitecture:o,bodyPixMultiplier:E,bodyPixQuantBytes:O,bodyPixStride:G,multiSegmentation:I,segmentBodyParts:v,backgroundShade:A,shirtShade:h,threshold:R,targetPartId:u,imagesToReturn:s}),[W,y,T,o,E,O,G,I,v,A,h,R,u,s]),ge=ue(()=>{var e,r;return{width:((e=t.current)==null?void 0:e.videoWidth)||0,height:((r=t.current)==null?void 0:r.videoHeight)||0}},[(re=t.current)==null?void 0:re.videoWidth,(te=t.current)==null?void 0:te.videoHeight]),{isReady:x,workerReady:M,lastError:J,detect:ye}=Q(de,l);Z(()=>{d==null||d(M)},[M,d]),Z(()=>{var e;J&&(B.current=!0,(e=Y.current)==null||e.call(Y,J))},[J]);let pe=()=>C(null,null,function*(){var ne,se,oe;let e=t.current,r=w.current;if(B.current||!x||!M||!e||!r||P.current||e.readyState<2||e.paused||e.ended||e.videoWidth===0||e.videoHeight===0)return;let D=r.getContext("2d");if(!D||r.width<=0||r.height<=0)return;let S=null,H=null;try{P.current=!0;let L=e.videoWidth,j=e.videoHeight;me.current={width:L,height:j},S=yield createImageBitmap(e);let p=yield ye(S,ge,R);if((p==null?void 0:p.type)==="detect_response"&&p.bitmap){H=p.bitmap,(r.width!==L||r.height!==j)&&(r.width=L,r.height=j),s==="mask"&&D.clearRect(0,0,L,j),H&&D.drawImage(H,0,0),N.current.push(Date.now()),N.current=N.current.filter(V=>Date.now()-V<1e3);let q={jerseyCount:((ne=p.stats)==null?void 0:ne.detectionCount)||0,confidence:((se=p.stats)==null?void 0:se.averageConfidence)||0,fps:N.current.length,processingTime:((oe=p.stats)==null?void 0:oe.processingTime)||0},ie=$.current;$.current=q;let ae=Date.now();if((ae-ee.current>fe||q.jerseyCount!==ie.jerseyCount||q.confidence!==ie.confidence)&&k&&(k(q),ee.current=ae),p.segmentedImages){let V=p.segmentedImages;C(null,null,function*(){try{yield a==null?void 0:a(V)}finally{V.forEach(Te=>Te.close())}})}}}catch(L){B.current=!0}finally{S==null||S.close(),H==null||H.close(),P.current=!1}});return Ie(n,()=>({get isReady(){return x},get lastError(){return J},get stats(){return $.current},capture:(e="image/jpeg",r=.92)=>{let D=w.current;if(!D)throw new Error("Canvas not ready for capture");return D.toDataURL(e,r)}}),[x,J,M]),Z(()=>{if(!M||!x||B.current)return;let e=t.current,r=w.current;if(!e||!r||e.videoWidth===0||e.videoHeight===0){let S=setTimeout(()=>{m.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(S)}(r.width!==e.videoWidth||r.height!==e.videoHeight)&&(r.width=e.videoWidth,r.height=e.videoHeight);let D=()=>C(null,null,function*(){!M||!x||B.current||(yield pe(),m.current=requestAnimationFrame(D))});return m.current=requestAnimationFrame(D),()=>{m.current&&cancelAnimationFrame(m.current)}},[M,x]),Re("canvas",{ref:w,className:"absolute inset-0 pointer-events-none",style:{zIndex:10,width:"100%",height:"100%"}})});le.displayName="JerseyDetector";export{i as DEFAULT_CONFIG,le as JerseyDetector,Q as useJerseyWorker};
1
+ var O=(o,y,h)=>new Promise((b,a)=>{var W=i=>{try{D(h.next(i))}catch(I){a(I)}},T=i=>{try{D(h.throw(i))}catch(I){a(I)}},D=i=>i.done?b(i.value):Promise.resolve(i.value).then(W,T);D((h=h.apply(o,y)).next())});import{forwardRef as we,useImperativeHandle as be,useRef as w,useEffect as Z,useMemo as ce,useCallback as ve}from"react";import{useEffect as Ee,useState as ie,useCallback as De,useRef as G}from"react";var f=null,M=!1,F=null,z=0,K=null,p=new Map,Ie=0,X=new Map;function Q(o,y){let h=G(!1),[b,a]=ie(!1),[W,T]=ie(null),D=G(!0),i=G(!1),I=G(`instance_${Math.random().toString(36).substr(2,9)}`),x=G(0);Ee(()=>{var R;if(!o)return;D.current=!0,x.current++;let v=x.current,C=I.current,N=(R=X.get(C))!=null?R:0;return v>N&&(z++,X.set(C,v)),O(null,null,function*(){var d;if(!f||!ke(K,o)){f&&(f.terminate(),f=null,M=!1);try{i.current=(d=o.verbose)!=null?d:i.current;let n=y||"/jersey-detector-worker.js";f=new Worker(n),K=o,M=!1,F=null,a(!1),T(null),f.onmessage=m=>{let s=m.data;switch(s.type){case"ready":M=!0,a(!0);break;case"loading_progress":i.current&&console.log(`[v0 useJerseyWorker] Loaded ${s.progress}% of ${s.file}`);break;case"debug":i.current&&console.log(s.debug_message);break;case"error":let _=s.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",_),M=!1,F=_,a(!1),T(_);break;case"detect_response":if(s.requestId&&p.has(s.requestId)){let g=p.get(s.requestId);g&&(g.resolve(s),p.delete(s.requestId))}else if(p.size>0){let g=p.entries().next();if(!g.done){let[P,A]=g.value;A.resolve(s),p.delete(P)}}break}},f.onerror=m=>{let s=m.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",s),M=!1,F=s,a(!1),T(s)},f.postMessage({type:"init",config:o})}catch(n){let m=(n==null?void 0:n.message)||String(n);console.error("[useJerseyWorker] Failed to create worker:",m),a(!1),T(m)}}else a(M),T(F)}),()=>{D.current=!1;let d=I.current,n=X.get(d),m=x.current;n===m&&(z--,X.delete(d),z<=0&&f&&(f.terminate(),f=null,M=!1,F=null,K=null,p.clear()))}},[]);let V=De((v,C,N=.5)=>O(null,null,function*(){if(!f||!M)throw new Error("Worker not ready");if(h.current)return null;let k=`req_${++Ie}_${Date.now()}`;return new Promise((R,d)=>{p.set(k,{resolve:R,reject:d});try{h.current=!0,f.postMessage({type:"detect",requestId:k,dimensions:C,bitmap:v,threshold:N},[v])}catch(n){p.delete(k);let m=`Failed to send detect: ${n==null?void 0:n.message}`;d(new Error(m))}finally{h.current=!1}setTimeout(()=>{p.has(k)&&(p.delete(k),d(new Error("Detection timeout")))},1e4)})}),[b]);return{isReady:b,workerReady:b,lastError:W,detect:V}}function ke(o,y){return o?JSON.stringify(o)===JSON.stringify(y):!1}var c={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1};import Re from"p-limit";import{jsx as _e}from"react/jsx-runtime";var ue=we(({videoRef:o,onWorkerReady:y,onWorkerError:h,onStatsUpdate:b,onSegmentedImage:a,task:W=c.TASK,model:T=c.MODEL,verbose:D=c.VERBOSE,bodyPixArchitecture:i=c.BODYPIX_ARCHITECTURE,bodyPixMultiplier:I=c.BODYPIX_MULTIPLIER,bodyPixQuantBytes:x=c.BODYPIX_QUANT_BYTES,bodyPixStride:V=c.BODYPIX_STRIDE,multiSegmentation:v=c.MULTI_SEGMENTATION,segmentBodyParts:C=c.SEGMENT_BODY_PARTS,backgroundShade:N=c.BACKGROUND_SHADE,shirtShade:k=c.SHIRT_SHADE,threshold:R=c.DETECTION_THRESHOLD,targetPartId:d=c.TARGET_PART_ID,imagesToReturn:n=c.IMAGES_TO_RETURN,workerUrl:m},s)=>{let _=w(null),g=w(null),P=w(!1),A=w([]),le=w(null),J=w(!1),Y=w(void 0);Y.current=h;let $=w({jerseyCount:0,confidence:0,fps:0,processingTime:0}),ee=w(0),fe=500,re=5,te=ce(()=>Re(re),[]),de=ce(()=>({task:W,model:T,verbose:D,bodyPixArchitecture:i,bodyPixMultiplier:I,bodyPixQuantBytes:x,bodyPixStride:V,multiSegmentation:v,segmentBodyParts:C,backgroundShade:N,shirtShade:k,threshold:R,targetPartId:d,imagesToReturn:n}),[W,T,D,i,I,x,V,v,C,N,k,R,d,n]),me=()=>{var r,e;return{width:((r=o.current)==null?void 0:r.videoWidth)||0,height:((e=o.current)==null?void 0:e.videoHeight)||0}},{isReady:H,workerReady:S,lastError:L,detect:ge}=Q(de,m);Z(()=>{y==null||y(S)},[S,y]),Z(()=>{var r;L&&(J.current=!0,(r=Y.current)==null||r.call(Y,L))},[L]);let pe=ve(r=>{if(te.activeCount>=re){r.forEach(e=>{var t;return(t=e==null?void 0:e.close)==null?void 0:t.call(e)}),console.warn("[JerseyDetector] Dropped new segmented images \u2014 max 5 classifications running");return}te(()=>O(null,null,function*(){try{yield a==null?void 0:a(r)}catch(e){console.error("[JerseyDetector] Classification error:",e)}finally{r.forEach(e=>{var t;return(t=e==null?void 0:e.close)==null?void 0:t.call(e)})}}))},[a]),ye=()=>O(null,null,function*(){var B,ne,se;let r=o.current,e=_.current;if(J.current||!H||!S||!r||!e||P.current||r.readyState<2||r.paused||r.ended||r.videoWidth===0||r.videoHeight===0)return;let t=e.getContext("2d");if(!t||e.width<=0||e.height<=0)return;let l=null,u=null;try{P.current=!0;let U=r.videoWidth,j=r.videoHeight;le.current={width:U,height:j},l=yield createImageBitmap(r);let he=me(),E=yield ge(l,he,R);if((E==null?void 0:E.type)==="detect_response"){E.bitmap&&n!=="none"&&(u=E.bitmap,(e.width!==U||e.height!==j)&&(e.width=U,e.height=j),t.clearRect(0,0,U,j),n==="mask_with_image"&&t.drawImage(l,0,0),(n==="mask"||n==="mask_with_image")&&t.drawImage(u,0,0)),A.current.push(Date.now()),A.current=A.current.filter(Te=>Date.now()-Te<1e3);let q={jerseyCount:((B=E.stats)==null?void 0:B.detectionCount)||0,confidence:((ne=E.stats)==null?void 0:ne.averageConfidence)||0,fps:A.current.length,processingTime:((se=E.stats)==null?void 0:se.processingTime)||0},oe=$.current;$.current=q;let ae=Date.now();(ae-ee.current>fe||q.jerseyCount!==oe.jerseyCount||q.confidence!==oe.confidence)&&b&&(b(q),ee.current=ae),E.segmentedImages&&a&&pe(E.segmentedImages)}}catch(U){J.current=!0}finally{l==null||l.close(),u==null||u.close(),P.current=!1}});return be(s,()=>({get isReady(){return H},get lastError(){return L},get stats(){return $.current},capture:(r="image/jpeg",e=.92)=>{let t=o.current,l=_.current;if(!t||t.videoWidth<=0||t.videoHeight<=0)throw new Error("Video not ready for capture");let u=document.createElement("canvas");u.width=t.videoWidth,u.height=t.videoHeight;let B=u.getContext("2d");if(!B)throw new Error("Failed to get context for capture canvas");return B.drawImage(t,0,0,u.width,u.height),l&&l.width>0&&l.height>0?B.drawImage(l,0,0,u.width,u.height):console.warn("[capture] Mask canvas not available \u2014 returning raw video frame"),u.toDataURL(r,e)}}),[H,L,S]),Z(()=>{if(!S||!H||J.current)return;let r=o.current,e=_.current;if(!r||!e||r.videoWidth===0||r.videoHeight===0){let l=setTimeout(()=>{g.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(l)}(e.width!==r.videoWidth||e.height!==r.videoHeight)&&(e.width=r.videoWidth,e.height=r.videoHeight);let t=()=>O(null,null,function*(){!S||!H||J.current||(yield ye(),g.current=requestAnimationFrame(t))});return g.current=requestAnimationFrame(t),()=>{g.current&&cancelAnimationFrame(g.current)}},[S,H]),_e("canvas",{ref:_,className:"absolute inset-0 pointer-events-none",style:{zIndex:10,width:"100%",height:"100%"}})});ue.displayName="JerseyDetector";export{c as DEFAULT_CONFIG,ue as JerseyDetector,Q as useJerseyWorker};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seg-cam",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -45,8 +45,9 @@
45
45
  "class-variance-authority": "^0.7.1",
46
46
  "clsx": "^2.1.1",
47
47
  "lucide-react": "^0.454.0",
48
- "next": "16.0.10",
48
+ "next": "^16.1.6",
49
49
  "next-themes": "^0.4.6",
50
+ "p-limit": "^7.3.0",
50
51
  "tailwind-merge": "^3.4.0"
51
52
  },
52
53
  "peerDependencies": {