storescpdckv - jacquesfauquex/DCKV GitHub Wiki
El parser dicm2dckv opera entre stdin y stdout. Logramos modificar dcmtk storescp de tal forma que, en lugar de escribir las instancias recibidas a archivos de sistema, ahora los hace disponibles por stdout, permitiendo piping a otra aplicación vía memoria.
dicm2dckv es bloqueante, en el sentido que lee stdin por pequeños chunks (siempre más chicos que 0xFFFF bytes). El bloqueado se manifiesta de dos formas:
- bytes quedan en caché del sistema hasta lectura
- cuando se terminó de leer una instancia, dicm2dckv intenta leer más bytes, y si storescp no recibió más instancias, dicm2dckv queda bloqueado esperando que el read culmine. Bloquea un thread pero permite que funcione como un demonio, siempre activo.
El fin de una instancia no es siempre el atributo de pixeles. Existen varios de ellos y existen también objetos DICOM que no contienen pixeles. dcmtk storescp no manda en stdout ningun marcador de fin de instancia. dicm2dckv no puede esperar el principio de la instancia siguiente antes de cerrar la anterior. Para solucionar este problema, modificamos storedicom, para que agregue a toda instancia un trailing padding atribute vacio. Este atributo no se parsea por dicm2dckv pero le indica que puede finalizar el procesamiento de la instancia recien recibida.n
modificaciones storescp
dcmtk escribe los archivos abriendolos con el comando freopen(filename), que puede tambien abrir stdout freopen(stdout). El hack consiste a cambiar filename por freopen en el código fuente.
Se realiza un ultimo flush antes de cerrar el archivo. Se aprovecha de este stream para agregar el attributo FFFCFFFC Trailing and Padding Dataset Attribute antes del flush final.
Las modificaciones se realizan dentro de dos archivos:
- dcmtk/dcmdata/libsrc/dcostrmf.cc
- dcmtk/ofstd/include/dcmtk/ofstd/offile.h
Los archivos modificados están adjuntos a dicm2dckv para información de los parches a realizar.
invocación de dcmtk storescp
Puede venir de cualquier modalidad.
- Se requiere explicit little endian o derivados.
- Se prefiere un pdu de 65534 bytes
- Durante el pedido de association, se acepta negociación de transfer syntax combinada y reducida al mínimo necesario
Si se usa storescu de dcmtk, los argumentos son los siguientes:
storescu -R +C -pdu 65534 127.0.0.1 11112 file.dcm ...
parametros de dcmtk storescp
storescp -dhl -pm -od /tmp +te -e -pdu 65534 11112 | dicmstructdump I /tmp
-dhl (opcional, elimina verificación de red)
-pm (opcional, acepta cualquier AET)
-od (directorio para escribir los archivos. Obligatorio. No se usa dado que se reemplaza por stdout. Necesitaría más modificación del código para eliminar esta obligación)
-te (obligatorio, escribe en explicit little endian, única sintaxis aceptada por dicm2dckv.
-e (por ahora obligatoria. notación undefined length para secuencias e items).
-pdu 65534 (=0xFFFE) corresponde al tamaño de nuestro buffer de recepción. Perfecto para recuperar en varias pasadas los datos de pixel que exceden el tamaño 65534 bytes.
11112 puerto de recepción
| pipe stdout a stdin
dicmstructdump nombre del comando variante de dicm2dckv. En este caso realiza un dump de los key-value
I nivel de logeo a stderr INFO
/tmp sistema de archivo dónde escribir el resultado del parseo, cuando la variante de dicm2dckv escribe su resultado