Merge commit '982b596ea6640bfe218a31f6c3fc542d9fe61c31'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 20 Feb 2014 21:48:00 +0000 (22:48 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 20 Feb 2014 22:02:38 +0000 (23:02 +0100)
* commit '982b596ea6640bfe218a31f6c3fc542d9fe61c31':
  h264: avoid undefined behavior in chroma motion compensation

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/h264chroma_template.c

  #include "bit_depth_template.c"
  
  #define H264_CHROMA_MC(OPNAME, OP)\
-     }else{\
 +static void FUNCC(OPNAME ## h264_chroma_mc1)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
 +    pixel *dst = (pixel*)_dst;\
 +    pixel *src = (pixel*)_src;\
 +    const int A=(8-x)*(8-y);\
 +    const int B=(  x)*(8-y);\
 +    const int C=(8-x)*(  y);\
 +    const int D=(  x)*(  y);\
 +    int i;\
 +    stride >>= sizeof(pixel)-1;\
 +    \
 +    av_assert2(x<8 && y<8 && x>=0 && y>=0);\
 +\
 +    if(D){\
 +        for(i=0; i<h; i++){\
 +            OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
 +            dst+= stride;\
 +            src+= stride;\
 +        }\
++    } else if (B + C) {\
 +        const int E= B+C;\
 +        const int step= C ? stride : 1;\
 +        for(i=0; i<h; i++){\
 +            OP(dst[0], (A*src[0] + E*src[step+0]));\
 +            dst+= stride;\
 +            src+= stride;\
 +        }\
++    } else {\
++        for(i=0; i<h; i++){\
++            OP(dst[0], (A*src[0]));\
++            dst+= stride;\
++            src+= stride;\
++        }\
 +    }\
 +}\
  static void FUNCC(OPNAME ## h264_chroma_mc2)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\
      pixel *dst = (pixel*)_dst;\
      pixel *src = (pixel*)_src;\