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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: dwtmask.cpp,v 1.2 2001/04/19 18:32:09 wmay Exp $ */
  2. /****************************************************************************/
  3. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  4. /*                                                                          */
  5. /*   This software was developed by                                         */
  6. /*   Sarnoff Corporation                   and    Texas Instruments         */
  7. /*   Iraj Sodagar   (iraj@sarnoff.com)           Jie Liang (liang@ti.com)   */
  8. /*   Hung-Ju Lee    (hjlee@sarnoff.com)                                     */
  9. /*   Paul Hatrack   (hatrack@sarnoff.com)                                   */
  10. /*   Shipeng Li     (shipeng@sarnoff.com)                                   */
  11. /*   Bing-Bing Chai (bchai@sarnoff.com)                                     */
  12. /*                                                                          */
  13. /* In the course of development of the MPEG-4 standard. This software       */
  14. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  15. /* specified by the MPEG-4 standard.                                        */
  16. /*                                                                          */
  17. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  18. /* of the MPEG-4 standard free license to use this  software module or      */
  19. /* modifications thereof for hardware or software products claiming         */
  20. /* conformance to the MPEG-4 standard.                                      */
  21. /*                                                                          */
  22. /* Those Intending to use this software module in hardware or software      */
  23. /* products are advised that use may infringe existing  patents. The        */
  24. /* original developers of this software module and their companies, the     */
  25. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  26. /* and ISO/IEC have no liability for use of this software module or         */
  27. /* modification thereof in an implementation.                               */
  28. /*                                                                          */
  29. /* Permission is granted to MPEG memebers to use, copy, modify,             */
  30. /* and distribute the software modules ( or portions thereof )              */
  31. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  32. /*                                                                          */
  33. /* Copyright (C) 1998  Sarnoff Corporation and Texas Instruments            */ 
  34. /****************************************************************************/
  35. /************************************************************/
  36. /*     Sarnoff Very Low Bit Rate Still Image Coder          */
  37. /*     Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
  38. /************************************************************/
  39. /* Forward SA-DWT Mask Decomposition for MPEG-4 Still Texture Coding 
  40. Original Coded by Shipeng Li, Sarnoff Corporation, Jan. 1998*/
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #include <memory.h>
  45. #include "basic.hpp"
  46. #include "dwt.h"
  47. /* Function:    DWTMask()
  48.    Description: Forward DWT Mask Decompsoition(inversible) 
  49.                 for MPEG-4 Still Texture Coding 
  50.    Input:
  51.    InMask -- Input Object Mask for InData, if ==1, data inside object, 
  52.              otherwise outside.
  53.    Width  -- Width of Image (must be multiples of 2^nLevels);
  54.    Height -- Height of Image (must be multiples of 2^nLevels);
  55.    nLevels -- number of decomposition level,0 being original image;
  56.    Filter     -- Filter Used.
  57.    Output:
  58.    OutMask    -- Output mask corresponding to wavelet coefficients
  59.    Return: DWT_OK if success.  
  60. */
  61. Int VTCDWTMASK::do_DWTMask(UChar *InMask, UChar *OutMask, Int Width, Int Height, Int nLevels,
  62.     FILTER **Filter)
  63. {
  64.   Int level;
  65.   Int ret;
  66.   /* Check filter class first */
  67.   for(level=0;level<nLevels; level++) {
  68.     if(Filter[level]->DWT_Class != DWT_ODD_SYMMETRIC && Filter[level]->DWT_Class != DWT_EVEN_SYMMETRIC ) {
  69.       return(DWT_FILTER_UNSUPPORTED);
  70.     }
  71.   }
  72.   /* Limit nLevels as: 0 - 15*/
  73.   if(nLevels < 0 || nLevels >=16) return(DWT_INVALID_LEVELS);
  74.   /* Check Width and Height, must be multiples of 2^nLevels */
  75.   if((Width &( (1<<nLevels)-1))!=0) return(DWT_INVALID_WIDTH);
  76.   if((Height &( (1<<nLevels)-1))!=0) return(DWT_INVALID_HEIGHT);
  77.   /* Zero Level of Decomposition */
  78.   /* copy mask */
  79.   memcpy(OutMask, InMask, sizeof(UChar)*Width*Height);
  80.   
  81.   /* Perform the  DWT MASK Decomposition*/
  82.   for(level=1;level<=nLevels;level++) {
  83.     ret=DecomposeMaskOneLevel(OutMask, Width, Height, 
  84.       level, Filter[level-1]);
  85.     if(ret!=DWT_OK) return(ret);
  86.   }
  87.   
  88.   return(DWT_OK);
  89. }
  90. /* Function:   DecomposeMaskOneLevel()
  91.    Description: Pyramid Decompose one level of wavelet coefficients mask
  92.    Input:
  93.    Width  -- Width of Image; 
  94.    Height -- Height of Image;
  95.    level -- current decomposition level
  96.    Filter     -- Filter Used.
  97.    Input/Output:
  98.    OutMask    -- Output mask corresponding to wavelet coefficients
  99.    Return: DWT_OK if success.
  100. */
  101. Int VTCDWTMASK:: DecomposeMaskOneLevel(UChar *OutMask, Int Width,
  102. Int Height, Int level, FILTER *Filter)
  103. {
  104.   UChar *InMaskBuf, *OutMaskBuf;
  105.   Int width = Width>>(level-1);
  106.   Int height = Height>>(level-1);
  107.   Int MaxLength = (width > height)?width:height;
  108.   Int i,k,ret;
  109.   UChar *c,*d;
  110.   
  111.   /* allocate line buffers */
  112.   InMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength);
  113.   OutMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength);
  114.   if(InMaskBuf ==NULL || OutMaskBuf==NULL) 
  115.     return(DWT_MEMORY_FAILED);
  116.     
  117.   /* horizontal decomposition first*/
  118.   for(i=0,k=0;i<height;i++,k+=Width) {
  119.     /* get a line of mask */
  120.     memcpy(InMaskBuf, OutMask+k, sizeof(UChar)*width);
  121.     /* Perform horizontal SA-DWT */
  122.     ret=SADWTMask1d(InMaskBuf, OutMaskBuf, width, Filter, 
  123.     DWT_HORIZONTAL);
  124.     if(ret!=DWT_OK) {
  125.       free(InMaskBuf);free(OutMaskBuf);
  126.       return(ret);
  127.     }
  128.     memcpy(OutMask+k, OutMaskBuf, sizeof(UChar)*width);
  129.   }
  130.   /* then vertical decomposition */
  131.   for(i=0;i<width;i++) {
  132.     /* get a column of coefficients */
  133.     for(c= InMaskBuf, d= OutMask+i;
  134. c < InMaskBuf+height; c++,  d+=Width) {
  135.       *c = *d;
  136.     }
  137.     /* perform vertical SA-DWT */
  138.     ret=SADWTMask1d(InMaskBuf, OutMaskBuf, height, Filter, 
  139.     DWT_VERTICAL);
  140.     if(ret!=DWT_OK) {
  141.       free(InMaskBuf);free(OutMaskBuf);
  142.       return(ret);
  143.     }
  144.     /* put the transformed column back */
  145.     for(c= OutMaskBuf, d= OutMask+i;
  146. c<OutMaskBuf+height;  c++,  d+=Width) {
  147.       *d = *c;
  148.     }
  149.   }
  150.   free(InMaskBuf);free(OutMaskBuf);
  151.   return(DWT_OK);
  152. }
  153. /* Function: SADWTMask1d()
  154.    Description:  1-d SA-DWT Mask Decomposition
  155.    Input:
  156.    InMaskBuf -- Input 1d mask buffer
  157.    Length -- length of the input data
  158.    Filter -- filter used
  159.    Direction -- vertical or horizontal decomposition (used for inversible 
  160.    mask decomposition)
  161.    Output:
  162.    
  163.    OutMask -- Mask for the Transformed 1d Data
  164.    Return: return DWT_OK if success
  165.   
  166. */
  167. Int VTCDWTMASK:: SADWTMask1d(UChar *InMaskBuf, UChar *OutMaskBuf, Int Length, 
  168. FILTER *Filter, Int Direction)
  169. {
  170.   switch(Filter->DWT_Class){
  171.   case DWT_ODD_SYMMETRIC:
  172.     return(SADWTMask1dOddSym(InMaskBuf, OutMaskBuf, 
  173.     Length, Filter, Direction));
  174.   case DWT_EVEN_SYMMETRIC:
  175.     return(SADWTMask1dEvenSym(InMaskBuf, OutMaskBuf, 
  176.      Length, Filter, Direction));
  177.     /*  case ORTHOGONAL:
  178. return(SADWT1dOrthInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  179.   Length, Filter, Direction)); */
  180.   default:
  181.     return(DWT_FILTER_UNSUPPORTED);
  182.   }
  183. }
  184. /* Function: SADWTMask1dOddSym()
  185.    Description: 1D  SA-DWT Decomposition using Odd Symmetric Filter
  186.    Input:
  187.    InMaskBuf -- Input 1d mask buffer
  188.    Length -- length of the input data
  189.    Filter -- filter used
  190.    Direction -- vertical or horizontal decomposition (used for inversible 
  191.    mask decomposition)
  192.    Output:
  193.    
  194.    OutMask -- Mask for the Transformed 1d Data
  195.    Return: return DWT_OK if success
  196. */
  197. Int VTCDWTMASK:: SADWTMask1dOddSym( UChar *InMaskBuf, UChar *OutMaskBuf, 
  198.       Int Length, FILTER *Filter, Int Direction)
  199.      
  200. {
  201.   Int i;
  202.   Int SegLength = 0;
  203.   Int odd;
  204.   Int start, end;
  205.   UChar *a, *b, *c;
  206.   /* double check filter class and type */
  207.   if(Filter->DWT_Class != DWT_ODD_SYMMETRIC) return(DWT_INTERNAL_ERROR);
  208.   /* double check if Length is even */
  209.   if(Length & 1) return(DWT_INTERNAL_ERROR);
  210.   /* initial mask output */
  211.   for(a=InMaskBuf, b = OutMaskBuf, c= OutMaskBuf+(Length>>1); a<InMaskBuf+Length;) {
  212.     *b++ = *a++;
  213.     *c++ = *a++;
  214.   }
  215.   
  216.   i = 0;
  217.   a = InMaskBuf;
  218.   while(i<Length) {
  219.     /* search for a segment */
  220.     while(i<Length && (a[i])!=DWT_IN) i++;
  221.     start = i;
  222.     if(i >= Length) break;
  223.     while(i<Length && (a[i])==DWT_IN) i++;
  224.     end = i;
  225.     SegLength = end-start;
  226.     odd = start%2;
  227.     if(SegLength==1) { /* special case for single poInt */
  228.       /* swap the subsampled mask for single poInt if highpass is IN */
  229.       if(Direction == DWT_HORIZONTAL) {
  230. /* After horizontal decomposition, 
  231.    LP mask symbols: IN, OUT0;
  232.    HP mask symbols: IN, OUT0, OUT1 */
  233. if(OutMaskBuf[start>>1]==DWT_OUT0) { 
  234.   OutMaskBuf[start>>1] = DWT_IN;
  235.   OutMaskBuf[(start>>1)+(Length>>1)]=DWT_OUT1;
  236. }
  237.       }
  238.       else { /* vertical */
  239. /* After vertical decomposition, 
  240.    LLP mask symbols: IN, OUT0;
  241.    LHP mask symbols: IN, OUT2, OUT3;
  242.    HLP mask symbols: IN, OUT0, OUT1;
  243.    HHP mask symbols: IN, OUT0, OUT1, OUT2, OUT3 */
  244. if(OutMaskBuf[start>>1] == DWT_OUT0) {
  245.   OutMaskBuf[(start>>1)+(Length>>1)]= DWT_OUT2 ;
  246.   OutMaskBuf[start>>1] = DWT_IN;
  247. }
  248. else if(OutMaskBuf[start>>1] == DWT_OUT1) {
  249.   OutMaskBuf[(start>>1)+(Length>>1)]= DWT_OUT3 ;
  250.   OutMaskBuf[start>>1] = DWT_IN;
  251. }
  252.       }
  253.     }
  254.   }
  255.   return(DWT_OK);
  256. }
  257. /* Function: SADWTMask1dEvenSym() 
  258.    Description: 1D  SA-DWT Mask Decomposition using Even Symmetric Filter
  259.    Input:
  260.    InMaskBuf -- Input 1d mask buffer
  261.    Length -- length of the input data
  262.    Filter -- filter used
  263.    Direction -- vertical or horizontal decomposition (used for inversible 
  264.    mask decomposition)
  265.    Output:
  266.    
  267.    OutMask -- Mask for the Transformed 1d Data
  268.    Return: return DWT_OK if success
  269. */
  270. Int VTCDWTMASK:: SADWTMask1dEvenSym( UChar *InMaskBuf,  UChar *OutMaskBuf, 
  271.        Int Length, FILTER *Filter, Int Direction)
  272. {
  273.   Int i;
  274.   Int SegLength = 0;
  275.   Int odd;
  276.   Int start, end;
  277.   UChar *a, *b, *c;
  278.   /* double check filter class and type */
  279.   if(Filter->DWT_Class != DWT_EVEN_SYMMETRIC) return(DWT_INTERNAL_ERROR);
  280.   /* double check if Length is even */
  281.   if(Length & 1) return(DWT_INTERNAL_ERROR);
  282.   /* initial mask output */
  283.   for(a=InMaskBuf, b = OutMaskBuf, c= OutMaskBuf+(Length>>1); a<InMaskBuf+Length;) {
  284.     *b++ = *a++;
  285.     *c++ = *a++;
  286.   }
  287.   
  288.   i = 0;
  289.   a = InMaskBuf;
  290.   while(i<Length) {
  291.     /* search for a segment */
  292.     while(i<Length && (a[i])!=DWT_IN) i++;
  293.     start = i;
  294.     if(i >= Length) break;
  295.     while(i<Length && (a[i])==DWT_IN) i++;
  296.     end = i;
  297.     SegLength = end-start;
  298.     odd = start%2;
  299.     /* swap the subsampled mask for the start of segment if it is odd*/
  300.     if(odd) {
  301.       if(Direction == DWT_HORIZONTAL) {
  302. /* After horizontal decomposition, 
  303.    LP mask symbols: IN, OUT0;
  304.    HP mask symbols: IN, OUT0, OUT1 */
  305. if(OutMaskBuf[start>>1]==DWT_OUT0) { 
  306.   OutMaskBuf[start>>1] = DWT_IN;
  307.   OutMaskBuf[(start>>1)+(Length>>1)]=DWT_OUT1;
  308. }
  309.       }
  310.       else { /* vertical */
  311. /* After vertical decomposition, 
  312.    LLP mask symbols: IN, OUT0;
  313.    LHP mask symbols: IN, OUT2, OUT3;
  314.    HLP mask symbols: IN, OUT0, OUT1;
  315.    HHP mask symbols: IN, OUT0, OUT1, OUT2, OUT3 */
  316. if(OutMaskBuf[start>>1] == DWT_OUT0) {
  317.   OutMaskBuf[(start>>1)+(Length>>1)]= DWT_OUT2 ;
  318.   OutMaskBuf[start>>1] = DWT_IN;
  319. }
  320. else if(OutMaskBuf[start>>1] == DWT_OUT1) {
  321.   OutMaskBuf[(start>>1)+(Length>>1)]= DWT_OUT3 ;
  322.   OutMaskBuf[start>>1] = DWT_IN;
  323. }
  324.       }
  325.     }
  326.   }
  327.   return(DWT_OK);
  328. }