From 47d0c300fc4fe1077e336f87f273e7bcbd9afe90 Mon Sep 17 00:00:00 2001 From: Saxon Date: Mon, 22 Jul 2019 12:56:37 +0930 Subject: [PATCH] codec/h264/h264dec: created RefPicListModification type with constructors and separated from SliceHeader type --- codec/h264/h264dec/slice.go | 239 ++++++++++++++++++++---------------- 1 file changed, 136 insertions(+), 103 deletions(-) diff --git a/codec/h264/h264dec/slice.go b/codec/h264/h264dec/slice.go index b25b4502..eaf0be79 100644 --- a/codec/h264/h264dec/slice.go +++ b/codec/h264/h264dec/slice.go @@ -32,51 +32,130 @@ type Slice struct { Header *SliceHeader Data *SliceData } + +// RefPicListModification provides elements of a ref_pic_list_modification syntax +// (defined in 7.3.3.1 of specifications) and a ref_pic_list_mvc_modification +// (defined in H.7.3.3.1.1 of specifications). +type RefPicListModification struct { + RefPicListModificationFlagL0 bool + ModificationOfPicNums int + AbsDiffPicNumMinus1 int + LongTermPicNum int + RefPicListModificationFlagL1 bool +} + +// TODO: need to complete this. +// NewRefPicListMVCModification parses elements of a ref_pic_list_mvc_modification +// following the syntax structure defined in section H.7.3.3.1.1, and returns as +// a new RefPicListModification. +func NewRefPicListMVCModifiation(br *bits.BitReader) (*RefPicListModification, error) { + return nil, nil +} + +// NewRefPicListModification parses elements of a ref_pic_list_modification +// following the syntax structure defined in section 7.3.3.1, and returns as +// a new RefPicListModification. +func NewRefPicListModification(br *bits.BitReader, h *SliceHeader) (*RefPicListModification, error) { + r := &RefPicListModification{} + // 7.3.3.1 + if h.SliceType%5 != 2 && h.SliceType%5 != 4 { + b, err := br.ReadBits(1) + if err != nil { + return nil, errors.Wrap(err, "could not read RefPicListModificationFlagL0") + } + r.RefPicListModificationFlagL0 = b == 1 + + if r.RefPicListModificationFlagL0 { + for r.ModificationOfPicNums != 3 { + r.ModificationOfPicNums, err = readUe(br) + if err != nil { + return nil, errors.Wrap(err, "could not parse ModificationOfPicNums") + } + + if r.ModificationOfPicNums == 0 || r.ModificationOfPicNums == 1 { + r.AbsDiffPicNumMinus1, err = readUe(br) + if err != nil { + return nil, errors.Wrap(err, "could not parse AbsDiffPicNumMinus1") + } + } else if r.ModificationOfPicNums == 2 { + r.LongTermPicNum, err = readUe(br) + if err != nil { + return nil, errors.Wrap(err, "could not parse LongTermPicNum") + } + } + } + } + + } + if h.SliceType%5 == 1 { + b, err := br.ReadBits(1) + if err != nil { + return nil, errors.Wrap(err, "could not read RefPicListModificationFlagL1") + } + r.RefPicListModificationFlagL1 = b == 1 + + if r.RefPicListModificationFlagL1 { + for r.ModificationOfPicNums != 3 { + r.ModificationOfPicNums, err = readUe(br) + if err != nil { + return nil, errors.Wrap(err, "could not parse ModificationOfPicNums") + } + + if r.ModificationOfPicNums == 0 || r.ModificationOfPicNums == 1 { + r.AbsDiffPicNumMinus1, err = readUe(br) + if err != nil { + return nil, errors.Wrap(err, "could not parse AbsDiffPicNumMinus1") + } + } else if r.ModificationOfPicNums == 2 { + r.LongTermPicNum, err = readUe(br) + if err != nil { + return nil, errors.Wrap(err, "could not parse LongTermPicNum") + } + } + } + } + } + // refPicListModification() + return nil, nil +} + type SliceHeader struct { - FirstMbInSlice int - SliceType int - PPSID int - ColorPlaneID int - FrameNum int - FieldPic bool - BottomField bool - IDRPicID int - PicOrderCntLsb int - DeltaPicOrderCntBottom int - DeltaPicOrderCnt []int - RedundantPicCnt int - DirectSpatialMvPred bool - NumRefIdxActiveOverride bool - NumRefIdxL0ActiveMinus1 int - NumRefIdxL1ActiveMinus1 int - CabacInit int - SliceQpDelta int - SpForSwitch bool - SliceQsDelta int - DisableDeblockingFilter int - SliceAlphaC0OffsetDiv2 int - SliceBetaOffsetDiv2 int - SliceGroupChangeCycle int - RefPicListModificationFlagL0 bool - ModificationOfPicNums int - AbsDiffPicNumMinus1 int - LongTermPicNum int - RefPicListModificationFlagL1 bool - LumaLog2WeightDenom int - ChromaLog2WeightDenom int - ChromaArrayType int - LumaWeightL0Flag bool - LumaWeightL0 []int - LumaOffsetL0 []int - ChromaWeightL0Flag bool - ChromaWeightL0 [][]int - ChromaOffsetL0 [][]int - LumaWeightL1Flag bool - LumaWeightL1 []int - LumaOffsetL1 []int - ChromaWeightL1Flag bool - ChromaWeightL1 [][]int - ChromaOffsetL1 [][]int + FirstMbInSlice int + SliceType int + PPSID int + ColorPlaneID int + FrameNum int + FieldPic bool + BottomField bool + IDRPicID int + PicOrderCntLsb int + DeltaPicOrderCntBottom int + DeltaPicOrderCnt []int + RedundantPicCnt int + DirectSpatialMvPred bool + NumRefIdxActiveOverride bool + NumRefIdxL0ActiveMinus1 int + NumRefIdxL1ActiveMinus1 int + RefPicListModification *RefPicListModification + + // pred_weight_table + LumaLog2WeightDenom int + ChromaLog2WeightDenom int + ChromaArrayType int + LumaWeightL0Flag bool + LumaWeightL0 []int + LumaOffsetL0 []int + ChromaWeightL0Flag bool + ChromaWeightL0 [][]int + ChromaOffsetL0 [][]int + LumaWeightL1Flag bool + LumaWeightL1 []int + LumaOffsetL1 []int + ChromaWeightL1Flag bool + ChromaWeightL1 [][]int + ChromaOffsetL1 [][]int + + // dec_ref_pic_marking NoOutputOfPriorPicsFlag bool LongTermReferenceFlag bool AdaptiveRefPicMarkingModeFlag bool @@ -84,6 +163,15 @@ type SliceHeader struct { DifferenceOfPicNumsMinus1 int LongTermFrameIdx int MaxLongTermFrameIdxPlus1 int + + CabacInit int + SliceQpDelta int + SpForSwitch bool + SliceQsDelta int + DisableDeblockingFilter int + SliceAlphaC0OffsetDiv2 int + SliceBetaOffsetDiv2 int + SliceGroupChangeCycle int } type SliceData struct { @@ -1075,65 +1163,10 @@ func NewSliceContext(videoStream *VideoStream, nalUnit *NalUnit, rbsp []byte, sh // H.7.3.3.1.1 // refPicListMvcModifications() } else { - // 7.3.3.1 - if header.SliceType%5 != 2 && header.SliceType%5 != 4 { - b, err := br.ReadBits(1) - if err != nil { - return nil, errors.Wrap(err, "could not read RefPicListModificationFlagL0") - } - header.RefPicListModificationFlagL0 = b == 1 - - if header.RefPicListModificationFlagL0 { - for header.ModificationOfPicNums != 3 { - header.ModificationOfPicNums, err = readUe(br) - if err != nil { - return nil, errors.Wrap(err, "could not parse ModificationOfPicNums") - } - - if header.ModificationOfPicNums == 0 || header.ModificationOfPicNums == 1 { - header.AbsDiffPicNumMinus1, err = readUe(br) - if err != nil { - return nil, errors.Wrap(err, "could not parse AbsDiffPicNumMinus1") - } - } else if header.ModificationOfPicNums == 2 { - header.LongTermPicNum, err = readUe(br) - if err != nil { - return nil, errors.Wrap(err, "could not parse LongTermPicNum") - } - } - } - } - + header.RefPicListModification, err = NewRefPicListModification(br, &header) + if err != nil { + return nil, errors.Wrap(err, "could not parse RefPicListModification") } - if header.SliceType%5 == 1 { - b, err := br.ReadBits(1) - if err != nil { - return nil, errors.Wrap(err, "could not read RefPicListModificationFlagL1") - } - header.RefPicListModificationFlagL1 = b == 1 - - if header.RefPicListModificationFlagL1 { - for header.ModificationOfPicNums != 3 { - header.ModificationOfPicNums, err = readUe(br) - if err != nil { - return nil, errors.Wrap(err, "could not parse ModificationOfPicNums") - } - - if header.ModificationOfPicNums == 0 || header.ModificationOfPicNums == 1 { - header.AbsDiffPicNumMinus1, err = readUe(br) - if err != nil { - return nil, errors.Wrap(err, "could not parse AbsDiffPicNumMinus1") - } - } else if header.ModificationOfPicNums == 2 { - header.LongTermPicNum, err = readUe(br) - if err != nil { - return nil, errors.Wrap(err, "could not parse LongTermPicNum") - } - } - } - } - } - // refPicListModification() } if (pps.WeightedPred && (sliceType == "P" || sliceType == "SP")) || (pps.WeightedBipred == 1 && sliceType == "B") { @@ -1278,7 +1311,7 @@ func NewSliceContext(videoStream *VideoStream, nalUnit *NalUnit, rbsp []byte, sh } } if header.MemoryManagementControlOperation == 2 { - header.LongTermPicNum, err = readUe(br) + header.RefPicListModification.LongTermPicNum, err = readUe(br) if err != nil { return nil, errors.Wrap(err, "could not parse LongTermPicNum") }