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  }