예제 #1
0
파일: CABAC.cs 프로젝트: billliwawa/net7mma
        private int readCoeffAbsLevel(MDecoder decoder, BlockType blockType, int numDecodAbsLevelGt1,
                                      int numDecodAbsLevelEq1)
        {
            int incB0 = ((numDecodAbsLevelGt1 != 0) ? 0 : Math.Min(4, 1 + numDecodAbsLevelEq1));
            int incBN = 5 + Math.Min(4 - blockType.coeffAbsLevelAdjust, numDecodAbsLevelGt1);

            int val, b = decoder.decodeBin(blockType.coeffAbsLevelCtxOff + incB0);

            for (val = 0; b != 0 && val < 13; val++)
            {
                b = decoder.decodeBin(blockType.coeffAbsLevelCtxOff + incBN);
            }
            val += b;

            if (val == 14)
            {
                int log = -2, add = 0, sum = 0;
                do
                {
                    log++;
                    b = decoder.decodeBinBypass();
                } while (b != 0);

                for (; log >= 0; log--)
                {
                    add |= decoder.decodeBinBypass() << log;
                    sum += 1 << log;
                }

                val += add + sum;
            }

            return(val);
        }
예제 #2
0
파일: CABAC.cs 프로젝트: billliwawa/net7mma
        public int readCoeffs(MDecoder decoder, BlockType blockType, int[] outs, int first, int num, int[] reorder,
                              int[] scMapping, int[] lscMapping)
        {
            bool [] sigCoeff = new bool[num];
            int     numCoeff;

            for (numCoeff = 0; numCoeff < num - 1; numCoeff++)
            {
                sigCoeff[numCoeff] = decoder.decodeBin(blockType.sigCoeffFlagCtxOff + scMapping[numCoeff]) == 1;
                if (sigCoeff[numCoeff] && decoder.decodeBin(blockType.lastSigCoeffCtxOff + lscMapping[numCoeff]) == 1)
                {
                    break;
                }
            }
            sigCoeff[numCoeff++] = true;

            int numGt1 = 0, numEq1 = 0;

            for (int j = numCoeff - 1; j >= 0; j--)
            {
                if (!sigCoeff[j])
                {
                    continue;
                }
                int absLev = readCoeffAbsLevel(decoder, blockType, numGt1, numEq1);
                if (absLev == 0)
                {
                    ++numEq1;
                }
                else
                {
                    ++numGt1;
                }
                outs[reorder[j + first]] = toSigned(absLev + 1, -decoder.decodeBinBypass());
            }
            // System.out.print("[");
            // for (int i = 0; i < out.length; i++)
            // System.out.print(out[i] + ",");
            // System.out.println("]");

            return(numGt1 + numEq1);
        }
예제 #3
0
파일: CABAC.cs 프로젝트: billliwawa/net7mma
        public int readMVD(MDecoder decoder, int comp, bool leftAvailable, bool topAvailable, MBType leftType,
                           MBType topType, H264Const.PartPred leftPred, H264Const.PartPred topPred, H264Const.PartPred curPred, int mbX, int partX, int partY,
                           int partW, int partH, int list)
        {
            int ctx = comp == 0 ? 40 : 47;

            int partAbsX = (mbX << 2) + partX;

            bool predEqA = leftPred != null && leftPred != H264Const.PartPred.Direct &&
                           (leftPred == H264Const.PartPred.Bi || leftPred == curPred || (curPred == H264Const.PartPred.Bi && leftPred.usesList(list)));
            bool predEqB = topPred != null && topPred != H264Const.PartPred.Direct &&
                           (topPred == H264Const.PartPred.Bi || topPred == curPred || (curPred == H264Const.PartPred.Bi && topPred.usesList(list)));

            // prefix and suffix as given by UEG3 with signedValFlag=1, uCoff=9
            int absMvdComp = !leftAvailable || leftType == null || leftType.isIntra() || !predEqA ? 0 : Math
                             .Abs(mvdLeft[list][comp][partY]);

            absMvdComp += !topAvailable || topType == null || topType.isIntra() || !predEqB ? 0 : Math
                          .Abs(mvdTop[list][comp][partAbsX]);

            int val, b = decoder.decodeBin(ctx + (absMvdComp < 3 ? 0 : (absMvdComp > 32 ? 2 : 1)));

            for (val = 0; b != 0 && val < 8; val++)
            {
                b = decoder.decodeBin(Math.Min(ctx + val + 3, ctx + 6));
            }
            val += b;

            if (val != 0)
            {
                if (val == 9)
                {
                    int log = 2, add = 0, sum = 0, leftover = 0;
                    do
                    {
                        sum += leftover;
                        log++;
                        b        = decoder.decodeBinBypass();
                        leftover = 1 << log;
                    } while (b != 0);

                    --log;

                    for (; log >= 0; log--)
                    {
                        add |= decoder.decodeBinBypass() << log;
                    }
                    val += add + sum;
                }

                val = toSigned(val, -decoder.decodeBinBypass());
            }

            for (int i = 0; i < partW; i++)
            {
                mvdTop[list][comp][partAbsX + i] = val;
            }
            for (int i = 0; i < partH; i++)
            {
                mvdLeft[list][comp][partY + i] = val;
            }

            return(val);
        }