Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Oct 2012 13:54:37 +0000 (15:54 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Oct 2012 13:55:41 +0000 (15:55 +0200)
* qatar/master:
  mlpdsp: adding missing file
  dsputil: split out mlp dsp function
  sh4: add required #include, fix build
  averror: make error values proper negative values
  build: do not use LIB as variable name
  build: whitespace cosmetics
  build: remove single-use variable THIS_LIB

Conflicts:
libavutil/error.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/mlpdec.c
libavcodec/mlpdsp.c
libavcodec/mlpdsp.h
libavcodec/sh4/qpel.c
libavcodec/x86/mlpdsp.c
library.mak

diff --combined libavcodec/dsputil.c
@@@ -5,20 -5,20 +5,20 @@@
   *
   * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "mpegvideo.h"
  #include "config.h"
  #include "vorbis.h"
 +#include "diracdsp.h"
  
  uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, };
  uint32_t ff_squareTbl[512] = {0, };
  
 +#define pixeltmp int16_t
  #define BIT_DEPTH 9
  #include "dsputil_template.c"
  #undef BIT_DEPTH
  #include "dsputil_template.c"
  #undef BIT_DEPTH
  
 +#undef pixeltmp
 +#define pixeltmp int32_t
 +#define BIT_DEPTH 12
 +#include "dsputil_template.c"
 +#undef BIT_DEPTH
 +
 +#define BIT_DEPTH 14
 +#include "dsputil_template.c"
 +#undef BIT_DEPTH
 +
 +#undef pixeltmp
 +#define pixeltmp int16_t
  #define BIT_DEPTH 8
  #include "dsputil_template.c"
 +#undef pixeltmp
  
  // 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
  #define pb_7f (~0UL/255 * 0x7f)
@@@ -352,7 -337,7 +352,7 @@@ static int sse16_c(void *v, uint8_t *pi
      return s;
  }
  
 -static void diff_pixels_c(DCTELEM *restrict block, const uint8_t *s1,
 +static void diff_pixels_c(DCTELEM *av_restrict block, const uint8_t *s1,
                            const uint8_t *s2, int stride){
      int i;
  
  }
  
  
 -static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
 +static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *av_restrict pixels,
                                   int line_size)
  {
      int i;
      }
  }
  
 +static void put_pixels_clamped4_c(const DCTELEM *block, uint8_t *av_restrict pixels,
 +                                 int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<4;i++) {
 +        pixels[0] = av_clip_uint8(block[0]);
 +        pixels[1] = av_clip_uint8(block[1]);
 +        pixels[2] = av_clip_uint8(block[2]);
 +        pixels[3] = av_clip_uint8(block[3]);
 +
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
 +static void put_pixels_clamped2_c(const DCTELEM *block, uint8_t *av_restrict pixels,
 +                                 int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<2;i++) {
 +        pixels[0] = av_clip_uint8(block[0]);
 +        pixels[1] = av_clip_uint8(block[1]);
 +
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
  static void put_signed_pixels_clamped_c(const DCTELEM *block,
 -                                        uint8_t *restrict pixels,
 +                                        uint8_t *av_restrict pixels,
                                          int line_size)
  {
      int i, j;
      }
  }
  
 -static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
 +static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *av_restrict pixels,
                                   int line_size)
  {
      int i;
      }
  }
  
 +static void add_pixels_clamped4_c(const DCTELEM *block, uint8_t *av_restrict pixels,
 +                          int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<4;i++) {
 +        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
 +        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
 +        pixels[2] = av_clip_uint8(pixels[2] + block[2]);
 +        pixels[3] = av_clip_uint8(pixels[3] + block[3]);
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
 +static void add_pixels_clamped2_c(const DCTELEM *block, uint8_t *av_restrict pixels,
 +                          int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<2;i++) {
 +        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
 +        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
  static int sum_abs_dctelem_c(DCTELEM *block)
  {
      int sum=0, i;
@@@ -1333,51 -1256,6 +1333,51 @@@ void ff_avg_rv40_qpel8_mc33_c(uint8_t *
  }
  #endif /* CONFIG_RV40_DECODER */
  
 +#if CONFIG_DIRAC_DECODER
 +#define DIRAC_MC(OPNAME)\
 +void ff_ ## OPNAME ## _dirac_pixels8_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +     OPNAME ## _pixels8_8_c(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_8_c(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_8_c(dst   , src[0]   , stride, h);\
 +    OPNAME ## _pixels16_8_c(dst+16, src[0]+16, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels8_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels8_l2_8(dst, src[0], src[1], stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l2_8(dst, src[0], src[1], stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l2_8(dst   , src[0]   , src[1]   , stride, stride, stride, h);\
 +    OPNAME ## _pixels16_l2_8(dst+16, src[0]+16, src[1]+16, stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels8_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels8_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l4_8(dst   , src[0]   , src[1]   , src[2]   , src[3]   , stride, stride, stride, stride, stride, h);\
 +    OPNAME ## _pixels16_l4_8(dst+16, src[0]+16, src[1]+16, src[2]+16, src[3]+16, stride, stride, stride, stride, stride, h);\
 +}
 +DIRAC_MC(put)
 +DIRAC_MC(avg)
 +#endif
 +
  static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){
      uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
      int i;
@@@ -1812,7 -1690,7 +1812,7 @@@ static int try_8x8basis_c(int16_t rem[6
          int b= rem[i] + ((basis[i]*scale + (1<<(BASIS_SHIFT - RECON_SHIFT-1)))>>(BASIS_SHIFT - RECON_SHIFT));
          int w= weight[i];
          b>>= RECON_SHIFT;
 -        assert(-512<b && b<512);
 +        av_assert2(-512<b && b<512);
  
          sum += (w*b)*(w*b)>>4;
      }
@@@ -1931,7 -1809,7 +1931,7 @@@ static void add_bytes_c(uint8_t *dst, u
          dst[i+0] += src[i+0];
  }
  
 -static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
 +static void diff_bytes_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w){
      long i;
  #if !HAVE_FAST_UNALIGNED
      if((long)src2 & (sizeof(long)-1)){
@@@ -2071,7 -1949,7 +2071,7 @@@ static int hadamard8_diff8x8_c(/*MpegEn
      int temp[64];
      int sum=0;
  
 -    assert(h==8);
 +    av_assert2(h==8);
  
      for(i=0; i<8; i++){
          //FIXME try pointer walks
@@@ -2116,7 -1994,7 +2116,7 @@@ static int hadamard8_intra8x8_c(/*MpegE
      int temp[64];
      int sum=0;
  
 -    assert(h==8);
 +    av_assert2(h==8);
  
      for(i=0; i<8; i++){
          //FIXME try pointer walks
@@@ -2163,7 -2041,7 +2163,7 @@@ static int dct_sad8x8_c(/*MpegEncContex
      MpegEncContext * const s= (MpegEncContext *)c;
      LOCAL_ALIGNED_16(DCTELEM, temp, [64]);
  
 -    assert(h==8);
 +    av_assert2(h==8);
  
      s->dsp.diff_pixels(temp, src1, src2, stride);
      s->dsp.fdct(temp);
@@@ -2228,7 -2106,7 +2228,7 @@@ static int dct_max8x8_c(/*MpegEncContex
      LOCAL_ALIGNED_16(DCTELEM, temp, [64]);
      int sum=0, i;
  
 -    assert(h==8);
 +    av_assert2(h==8);
  
      s->dsp.diff_pixels(temp, src1, src2, stride);
      s->dsp.fdct(temp);
@@@ -2245,7 -2123,7 +2245,7 @@@ static int quant_psnr8x8_c(/*MpegEncCon
      DCTELEM * const bak = temp+64;
      int sum=0, i;
  
 -    assert(h==8);
 +    av_assert2(h==8);
      s->mb_intra=0;
  
      s->dsp.diff_pixels(temp, src1, src2, stride);
@@@ -2273,7 -2151,7 +2273,7 @@@ static int rd8x8_c(/*MpegEncContext*/ v
      uint8_t * length;
      uint8_t * last_length;
  
 -    assert(h==8);
 +    av_assert2(h==8);
  
      copy_block8(lsrc1, src1, 8, stride, 8);
      copy_block8(lsrc2, src2, 8, stride, 8);
  
          level= temp[i] + 64;
  
 -        assert(level - 64);
 +        av_assert2(level - 64);
  
          if((level&(~127)) == 0){
              bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
@@@ -2347,7 -2225,7 +2347,7 @@@ static int bit8x8_c(/*MpegEncContext*/ 
      uint8_t * length;
      uint8_t * last_length;
  
 -    assert(h==8);
 +    av_assert2(h==8);
  
      s->dsp.diff_pixels(temp, src1, src2, stride);
  
  
          level= temp[i] + 64;
  
 -        assert(level - 64);
 +        av_assert2(level - 64);
  
          if((level&(~127)) == 0){
              bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
@@@ -2522,7 -2400,7 +2522,7 @@@ static void vector_fmul_scalar_c(float 
          dst[i] = src[i] * mul;
  }
  
 -static void butterflies_float_c(float *restrict v1, float *restrict v2,
 +static void butterflies_float_c(float *av_restrict v1, float *av_restrict v2,
                                  int len)
  {
      int i;
@@@ -2745,37 -2623,6 +2745,37 @@@ static void ff_jref_idct_add(uint8_t *d
      add_pixels_clamped_c(block, dest, line_size);
  }
  
 +static void ff_jref_idct4_put(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct4 (block);
 +    put_pixels_clamped4_c(block, dest, line_size);
 +}
 +static void ff_jref_idct4_add(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct4 (block);
 +    add_pixels_clamped4_c(block, dest, line_size);
 +}
 +
 +static void ff_jref_idct2_put(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct2 (block);
 +    put_pixels_clamped2_c(block, dest, line_size);
 +}
 +static void ff_jref_idct2_add(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct2 (block);
 +    add_pixels_clamped2_c(block, dest, line_size);
 +}
 +
 +static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    dest[0] = av_clip_uint8((block[0] + 4)>>3);
 +}
 +static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
 +}
 +
  static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; }
  
  /* init static data */
@@@ -2807,7 -2654,7 +2807,7 @@@ int ff_check_alignment(void)
                  "Compiler did not align stack variables. Libavcodec has been miscompiled\n"
                  "and may be very slow or crash. This is not a bug in libavcodec,\n"
                  "but in the compiler. You may try recompiling using gcc >= 4.2.\n"
 -                "Do not report crashes to Libav developers.\n");
 +                "Do not report crashes to FFmpeg developers.\n");
  #endif
              did_fail=1;
          }
@@@ -2842,28 -2689,12 +2842,28 @@@ av_cold void ff_dsputil_init(DSPContext
      }
  #endif //CONFIG_ENCODERS
  
 -    if (avctx->bits_per_raw_sample == 10) {
 -        c->idct_put              = ff_simple_idct_put_10;
 -        c->idct_add              = ff_simple_idct_add_10;
 -        c->idct                  = ff_simple_idct_10;
 -        c->idct_permutation_type = FF_NO_IDCT_PERM;
 -    } else {
 +    if(avctx->lowres==1){
 +        c->idct_put= ff_jref_idct4_put;
 +        c->idct_add= ff_jref_idct4_add;
 +        c->idct    = ff_j_rev_dct4;
 +        c->idct_permutation_type= FF_NO_IDCT_PERM;
 +    }else if(avctx->lowres==2){
 +        c->idct_put= ff_jref_idct2_put;
 +        c->idct_add= ff_jref_idct2_add;
 +        c->idct    = ff_j_rev_dct2;
 +        c->idct_permutation_type= FF_NO_IDCT_PERM;
 +    }else if(avctx->lowres==3){
 +        c->idct_put= ff_jref_idct1_put;
 +        c->idct_add= ff_jref_idct1_add;
 +        c->idct    = ff_j_rev_dct1;
 +        c->idct_permutation_type= FF_NO_IDCT_PERM;
 +    }else{
 +        if (avctx->bits_per_raw_sample == 10) {
 +            c->idct_put              = ff_simple_idct_put_10;
 +            c->idct_add              = ff_simple_idct_add_10;
 +            c->idct                  = ff_simple_idct_10;
 +            c->idct_permutation_type = FF_NO_IDCT_PERM;
 +        } else {
          if(avctx->idct_algo==FF_IDCT_INT){
              c->idct_put= ff_jref_idct_put;
              c->idct_add= ff_jref_idct_add;
              c->idct     = ff_simple_idct_8;
              c->idct_permutation_type= FF_NO_IDCT_PERM;
          }
 +        }
      }
  
      c->diff_pixels = diff_pixels_c;
  
  #undef dspfunc
  
- #if CONFIG_MLP_DECODER || CONFIG_TRUEHD_DECODER
-     ff_mlp_init(c, avctx);
- #endif
      c->put_mspel_pixels_tab[0]= ff_put_pixels8x8_c;
      c->put_mspel_pixels_tab[1]= put_mspel8_mc10_c;
      c->put_mspel_pixels_tab[2]= put_mspel8_mc20_c;
              BIT_DEPTH_FUNCS(10, _16);
          }
          break;
 +    case 12:
 +        if (c->dct_bits == 32) {
 +            BIT_DEPTH_FUNCS(12, _32);
 +        } else {
 +            BIT_DEPTH_FUNCS(12, _16);
 +        }
 +        break;
 +    case 14:
 +        if (c->dct_bits == 32) {
 +            BIT_DEPTH_FUNCS(14, _32);
 +        } else {
 +            BIT_DEPTH_FUNCS(14, _16);
 +        }
 +        break;
      default:
 -        BIT_DEPTH_FUNCS(8, _16);
 +        if(avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {
 +            BIT_DEPTH_FUNCS(8, _16);
 +        }
          break;
      }
  
      if (HAVE_MMI)        ff_dsputil_init_mmi   (c, avctx);
      if (ARCH_SH4)        ff_dsputil_init_sh4   (c, avctx);
      if (ARCH_BFIN)       ff_dsputil_init_bfin  (c, avctx);
 +    if (HAVE_MIPSFPU)    ff_dsputil_init_mips  (c, avctx);
  
      for (i = 0; i < 4; i++) {
          for (j = 0; j < 16; j++) {
      ff_init_scantable_permutation(c->idct_permutation,
                                    c->idct_permutation_type);
  }
 +
 +av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx)
 +{
 +    ff_dsputil_init(c, avctx);
 +}
diff --combined libavcodec/dsputil.h
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
   * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -46,9 -46,6 +46,9 @@@ void ff_fdct248_islow_8(DCTELEM *data)
  void ff_fdct248_islow_10(DCTELEM *data);
  
  void ff_j_rev_dct (DCTELEM *data);
 +void ff_j_rev_dct4 (DCTELEM *data);
 +void ff_j_rev_dct2 (DCTELEM *data);
 +void ff_j_rev_dct1 (DCTELEM *data);
  void ff_wmv2_idct_c(DCTELEM *data);
  
  void ff_fdct_mmx(DCTELEM *block);
@@@ -72,8 -69,6 +72,8 @@@ void ff_h264_chroma_dc_dequant_idct_ #
  H264_IDCT( 8)
  H264_IDCT( 9)
  H264_IDCT(10)
 +H264_IDCT(12)
 +H264_IDCT(14)
  
  void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp);
  void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc);
@@@ -100,8 -95,6 +100,8 @@@ void ff_avg_pixels16x16_ ## depth ## _c
  PUTAVG_PIXELS( 8)
  PUTAVG_PIXELS( 9)
  PUTAVG_PIXELS(10)
 +PUTAVG_PIXELS(12)
 +PUTAVG_PIXELS(14)
  
  #define ff_put_pixels8x8_c ff_put_pixels8x8_8_c
  #define ff_avg_pixels8x8_c ff_avg_pixels8x8_8_c
@@@ -125,7 -118,7 +125,7 @@@ void ff_gmc_c(uint8_t *dst, uint8_t *sr
  /* minimum alignment rules ;)
  If you notice errors in the align stuff, need more alignment for some ASM code
  for some CPU or need to use a function with less aligned data then send a mail
 -to the libav-devel mailing list, ...
 +to the ffmpeg-devel mailing list, ...
  
  !warning These alignments might not match reality, (missing attribute((align))
  stuff somewhere possible).
@@@ -203,8 -196,6 +203,8 @@@ void ff_emulated_edge_mc_ ## depth (uin
  EMULATED_EDGE(8)
  EMULATED_EDGE(9)
  EMULATED_EDGE(10)
 +EMULATED_EDGE(12)
 +EMULATED_EDGE(14)
  
  /**
   * DSPContext.
@@@ -364,7 -355,7 +364,7 @@@ typedef struct DSPContext 
  
      /* huffyuv specific */
      void (*add_bytes)(uint8_t *dst/*align 16*/, uint8_t *src/*align 16*/, int w);
 -    void (*diff_bytes)(uint8_t *dst/*align 16*/, uint8_t *src1/*align 16*/, uint8_t *src2/*align 1*/,int w);
 +    void (*diff_bytes)(uint8_t *dst/*align 16*/, const uint8_t *src1/*align 16*/, const uint8_t *src2/*align 1*/,int w);
      /**
       * subtract huffyuv's variant of median prediction
       * note, this might read from src1[-1], src2[-1]
      void (*add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top);
      int  (*add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left);
      void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha);
 +    /* this might write to dst[w] */
      void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
      void (*bswap16_buf)(uint16_t *dst, const uint16_t *src, int len);
  
       * @param v2  second input vector, difference output, 16-byte aligned
       * @param len length of vectors, multiple of 4
       */
 -    void (*butterflies_float)(float *restrict v1, float *restrict v2, int len);
 +    void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len);
  
      /**
       * Calculate the sum and difference of two vectors of floats and interleave
  
      void (*shrink[4])(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height);
  
-     /* mlp/truehd functions */
-     void (*mlp_filter_channel)(int32_t *state, const int32_t *coeff,
-                                int firorder, int iirorder,
-                                unsigned int filter_shift, int32_t mask, int blocksize,
-                                int32_t *sample_buffer);
      /**
       * Calculate scalar product of two vectors.
       * @param len length of vectors, should be multiple of 16
  
  void ff_dsputil_static_init(void);
  void ff_dsputil_init(DSPContext* p, AVCodecContext *avctx);
 +attribute_deprecated void dsputil_init(DSPContext* c, AVCodecContext *avctx);
  
  int ff_check_alignment(void);
  
@@@ -621,11 -604,8 +615,9 @@@ void ff_dsputil_init_mmx(DSPContext* c
  void ff_dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx);
  void ff_dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx);
  void ff_dsputil_init_vis(DSPContext* c, AVCodecContext *avctx);
 +void ff_dsputil_init_mips(DSPContext* c, AVCodecContext *avctx);
  
  void ff_dsputil_init_dwt(DSPContext *c);
- void ff_mlp_init(DSPContext* c, AVCodecContext *avctx);
- void ff_mlp_init_x86(DSPContext* c, AVCodecContext *avctx);
  
  #if (ARCH_ARM && HAVE_NEON) || ARCH_PPC || HAVE_MMI || HAVE_MMX
  #   define STRIDE_ALIGN 16
diff --combined libavcodec/mlpdec.c
@@@ -2,20 -2,20 +2,20 @@@
   * MLP decoder
   * Copyright (c) 2007-2008 Ian Caulfield
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include <stdint.h>
  
  #include "avcodec.h"
- #include "dsputil.h"
  #include "libavutil/intreadwrite.h"
  #include "get_bits.h"
  #include "libavutil/crc.h"
  #include "parser.h"
  #include "mlp_parser.h"
+ #include "mlpdsp.h"
  #include "mlp.h"
  
  /** number of bits used for VLC lookup - longest Huffman code is 9 */
@@@ -128,9 -128,6 +128,9 @@@ typedef struct MLPDecodeContext 
      /// Index of the last substream to decode - further substreams are skipped.
      uint8_t     max_decoded_substream;
  
 +    /// Stream needs channel reordering to comply with FFmpeg's channel order
 +    uint8_t     needs_reordering;
 +
      /// number of PCM samples contained in each frame
      int         access_unit_size;
      /// next power of two above the number of samples in each frame
      int8_t      bypassed_lsbs[MAX_BLOCKSIZE][MAX_CHANNELS];
      int32_t     sample_buffer[MAX_BLOCKSIZE][MAX_CHANNELS];
  
-     DSPContext  dsp;
+     MLPDSPContext dsp;
  } MLPDecodeContext;
  
  static VLC huff_vlc[3];
@@@ -235,7 -232,7 +235,7 @@@ static av_cold int mlp_decode_init(AVCo
      m->avctx = avctx;
      for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
          m->substream[substr].lossless_check_data = 0xffffffff;
-     ff_dsputil_init(&m->dsp, avctx);
+     ff_mlpdsp_init(&m->dsp);
  
      avcodec_get_frame_defaults(&m->frame);
      avctx->coded_frame = &m->frame;
@@@ -327,32 -324,6 +327,32 @@@ static int read_major_sync(MLPDecodeCon
      for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
          m->substream[substr].restart_seen = 0;
  
 +    if (mh.stream_type == 0xbb) {
 +        /* MLP stream */
 +        m->avctx->channel_layout = ff_mlp_layout[mh.channels_mlp];
 +    } else { /* mh.stream_type == 0xba */
 +        /* TrueHD stream */
 +        if (mh.channels_thd_stream2) {
 +            m->avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream2);
 +        } else {
 +            m->avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream1);
 +        }
 +        if (m->avctx->channels<=2 && m->avctx->channel_layout == AV_CH_LAYOUT_MONO && m->max_decoded_substream == 1) {
 +            av_log(m->avctx, AV_LOG_DEBUG, "Mono stream with 2 substreams, ignoring 2nd\n");
 +            m->max_decoded_substream = 0;
 +            if (m->avctx->channels==2)
 +                m->avctx->channel_layout = AV_CH_LAYOUT_STEREO;
 +        }
 +        if (m->avctx->channels &&
 +            !m->avctx->request_channels && !m->avctx->request_channel_layout &&
 +            av_get_channel_layout_nb_channels(m->avctx->channel_layout) != m->avctx->channels) {
 +            m->avctx->channel_layout = 0;
 +            av_log_ask_for_sample(m->avctx, "Unknown channel layout.");
 +        }
 +    }
 +
 +    m->needs_reordering = mh.channels_mlp >= 18 && mh.channels_mlp <= 20;
 +
      return 0;
  }
  
@@@ -372,7 -343,6 +372,7 @@@ static int read_restart_header(MLPDecod
      const int max_matrix_channel = m->avctx->codec_id == AV_CODEC_ID_MLP
                                   ? MAX_MATRIX_CHANNEL_MLP
                                   : MAX_MATRIX_CHANNEL_TRUEHD;
 +    int max_channel, min_channel, matrix_channel;
  
      sync_word = get_bits(gbp, 13);
  
  
      skip_bits(gbp, 16); /* Output timestamp */
  
 -    s->min_channel        = get_bits(gbp, 4);
 -    s->max_channel        = get_bits(gbp, 4);
 -    s->max_matrix_channel = get_bits(gbp, 4);
 +    min_channel    = get_bits(gbp, 4);
 +    max_channel    = get_bits(gbp, 4);
 +    matrix_channel = get_bits(gbp, 4);
  
 -    if (s->max_matrix_channel > max_matrix_channel) {
 +    if (matrix_channel > max_matrix_channel) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Max matrix channel cannot be greater than %d.\n",
                 max_matrix_channel);
          return AVERROR_INVALIDDATA;
      }
  
 -    if (s->max_channel != s->max_matrix_channel) {
 +    if (max_channel != matrix_channel) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Max channel must be equal max matrix channel.\n");
          return AVERROR_INVALIDDATA;
  
      /* This should happen for TrueHD streams with >6 channels and MLP's noise
       * type. It is not yet known if this is allowed. */
 -    if (s->max_channel > MAX_MATRIX_CHANNEL_MLP && !s->noise_type) {
 +    if (max_channel > MAX_MATRIX_CHANNEL_MLP && !s->noise_type) {
          av_log_ask_for_sample(m->avctx,
                 "Number of channels %d is larger than the maximum supported "
 -               "by the decoder.\n", s->max_channel + 2);
 +               "by the decoder.\n", max_channel + 2);
          return AVERROR_PATCHWELCOME;
      }
  
 -    if (s->min_channel > s->max_channel) {
 +    if (min_channel > max_channel) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Substream min channel cannot be greater than max channel.\n");
          return AVERROR_INVALIDDATA;
      }
  
 +    s->min_channel = min_channel;
 +    s->max_channel = max_channel;
 +    s->max_matrix_channel = matrix_channel;
 +
      if (m->avctx->request_channels > 0
          && s->max_channel + 1 >= m->avctx->request_channels
          && substr < m->max_decoded_substream) {
          s->ch_assign[ch_assign] = ch;
      }
  
 +    if (m->avctx->codec_id == AV_CODEC_ID_MLP && m->needs_reordering) {
 +        if (m->avctx->channel_layout == (AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY) ||
 +            m->avctx->channel_layout == AV_CH_LAYOUT_5POINT0_BACK) {
 +            int i = s->ch_assign[4];
 +            s->ch_assign[4] = s->ch_assign[3];
 +            s->ch_assign[3] = s->ch_assign[2];
 +            s->ch_assign[2] = i;
 +        } else if (m->avctx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) {
 +            FFSWAP(int, s->ch_assign[2], s->ch_assign[4]);
 +            FFSWAP(int, s->ch_assign[3], s->ch_assign[5]);
 +        }
 +    }
 +    if (m->avctx->codec_id == AV_CODEC_ID_TRUEHD &&
 +        (m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1 ||
 +        m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1_WIDE)) {
 +        FFSWAP(int, s->ch_assign[4], s->ch_assign[6]);
 +        FFSWAP(int, s->ch_assign[5], s->ch_assign[7]);
 +    } else if (m->avctx->codec_id == AV_CODEC_ID_TRUEHD &&
 +        (m->avctx->channel_layout == AV_CH_LAYOUT_6POINT1 ||
 +        m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 | AV_CH_TOP_CENTER) ||
 +        m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 | AV_CH_TOP_FRONT_CENTER))) {
 +        int i = s->ch_assign[6];
 +        s->ch_assign[6] = s->ch_assign[5];
 +        s->ch_assign[5] = s->ch_assign[4];
 +        s->ch_assign[4] = i;
 +    }
 +
      checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
  
      if (checksum != get_bits(gbp, 8))
@@@ -542,7 -481,7 +542,7 @@@ static int read_filter_params(MLPDecode
      int i, order;
  
      // Filter is 0 for FIR, 1 for IIR.
 -    assert(filter < 2);
 +    av_assert0(filter < 2);
  
      if (m->filter_changed[channel][filter]++ > 1) {
          av_log(m->avctx, AV_LOG_ERROR, "Filters may change only once per access unit.\n");
@@@ -742,7 -681,7 +742,7 @@@ static int read_decoding_params(MLPDeco
          if (get_bits1(gbp)) {
              s->blocksize = get_bits(gbp, 9);
              if (s->blocksize < 8 || s->blocksize > m->access_unit_size) {
 -                av_log(m->avctx, AV_LOG_ERROR, "Invalid blocksize.");
 +                av_log(m->avctx, AV_LOG_ERROR, "Invalid blocksize.\n");
                  s->blocksize = 0;
                  return AVERROR_INVALIDDATA;
              }
@@@ -1205,7 -1144,6 +1205,7 @@@ error
      return AVERROR_INVALIDDATA;
  }
  
 +#if CONFIG_MLP_DECODER
  AVCodec ff_mlp_decoder = {
      .name           = "mlp",
      .type           = AVMEDIA_TYPE_AUDIO,
      .capabilities   = CODEC_CAP_DR1,
      .long_name      = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
  };
 -
 +#endif
  #if CONFIG_TRUEHD_DECODER
  AVCodec ff_truehd_decoder = {
      .name           = "truehd",
diff --combined libavcodec/mlpdsp.c
@@@ -2,24 -2,25 +2,25 @@@
   * Copyright (c) 2007-2008 Ian Caulfield
   *               2009 Ramiro Polla
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
- #include "dsputil.h"
+ #include "config.h"
+ #include "mlpdsp.h"
  #include "mlp.h"
  
  static void ff_mlp_filter_channel(int32_t *state, const int32_t *coeff,
@@@ -55,9 -56,9 +56,9 @@@
      }
  }
  
- void ff_mlp_init(DSPContext* c, AVCodecContext *avctx)
+ void ff_mlpdsp_init(MLPDSPContext *c)
  {
      c->mlp_filter_channel = ff_mlp_filter_channel;
      if (ARCH_X86)
-         ff_mlp_init_x86(c, avctx);
+         ff_mlpdsp_init_x86(c);
  }
diff --combined libavcodec/mlpdsp.h
index 0000000,995f72a..84a8aa3
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,37 +1,37 @@@
 - * This file is part of Libav.
+ /*
+  * MLP codec common header file
+  * Copyright (c) 2007-2008 Ian Caulfield
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #ifndef AVCODEC_MLPDSP_H
+ #define AVCODEC_MLPDSP_H
+ #include <stdint.h>
+ typedef struct MLPDSPContext {
+     void (*mlp_filter_channel)(int32_t *state, const int32_t *coeff,
+                                int firorder, int iirorder,
+                                unsigned int filter_shift, int32_t mask,
+                                int blocksize, int32_t *sample_buffer);
+ } MLPDSPContext;
+ void ff_mlpdsp_init(MLPDSPContext *c);
+ void ff_mlpdsp_init_x86(MLPDSPContext *c);
+ #endif /* AVCODEC_MLPDSP_H */
diff --combined libavcodec/sh4/qpel.c
@@@ -4,23 -4,25 +4,25 @@@
   *
   * copyright (c) 2001-2003 BERO <bero@geocities.co.jp>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
+ #include "libavutil/common.h"
  #define PIXOP2(OPNAME, OP) \
  \
  static inline void OPNAME ## _pixels4_l2_aligned(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) \
diff --combined libavcodec/x86/mlpdsp.c
@@@ -2,25 -2,26 +2,25 @@@
   * MLP DSP functions x86-optimized
   * Copyright (c) 2009 Ramiro Polla
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
 -#include "libavutil/internal.h"
  #include "libavutil/x86/asm.h"
- #include "libavcodec/dsputil.h"
+ #include "libavcodec/mlpdsp.h"
  #include "libavcodec/mlp.h"
  
  #if HAVE_7REGS && HAVE_INLINE_ASM
@@@ -173,7 -174,7 +173,7 @@@ static void mlp_filter_channel_x86(int3
  
  #endif /* HAVE_7REGS && HAVE_INLINE_ASM */
  
- void ff_mlp_init_x86(DSPContext* c, AVCodecContext *avctx)
+ void ff_mlpdsp_init_x86(MLPDSPContext *c)
  {
  #if HAVE_7REGS && HAVE_INLINE_ASM
      c->mlp_filter_channel = mlp_filter_channel_x86;
diff --combined library.mak
@@@ -5,7 -5,6 +5,6 @@@ include $(SRC_PATH)/common.ma
  LIBVERSION := $(lib$(NAME)_VERSION)
  LIBMAJOR   := $(lib$(NAME)_VERSION_MAJOR)
  INCINSTDIR := $(INCDIR)/lib$(NAME)
- THIS_LIB   := $(SUBDIR)$($(CONFIG_SHARED:yes=S)LIBNAME)
  
  all-$(CONFIG_STATIC): $(SUBDIR)$(LIBNAME)
  all-$(CONFIG_SHARED): $(SUBDIR)$(SLIBNAME)
@@@ -20,7 -19,7 +19,7 @@@ $(SUBDIR)x86/%.o: $(SUBDIR)x86/%.as
        $(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.o=.d)
        $(YASM) $(YASMFLAGS) -I $(<D)/ -o $@ $<
  
 -$(OBJS) $(SUBDIR)%.h.o $(TESTOBJS): CPPFLAGS += -DHAVE_AV_CONFIG_H
 +$(OBJS) $(OBJS:.o=.s) $(SUBDIR)%.h.o $(TESTOBJS): CPPFLAGS += -DHAVE_AV_CONFIG_H
  $(TESTOBJS): CPPFLAGS += -DTEST
  
  $(SUBDIR)$(LIBNAME): $(OBJS)
@@@ -34,24 -33,20 +33,24 @@@ install-libs-$(CONFIG_STATIC): install-
  install-libs-$(CONFIG_SHARED): install-lib$(NAME)-shared
  
  define RULES
- $(EXAMPLES) $(TOOLS): LIB = $(FULLNAME:%=$(LD_LIB))
- $(TESTPROGS):         LIB = $(SUBDIR)$(LIBNAME)
+ $(EXAMPLES) $(TOOLS): THISLIB = $(FULLNAME:%=$(LD_LIB))
+ $(TESTPROGS):         THISLIB = $(SUBDIR)$(LIBNAME)
  
  $(EXAMPLES) $(TESTPROGS) $(TOOLS): %$(EXESUF): %.o
-       $$(LD) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $$(LIB) $(FFEXTRALIBS) $$(ELIBS)
+       $$(LD) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $$(THISLIB) $(FFEXTRALIBS) $$(ELIBS)
  
  $(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR)
        $(Q)cd ./$(SUBDIR) && $(LN_S) $(SLIBNAME_WITH_MAJOR) $(SLIBNAME)
  
 -$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver $(DEP_LIBS)
 +$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
        $(SLIB_CREATE_DEF_CMD)
        $$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
        $(SLIB_EXTRA_CMD)
  
 +ifdef SUBDIR
 +$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(DEP_LIBS)
 +endif
 +
  clean::
        $(RM) $(addprefix $(SUBDIR),*-example$(EXESUF) *-test$(EXESUF) $(CLEANFILES) $(CLEANSUFFIXES) $(LIBSUFFIXES)) \
            $(CLEANSUFFIXES:%=$(SUBDIR)$(ARCH)/%) $(HOSTOBJS) $(HOSTPROGS)
@@@ -62,7 -57,6 +61,7 @@@ distclean:: clea
  install-lib$(NAME)-shared: $(SUBDIR)$(SLIBNAME)
        $(Q)mkdir -p "$(SHLIBDIR)"
        $$(INSTALL) -m 755 $$< "$(SHLIBDIR)/$(SLIB_INSTALL_NAME)"
 +      $$(STRIP) "$(SHLIBDIR)/$(SLIB_INSTALL_NAME)"
        $(Q)$(foreach F,$(SLIB_INSTALL_LINKS),cd "$(SHLIBDIR)" && $(LN_S) $(SLIB_INSTALL_NAME) $(F);)
        $(if $(SLIB_INSTALL_EXTRA_SHLIB),$$(INSTALL) -m 644 $(SLIB_INSTALL_EXTRA_SHLIB:%=$(SUBDIR)%) "$(SHLIBDIR)")
        $(if $(SLIB_INSTALL_EXTRA_LIB),$(Q)mkdir -p "$(LIBDIR)")
@@@ -85,8 -79,8 +84,8 @@@ uninstall-libs:
        -$(RM) "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR)" \
               "$(SHLIBDIR)/$(SLIBNAME)"            \
               "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
 -      -$(RM) $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)"%)
 -      -$(RM) $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)"%)
 +      -$(RM)  $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)/%")
 +      -$(RM)  $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)/%")
        -$(RM) "$(LIBDIR)/$(LIBNAME)"
  
  uninstall-headers::
@@@ -97,8 -91,8 +96,8 @@@ ende
  
  $(eval $(RULES))
  
- $(EXAMPLES) $(TOOLS): $(THIS_LIB) $(DEP_LIBS)
- $(TESTPROGS): $(SUBDIR)$(LIBNAME) $(DEP_LIBS)
+ $(EXAMPLES) $(TOOLS): $(DEP_LIBS) $(SUBDIR)$($(CONFIG_SHARED:yes=S)LIBNAME)
+ $(TESTPROGS):         $(DEP_LIBS) $(SUBDIR)$(LIBNAME)
  
  examples: $(EXAMPLES)
  testprogs: $(TESTPROGS)