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

📄 h264.c

📁 This the source release kit for the following system configuration(s): - AMD Alchemy(TM) DBAu1200(
💻 C
📖 第 1 页 / 共 5 页
字号:
                    left_block[6]= 7;
                    left_block[7]= 10;
                }
            } else {
                left_xy[1] += s->mb_stride;
                //left_block[0]= 0;
                left_block[1]= 2;
                left_block[2]= 0;
                left_block[3]= 2;
                //left_block[4]= 7;
                left_block[5]= 10;
                left_block[6]= 7;
                left_block[7]= 10;
            }
        }
    }

    h->top_mb_xy = top_xy;
    h->left_mb_xy[0] = left_xy[0];
    h->left_mb_xy[1] = left_xy[1];
    if (for_deblock){
        topleft_type = 0;
        topright_type = 0;
        top_type     = h->slice_table[top_xy     ] < 255 ? s->current_picture.mb_type[top_xy]     : 0;
        left_type[0] = h->slice_table[left_xy[0] ] < 255 ? s->current_picture.mb_type[left_xy[0]] : 0;
        left_type[1] = h->slice_table[left_xy[1] ] < 255 ? s->current_picture.mb_type[left_xy[1]] : 0;

        if (FRAME_MBAFF && !IS_INTRA(mb_type)){
            int list;
            int v = *(uint16_t*)&h->non_zero_count[mb_xy][14];
            for (i=0; i<16; i++)
                h->non_zero_count_cache[scan8[i]] = (v>>i)&1;
            for (list=0; list<1+(h->slice_type==B_TYPE); list++){
                if (USES_LIST(mb_type,list)){
                    uint32_t *src = (uint32_t*)s->current_picture.motion_val[list][h->mb2b_xy[mb_xy]];
                    uint32_t *dst = (uint32_t*)h->mv_cache[list][12];
                    int8_t *ref = &s->current_picture.ref_index[list][h->mb2b8_xy[mb_xy]];
                    for (i=0; i<4; i++, dst+=8, src+=h->b_stride){
                        dst[0] = src[0];
                        dst[1] = src[1];
                        dst[2] = src[2];
                        dst[3] = src[3];
                    }
                    *(uint32_t*)&h->ref_cache[list][12] =
                    *(uint32_t*)&h->ref_cache[list][20] = pack16to32(ref[0],ref[1])*0x0101;
                    ref += h->b8_stride;
                    *(uint32_t*)&h->ref_cache[list][28] =
                    *(uint32_t*)&h->ref_cache[list][36] = pack16to32(ref[0],ref[1])*0x0101;
                }else{
                    fill_rectangle(&h-> mv_cache[list][12], 4, 4, 8, 0, 4);
                    fill_rectangle(&h->ref_cache[list][12], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1);
                }
            }
        }
    }else{
        topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
        top_type     = h->slice_table[top_xy     ] == h->slice_num ? s->current_picture.mb_type[top_xy]     : 0;
        topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
        left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
        left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
    }

    if (IS_INTRA(mb_type)){
        h->topleft_samples_available=
        h->top_samples_available=
        h->left_samples_available= 0xFFFF;
        h->topright_samples_available= 0xEEEA;

        if (!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred)){
            h->topleft_samples_available= 0xB3FF;
            h->top_samples_available= 0x33FF;
            h->topright_samples_available= 0x26EA;
        }
        for (i=0; i<2; i++){
            if (!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred)){
                h->topleft_samples_available&= 0xDF5F;
                h->left_samples_available&= 0x5F5F;
            }
        }

        if (!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred))
            h->topleft_samples_available&= 0x7FFF;

        if (!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred))
            h->topright_samples_available&= 0xFBFF;

        if (IS_INTRA4x4(mb_type)){
            if (IS_INTRA4x4(top_type)){
                h->intra4x4_pred_mode_cache[4]= h->intra4x4_pred_mode[top_xy][4];
                h->intra4x4_pred_mode_cache[5]= h->intra4x4_pred_mode[top_xy][5];
                h->intra4x4_pred_mode_cache[6]= h->intra4x4_pred_mode[top_xy][6];
                h->intra4x4_pred_mode_cache[7]= h->intra4x4_pred_mode[top_xy][3];
            }else{
                int pred;
                if (!top_type || (IS_INTER(top_type) && h->pps.constrained_intra_pred))
                    pred= -1;
                else{
                    pred= 2;
                }
                h->intra4x4_pred_mode_cache[4]=
                h->intra4x4_pred_mode_cache[5]=
                h->intra4x4_pred_mode_cache[6]=
                h->intra4x4_pred_mode_cache[7]= pred;
            }
            for (i=0; i<2; i++){
                if (IS_INTRA4x4(left_type[i])){
                    h->intra4x4_pred_mode_cache[3+8*1 + (i<<4)]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+(i<<1)]];
                    h->intra4x4_pred_mode_cache[3+8*2 + (i<<4)]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+(i<<1)]];
                }else{
                    int pred;
                    if (!left_type[i] || (IS_INTER(left_type[i]) && h->pps.constrained_intra_pred))
                        pred= -1;
                    else{
                        pred= 2;
                    }
                    h->intra4x4_pred_mode_cache[3+8*1 + (i<<4)]=
                    h->intra4x4_pred_mode_cache[3+8*2 + (i<<4)]= pred;
                }
            }
        }
    }


/*
0 . T T. T T T T
1 L . .L . . . .
2 L . .L . . . .
3 . T TL . . . .
4 L . .L . . . .
5 L . .. . . . .
*/
//FIXME constraint_intra_pred & partitioning & nnz (lets hope this is just a typo in the spec)
    if (top_type){
        h->non_zero_count_cache[4]= h->non_zero_count[top_xy][4];
        h->non_zero_count_cache[5]= h->non_zero_count[top_xy][5];
        h->non_zero_count_cache[6]= h->non_zero_count[top_xy][6];
        h->non_zero_count_cache[7]= h->non_zero_count[top_xy][3];

        h->non_zero_count_cache[1]= h->non_zero_count[top_xy][9];
        h->non_zero_count_cache[2]= h->non_zero_count[top_xy][8];

        h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][12];
        h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];

    }else{
        h->non_zero_count_cache[4]=
        h->non_zero_count_cache[5]=
        h->non_zero_count_cache[6]=
        h->non_zero_count_cache[7]=

        h->non_zero_count_cache[1]=
        h->non_zero_count_cache[2]=

        h->non_zero_count_cache[1+8*3]=
        h->non_zero_count_cache[2+8*3]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;

    }

    for (i=0; i<2; i++) {
        if (left_type[i]){
            h->non_zero_count_cache[3+8*1 + (i<<4)]= h->non_zero_count[left_xy[i]][left_block[0+(i<<1)]];
            h->non_zero_count_cache[3+8*2 + (i<<4)]= h->non_zero_count[left_xy[i]][left_block[1+(i<<1)]];
            h->non_zero_count_cache[0+8*1 + (i<<3)]= h->non_zero_count[left_xy[i]][left_block[4+(i<<1)]];
            h->non_zero_count_cache[0+8*4 + (i<<3)]= h->non_zero_count[left_xy[i]][left_block[5+(i<<1)]];
        }else{
            h->non_zero_count_cache[3+8*1 + (i<<4)]=
            h->non_zero_count_cache[3+8*2 + (i<<4)]=
            h->non_zero_count_cache[0+8*1 + (i<<3)]=
            h->non_zero_count_cache[0+8*4 + (i<<3)]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;
        }
    }

    if ( h->pps.cabac ) {
        // top_cbp
        if (top_type) {
            h->top_cbp = h->cbp_table[top_xy];
        } else if (IS_INTRA(mb_type)) {
            h->top_cbp = 0x1C0;
        } else {
            h->top_cbp = 0;
        }
        // left_cbp
        if (left_type[0]) {
            h->left_cbp = h->cbp_table[left_xy[0]] & 0x1f0;
        } else if (IS_INTRA(mb_type)) {
            h->left_cbp = 0x1C0;
        } else {
            h->left_cbp = 0;
        }
        if (left_type[0]) {
            h->left_cbp |= ((h->cbp_table[left_xy[0]]>>((left_block[0]&(~1))+1))&0x1) << 1;
        }
        if (left_type[1]) {
            h->left_cbp |= ((h->cbp_table[left_xy[1]]>>((left_block[2]&(~1))+1))&0x1) << 3;
        }
    }

#if 1
    if (IS_INTER(mb_type) || IS_DIRECT(mb_type)){
        int list;
        for (list=0; list<1+(h->slice_type==B_TYPE); list++){
            if (!USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !h->deblocking_filter){
                /*if (!h->mv_cache_clean[list]){
                    memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
                    memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
                    h->mv_cache_clean[list]= 1;
                }*/
                continue;
            }
            h->mv_cache_clean[list]= 0;

            if (USES_LIST(top_type, list)){
                const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
                const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
                *(uint32_t*)h->mv_cache[list][12 + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
                *(uint32_t*)h->mv_cache[list][12 + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
                *(uint32_t*)h->mv_cache[list][12 + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
                *(uint32_t*)h->mv_cache[list][12 + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
                h->ref_cache[list][12 + 0 - 1*8]=
                h->ref_cache[list][12 + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
                h->ref_cache[list][12 + 2 - 1*8]=
                h->ref_cache[list][12 + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
            }else{
                *(uint32_t*)h->mv_cache [list][12 + 0 - 1*8]=
                *(uint32_t*)h->mv_cache [list][12 + 1 - 1*8]=
                *(uint32_t*)h->mv_cache [list][12 + 2 - 1*8]=
                *(uint32_t*)h->mv_cache [list][12 + 3 - 1*8]= 0;
                *(uint32_t*)&h->ref_cache[list][12 + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;
            }

            //FIXME unify cleanup or sth
            if (USES_LIST(left_type[0], list)){
                const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
                const int b8_xy= h->mb2b8_xy[left_xy[0]] + 1;
                *(uint32_t*)h->mv_cache[list][12 - 1 + 0*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0]];
                *(uint32_t*)h->mv_cache[list][12 - 1 + 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1]];
                h->ref_cache[list][12 - 1 + 0*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0]>>1)];
                h->ref_cache[list][12 - 1 + 1*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1]>>1)];
            }else{
                *(uint32_t*)h->mv_cache [list][12 - 1 + 0*8]=
                *(uint32_t*)h->mv_cache [list][12 - 1 + 1*8]= 0;
                h->ref_cache[list][12 - 1 + 0*8]=
                h->ref_cache[list][12 - 1 + 1*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
            }

            if (USES_LIST(left_type[1], list)){
                const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
                const int b8_xy= h->mb2b8_xy[left_xy[1]] + 1;
                *(uint32_t*)h->mv_cache[list][12 - 1 + 2*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[2]];
                *(uint32_t*)h->mv_cache[list][12 - 1 + 3*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[3]];
                h->ref_cache[list][12 - 1 + 2*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[2]>>1)];
                h->ref_cache[list][12 - 1 + 3*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[3]>>1)];
            }else{
                *(uint32_t*)h->mv_cache [list][12 - 1 + 2*8]=
                *(uint32_t*)h->mv_cache [list][12 - 1 + 3*8]= 0;
                h->ref_cache[list][12 - 1 + 2*8]=
                h->ref_cache[list][12 - 1 + 3*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
                assert((!left_type[0]) == (!left_type[1]));
            }

            if ((for_deblock || (IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred)) && !FRAME_MBAFF)
                continue;

            if (USES_LIST(topleft_type, list)){
                const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride;
                const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + h->b8_stride;
                *(uint32_t*)h->mv_cache[list][12 - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
                h->ref_cache[list][12 - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];
            }else{
                *(uint32_t*)h->mv_cache[list][12 - 1 - 1*8]= 0;
                h->ref_cache[list][12 - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
            }

            if (USES_LIST(topright_type, list)){
                const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride;
                const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride;
                *(uint32_t*)h->mv_cache[list][12 + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
                h->ref_cache[list][12 + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];
            }else{
                *(uint32_t*)h->mv_cache [list][12 + 4 - 1*8]= 0;
                h->ref_cache[list][12 + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
            }

            if ((IS_SKIP(mb_type) || IS_DIRECT(mb_type)) && !FRAME_MBAFF)
                continue;

            h->ref_cache[list][15+1] =
            h->ref_cache[list][23+1] =
            h->ref_cache[list][31+1] =  //FIXME remove past 3 (init somewhere else)
            h->ref_cache[list][14] =
            h->ref_cache[list][30] = PART_NOT_AVAILABLE;
            *(uint32_t*)h->mv_cache [list][15+1]=
            *(uint32_t*)h->mv_cache [list][23+1]=
            *(uint32_t*)h->mv_cache [list][31+1]= //FIXME remove past 3 (init somewhere else)
            *(uint32_t*)h->mv_cache [list][14]=
            *(uint32_t*)h->mv_cache [list][30]= 0;

            if ( h->pps.cabac ) {
                /* XXX beurk, Load mvd */
                if (USES_LIST(top_type, list)){
                    const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
                    *(uint32_t*)h->mvd_cache[list][12 + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0];
                    *(uint32_t*)h->mvd_cache[list][12 + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1];
                    *(uint32_t*)h->mvd_cache[list][12 + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2];
                    *(uint32_t*)h->mvd_cache[list][12 + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3];
                }else{
                    *(uint32_t*)h->mvd_cache [list][12 + 0 - 1*8]=
                    *(uint32_t*)h->mvd_cache [list][12 + 1 - 1*8]=
                    *(uint32_t*)h->mvd_cache [list][12 + 2 - 1*8]=
                    *(uint32_t*)h->mvd_cache [list][12 + 3 - 1*8]= 0;
                }
                if (USES_LIST(left_type[0], list)){
                    const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
                    *(uint32_t*)h->mvd_cache[list][12 - 1 + 0*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[0]];
                    *(uint32_t*)h->mvd_cache[list][12 - 1 + 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[1]];
                }else{
                    *(uint32_t*)h->mvd_cache [list][12 - 1 + 0*8]=
                    *(uint32_t*)h->mvd_cache [list][12 - 1 + 1*8]= 0;
                }
                if (USES_LIST(left_type[1], list)){
                    const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
                    *(uint32_t*)h->mvd_cache[list][12 - 1 + 2*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[2]];
                    *(uint32_t*)h->mvd_cache[list][12 - 1 + 3*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[3]];
                }else{
                    *(uint32_t*)h->mvd_cache [list][12 - 1 + 2*8]=
                    *(uint32_t*)h->mvd_cache [list][12 - 1 + 3*8]= 0;
                }
                *(uint32_t*)h->mvd_cache [list][15+1]=
                *(uint32_t*)h->mvd_cache [list][23+1]=
                *(uint32_t*)h->mvd_cache [list][31+1]= //FIXME remove past 3 (init somewhere else)
                *(uint32_t*)h->mvd_cache [list][14]=

⌨️ 快捷键说明

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