2022-04-06 19:28:42 +02:00
|
|
|
import { SOPClassHandlerId } from './id';
|
|
|
|
|
import { utils } from '@ohif/core';
|
2022-02-24 17:55:12 +01:00
|
|
|
|
|
|
|
|
const SOP_CLASS_UIDS = {
|
|
|
|
|
VIDEO_MICROSCOPIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.2.1',
|
|
|
|
|
VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.4.1',
|
|
|
|
|
VIDEO_ENDOSCOPIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.1.1',
|
|
|
|
|
/** Need to use fallback, could be video or image */
|
|
|
|
|
SECONDARY_CAPTURE_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.7',
|
|
|
|
|
MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE:
|
|
|
|
|
'1.2.840.10008.5.1.4.1.1.7.4',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const sopClassUids = Object.values(SOP_CLASS_UIDS);
|
|
|
|
|
|
|
|
|
|
const SupportedTransferSyntaxes = {
|
|
|
|
|
MPEG4_AVC_264_HIGH_PROFILE: '1.2.840.10008.1.2.4.102',
|
|
|
|
|
MPEG4_AVC_264_BD_COMPATIBLE_HIGH_PROFILE: '1.2.840.10008.1.2.4.103',
|
|
|
|
|
MPEG4_AVC_264_HIGH_PROFILE_FOR_2D_VIDEO: '1.2.840.10008.1.2.4.104',
|
|
|
|
|
MPEG4_AVC_264_HIGH_PROFILE_FOR_3D_VIDEO: '1.2.840.10008.1.2.4.105',
|
|
|
|
|
MPEG4_AVC_264_STEREO_HIGH_PROFILE: '1.2.840.10008.1.2.4.106',
|
|
|
|
|
HEVC_265_MAIN_PROFILE: '1.2.840.10008.1.2.4.107',
|
|
|
|
|
HEVC_265_MAIN_10_PROFILE: '1.2.840.10008.1.2.4.108',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const supportedTransferSyntaxUIDs = Object.values(SupportedTransferSyntaxes);
|
|
|
|
|
|
2022-04-06 19:28:42 +02:00
|
|
|
const _getDisplaySetsFromSeries = (
|
|
|
|
|
instances,
|
|
|
|
|
servicesManager,
|
|
|
|
|
extensionManager
|
|
|
|
|
) => {
|
2022-02-24 17:55:12 +01:00
|
|
|
const dataSource = extensionManager.getActiveDataSource()[0];
|
|
|
|
|
return instances
|
|
|
|
|
.filter(metadata => {
|
2022-04-06 19:28:42 +02:00
|
|
|
const tsuid =
|
|
|
|
|
metadata.AvailableTransferSyntaxUID ||
|
|
|
|
|
metadata.TransferSyntaxUID ||
|
|
|
|
|
metadata['00083002'];
|
2022-02-24 17:55:12 +01:00
|
|
|
return supportedTransferSyntaxUIDs.includes(tsuid);
|
|
|
|
|
})
|
|
|
|
|
.map(instance => {
|
2022-04-06 19:28:42 +02:00
|
|
|
const {
|
|
|
|
|
Modality,
|
|
|
|
|
SOPInstanceUID,
|
|
|
|
|
SeriesDescription = 'VIDEO',
|
|
|
|
|
} = instance;
|
|
|
|
|
const {
|
|
|
|
|
SeriesNumber,
|
|
|
|
|
SeriesDate,
|
|
|
|
|
SeriesInstanceUID,
|
|
|
|
|
StudyInstanceUID,
|
|
|
|
|
NumberOfFrames,
|
|
|
|
|
} = instance;
|
2022-02-24 17:55:12 +01:00
|
|
|
const displaySet = {
|
|
|
|
|
//plugin: id,
|
|
|
|
|
Modality,
|
|
|
|
|
displaySetInstanceUID: utils.guid(),
|
|
|
|
|
SeriesDescription,
|
|
|
|
|
SeriesNumber,
|
|
|
|
|
SeriesDate,
|
|
|
|
|
SOPInstanceUID,
|
|
|
|
|
SeriesInstanceUID,
|
|
|
|
|
StudyInstanceUID,
|
|
|
|
|
SOPClassHandlerId,
|
|
|
|
|
referencedImages: null,
|
|
|
|
|
measurements: null,
|
2022-04-06 19:28:42 +02:00
|
|
|
videoUrl: dataSource.retrieve.directURL({
|
|
|
|
|
instance,
|
|
|
|
|
singlepart: 'video',
|
|
|
|
|
tag: 'PixelData',
|
|
|
|
|
}),
|
2022-02-24 17:55:12 +01:00
|
|
|
others: [instance],
|
2022-04-06 19:28:42 +02:00
|
|
|
thumbnailSrc: dataSource.retrieve.directURL({
|
|
|
|
|
instance,
|
|
|
|
|
defaultPath: '/thumbnail',
|
|
|
|
|
defaultType: 'image/jpeg',
|
|
|
|
|
tag: 'Absent',
|
|
|
|
|
}),
|
2022-02-24 17:55:12 +01:00
|
|
|
isDerivedDisplaySet: true,
|
|
|
|
|
isLoaded: false,
|
|
|
|
|
sopClassUids,
|
|
|
|
|
numImageFrames: NumberOfFrames,
|
|
|
|
|
instance,
|
|
|
|
|
};
|
|
|
|
|
return displaySet;
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2022-04-06 19:28:42 +02:00
|
|
|
export default function getSopClassHandlerModule({
|
|
|
|
|
servicesManager,
|
|
|
|
|
extensionManager,
|
|
|
|
|
}) {
|
2022-02-24 17:55:12 +01:00
|
|
|
const getDisplaySetsFromSeries = instances => {
|
|
|
|
|
return _getDisplaySetsFromSeries(
|
|
|
|
|
instances,
|
|
|
|
|
servicesManager,
|
|
|
|
|
extensionManager
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
{
|
2022-04-06 19:28:42 +02:00
|
|
|
name: 'dicom-video',
|
2022-02-24 17:55:12 +01:00
|
|
|
sopClassUids,
|
|
|
|
|
getDisplaySetsFromSeries,
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
}
|