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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: decQM.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 "dataStruct.hpp"
  57. #include "globals.hpp"
  58. #include "states.hpp"
  59. #include "quant.hpp"
  60. #include "QMUtils.hpp"
  61. #include "QM.hpp"
  62. #include "errorHandler.hpp"
  63. /* 
  64.    Function Name
  65.    -------------
  66.    static Void iQuantizeCoeff(Int x, Int y)
  67.    Arguments 
  68.    ---------
  69.    Int x, Int y - Index of wavelet coefficient (row, col) to quantize.
  70.    Description
  71.    -----------
  72.    Quantize the coefficent at (x,y). Also get maximum number of residual 
  73.    levels for arithmetic coding in SE module.
  74.    coeffinfo Updates:
  75.      1. quantized_value
  76.      2. qState
  77.    Functions Called
  78.    ----------------
  79.    none
  80.    Return Value
  81.    ------------
  82.    none
  83.    Source File
  84.    -----------
  85.    decQM.c
  86. */
  87. Void CVTCDecoder::iQuantizeCoeff(Int x, Int y, Int c)
  88. {
  89.   Int dumQ=0;
  90.   /* assign new quantization value - update quant state */
  91.   if (mzte_codec.m_iQuantType == MULTIPLE_Q)
  92.     COEFF_RECVAL(x,y,c) = 
  93.       invQuantSingleStage(COEFF_VAL(x,y,c), USER_Q(c), &COEFF_QSTATE(x,y,c),
  94.   &prevQList2[c][coordToSpatialLev(x,y,c)], 0);
  95.   else if (mzte_codec.m_iQuantType == SINGLE_Q)
  96.     COEFF_RECVAL(x,y,c) = 
  97.       invQuantSingleStage(COEFF_VAL(x,y,c), USER_Q(c), &COEFF_QSTATE(x,y,c),
  98.   &dumQ, 0);
  99. }
  100. /* 
  101.    Function Name
  102.    -------------
  103.    static Void iQuantizeCoeffs(Int x, Int y)
  104.    Arguments 
  105.    ---------
  106.    Int x, Int y - Index of wavelet coefficient (row, col) to mark.
  107.    Description
  108.    -----------
  109.    Inverse quantize coefficient at (x,y) and all of it's descendents.
  110.    Uses recursion to accomplish this.
  111.    Functions Called
  112.    ----------------
  113.    findChild
  114.    iQuantizeCoeffs (recursive call)
  115.    iQuantizeCoeff
  116.    Return Value
  117.    ------------
  118.    none.
  119.    Source File
  120.    -----------
  121.    decQM.c
  122. */
  123. Void CVTCDecoder::iQuantizeCoeffs(Int x, Int y, Int c)
  124. {
  125.   Int i;
  126.   Int xc[4], yc[4]; /* coords of children */
  127.   Int nc; /* number of children */
  128.   /* Are we at a leaf? */
  129.   if ((nc = findChild(x, y, xc, yc, c)) > 0)
  130.   {
  131.     /* No - mark descendents in all branches */
  132.     for (i = 0; i < nc; ++i)
  133.       iQuantizeCoeffs(xc[i], yc[i], c);
  134.   }
  135.   /* inverse quantize the current coefficent */
  136.   iQuantizeCoeff(x,y, c);    
  137. }
  138. /* 
  139.    Function Name
  140.    -------------
  141.    Int decIQuantizeDC()
  142.    Arguments 
  143.    ---------
  144.    none
  145.    Description
  146.    -----------
  147.    Inverse quantize all DC coefficients.
  148.    Functions Called
  149.    ----------------
  150.    invQuantSingleStage
  151.    Return Value
  152.    ------------
  153.    0, if everything's ok. <0, if error.
  154.    Source File
  155.    -----------
  156.    decQM.c
  157. */
  158. Int CVTCDecoder::decIQuantizeDC(Int c)
  159. {
  160.   Int err;
  161.   Int x, y;
  162.  
  163.   err=0;
  164.   /* loop through DC */
  165.   noteDetail("Inverse Quantizing DC band....");
  166.   for (x = 0; x < mzte_codec.m_iDCWidth; ++x)
  167.     for (y = 0; y < mzte_codec.m_iDCHeight; ++y)
  168.     {
  169.        /* assign new quantization value */
  170.       COEFF_RECVAL(x,y,c) = COEFF_VAL(x,y,c) * mzte_codec.m_iQDC[c];
  171.     }
  172.   noteDetail("Completed inverse Quantizing DC bands.");
  173.   return err;
  174. }
  175. /* 
  176.    Function Name
  177.    -------------
  178.    Int decIQuantizeAC()
  179.    Arguments 
  180.    ---------
  181.    none
  182.    Description
  183.    -----------
  184.    Inverse quantize all AC coefficients.
  185.    Functions Called
  186.    ----------------
  187.    iQuantizeCoeffs
  188.    Return Value
  189.    ------------
  190.    0, if everything's ok. <0, if error.
  191.    Source File
  192.    -----------
  193.    decQM.c
  194. */
  195. Int CVTCDecoder::decIQuantizeAC(Int c)
  196. {
  197.   Int err;
  198.   Int x, y;
  199.   Int nc;
  200.   Int xc[3], yc[3];
  201.   err=0;
  202.   /* loop through DC */
  203.   noteDetail("Inverse quantizing AC bands....");
  204.   for (x = 0; x < mzte_codec.m_iDCWidth; ++x)
  205.     for (y = 0; y < mzte_codec.m_iDCHeight; ++y)
  206.     {
  207.       if ((nc = findChild(x, y, xc, yc,c)) != 3)
  208.       {
  209. noteError("DC band coefficient has %d children instead of 3.", nc);
  210. exit(-1);
  211.       }
  212.       iQuantizeCoeffs(xc[0], yc[0],c);
  213.       iQuantizeCoeffs(xc[1], yc[1],c);
  214.       iQuantizeCoeffs(xc[2], yc[2],c);
  215.     }
  216.   noteDetail("Completed inverse quantizing of AC bands.");
  217.   return err;
  218. }
  219. /********************************************
  220.   Inverse quantize the 3 difference bands 
  221.   between two spatial consecutive spatial
  222.   layers.
  223.   *****************************************/
  224. Int CVTCDecoder::decIQuantizeAC_spa(Int spa_lev,Int c)
  225. {
  226.   Int err,h,w,hstart,wstart,hend,wend;
  227.   err=0;
  228.   /* loop through DC */
  229.   noteDetail("Inverse quantizing AC bands (difference)....");
  230.   hend=mzte_codec.m_SPlayer[c].height;
  231.   wend=mzte_codec.m_SPlayer[c].width;
  232.   if (spa_lev==FIRST_SPA_LEV(mzte_codec.m_iSpatialLev,
  233.      mzte_codec.m_iWvtDecompLev, c))
  234.   {
  235.     hstart=mzte_codec.m_iDCHeight;
  236.     wstart=mzte_codec.m_iDCWidth;
  237.   }
  238.   else
  239.   {
  240.     hstart=hend/2;
  241.     wstart=wend/2;
  242.   }
  243.   for(h=0;h<hstart;h++)
  244.     for(w=wstart;w<wend;w++)
  245.       iQuantizeCoeff(w,h,c);
  246.   for(h=hstart;h<hend;h++)
  247.     for(w=0;w<wend;w++)
  248.       iQuantizeCoeff(w,h,c);
  249.   noteDetail("Completed inverse quantizing of AC bands.");
  250.   return(err);
  251. }
  252. /* 
  253.    Function Name
  254.    -------------
  255.    Int decUpdateStateAC()
  256.    Arguments 
  257.    ---------
  258.    none
  259.    Description
  260.    -----------
  261.    Update state and prob model of all AC coefficients.
  262.    Functions Called
  263.    ----------------
  264.    updateCoeffStateAndModel
  265.    Return Value
  266.    ------------
  267.    0, if everything's ok. <0, if error.
  268.    Source File
  269.    -----------
  270.    decQM.c
  271. */
  272. Int CVTCDecoder::decUpdateStateAC(Int c)
  273. {
  274.   Int err;
  275.   Int x, y;
  276.   Int nc;
  277.   Int xc[3], yc[3];
  278.   err=0;
  279.   /* loop through DC */
  280.   noteDetail("Updating state of AC bands....");
  281.   for (x = 0; x < mzte_codec.m_iDCWidth; ++x)
  282.     for (y = 0; y < mzte_codec.m_iDCHeight; ++y)
  283.     {
  284.       if ((nc = findChild(x, y, xc, yc,c)) != 3)
  285.       {
  286. noteError("DC band coefficient has %d children instead of 3.", nc);
  287. exit(-1);
  288.       }
  289.       
  290.       updateCoeffAndDescState(xc[0], yc[0], c);
  291.       updateCoeffAndDescState(xc[1], yc[1], c);
  292.       updateCoeffAndDescState(xc[2], yc[2], c);
  293.     }
  294.   
  295.   noteDetail("Completed updating state of AC bands.");
  296.   return err;
  297. }
  298. /* 
  299.    Function Name
  300.    -------------
  301.    Int decUpdateStateAC_spa()
  302.    Arguments 
  303.    ---------
  304.    none
  305.    Description
  306.    -----------
  307.    Update state and prob model of all AC coefficients.
  308.    Functions Called
  309.    ----------------
  310.    updateCoeffStateAndModel
  311.    Return Value
  312.    ------------
  313.    0, if everything's ok. <0, if error.
  314.    Source File
  315.    -----------
  316.    decQM.c
  317. */
  318. /* hjlee 0901 */
  319. Int CVTCDecoder::decUpdateStateAC_spa(Int c)
  320. {  
  321.   Int err,h,w,hstart,wstart,hend,wend;
  322.   err=0;
  323.   /* loop through DC */
  324.   noteDetail("Updating state of AC bands (difference)....");
  325.   hstart=mzte_codec.m_SPlayer[c].height/2;
  326.   wstart=mzte_codec.m_SPlayer[c].width/2;
  327.   hend=mzte_codec.m_SPlayer[c].height;
  328.   wend=mzte_codec.m_SPlayer[c].width;
  329.   for(h=0;h<hstart;h++)
  330.     for(w=wstart;w<wend;w++)
  331.       updateCoeffAndDescState(w, h, c);
  332.   for(h=hstart;h<hend;h++)
  333.     for(w=0;w<wend;w++)
  334.       updateCoeffAndDescState(w, h, c);
  335.    
  336.   noteDetail("Completed updating state of AC bands.");
  337.   return err;
  338. }