github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/encoding_atenhermon.go (about) 1 package vnc2video 2 3 import ( 4 "encoding/binary" 5 "fmt" 6 ) 7 8 const ( 9 EncAtenHermonSubrect EncodingType = 0 10 EncAtenHermonRaw EncodingType = 1 11 ) 12 13 type AtenHermon struct { 14 _ [4]byte 15 AtenLength uint32 16 AtenType uint8 17 _ [1]byte 18 AtenSubrects uint32 19 AtenRawLength uint32 20 Encodings []Encoding 21 } 22 23 type AtenHermonSubrect struct { 24 A uint16 25 B uint16 26 Y uint8 27 X uint8 28 Data []byte 29 } 30 31 func (*AtenHermon) Supported(Conn) bool { 32 return false 33 } 34 35 func (*AtenHermon) Type() EncodingType { return EncAtenHermon } 36 func (*AtenHermon) Reset() error { 37 return nil 38 } 39 40 func (enc *AtenHermon) Read(c Conn, rect *Rectangle) error { 41 var pad4 [4]byte 42 43 if err := binary.Read(c, binary.BigEndian, &pad4); err != nil { 44 return err 45 } 46 47 var aten_length uint32 48 if err := binary.Read(c, binary.BigEndian, &aten_length); err != nil { 49 return err 50 } 51 enc.AtenLength = aten_length 52 53 if rect.Width == 64896 && rect.Height == 65056 { 54 if aten_length != 10 && aten_length != 0 { 55 return fmt.Errorf("screen is off and length is invalid") 56 } 57 aten_length = 0 58 } 59 60 if c.Width() != rect.Width && c.Height() != rect.Height { 61 c.SetWidth(rect.Width) 62 c.SetHeight(rect.Height) 63 } 64 65 var aten_type uint8 66 if err := binary.Read(c, binary.BigEndian, &aten_type); err != nil { 67 return err 68 } 69 enc.AtenType = aten_type 70 71 var pad1 [1]byte 72 if err := binary.Read(c, binary.BigEndian, &pad1); err != nil { 73 return err 74 } 75 76 var subrects uint32 77 if err := binary.Read(c, binary.BigEndian, &subrects); err != nil { 78 return err 79 } 80 enc.AtenSubrects = subrects 81 82 var raw_length uint32 83 if err := binary.Read(c, binary.BigEndian, &raw_length); err != nil { 84 return err 85 } 86 enc.AtenRawLength = raw_length 87 88 if aten_length != raw_length { 89 return fmt.Errorf("aten_length != raw_length, %d != %d", aten_length, raw_length) 90 } 91 92 aten_length -= 10 // skip 93 94 for aten_length > 0 { 95 switch EncodingType(aten_type) { 96 case EncAtenHermonSubrect: 97 encSR := &AtenHermonSubrect{} 98 if err := encSR.Read(c, rect); err != nil { 99 return err 100 } 101 enc.Encodings = append(enc.Encodings, encSR) 102 aten_length -= 6 + (16 * 16 * uint32(c.PixelFormat().BPP/8)) 103 case EncAtenHermonRaw: 104 encRaw := &RawEncoding{} 105 if err := encRaw.Read(c, rect); err != nil { 106 return err 107 } 108 enc.Encodings = append(enc.Encodings, encRaw) 109 aten_length -= uint32(rect.Area()) * uint32(c.PixelFormat().BPP/8) 110 default: 111 return fmt.Errorf("unknown aten hermon type %d", aten_type) 112 113 } 114 } 115 116 if aten_length < 0 { 117 return fmt.Errorf("aten_len dropped below zero") 118 } 119 return nil 120 } 121 122 func (enc *AtenHermon) Write(c Conn, rect *Rectangle) error { 123 if !enc.Supported(c) { 124 for _, ew := range enc.Encodings { 125 if err := ew.Write(c, rect); err != nil { 126 return err 127 } 128 } 129 return nil 130 } 131 var pad4 [4]byte 132 133 if err := binary.Write(c, binary.BigEndian, pad4); err != nil { 134 return err 135 } 136 137 if err := binary.Write(c, binary.BigEndian, enc.AtenLength); err != nil { 138 return err 139 } 140 141 if err := binary.Write(c, binary.BigEndian, enc.AtenType); err != nil { 142 return err 143 } 144 145 var pad1 [1]byte 146 if err := binary.Write(c, binary.BigEndian, pad1); err != nil { 147 return err 148 } 149 150 if err := binary.Write(c, binary.BigEndian, enc.AtenSubrects); err != nil { 151 return err 152 } 153 154 if err := binary.Write(c, binary.BigEndian, enc.AtenRawLength); err != nil { 155 return err 156 } 157 158 for _, ew := range enc.Encodings { 159 if err := ew.Write(c, rect); err != nil { 160 return err 161 } 162 } 163 return nil 164 } 165 166 func (*AtenHermonSubrect) Supported(Conn) bool { 167 return false 168 } 169 170 func (enc *AtenHermonSubrect) Type() EncodingType { 171 return EncAtenHermonSubrect 172 } 173 func (*AtenHermonSubrect) Reset() error { 174 return nil 175 } 176 func (enc *AtenHermonSubrect) Read(c Conn, rect *Rectangle) error { 177 if err := binary.Read(c, binary.BigEndian, &enc.A); err != nil { 178 return err 179 } 180 if err := binary.Read(c, binary.BigEndian, &enc.B); err != nil { 181 return err 182 } 183 if err := binary.Read(c, binary.BigEndian, &enc.Y); err != nil { 184 return err 185 } 186 if err := binary.Read(c, binary.BigEndian, &enc.X); err != nil { 187 return err 188 } 189 enc.Data = make([]byte, 16*16*uint32(c.PixelFormat().BPP/8)) 190 if err := binary.Read(c, binary.BigEndian, &enc.Data); err != nil { 191 return err 192 } 193 return nil 194 } 195 196 func (enc *AtenHermonSubrect) Write(c Conn, rect *Rectangle) error { 197 if !enc.Supported(c) { 198 return nil 199 } 200 if err := binary.Write(c, binary.BigEndian, enc.A); err != nil { 201 return err 202 } 203 if err := binary.Write(c, binary.BigEndian, enc.B); err != nil { 204 return err 205 } 206 if err := binary.Write(c, binary.BigEndian, enc.Y); err != nil { 207 return err 208 } 209 if err := binary.Write(c, binary.BigEndian, enc.X); err != nil { 210 return err 211 } 212 if err := binary.Write(c, binary.BigEndian, enc.Data); err != nil { 213 return err 214 } 215 return nil 216 }