diff --git a/pkg/h264/h264_test.go b/pkg/h264/h264_test.go index c366c032..8b9fb737 100644 --- a/pkg/h264/h264_test.go +++ b/pkg/h264/h264_test.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -83,3 +84,12 @@ func TestGetProfileLevelID(t *testing.T) { profile = GetProfileLevelID(s) require.Equal(t, "640029", profile) } + +func TestDecodeSPS2(t *testing.T) { + s := "6764001fad84010c20086100430802184010c200843b50740932" + b, err := hex.DecodeString(s) + require.Nil(t, err) + + sps := DecodeSPS(b) + assert.Nil(t, sps) // broken SPS? +} diff --git a/pkg/h264/sps.go b/pkg/h264/sps.go index bb5db648..71ab5b45 100644 --- a/pkg/h264/sps.go +++ b/pkg/h264/sps.go @@ -115,9 +115,14 @@ func DecodeSPS(sps []byte) *SPS { s.seq_scaling_matrix_present_flag = r.ReadBit() if s.seq_scaling_matrix_present_flag != 0 { for i := byte(0); i < n; i++ { - ssl := r.ReadBit() // seq_scaling_list_present_flag[i] - if ssl != 0 { - return nil // not implemented + //goland:noinspection GoSnakeCaseUsage + seq_scaling_list_present_flag := r.ReadBit() + if seq_scaling_list_present_flag != 0 { + if i < 6 { + s.scaling_list(r, 16) + } else { + s.scaling_list(r, 64) + } } } } @@ -209,3 +214,18 @@ func DecodeSPS(sps []byte) *SPS { return s } + +//goland:noinspection GoSnakeCaseUsage +func (s *SPS) scaling_list(r *bits.Reader, sizeOfScalingList int) { + lastScale := int32(8) + nextScale := int32(8) + for j := 0; j < sizeOfScalingList; j++ { + if nextScale != 0 { + delta_scale := r.ReadSEGolomb() + nextScale = (lastScale + delta_scale + 256) % 256 + } + if nextScale != 0 { + lastScale = nextScale + } + } +}