diff --git a/codec/h264/h264dec/slice.go b/codec/h264/h264dec/slice.go index 63af7da3..6930c89c 100644 --- a/codec/h264/h264dec/slice.go +++ b/codec/h264/h264dec/slice.go @@ -58,9 +58,9 @@ func NewRefPicListModification(br *bits.BitReader, p *PPS, s *SliceHeader) (*Ref r := &RefPicListModification{} r.ModificationOfPicNums[0] = make([]int, p.NumRefIdxL0DefaultActiveMinus1+2) r.ModificationOfPicNums[1] = make([]int, p.NumRefIdxL1DefaultActiveMinus1+2) - r.AbsDiffPicNumMinus1[0] = make([]int, p.NumRefIdxL1DefaultActiveMinus1+2) + r.AbsDiffPicNumMinus1[0] = make([]int, p.NumRefIdxL0DefaultActiveMinus1+2) r.AbsDiffPicNumMinus1[1] = make([]int, p.NumRefIdxL1DefaultActiveMinus1+2) - r.LongTermPicNum[0] = make([]int, p.NumRefIdxL1DefaultActiveMinus1+2) + r.LongTermPicNum[0] = make([]int, p.NumRefIdxL0DefaultActiveMinus1+2) r.LongTermPicNum[1] = make([]int, p.NumRefIdxL1DefaultActiveMinus1+2) fr := newFieldReader(br) diff --git a/codec/h264/h264dec/slice_test.go b/codec/h264/h264dec/slice_test.go index e7988a7e..59f8314b 100644 --- a/codec/h264/h264dec/slice_test.go +++ b/codec/h264/h264dec/slice_test.go @@ -1,6 +1,12 @@ package h264dec -import "testing" +import ( + "bytes" + "reflect" + "testing" + + "bitbucket.org/ausocean/av/codec/h264/h264dec/bits" +) var subWidthCTests = []struct { in SPS @@ -47,3 +53,64 @@ func TestSubHeightC(t *testing.T) { } } } + +func TestNewRefPicListModification(t *testing.T) { + tests := []struct { + in string + s SliceHeader + p PPS + want RefPicListModification + }{ + { + in: "1" + // u(1) ref_pic_list_modification_flag_l0=true + // First modification for list0 + "1" + // ue(v) modification_of_pic_nums_idc[0][0] = 0 + "010" + // ue(v) abs_diff_pic_num_minus1[0][0] = 1 + + // Second modification for list0 + "010" + // ue(v) modification_of_pic_nums_idc[0][1] = 1 + "011" + // ue(v) abs_diff_pic_num_minus1[0][1] = 2 + + // Third modification for list0 + "011" + // ue(v) modification_of_pic_nums_idc[0][2] = 2 + "010" + // ue(v) long_term_pic_num = 1 + + // Fourth modification does not exist + "00100" + // ue(v) modification_of_pic_nums_idc[0][3] = 3 + + // Padding bits + "00", + + s: SliceHeader{ + SliceType: 3, + }, + + p: PPS{ + NumRefIdxL0DefaultActiveMinus1: 2, + }, + + want: RefPicListModification{ + RefPicListModificationFlag: [2]bool{true, false}, + ModificationOfPicNums: [2][]int{{0, 1, 2, 3}, {0, 0}}, + AbsDiffPicNumMinus1: [2][]int{{1, 2, 0, 0}, {0, 0}}, + LongTermPicNum: [2][]int{{0, 0, 1, 0}, {0, 0}}, + }, + }, + } + + for i, test := range tests { + inBytes, err := binToSlice(test.in) + if err != nil { + t.Fatalf("unexpected error %v for binToSlice in test %d", err, i) + } + + got, err := NewRefPicListModification(bits.NewBitReader(bytes.NewReader(inBytes)), &test.p, &test.s) + if err != nil { + t.Fatalf("unexpected error %v for NewRefPicListModification in test %d", err, i) + } + + if !reflect.DeepEqual(*got, test.want) { + t.Errorf("did not get expected result for test %d\nGot: %v\nWant: %v\n", i, got, test.want) + } + } +}