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

📄 h264.c

📁 播放H264文件的播放器
💻 C
📖 第 1 页 / 共 5 页
字号:
                /* col_zero_flag */                if(!IS_INTRA(mb_type_col[0]) && (   l1ref0[x8 + y8*b8_stride] == 0                                              || (l1ref0[x8 + y8*b8_stride] < 0 && l1ref1[x8 + y8*b8_stride] == 0                                                  && (h->x264_build>33 || !h->x264_build)))){                    const int16_t (*l1mv)[2]= l1ref0[x8 + y8*b8_stride] == 0 ? l1mv0 : l1mv1;                    if(IS_SUB_8X8(sub_mb_type)){                        const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride];                        if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){                            if(ref[0] == 0)                                fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);                            if(ref[1] == 0)                                fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);                        }                    }else                    for(i4=0; i4<4; i4++){                        const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride];                        if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){                            if(ref[0] == 0)                                *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0;                            if(ref[1] == 0)                                *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0;                        }                    }                }            }        }    }else{ /* direct temporal mv pred */        const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]};        const int *dist_scale_factor = h->dist_scale_factor;        int ref_offset= 0;        if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){            map_col_to_list0[0] = h->map_col_to_list0_field[s->mb_y&1][0];            map_col_to_list0[1] = h->map_col_to_list0_field[s->mb_y&1][1];            dist_scale_factor   =h->dist_scale_factor_field[s->mb_y&1];        }        if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0]))            ref_offset += 16;        if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){            /* FIXME assumes direct_8x8_inference == 1 */            int y_shift  = 2*!IS_INTERLACED(*mb_type);            for(i8=0; i8<4; i8++){                const int x8 = i8&1;                const int y8 = i8>>1;                int ref0, scale;                const int16_t (*l1mv)[2]= l1mv0;                if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))                    continue;                h->sub_mb_type[i8] = sub_mb_type;                fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);                if(IS_INTRA(mb_type_col[y8])){                    fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);                    fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);                    fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);                    continue;                }                ref0 = l1ref0[x8 + y8*b8_stride];                if(ref0 >= 0)                    ref0 = map_col_to_list0[0][ref0 + ref_offset];                else{                    ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset];                    l1mv= l1mv1;                }                scale = dist_scale_factor[ref0];                fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);                {                    const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride];                    int my_col = (mv_col[1]<<y_shift)/2;                    int mx = (scale * mv_col[0] + 128) >> 8;                    int my = (scale * my_col + 128) >> 8;                    fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);                    fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4);                }            }            return;        }        /* one-to-one mv scaling */        if(IS_16X16(*mb_type)){            int ref, mv0, mv1;            fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1);            if(IS_INTRA(mb_type_col[0])){                ref=mv0=mv1=0;            }else{                const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0] + ref_offset]                                                : map_col_to_list0[1][l1ref1[0] + ref_offset];                const int scale = dist_scale_factor[ref0];                const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0];                int mv_l0[2];                mv_l0[0] = (scale * mv_col[0] + 128) >> 8;                mv_l0[1] = (scale * mv_col[1] + 128) >> 8;                ref= ref0;                mv0= pack16to32(mv_l0[0],mv_l0[1]);                mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);            }            fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1);            fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4);            fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4);        }else{            for(i8=0; i8<4; i8++){                const int x8 = i8&1;                const int y8 = i8>>1;                int ref0, scale;                const int16_t (*l1mv)[2]= l1mv0;                if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))                    continue;                h->sub_mb_type[i8] = sub_mb_type;                fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);                if(IS_INTRA(mb_type_col[0])){                    fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);                    fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);                    fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);                    continue;                }                ref0 = l1ref0[x8 + y8*b8_stride] + ref_offset;                if(ref0 >= 0)                    ref0 = map_col_to_list0[0][ref0];                else{                    ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset];                    l1mv= l1mv1;                }                scale = dist_scale_factor[ref0];                fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);                if(IS_SUB_8X8(sub_mb_type)){                    const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride];                    int mx = (scale * mv_col[0] + 128) >> 8;                    int my = (scale * mv_col[1] + 128) >> 8;                    fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);                    fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4);                }else                for(i4=0; i4<4; i4++){                    const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride];                    int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]];                    mv_l0[0] = (scale * mv_col[0] + 128) >> 8;                    mv_l0[1] = (scale * mv_col[1] + 128) >> 8;                    *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] =                        pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);                }            }        }    }}static _inline void write_back_motion(H264Context *h, int mb_type){    MpegEncContext * const s = &h->s;    const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;    const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride;    int list;    if(!USES_LIST(mb_type, 0))        fill_rectangle(&s->current_picture.ref_index[0][b8_xy], 2, 2, h->b8_stride, (uint8_t)LIST_NOT_USED, 1);    for(list=0; list<h->list_count; list++){        int y;        if(!USES_LIST(mb_type, list))            continue;        for(y=0; y<4; y++){            *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+0 + 8*y];            *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+2 + 8*y];        }        if( h->pps.cabac ) {            if(IS_SKIP(mb_type))                fill_rectangle(h->mvd_table[list][b_xy], 4, 4, h->b_stride, 0, 4);            else            for(y=0; y<4; y++){                *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y];                *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y];            }        }        {            int8_t *ref_index = &s->current_picture.ref_index[list][b8_xy];            ref_index[0+0*h->b8_stride]= h->ref_cache[list][scan8[0]];            ref_index[1+0*h->b8_stride]= h->ref_cache[list][scan8[4]];            ref_index[0+1*h->b8_stride]= h->ref_cache[list][scan8[8]];            ref_index[1+1*h->b8_stride]= h->ref_cache[list][scan8[12]];        }    }    if(h->slice_type_nos == FF_B_TYPE && h->pps.cabac){        if(IS_8X8(mb_type)){            uint8_t *direct_table = &h->direct_table[b8_xy];            direct_table[1+0*h->b8_stride] = IS_DIRECT(h->sub_mb_type[1]) ? 1 : 0;            direct_table[0+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[2]) ? 1 : 0;            direct_table[1+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[3]) ? 1 : 0;        }    }}const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){    int i, si, di;    uint8_t *dst;    int bufidx;//    src[0]&0x80;                //forbidden bit    h->nal_ref_idc= src[0]>>5;    h->nal_unit_type= src[0]&0x1F;    src++; length--;#if 0    for(i=0; i<length; i++)        printf("%2X ", src[i]);#endif#if HAVE_FAST_UNALIGNED# if HAVE_FAST_64BIT#   define RS 7    for(i=0; i+1<length; i+=9){        if(!((~*(const uint64_t*)(src+i) & (*(const uint64_t*)(src+i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL))# else#   define RS 3    for(i=0; i+1<length; i+=5){        if(!((~*(const uint32_t*)(src+i) & (*(const uint32_t*)(src+i) - 0x01000101U)) & 0x80008080U))# endif            continue;        if(i>0 && !src[i]) i--;        while(src[i]) i++;#else#   define RS 0    for(i=0; i+1<length; i+=2){        if(src[i]) continue;        if(i>0 && src[i-1]==0) i--;#endif        if(i+2<length && src[i+1]==0 && src[i+2]<=3){            if(src[i+2]!=3){                /* startcode, so we must be past the end */                length=i;            }            break;        }        i-= RS;    }    if(i>=length-1){ //no escaped 0        *dst_length= length;        *consumed= length+1; //+1 for the header        return src;    }    bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data    h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);    dst= h->rbsp_buffer[bufidx];    if (dst == NULL){        return NULL;    }//printf("decoding esc\n");    memcpy(dst, src, i);    si=di=i;    while(si+2<length){        //remove escapes (very rare 1:2^22)        if(src[si+2]>3){            dst[di++]= src[si++];            dst[di++]= src[si++];        }else if(src[si]==0 && src[si+1]==0){            if(src[si+2]==3){ //escape                dst[di++]= 0;                dst[di++]= 0;                si+=3;                continue;            }else //next start code                goto nsc;        }        dst[di++]= src[si++];    }    while(si<length)        dst[di++]= src[si++];nsc:    memset(dst+di, 0, FF_INPUT_BUFFER_PADDING_SIZE);    *dst_length= di;    *consumed= si + 1;//+1 for the header//FIXME store exact number of bits in the getbitcontext (it is needed for decoding)    return dst;}int ff_h264_decode_rbsp_trailing(H264Context *h, const uint8_t *src){    int v= *src;    int r;    tprintf(h->s.avctx, "rbsp trailing %X\n", v);    for(r=1; r<9; r++){        if(v&1) return r;        v>>=1;    }    return 0;}/** * IDCT transforms the 16 dc values and dequantizes them. * @param qp quanti

⌨️ 快捷键说明

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