811 lines · 25.9 KB · C
RawDownload
/* *  Copyright (c) 2010 The WebM project authors. All Rights Reserved. * *  Use of this source code is governed by a BSD-style license *  that can be found in the LICENSE file in the root of the source *  tree. An additional intellectual property rights grant can be found *  in the file PATENTS.  All contributing project authors may *  be found in the AUTHORS file in the root of the source tree. */  #include <math.h>#include "vpx_mem/vpx_mem.h" #include "onyx_int.h"#include "quantize.h"#include "vp8/common/quant_common.h" #define EXACT_QUANT #ifdef EXACT_FASTQUANTvoid vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d){    int i, rc, eob;    int zbin;    int x, y, z, sz;    short *coeff_ptr       = b->coeff;    short *zbin_ptr        = b->zbin;    short *round_ptr       = b->round;    short *quant_ptr       = b->quant_fast;    unsigned char *quant_shift_ptr = b->quant_shift;    short *qcoeff_ptr      = d->qcoeff;    short *dqcoeff_ptr     = d->dqcoeff;    short *dequant_ptr     = d->dequant;     vpx_memset(qcoeff_ptr, 0, 32);    vpx_memset(dqcoeff_ptr, 0, 32);     eob = -1;     for (i = 0; i < 16; i++)    {        rc   = vp8_default_zig_zag1d[i];        z    = coeff_ptr[rc];        zbin = zbin_ptr[rc] ;         sz = (z >> 31);                              /* sign of z */        x  = (z ^ sz) - sz;                          /* x = abs(z) */         if (x >= zbin)        {            x += round_ptr[rc];            y  = (((x * quant_ptr[rc]) >> 16) + x)                 >> quant_shift_ptr[rc];             /* quantize (x) */            x  = (y ^ sz) - sz;                      /* get the sign back */            qcoeff_ptr[rc] = x;                      /* write to destination */            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */             if (y)            {                eob = i;                             /* last nonzero coeffs */            }        }    }    *d->eob = (char)(eob + 1);} #else void vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d){    int i, rc, eob;    int x, y, z, sz;    short *coeff_ptr   = b->coeff;    short *round_ptr   = b->round;    short *quant_ptr   = b->quant_fast;    short *qcoeff_ptr  = d->qcoeff;    short *dqcoeff_ptr = d->dqcoeff;    short *dequant_ptr = d->dequant;     eob = -1;    for (i = 0; i < 16; i++)    {        rc   = vp8_default_zig_zag1d[i];        z    = coeff_ptr[rc];         sz = (z >> 31);                              /* sign of z */        x  = (z ^ sz) - sz;                          /* x = abs(z) */         y  = ((x + round_ptr[rc]) * quant_ptr[rc]) >> 16; /* quantize (x) */        x  = (y ^ sz) - sz;                          /* get the sign back */        qcoeff_ptr[rc] = x;                          /* write to destination */        dqcoeff_ptr[rc] = x * dequant_ptr[rc];       /* dequantized value */         if (y)        {            eob = i;                                 /* last nonzero coeffs */        }    }    *d->eob = (char)(eob + 1);} #endif #ifdef EXACT_QUANTvoid vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d){    int i, rc, eob;    int zbin;    int x, y, z, sz;    short *zbin_boost_ptr  = b->zrun_zbin_boost;    short *coeff_ptr       = b->coeff;    short *zbin_ptr        = b->zbin;    short *round_ptr       = b->round;    short *quant_ptr       = b->quant;    unsigned char *quant_shift_ptr = b->quant_shift;    short *qcoeff_ptr      = d->qcoeff;    short *dqcoeff_ptr     = d->dqcoeff;    short *dequant_ptr     = d->dequant;    short zbin_oq_value    = b->zbin_extra;     vpx_memset(qcoeff_ptr, 0, 32);    vpx_memset(dqcoeff_ptr, 0, 32);     eob = -1;     for (i = 0; i < 16; i++)    {        rc   = vp8_default_zig_zag1d[i];        z    = coeff_ptr[rc];         zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;         zbin_boost_ptr ++;        sz = (z >> 31);                              /* sign of z */        x  = (z ^ sz) - sz;                          /* x = abs(z) */         if (x >= zbin)        {            x += round_ptr[rc];            y  = (((x * quant_ptr[rc]) >> 16) + x)                 >> quant_shift_ptr[rc];             /* quantize (x) */            x  = (y ^ sz) - sz;                      /* get the sign back */            qcoeff_ptr[rc]  = x;                     /* write to destination */            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */             if (y)            {                eob = i;                             /* last nonzero coeffs */                zbin_boost_ptr = b->zrun_zbin_boost; /* reset zero runlength */            }        }    }     *d->eob = (char)(eob + 1);} /* Perform regular quantization, with unbiased rounding and no zero bin. */void vp8_strict_quantize_b_c(BLOCK *b, BLOCKD *d){    int i;    int rc;    int eob;    int x;    int y;    int z;    int sz;    short *coeff_ptr;    short *quant_ptr;    unsigned char *quant_shift_ptr;    short *qcoeff_ptr;    short *dqcoeff_ptr;    short *dequant_ptr;     coeff_ptr       = b->coeff;    quant_ptr       = b->quant;    quant_shift_ptr = b->quant_shift;    qcoeff_ptr      = d->qcoeff;    dqcoeff_ptr     = d->dqcoeff;    dequant_ptr     = d->dequant;    eob = - 1;    vpx_memset(qcoeff_ptr, 0, 32);    vpx_memset(dqcoeff_ptr, 0, 32);    for (i = 0; i < 16; i++)    {        int dq;        int round;         /*TODO: These arrays should be stored in zig-zag order.*/        rc = vp8_default_zig_zag1d[i];        z = coeff_ptr[rc];        dq = dequant_ptr[rc];        round = dq >> 1;        /* Sign of z. */        sz = -(z < 0);        x = (z + sz) ^ sz;        x += round;        if (x >= dq)        {            /* Quantize x. */            y  = (((x * quant_ptr[rc]) >> 16) + x) >> quant_shift_ptr[rc];            /* Put the sign back. */            x = (y + sz) ^ sz;            /* Save the coefficient and its dequantized value. */            qcoeff_ptr[rc] = x;            dqcoeff_ptr[rc] = x * dq;            /* Remember the last non-zero coefficient. */            if (y)                eob = i;        }    }     *d->eob = (char)(eob + 1);} #else void vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d){    int i, rc, eob;    int zbin;    int x, y, z, sz;    short *zbin_boost_ptr = b->zrun_zbin_boost;    short *coeff_ptr      = b->coeff;    short *zbin_ptr       = b->zbin;    short *round_ptr      = b->round;    short *quant_ptr      = b->quant;    short *qcoeff_ptr     = d->qcoeff;    short *dqcoeff_ptr    = d->dqcoeff;    short *dequant_ptr    = d->dequant;    short zbin_oq_value   = b->zbin_extra;     vpx_memset(qcoeff_ptr, 0, 32);    vpx_memset(dqcoeff_ptr, 0, 32);     eob = -1;     for (i = 0; i < 16; i++)    {        rc   = vp8_default_zig_zag1d[i];        z    = coeff_ptr[rc];         zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;         zbin_boost_ptr ++;        sz = (z >> 31);                              /* sign of z */        x  = (z ^ sz) - sz;                          /* x = abs(z) */         if (x >= zbin)        {            y  = ((x + round_ptr[rc]) * quant_ptr[rc]) >> 16; /* quantize (x) */            x  = (y ^ sz) - sz;                      /* get the sign back */            qcoeff_ptr[rc]  = x;                     /* write to destination */            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */             if (y)            {                eob = i;                             /* last nonzero coeffs */                zbin_boost_ptr = &b->zrun_zbin_boost[0]; /* reset zrl */            }        }    }     *d->eob = (char)(eob + 1);} #endif void vp8_quantize_mby_c(MACROBLOCK *x){    int i;    int has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED        && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);     for (i = 0; i < 16; i++)        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);     if(has_2nd_order)        x->quantize_b(&x->block[24], &x->e_mbd.block[24]);} void vp8_quantize_mb_c(MACROBLOCK *x){    int i;    int has_2nd_order=(x->e_mbd.mode_info_context->mbmi.mode != B_PRED        && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);     for (i = 0; i < 24+has_2nd_order; i++)        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);}  void vp8_quantize_mbuv_c(MACROBLOCK *x){    int i;     for (i = 16; i < 24; i++)        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);} /* quantize_b_pair function pointer in MACROBLOCK structure is set to one of * these two C functions if corresponding optimized routine is not available. * NEON optimized version implements currently the fast quantization for pair * of blocks. */void vp8_regular_quantize_b_pair(BLOCK *b1, BLOCK *b2, BLOCKD *d1, BLOCKD *d2){    vp8_regular_quantize_b(b1, d1);    vp8_regular_quantize_b(b2, d2);} void vp8_fast_quantize_b_pair_c(BLOCK *b1, BLOCK *b2, BLOCKD *d1, BLOCKD *d2){    vp8_fast_quantize_b_c(b1, d1);    vp8_fast_quantize_b_c(b2, d2);}  static const int qrounding_factors[129] ={    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48};  static const int qzbin_factors[129] ={    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80};  static const int qrounding_factors_y2[129] ={    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48, 48, 48, 48, 48, 48, 48, 48,    48};  static const int qzbin_factors_y2[129] ={    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    84, 84, 84, 84, 84, 84, 84, 84,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80, 80, 80, 80, 80, 80, 80, 80,    80};  #define EXACT_QUANT#ifdef EXACT_QUANTstatic void invert_quant(int improved_quant, short *quant,                               unsigned char *shift, short d){    if(improved_quant)    {        unsigned t;        int l;        t = d;        for(l = 0; t > 1; l++)            t>>=1;        t = 1 + (1<<(16+l))/d;        *quant = (short)(t - (1<<16));        *shift = l;    }    else    {        *quant = (1 << 16) / d;        *shift = 0;    }}  void vp8cx_init_quantizer(VP8_COMP *cpi){    int i;    int quant_val;    int Q;     int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44,                          44, 44};     for (Q = 0; Q < QINDEX_RANGE; Q++)    {        /* dc values */        quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);        cpi->Y1quant_fast[Q][0] = (1 << 16) / quant_val;        invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 0,                     cpi->Y1quant_shift[Q] + 0, quant_val);        cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;        cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;        cpi->common.Y1dequant[Q][0] = quant_val;        cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;         quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);        cpi->Y2quant_fast[Q][0] = (1 << 16) / quant_val;        invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 0,                     cpi->Y2quant_shift[Q] + 0, quant_val);        cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;        cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;        cpi->common.Y2dequant[Q][0] = quant_val;        cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;         quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);        cpi->UVquant_fast[Q][0] = (1 << 16) / quant_val;        invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 0,                     cpi->UVquant_shift[Q] + 0, quant_val);        cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;        cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;        cpi->common.UVdequant[Q][0] = quant_val;        cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;         /* all the ac values = ; */        quant_val = vp8_ac_yquant(Q);        cpi->Y1quant_fast[Q][1] = (1 << 16) / quant_val;        invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 1,                     cpi->Y1quant_shift[Q] + 1, quant_val);        cpi->Y1zbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;        cpi->Y1round[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;        cpi->common.Y1dequant[Q][1] = quant_val;        cpi->zrun_zbin_boost_y1[Q][1] = (quant_val * zbin_boost[1]) >> 7;         quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);        cpi->Y2quant_fast[Q][1] = (1 << 16) / quant_val;        invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 1,                     cpi->Y2quant_shift[Q] + 1, quant_val);        cpi->Y2zbin[Q][1] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;        cpi->Y2round[Q][1] = (qrounding_factors_y2[Q] * quant_val) >> 7;        cpi->common.Y2dequant[Q][1] = quant_val;        cpi->zrun_zbin_boost_y2[Q][1] = (quant_val * zbin_boost[1]) >> 7;         quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);        cpi->UVquant_fast[Q][1] = (1 << 16) / quant_val;        invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 1,                     cpi->UVquant_shift[Q] + 1, quant_val);        cpi->UVzbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;        cpi->UVround[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;        cpi->common.UVdequant[Q][1] = quant_val;        cpi->zrun_zbin_boost_uv[Q][1] = (quant_val * zbin_boost[1]) >> 7;         for (i = 2; i < 16; i++)        {            cpi->Y1quant_fast[Q][i] = cpi->Y1quant_fast[Q][1];            cpi->Y1quant[Q][i] = cpi->Y1quant[Q][1];

Lines 1–500 of 811.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t