Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * BlackFin MPEGVIDEO OPTIMIZATIONS
  3.  *
  4.  * Copyright (C) 2007 Marc Hoffman <mmh@pleasantst.com>
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include "libavutil/attributes.h"
  24. #include "libavcodec/avcodec.h"
  25. #include "libavcodec/mpegvideo.h"
  26. #include "dsputil_bfin.h"
  27.  
  28. static int dct_quantize_bfin (MpegEncContext *s,
  29.                               int16_t *block, int n,
  30.                               int qscale, int *overflow)
  31. {
  32.     int last_non_zero, q, start_i;
  33.     const short *qmat;
  34.     short *bias;
  35.     const uint8_t *scantable= s->intra_scantable.scantable;
  36.     short dc;
  37.     int   max=0;
  38.  
  39.     PROF("fdct",0);
  40.     s->dsp.fdct(block);
  41.     EPROF();
  42.  
  43.     PROF("denoise",1);
  44.     if(s->dct_error_sum)
  45.         s->denoise_dct(s, block);
  46.     EPROF();
  47.  
  48.     PROF("quant-init",2);
  49.     if (s->mb_intra) {
  50.         if (!s->h263_aic) {
  51.             if (n < 4)
  52.                 q = s->y_dc_scale;
  53.             else
  54.                 q = s->c_dc_scale;
  55.             q = q << 3;
  56.         } else
  57.             /* For AIC we skip quant/dequant of INTRADC */
  58.             q = 1 << 3;
  59.  
  60.         /* note: block[0] is assumed to be positive */
  61.         dc = block[0] = (block[0] + (q >> 1)) / q;
  62.         start_i = 1;
  63.         last_non_zero = 0;
  64.         if(n<4){
  65.             bias = s->q_intra_matrix16[qscale][1];
  66.             qmat = s->q_intra_matrix16[qscale][0];
  67.         }else{
  68.             bias = s->q_chroma_intra_matrix16[qscale][1];
  69.             qmat = s->q_chroma_intra_matrix16[qscale][0];
  70.         }
  71.  
  72.     } else {
  73.         start_i = 0;
  74.         last_non_zero = -1;
  75.         bias = s->q_inter_matrix16[qscale][1];
  76.         qmat = s->q_inter_matrix16[qscale][0];
  77.  
  78.     }
  79.     EPROF();
  80.  
  81.     PROF("quantize",4);
  82.  
  83.     /*  for(i=start_i; i<64; i++) {                           */
  84.     /*      sign     = (block[i]>>15)|1;                      */
  85.     /*      level    = ((abs(block[i])+bias[0])*qmat[i])>>16; */
  86.     /*      if (level < 0) level = 0;                         */
  87.     /*      max     |= level;                                 */
  88.     /*      level    = level * sign;                          */
  89.     /*      block[i] = level;                                 */
  90.     /*  } */
  91.  
  92.     __asm__ volatile
  93.         ("i2=%1;\n\t"
  94.          "r1=[%1++];                                                         \n\t"
  95.          "r0=r1>>>15 (v);                                                    \n\t"
  96.          "lsetup (0f,1f) lc0=%3;                                             \n\t"
  97.          "0:   r0=r0|%4;                                                     \n\t"
  98.          "     r1=abs r1 (v)                                    || r2=[%2++];\n\t"
  99.          "     r1=r1+|+%5;                                                   \n\t"
  100.          "     r1=max(r1,%6) (v);                                            \n\t"
  101.          "     r1.h=(a1 =r1.h*r2.h), r1.l=(a0 =r1.l*r2.l) (tfu);             \n\t"
  102.          "     %0=%0|r1;                                                     \n\t"
  103.          "     r0.h=(a1 =r1.h*r0.h), r0.l=(a0 =r1.l*r0.l) (is)  || r1=[%1++];\n\t"
  104.          "1:   r0=r1>>>15 (v)                                   || [i2++]=r0;\n\t"
  105.          "r1=%0>>16;                                                         \n\t"
  106.          "%0=%0|r1;                                                          \n\t"
  107.          "%0.h=0;                                                            \n\t"
  108.          : "=&d" (max)
  109.          : "b" (block), "b" (qmat), "a" (32), "d" (0x00010001), "d" (bias[0]*0x10001), "d" (0)
  110.          : "R0","R1","R2", "I2");
  111.     if (start_i == 1) block[0] = dc;
  112.  
  113.     EPROF();
  114.  
  115.  
  116.     PROF("zzscan",5);
  117.  
  118.     __asm__ volatile
  119.         ("r0=b[%1--] (x);         \n\t"
  120.          "lsetup (0f,1f) lc0=%3;  \n\t"     /*    for(i=63; i>=start_i; i--) { */
  121.          "0: p0=r0;               \n\t"     /*        j = scantable[i];        */
  122.          "   p0=%2+(p0<<1);       \n\t"     /*        if (block[j]) {          */
  123.          "   r0=w[p0];            \n\t"     /*           last_non_zero = i;    */
  124.          "   cc=r0==0;            \n\t"     /*           break;                */
  125.          "   if !cc jump 2f;      \n\t"     /*        }                        */
  126.          "1: r0=b[%1--] (x);      \n\t"     /*    }                            */
  127.          "   %0=%4;               \n\t"
  128.          "   jump 3f;             \n\t"
  129.          "2: %0=lc0;              \n\t"
  130.          "3:\n\t"
  131.  
  132.          : "=d" (last_non_zero)
  133.          : "a" (scantable+63), "a" (block), "a" (63), "d" (last_non_zero)
  134.          : "P0","R0");
  135.  
  136.     EPROF();
  137.  
  138.     *overflow= s->max_qcoeff < max; //overflow might have happened
  139.  
  140.     bfprof();
  141.  
  142.     /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
  143.     if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
  144.         ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
  145.  
  146.     return last_non_zero;
  147. }
  148.  
  149. av_cold void ff_MPV_common_init_bfin (MpegEncContext *s)
  150. {
  151. /*     s->dct_quantize= dct_quantize_bfin; */
  152. }
  153.