Revision 4866bd2b libavcodec/h264.c

View differences:

libavcodec/h264.c
1205 1205
    const int b4_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
1206 1206
    const int mb_type_col = h->ref_list[1][0].mb_type[mb_xy];
1207 1207
    const int16_t (*l1mv0)[2] = (const int16_t (*)[2]) &h->ref_list[1][0].motion_val[0][b4_xy];
1208
    const int16_t (*l1mv1)[2] = (const int16_t (*)[2]) &h->ref_list[1][0].motion_val[1][b4_xy];
1208 1209
    const int8_t *l1ref0 = &h->ref_list[1][0].ref_index[0][b8_xy];
1209 1210
    const int8_t *l1ref1 = &h->ref_list[1][0].ref_index[1][b8_xy];
1210 1211
    const int is_b8x8 = IS_8X8(*mb_type);
......
1273 1274
        if(IS_16X16(*mb_type)){
1274 1275
            fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref[0], 1);
1275 1276
            fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, ref[1], 1);
1276
            if(!IS_INTRA(mb_type_col) && l1ref0[0] == 0 &&
1277
                ABS(l1mv0[0][0]) <= 1 && ABS(l1mv0[0][1]) <= 1){
1277
            if(!IS_INTRA(mb_type_col) 
1278
               && (   l1ref0[0] == 0 && ABS(l1mv0[0][0]) <= 1 && ABS(l1mv0[0][1]) <= 1
1279
                   || l1ref0[0]  < 0 && l1ref1[0] == 0 && ABS(l1mv1[0][0]) <= 1 && ABS(l1mv1[0][1]) <= 1)){
1278 1280
                if(ref[0] > 0)
1279 1281
                    fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mv[0][0],mv[0][1]), 4);
1280 1282
                else
......
1302 1304
                fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, ref[1], 1);
1303 1305
    
1304 1306
                /* col_zero_flag */
1305
                if(!IS_INTRA(mb_type_col) && l1ref0[x8 + y8*h->b8_stride] == 0){
1307
                if(!IS_INTRA(mb_type_col) && (   l1ref0[x8 + y8*h->b8_stride] == 0 
1308
                                              || l1ref0[x8 + y8*h->b8_stride] < 0 && l1ref1[x8 + y8*h->b8_stride] == 0)){
1309
                    const int16_t (*l1mv)[2]= l1ref0[x8 + y8*h->b8_stride] == 0 ? l1mv0 : l1mv1;
1306 1310
                    for(i4=0; i4<4; i4++){
1307
                        const int16_t *mv_col = l1mv0[x8*2 + (i4&1) + (y8*2 + (i4>>1))*h->b_stride];
1311
                        const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*h->b_stride];
1308 1312
                        if(ABS(mv_col[0]) <= 1 && ABS(mv_col[1]) <= 1){
1309 1313
                            if(ref[0] == 0)
1310 1314
                                *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0;

Also available in: Unified diff