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