CC

Camera Control

FaceTime HD on this M1 MacBook Pro — capture, diagnose, preview looks

Camera is idle

Acquire the camera, then pick a look. Filters run in WebGL on this page — Meet will still see the unfiltered camera.

Bitrate and monitoring Encode — · FPS — · collapsed

Encoding uses WebCodecs (hardware H.264 when available) — faster than a WebRTC loopback because there is no ICE, RTP, or jitter buffer. Packet origin only applies if the encoder falls back to WebRTC.

  1. 1 CaptureFaceTime
  2. 2 Encode
  3. 3 ICE / RTP
  4. 4 Decode
  5. 5 WebGL
0
0
0
Video bitrate
Network I/O
Frames per second
Delay (encode / jitter / decode)
I / P / B frames

Codec and decode pipeline

status
Acquire the camera to start a local WebRTC loopback.

Packet origin and delay

ICE candidate type is the origin we can see without capturing packets. host = this Mac, srflx = STUN public mapping, relay = TURN server. Loopback is almost always host.

SideTypeProtoAddressNetwork

WebGL

Record

Snippets, trim, and screen capture

Record the camera (beauty canvas if it’s running) or your screen. Cut a range and download WebM locally. Nothing is uploaded unless you use a live platform below.

00:00 Idle

0.00s – 0.00s

Clips

Driver snapshots are collected in the browser when available. MediaDevices cannot see AppleH13 directly.

How it works

The FaceTime camera on this MacBook Pro

This is a MacBook Pro 13-inch (M1, 2020), model MacBookPro17,1. The webcam is a built-in FaceTime HD module on Apple’s Image Signal Processor — not a USB camera. If the ISP daemon dies, Chrome, Meet, FaceTime, and this page all see zero devices.

Hardware on this machine

LayerWhat this Mac reports
SensorFront FaceTime HD module
ISPM1 Image Signal Processor, firmware 100.300
IOKit classAppleH13CamIn
Kernel drivercom.apple.driver.AppleH13CameraInterface 10.300.0
Kext path/System/Library/Extensions/AppleH13CameraInterface.kext
Secure Enclave killSEPCameraDisable = No (sensor is not hardware-disabled)

H13 is the M1 camera ISP generation. M2 and later use AppleH16CameraInterface. Both kexts ship in macOS; only H13 is loaded here.

Path a frame takes

1

FaceTime sensor

Light hits the front module. Nothing is a UVC / USB gadget.

2

M1 ISP

Focus, denoise, scale, and color happen in silicon. Firmware lives here, not in Chrome.

3

AppleH13CameraInterface.kext

Kernel driver publishes AppleH13CamIn. Watch FrontCameraExpected, Active, and Streaming.

4

appleh13camerad

User-space daemon, launchd com.apple.appleh13camerad, user _cmiodalassistants. If this process is dead, every app sees 0 cameras.

5

Core Media I/O

cameracaptured plus the CMIO graph. This is the device list AVFoundation and Chrome read.

6

Two clients

Native apps use AVFoundation. This page and Google Meet use getUserMedia / WebRTC on top of Chrome’s AVFoundation client.

7

TCC permission

macOS Camera privacy for com.google.Chrome or local.CameraControl. Separate from Chrome’s site Allow for Meet.

8

This preview

WebGL looks run on a canvas. The MediaStream stays raw. Meet never sees these filters.

Browser vs native

This page / Google Meet / Chrome
  getUserMedia → Chrome TCC → CMIO → appleh13camerad → H13 kext → ISP → sensor

Camera Control.app / FaceTime / Zoom
  AVCaptureSession → app TCC → same CMIO / daemon / kext / ISP

Why Meet failed on this Mac

Chrome already allowed https://meet.google.com. That did not matter. appleh13camerad was in a crash loop (10,000+ restarts) with last exit OS_REASON_ENDPOINTSECURITY. Kaspersky webcam protection was killing the daemon. NordVPN Shield was loaded too, but the camera recovered while Shield stayed on.

After unblocking the camera in Kaspersky, the daemon stayed running and FaceTime HD Camera appeared again.

If the camera disappears again

  1. Open Drivers. appleh13camerad must be state = running.
  2. last exit reason = OS_REASON_ENDPOINTSECURITY → turn off Kaspersky webcam protection first.
  3. FrontCameraExpected = Yes and 0 devices means hardware is present and userspace is not publishing it.
  4. Release this page and the native app before Meet. Capture is exclusive on macOS.
  5. System Settings → Privacy & Security → Camera → Google Chrome.
Camera Control · How the FaceTime HD pipeline works on MacBookPro17,1
Preview-only beauty · Meet still sees the raw camera · GitHub
API docs

Web camera APIs this page uses

Served on https://video.graphai.eu (HTTPS only) so Chrome treats it as a secure context. Capture is the Media Capture and Streams standard — the same getUserMedia path Google Meet uses.

1 Secure context

navigator.mediaDevices exists only on HTTPS. This app is served at https://video.graphai.eu.

window.isSecureContext === true navigator.mediaDevices.getUserMedia navigator.mediaDevices.enumerateDevices

2 Permission

Two gates: Chrome’s site permission for this origin, and macOS TCC for bundle com.google.Chrome. Meet Allow does not grant this page.

const status = await navigator.permissions.query({ name: "camera" }); // status.state → granted | denied | prompt status.onchange = () => { /* refresh UI */ };
granted
Site already allowed. getUserMedia should proceed.
prompt
Chrome will show “video.graphai.eu wants to use your camera”.
denied
User blocked the site. Reset in Chrome site settings.
macOS TCC
System Settings → Privacy & Security → Camera → Google Chrome.
reset OS grant
tccutil reset Camera com.google.Chrome then fully quit Chrome.
Permissions API kTCCServiceCamera

3 getUserMedia — acquire

Browser equivalent of native AVCaptureSession.startRunning(). Chrome opens FaceTime HD through its AVFoundation / CMIO client.

const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { deviceId: { exact: id }, width: { ideal: 1280 }, height: { ideal: 720 } } }); video.srcObject = stream;
DOMExceptionTypical cause on this Mac
NotAllowedErrorChrome site permission or macOS TCC denied
NotFoundError0 cameras — appleh13camerad down
NotReadableErrorCamera already held (native app, Zoom, another tab)
OverconstrainedErrordeviceId or size the hardware cannot meet
AbortErrorHardware or OS aborted the request

4 enumerateDevices

const cams = (await navigator.mediaDevices.enumerateDevices()) .filter(d => d.kind === "videoinput"); // label and deviceId are empty until permission is granted

After grant, the built-in cam is typically labeled FaceTime HD Camera. Listen for Continuity Camera / unplug with devicechange.

navigator.mediaDevices.addEventListener("devicechange", refreshDevices);

5 MediaStreamTrack

getSettings() is live format negotiation. track.stop() is the browser’s stopRunning().

track.label
Human name, e.g. FaceTime HD Camera
getSettings()
Actual width, height, deviceId, frameRate
getCapabilities()
Ranges the driver exposes to Chrome
getConstraints()
What this page asked for
readyState
live or ended
stop()
Releases the camera for Meet / the native app
events
mute, unmute, ended

6 Local diagnostics API

The browser cannot read IOKit. Hosted diagnostics return what the page can observe from Web APIs.

GET /api/health
Process is up, host and port
GET /api/diagnostics
appleh13camerad, AppleH13CamIn, kmutil, Endpoint Security
GET /api/netstats
Interface byte counters for live network plots

Same snapshot as the Drivers tab. The native Mac app can still print IOKit and launchd details on-device.

7 Call sequence

1

isSecureContext

Must be true or mediaDevices is missing.

2

permissions.query({ name: "camera" })

Read Chrome site permission without prompting.

3

enumerateDevices()

Fill the device picker (labels empty until allowed).

4

getUserMedia({ video })

Acquire FaceTime HD. May show Chrome + macOS prompts.

5

video.srcObject = stream

Hidden source element for the WebGL canvas.

6

getSettings / getCapabilities

Log the live format into the Capture sidebar.

7

track.stop()

Release so Meet or the native app can open the camera.

8 Beautification (this page only)

Looks are a WebGL fragment shader. The MediaStream stays raw. Meet cannot see these filters.

video.srcObject = stream // hidden source canvas ← BeautyRenderer.draw() // bilateral skin smooth + grade uniforms: smooth, bright, warmth, contrast, saturate, sharpen, glow, whiten

Skin mask uses red–green and luma ranges, not a face mesh. No slimming or eye enlargement. This is not a virtual camera.

Camera Control · Media Capture APIs on https://video.graphai.eu
getUserMedia · Permissions · MediaStreamTrack · GitHub