⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swdec_vlc.c

📁 freescale i.mx31 BSP CE5.0全部源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                    
                    /* sign, rlc & last */
                    sign = escape_code & (0x1000>>tab->len);
                    rlc = tab->lrl;
                    last = rlc>>15;
                    
                    if ( (escape_type==1)) {
                        /* inter mb and type 1 escape */
                        run = ((rlc & 0x7E00)>>9);
                        if ( last==1 )
                        {       
                            if (run == 0)
                                tmp = 3;
                            else if (run == 1)
                                tmp = 2;
                            else
                                tmp = 1;
                        }
                        else
                        {
                            tmp = lmaxInterTable[run];
                        }
                        level = (i32)((rlc & 0x1FF) + tmp);
                        if ( sign ) level = -level;
                        run = (rlc&0x7E00)>>9;
                    } else {
                        /* inter mb and escape type 2 */
                        level = (rlc & 0x01FF);
                        if ( last==1 ) /* last == 1 */
                        {
                            if (level == 1)
                                tmp = 40;
                            else if (level == 2)
                                tmp = 1;
                            else
                                tmp = 0;
                        }
                        else    /* Last == 0 */
                        {
                            tmp= rmaxInterTable[level-1];
                        }
                        level = (rlc & 0x1FF);
                        if ( sign ) level = -level;
                        run = ((rlc&0x7E00)>>9) + tmp + 1;
                        if (run > 63) return(HANTRO_NOK);
                    }
                    
                    BUFFER_FLUSH(buffer, tab->len+1);
                }
                /* Type 3 Escape: After escape_code 11*/
                else
                {
                    BUFFER_GET(buffer, escape_code, 21);

                    last = (escape_code & 0x100000) >> 20;
                    run  = (escape_code & 0xFC000) >> 14;
                    level= (escape_code & 0x0FFE) >> 1;
                    sign = (escape_code & 0x1000);
                    
                    /*Check Marker Bits*/
                    if ( !(escape_code & 0x01) || !(escape_code & 0x2000))
                        return(HANTRO_NOK);
                    if (level == 0) return(HANTRO_NOK);
                    if(sign) level = level - 2048;
                }
            }
        }
#endif
        /* no escape code */
        else
        {
            /* sign */
            sign = inputBuffer & (0x1000>>tab->len);

            rlc = tab->lrl;
            level = rlc&0x1FF;
            if ( sign ) level = -level;
            run = (rlc>>9)&0x3F;
            last = rlc>>15;
        }
        
        CodeCount += run + 1;

        if (CodeCount > 64)
        {
            return(HANTRO_NOK);
        }

        /* Saving the word to buffer */

        tmp = zigZagScan[CodeCount-1];
        pOut[tmp] = level;
        DEQUANTIZE(pOut[tmp],QP);

        if ( ((tmp>>3)+1) >
             pDecContainer->StrmStorage.numIdctRows )
        {
            pDecContainer->StrmStorage.numIdctRows =
                (tmp>>3) + 1;
        }

    } while(!last);

    tmp = SwDec_FlushBits(pDecContainer,32-buffer.bits);
    return(tmp);

}
#ifndef MP4DEC_H263_ONLY
/*------------------------------------------------------------------------------

   5.3  Function name:  SwDec_DecodeRvlcBlock

        Purpose:        Decode rvlc block
                 
        Input:          
            pointer to decContainer_t
            pointer to output data block
            macro block number
            quantization parameter
            scanning direction

        Output: 
            HANTRO_OK/HANTRO_NOK/END_OF_STREAM

------------------------------------------------------------------------------*/

u32 SwDec_DecodeRvlcBlock(decContainer_t *pDecContainer,i32 *pOut,u32 mbNum,
    u32 QP, u32 scanDir)
{

    u32 last;
    u32 run;
    i32 level;
    u32 inputBuffer;
    u32 rlc;
    u32 CodeCount;
    u32 tmp;
    u32 tmpMask;
    u32 index;
    u32 length;
    tmpBuffer_t buffer;
    
    ASSERT(pDecContainer);
    ASSERT(pOut);
    ASSERT(mbNum < pDecContainer->VopDesc.totalMbInVop);
    ASSERT(QP);
    ASSERT(QP < 32);
    ASSERT(scanDir < 3); 
    ASSERT(!(MB_IS_INTER(mbNum) && 
        (pDecContainer->MbDesc[mbNum].flags & USE_INTRA_DC_VLC_MASK)));
    ASSERT(!(MB_IS_INTER(mbNum) && scanDir));

    if (pDecContainer->MbDesc[mbNum].flags & USE_INTRA_DC_VLC_MASK)
        CodeCount = 1;
    else
        CodeCount = 0;

    /* read 32 bits into buffer */
    BUFFER_INIT(buffer);

    do {
        BUFFER_SHOW(buffer, inputBuffer, 16);

        /* first 5 code words handled by rvlcShort -tables */
        if (MB_IS_INTRA(mbNum))
        {
            rlc = rvlcShortIntra[inputBuffer>>11];
        }
        else
        {
            rlc = rvlcShortInter[inputBuffer>>11];
        }
        if (rlc == ERROR) return(HANTRO_NOK);

        if (rlc != EMPTY)
        {
            /*lint --e(504) -e514 */
            BUFFER_FLUSH(buffer,4+(inputBuffer<0xC000));
            /* lint +e514 */
            if (rlc != ESCAPE)
            {
                last = (rlc & 0x8000)>>15;
                run = (rlc & 0x7E00)>>9;
                level = (i16)(rlc>>16);
            }
            else
            {
                BUFFER_GET(buffer,tmp,25);

                last = ((tmp & 0x1000000) >> 24);
                run = ((tmp & 0xFC0000) >> 18);
                /* marker */
                if (!((tmp & 0x20000) >> 17)) return(HANTRO_NOK);

                level = ((tmp & 0x1FFC0) >> 6);
                if (!level) return(HANTRO_NOK);

                /* marker */
                if (!((tmp & 0x20) >> 5)) return(HANTRO_NOK);
                
                /* four 0's of escape */
                if((tmp & 0x1E) >> 1) return(HANTRO_NOK);

                /* sign */
                if (tmp & 0x1)
                    level = -level;
            }
        }
        /* table search */
        else
        {
            /* first bit is 0 (msb) */
            if (inputBuffer<0x8000)
            {
                index = 0;
                tmpMask = 0x4000;
                /* scan next (2nd) zero */
                while (inputBuffer & tmpMask) 
                {
                    index += 2;
                    tmpMask >>= 1;
                }
                if (!tmpMask) return(HANTRO_NOK);

                /* scan next (3rd) zero, calculate rvlc length, 
                 * save the last bit of rvlc code and the sign bit */
                tmpMask >>= 1;
                length = (index>>1) + 5;
                while (inputBuffer & tmpMask)
                {
                    tmpMask >>= 1;
                    length++;
                }
                /*if (!tmpMask) return(HANTRO_NOK);*/
                if (length > 16) return(HANTRO_NOK);

                /* last bit before sign */
                tmp = inputBuffer & (tmpMask>>1) ? 1 : 0;
                
                /* calculate index to table */
                index += ((length-6) * 22) + tmp;
                if (index >= 234) return(HANTRO_NOK);

                if ( MB_IS_INTRA(mbNum) )
                {
                    rlc = (u32)rvlcTable1Intra[index];
                }
                else
                {
                    rlc = (u32)rvlcTable1Inter[index];
                }

                /*if (rlc == EMPTY) return(HANTRO_NOK);*/

                BUFFER_FLUSH(buffer, length);

                level = rlc & 0x1FF;
                last = (rlc >> 15)&0x1;
                run = (rlc >> 9)&0x3F;

                /* sign */
                if (inputBuffer & (tmpMask>>2))
                {
                    level = -level;
                }
            }
            /* 1st bit is 1 (msb) */
            else 
            {
                /* scan next high bit (starting from bit number 3) */
                tmpMask = 0x1000;
                length = 6;
                while (tmpMask && !(inputBuffer & tmpMask)) 
                {
                    length++;
                    tmpMask >>= 1;
                }
                if (length > 15) return(HANTRO_NOK);

                tmp = inputBuffer & (tmpMask>>1) ? 1 : 0;

                index = (length-6)*2 + tmp;
                
                if ( MB_IS_INTRA(mbNum) )
                {
                    rlc = rvlcTable2Intra[index];
                }
                else
                {
                    rlc = rvlcTable2Inter[index];
                }

                BUFFER_FLUSH(buffer, length);

                level = rlc & 0x1FF;
                last = (rlc >> 15)&0x1;
                run = (rlc >> 9)&0x3F;

                /* sign */
                if (inputBuffer & (tmpMask>>2))
                {
                    level = -level;
                }
            }
        }

        CodeCount += run + 1;

        if ( CodeCount>64 )
        {
            return(HANTRO_NOK);
        }

        if (MB_IS_INTER(mbNum))
        {
            tmp = zigZagScan[CodeCount-1];
            pOut[tmp] = level;
            DEQUANTIZE(pOut[tmp],QP);
        }
        else
        {
            /* quantize all but first row and column */
            if (scanDir == 0)
	        	tmp = zigZagScan[CodeCount-1];
            else if (scanDir == 1)
		        tmp = horScan[CodeCount-1];
            else
	    	    tmp = verScan[CodeCount-1];
            
            pOut[tmp] = level;
            if ((tmp > 8) && (tmp & 0x7))
            {
                DEQUANTIZE(pOut[tmp], QP);
            }
        }

        if ( ((tmp>>3)+1) >
             pDecContainer->StrmStorage.numIdctRows )
        {
            pDecContainer->StrmStorage.numIdctRows =
                (tmp>>3) + 1;
        }

    } while(!last);

    tmp = SwDec_FlushBits(pDecContainer,32-buffer.bits);
    return(tmp);

}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -