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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: QMUtils.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 "dataStruct.hpp"
  56. #include "globals.hpp"
  57. #include "states.hpp"
  58. #include "QM.hpp"
  59. #include "QMUtils.hpp"
  60. #include "errorHandler.hpp"
  61. /* 
  62.    Function Name
  63.    -------------
  64.    Int findChild(Int x, Int y, Int xc[], Int yc[])
  65.    Arguments 
  66.    ---------
  67.    Int x, Int y - Index of wavelet coefficient (row, col) to check.
  68.    Int xc[], Int yc[] - Indices of the (maximum of 4) children of (x,y).
  69.    Description
  70.    -----------
  71.    findChild returns the number of children of (x,y). If there are 
  72.    children it puts their indices in (xc, yc).
  73.    
  74.    mzte_codec.dcWidth, mzte_codec.dcHeight, mzte_codec.SPlayer.width, and 
  75.    mzte_codec.SPlayer.height must all be set to their proper values.
  76.    Functions Called
  77.    ----------------
  78.    none
  79.    Return Value
  80.    ------------
  81.    The number of children of (x,y).
  82.    Source File
  83.    -----------
  84.    QMUtils.c
  85. */
  86. Int CVTCCommon::findChild(Int x, Int y, Int xc[], Int yc[], Int c)
  87. {
  88.    Int numChildren;
  89.    if (x < mzte_codec.m_iDCWidth && y < mzte_codec.m_iDCHeight)
  90.    {
  91.      /*------------------- DC Band ---------------------*/ 
  92.      numChildren = 3;
  93.      xc[0] = x + mzte_codec.m_iDCWidth;
  94.      yc[0] = y;
  95.      
  96.      xc[1] = x;
  97.      yc[1] = y + mzte_codec.m_iDCHeight;
  98.      
  99.      xc[2] = x + mzte_codec.m_iDCWidth;
  100.      yc[2] = y + mzte_codec.m_iDCHeight;
  101.    }
  102.    else if((x *= 2) < mzte_codec.m_SPlayer[c].width && 
  103.    (y *= 2) < mzte_codec.m_SPlayer[c].height) 
  104.    { 
  105.      /*------------------- Non-Leaf AC Band ---------------------*/ 
  106.      numChildren = 4;
  107.      
  108.      xc[0] = x;
  109.      yc[0] = y;
  110.      
  111.      xc[1] = x+1;
  112.      yc[1] = y  ;
  113.      
  114.      xc[2] = x  ;
  115.      yc[2] = y+1;
  116.      
  117.      xc[3] = x+1;
  118.      yc[3] = y+1;
  119.    }
  120.    else
  121.      /*------------------- Leaf AC Band ---------------------*/ 
  122.      numChildren = 0;
  123.    return numChildren;
  124. }
  125. /* 
  126.    Function Name
  127.    -------------
  128.    Int isIndexInRootBands(Int x, Int y)
  129.    Arguments 
  130.    ---------
  131.    Int x, Int y - Index of wavelet coefficient (row, col) to check.
  132.    Description
  133.    -----------
  134.    isIndexInRootBands checks if (x,y) is in a root band (first three AC
  135.    bands which aren't leafs).
  136.    
  137.    mzte_codec.dcWidth, mzte_codec.dcHeight, mzte_codec.SPlayer.width, and 
  138.    mzte_codec.SPlayer.height must all be set to their proper values.
  139.    Functions Called
  140.    ----------------
  141.    none
  142.    Return Value
  143.    ------------
  144.    The number of children of (x,y).
  145.    Source File
  146.    -----------
  147.    QMUtils.c
  148. */
  149. Int CVTCCommon::isIndexInRootBands(Int x, Int y, Int c)
  150. {  
  151.   Int x1, x2, y1, y2;
  152.   x1 = mzte_codec.m_iDCWidth<<1;
  153.   x2 = mzte_codec.m_SPlayer[c].width>>1;
  154.   y1 = mzte_codec.m_iDCHeight<<1;
  155.   y2 = mzte_codec.m_SPlayer[c].height>>1;
  156.   return x < MIN(x1,x2) && y < MIN(y1,y2) 
  157.     && (x >= mzte_codec.m_iDCWidth || y >= mzte_codec.m_iDCHeight);
  158. }
  159. /* 
  160.    Function Name
  161.    -------------
  162.    Void markCoeff(Int x, Int y, UChar valuedDes)
  163.    Arguments 
  164.    ---------
  165.    Int x, Int y - Index of wavelet coefficient (row, col) to mark.
  166.    UChar valuedDes - Flag for existence of non-zero descendents at
  167.      (x,y). 0 = all descendents are zero, 1 = some descendents are non-zero.
  168.    Description
  169.    -----------
  170.    Mark type of current coefficient.
  171.    Functions Called
  172.    ----------------
  173.    none
  174.    Return Value
  175.    ------------
  176.    none
  177.    Source File
  178.    -----------
  179.    QMUtils.c
  180. */
  181. Void CVTCCommon::markCoeff(Int x, Int y, UChar valuedDes, Int c)
  182. {
  183.   if (COEFF_STATE(x,y,c) == S_INIT || COEFF_STATE(x,y,c) == S_ZTR 
  184.       || COEFF_STATE(x,y,c) == S_ZTR_D)
  185.   {
  186.     if (COEFF_VAL(x,y,c))
  187.     {
  188.       if (valuedDes)
  189. COEFF_TYPE(x,y,c) = VAL;
  190.       else
  191. COEFF_TYPE(x,y,c) = VZTR;
  192.     }
  193.     else
  194.     {
  195.       if (valuedDes)
  196. COEFF_TYPE(x,y,c) = IZ;
  197.       else
  198. COEFF_TYPE(x,y,c) = ZTR;
  199.     }
  200.   }
  201.   else if (COEFF_STATE(x,y,c) == S_IZ)
  202.   {
  203.     if (COEFF_VAL(x,y,c))
  204.       COEFF_TYPE(x,y,c) = VAL;
  205.     else
  206.       COEFF_TYPE(x,y,c) = IZ;
  207.   }
  208.   else if (COEFF_STATE(x,y,c) == S_VZTR)
  209.   {
  210.     if (valuedDes)
  211.       COEFF_TYPE(x,y,c) = VAL;
  212.     else
  213.       COEFF_TYPE(x,y,c) = VZTR;
  214.   }
  215.   else if (COEFF_STATE(x,y,c) == S_VAL)
  216.   {
  217.     COEFF_TYPE(x,y,c) = VAL;
  218.   }
  219.   else if (COEFF_STATE(x,y,c) == S_LINIT || COEFF_STATE(x,y,c) == S_LZTR 
  220.       || COEFF_STATE(x,y,c) == S_LZTR_D)
  221.   {
  222.     if (COEFF_VAL(x,y,c))
  223.       COEFF_TYPE(x,y,c) = VZTR;
  224.     else
  225.       COEFF_TYPE(x,y,c) = ZTR;
  226.   }
  227.   else /* if (COEFF_STATE(x,y,c) == S_LVZTR) */
  228.     COEFF_TYPE(x,y,c) = VZTR;
  229.   
  230. }
  231. /* 
  232.    Function Name
  233.    -------------
  234.    Void updateState(Int x, Int y, Int type)
  235.    Arguments 
  236.    ---------
  237.    Int x, Int y - Index of wavelet coefficient (row, col) to mark.
  238.    Description
  239.    -----------
  240.    Update the state of current coefficient.
  241.    Functions Called
  242.    ----------------
  243.    none
  244.    Return Value
  245.    ------------
  246.    none
  247.    Source File
  248.    -----------
  249.    QMUtils.c
  250. */
  251. Void CVTCCommon::updateState(Int x, Int y, Int type, Int c)
  252. {
  253.   switch(COEFF_STATE(x,y,c))
  254.   {
  255.     case S_INIT:
  256.     case S_ZTR:
  257.     case S_ZTR_D:
  258.       switch (type)
  259.       {
  260. case ZTR_D:
  261.   COEFF_STATE(x,y,c) = S_ZTR_D;
  262.   break;
  263. case ZTR:
  264.   COEFF_STATE(x,y,c) = S_ZTR;
  265.   break;
  266. case VZTR:
  267.   COEFF_STATE(x,y,c) = S_VZTR;
  268.   break;
  269. case IZ:
  270.   COEFF_STATE(x,y,c) = S_IZ;
  271.   break;
  272. case VAL:
  273.   COEFF_STATE(x,y,c) = S_VAL;
  274.   break;
  275. default:
  276.   errorHandler("updateState: type %d for state %d is invalid.",
  277.        type, COEFF_STATE(x,y,c));
  278.       }
  279.       break;
  280.     case S_IZ:
  281.       switch (type)
  282.       {
  283. case IZ:
  284.   COEFF_STATE(x,y,c) = S_IZ;
  285.   break;
  286. case VAL:
  287.   COEFF_STATE(x,y,c) = S_VAL;
  288.   break;
  289. default:
  290.   errorHandler("updateState: type %d for state %d is invalid.",
  291.        type, COEFF_STATE(x,y,c));
  292.       }
  293.       break;
  294.     case S_VZTR:
  295.       switch (type)
  296.       {
  297. case VZTR:
  298.   COEFF_STATE(x,y,c) = S_VZTR;
  299.   break;
  300. case VAL:
  301.   COEFF_STATE(x,y,c) = S_VAL;
  302.   break;
  303. default:
  304.   errorHandler("updateState: type %d for state %d is invalid.",
  305.        type, COEFF_STATE(x,y,c));
  306.       }
  307.       break;
  308.     case S_LINIT:
  309.     case S_LZTR:
  310.     case S_LZTR_D:
  311.       switch (type)
  312.       {
  313. case ZTR_D:
  314.   COEFF_STATE(x,y,c) = S_LZTR_D;
  315.   break;
  316. case ZTR:
  317.   COEFF_STATE(x,y,c) = S_LZTR;
  318.   break;
  319. case VZTR:
  320.   COEFF_STATE(x,y,c) = S_LVZTR;
  321.   break;
  322. default:
  323.   errorHandler("updateState: type %d for state %d is invalid.",
  324.        type, COEFF_STATE(x,y,c));
  325.       }
  326.       break;
  327.     case S_DC:
  328.     case S_VAL:
  329.     case S_LVZTR:
  330.       break;
  331.     default:
  332.       errorHandler("updateState: state %d is invalid.", COEFF_STATE(x,y,c));
  333.   }
  334. }
  335. /* 
  336.    Function Name
  337.    -------------
  338.    Void updateCoeffAndDescState(Int x, Int y)
  339.    Arguments 
  340.    ---------
  341.    Int x, Int y - Index of wavelet coefficient (row, col) to mark.
  342.    Description
  343.    -----------
  344.    Update the state of coefficient at (x,y) and all of it's descendents. 
  345.    Uses recursion to accomplish this.
  346.    Functions Called
  347.    ----------------
  348.    findChild
  349.    updateCoeffAndDescState (recursive call)
  350.    updateState
  351.    Return Value
  352.    ------------
  353.    none.
  354.    Source File
  355.    -----------
  356.    QMUtils.c
  357. */
  358. Void CVTCCommon::updateCoeffAndDescState(Int x, Int y, Int c)
  359. {
  360.   Int i;
  361.   Int xc[4], yc[4]; /* coords of children */
  362.   Int nc; /* number of children */
  363.   /* Are we at a leaf? */
  364.   if ((nc = findChild(x, y, xc, yc, c)) > 0)
  365.   {
  366.     /* No - mark descendents in all branches */
  367.     for (i = 0; i < nc; ++i)
  368.       updateCoeffAndDescState(xc[i], yc[i], c);
  369.   }
  370.   
  371.   /* Updates state in coeffTable */
  372.   updateState(x, y, COEFF_TYPE(x, y, c), c);
  373. }
  374. /* 
  375.    Function Name
  376.    -------------
  377.    Void spatialLayerChangeUpdate()
  378.    Arguments 
  379.    ---------
  380.    none.
  381.    Description
  382.    -----------
  383.    Update the state of leaf coefficients when the spatial layer changes.
  384.    Call right *after* spatial layer has increased. It is assummed that
  385.    the increase was a doubling of the size (three more AC bands).
  386.    Functions Called
  387.    ----------------
  388.    none.
  389.    Return Value
  390.    ------------
  391.    none.
  392.    Source File
  393.    -----------
  394.    QMUtils.c
  395. */
  396. Void CVTCCommon::spatialLayerChangeUpdate(Int c)
  397. {  
  398.   Int x, y;
  399.   Int oldWidth, oldHeight;
  400.   Int xLeafStart, yLeafStart;
  401.   noteDetail("Updating new coefficients in spatial layer for col %d....",c);
  402.   oldWidth  = mzte_codec.m_spaLayerWidth[mzte_codec.m_iCurSpatialLev][c]>>1;
  403.   oldHeight = mzte_codec.m_spaLayerHeight[mzte_codec.m_iCurSpatialLev][c]>>1;
  404.   xLeafStart = mzte_codec.m_spaLayerWidth[mzte_codec.m_iCurSpatialLev-1][c]>>1;
  405.   yLeafStart = mzte_codec.m_spaLayerHeight[mzte_codec.m_iCurSpatialLev-1][c]>>1;
  406.  
  407.   /* loop through leaf coefficients */
  408.   /* HL */
  409.   for (y = 0; y < yLeafStart; ++y)
  410.     for (x = xLeafStart; x < oldWidth; ++x)
  411.       /* update state */
  412.       switch (COEFF_STATE(x,y,c))
  413.       {
  414. case S_LVZTR:
  415.   COEFF_STATE(x,y,c) = S_VZTR;
  416.   break;
  417. case S_LZTR:
  418.   COEFF_STATE(x,y,c) = S_ZTR;
  419.   break;
  420. case S_LZTR_D:
  421.   COEFF_STATE(x,y,c) = S_ZTR_D;
  422.   break;
  423. case S_LINIT:
  424.   COEFF_STATE(x,y,c) = S_INIT;
  425.   break;
  426. default:
  427.   errorHandler("Non-leaf state (%d) for leaf coefficient at"
  428.        "(x=%d, y=%d).", 
  429.        COEFF_STATE(x, y,c), x, y);
  430.       }
  431.   /* LH */
  432.   for (y = yLeafStart; y < oldHeight; ++y)
  433.     for (x = 0; x < xLeafStart; ++x)
  434.       /* update state */
  435.       switch (COEFF_STATE(x,y,c))
  436.       {
  437. case S_LVZTR:
  438.   COEFF_STATE(x,y,c) = S_VZTR;
  439.   break;
  440. case S_LZTR:
  441.   COEFF_STATE(x,y,c) = S_ZTR;
  442.   break;
  443. case S_LZTR_D:
  444.   COEFF_STATE(x,y,c) = S_ZTR_D;
  445.   break;
  446. case S_LINIT:
  447.   COEFF_STATE(x,y,c) = S_INIT;
  448.   break;
  449. default:
  450.   errorHandler("Non-leaf state (%d) for leaf coefficient at"
  451.        "(x=%d, y=%d).", 
  452.        COEFF_STATE(x, y,c), x, y);
  453.       }
  454.   
  455.   /* HH */
  456.   for (y = yLeafStart; y < oldHeight; ++y)
  457.     for (x = xLeafStart; x < oldWidth; ++x)
  458.       /* update state */
  459.       switch (COEFF_STATE(x,y,c))
  460.       {
  461. case S_LVZTR:
  462.   COEFF_STATE(x,y,c) = S_VZTR;
  463.   break;
  464. case S_LZTR:
  465.   COEFF_STATE(x,y,c) = S_ZTR;
  466.   break;
  467. case S_LZTR_D:
  468.   COEFF_STATE(x,y,c) = S_ZTR_D;
  469.   break;
  470. case S_LINIT:
  471.   COEFF_STATE(x,y,c) = S_INIT;
  472.   break;
  473. default:
  474.   errorHandler("Non-leaf state (%d) for leaf coefficient at"
  475.        "(x=%d, y=%d).", 
  476.        COEFF_STATE(x, y,c), x, y);
  477.       }
  478.   noteDetail("Completed updating new coefficients in spatial layer.");
  479. }
  480. Int CVTCCommon::coordToSpatialLev(Int x, Int y, Int c)
  481. {
  482.   Int k;
  483.   for (k = 0; k < mzte_codec.m_iSpatialLev; ++k)
  484.     if (x < mzte_codec.m_spaLayerWidth[k][c] 
  485. && y < mzte_codec.m_spaLayerHeight[k][c])
  486.       return k;
  487.   return(0);
  488. }