129a84457aed4c45bc900998b5e11c03023264208James Dong/* ------------------------------------------------------------------
229a84457aed4c45bc900998b5e11c03023264208James Dong * Copyright (C) 1998-2009 PacketVideo
329a84457aed4c45bc900998b5e11c03023264208James Dong *
429a84457aed4c45bc900998b5e11c03023264208James Dong * Licensed under the Apache License, Version 2.0 (the "License");
529a84457aed4c45bc900998b5e11c03023264208James Dong * you may not use this file except in compliance with the License.
629a84457aed4c45bc900998b5e11c03023264208James Dong * You may obtain a copy of the License at
729a84457aed4c45bc900998b5e11c03023264208James Dong *
829a84457aed4c45bc900998b5e11c03023264208James Dong *      http://www.apache.org/licenses/LICENSE-2.0
929a84457aed4c45bc900998b5e11c03023264208James Dong *
1029a84457aed4c45bc900998b5e11c03023264208James Dong * Unless required by applicable law or agreed to in writing, software
1129a84457aed4c45bc900998b5e11c03023264208James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1229a84457aed4c45bc900998b5e11c03023264208James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1329a84457aed4c45bc900998b5e11c03023264208James Dong * express or implied.
1429a84457aed4c45bc900998b5e11c03023264208James Dong * See the License for the specific language governing permissions
1529a84457aed4c45bc900998b5e11c03023264208James Dong * and limitations under the License.
1629a84457aed4c45bc900998b5e11c03023264208James Dong * -------------------------------------------------------------------
1729a84457aed4c45bc900998b5e11c03023264208James Dong */
1829a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_lib.h"
1929a84457aed4c45bc900998b5e11c03023264208James Dong
2029a84457aed4c45bc900998b5e11c03023264208James Dong/**
2129a84457aed4c45bc900998b5e11c03023264208James DongSee algorithm in subclause 9.1, Table 9-1, Table 9-2. */
2229a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status ue_v(AVCEncBitstream *bitstream, uint codeNum)
2329a84457aed4c45bc900998b5e11c03023264208James Dong{
2429a84457aed4c45bc900998b5e11c03023264208James Dong    if (AVCENC_SUCCESS != SetEGBitstring(bitstream, codeNum))
2529a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_FAIL;
2629a84457aed4c45bc900998b5e11c03023264208James Dong
2729a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
2829a84457aed4c45bc900998b5e11c03023264208James Dong}
2929a84457aed4c45bc900998b5e11c03023264208James Dong
3029a84457aed4c45bc900998b5e11c03023264208James Dong/**
3129a84457aed4c45bc900998b5e11c03023264208James DongSee subclause 9.1.1, Table 9-3 */
3229a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status  se_v(AVCEncBitstream *bitstream, int value)
3329a84457aed4c45bc900998b5e11c03023264208James Dong{
3429a84457aed4c45bc900998b5e11c03023264208James Dong    uint codeNum;
3529a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
3629a84457aed4c45bc900998b5e11c03023264208James Dong
3729a84457aed4c45bc900998b5e11c03023264208James Dong    if (value <= 0)
3829a84457aed4c45bc900998b5e11c03023264208James Dong    {
3929a84457aed4c45bc900998b5e11c03023264208James Dong        codeNum = -value * 2;
4029a84457aed4c45bc900998b5e11c03023264208James Dong    }
4129a84457aed4c45bc900998b5e11c03023264208James Dong    else
4229a84457aed4c45bc900998b5e11c03023264208James Dong    {
4329a84457aed4c45bc900998b5e11c03023264208James Dong        codeNum = value * 2 - 1;
4429a84457aed4c45bc900998b5e11c03023264208James Dong    }
4529a84457aed4c45bc900998b5e11c03023264208James Dong
4629a84457aed4c45bc900998b5e11c03023264208James Dong    status = ue_v(bitstream, codeNum);
4729a84457aed4c45bc900998b5e11c03023264208James Dong
4829a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
4929a84457aed4c45bc900998b5e11c03023264208James Dong}
5029a84457aed4c45bc900998b5e11c03023264208James Dong
5129a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status te_v(AVCEncBitstream *bitstream, uint value, uint range)
5229a84457aed4c45bc900998b5e11c03023264208James Dong{
5329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
5429a84457aed4c45bc900998b5e11c03023264208James Dong
5529a84457aed4c45bc900998b5e11c03023264208James Dong    if (range > 1)
5629a84457aed4c45bc900998b5e11c03023264208James Dong    {
5729a84457aed4c45bc900998b5e11c03023264208James Dong        return ue_v(bitstream, value);
5829a84457aed4c45bc900998b5e11c03023264208James Dong    }
5929a84457aed4c45bc900998b5e11c03023264208James Dong    else
6029a84457aed4c45bc900998b5e11c03023264208James Dong    {
6129a84457aed4c45bc900998b5e11c03023264208James Dong        status = BitstreamWrite1Bit(bitstream, 1 - value);
6229a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
6329a84457aed4c45bc900998b5e11c03023264208James Dong    }
6429a84457aed4c45bc900998b5e11c03023264208James Dong}
6529a84457aed4c45bc900998b5e11c03023264208James Dong
6629a84457aed4c45bc900998b5e11c03023264208James Dong/**
6729a84457aed4c45bc900998b5e11c03023264208James DongSee subclause 9.1, Table 9-1, 9-2. */
6829a84457aed4c45bc900998b5e11c03023264208James Dong// compute leadingZeros and inforbits
6929a84457aed4c45bc900998b5e11c03023264208James Dong//codeNum = (1<<leadingZeros)-1+infobits;
7029a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status SetEGBitstring(AVCEncBitstream *bitstream, uint codeNum)
7129a84457aed4c45bc900998b5e11c03023264208James Dong{
7229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
7329a84457aed4c45bc900998b5e11c03023264208James Dong    int leadingZeros;
7429a84457aed4c45bc900998b5e11c03023264208James Dong    int infobits;
7529a84457aed4c45bc900998b5e11c03023264208James Dong
7629a84457aed4c45bc900998b5e11c03023264208James Dong    if (!codeNum)
7729a84457aed4c45bc900998b5e11c03023264208James Dong    {
7829a84457aed4c45bc900998b5e11c03023264208James Dong        status = BitstreamWrite1Bit(bitstream, 1);
7929a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
8029a84457aed4c45bc900998b5e11c03023264208James Dong    }
8129a84457aed4c45bc900998b5e11c03023264208James Dong
8229a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate leadingZeros and infobits */
8329a84457aed4c45bc900998b5e11c03023264208James Dong    leadingZeros = 1;
8429a84457aed4c45bc900998b5e11c03023264208James Dong    while ((uint)(1 << leadingZeros) < codeNum + 2)
8529a84457aed4c45bc900998b5e11c03023264208James Dong    {
8629a84457aed4c45bc900998b5e11c03023264208James Dong        leadingZeros++;
8729a84457aed4c45bc900998b5e11c03023264208James Dong    }
8829a84457aed4c45bc900998b5e11c03023264208James Dong    leadingZeros--;
8929a84457aed4c45bc900998b5e11c03023264208James Dong    infobits = codeNum - (1 << leadingZeros) + 1;
9029a84457aed4c45bc900998b5e11c03023264208James Dong
9129a84457aed4c45bc900998b5e11c03023264208James Dong    status = BitstreamWriteBits(bitstream, leadingZeros, 0);
9229a84457aed4c45bc900998b5e11c03023264208James Dong    infobits |= (1 << leadingZeros);
9329a84457aed4c45bc900998b5e11c03023264208James Dong    status = BitstreamWriteBits(bitstream, leadingZeros + 1, infobits);
9429a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
9529a84457aed4c45bc900998b5e11c03023264208James Dong}
9629a84457aed4c45bc900998b5e11c03023264208James Dong
9729a84457aed4c45bc900998b5e11c03023264208James Dong/* see Table 9-4 assignment of codeNum to values of coded_block_pattern. */
9829a84457aed4c45bc900998b5e11c03023264208James Dongconst static uint8 MapCBP2code[48][2] =
9929a84457aed4c45bc900998b5e11c03023264208James Dong{
10029a84457aed4c45bc900998b5e11c03023264208James Dong    {3, 0}, {29, 2}, {30, 3}, {17, 7}, {31, 4}, {18, 8}, {37, 17}, {8, 13}, {32, 5}, {38, 18}, {19, 9}, {9, 14},
10129a84457aed4c45bc900998b5e11c03023264208James Dong    {20, 10}, {10, 15}, {11, 16}, {2, 11}, {16, 1}, {33, 32}, {34, 33}, {21, 36}, {35, 34}, {22, 37}, {39, 44}, {4, 40},
10229a84457aed4c45bc900998b5e11c03023264208James Dong    {36, 35}, {40, 45}, {23, 38}, {5, 41}, {24, 39}, {6, 42}, {7, 43}, {1, 19}, {41, 6}, {42, 24}, {43, 25}, {25, 20},
10329a84457aed4c45bc900998b5e11c03023264208James Dong    {44, 26}, {26, 21}, {46, 46}, {12, 28}, {45, 27}, {47, 47}, {27, 22}, {13, 29}, {28, 23}, {14, 30}, {15, 31}, {0, 12}
10429a84457aed4c45bc900998b5e11c03023264208James Dong};
10529a84457aed4c45bc900998b5e11c03023264208James Dong
10629a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status EncodeCBP(AVCMacroblock *currMB, AVCEncBitstream *stream)
10729a84457aed4c45bc900998b5e11c03023264208James Dong{
10829a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
10929a84457aed4c45bc900998b5e11c03023264208James Dong    uint codeNum;
11029a84457aed4c45bc900998b5e11c03023264208James Dong
11129a84457aed4c45bc900998b5e11c03023264208James Dong    if (currMB->mbMode == AVC_I4)
11229a84457aed4c45bc900998b5e11c03023264208James Dong    {
11329a84457aed4c45bc900998b5e11c03023264208James Dong        codeNum = MapCBP2code[currMB->CBP][0];
11429a84457aed4c45bc900998b5e11c03023264208James Dong    }
11529a84457aed4c45bc900998b5e11c03023264208James Dong    else
11629a84457aed4c45bc900998b5e11c03023264208James Dong    {
11729a84457aed4c45bc900998b5e11c03023264208James Dong        codeNum = MapCBP2code[currMB->CBP][1];
11829a84457aed4c45bc900998b5e11c03023264208James Dong    }
11929a84457aed4c45bc900998b5e11c03023264208James Dong
12029a84457aed4c45bc900998b5e11c03023264208James Dong    status = ue_v(stream, codeNum);
12129a84457aed4c45bc900998b5e11c03023264208James Dong
12229a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
12329a84457aed4c45bc900998b5e11c03023264208James Dong}
12429a84457aed4c45bc900998b5e11c03023264208James Dong
12529a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status ce_TotalCoeffTrailingOnes(AVCEncBitstream *stream, int TrailingOnes, int TotalCoeff, int nC)
12629a84457aed4c45bc900998b5e11c03023264208James Dong{
12729a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 totCoeffTrailOne[3][4][17][2] =
12829a84457aed4c45bc900998b5e11c03023264208James Dong    {
12929a84457aed4c45bc900998b5e11c03023264208James Dong        {   // 0702
13029a84457aed4c45bc900998b5e11c03023264208James Dong            {{1, 1}, {6, 5}, {8, 7}, {9, 7}, {10, 7}, {11, 7}, {13, 15}, {13, 11}, {13, 8}, {14, 15}, {14, 11}, {15, 15}, {15, 11}, {16, 15}, {16, 11}, {16, 7}, {16, 4}},
13129a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {2, 1}, {6, 4}, {8, 6}, {9, 6}, {10, 6}, {11, 6}, {13, 14}, {13, 10}, {14, 14}, {14, 10}, {15, 14}, {15, 10}, {15, 1}, {16, 14}, {16, 10}, {16, 6}},
13229a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {0, 0}, {3, 1}, {7, 5}, {8, 5}, {9, 5}, {10, 5}, {11, 5}, {13, 13}, {13, 9}, {14, 13}, {14, 9}, {15, 13}, {15, 9}, {16, 13}, {16, 9}, {16, 5}},
13329a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {0, 0}, {0, 0}, {5, 3}, {6, 3}, {7, 4}, {8, 4}, {9, 4}, {10, 4}, {11, 4}, {13, 12}, {14, 12}, {14, 8}, {15, 12}, {15, 8}, {16, 12}, {16, 8}},
13429a84457aed4c45bc900998b5e11c03023264208James Dong        },
13529a84457aed4c45bc900998b5e11c03023264208James Dong        {
13629a84457aed4c45bc900998b5e11c03023264208James Dong            {{2, 3}, {6, 11}, {6, 7}, {7, 7}, {8, 7}, {8, 4}, {9, 7}, {11, 15}, {11, 11}, {12, 15}, {12, 11}, {12, 8}, {13, 15}, {13, 11}, {13, 7}, {14, 9}, {14, 7}},
13729a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {2, 2}, {5, 7}, {6, 10}, {6, 6}, {7, 6}, {8, 6}, {9, 6}, {11, 14}, {11, 10}, {12, 14}, {12, 10}, {13, 14}, {13, 10}, {14, 11}, {14, 8}, {14, 6}},
13829a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {0, 0}, {3, 3}, {6, 9}, {6, 5}, {7, 5}, {8, 5}, {9, 5}, {11, 13}, {11, 9}, {12, 13}, {12, 9}, {13, 13}, {13, 9}, {13, 6}, {14, 10}, {14, 5}},
13929a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {0, 0}, {0, 0}, {4, 5}, {4, 4}, {5, 6}, {6, 8}, {6, 4}, {7, 4}, {9, 4}, {11, 12}, {11, 8}, {12, 12}, {13, 12}, {13, 8}, {13, 1}, {14, 4}},
14029a84457aed4c45bc900998b5e11c03023264208James Dong        },
14129a84457aed4c45bc900998b5e11c03023264208James Dong        {
14229a84457aed4c45bc900998b5e11c03023264208James Dong            {{4, 15}, {6, 15}, {6, 11}, {6, 8}, {7, 15}, {7, 11}, {7, 9}, {7, 8}, {8, 15}, {8, 11}, {9, 15}, {9, 11}, {9, 8}, {10, 13}, {10, 9}, {10, 5}, {10, 1}},
14329a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {4, 14}, {5, 15}, {5, 12}, {5, 10}, {5, 8}, {6, 14}, {6, 10}, {7, 14}, {8, 14}, {8, 10}, {9, 14}, {9, 10}, {9, 7}, {10, 12}, {10, 8}, {10, 4}},
14429a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {0, 0}, {4, 13}, {5, 14}, {5, 11}, {5, 9}, {6, 13}, {6, 9}, {7, 13}, {7, 10}, {8, 13}, {8, 9}, {9, 13}, {9, 9}, {10, 11}, {10, 7}, {10, 3}},
14529a84457aed4c45bc900998b5e11c03023264208James Dong            {{0, 0}, {0, 0}, {0, 0}, {4, 12}, {4, 11}, {4, 10}, {4, 9}, {4, 8}, {5, 13}, {6, 12}, {7, 12}, {8, 12}, {8, 8}, {9, 12}, {10, 10}, {10, 6}, {10, 2}}
14629a84457aed4c45bc900998b5e11c03023264208James Dong        }
14729a84457aed4c45bc900998b5e11c03023264208James Dong    };
14829a84457aed4c45bc900998b5e11c03023264208James Dong
14929a84457aed4c45bc900998b5e11c03023264208James Dong
15029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status = AVCENC_SUCCESS;
15129a84457aed4c45bc900998b5e11c03023264208James Dong    uint code, len;
15229a84457aed4c45bc900998b5e11c03023264208James Dong    int vlcnum;
15329a84457aed4c45bc900998b5e11c03023264208James Dong
15429a84457aed4c45bc900998b5e11c03023264208James Dong    if (TrailingOnes > 3)
15529a84457aed4c45bc900998b5e11c03023264208James Dong    {
15629a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_TRAILINGONES_FAIL;
15729a84457aed4c45bc900998b5e11c03023264208James Dong    }
15829a84457aed4c45bc900998b5e11c03023264208James Dong
15929a84457aed4c45bc900998b5e11c03023264208James Dong    if (nC >= 8)
16029a84457aed4c45bc900998b5e11c03023264208James Dong    {
16129a84457aed4c45bc900998b5e11c03023264208James Dong        if (TotalCoeff)
16229a84457aed4c45bc900998b5e11c03023264208James Dong        {
16329a84457aed4c45bc900998b5e11c03023264208James Dong            code = ((TotalCoeff - 1) << 2) | (TrailingOnes);
16429a84457aed4c45bc900998b5e11c03023264208James Dong        }
16529a84457aed4c45bc900998b5e11c03023264208James Dong        else
16629a84457aed4c45bc900998b5e11c03023264208James Dong        {
16729a84457aed4c45bc900998b5e11c03023264208James Dong            code = 3;
16829a84457aed4c45bc900998b5e11c03023264208James Dong        }
16929a84457aed4c45bc900998b5e11c03023264208James Dong        status = BitstreamWriteBits(stream, 6, code);
17029a84457aed4c45bc900998b5e11c03023264208James Dong    }
17129a84457aed4c45bc900998b5e11c03023264208James Dong    else
17229a84457aed4c45bc900998b5e11c03023264208James Dong    {
17329a84457aed4c45bc900998b5e11c03023264208James Dong        if (nC < 2)
17429a84457aed4c45bc900998b5e11c03023264208James Dong        {
17529a84457aed4c45bc900998b5e11c03023264208James Dong            vlcnum = 0;
17629a84457aed4c45bc900998b5e11c03023264208James Dong        }
17729a84457aed4c45bc900998b5e11c03023264208James Dong        else if (nC < 4)
17829a84457aed4c45bc900998b5e11c03023264208James Dong        {
17929a84457aed4c45bc900998b5e11c03023264208James Dong            vlcnum = 1;
18029a84457aed4c45bc900998b5e11c03023264208James Dong        }
18129a84457aed4c45bc900998b5e11c03023264208James Dong        else
18229a84457aed4c45bc900998b5e11c03023264208James Dong        {
18329a84457aed4c45bc900998b5e11c03023264208James Dong            vlcnum = 2;
18429a84457aed4c45bc900998b5e11c03023264208James Dong        }
18529a84457aed4c45bc900998b5e11c03023264208James Dong
18629a84457aed4c45bc900998b5e11c03023264208James Dong        len = totCoeffTrailOne[vlcnum][TrailingOnes][TotalCoeff][0];
18729a84457aed4c45bc900998b5e11c03023264208James Dong        code = totCoeffTrailOne[vlcnum][TrailingOnes][TotalCoeff][1];
18829a84457aed4c45bc900998b5e11c03023264208James Dong        status = BitstreamWriteBits(stream, len, code);
18929a84457aed4c45bc900998b5e11c03023264208James Dong    }
19029a84457aed4c45bc900998b5e11c03023264208James Dong
19129a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
19229a84457aed4c45bc900998b5e11c03023264208James Dong}
19329a84457aed4c45bc900998b5e11c03023264208James Dong
19429a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status ce_TotalCoeffTrailingOnesChromaDC(AVCEncBitstream *stream, int TrailingOnes, int TotalCoeff)
19529a84457aed4c45bc900998b5e11c03023264208James Dong{
19629a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 totCoeffTrailOneChrom[4][5][2] =
19729a84457aed4c45bc900998b5e11c03023264208James Dong    {
19829a84457aed4c45bc900998b5e11c03023264208James Dong        { {2, 1}, {6, 7}, {6, 4}, {6, 3}, {6, 2}},
19929a84457aed4c45bc900998b5e11c03023264208James Dong        { {0, 0}, {1, 1}, {6, 6}, {7, 3}, {8, 3}},
20029a84457aed4c45bc900998b5e11c03023264208James Dong        { {0, 0}, {0, 0}, {3, 1}, {7, 2}, {8, 2}},
20129a84457aed4c45bc900998b5e11c03023264208James Dong        { {0, 0}, {0, 0}, {0, 0}, {6, 5}, {7, 0}},
20229a84457aed4c45bc900998b5e11c03023264208James Dong    };
20329a84457aed4c45bc900998b5e11c03023264208James Dong
20429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status = AVCENC_SUCCESS;
20529a84457aed4c45bc900998b5e11c03023264208James Dong    uint code, len;
20629a84457aed4c45bc900998b5e11c03023264208James Dong
20729a84457aed4c45bc900998b5e11c03023264208James Dong    len = totCoeffTrailOneChrom[TrailingOnes][TotalCoeff][0];
20829a84457aed4c45bc900998b5e11c03023264208James Dong    code = totCoeffTrailOneChrom[TrailingOnes][TotalCoeff][1];
20929a84457aed4c45bc900998b5e11c03023264208James Dong    status = BitstreamWriteBits(stream, len, code);
21029a84457aed4c45bc900998b5e11c03023264208James Dong
21129a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
21229a84457aed4c45bc900998b5e11c03023264208James Dong}
21329a84457aed4c45bc900998b5e11c03023264208James Dong
21429a84457aed4c45bc900998b5e11c03023264208James Dong/* see Table 9-7 and 9-8 */
21529a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status ce_TotalZeros(AVCEncBitstream *stream, int total_zeros, int TotalCoeff)
21629a84457aed4c45bc900998b5e11c03023264208James Dong{
21729a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 lenTotalZeros[15][16] =
21829a84457aed4c45bc900998b5e11c03023264208James Dong    {
21929a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9},
22029a84457aed4c45bc900998b5e11c03023264208James Dong        { 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6},
22129a84457aed4c45bc900998b5e11c03023264208James Dong        { 4, 3, 3, 3, 4, 4, 3, 3, 4, 5, 5, 6, 5, 6},
22229a84457aed4c45bc900998b5e11c03023264208James Dong        { 5, 3, 4, 4, 3, 3, 3, 4, 3, 4, 5, 5, 5},
22329a84457aed4c45bc900998b5e11c03023264208James Dong        { 4, 4, 4, 3, 3, 3, 3, 3, 4, 5, 4, 5},
22429a84457aed4c45bc900998b5e11c03023264208James Dong        { 6, 5, 3, 3, 3, 3, 3, 3, 4, 3, 6},
22529a84457aed4c45bc900998b5e11c03023264208James Dong        { 6, 5, 3, 3, 3, 2, 3, 4, 3, 6},
22629a84457aed4c45bc900998b5e11c03023264208James Dong        { 6, 4, 5, 3, 2, 2, 3, 3, 6},
22729a84457aed4c45bc900998b5e11c03023264208James Dong        { 6, 6, 4, 2, 2, 3, 2, 5},
22829a84457aed4c45bc900998b5e11c03023264208James Dong        { 5, 5, 3, 2, 2, 2, 4},
22929a84457aed4c45bc900998b5e11c03023264208James Dong        { 4, 4, 3, 3, 1, 3},
23029a84457aed4c45bc900998b5e11c03023264208James Dong        { 4, 4, 2, 1, 3},
23129a84457aed4c45bc900998b5e11c03023264208James Dong        { 3, 3, 1, 2},
23229a84457aed4c45bc900998b5e11c03023264208James Dong        { 2, 2, 1},
23329a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 1},
23429a84457aed4c45bc900998b5e11c03023264208James Dong    };
23529a84457aed4c45bc900998b5e11c03023264208James Dong
23629a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 codTotalZeros[15][16] =
23729a84457aed4c45bc900998b5e11c03023264208James Dong    {
23829a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 1},
23929a84457aed4c45bc900998b5e11c03023264208James Dong        {7, 6, 5, 4, 3, 5, 4, 3, 2, 3, 2, 3, 2, 1, 0},
24029a84457aed4c45bc900998b5e11c03023264208James Dong        {5, 7, 6, 5, 4, 3, 4, 3, 2, 3, 2, 1, 1, 0},
24129a84457aed4c45bc900998b5e11c03023264208James Dong        {3, 7, 5, 4, 6, 5, 4, 3, 3, 2, 2, 1, 0},
24229a84457aed4c45bc900998b5e11c03023264208James Dong        {5, 4, 3, 7, 6, 5, 4, 3, 2, 1, 1, 0},
24329a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 1, 7, 6, 5, 4, 3, 2, 1, 1, 0},
24429a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 1, 5, 4, 3, 3, 2, 1, 1, 0},
24529a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 1, 1, 3, 3, 2, 2, 1, 0},
24629a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 0, 1, 3, 2, 1, 1, 1, },
24729a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 0, 1, 3, 2, 1, 1, },
24829a84457aed4c45bc900998b5e11c03023264208James Dong        {0, 1, 1, 2, 1, 3},
24929a84457aed4c45bc900998b5e11c03023264208James Dong        {0, 1, 1, 1, 1},
25029a84457aed4c45bc900998b5e11c03023264208James Dong        {0, 1, 1, 1},
25129a84457aed4c45bc900998b5e11c03023264208James Dong        {0, 1, 1},
25229a84457aed4c45bc900998b5e11c03023264208James Dong        {0, 1},
25329a84457aed4c45bc900998b5e11c03023264208James Dong    };
25429a84457aed4c45bc900998b5e11c03023264208James Dong    int len, code;
25529a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
25629a84457aed4c45bc900998b5e11c03023264208James Dong
25729a84457aed4c45bc900998b5e11c03023264208James Dong    len = lenTotalZeros[TotalCoeff-1][total_zeros];
25829a84457aed4c45bc900998b5e11c03023264208James Dong    code = codTotalZeros[TotalCoeff-1][total_zeros];
25929a84457aed4c45bc900998b5e11c03023264208James Dong
26029a84457aed4c45bc900998b5e11c03023264208James Dong    status = BitstreamWriteBits(stream, len, code);
26129a84457aed4c45bc900998b5e11c03023264208James Dong
26229a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
26329a84457aed4c45bc900998b5e11c03023264208James Dong}
26429a84457aed4c45bc900998b5e11c03023264208James Dong
26529a84457aed4c45bc900998b5e11c03023264208James Dong/* see Table 9-9 */
26629a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status ce_TotalZerosChromaDC(AVCEncBitstream *stream, int total_zeros, int TotalCoeff)
26729a84457aed4c45bc900998b5e11c03023264208James Dong{
26829a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 lenTotalZerosChromaDC[3][4] =
26929a84457aed4c45bc900998b5e11c03023264208James Dong    {
27029a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 2, 3, 3, },
27129a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 2, 2, 0, },
27229a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 1, 0, 0, },
27329a84457aed4c45bc900998b5e11c03023264208James Dong    };
27429a84457aed4c45bc900998b5e11c03023264208James Dong
27529a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 codTotalZerosChromaDC[3][4] =
27629a84457aed4c45bc900998b5e11c03023264208James Dong    {
27729a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 1, 1, 0, },
27829a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 1, 0, 0, },
27929a84457aed4c45bc900998b5e11c03023264208James Dong        { 1, 0, 0, 0, },
28029a84457aed4c45bc900998b5e11c03023264208James Dong    };
28129a84457aed4c45bc900998b5e11c03023264208James Dong
28229a84457aed4c45bc900998b5e11c03023264208James Dong    int len, code;
28329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
28429a84457aed4c45bc900998b5e11c03023264208James Dong
28529a84457aed4c45bc900998b5e11c03023264208James Dong    len = lenTotalZerosChromaDC[TotalCoeff-1][total_zeros];
28629a84457aed4c45bc900998b5e11c03023264208James Dong    code = codTotalZerosChromaDC[TotalCoeff-1][total_zeros];
28729a84457aed4c45bc900998b5e11c03023264208James Dong
28829a84457aed4c45bc900998b5e11c03023264208James Dong    status = BitstreamWriteBits(stream, len, code);
28929a84457aed4c45bc900998b5e11c03023264208James Dong
29029a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
29129a84457aed4c45bc900998b5e11c03023264208James Dong}
29229a84457aed4c45bc900998b5e11c03023264208James Dong
29329a84457aed4c45bc900998b5e11c03023264208James Dong/* see Table 9-10 */
29429a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status ce_RunBefore(AVCEncBitstream *stream, int run_before, int zerosLeft)
29529a84457aed4c45bc900998b5e11c03023264208James Dong{
29629a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 lenRunBefore[7][16] =
29729a84457aed4c45bc900998b5e11c03023264208James Dong    {
29829a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 1},
29929a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 2, 2},
30029a84457aed4c45bc900998b5e11c03023264208James Dong        {2, 2, 2, 2},
30129a84457aed4c45bc900998b5e11c03023264208James Dong        {2, 2, 2, 3, 3},
30229a84457aed4c45bc900998b5e11c03023264208James Dong        {2, 2, 3, 3, 3, 3},
30329a84457aed4c45bc900998b5e11c03023264208James Dong        {2, 3, 3, 3, 3, 3, 3},
30429a84457aed4c45bc900998b5e11c03023264208James Dong        {3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11},
30529a84457aed4c45bc900998b5e11c03023264208James Dong    };
30629a84457aed4c45bc900998b5e11c03023264208James Dong
30729a84457aed4c45bc900998b5e11c03023264208James Dong    const static uint8 codRunBefore[7][16] =
30829a84457aed4c45bc900998b5e11c03023264208James Dong    {
30929a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 0},
31029a84457aed4c45bc900998b5e11c03023264208James Dong        {1, 1, 0},
31129a84457aed4c45bc900998b5e11c03023264208James Dong        {3, 2, 1, 0},
31229a84457aed4c45bc900998b5e11c03023264208James Dong        {3, 2, 1, 1, 0},
31329a84457aed4c45bc900998b5e11c03023264208James Dong        {3, 2, 3, 2, 1, 0},
31429a84457aed4c45bc900998b5e11c03023264208James Dong        {3, 0, 1, 3, 2, 5, 4},
31529a84457aed4c45bc900998b5e11c03023264208James Dong        {7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1},
31629a84457aed4c45bc900998b5e11c03023264208James Dong    };
31729a84457aed4c45bc900998b5e11c03023264208James Dong
31829a84457aed4c45bc900998b5e11c03023264208James Dong    int len, code;
31929a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
32029a84457aed4c45bc900998b5e11c03023264208James Dong
32129a84457aed4c45bc900998b5e11c03023264208James Dong    if (zerosLeft <= 6)
32229a84457aed4c45bc900998b5e11c03023264208James Dong    {
32329a84457aed4c45bc900998b5e11c03023264208James Dong        len = lenRunBefore[zerosLeft-1][run_before];
32429a84457aed4c45bc900998b5e11c03023264208James Dong        code = codRunBefore[zerosLeft-1][run_before];
32529a84457aed4c45bc900998b5e11c03023264208James Dong    }
32629a84457aed4c45bc900998b5e11c03023264208James Dong    else
32729a84457aed4c45bc900998b5e11c03023264208James Dong    {
32829a84457aed4c45bc900998b5e11c03023264208James Dong        len = lenRunBefore[6][run_before];
32929a84457aed4c45bc900998b5e11c03023264208James Dong        code = codRunBefore[6][run_before];
33029a84457aed4c45bc900998b5e11c03023264208James Dong    }
33129a84457aed4c45bc900998b5e11c03023264208James Dong
33229a84457aed4c45bc900998b5e11c03023264208James Dong    status = BitstreamWriteBits(stream, len, code);
33329a84457aed4c45bc900998b5e11c03023264208James Dong
33429a84457aed4c45bc900998b5e11c03023264208James Dong
33529a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
33629a84457aed4c45bc900998b5e11c03023264208James Dong}
337