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