Review & mitigasi risiko perubahan multiframe XA di dicomweb-proxy #4

Open
opened 2026-09-26 10:34:00 +07:00 by mario · 0 comments
Owner

Konteks

Commit 5862bb7 (branch rsab) menambah forwarding atribut multiframe + slicing frame tunggal di WADO-RS supaya run angio XA bisa diputar sebagai cine. Ada 2 risiko lintas-modality plus 1 gap keakuratan fps.

Temuan

  1. Risiko C-FIND — src/dimse/tags.ts sekarang mengirim key CineRate (0018,0040) dan RecommendedDisplayFrameRate (0008,2144) ke semua peer di level IMAGE. Dua key ini khas XA dan tidak dipakai OHIF untuk cine. SCP tua/non-konforman bisa menolak query -> study list kosong untuk peer tsb.

  2. Risiko frame slicing — src/dimse/wadoRs.ts menghitung frame pakai rows*cols*spp*(bits/8), valid hanya untuk pixel data uncompressed. Untuk multiframe terkompresi (Enhanced CT/MR/US), kalau recompress ke Implicit LE gagal, byte yang dikembalikan salah. compressFile cuma logger.error lalu lanjut (silent failure).

  3. Gap fps (koreksi) — OHIF menentukan frame rate dari instance.FrameTime (0018,1063): getSopClassHandlerModule.js: FrameRate = instance.FrameTime -> 1000 / FrameTime. FrameTime tidak masuk imageLevelTags, jadi cine angio sekarang diputar di 24 fps default, bukan 15 fps yang benar (FrameTime 66.7 ms).

Solusi potensial

A. C-FIND keys

  • A1 (rekomendasi): imageLevelTags -> 00080016, 00080018, 00280008 (NumberOfFrames), 00181063 (FrameTime). Buang CineRate + RecommendedDisplayFrameRate (tidak dipakai), buang Rows/Columns/InstanceNumber yang opsional (cornerstone baca saat load).
  • A2: key per-peer lewat config. Lebih kompleks, tidak disukai (KISS).
  • A3: retry C-FIND dengan key minimal kalau extended gagal. Menyamarkan masalah, tidak disukai.

B. Frame slicing

  • B1 (rekomendasi): deteksi encapsulated via pixeldataElement.encapsulatedPixelData; kalau encapsulated pakai dataset.readEncapsulatedPixelData(element, frame-1) (basic offset table / walk fragments), bukan slicing mentah.
  • B2 (rekomendasi, cepat): jangan silent. Kalau pixel data masih encapsulated saat slicing, throw (fail-loud) supaya tidak mengembalikan byte salah.
  • B3: fallback kembalikan full instance DICOM dan biarkan cornerstone decode client-side.

Rekomendasi tindakan

  1. Terapkan A1 + tambah FrameTime — perbaiki fps sekaligus hilangkan risiko key XA.
  2. Terapkan B2 (fail-loud) sekarang; B1 (encapsulated extraction) sebagai follow-up kalau Enhanced multiframe jadi kebutuhan.

Verifikasi

  • Setelah A1: cine XA harus 15 fps (FrameTime 66.7 ms), bukan 24.
  • C-FIND ke peer 192.168.1.29 dan ABPACS tetap mengembalikan study list.
## Konteks Commit `5862bb7` (branch `rsab`) menambah forwarding atribut multiframe + slicing frame tunggal di WADO-RS supaya run angio XA bisa diputar sebagai cine. Ada 2 risiko lintas-modality plus 1 gap keakuratan fps. ## Temuan 1. **Risiko C-FIND** — `src/dimse/tags.ts` sekarang mengirim key `CineRate` (0018,0040) dan `RecommendedDisplayFrameRate` (0008,2144) ke semua peer di level IMAGE. Dua key ini khas XA dan **tidak dipakai OHIF** untuk cine. SCP tua/non-konforman bisa menolak query -> study list kosong untuk peer tsb. 2. **Risiko frame slicing** — `src/dimse/wadoRs.ts` menghitung frame pakai `rows*cols*spp*(bits/8)`, valid hanya untuk pixel data uncompressed. Untuk multiframe terkompresi (Enhanced CT/MR/US), kalau recompress ke Implicit LE gagal, byte yang dikembalikan salah. `compressFile` cuma `logger.error` lalu lanjut (silent failure). 3. **Gap fps (koreksi)** — OHIF menentukan frame rate dari `instance.FrameTime` (0018,1063): `getSopClassHandlerModule.js: FrameRate = instance.FrameTime` -> `1000 / FrameTime`. `FrameTime` tidak masuk `imageLevelTags`, jadi cine angio sekarang diputar di 24 fps default, bukan 15 fps yang benar (FrameTime 66.7 ms). ## Solusi potensial ### A. C-FIND keys - A1 (rekomendasi): `imageLevelTags` -> `00080016`, `00080018`, `00280008` (NumberOfFrames), `00181063` (FrameTime). Buang `CineRate` + `RecommendedDisplayFrameRate` (tidak dipakai), buang `Rows`/`Columns`/`InstanceNumber` yang opsional (cornerstone baca saat load). - A2: key per-peer lewat config. Lebih kompleks, tidak disukai (KISS). - A3: retry C-FIND dengan key minimal kalau extended gagal. Menyamarkan masalah, tidak disukai. ### B. Frame slicing - B1 (rekomendasi): deteksi encapsulated via `pixeldataElement.encapsulatedPixelData`; kalau encapsulated pakai `dataset.readEncapsulatedPixelData(element, frame-1)` (basic offset table / walk fragments), bukan slicing mentah. - B2 (rekomendasi, cepat): jangan silent. Kalau pixel data masih encapsulated saat slicing, throw (fail-loud) supaya tidak mengembalikan byte salah. - B3: fallback kembalikan full instance DICOM dan biarkan cornerstone decode client-side. ## Rekomendasi tindakan 1. Terapkan A1 + tambah `FrameTime` — perbaiki fps sekaligus hilangkan risiko key XA. 2. Terapkan B2 (fail-loud) sekarang; B1 (encapsulated extraction) sebagai follow-up kalau Enhanced multiframe jadi kebutuhan. ## Verifikasi - Setelah A1: cine XA harus 15 fps (FrameTime 66.7 ms), bukan 24. - C-FIND ke peer 192.168.1.29 dan ABPACS tetap mengembalikan study list.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mario/dicom-proxy#4