mirror of https://bitbucket.org/ausocean/av.git
codec/mjpeg: removed byteStream type and its usage
This commit is contained in:
parent
f67fcd35e7
commit
7ee8fa566c
|
@ -33,6 +33,7 @@ LICENSE
|
||||||
package mjpeg
|
package mjpeg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
@ -186,20 +187,19 @@ func NewContext(d io.Writer) *Context {
|
||||||
|
|
||||||
// ParsePayload will parse an RTP/JPEG payload and append to current image.
|
// ParsePayload will parse an RTP/JPEG payload and append to current image.
|
||||||
func (c *Context) ParsePayload(p []byte, m bool) error {
|
func (c *Context) ParsePayload(p []byte, m bool) error {
|
||||||
b := newByteStream(p)
|
idx := 1 // Ignore type-specific flag (skip to index 1).
|
||||||
_ = b.get8() // Ignore type-specific flag
|
off := get24(p[idx:]) // Fragment offset (3 bytes).
|
||||||
|
t := int(p[idx+3]) // Type (1 byte).
|
||||||
off := b.get24() // Fragment offset.
|
q := p[idx+4] // Quantization value (1 byte).
|
||||||
t := b.get8() // Type.
|
width := p[idx+5] // Picture width (1 byte).
|
||||||
q := b.get8() // Quantization value.
|
height := p[idx+6] // Picture height (1 byte).
|
||||||
width := b.get8() // Picture width.
|
idx += 7
|
||||||
height := b.get8() // Picture height.
|
|
||||||
|
|
||||||
var dri int // Restart interval.
|
var dri int // Restart interval.
|
||||||
|
|
||||||
if t&0x40 != 0 {
|
if t&0x40 != 0 {
|
||||||
dri = b.get16()
|
dri = int(binary.BigEndian.Uint16(p[idx:]))
|
||||||
_ = b.get16() // Ignore restart count.
|
idx += 4 // Ignore restart count (2 bytes).
|
||||||
t &= ^0x40
|
t &= ^0x40
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,16 +213,18 @@ func (c *Context) ParsePayload(p []byte, m bool) error {
|
||||||
var qLen int
|
var qLen int
|
||||||
|
|
||||||
if q > 127 {
|
if q > 127 {
|
||||||
_ = b.get8() // Ignore first byte (reserved for future use).
|
idx++
|
||||||
prec := b.get8() // The size of coefficients.
|
prec := p[idx] // The size of coefficients (1 byte).
|
||||||
qLen = b.get16() // The length of the quantization table.
|
qLen = int(binary.BigEndian.Uint16(p[idx+1:])) // The length of the quantization table (2 bytes).
|
||||||
|
idx += 3
|
||||||
|
|
||||||
if prec != 0 {
|
if prec != 0 {
|
||||||
panic("unsupported precision")
|
panic("unsupported precision")
|
||||||
}
|
}
|
||||||
|
|
||||||
if qLen > 0 {
|
if qLen > 0 {
|
||||||
qTable = b.getBuf(qLen)
|
qTable = p[idx : idx+qLen]
|
||||||
|
idx += qLen
|
||||||
|
|
||||||
if q < 255 && c.qTablesLen[q-128] == 0 && qLen <= 128 {
|
if q < 255 && c.qTablesLen[q-128] == 0 && qLen <= 128 {
|
||||||
copy(c.qTables[q-128][:], qTable)
|
copy(c.qTables[q-128][:], qTable)
|
||||||
|
@ -244,13 +246,13 @@ func (c *Context) ParsePayload(p []byte, m bool) error {
|
||||||
if q == 0 || q > 99 {
|
if q == 0 || q > 99 {
|
||||||
return errReservedQ
|
return errReservedQ
|
||||||
}
|
}
|
||||||
qTable = defaultQTable(q)
|
qTable = defaultQTable(int(q))
|
||||||
qLen = len(qTable)
|
qLen = len(qTable)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.buf.reset()
|
c.buf.reset()
|
||||||
|
|
||||||
writeHeader(c.buf, t, width, height, qLen/64, dri, qTable)
|
writeHeader(c.buf, int(t), int(width), int(height), qLen/64, dri, qTable)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.buf.len == 0 {
|
if c.buf.len == 0 {
|
||||||
|
@ -265,10 +267,12 @@ func (c *Context) ParsePayload(p []byte, m bool) error {
|
||||||
// to determine if there are missing frames.
|
// to determine if there are missing frames.
|
||||||
|
|
||||||
// Write frame data
|
// Write frame data
|
||||||
err := b.writeTo(c.buf, b.remaining())
|
rem := len(p) - idx
|
||||||
|
_, err := c.buf.Write(p[idx : idx+rem])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not write remaining frame data to output buffer: %w", err)
|
return fmt.Errorf("could not write remaining frame data to output buffer: %w", err)
|
||||||
}
|
}
|
||||||
|
idx += rem
|
||||||
|
|
||||||
if m {
|
if m {
|
||||||
// End of image marker.
|
// End of image marker.
|
||||||
|
@ -282,6 +286,10 @@ func (c *Context) ParsePayload(p []byte, m bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func get24(p []byte) int {
|
||||||
|
return int(p[0]<<16) | int(p[1]<<8) | int(p[2])
|
||||||
|
}
|
||||||
|
|
||||||
// writeHeader writes a JPEG header to the writer w.
|
// writeHeader writes a JPEG header to the writer w.
|
||||||
func writeHeader(p *putBuffer, _type, width, height, nbqTab, dri int, qtable []byte) {
|
func writeHeader(p *putBuffer, _type, width, height, nbqTab, dri int, qtable []byte) {
|
||||||
width <<= 3
|
width <<= 3
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -72,47 +72,3 @@ func (p *putBuffer) put16At(v uint16, i int) {
|
||||||
func (p *putBuffer) reset() {
|
func (p *putBuffer) reset() {
|
||||||
p.len = 0
|
p.len = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
type byteStream struct {
|
|
||||||
bytes []byte
|
|
||||||
i int
|
|
||||||
}
|
|
||||||
|
|
||||||
func newByteStream(b []byte) *byteStream { return &byteStream{bytes: b} }
|
|
||||||
|
|
||||||
func (b *byteStream) get24() int {
|
|
||||||
v := int(b.bytes[b.i])<<16 | int(b.bytes[b.i+1])<<8 | int(b.bytes[b.i+2])
|
|
||||||
b.i += 3
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *byteStream) get8() int {
|
|
||||||
v := int(b.bytes[b.i])
|
|
||||||
b.i++
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *byteStream) get16() int {
|
|
||||||
v := int(binary.BigEndian.Uint16(b.bytes[b.i:]))
|
|
||||||
b.i += 2
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *byteStream) getBuf(n int) []byte {
|
|
||||||
v := b.bytes[b.i : b.i+n]
|
|
||||||
b.i += n
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *byteStream) remaining() int {
|
|
||||||
return len(b.bytes) - b.i
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *byteStream) writeTo(w io.Writer, n int) error {
|
|
||||||
_n, err := w.Write(b.bytes[b.i : b.i+n])
|
|
||||||
b.i += _n
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue