encQM.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: encQM.cpp,v 1.2 2001/04/19 18:32:10 wmay Exp $ */
  2. /****************************************************************************/
  3. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  4. /*                                                                          */
  5. /*   This software was jointly developed by the following participants:     */
  6. /*                                                                          */
  7. /*   Single-quant,  multi-quant and flow control                            */
  8. /*   are provided by  Sarnoff Corporation                                   */
  9. /*     Iraj Sodagar   (iraj@sarnoff.com)                                    */
  10. /*     Hung-Ju Lee    (hjlee@sarnoff.com)                                   */
  11. /*     Paul Hatrack   (hatrack@sarnoff.com)                                 */
  12. /*     Shipeng Li     (shipeng@sarnoff.com)                                 */
  13. /*     Bing-Bing Chai (bchai@sarnoff.com)                                   */
  14. /*     B.S. Srinivas  (bsrinivas@sarnoff.com)                               */
  15. /*                                                                          */
  16. /*   Bi-level is provided by Texas Instruments                              */
  17. /*     Jie Liang      (liang@ti.com)                                        */
  18. /*                                                                          */
  19. /*   Shape Coding is provided by  OKI Electric Industry Co., Ltd.           */
  20. /*     Zhixiong Wu    (sgo@hlabs.oki.co.jp)                                 */
  21. /*     Yoshihiro Ueda (yueda@hlabs.oki.co.jp)                               */
  22. /*     Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp)                        */
  23. /*                                                                          */
  24. /*   OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream         */
  25. /*   exchange and bug fixing.                                               */
  26. /*                                                                          */
  27. /*                                                                          */
  28. /* In the course of development of the MPEG-4 standard, this software       */
  29. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  30. /* specified by the MPEG-4 standard.                                        */
  31. /*                                                                          */
  32. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  33. /* of the MPEG-4 standard free license to use this  software module or      */
  34. /* modifications thereof for hardware or software products claiming         */
  35. /* conformance to the MPEG-4 standard.                                      */
  36. /*                                                                          */
  37. /* Those intending to use this software module in hardware or software      */
  38. /* products are advised that use may infringe existing  patents. The        */
  39. /* original developers of this software module and their companies, the     */
  40. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  41. /* and ISO/IEC have no liability for use of this software module or         */
  42. /* modification thereof in an implementation.                               */
  43. /*                                                                          */
  44. /* Permission is granted to MPEG members to use, copy, modify,              */
  45. /* and distribute the software modules ( or portions thereof )              */
  46. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  47. /*                                                                          */
  48. /* Copyright 1995, 1996, 1997, 1998 ISO/IEC                                 */
  49. /****************************************************************************/
  50. /************************************************************/
  51. /*     Sarnoff Very Low Bit Rate Still Image Coder          */
  52. /*     Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
  53. /************************************************************/
  54. #include <stdio.h>
  55. #include <stdlib.h>
  56. #include <math.h>  // hjlee 0901
  57. #include "dataStruct.hpp"
  58. #include "globals.hpp"
  59. #include "states.hpp"
  60. #include "quant.hpp"
  61. #include "Utils.hpp"
  62. #include "QMUtils.hpp"
  63. #include "QM.hpp"
  64. /* 
  65.    Function Name
  66.    -------------
  67.    static Void quantizeCoeff(Int x, Int y)
  68.    Arguments 
  69.    ---------
  70.    Int x, Int y - Index of wavelet coefficient (row, col) to quantize.
  71.    Description
  72.    -----------
  73.    Quantize the coefficent at (x,y). Also get maximum number of residual 
  74.    levels for arithmetic coding in SE module.
  75.    coeffinfo Updates:
  76.      1. quantized_value
  77.      2. qState
  78.    Functions Called
  79.    ----------------
  80.    none
  81.    Return Value
  82.    ------------
  83.    none
  84.    Source File
  85.    -----------
  86.    encQM.c
  87. */
  88. Void CVTCEncoder::quantizeCoeff(Int x, Int y, Int c)
  89. {
  90.   Int dumQ=0;
  91.   /* assign new quantization value - update quant state */
  92.   if (mzte_codec.m_iQuantType == MULTIPLE_Q)
  93.     COEFF_VAL(x,y,c) = 
  94.       quantSingleStage(USER_Q(c), &COEFF_QSTATE(x,y,c),
  95.        &prevQList2[c][coordToSpatialLev(x,y,c)], 0);
  96.   else if (mzte_codec.m_iQuantType == SINGLE_Q)
  97.     COEFF_VAL(x,y,c) = quantSingleStage(USER_Q(c), &COEFF_QSTATE(x,y,c),
  98. &dumQ, 0);
  99. }
  100. /* 
  101.    Function Name
  102.    -------------
  103.    static Int quantizeAndMarkCoeffs(Int x, Int y)
  104.    Arguments 
  105.    ---------
  106.    Int x, Int y - Index of wavelet coefficient (row, col) to mark.
  107.    Description
  108.    -----------
  109.    Quantize and mark the coefficient at (x,y) and all of it's descendents.
  110.    Uses recursion to accomplish this.
  111.    Functions Called
  112.    ----------------
  113.    findChild
  114.    quantizeAndMarkCoeffs (recursive call)
  115.    quantizeCoeff
  116.    markCoeffandUpdateState
  117.    isIndexInRootBands
  118.    Return Value
  119.    ------------
  120.    Returns 1, if there are non-zero descendents, and 0, if not.
  121.    Source File
  122.    -----------
  123.    encQM.c
  124. */
  125. Int CVTCEncoder::quantizeAndMarkCoeffs(Int x, Int y, Int c)
  126. {
  127.   Int i;
  128.   UChar valDes, valDesOneBranch; /* 'some non-zero descendent' flags */
  129.   UChar isLeaf; /* is (x,y) a leaf (no children) */
  130.   Int xc[4], yc[4]; /* coords of children */
  131.   Int nc; /* number of children */
  132.   valDes = 0;
  133.   /* Are we at a leaf? */
  134.   if ((nc = findChild(x, y, xc, yc, c)) == 0)
  135.     isLeaf = 1;
  136.   else
  137.   {
  138.     isLeaf = 0;
  139.     /* No - mark descendents in all branches */
  140.     for (i = 0; i < nc; ++i)
  141.     {
  142.       valDesOneBranch = quantizeAndMarkCoeffs(xc[i], yc[i], c);
  143.       valDes = valDes || valDesOneBranch;
  144.     }
  145.   }
  146.   
  147.   /* quantize the current coefficent */
  148.   quantizeCoeff(x, y, c);    
  149.   
  150.   /* Updates type in coeffTable */
  151.   markCoeff(x, y, valDes, c);
  152.     /* update maximums */
  153.   if (!IS_RESID(x,y,c))
  154.   {
  155.     {
  156.       Int l,v;
  157.       l = xy2wvtDecompLev(x,y);
  158.       v = ceilLog2(ABS(COEFF_VAL(x,y,c)));
  159.       if (WVTDECOMP_NUMBITPLANES(c,l) < v)
  160. WVTDECOMP_NUMBITPLANES(c,l) = v;
  161.     }
  162.   }
  163.   /* return zero status of current coeff and all descendents */
  164.    return IS_RESID(x,y,c) || COEFF_VAL(x,y,c) || valDes;
  165. }
  166. /* 
  167.    Function Name
  168.    -------------
  169.    Int encQuantizeDC()
  170.    Arguments 
  171.    ---------
  172.    none
  173.    Description
  174.    -----------
  175.    Quantize all DC coefficients. Get maximum dc value and offset.
  176.    Functions Called
  177.    ----------------
  178.    quantSingleStage
  179.    Return Value
  180.    ------------
  181.    0, if everything's ok. <0, if error.
  182.    Source File
  183.    -----------
  184.    encQM.c
  185. */
  186. Int CVTCEncoder::encQuantizeDC(Int c)
  187. {
  188.   Int err;
  189.   Int x, y;
  190.  
  191.   err=0;
  192.   /* initialize maximum, offset */
  193.   mzte_codec.m_iOffsetDC = 0;
  194.   mzte_codec.m_iMaxDC = 0;
  195.   /* loop through DC */
  196.   noteDetail("Quantizing DC band....");
  197.   noteDebug("Qdc=%d",mzte_codec.m_iQDC[c]);
  198.   for (x = 0; x < mzte_codec.m_iDCWidth; ++x)
  199.     for (y = 0; y < mzte_codec.m_iDCHeight; ++y)
  200.     {
  201.        /* assign new quantization value */
  202.       {
  203.        Int val = COEFF_ORGVAL(x,y,c);
  204.        Int q = mzte_codec.m_iQDC[c];
  205.        if (val > 0) 
  206.           val = ((val<<1) + q) / (q<<1);
  207.        else if (val < 0) 
  208.           val = ((val<<1) - q) / (q<<1);
  209.        COEFF_VAL(x,y,c) = val;
  210.       }
  211.       if (mzte_codec.m_iOffsetDC > COEFF_VAL(x,y,c))
  212. mzte_codec.m_iOffsetDC = COEFF_VAL(x,y,c);
  213.       if (mzte_codec.m_iMaxDC < COEFF_VAL(x,y,c))
  214. mzte_codec.m_iMaxDC = COEFF_VAL(x,y,c);
  215.     }
  216.   noteDetail("Completed quantizing DC bands.");
  217.   return err;
  218. }
  219. /* 
  220.    Function Name
  221.    -------------
  222.    Int encQuantizeAndMarkAC()
  223.    Arguments 
  224.    ---------
  225.    none.
  226.    Description
  227.    -----------
  228.    Quantize and mark of all AC coefficients in current 
  229.    spatial layer. Get maximum values for root, valz, valnz, and resid types.
  230.    Mark all zero flag.
  231.    Functions Called
  232.    ----------------
  233.    quantizeAndMarkCoeffs
  234.    Return Value
  235.    ------------
  236.    0, if everything's ok. <0, if error.
  237.    Source File
  238.    -----------
  239.    encQM.c
  240. */
  241. Int CVTCEncoder::encQuantizeAndMarkAC(Int c)
  242. {
  243.   Int err;
  244.   Int x, y;
  245.   Int nc;
  246.   Int xc[3], yc[3];
  247.   err=0;
  248.   /* hjlee 0901 */
  249.   /* initialize maximums */
  250.   {
  251.     Int l;
  252.     for (l=0; l<mzte_codec.m_iWvtDecmpLev; ++l)  // hjlee BUG
  253. WVTDECOMP_NUMBITPLANES(c,l)=0;
  254.   }
  255.   /* loop through DC */
  256.   noteDetail("Quantizing and marking AC bands....");
  257.   ALL_ZERO(c)=1;
  258.   for (x = 0; x < mzte_codec.m_iDCWidth; ++x)
  259.     for (y = 0; y < mzte_codec.m_iDCHeight; ++y)
  260.     {
  261.       if ((nc = findChild(x, y, xc, yc, c)) != 3)
  262.       {
  263. noteError("DC band coefficient has %d children instead of 3.", nc);
  264. exit(-1);
  265.       }
  266.       ALL_ZERO(c) *= !quantizeAndMarkCoeffs(xc[0], yc[0], c);
  267.       ALL_ZERO(c) *= !quantizeAndMarkCoeffs(xc[1], yc[1], c);
  268.       ALL_ZERO(c) *= !quantizeAndMarkCoeffs(xc[2], yc[2], c);
  269.     }
  270.   noteDetail("Completed quantizing and marking of AC bands.");
  271.   if (ALL_ZERO(c))
  272.     noteProgress("Note: All coefficients are quantized to zero.");
  273.   return err;
  274. }
  275. /* 
  276.    Function Name
  277.    -------------
  278.    Int encUpdateStateAC()
  279.    Arguments 
  280.    ---------
  281.    none.
  282.    Description
  283.    -----------
  284.    Update state and prob model of layer.
  285.    Functions Called
  286.    ----------------
  287.    updateCoeffStateAndModel
  288.    Return Value
  289.    ------------
  290.    0, if everything's ok. <0, if error.
  291.    Source File
  292.    -----------
  293.    encQM.c
  294. */
  295. Int CVTCEncoder::encUpdateStateAC(Int c)
  296. {
  297.   Int err;
  298.   Int x, y;
  299.   Int nc;
  300.   Int xc[3], yc[3];
  301.   err=0;
  302.   /* loop through DC */
  303.   noteDetail("Updating state of AC bands....");
  304.   for (x = 0; x < mzte_codec.m_iDCWidth; ++x)
  305.     for (y = 0; y < mzte_codec.m_iDCHeight; ++y)
  306.     {
  307.       if ((nc = findChild(x, y, xc, yc, c)) != 3)
  308.       {
  309. noteError("DC band coefficient has %d children instead of 3.", nc);
  310. exit(-1);
  311.       }
  312.       
  313.       updateCoeffAndDescState(xc[0], yc[0], c);
  314.       updateCoeffAndDescState(xc[1], yc[1], c);
  315.       updateCoeffAndDescState(xc[2], yc[2], c);
  316.     }
  317.   noteDetail("Completed updating state of AC bands.");
  318.   return err;
  319. }