diff --git a/codec/h264/h264dec/cavlc.go b/codec/h264/h264dec/cavlc.go index 0dcbc64b..820ec67c 100644 --- a/codec/h264/h264dec/cavlc.go +++ b/codec/h264/h264dec/cavlc.go @@ -51,18 +51,16 @@ func parseLevelPrefix(br *bits.BitReader) (int, error) { func parseLevelInformation(br *bits.BitReader, totalCoeff, trailingOnes int) ([]int, error) { var levelVal []int var i int - if trailingOnes != 0 { - for ; i < trailingOnes; i++ { - b, err := br.ReadBits(1) - if err != nil { - return nil, fmt.Errorf("could not read trailing_ones_sign_flag, failed with error: %v", err) - } - if b == 0 { - levelVal = append(levelVal, 1) - continue - } - levelVal = append(levelVal, -1) + for ; i < trailingOnes; i++ { + b, err := br.ReadBits(1) + if err != nil { + return nil, fmt.Errorf("could not read trailing_ones_sign_flag, failed with error: %v", err) } + if b == 0 { + levelVal = append(levelVal, 1) + continue + } + levelVal = append(levelVal, -1) } var suffixLen int @@ -75,63 +73,61 @@ func parseLevelInformation(br *bits.BitReader, totalCoeff, trailingOnes int) ([] return nil, errors.New("invalid TotalCoeff and TrailingOnes combination") } - if totalCoeff-trailingOnes != 0 { - for j := 0; j < totalCoeff-trailingOnes; j++ { - levelPrefix, err := parseLevelPrefix(br) - if err != nil { - return nil, fmt.Errorf("could not parse level prefix, failed with error: %v", err) - } - - var levelSuffixSize int - switch { - case levelPrefix == 14 && suffixLen == 0: - levelSuffixSize = 4 - case levelPrefix >= 15: - levelSuffixSize = levelPrefix - 3 - default: - levelSuffixSize = suffixLen - } - - var levelSuffix int - if levelSuffixSize > 0 { - b, err := br.ReadBits(levelSuffixSize) - if err != nil { - return nil, fmt.Errorf("could not parse levelSuffix, failed with error: %v", err) - } - levelSuffix = int(b) - } else { - levelSuffix = 0 - } - - levelCode := (mini(15, levelPrefix) << uint(suffixLen)) + levelSuffix - - if levelPrefix >= 15 && suffixLen == 0 { - levelCode += 15 - } - - if levelPrefix >= 16 { - levelCode += (1 << uint(levelPrefix-3)) - 4096 - } - - if i == trailingOnes && trailingOnes < 3 { - levelCode += 2 - } - - if levelCode%2 == 0 { - levelVal = append(levelVal, (levelCode+2)>>1) - } else { - levelVal = append(levelVal, (-levelCode-1)>>1) - } - - if suffixLen == 0 { - suffixLen = 1 - } - - if absi(levelVal[i]) > (3<= 15: + levelSuffixSize = levelPrefix - 3 + default: + levelSuffixSize = suffixLen + } + + var levelSuffix int + if levelSuffixSize > 0 { + b, err := br.ReadBits(levelSuffixSize) + if err != nil { + return nil, fmt.Errorf("could not parse levelSuffix, failed with error: %v", err) + } + levelSuffix = int(b) + } else { + levelSuffix = 0 + } + + levelCode := (mini(15, levelPrefix) << uint(suffixLen)) + levelSuffix + + if levelPrefix >= 15 && suffixLen == 0 { + levelCode += 15 + } + + if levelPrefix >= 16 { + levelCode += (1 << uint(levelPrefix-3)) - 4096 + } + + if i == trailingOnes && trailingOnes < 3 { + levelCode += 2 + } + + if levelCode%2 == 0 { + levelVal = append(levelVal, (levelCode+2)>>1) + } else { + levelVal = append(levelVal, (-levelCode-1)>>1) + } + + if suffixLen == 0 { + suffixLen = 1 + } + + if absi(levelVal[i]) > (3<