This repository has been archived by the owner on Nov 16, 2017. It is now read-only.
forked from gillesdemey/go-dicom
/
transfersyntax.go
70 lines (65 loc) · 2.21 KB
/
transfersyntax.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package dicomio
import (
"encoding/binary"
"fmt"
"github.com/yasushi-saito/go-dicom/dicomuid"
"v.io/x/lib/vlog"
)
// Standard list of transfer syntaxes.
var StandardTransferSyntaxes = []string{
dicomuid.ImplicitVRLittleEndian,
dicomuid.ExplicitVRLittleEndian,
dicomuid.ExplicitVRBigEndian,
dicomuid.DeflatedExplicitVRLittleEndian,
}
// CanonicalTransferSyntaxUID return the canonical transfer syntax UID (e.g.,
// dicomuid.ExplicitVRLittleEndian or dicomuid.ImplicitVRLittleEndian), given an
// UID that represents any transfer syntax. Returns an error if the uid is not
// defined in DICOM standard, or if the uid does not represent a transfer
// syntax.
//
// TODO(saito) Check the standard to see if we need to accept unknown UIDS as
// explicit little endian.
func CanonicalTransferSyntaxUID(uid string) (string, error) {
// defaults are explicit VR, little endian
switch uid {
case dicomuid.ImplicitVRLittleEndian,
dicomuid.ExplicitVRLittleEndian,
dicomuid.ExplicitVRBigEndian,
dicomuid.DeflatedExplicitVRLittleEndian:
return uid, nil
default:
e, err := dicomuid.Lookup(uid)
if err != nil {
return "", err
}
if e.Type != dicomuid.TypeTransferSyntax {
return "", fmt.Errorf("UID '%s' is not a transfer syntax (is %s)", uid, e.Type)
}
// The default is ExplicitVRLittleEndian
return dicomuid.ExplicitVRLittleEndian, nil
}
}
// Given a transfer syntax uid, return its encoding. TrasnferSyntaxUID can be
// any UID that refers to a transfer syntax. It can be, e.g., 1.2.840.10008.1.2
// (it will return LittleEndian, ImplicitVR) or 1.2.840.10008.1.2.4.54 (it will
// return (LittleEndian, ExplicitVR).
func ParseTransferSyntaxUID(uid string) (bo binary.ByteOrder, implicit IsImplicitVR, err error) {
canonical, err := CanonicalTransferSyntaxUID(uid)
if err != nil {
return nil, UnknownVR, err
}
switch canonical {
case dicomuid.ImplicitVRLittleEndian:
return binary.LittleEndian, ImplicitVR, nil
case dicomuid.DeflatedExplicitVRLittleEndian:
fallthrough
case dicomuid.ExplicitVRLittleEndian:
return binary.LittleEndian, ExplicitVR, nil
case dicomuid.ExplicitVRBigEndian:
return binary.BigEndian, ExplicitVR, nil
default:
vlog.Fatal(canonical, uid)
return binary.BigEndian, ExplicitVR, nil
}
}