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

📄 h264.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[0+2*i]];            h->non_zero_count_cache[3+8*2 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[1+2*i]];            h->non_zero_count_cache[0+8*1 +   8*i]= h->non_zero_count[left_xy[i]][left_block[4+2*i]];            h->non_zero_count_cache[0+8*4 +   8*i]= h->non_zero_count[left_xy[i]][left_block[5+2*i]];        }else{            h->non_zero_count_cache[3+8*1 + 2*8*i]=            h->non_zero_count_cache[3+8*2 + 2*8*i]=            h->non_zero_count_cache[0+8*1 +   8*i]=            h->non_zero_count_cache[0+8*4 +   8*i]= 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<h->list_count; 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][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];                *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];                *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];                *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];                h->ref_cache[list][scan8[0] + 0 - 1*8]=                h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];                h->ref_cache[list][scan8[0] + 2 - 1*8]=                h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];            }else{                *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]=                *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]=                *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]=                *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0;                *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;            }            for(i=0; i<2; i++){                int cache_idx = scan8[0] - 1 + i*2*8;                if(USES_LIST(left_type[i], list)){                    const int b_xy= h->mb2b_xy[left_xy[i]] + 3;                    const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1;                    *(uint32_t*)h->mv_cache[list][cache_idx  ]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0+i*2]];                    *(uint32_t*)h->mv_cache[list][cache_idx+8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1+i*2]];                    h->ref_cache[list][cache_idx  ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)];                    h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)];                }else{                    *(uint32_t*)h->mv_cache [list][cache_idx  ]=                    *(uint32_t*)h->mv_cache [list][cache_idx+8]= 0;                    h->ref_cache[list][cache_idx  ]=                    h->ref_cache[list][cache_idx+8]= left_type[i] ? LIST_NOT_USED : PART_NOT_AVAILABLE;                }            }            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 + h->b_stride + (topleft_partition & 2*h->b_stride);                const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + (topleft_partition & h->b8_stride);                *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];                h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];            }else{                *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0;                h->ref_cache[list][scan8[0] - 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][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];                h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];            }else{                *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0;                h->ref_cache[list][scan8[0] + 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][scan8[5 ]+1] =            h->ref_cache[list][scan8[7 ]+1] =            h->ref_cache[list][scan8[13]+1] =  //FIXME remove past 3 (init somewhere else)            h->ref_cache[list][scan8[4 ]] =            h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;            *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]=            *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]=            *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else)            *(uint32_t*)h->mv_cache [list][scan8[4 ]]=            *(uint32_t*)h->mv_cache [list][scan8[12]]= 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][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0];                    *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1];                    *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2];                    *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3];                }else{                    *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]=                    *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]=                    *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]=                    *(uint32_t*)h->mvd_cache [list][scan8[0] + 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][scan8[0] - 1 + 0*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[0]];                    *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[1]];                }else{                    *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]=                    *(uint32_t*)h->mvd_cache [list][scan8[0] - 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][scan8[0] - 1 + 2*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[2]];                    *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 3*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[3]];                }else{                    *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]=                    *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0;                }                *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]=                *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]=                *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else)                *(uint32_t*)h->mvd_cache [list][scan8[4 ]]=                *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0;                if(h->slice_type == B_TYPE){                    fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, 0, 1);                    if(IS_DIRECT(top_type)){                        *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101;                    }else if(IS_8X8(top_type)){                        int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride;                        h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy];                        h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1];                    }else{                        *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0;                    }                    if(IS_DIRECT(left_type[0]))                        h->direct_cache[scan8[0] - 1 + 0*8]= 1;                    else if(IS_8X8(left_type[0]))                        h->direct_cache[scan8[0] - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)];                    else                        h->direct_cache[scan8[0] - 1 + 0*8]= 0;                    if(IS_DIRECT(left_type[1]))                        h->direct_cache[scan8[0] - 1 + 2*8]= 1;                    else if(IS_8X8(left_type[1]))                        h->direct_cache[scan8[0] - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)];                    else                        h->direct_cache[scan8[0] - 1 + 2*8]= 0;                }            }            if(FRAME_MBAFF){#define MAP_MVS\                    MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\                    MAP_F2F(scan8[0] + 0 - 1*8, top_type)\                    MAP_F2F(scan8[0] + 1 - 1*8, top_type)\                    MAP_F2F(scan8[0] + 2 - 1*8, top_type)\                    MAP_F2F(scan8[0] + 3 - 1*8, top_type)\                    MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\                    MAP_F2F(scan8[0] - 1 + 0*8, left_type[0])\                    MAP_F2F(scan8[0] - 1 + 1*8, left_type[0])\                    MAP_F2F(scan8[0] - 1 + 2*8, left_type[1])\                    MAP_F2F(scan8[0] - 1 + 3*8, left_type[1])                if(MB_FIELD){#define MAP_F2F(idx, mb_type)\                    if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\                        h->ref_cache[list][idx] <<= 1;\                        h->mv_cache[list][idx][1] /= 2;\                        h->mvd_cache[list][idx][1] /= 2;\                    }                    MAP_MVS#undef MAP_F2F                }else{#define MAP_F2F(idx, mb_type)\                    if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\                        h->ref_cache[list][idx] >>= 1;\                        h->mv_cache[list][idx][1] <<= 1;\                        h->mvd_cache[list][idx][1] <<= 1;\                    }                    MAP_MVS#undef MAP_F2F                }            }        }    }#endif    h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]);}static inline void write_back_intra_pred_mode(H264Context *h){    MpegEncContext * const s = &h->s;    const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;    h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1];    h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2];    h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3];    h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4];    h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4];    h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4];    h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];}/** * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. */static inline int check_intra4x4_pred_mode(H264Context *h){    MpegEncContext * const s = &h->s;    static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};    static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};    int i;    if(!(h->top_samples_available&0x8000)){        for(i=0; i<4; i++){            int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];            if(status<0){                av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y);                return -1;            } else if(status){                h->intra4x4_pred_mode_cache[scan8[0] + i]= status;            }        }    }    if(!(h->left_samples_available&0x8000)){        for(i=0; i<4; i++){            int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ];            if(status<0){                av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y);                return -1;            } else if(status){                h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;            }        }    }    return 0;} //FIXME cleanup like next/** * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. */static inline int check_intra_pred_mode(H264Context *h, int mode){    MpegEncContext * const s = &h->s;    static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};    static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};    if(mode > 6U) {        av_log(h->s.avctx, AV_LOG_ERROR, "out of range intra chroma pred mode at %d %d\n", s->mb_x, s->mb_y);        return -1;    }    if(!(h->top_samples_available&0x8000)){        mode= top[ mode ];        if(mode<0){            av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra mode at %d %d\n", s->mb_x, s->mb_y);            return -1;        }    }    if(!(h->left_samples_available&0x8000)){        mode= left[ mode ];        if(mode<0){            av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra mode at %d %d\n", s->mb_x, s->mb_y);            return -1;        }    }

⌨️ 快捷键说明

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