Generate MJPEG UltrasoundMultiframeImageStorag does not work with synapse dicom viewer

All other questions regarding DCMTK

Moderator: Moderator Team

Post Reply
Message
Author
himanshu.mistri
Posts: 18
Joined: Tue, 2018-06-05, 10:21

Generate MJPEG UltrasoundMultiframeImageStorag does not work with synapse dicom viewer

#1 Post by himanshu.mistri »

Hello DCMTK,

I am facing one strange issue where my generated MJPEG (UltrasoundMultiframeImageStorag) Dicom file is not able to play by the synapse dicom PACS https://www.fujifilm.com/products/medical/synapse/.

While same Dicom file is working fine for the Horos and MIcroDIcom and Sonic Dicom.

My Dicom file has a resolution of the 720x1280.

Below is my dicom file dump:-

Code: Select all

# Dicom-File-Format

# Dicom-Meta-Information-Header
# Used TransferSyntax: Little Endian Explicit
(0002,0000) UL 220                                      #   4, 1 FileMetaInformationGroupLength
(0002,0001) OB 00\01                                    #   2, 1 FileMetaInformationVersion
(0002,0002) UI =UltrasoundMultiframeImageStorage        #  28, 1 MediaStorageSOPClassUID
(0002,0003) UI [1.2.276.0.7230010.3.1.4.16777343.11781.1603299615.347640] #  56, 1 MediaStorageSOPInstanceUID
(0002,0010) UI =JPEGBaseline                            #  22, 1 TransferSyntaxUID
(0002,0012) UI [1.2.276.0.7230010.3.0.3.6.5]            #  28, 1 ImplementationClassUID
(0002,0013) SH [OFFIS_DCMTK_365]                        #  16, 1 ImplementationVersionName
(0002,0016) AE [Android]                                #   8, 1 SourceApplicationEntityTitle

# Dicom-Data-Set
# Used TransferSyntax: JPEG Baseline
(0008,0005) CS [ISO_IR 100]                             #  10, 1 SpecificCharacterSet
(0008,0008) CS [DERIVED\PRIMARY\CARDIAC]                #  24, 3 ImageType
(0008,0012) DA [20201021]                               #   8, 1 InstanceCreationDate
(0008,0013) TM [100000.65800]                           #  12, 1 InstanceCreationTime
(0008,0016) UI =UltrasoundMultiframeImageStorage        #  28, 1 SOPClassUID
(0008,0018) UI [1.2.276.0.7230010.3.1.4.16777343.11781.1603299615.347640] #  56, 1 SOPInstanceUID
(0008,0020) DA [20201021]                               #   8, 1 StudyDate
(0008,0021) DA [20201021]                               #   8, 1 SeriesDate
(0008,0022) DA [20201021]                               #   8, 1 AcquisitionDate
(0008,0023) DA [20201021]                               #   8, 1 ContentDate
(0008,0030) TM [100000.65800]                           #  12, 1 StudyTime
(0008,0031) TM [100000.65800]                           #  12, 1 SeriesTime
(0008,0032) TM [100000]                                 #   6, 1 AcquisitionTime
(0008,0033) TM [100000.65800]                           #  12, 1 ContentTime
(0008,0050) SH (no value available)                     #   0, 0 AccessionNumber
(0008,0060) CS [US]                                     #   2, 1 Modality
(0008,0068) CS [FOR PRESENTATION]                       #  16, 1 PresentationIntentType
(0008,0070) LO [TESTManuFacture]                               #   8, 1 Manufacturer
(0008,0080) LO [Unknown]                                #   8, 1 InstitutionName
(0008,0090) PN (no value available)                     #   0, 0 ReferringPhysicianName
(0008,0201) SH [-0700]                                  #   6, 1 TimezoneOffsetFromUTC
(0008,1010) SH (no value available)                     #   0, 0 StationName
(0008,1030) LO (no value available)                     #   0, 0 StudyDescription
(0008,1048) PN (no value available)                     #   0, 0 PhysiciansOfRecord
(0008,1050) PN (no value available)                     #   0, 0 PerformingPhysicianName
(0008,1070) PN (no value available)                     #   0, 0 OperatorsName
(0008,1090) LO [TEST Model]                                 #   6, 1 ManufacturerModelName
(0008,1111) SQ (Sequence with explicit length #=1)      # 104, 1 ReferencedPerformedProcedureStepSequence
  (fffe,e000) na (Item with explicit length #=2)          #  96, 1 Item
    (0008,1150) UI =ModalityPerformedProcedureStepSOPClass  #  24, 1 ReferencedSOPClassUID
    (0008,1155) UI [1.2.276.0.7230010.3.1.3.16777343.11781.1603299615.347641] #  56, 1 ReferencedSOPInstanceUID
  (fffe,e00d) na (ItemDelimitationItem for re-encoding)   #   0, 0 ItemDelimitationItem
(fffe,e0dd) na (SequenceDelimitationItem for re-encod.) #   0, 0 SequenceDelimitationItem
(0008,2111) ST [Lossy JPEG]                             #  10, 1 DerivationDescription
(0008,2112) SQ (Sequence with explicit length #=1)      # 108, 1 SourceImageSequence
  (fffe,e000) na (Item with explicit length #=2)          # 100, 1 Item
    (0008,1150) UI =UltrasoundMultiframeImageStorage        #  28, 1 ReferencedSOPClassUID
    (0008,1155) UI [1.2.276.0.7230010.3.1.4.16777343.11781.1603299615.347640] #  56, 1 ReferencedSOPInstanceUID
  (fffe,e00d) na (ItemDelimitationItem for re-encoding)   #   0, 0 ItemDelimitationItem
(fffe,e0dd) na (SequenceDelimitationItem for re-encod.) #   0, 0 SequenceDelimitationItem
(0010,0010) PN (no value available)                     #   0, 0 PatientName
(0010,0020) LO [TMP_N7DHVER8]                           #  12, 1 PatientID
(0010,0030) DA (no value available)                     #   0, 0 PatientBirthDate
(0010,0040) CS (no value available)                     #   0, 0 PatientSex
(0010,1020) DS [0.0]                                    #   4, 1 PatientSize
(0010,1030) DS [0.0]                                    #   4, 1 PatientWeight
(0010,2160) SH [Unknown]                                #   8, 1 EthnicGroup
(0010,4000) LT (no value available)                     #   0, 0 PatientComments
(0018,0040) IS [28]                                     #   2, 1 CineRate
(0018,0072) DS [5.355280]                               #   8, 1 EffectiveDuration
(0018,1000) LO [292a20212101906427]                     #  18, 1 DeviceSerialNumber
(0018,1020) LO [0.0.71]                                 #   6, 1 SoftwareVersions
(0018,1023) LO [Bitmap Import]                          #  14, 1 DigitalImageFormatAcquired
(0018,1030) LO [Free Flow]                              #  10, 1 ProtocolName
(0018,1063) DS [35.230000]                              #  10, 1 FrameTime
(0018,5010) LO [TORSO\\]                                #   8, 3 TransducerData
(0018,5020) LO [CARD_ADULT_GEN_CV]                      #  18, 1 ProcessingFunction
(0018,6011) SQ (Sequence with explicit length #=1)      # 140, 1 SequenceOfUltrasoundRegions
  (fffe,e000) na (Item with explicit length #=11)         # 132, 1 Item
    (0018,6012) US 1                                        #   2, 1 RegionSpatialFormat
    (0018,6014) US 1                                        #   2, 1 RegionDataType
    (0018,6016) UL 2                                        #   4, 1 RegionFlags
    (0018,6018) UL 170                                      #   4, 1 RegionLocationMinX0
    (0018,601a) UL 52                                       #   4, 1 RegionLocationMinY0
    (0018,601c) UL 1109                                     #   4, 1 RegionLocationMaxX1
    (0018,601e) UL 719                                      #   4, 1 RegionLocationMaxY1
    (0018,6024) US 3                                        #   2, 1 PhysicalUnitsXDirection
    (0018,6026) US 3                                        #   2, 1 PhysicalUnitsYDirection
    (0018,602c) FD 0.023955872                              #   8, 1 PhysicalDeltaX
    (0018,602e) FD 0.023952095                              #   8, 1 PhysicalDeltaY
  (fffe,e00d) na (ItemDelimitationItem for re-encoding)   #   0, 0 ItemDelimitationItem
(fffe,e0dd) na (SequenceDelimitationItem for re-encod.) #   0, 0 SequenceDelimitationItem
(0020,000d) UI [1.2.276.0.7230010.3.1.2.16777343.11781.1603299615.347638] #  56, 1 StudyInstanceUID
(0020,000e) UI [1.2.276.0.7230010.3.1.3.16777343.11781.1603299615.347639] #  56, 1 SeriesInstanceUID
(0020,0010) SH [8XNDEEV4NHZC23XZ]                       #  16, 1 StudyID
(0020,0011) IS [1]                                      #   2, 1 SeriesNumber
(0020,0013) IS [1]                                      #   2, 1 InstanceNumber
(0020,0020) CS [A\P]                                    #   4, 2 PatientOrientation
(0028,0002) US 3                                        #   2, 1 SamplesPerPixel
(0028,0004) CS [YBR_FULL_422]                           #  12, 1 PhotometricInterpretation
(0028,0006) US 0                                        #   2, 1 PlanarConfiguration
(0028,0008) IS [152]                                    #   4, 1 NumberOfFrames
(0028,0009) AT (0018,1063)                              #   4, 1 FrameIncrementPointer
(0028,0010) US 720                                      #   2, 1 Rows
(0028,0011) US 1280                                     #   2, 1 Columns
(0028,0014) US 1                                        #   2, 1 UltrasoundColorDataPresent
(0028,0100) US 8                                        #   2, 1 BitsAllocated
(0028,0101) US 8                                        #   2, 1 BitsStored
(0028,0102) US 7                                        #   2, 1 HighBit
(0028,0103) US 0                                        #   2, 1 PixelRepresentation
(0028,0301) CS [YES]                                    #   4, 1 BurnedInAnnotation
(0028,2110) CS [01]                                     #   2, 1 LossyImageCompression
(0028,2112) DS [25.232]                                 #   6, 1 LossyImageCompressionRatio
(0028,2114) CS [ISO_10918_1]                            #  12, 1 LossyImageCompressionMethod
(0032,1032) PN (no value available)                     #   0, 0 RequestingPhysician
(0040,0244) DA [20201021]                               #   8, 1 PerformedProcedureStepStartDate
(0040,0245) TM [100000.65800]                           #  12, 1 PerformedProcedureStepStartTime
(0040,0253) SH [20201021.100000]                        #  16, 1 PerformedProcedureStepID
(0040,0254) LO (no value available)                     #   0, 0 PerformedProcedureStepDescription
(0040,0280) ST [Adult Echo]                             #  10, 1 CommentsOnThePerformedProcedureStep
(2050,0020) CS [IDENTITY]                               #   8, 1 PresentationLUTShape
(7fe0,0010) OB (PixelSequence #=153)                    # u/l, 1 PixelData
  (fffe,e000) pi 00\00\00\00                              #   4, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 131804, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 119690, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 113716, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 111160, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 110070, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109742, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109228, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109248, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109232, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109146, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 108890, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109224, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109082, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109512, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109268, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109608, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109278, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109358, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109072, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109354, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109522, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109260, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109056, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109388, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109346, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109396, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109058, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109302, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109422, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109346, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109244, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109396, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109352, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109344, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109304, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109294, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109110, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109160, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109272, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109596, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109816, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109570, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109424, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109320, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109172, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109244, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109142, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109414, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109386, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109392, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109188, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109168, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109274, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109316, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109166, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109364, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109506, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109278, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109292, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109506, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109356, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109198, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 108946, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109270, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109220, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109342, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109440, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109130, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109508, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109256, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109172, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109214, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109296, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109224, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109482, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109250, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109246, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 108966, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109278, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109202, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109446, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109484, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109304, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109428, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109440, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109342, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109076, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109208, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109280, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109260, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109140, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109152, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 108998, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109254, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109428, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109484, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109374, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109286, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109544, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109554, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109296, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109402, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109360, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109270, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109430, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109454, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109580, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109402, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109236, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109418, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109430, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109458, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109172, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109182, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109348, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109308, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109342, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109288, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109332, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109254, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109246, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109308, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109278, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109212, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109392, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109622, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109406, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109498, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109408, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109586, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109528, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109468, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109542, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109234, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109310, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109536, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109398, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109482, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109420, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109276, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109146, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109148, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109318, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109156, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109118, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109218, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109128, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109334, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109222, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109072, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109194, 1 Item
  (fffe,e000) pi ff\d8\ff\e0\00\10\4a\46\49\46\00\01\01\00\00\01\00\01\00\00\ff\db... # 109210, 1 Item
(fffe,e0dd) na (SequenceDelimitationItem)               #   0, 0 SequenceDelimitationItem

Below is a code snippet for making JPEG Encoding for each RGB Raw data(1280x720x3 is a single frame size).

Below is my JPEG encoding Codec configuration.

Code: Select all

  E_TransferSyntax opt_oxfer = EXS_JPEGProcess1;
    OFCmdUnsignedInt opt_selection_value = 6;
    OFCmdUnsignedInt opt_point_transform = 0;
    OFCmdUnsignedInt opt_quality = JPEG_LOSSY_QUALITY;
    OFBool           opt_huffmanOptimize = OFTrue;
    int              opt_smoothing = 0;
    int              opt_compressedBits = 0; // 0=auto, 8/12/16=force
    E_CompressionColorSpaceConversion opt_compCSconversion = ECC_lossyRGB;
    E_DecompressionColorSpaceConversion opt_decompCSconversion = EDC_lossyOnly;
    E_SubSampling    opt_sampleFactors = ESS_444;
    OFBool           opt_useYBR422 = OFFalse;
    Uint32           opt_fragmentSize = 0; // 0=unlimited
    OFBool           opt_createOffsetTable = OFTrue;
    size_t              opt_windowType = 0;  /* default: no windowing; 1=Wi, 2=Wl, 3=Wm, 4=Wh, 5=Ww, 6=Wn, 7=Wr */
    OFCmdUnsignedInt opt_windowParameter = 0;
    OFCmdFloat       opt_windowCenter=0.0, opt_windowWidth=0.0;
    E_UIDCreation    opt_uidcreation = EUC_default;
    OFBool           opt_secondarycapture = OFFalse;
    OFCmdUnsignedInt opt_roiLeft = 0, opt_roiTop = 0, opt_roiWidth = 0, opt_roiHeight = 0;
    OFBool           opt_usePixelValues = OFTrue;
    OFBool           opt_useModalityRescale = OFFalse;
    OFBool           opt_trueLossless = OFFalse;
Below is the code for doing encoding.

Code: Select all

Uint16 samplesPerPixel = 3;
        EP_Interpretation interpr = EPI_RGB;
        LOGI("File Open pointer");
        /* determine filesize */
        const size_t fileSize = OFStandard::getFileSize(fileInput);
        //size_t buflen = fileSize;
        LOGI("Raw file size is %ld",fileSize);

        //OFCondition fileCreationResult;
        size_t mFrameNumber=fileSize/(mUintWidth*mUintHeight*samplesPerPixel);
       size_t mSizeFrame=mUintWidth*mUintHeight*samplesPerPixel;

        // create initial pixel sequence with empty offset table
        DcmPixelSequence *pixelSequence = nullptr;
        DcmPixelItem *offsetTable = nullptr;
        LOGI("JPEG step 1");
        if (result.good())
        {
            pixelSequence = new DcmPixelSequence(DcmTag(DCM_PixelData,EVR_OB));
            if (pixelSequence == nullptr)
            {
                result = EC_MemoryExhausted;
            }
            else
            {
                // create empty offset table
                offsetTable = new DcmPixelItem(DcmTag(DCM_Item,EVR_OB));
                if (offsetTable == nullptr) result = EC_MemoryExhausted;
                else pixelSequence->insert(offsetTable);
            }
        }



        DJ_RPLossy mLossyParams(JPEG_LOSSY_QUALITY);
        const DcmRepresentationParameter * mDcmRef=&mLossyParams;
        DcmRLEEncoderRegistration::registerCodecs(); // Run length encoding encoder
        DJEncoderRegistration::registerCodecs();  // JPEG encoder
        DJLSEncoderRegistration::registerCodecs(); // JPEG-LS codec
        DJ_RPLossless params; // codec parameters, we use the defaults
        unsigned long compressedSize = 0;
        double compressionRatio = 0.0; // initialize if something goes wrong
        double uncompressedSize =mSizeFrame*mFrameNumber;
        // JPEG Lossy (8 bit)
        // main loop for compression: compress each frame
        for(int i=0;i<mFrameNumber;i++)
        {
            Uint8 *image_buffer;
            image_buffer = (Uint8 *) malloc (mSizeFrame);
            DcmOffsetList offsetList;

            if(image_buffer!= nullptr)
            {
                bool isReadDone= true;

                /* read binary file into the buffer */
                if (fread(image_buffer, 1, OFstatic_cast(size_t, mSizeFrame), fileOpen) != mSizeFrame)
                {
                    LOGI("error reading binary data file:");
                    isReadDone=false;
                }

                if(isReadDone)
                {
                    DJ_RPLossy rp_lossy(JPEG_LOSSY_QUALITY);
                    //Main
                    //const Uint8 *framePointer = OFreinterpret_cast(const Uint8 *, image_buffer);

                    const DcmCodecParameter *codecParameter;
                    // assume we can cast the codecparameter to what we need
                    auto *djcp =new DJCodecParameter(opt_compCSconversion,
                                                                 opt_decompCSconversion,
                                                                 opt_uidcreation,
                                                                 EPC_default,
                                                                 OFFalse,
                                                                 OFFalse,
                                                                 OFFalse,
                                                                 opt_huffmanOptimize,
                                                                 opt_smoothing,
                                                                 0,
                                                                 opt_fragmentSize,
                                                                 opt_createOffsetTable,
                                                                 opt_sampleFactors,
                                                                 opt_useYBR422,
                                                                 opt_secondarycapture,
                                                                 opt_windowType,
                                                                 opt_windowParameter,
                                                                 opt_windowCenter,
                                                                 opt_windowWidth,
                                                                 opt_roiLeft,
                                                                 opt_roiTop,
                                                                 opt_roiWidth,
                                                                 opt_roiHeight,
                                                                 opt_usePixelValues,
                                                                 opt_useModalityRescale,
                                                                 OFFalse,
                                                                 OFFalse,
                                                                 opt_trueLossless);

                    DJEncoder *jpeg = new DJCompressIJG8Bit(*djcp, EJM_baseline, OFstatic_cast(Uint8, JPEG_LOSSY_QUALITY));
                    // create encoder corresponding to bit depth (8 or 16 bit)

                    Uint8 *jpegData = nullptr;
                    Uint32 jpegLen  = 0;

                    if (jpeg)
                    {
                            //LOGI("JPEG step 2");
                            jpeg->encode(mUintWidth, mUintHeight, interpr, samplesPerPixel,image_buffer,jpegData, jpegLen);
                            //LOGI("JPEG step 2 DONE");
                            if (jpegLen == 0)
                            {
                                LOGE("True lossless encoder: Error encoding frame");
                                result = EC_CannotChangeRepresentation;
                            }
                            else
                            {
                                result = pixelSequence->storeCompressedFrame(offsetList, jpegData, jpegLen, djcp->getFragmentSize());
                                //LOGI("JPEG Data Size %d",jpegLen);
                            }
                            //LOGI("JPEG Encoder DONE");

                            delete[] jpegData;
                            compressedSize += jpegLen;
                    }
                    else
                    {
                        result = EC_MemoryExhausted;
                        LOGI("Unable to find DJCodecEncoder");
                    }


                    // store pixel sequence if everything was successful
                    if (result.good())
                    {
                       // LOGI("Good PixelSequence");
                    }
                    else
                    {
                        delete pixelSequence;
                        pixelSequence = nullptr;
                    }

                    if ((result.good()) && (djcp->getCreateOffsetTable()))
                    {
                        // create offset table
                        result = offsetTable->createOffsetTable(offsetList);
                    }

                }

            }
            free(image_buffer);
            fseek(fileOpen,mSizeFrame * (i + 1),SEEK_SET);


        }

        if (compressedSize > 0) {
            compressionRatio = OFstatic_cast(double, uncompressedSize) / OFstatic_cast(double, compressedSize);
        }

        DcmRLEEncoderRegistration::cleanup(); // Run length encoding encoder
        DJEncoderRegistration::cleanup();  // deregister JPEG codecs
        DJLSEncoderRegistration::cleanup(); // JPEG-LS codec

        // insert pixel data attribute incorporating pixel sequence into dataset
        DcmPixelData *pixelData = new DcmPixelData(DCM_PixelData);

        /* tell pixel data element that this is the original presentation of the pixel data
         * pixel data and how it compressed
        */
        pixelData->putOriginalRepresentation(EXS_JPEGProcess1, mDcmRef, pixelSequence);
        result = dataset->insert(pixelData);
        if (result.bad())
        {
            LOGI("Unable to insert pixel data");
            delete pixelData;
            pixelData = nullptr; // also deletes contained pixel sequence
        }

        // update lossy compression ratio
        if (result.good()){
                //updateLossyCompressionRatio(OFreinterpret_cast(DcmItem*, dataset), compressionRatio);
            if (dataset == nullptr) {
                result=EC_IllegalCall;
            }

            // set Lossy Image Compression to "01" (see DICOM part 3, C.7.6.1.1.5)
            result = dataset->putAndInsertString(DCM_LossyImageCompression, "01");
            if (result.bad()) {
                result=result;
            }

            // set Lossy Image Compression Ratio
            OFString s;
            const char *oldRatio = nullptr;
            if ((dataset->findAndGetString(DCM_LossyImageCompressionRatio, oldRatio)).good() && oldRatio)
            {
                s = oldRatio;
                s += "\\";
            }

            char buf[64];
            OFStandard::ftoa(buf, sizeof(buf), compressionRatio, OFStandard::ftoa_uppercase, 0, 5);
            s += buf;
            //appendCompressionRatio(s, ratio);

            result = dataset->putAndInsertString(DCM_LossyImageCompressionRatio, s.c_str());
            if (result.bad()){

            }

            // count VM of lossy image compression ratio
            size_t i;
            size_t s_vm = 0;
            size_t s_sz = s.size();
            for (i = 0; i < s_sz; ++i)
                if (s[i] == '\\') ++s_vm;

            // set Lossy Image Compression Method
            const char *oldMethod = nullptr;
            OFString m;
            if ((dataset->findAndGetString(DCM_LossyImageCompressionMethod, oldMethod)).good() && oldMethod)
            {
                m = oldMethod;
                m += "\\";
            }

            // count VM of lossy image compression method
            size_t m_vm = 0;
            size_t m_sz = m.size();
            for (i = 0; i < m_sz; ++i)
                if (m[i] == '\\') ++m_vm;

            // make sure that VM of Compression Method is not smaller than  VM of Compression Ratio
            while (m_vm++ < s_vm) m += "\\";

            m += "ISO_10918_1";
            dataset->putAndInsertString(DCM_LossyImageCompressionMethod, m.c_str());
        }

        fclose(fileOpen);

        OFCondition status;
        // check if everything went well
        if (dataset->canWriteXfer(EXS_JPEGProcess1))
        {
            // force the meta-header UIDs to be re-generated when storing the file
            // since the UIDs in the data set may have changed
            // store in lossless JPEG format
            status=fileformat.saveFile(filePathC, EXS_JPEGProcess1);
        }else{
            LOGI("Unable to encode dataset with desired transfer syntax");
        }
I am clueless why this https://www.fujifilm.com/products/medical/synapse/ Dicom viewer is not able to play the MJPEG while other Dicom viewers are working fine.

NOTE: I don't have direct access to the synapse and due to that I am not able to do much experiment immediately

Any help in the right direction with be appreciated.

J. Riesmeier
DCMTK Developer
Posts: 2496
Joined: Tue, 2011-05-03, 14:38
Location: Oldenburg, Germany
Contact:

Re: Generate MJPEG UltrasoundMultiframeImageStorag does not work with synapse dicom viewer

#2 Post by J. Riesmeier »

The Basic Offset Table is too short:

Code: Select all

(7fe0,0010) OB (PixelSequence #=153)                    # u/l, 1 PixelData
  (fffe,e000) pi 00\00\00\00                              #   4, 1 Item
  [...]
The first item of the Pixel Data sequence should either be empty or contain the offset of each frame (in your case this item should contain 152 * 4 bytes = 608 bytes).

himanshu.mistri
Posts: 18
Joined: Tue, 2018-06-05, 10:21

Re: Generate MJPEG UltrasoundMultiframeImageStorag does not work with synapse dicom viewer

#3 Post by himanshu.mistri »

Thanks a lot @ J. Riesmeier .

Your help make this works.

Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot], Google [Bot], Majestic-12 [Bot] and 1 guest