Files
gortsplib/pkg/codecs/jpeg/define_quantization_table.go

66 lines
1.2 KiB
Go

package jpeg
import (
"fmt"
)
// QuantizationTable is a DQT quantization table.
type QuantizationTable struct {
ID uint8
Precision uint8
Data []byte
}
// DefineQuantizationTable is a DQT marker.
type DefineQuantizationTable struct {
Tables []QuantizationTable
}
// Unmarshal decodes the marker.
func (m *DefineQuantizationTable) Unmarshal(buf []byte) error {
for len(buf) != 0 {
if len(buf) < 1 {
return fmt.Errorf("image is too short")
}
id := buf[0] & 0x0F
precision := buf[0] >> 4
buf = buf[1:]
if precision != 0 {
return fmt.Errorf("Precision %d is not supported", precision)
}
if len(buf) < 64 {
return fmt.Errorf("image is too short")
}
m.Tables = append(m.Tables, QuantizationTable{
ID: id,
Precision: precision,
Data: buf[:64],
})
buf = buf[64:]
}
return nil
}
// Marshal encodes the marker.
func (m DefineQuantizationTable) Marshal(buf []byte) []byte {
buf = append(buf, []byte{0xFF, MarkerDefineQuantizationTable}...)
// length
s := 2
for _, t := range m.Tables {
s += 1 + len(t.Data)
}
buf = append(buf, []byte{byte(s >> 8), byte(s)}...)
for _, t := range m.Tables {
buf = append(buf, []byte{(t.ID)}...)
buf = append(buf, t.Data...)
}
return buf
}