github.com/cnotch/ipchub@v1.1.0/av/format/amf/any.go (about) 1 // Copyright (c) 2019,CAOHONGJU All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package amf 6 7 import ( 8 "fmt" 9 "io" 10 "reflect" 11 "time" 12 ) 13 14 // Amf0 类型常量 15 const ( 16 TypeNumber = 0x00 17 TypeBoolean = 0x01 18 TypeString = 0x02 19 TypeObject = 0x03 20 TypeMovieClip = 0x04 //reserved, not supported 21 TypeNull = 0x05 22 TypeUndefined = 0x06 23 TypeReference = 0x07 24 TypeEcmaArray = 0x08 25 TypeObjectEnd = 0x09 26 TypeStrictArray = 0x0A 27 TypeDate = 0x0B 28 TypeLongString = 0x0C 29 TypeUnSupported = 0x0D 30 TypeRecordSet = 0x0E 31 TypeXMLDocument = 0x0F 32 TypeTypedObject = 0x10 33 TypeAVMplusObject = 0x11 34 TypeOriginStrictArray = 0x20 35 TypeInvalid = 0x3F 36 ) 37 38 // UndefinedValue 表示 TypeUndefined 类型存储的值 39 type UndefinedValue struct{} 40 41 // UnSupportedValue 表示 TypeUnSupported 类型存储的值 42 type UnSupportedValue struct{} 43 44 // objectEndValue 表示 TypeObjectEnd 存储的值 45 type objectEndValue struct{} 46 47 // ReadAny . 48 func ReadAny(r io.Reader) (value interface{}, err error) { 49 var buff [1]byte 50 if _, err = io.ReadFull(r, buff[:]); err != nil { 51 return 52 } 53 54 marker := buff[0] 55 switch marker { 56 case TypeNumber: 57 value, err = readNumber(r) 58 case TypeBoolean: 59 value, err = readBool(r) 60 case TypeString: 61 value, err = readUtf8(r, 2) 62 case TypeObject: 63 value, err = readObject(r) 64 case TypeNull: 65 value = nil 66 case TypeUndefined: 67 value = UndefinedValue{} 68 case TypeEcmaArray: 69 value, err = readEcmaArray(r) 70 case TypeObjectEnd: 71 value = objectEndValue{} 72 case TypeStrictArray: 73 value, err = readStrictArray(r) 74 case TypeDate: 75 value, err = readDate(r) 76 case TypeLongString: 77 value, err = readUtf8(r, 4) 78 case TypeUnSupported: 79 value = UnSupportedValue{} 80 default: 81 err = fmt.Errorf("Amf0ReadAny: unsupported marker - %d", marker) 82 } 83 return 84 } 85 86 // WriteAny . 87 func WriteAny(w io.Writer, any interface{}) (err error) { 88 if any == nil { 89 err = writeType(w, TypeNull) 90 return 91 } 92 93 switch v := any.(type) { 94 case *string: 95 if len(*v) > 65535 { 96 err = WriteLongString(w, *v) 97 } else { 98 err = WriteString(w, *v) 99 } 100 case string: 101 if len(v) > 65535 { 102 err = WriteLongString(w, v) 103 } else { 104 err = WriteString(w, v) 105 } 106 case *bool: 107 err = WriteBool(w, *v) 108 case bool: 109 err = WriteBool(w, v) 110 case *int: 111 err = WriteNumber(w, float64(*v)) 112 case int: 113 err = WriteNumber(w, float64(v)) 114 case *int8: 115 err = WriteNumber(w, float64(*v)) 116 case int8: 117 err = WriteNumber(w, float64(v)) 118 case *int16: 119 err = WriteNumber(w, float64(*v)) 120 case int16: 121 err = WriteNumber(w, float64(v)) 122 case *int32: 123 err = WriteNumber(w, float64(*v)) 124 case int32: 125 err = WriteNumber(w, float64(v)) 126 case *int64: 127 err = WriteNumber(w, float64(*v)) 128 case int64: 129 err = WriteNumber(w, float64(v)) 130 case *uint: 131 err = WriteNumber(w, float64(*v)) 132 case uint: 133 err = WriteNumber(w, float64(v)) 134 case *uint8: 135 err = WriteNumber(w, float64(*v)) 136 case uint8: 137 err = WriteNumber(w, float64(v)) 138 case *uint16: 139 err = WriteNumber(w, float64(*v)) 140 case uint16: 141 err = WriteNumber(w, float64(v)) 142 case *uint32: 143 err = WriteNumber(w, float64(*v)) 144 case uint32: 145 err = WriteNumber(w, float64(v)) 146 case *uint64: 147 err = WriteNumber(w, float64(*v)) 148 case uint64: 149 err = WriteNumber(w, float64(v)) 150 case *float32: 151 err = WriteNumber(w, float64(*v)) 152 case float32: 153 err = WriteNumber(w, float64(v)) 154 case *float64: 155 err = WriteNumber(w, *v) 156 case float64: 157 err = WriteNumber(w, v) 158 case *time.Time: 159 err = WriteDate(w, *v) 160 case time.Time: 161 err = WriteDate(w, v) 162 case *UndefinedValue: 163 err = writeType(w, TypeUndefined) 164 case UndefinedValue: 165 err = writeType(w, TypeUndefined) 166 case *EcmaArray: 167 err = WriteEcmaArray(w, *v) 168 case EcmaArray: 169 err = WriteEcmaArray(w, v) 170 case *Object: 171 err = WriteObject(w, *v) 172 case Object: 173 err = WriteObject(w, v) 174 case *StrictArray: 175 err = WriteStrictArray(w, *v) 176 case StrictArray: 177 err = WriteStrictArray(w, v) 178 default: 179 err = fmt.Errorf("Unsupported type : %v", reflect.TypeOf(v)) 180 } 181 182 return 183 }