Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 15 Jun 2011 00:15:25 +0000 (02:15 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 15 Jun 2011 00:15:25 +0000 (02:15 +0200)
* qatar/master:
  swscale: remove misplaced comment.
  ffmpeg: fix streaming to ffserver.
  swscale: split out RGB48 output functions from yuv2packed[12X]_c().
  build: move vpath directives to main Makefile
  swscale: fix JPEG-range YUV scaling artifacts.
  build: move ALLFFLIBS to a more logical place
  ARM: factor some repetitive code into macros
  Fix SVQ3 after adding 4:4:4 H.264 support
  H.264: fix CODEC_FLAG_GRAY
  4:4:4 H.264 decoding support
  ac3enc: fix allocation of floating point samples.

Conflicts:
ffmpeg.c
libavcodec/dsputil_template.c
libavcodec/h264.c
libavcodec/mpegvideo.c
libavcodec/snow.c
libswscale/swscale.c
libswscale/swscale_internal.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
25 files changed:
1  2 
Makefile
common.mak
libavcodec/ac3enc.c
libavcodec/ac3enc.h
libavcodec/arm/h264dsp_init_arm.c
libavcodec/arm/mpegvideo_armv5te_s.S
libavcodec/arm/simple_idct_armv5te.S
libavcodec/dsputil.h
libavcodec/dsputil_template.c
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_cabac.c
libavcodec/h264_cavlc.c
libavcodec/h264_loopfilter.c
libavcodec/h264_ps.c
libavcodec/h264dsp.h
libavcodec/h264idct_template.c
libavcodec/mpegvideo.c
libavcodec/ppc/h264_altivec.c
libavcodec/snow.c
libavcodec/svq3.c
libavcodec/x86/dsputil_mmx.c
libavcodec/x86/h264_i386.h
libavcodec/x86/h264_idct.asm
libswscale/swscale.c

diff --cc Makefile
+++ b/Makefile
@@@ -21,9 -25,10 +26,11 @@@ HOSTPROGS  := $(TESTTOOLS:%=tests/%
  
  BASENAMES   = ffmpeg ffplay ffprobe ffserver
  ALLPROGS    = $(BASENAMES:%=%$(EXESUF))
 +ALLPROGS_G  = $(BASENAMES:%=%_g$(EXESUF))
  ALLMANPAGES = $(BASENAMES:%=%.1)
  
+ ALLFFLIBS = avcodec avdevice avfilter avformat avutil postproc swscale
  FFLIBS-$(CONFIG_AVDEVICE) += avdevice
  FFLIBS-$(CONFIG_AVFILTER) += avfilter
  FFLIBS-$(CONFIG_AVFORMAT) += avformat
diff --cc common.mak
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -79,10 -79,10 +79,10 @@@ static inline void FUNC(copy_block16)(u
  
  /* draw the edges of width 'w' of an image of size width, height */
  //FIXME check that this is ok for mpeg4 interlaced
- static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height, int w, int sides)
 -static void FUNCC(draw_edges)(uint8_t *_buf, int _wrap, int width, int height, int w, int h, int sides)
++static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height, int w, int h, int sides)
  {
 -    pixel *buf = (pixel*)_buf;
 -    int wrap = _wrap / sizeof(pixel);
 +    pixel *buf = (pixel*)p_buf;
 +    int wrap = p_wrap / sizeof(pixel);
      pixel *ptr, *last_line;
      int i;
  
@@@ -636,10 -674,15 +674,15 @@@ static inline void prefetch_motion(H264
          const int mx= (h->mv_cache[list][scan8[0]][0]>>2) + 16*s->mb_x + 8;
          const int my= (h->mv_cache[list][scan8[0]][1]>>2) + 16*s->mb_y;
          uint8_t **src= h->ref_list[list][refn].data;
 -        int off= (mx << pixel_shift) + (my + (s->mb_x&3)*4)*h->mb_linesize + (64 << pixel_shift);
 +        int off= ((mx+64)<<h->pixel_shift) + (my + (s->mb_x&3)*4)*h->mb_linesize;
          s->dsp.prefetch(src[0]+off, s->linesize, 4);
-         off= (((mx>>1)+64)<<h->pixel_shift) + ((my>>1) + (s->mb_x&7))*s->uvlinesize;
-         s->dsp.prefetch(src[1]+off, src[2]-src[1], 2);
+         if(chroma444){
+             s->dsp.prefetch(src[1]+off, s->linesize, 4);
+             s->dsp.prefetch(src[2]+off, s->linesize, 4);
+         }else{
 -            off= ((mx>>1) << pixel_shift) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + (64 << pixel_shift);
++            off= (((mx>>1)+64)<<pixel_shift) + ((my>>1) + (s->mb_x&7))*s->uvlinesize;
+             s->dsp.prefetch(src[1]+off, src[2]-src[1], 2);
+         }
      }
  }
  
@@@ -1819,15 -1925,15 +1925,17 @@@ static av_always_inline void hl_decode_
                      h->h264dsp.h264_idct_add8(dest, block_offset,
                                                h->mb, uvlinesize,
                                                h->non_zero_count_cache);
 -                }else{
 +                }
 +#if CONFIG_SVQ3_DECODER
 +                else{
-                     h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16*16     , h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
-                     h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16*16+4*16, h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
-                     for(i=16; i<16+8; i++){
-                         if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
-                             uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i];
-                             ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
+                     h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16*16*1, h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
+                     h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16*16*2, h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
+                     for(j=1; j<3; j++){
+                         for(i=j*16; i<j*16+4; i++){
+                             if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
+                                 uint8_t * const ptr= dest[j-1] + block_offset[i];
+                                 ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
+                             }
                          }
                      }
                  }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1294,20 -1315,22 +1413,22 @@@ static av_always_inline void fillPlane(
      }
  }
  
+ #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
+ #define r ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? b_r : r_b)
+ #define b ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? r_b : b_r)
  static av_always_inline void
 -rgb48ToY_c_template(uint8_t *dst, const uint8_t *src, int width,
 +rgb48ToY_c_template(int16_t *dst, const uint16_t *src, int width,
                      enum PixelFormat origin)
  {
      int i;
      for (i = 0; i < width; i++) {
- #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
-         int a = input_pixel(&src[i*3+0]);
-         int g = input_pixel(&src[i*3+1]);
-         int c = input_pixel(&src[i*3+2]);
 -        int r_b = input_pixel(&src[i*6+0]) >> 8;
 -        int   g = input_pixel(&src[i*6+2]) >> 8;
 -        int b_r = input_pixel(&src[i*6+4]) >> 8;
++        int r_b = input_pixel(&src[i*3+0]);
++        int   g = input_pixel(&src[i*3+1]);
++        int b_r = input_pixel(&src[i*3+2]);
  
- #define r ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? c : a)
- #define b ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? a : c)
 -        dst[i] = (RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +        dst[i] = (RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1+8)) + (1<<(RGB2YUV_SHIFT-7+8))) >> (RGB2YUV_SHIFT-6+8);
      }
  }
  
@@@ -1319,12 -1342,12 +1440,12 @@@ rgb48ToUV_c_template(int16_t *dstU, int
      int i;
      assert(src1==src2);
      for (i = 0; i < width; i++) {
-         int a = input_pixel(&src1[3*i + 0]);
-         int g = input_pixel(&src1[3*i + 1]);
-         int c = input_pixel(&src1[3*i + 2]);
 -        int r_b = input_pixel(&src1[i*6+0]) >> 8;
 -        int   g = input_pixel(&src1[i*6+2]) >> 8;
 -        int b_r = input_pixel(&src1[i*6+4]) >> 8;
++        int r_b = input_pixel(&src1[i*3+0]);
++        int   g = input_pixel(&src1[i*3+1]);
++        int b_r = input_pixel(&src1[i*3+2]);
  
 -        dstU[i] = (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 -        dstV[i] = (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +        dstU[i] = (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1+8)) + (1<<(RGB2YUV_SHIFT-7+8))) >> (RGB2YUV_SHIFT-6+8);
 +        dstV[i] = (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1+8)) + (1<<(RGB2YUV_SHIFT-7+8))) >> (RGB2YUV_SHIFT-6+8);
      }
  }
  
@@@ -1336,13 -1359,15 +1457,15 @@@ rgb48ToUV_half_c_template(int16_t *dstU
      int i;
      assert(src1==src2);
      for (i = 0; i < width; i++) {
-         int a = (input_pixel(&src1[6*i + 0])) + (input_pixel(&src1[6*i + 3]));
-         int g = (input_pixel(&src1[6*i + 1])) + (input_pixel(&src1[6*i + 4]));
-         int c = (input_pixel(&src1[6*i + 2])) + (input_pixel(&src1[6*i + 5]));
 -        int r_b = (input_pixel(&src1[12*i + 0]) >> 8) + (input_pixel(&src1[12*i + 6]) >> 8);
 -        int   g = (input_pixel(&src1[12*i + 2]) >> 8) + (input_pixel(&src1[12*i + 8]) >> 8);
 -        int b_r = (input_pixel(&src1[12*i + 4]) >> 8) + (input_pixel(&src1[12*i + 10]) >> 8);
++        int r_b = (input_pixel(&src1[6*i + 0])) + (input_pixel(&src1[6*i + 3]));
++        int   g = (input_pixel(&src1[6*i + 1])) + (input_pixel(&src1[6*i + 4]));
++        int b_r = (input_pixel(&src1[6*i + 2])) + (input_pixel(&src1[6*i + 5]));
  
 -        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
 -        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
 +        dstU[i]= (RU*r + GU*g + BU*b + (256U<<(RGB2YUV_SHIFT+8)) + (1<<(RGB2YUV_SHIFT-6+8))) >> (RGB2YUV_SHIFT-5+8);
 +        dstV[i]= (RV*r + GV*g + BV*b + (256U<<(RGB2YUV_SHIFT+8)) + (1<<(RGB2YUV_SHIFT-6+8))) >> (RGB2YUV_SHIFT-5+8);
      }
+ }
  #undef r
  #undef b
  #undef input_pixel
@@@ -1374,8 -1398,12 +1496,12 @@@ rgb48funcs(rgb, BE, PIX_FMT_RGB48BE)
  rgb48funcs(bgr, LE, PIX_FMT_BGR48LE);
  rgb48funcs(bgr, BE, PIX_FMT_BGR48BE);
  
+ #define input_pixel(i) ((origin == PIX_FMT_RGBA || origin == PIX_FMT_BGRA || \
+                          origin == PIX_FMT_ARGB || origin == PIX_FMT_ABGR) ? AV_RN32A(&src[(i)*4]) : \
+                         (isBE(origin) ? AV_RB16(&src[(i)*2]) : AV_RL16(&src[(i)*2])))
  static av_always_inline void
 -rgb16_32ToY_c_template(uint8_t *dst, const uint8_t *src,
 +rgb16_32ToY_c_template(int16_t *dst, const uint8_t *src,
                         int width, enum PixelFormat origin,
                         int shr,   int shg,   int shb, int shp,
                         int maskr, int maskg, int maskb,
@@@ -1451,12 -1476,13 +1574,13 @@@ rgb16_32ToUV_half_c_template(int16_t *d
          }
          r = (rb & maskr) >> shr;
  
 -        dstU[i] = (ru * r + gu * g + bu * b + rnd) >> (S + 1);
 -        dstV[i] = (rv * r + gv * g + bv * b + rnd) >> (S + 1);
 +        dstU[i] = (ru * r + gu * g + bu * b + (unsigned)rnd) >> ((S)-6+1);
 +        dstV[i] = (rv * r + gv * g + bv * b + (unsigned)rnd) >> ((S)-6+1);
      }
- #undef input_pixel
  }
  
+ #undef input_pixel
  #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
                           maskg, maskb, rsh, gsh, bsh, S) \
  static void name ## ToY_c(uint8_t *dst, const uint8_t *src, \
@@@ -1684,21 -1718,7 +1824,7 @@@ YUV_NBPS( 9, BE, PIX_FMT_YUV420P9BE)
  YUV_NBPS(10, LE, PIX_FMT_YUV420P10LE);
  YUV_NBPS(10, BE, PIX_FMT_YUV420P10BE);
  
- static inline void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
-                               const uint8_t *src1, const uint8_t *src2,
-                               int width, uint32_t *unused)
- {
-     nvXXtoUV_c(dstU, dstV, src1, width);
- }
- static inline void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
-                               const uint8_t *src1, const uint8_t *src2,
-                               int width, uint32_t *unused)
- {
-     nvXXtoUV_c(dstV, dstU, src1, width);
- }
 -static void bgr24ToY_c(uint8_t *dst, const uint8_t *src,
 +static void bgr24ToY_c(int16_t *dst, const uint8_t *src,
                         int width, uint32_t *unused)
  {
      int i;