Skip to content

Commit 55015e3

Browse files
committed
mpegts: parse Opus channel configuration (bluenviron/mediamtx#5002)
1 parent 0e84720 commit 55015e3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+621
-120
lines changed

pkg/formats/mpegts/codecs/opus.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package codecs
22

3+
import "github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts/substructs"
4+
35
// Opus is a Opus codec.
46
// Specification: ETSI TS Opus 0.1.3-draft
57
type Opus struct {
8+
Desc *substructs.OpusAudioDescriptor
9+
10+
// Deprecated: use Desc instead.
611
ChannelCount int
712
}
813

pkg/formats/mpegts/reader.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg1audio"
1414
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg4audio"
1515
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts/codecs"
16+
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts/substructs"
1617
"github.com/bluenviron/mediacommon/v2/pkg/rewindablereader"
1718
)
1819

@@ -68,8 +69,8 @@ func findPMT(dem *robustDemuxer) (*astits.PMTData, error) {
6869
func readMetadataAUWrapper(in []byte) ([]byte, error) {
6970
expectedSeqNum := 0
7071

71-
var au metadataAUCell
72-
n, err := au.unmarshal(in)
72+
var au substructs.MetadataAUCell
73+
n, err := au.Unmarshal(in)
7374
if err != nil {
7475
return nil, err
7576
}
@@ -96,7 +97,7 @@ func readMetadataAUWrapper(in []byte) ([]byte, error) {
9697

9798
for {
9899
var n2 int
99-
n2, err = au.unmarshal(in[n:])
100+
n2, err = au.Unmarshal(in[n:])
100101
if err != nil {
101102
return nil, err
102103
}
@@ -156,14 +157,14 @@ func writeMetadataAUWrapper(in []byte) ([]byte, error) {
156157
fragmentIndication = 0b00
157158
}
158159

159-
n2, err := metadataAUCell{
160+
n2, err := substructs.MetadataAUCell{
160161
MetadataServiceID: 0,
161162
SequenceNumber: uint8(i),
162163
CellFragmentIndication: fragmentIndication,
163164
DecoderConfigFlag: false,
164165
RandomAccessIndicator: true,
165166
AUCellData: cellData,
166-
}.marshalTo(out[n:])
167+
}.MarshalTo(out[n:])
167168
if err != nil {
168169
return nil, err
169170
}
@@ -311,8 +312,8 @@ func (r *Reader) OnDataOpus(track *Track, cb ReaderOnDataOpusFunc) {
311312
var packets [][]byte
312313

313314
for {
314-
var au opusAccessUnit
315-
n, err := au.unmarshal(data[pos:])
315+
var au substructs.OpusAccessUnit
316+
n, err := au.Unmarshal(data[pos:])
316317
if err != nil {
317318
r.onDecodeError(err)
318319
return nil

pkg/formats/mpegts/reader_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/bluenviron/mediacommon/v2/pkg/codecs/h265"
1515
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg4audio"
1616
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts/codecs"
17+
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts/substructs"
1718
)
1819

1920
var testH265SPS = []byte{
@@ -370,6 +371,9 @@ var casesReadWriter = []struct {
370371
&Track{
371372
PID: 257,
372373
Codec: &codecs.Opus{
374+
Desc: &substructs.OpusAudioDescriptor{
375+
ChannelConfigCode: 2,
376+
},
373377
ChannelCount: 2,
374378
},
375379
},

pkg/formats/mpegts/metadata_au_cell.go renamed to pkg/formats/mpegts/substructs/metadata_au_cell.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package mpegts
1+
// Package substructs contains MPEG-TS substructures.
2+
package substructs
23

34
import "fmt"
45

5-
// metadataAUCell is a metadata_AU_cell.
6+
// MetadataAUCell is a metadata_AU_cell.
67
// Specification: ISO 13818-1, table 2-97
7-
type metadataAUCell struct {
8+
type MetadataAUCell struct {
89
MetadataServiceID uint8
910
SequenceNumber uint8
1011
CellFragmentIndication uint8
@@ -13,7 +14,8 @@ type metadataAUCell struct {
1314
AUCellData []byte
1415
}
1516

16-
func (c *metadataAUCell) unmarshal(buf []byte) (int, error) {
17+
// Unmarshal decodes a MetadataAUCell.
18+
func (c *MetadataAUCell) Unmarshal(buf []byte) (int, error) {
1719
if len(buf) < 5 {
1820
return 0, fmt.Errorf("buffer is too small")
1921
}
@@ -42,17 +44,18 @@ func (c *metadataAUCell) unmarshal(buf []byte) (int, error) {
4244
return n, nil
4345
}
4446

45-
func (c metadataAUCell) marshalSize() int {
47+
func (c MetadataAUCell) marshalSize() int {
4648
return 5 + len(c.AUCellData)
4749
}
4850

49-
func (c metadataAUCell) marshal() ([]byte, error) {
51+
func (c MetadataAUCell) marshal() ([]byte, error) {
5052
buf := make([]byte, c.marshalSize())
51-
_, err := c.marshalTo(buf)
53+
_, err := c.MarshalTo(buf)
5254
return buf, err
5355
}
5456

55-
func (c metadataAUCell) marshalTo(buf []byte) (int, error) {
57+
// MarshalTo marshals a MetadataAUCell to a buffer.
58+
func (c MetadataAUCell) MarshalTo(buf []byte) (int, error) {
5659
n := 0
5760

5861
buf[n] = c.MetadataServiceID

pkg/formats/mpegts/metadata_au_cell_test.go renamed to pkg/formats/mpegts/substructs/metadata_au_cell_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mpegts
1+
package substructs
22

33
import (
44
"testing"
@@ -8,12 +8,12 @@ import (
88

99
var casesMetadataAUCell = []struct {
1010
name string
11-
dec metadataAUCell
11+
dec MetadataAUCell
1212
enc []byte
1313
}{
1414
{
1515
"a",
16-
metadataAUCell{
16+
MetadataAUCell{
1717
MetadataServiceID: 15,
1818
SequenceNumber: 18,
1919
CellFragmentIndication: 3,
@@ -28,8 +28,8 @@ var casesMetadataAUCell = []struct {
2828
func TestMetadataAUCellUnmarshal(t *testing.T) {
2929
for _, ca := range casesMetadataAUCell {
3030
t.Run(ca.name, func(t *testing.T) {
31-
var h metadataAUCell
32-
n, err := h.unmarshal(ca.enc)
31+
var h MetadataAUCell
32+
n, err := h.Unmarshal(ca.enc)
3333
require.NoError(t, err)
3434
require.Equal(t, n, len(ca.enc))
3535
require.Equal(t, ca.dec, h)
@@ -49,8 +49,8 @@ func TestMetadataAUCellMarshal(t *testing.T) {
4949

5050
func FuzzMetadataAUCell(f *testing.F) {
5151
f.Fuzz(func(t *testing.T, buf []byte) {
52-
var c metadataAUCell
53-
_, err := c.unmarshal(buf)
52+
var c MetadataAUCell
53+
_, err := c.Unmarshal(buf)
5454
if err != nil {
5555
return
5656
}

pkg/formats/mpegts/metadata_descriptor.go renamed to pkg/formats/mpegts/substructs/metadata_descriptor.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package mpegts
1+
package substructs
22

33
import "fmt"
44

55
// ISO 13818-1, table 2-45
66
const (
7-
descriptorTagMetadata = 0x26
7+
DescriptorTagMetadata = 0x26
88
)
99

1010
func flagToByte(v bool) byte {
@@ -14,9 +14,9 @@ func flagToByte(v bool) byte {
1414
return 0
1515
}
1616

17-
// metadataDescriptor is a metadata_descriptor.
17+
// MetadataDescriptor is a metadata_descriptor.
1818
// Specification: ISO 13818-1, table 2-86
19-
type metadataDescriptor struct {
19+
type MetadataDescriptor struct {
2020
MetadataApplicationFormat uint16
2121

2222
// metadata_application_format == 0xFFFF
@@ -46,7 +46,8 @@ type metadataDescriptor struct {
4646
PrivateData []uint8
4747
}
4848

49-
func (d *metadataDescriptor) unmarshal(buf []byte) error {
49+
// Unmarshal decodes a MetadataDescriptor.
50+
func (d *MetadataDescriptor) Unmarshal(buf []byte) error {
5051
n := 0
5152

5253
if len(buf[n:]) < 2 {
@@ -157,7 +158,7 @@ func (d *metadataDescriptor) unmarshal(buf []byte) error {
157158
return nil
158159
}
159160

160-
func (d metadataDescriptor) marshalSize() int {
161+
func (d MetadataDescriptor) marshalSize() int {
161162
v := 5
162163

163164
if d.MetadataApplicationFormat == 0xFFFF {
@@ -191,7 +192,8 @@ func (d metadataDescriptor) marshalSize() int {
191192
return v
192193
}
193194

194-
func (d metadataDescriptor) marshal() ([]byte, error) {
195+
// Marshal marshals a MetadataDescriptor to a byte slice.
196+
func (d MetadataDescriptor) Marshal() ([]byte, error) {
195197
buf := make([]byte, d.marshalSize())
196198
n := 0
197199

pkg/formats/mpegts/metadata_descriptor_test.go renamed to pkg/formats/mpegts/substructs/metadata_descriptor_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mpegts
1+
package substructs
22

33
import (
44
"testing"
@@ -8,12 +8,12 @@ import (
88

99
var casesMetadataDescriptor = []struct {
1010
name string
11-
dec metadataDescriptor
11+
dec MetadataDescriptor
1212
enc []byte
1313
}{
1414
{
1515
"a",
16-
metadataDescriptor{
16+
MetadataDescriptor{
1717
MetadataApplicationFormat: 0xFFFF,
1818
MetadataApplicationFormatIdentifier: 893234,
1919
MetadataFormat: 23,
@@ -31,8 +31,8 @@ var casesMetadataDescriptor = []struct {
3131
func TestMetadataDescriptorUnmarshal(t *testing.T) {
3232
for _, ca := range casesMetadataDescriptor {
3333
t.Run(ca.name, func(t *testing.T) {
34-
var h metadataDescriptor
35-
err := h.unmarshal(ca.enc)
34+
var h MetadataDescriptor
35+
err := h.Unmarshal(ca.enc)
3636
require.NoError(t, err)
3737
require.Equal(t, ca.dec, h)
3838
})
@@ -42,7 +42,7 @@ func TestMetadataDescriptorUnmarshal(t *testing.T) {
4242
func TestMetadataDescriptorMarshal(t *testing.T) {
4343
for _, ca := range casesMetadataDescriptor {
4444
t.Run(ca.name, func(t *testing.T) {
45-
buf, err := ca.dec.marshal()
45+
buf, err := ca.dec.Marshal()
4646
require.NoError(t, err)
4747
require.Equal(t, ca.enc, buf)
4848
})
@@ -51,13 +51,13 @@ func TestMetadataDescriptorMarshal(t *testing.T) {
5151

5252
func FuzzMetadataDescriptor(f *testing.F) {
5353
f.Fuzz(func(t *testing.T, buf []byte) {
54-
var dm metadataDescriptor
55-
err := dm.unmarshal(buf)
54+
var dm MetadataDescriptor
55+
err := dm.Unmarshal(buf)
5656
if err != nil {
5757
return
5858
}
5959

60-
_, err = dm.marshal()
60+
_, err = dm.Marshal()
6161
require.NoError(t, err)
6262
})
6363
}

pkg/formats/mpegts/metadata_std_descriptor.go renamed to pkg/formats/mpegts/substructs/metadata_std_descriptor.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
package mpegts
1+
package substructs
22

33
import "fmt"
44

55
// ISO 13818-1, table 2-45
66
const (
7-
descriptorTagMetadataSTD = 0x27
7+
DescriptorTagMetadataSTD = 0x27
88
)
99

10-
// metadataSTDDescriptor is a metadata_std_descriptor.
10+
// MetadataSTDDescriptor is a metadata_std_descriptor.
1111
// Specification: ISO 13818-1, table 2-88
12-
type metadataSTDDescriptor struct {
12+
type MetadataSTDDescriptor struct {
1313
MetadataInputLeakRate uint32
1414
MetadataBufferSize uint32
1515
MetadataOutputLeakRate uint32
1616
}
1717

18-
func (d *metadataSTDDescriptor) unmarshal(buf []byte) error {
18+
// Unmarshal decodes a MetadataSTDDescriptor.
19+
func (d *MetadataSTDDescriptor) Unmarshal(buf []byte) error {
1920
if len(buf) < 9 {
2021
return fmt.Errorf("buffer is too small")
2122
}
@@ -38,11 +39,12 @@ func (d *metadataSTDDescriptor) unmarshal(buf []byte) error {
3839
return nil
3940
}
4041

41-
func (d metadataSTDDescriptor) marshalSize() int {
42+
func (d MetadataSTDDescriptor) marshalSize() int {
4243
return 9
4344
}
4445

45-
func (d metadataSTDDescriptor) marshal() ([]byte, error) {
46+
// Marshal encodes a MetadataSTDDescriptor.
47+
func (d MetadataSTDDescriptor) Marshal() ([]byte, error) {
4648
buf := make([]byte, d.marshalSize())
4749
n := 0
4850

pkg/formats/mpegts/metadata_std_descriptor_test.go renamed to pkg/formats/mpegts/substructs/metadata_std_descriptor_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mpegts
1+
package substructs
22

33
import (
44
"testing"
@@ -8,12 +8,12 @@ import (
88

99
var casesMetadataSTDDescriptor = []struct {
1010
name string
11-
dec metadataSTDDescriptor
11+
dec MetadataSTDDescriptor
1212
enc []byte
1313
}{
1414
{
1515
"a",
16-
metadataSTDDescriptor{
16+
MetadataSTDDescriptor{
1717
MetadataInputLeakRate: 463412,
1818
MetadataBufferSize: 834523,
1919
MetadataOutputLeakRate: 845324,
@@ -25,8 +25,8 @@ var casesMetadataSTDDescriptor = []struct {
2525
func TestMetadataSTDDescriptorUnmarshal(t *testing.T) {
2626
for _, ca := range casesMetadataSTDDescriptor {
2727
t.Run(ca.name, func(t *testing.T) {
28-
var h metadataSTDDescriptor
29-
err := h.unmarshal(ca.enc)
28+
var h MetadataSTDDescriptor
29+
err := h.Unmarshal(ca.enc)
3030
require.NoError(t, err)
3131
require.Equal(t, ca.dec, h)
3232
})
@@ -36,7 +36,7 @@ func TestMetadataSTDDescriptorUnmarshal(t *testing.T) {
3636
func TestMetadataSTDDescriptorMarshal(t *testing.T) {
3737
for _, ca := range casesMetadataSTDDescriptor {
3838
t.Run(ca.name, func(t *testing.T) {
39-
buf, err := ca.dec.marshal()
39+
buf, err := ca.dec.Marshal()
4040
require.NoError(t, err)
4141
require.Equal(t, ca.enc, buf)
4242
})
@@ -45,13 +45,13 @@ func TestMetadataSTDDescriptorMarshal(t *testing.T) {
4545

4646
func FuzzMetadataSTDDescriptor(f *testing.F) {
4747
f.Fuzz(func(t *testing.T, buf []byte) {
48-
var dm metadataSTDDescriptor
49-
err := dm.unmarshal(buf)
48+
var dm MetadataSTDDescriptor
49+
err := dm.Unmarshal(buf)
5050
if err != nil {
5151
return
5252
}
5353

54-
_, err = dm.marshal()
54+
_, err = dm.Marshal()
5555
require.NoError(t, err)
5656
})
5757
}

0 commit comments

Comments
 (0)