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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: imagebox.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 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. /* imagebox.c -- extend/crop an image to a box of the minimal multiples of 
  55.                  2^Decomposition Level size that contains the object, according
  56.  to the mask information */
  57. #include <stdio.h>
  58. #include <stdlib.h>
  59. #include <string.h>
  60. #include <math.h>
  61. #include <memory.h>
  62. #include "basic.hpp"
  63. #include "dwt.h"
  64. #ifndef __cplusplus
  65. static Int LCM(Int x, Int y);
  66. static Int GCD(Int x, Int y);
  67. #endif
  68. /* Function: GetBox()
  69.    Description: get the bounding box of the image object
  70.    Input:
  71.    
  72.    InImage -- Input image data, data type defined by DataType;
  73.    InMask -- Input image mask, can be NULL if Shape == RECTANGULAR;
  74.    RealWidth, RealHeight  -- the size of the actual image;
  75.    Nx, Ny -- specify  that OriginX and OriginY must be multiple of Nx and Ny
  76.              to accomdate different color compoents configuration:
  77.      Examples:
  78.      for 420:   Nx  Ny 
  79.            Y:   2   2
  80.                    U,V: 1   1
  81.      for 422:   
  82.            Y:   2   1
  83.              for 444:
  84.       Y,U,V:    1   1
  85.      for mono:
  86.                   Y:    1   1
  87.      for YUV9:  
  88.                   Y:    4   4
  89.                   U,V:  1   1  
  90.   
  91.    DataType -- 0 - UChar 1- UShort for InImage and OutImage
  92.    Shape   -- if -1, the SHAPE is rectangular, else arbitary shape and
  93.               Shape defines the mask value of an object, useful for
  94.       multiple objects coding 
  95.    nLevels -- levels of decomposition
  96.    Output:
  97.    
  98.    OutImage -- Output image within the bounding box (can be cropped or 
  99.                extended version of the InImage)
  100.    OutMask -- Output image mask, extended area is marked as Don't-care
  101.    VirtualWidth, VirtualHeight -- size of the output image
  102.    OriginX, OriginY -- origins of the output image relative to the original
  103.                        image
  104.        
  105.    Return:  DWT_NOVALID_PIXEL if the mask are all zeros, otherwise DWT_OK 
  106.             if no error;        
  107.    Note: The caller should free the memory OutImage and OutMask allocated by this program 
  108.          after it finishes using them.
  109. */
  110. Int VTCIMAGEBOX::GetBox(Void *InImage, Void **OutImage, 
  111.    Int RealWidth, Int RealHeight, 
  112.    Int VirtualWidth, Int VirtualHeight, 
  113.    Int OriginX, Int OriginY, Int DataType)
  114. {
  115.   Int origin_x, origin_y;
  116.   Int virtual_width, virtual_height;
  117.   UChar *data, *indata;
  118.   Int wordsize = (DataType==DWT_USHORT_ENUM)?2:1;
  119.   Int i, j;
  120.   Int real_width, real_height; 
  121.   Int max_x, max_y;
  122.   Int rows, cols;
  123.   
  124.   real_width = RealWidth;
  125.   real_height = RealHeight;
  126.   origin_x = OriginX;
  127.   origin_y = OriginY;
  128.   virtual_width = VirtualWidth;
  129.   virtual_height = VirtualHeight;
  130.   
  131.   /* allocate proper memory and initialize */
  132.   if ((data = (UChar *)malloc(sizeof(UChar)*virtual_width*virtual_height*wordsize)) == NULL) {
  133.     return(DWT_MEMORY_FAILED);
  134.   }
  135.   memset(data, (Char )0, sizeof(UChar)*virtual_width*virtual_height*wordsize);
  136.   /* calculate clip area */
  137.   max_y = origin_y+virtual_height;
  138.   max_y = (max_y<real_height)?max_y:real_height;
  139.   rows = max_y - origin_y;
  140.   max_x = origin_x+virtual_width;
  141.   max_x = (max_x<real_width)?max_x:real_width;
  142.   cols = max_x - origin_x;
  143.   indata = (UChar *)InImage;
  144.   /* fill out data */
  145.   for(i=0, j=origin_y*real_width+origin_x; i< rows*virtual_width;
  146.       i+=virtual_width, j+=real_width) {
  147.     memcpy(data+i, indata+j, wordsize*cols);
  148.   }
  149.   
  150.   *OutImage = data;
  151.   return(DWT_OK);
  152. }
  153.   
  154. /* Function: GetMaskBox()
  155.    Description: get the bounding box of the mask of image object
  156.    Input:
  157.    
  158.    InMask -- Input image mask, can be NULL if Shape == RECTANGULAR;
  159.    RealWidth, RealHeight  -- the size of the actual image;
  160.    Nx, Ny -- specify  that OriginX and OriginY must be multiple of Nx and Ny
  161.              to accomdate different color compoents configuration:
  162.      Examples:
  163.      for 420:   Nx  Ny 
  164.            Y:   2   2
  165.                    U,V: 1   1
  166.      for 422:   
  167.            Y:   2   1
  168.              for 444:
  169.       Y,U,V:    1   1
  170.      for mono:
  171.                   Y:    1   1
  172.      for YUV9:  
  173.                   Y:    4   4
  174.                   U,V:  1   1  
  175.   
  176.    Shape   -- if -1, the SHAPE is rectangular, else arbitary shape and
  177.               Shape defines the mask value of an object, useful for
  178.       multiple objects coding 
  179.    nLevels -- levels of decomposition
  180.    Output:
  181.    
  182.    OutMask -- Output image mask, extended area is marked as Don't-care
  183.    VirtualWidth, VirtualHeight -- size of the output image
  184.    OriginX, OriginY -- origins of the output image relative to the original
  185.                        image
  186.        
  187.    Return:  DWT_NOVALID_PIXEL if the mask are all zeros, otherwise DWT_OK 
  188.             if no error;        
  189.    Note: The caller should free the memory OutMask allocated by this program 
  190.          after it finishes using them.
  191. */
  192. Int VTCIMAGEBOX:: GetMaskBox(UChar *InMask,  UChar **OutMask, 
  193.        Int RealWidth, Int RealHeight, 
  194.        Int Nx, Int Ny,
  195.        Int *VirtualWidth, Int *VirtualHeight, 
  196.        Int *OriginX, Int *OriginY,  Int Shape, Int nLevels)
  197. {
  198.   Int origin_x, origin_y;
  199.   Int virtual_width, virtual_height;
  200.   UChar *mask;
  201.   Int blocksize =  1 << nLevels;
  202.   Int i, j;
  203.   Int real_width, real_height; 
  204.   Int max_x, max_y;
  205.   Int min_x, min_y;
  206.   Int rows, cols;
  207.   UChar *a, *b, *f;
  208.   
  209.   if(blocksize%Nx!=0) blocksize = LCM(blocksize,Nx);
  210.   if(blocksize%Ny!=0) blocksize = LCM(blocksize,Ny);
  211.   
  212.   real_width = RealWidth;
  213.   real_height = RealHeight;
  214.   if(Shape != RECTANGULAR) {
  215.     /* to search for the upper left corner of the bounding box of 
  216.        arbitrarily shaped object */
  217.     min_x = real_width;
  218.     min_y = real_height;
  219.     max_x = 0;
  220.     max_y =0;
  221.     
  222.     for(i=0,j=0;j < real_height; j++,i+=real_width){
  223.       a=InMask+i;
  224.       f = InMask+i+real_width;
  225.       for(; a< f; a++){
  226. if(*a == Shape) {
  227.   min_y = j;
  228.   goto minx;
  229. }
  230.       }
  231.     }
  232.   minx:
  233.     for(i=0;i < real_width;i++){
  234.       a=InMask+i;
  235.       f=InMask+i+real_width*real_height;
  236.       for(; a<f;  a+=real_width){
  237. if(*a == Shape) {
  238.   min_x = i;
  239.   goto maxy;
  240. }
  241.       }
  242.     }
  243.   maxy:
  244.     for(j=real_height-1,i= (real_height-1)*real_width;j>=0 ;j--, i-=real_width){
  245.       a = InMask+i;
  246.       f = InMask+i+real_width;;
  247.       for(; a <f;  a++) {
  248. if(*a == Shape) {
  249.   max_y = j;
  250.   goto maxx;
  251. }
  252.       }
  253.     }
  254.     
  255.   maxx:
  256.     for(i=real_width-1;i >= 0;i--){
  257.       a=InMask+i;
  258.       f =  InMask+i+real_width*real_height;
  259.       for(; a < f; a+=real_width){
  260. if(*a == Shape) {
  261.   max_x = i;
  262.   goto next;
  263. }
  264.       }
  265.     }
  266.     
  267.   next:
  268.     /* quantize the min_x and min_y with Nx and Ny */
  269.     if(min_x%Nx!=0) min_x=min_x/Nx*Nx;
  270.     if(min_y%Ny!=0) min_y=min_y/Ny*Ny;
  271.     if(min_x>max_x || min_y> max_y) {
  272.       return(DWT_NOVALID_PIXEL); /* no valid pixel */
  273.     }
  274.     origin_x = min_x;
  275.     origin_y = min_y;
  276.     virtual_width = max_x-min_x+1;
  277.     virtual_height = max_y-min_y+1;
  278.    /*  fprIntf(stderr, "x=%d y=%d w=%d h=%d x2=%d y2=%dn", min_x, min_y, virtual_width, virtual_height, max_x, max_y); */
  279.   }
  280.   else { /* rectangular region */
  281.     origin_x = 0; 
  282.     origin_y = 0;
  283.     virtual_width = RealWidth;
  284.     virtual_height = RealHeight;
  285.   }  
  286.   
  287.   /* first ajust the dimension to be multiple of blocksize */
  288.   virtual_width =  (virtual_width+(blocksize)-1)/blocksize*blocksize;
  289.   virtual_height =  (virtual_height+(blocksize)-1)/blocksize*blocksize;
  290.   if ((mask = (UChar *)malloc(sizeof(UChar)*virtual_width*virtual_height)) == NULL) {
  291.     return(DWT_MEMORY_FAILED);
  292.   }
  293.   memset(mask, (Char )0, sizeof(UChar)*virtual_width*virtual_height);
  294.   /* calculate clip area */
  295.   max_y = origin_y+virtual_height;
  296.   max_y = (max_y<real_height)?max_y:real_height;
  297.   rows = max_y - origin_y;
  298.   max_x = origin_x+virtual_width;
  299.   max_x = (max_x<real_width)?max_x:real_width;
  300.   cols = max_x - origin_x;
  301.   /* fill out data */
  302.   for(i=0, j=origin_y*real_width+origin_x; i< rows*virtual_width;
  303.       i+=virtual_width, j+=real_width) {
  304.     if(Shape != RECTANGULAR) {
  305.       f = InMask+j+cols;
  306.       for(a = InMask+j, b=mask+i; a < f; a++, b++) {
  307. if(*a == (UChar) Shape) *b = DWT_IN;
  308.       }
  309.     }
  310.     else
  311.       memset(mask+i, (Char )DWT_IN, cols);
  312.   }
  313.   *VirtualWidth = virtual_width;
  314.   *VirtualHeight = virtual_height;
  315.   *OriginX = origin_x;
  316.   *OriginY = origin_y;
  317.   *OutMask = mask;
  318.   return(DWT_OK);
  319. }
  320. /* Function: ExtendMaskBox()
  321.    Description: extend the size of bounding box of the mask of image object
  322.                 to 2^nLevels;
  323.    Input:
  324.    
  325.    InMask -- Input image mask
  326.    InWidth, InHeight  -- the size of the Input Mask;
  327.    Nx, Ny -- specify  that OriginX and OriginY must be multiple of Nx and Ny
  328.              to accomdate different color compoents configuration:
  329.      Examples:
  330.      for 420:   Nx  Ny 
  331.            Y:   2   2
  332.                    U,V: 1   1
  333.      for 422:   
  334.            Y:   2   1
  335.              for 444:
  336.       Y,U,V:    1   1
  337.      for mono:
  338.                   Y:    1   1
  339.      for YUV9:  
  340.                   Y:    4   4
  341.                   U,V:  1   1     nLevels -- levels of decomposition
  342.    Output:
  343.    
  344.    OutMask -- Output image mask, extended area is marked as Don't-care
  345.    OutWidth, OutHeight -- size of the output mask
  346.        
  347.    Return:  DWT_OK if no error;        
  348.    Note: The caller should free the memory OutMask allocated by this program 
  349.          after it finishes using them.
  350. */
  351. Int VTCIMAGEBOX:: ExtendMaskBox(UChar *InMask,  UChar **OutMask, 
  352.   Int InWidth, Int InHeight, 
  353.   Int Nx, Int Ny,
  354.   Int *OutWidth, Int *OutHeight, 
  355.   Int nLevels)
  356. {
  357.   Int out_width, out_height;
  358.   UChar *mask;
  359.   Int blocksize =  1 << nLevels;
  360.   Int i, j;
  361.   UChar *a, *b, *f;
  362.   if(blocksize%Nx!=0) blocksize = LCM(blocksize,Nx);
  363.   if(blocksize%Ny!=0) blocksize = LCM(blocksize,Ny);
  364.   
  365.   /* first ajust the dimension to be multiple of blocksize */
  366.   out_width =  (InWidth+(blocksize)-1)/blocksize*blocksize;
  367.   out_height =  (InHeight+(blocksize)-1)/blocksize*blocksize;
  368.   if ((mask = (UChar *)malloc(sizeof(UChar)*out_width*out_height)) == NULL) {
  369.     return(DWT_MEMORY_FAILED);
  370.   }
  371.   memset(mask, (Char )0, sizeof(UChar)*out_width*out_height);
  372.   /* fill out data */
  373.   for(i=0, j=0; i< InHeight*out_width;
  374.       i+=out_width, j+=InWidth) {
  375.     f = InMask+j+InWidth;
  376.     for(a = InMask+j, b=mask+i; a < f; a++, b++) {
  377.       if(*a == (UChar) DWT_IN) *b = DWT_IN;
  378.     }
  379.   }
  380.   *OutWidth = out_width;
  381.   *OutHeight = out_height;
  382.   *OutMask = mask;
  383.   return(DWT_OK);
  384. }
  385. /* Function: PutBox()
  386.    Description: put the bounding box of the image object back
  387.    Input:
  388.    
  389.    InImage -- Input image data, data type defined by DataType;
  390.    InMask -- Input image mask
  391.    RealWidth, RealHeight  -- the size of the actual image;
  392.    DataType -- 0 - UChar 1- UShort for InImage and OutImage
  393.    Shape   -- if -1, the SHAPE is rectangular, else arbitary shape and
  394.               Shape defines the mask value of an object, useful for
  395.       multiple objects coding 
  396.    VirtualWidth, VirtualHeight -- size of the output image
  397.    OriginX, OriginY -- origins of the output image relative to the original
  398.                        image
  399.    Output:
  400.    
  401.    OutImage -- Output image contains the bounding box image
  402.    OutMask -- Output image mask
  403.               NULL if Shape == RECTANGULAR;
  404.        
  405.    Return:  DWT_OK if no error;        
  406. */
  407. Int VTCIMAGEBOX:: PutBox(Void *InImage, UChar *InMask, Void *OutImage, UChar *OutMask, 
  408.    Int RealWidth, Int RealHeight, 
  409.    Int VirtualWidth, Int VirtualHeight, 
  410.    Int OriginX, Int OriginY, Int DataType, Int Shape)
  411. {
  412.   Int origin_x, origin_y;
  413.   Int virtual_width, virtual_height;
  414.   UChar *data, *indata;
  415.   UChar *mask = NULL;
  416.   Int wordsize = (DataType==DWT_USHORT_ENUM)?2:1;
  417.   Int i, j;
  418.   Int real_width, real_height; 
  419.   Int max_x, max_y;
  420.   Int rows, cols;
  421.   UChar *a, *b, *c, *f;
  422.   real_width = RealWidth;
  423.   real_height = RealHeight;
  424.   virtual_width = VirtualWidth;
  425.   virtual_height = VirtualHeight;
  426.   origin_x = OriginX;
  427.   origin_y = OriginY;
  428.   /* allocate proper memory and initialize to zero*/
  429.   data = (UChar *)OutImage;
  430.   memset(data, (Char )0, sizeof(UChar)*real_width*real_height*wordsize);
  431.   if(Shape != RECTANGULAR) {
  432.     mask = OutMask;
  433.     memset(mask, (Char)0, sizeof(UChar)*real_width*real_height);
  434.   }
  435.       
  436.   /* calculate clip area */
  437.   max_y = origin_y+virtual_height;
  438.   max_y = (max_y<real_height)?max_y:real_height;
  439.   rows = max_y - origin_y;
  440.   max_x = origin_x+virtual_width;
  441.   max_x = (max_x<real_width)?max_x:real_width;
  442.   cols = max_x - origin_x;
  443.   indata = (UChar *)InImage;
  444.   /* fill out data */
  445.   for(i=0, j=origin_y*real_width+origin_x; i< rows*virtual_width;
  446.       i+=virtual_width, j+=real_width) {
  447.     f = InMask+i+cols;
  448.     for(a = data +j*wordsize, b = indata + i*wordsize, c= InMask+i;  
  449. c< f; c++, a+=wordsize, b+=wordsize) {
  450.       if(*c == DWT_IN) {
  451. memcpy(a, b, wordsize);
  452.       }
  453.     }
  454.     if(Shape != RECTANGULAR) {
  455.       for(a=InMask+i, b = mask+j; a<f; a++, b++) {
  456. if(*a == DWT_IN) *b=(UChar) Shape;
  457.       }
  458.     }
  459.   }
  460.   return(DWT_OK);
  461. }
  462. /* find the least common multiples of two Integers */
  463. Int VTCIMAGEBOX:: LCM(Int x, Int y)
  464. {
  465.   return(x*y/GCD(x,y));
  466. }
  467. /* find the greatest common divisor of two Integers */
  468. Int VTCIMAGEBOX:: GCD(Int x, Int y)
  469. {
  470.   Int i;
  471.   Int k;
  472.   Int d=x<y?x:y; /* the lesser of x and y */
  473.   d = (Int) sqrt((double)d)+1;
  474.   k = 1;
  475.   for(i=d;i>1;i--) {
  476.     if(x%i==0 && y%i==0) {
  477.       k=i;
  478.       break;
  479.     }
  480.   }
  481.   return(k);
  482. }
  483. /* Function: SubsampleMask()
  484.    Description: Subsample the Mask;
  485.    
  486.    Input:
  487.    InMask -- Input mask;
  488.    Nx -- Horizontal subsampling rate;
  489.    Ny -- vertical subsampling rate;
  490.    Shape -- Integer number specify the object in a mask;
  491.    Output:
  492.    OutMask -- Output mask, memory space provided by caller function;
  493.    return: DWT_OK if no error;
  494. */
  495. Void  VTCIMAGEBOX:: SubsampleMask(UChar *InMask, UChar **OutMask, 
  496.     Int Width, Int Height,
  497.     FILTER *filter)
  498. {
  499.   UChar *a, *b;
  500.   Int width, height;
  501.   Int i,j, k;
  502.   
  503.   width = (Width >>1);
  504.   height = (Height >>1);
  505.   a = (UChar *)malloc(Width*Height*sizeof(UChar));
  506.   b = (UChar *)malloc(width*height*sizeof(UChar));
  507.   if(a == NULL || b == NULL) 
  508.     exit(printf("Error allocation memoryn"));
  509.  // ret=do_DWTMask(InMask, a, Width, Height, 1, &filter);
  510. //  if(ret!=DWT_OK) 
  511. //    exit(printf("DWT error code = %dn", ret));
  512.   for(i=0,j=0, k=0; i< height; i++,j+=Width, k+=width){
  513.     memcpy(b+k, a+j, width);
  514.   }
  515.   free(a);
  516.   *OutMask = b;
  517. }