159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong/* ------------------------------------------------------------------ 259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Copyright (C) 1998-2009 PacketVideo 359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * 459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * you may not use this file except in compliance with the License. 659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * You may obtain a copy of the License at 759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * 859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * http://www.apache.org/licenses/LICENSE-2.0 959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * 1059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Unless required by applicable law or agreed to in writing, software 1159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * express or implied. 1459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * See the License for the specific language governing permissions 1559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * and limitations under the License. 1659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * ------------------------------------------------------------------- 1759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong */ 1859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#ifndef _VLC_ENCODE_INLINE_H_ 1959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#define _VLC_ENCODE_INLINE_H_ 2059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 2159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#if !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) 2259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 2359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong__inline Int zero_run_search(UInt *bitmapzz, Short *dataBlock, RunLevelBlock *RLB, Int nc) 2459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong{ 2559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int idx, run, level, j; 2659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong UInt end, match; 2759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 2859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx = 0; 2959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j = 0; 3059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 3159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match = 1 << 31; 3259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (nc > 32) 3359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong end = 1; 3459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 3559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong end = 1 << (32 - nc); 3659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 3759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (match >= end) 3859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 3959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if ((match&bitmapzz[0]) == 0) 4059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 4159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run++; 4259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j++; 4359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match >>= 1; 4459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 4559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 4659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 4759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match >>= 1; 4859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong level = dataBlock[j]; 4959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dataBlock[j] = 0; /* reset output */ 5059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j++; 5159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (level < 0) 5259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 5359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = -level; 5459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 1; 5559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 5659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 5759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 5859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 5959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 6059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 6159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = level; 6259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 0; 6359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 6459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 6559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 6659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 6759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 6859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 6959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong nc -= 32; 7059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (nc > 0) 7159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 7259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match = 1 << 31; 7359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong end = 1 << (32 - nc); 7459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (match >= end) 7559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 7659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if ((match&bitmapzz[1]) == 0) 7759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 7859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run++; 7959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j++; 8059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match >>= 1; 8159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 8259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 8359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 8459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match >>= 1; 8559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong level = dataBlock[j]; 8659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dataBlock[j] = 0; /* reset output */ 8759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j++; 8859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (level < 0) 8959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 9059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = -level; 9159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 1; 9259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 9359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 9459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 9559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 9659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 9759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 9859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = level; 9959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 0; 10059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 10159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 10259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 10359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 10459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 10559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 10659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 10759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 10859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return idx; 10959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong} 11059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 11159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#elif defined(__CC_ARM) /* only work with arm v5 */ 11259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 11359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong__inline Int zero_run_search(UInt *bitmapzz, Short *dataBlock, RunLevelBlock *RLB, Int nc) 11459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong{ 11559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong OSCL_UNUSED_ARG(nc); 11659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int idx, run, level, j; 11759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong UInt end, match; 11859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int zzorder; 11959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 12059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx = 0; 12159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 12259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j = -1; 12359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong __asm 12459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 12559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ldr match, [bitmapzz] 12659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong clz run, match 12759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 12859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 12959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong zzorder = 0; 13059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 13159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (run < 32) 13259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 13359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong __asm 13459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 13559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mov end, #0x80000000 13659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mov end, end, lsr run /* mask*/ 13759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong bic match, match, end /* remove it from bitmap */ 13859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mov run, run, lsl #1 /* 05/09/02 */ 13959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ldrsh level, [dataBlock, run] /* load data */ 14059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong strh zzorder, [dataBlock, run] /* reset output */ 14159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong add j, j, #1 14259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong rsb run, j, run, lsr #1 /* delta run */ 14359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong add j, j, run /* current position */ 14459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 14559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (level < 0) 14659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 14759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = -level; 14859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 1; 14959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 15059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 15159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 15259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 15359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 15459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 15559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = level; 15659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 0; 15759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 15859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 15959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 16059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 16159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong __asm 16259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 16359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong clz run, match 16459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 16559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 16659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong __asm 16759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 16859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ldr match, [bitmapzz, #4] 16959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong clz run, match 17059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 17159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 17259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (run < 32) 17359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 17459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong __asm 17559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 17659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mov end, #0x80000000 17759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mov end, end, lsr run /* mask*/ 17859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong bic match, match, end /* remove it from bitmap */ 17959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong add run, run, #32 /* current position */ 18059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mov run, run, lsl #1 /* 09/02/05 */ 18159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ldrsh level, [dataBlock, run] /* load data */ 18259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong strh zzorder, [dataBlock, run] /* reset output */ 18359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong add j, j, #1 18459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong rsb run, j, run, lsr #1 /* delta run */ 18559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong add j, j, run /* current position */ 18659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 18759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (level < 0) 18859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 18959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = -level; 19059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 1; 19159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 19259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 19359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 19459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 19559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 19659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 19759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = level; 19859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 0; 19959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 20059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 20159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 20259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 20359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong __asm 20459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 20559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong clz run, match 20659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 20759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 20859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 20959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return idx; 21059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong} 21159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 21259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#elif ( defined(PV_ARM_GCC_V4) || defined(PV_ARM_GCC_V5) ) /* ARM GNU COMPILER */ 21359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 21459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong__inline Int m4v_enc_clz(UInt temp) 21559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong{ 21659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong register Int rb; 21759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong register UInt ra = (UInt)temp; 21859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 21959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong asm volatile("clz %0, %1" 22059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong : "=&r"(rb) 22159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong : "r"(ra) 22259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ); 22359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 22459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return (rb); 22559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong} 22659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 22759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong__inline Int zero_run_search(UInt *bitmapzz, Short *dataBlock, RunLevelBlock *RLB, Int nc) 22859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong{ 22959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong OSCL_UNUSED_ARG(nc); 23059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int idx, run, level = 0, j; 23159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong UInt end = 0, match; 23259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int zzorder; 23359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 23459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx = 0; 23559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 23659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong j = -1; 23759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match = *bitmapzz; 23859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = m4v_enc_clz(match); 23959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 24059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong zzorder = 0; 24159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 24259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (run < 32) 24359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 24459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong asm volatile("mov %0, #0x80000000\n\t" 24559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "mov %0, %0, lsr %1\n\t" 24659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "bic %2, %2, %0\n\t" 24759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "mov %1, %1, lsl #1\n\t" 24859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "ldrsh %3, [%6, %1]\n\t" 24959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "strh %5, [%6, %1]\n\t" 25059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "add %4, %4, #1\n\t" 25159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "rsb %1, %4, %1, lsr #1\n\t" 25259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "add %4, %4, %1" 25359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong : "+r"(end), "+r"(run), "+r"(match), "=r"(level), "+r"(j) 25459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong : "r"(zzorder), "r"(dataBlock)); 25559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (level < 0) 25659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 25759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = -level; 25859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 1; 25959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 26059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 26159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 26259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 26359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 26459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 26559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = level; 26659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 0; 26759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 26859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 26959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 27059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 27159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = m4v_enc_clz(match); 27259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 27359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong match = bitmapzz[1]; 27459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = m4v_enc_clz(match); 27559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 27659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (run < 32) 27759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 27859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong asm volatile("mov %0, #0x80000000\n\t" 27959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "mov %0, %0, lsr %1\n\t" 28059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "bic %2, %2, %0\n\t" 28159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "add %1, %1, #32\n\t" 28259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "mov %1, %1, lsl #1\n\t" 28359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "ldrsh %3, [%6, %1]\n\t" 28459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "strh %5, [%6, %1]\n\t" 28559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "add %4, %4, #1\n\t" 28659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "rsb %1, %4, %1, lsr #1\n\t" 28759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong "add %4, %4, %1" 28859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong : "+r"(end), "+r"(run), "+r"(match), "+r"(level), "+r"(j) 28959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong : "r"(zzorder), "r"(dataBlock)); 29059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (level < 0) 29159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 29259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = -level; 29359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 1; 29459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 29559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 29659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 29759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 29859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong else 29959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 30059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->level[idx] = level; 30159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->s[idx] = 0; 30259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong RLB->run[idx] = run; 30359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = 0; 30459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong idx++; 30559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 30659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong run = m4v_enc_clz(match); 30759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 30859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 30959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return idx; 31059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong} 31159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 31259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#endif 31359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 31459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#endif // _VLC_ENCODE_INLINE_H_ 31559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 31659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 317