{"version":3,"file":"video-decoder-host.mjs","names":[],"sources":["../../src/hosts/video-decoder-host.ts"],"sourcesContent":["/* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD */\n/* SPDX-License-Identifier: Apache-2.0 */\n\n/**\n * In-memory BrookesiaHost for video decoder — Node/vitest only, not used on device.\n * Import: `@brookesia/service/hosts/video-decoder`\n */\n\nimport type { BrookesiaHost } from '../common/brookesia-host.ts';\nimport { serializeRpcError, serializeRpcResult } from '../common/rpc-json.ts';\nimport {\n  VIDEO_DECODER_DEFAULT_SERVICE_NAME,\n  VIDEO_DECODER_FUNCTIONS,\n} from '../video/decoder/decoder-client.ts';\nimport type {\n  VideoDecoderConfig,\n  VideoDecoderFrame,\n  VideoDecoderState,\n} from '../video/decoder/decoder-types.ts';\n\ntype VideoDecoderMockState = {\n  state: VideoDecoderState;\n  config: VideoDecoderConfig | null;\n  framesFed: number;\n  lastFrameSize: number;\n};\n\nexport type VideoDecoderHostOptions = {\n  serviceName?: string;\n};\n\nlet nextHandle = 1;\nconst handles = new Map<number, VideoDecoderMockState>();\n\nfunction defaultState(): VideoDecoderMockState {\n  return {\n    state: 'Closed',\n    config: null,\n    framesFed: 0,\n    lastFrameSize: 0,\n  };\n}\n\nfunction getState(handle: number): VideoDecoderMockState {\n  const state = handles.get(handle);\n  if (!state) {\n    throw new Error(`Video decoder memory host: invalid handle ${handle}`);\n  }\n  return state;\n}\n\nfunction frameByteLength(frame: VideoDecoderFrame): number {\n  if (frame instanceof Uint8Array) {\n    return frame.byteLength;\n  }\n  if (frame instanceof ArrayBuffer) {\n    return frame.byteLength;\n  }\n  return frame.length;\n}\n\nexport function createVideoDecoderHost(options?: VideoDecoderHostOptions): BrookesiaHost {\n  const serviceName = options?.serviceName ?? VIDEO_DECODER_DEFAULT_SERVICE_NAME;\n\n  return {\n    service_available(name: string): boolean {\n      return name === serviceName;\n    },\n\n    start_service(name: string): number {\n      if (name !== serviceName) {\n        throw new Error(`Video decoder memory host: unknown service ${name}`);\n      }\n      const handle = nextHandle++;\n      handles.set(handle, defaultState());\n      return handle;\n    },\n\n    stop_service(handle: number): void {\n      handles.delete(handle);\n    },\n\n    call_function(handle: number, functionName: string, paramsJson: string): string {\n      const state = getState(handle);\n      const params = JSON.parse(paramsJson) as Record<string, unknown>;\n\n      try {\n        if (functionName === VIDEO_DECODER_FUNCTIONS.Open) {\n          state.config = params.Config as VideoDecoderConfig;\n          state.state = 'Open';\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_DECODER_FUNCTIONS.Close) {\n          Object.assign(state, defaultState());\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_DECODER_FUNCTIONS.Start) {\n          if (state.state === 'Open' || state.state === 'Stopped') {\n            state.state = 'Started';\n          }\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_DECODER_FUNCTIONS.Stop) {\n          if (state.state === 'Started') {\n            state.state = 'Stopped';\n          }\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_DECODER_FUNCTIONS.FeedFrame) {\n          const frame = params.Frame as VideoDecoderFrame;\n          state.framesFed += 1;\n          state.lastFrameSize = frameByteLength(frame);\n          return serializeRpcResult();\n        }\n\n        return serializeRpcError(`unknown function ${functionName}`);\n      } catch (err) {\n        const message = err instanceof Error ? err.message : String(err);\n        return serializeRpcError(message);\n      }\n    },\n  };\n}\n\nexport function resetVideoDecoderHostState(): void {\n  handles.clear();\n  nextHandle = 1;\n}\n"],"mappings":";;;AA+BA,IAAI,aAAa;AACjB,MAAM,0BAAU,IAAI,IAAmC;AAEvD,SAAS,eAAsC;CAC7C,OAAO;EACL,OAAO;EACP,QAAQ;EACR,WAAW;EACX,eAAe;CACjB;AACF;AAEA,SAAS,SAAS,QAAuC;CACvD,MAAM,QAAQ,QAAQ,IAAI,MAAM;CAChC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,6CAA6C,QAAQ;CAEvE,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAkC;CACzD,IAAI,iBAAiB,YACnB,OAAO,MAAM;CAEf,IAAI,iBAAiB,aACnB,OAAO,MAAM;CAEf,OAAO,MAAM;AACf;AAEA,SAAgB,uBAAuB,SAAkD;CACvF,MAAM,cAAc,SAAS,eAAA;CAE7B,OAAO;EACL,kBAAkB,MAAuB;GACvC,OAAO,SAAS;EAClB;EAEA,cAAc,MAAsB;GAClC,IAAI,SAAS,aACX,MAAM,IAAI,MAAM,8CAA8C,MAAM;GAEtE,MAAM,SAAS;GACf,QAAQ,IAAI,QAAQ,aAAa,CAAC;GAClC,OAAO;EACT;EAEA,aAAa,QAAsB;GACjC,QAAQ,OAAO,MAAM;EACvB;EAEA,cAAc,QAAgB,cAAsB,YAA4B;GAC9E,MAAM,QAAQ,SAAS,MAAM;GAC7B,MAAM,SAAS,KAAK,MAAM,UAAU;GAEpC,IAAI;IACF,IAAI,iBAAiB,wBAAwB,MAAM;KACjD,MAAM,SAAS,OAAO;KACtB,MAAM,QAAQ;KACd,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,OAAO;KAClD,OAAO,OAAO,OAAO,aAAa,CAAC;KACnC,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,OAAO;KAClD,IAAI,MAAM,UAAU,UAAU,MAAM,UAAU,WAC5C,MAAM,QAAQ;KAEhB,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,MAAM;KACjD,IAAI,MAAM,UAAU,WAClB,MAAM,QAAQ;KAEhB,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,WAAW;KACtD,MAAM,QAAQ,OAAO;KACrB,MAAM,aAAa;KACnB,MAAM,gBAAgB,gBAAgB,KAAK;KAC3C,OAAO,mBAAmB;IAC5B;IAEA,OAAO,kBAAkB,oBAAoB,cAAc;GAC7D,SAAS,KAAK;IAEZ,OAAO,kBADS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAC/B;GAClC;EACF;CACF;AACF;AAEA,SAAgB,6BAAmC;CACjD,QAAQ,MAAM;CACd,aAAa;AACf"}