seg-cam 0.4.7 → 0.4.8

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