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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: write_image.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. /****************************************************************************/
  55. /*     Texas Instruments Predictive Embedded Zerotree (PEZW) Image Codec    */
  56. /*     Copyright 1996, 1997, 1998 Texas Instruments            */
  57. /****************************************************************************/
  58. #include <stdio.h>
  59. #include <math.h>
  60. #include "dataStruct.hpp"
  61. #include "globals.hpp"
  62. #include "dwt.h"
  63. extern Int STO_const_alpha;
  64. extern UChar STO_const_alpha_value;
  65. Void CVTCDecoder::write_image(Char *recImgFile, Int colors,
  66.  Int width, Int height,
  67.  Int real_width, Int real_height,
  68.  Int rorigin_x, Int rorigin_y,
  69.  UChar *outimage[3], UChar *outmask[3],
  70.  Int usemask, Int fullsize, Int MinLevel)
  71.      /* write outimage */
  72. {
  73.   FILE *outfptr, *maskfptr = NULL;
  74.   Char recSegFile[200];
  75.   UChar *ptr;
  76.   UChar *recmask[3];
  77.   UChar *recimage[3];
  78.   Int status,i,col,ret;
  79.   Int w,h;
  80.   Int rwidth[3],rheight[3];
  81.   Int Width[3], Height[3];
  82.   Int origin_x[3],origin_y[3];
  83.   Int l, lt;
  84.   Int j,k,n, count, sum[3];  // hjlee 0901
  85.   Width[0] = width;
  86.   Width[1] = Width[2] = (Width[0]+1)>>1;
  87.   Height[0] = height;
  88.   Height[1] = Height[2] = (Height[0]+1)>>1;
  89.   origin_x[0] = rorigin_x;
  90.   origin_x[1] = origin_x[2] = origin_x[0]>>1;
  91.   origin_y[0] = rorigin_y;
  92.   origin_y[1] = origin_y[2] = origin_y[0]>>1;
  93.   outfptr = fopen(recImgFile,"wb");
  94.   if(usemask) {
  95.     sprintf(recSegFile, "%s.seg",recImgFile);
  96.     maskfptr = fopen(recSegFile,"wb");
  97.   }
  98.   noteProgress("Writing the reconstruction image: '%s'",recImgFile);
  99.   l = (fullsize ? 0 : MinLevel);
  100.   lt =  (1<<l) -1;
  101. // hjlee 0901
  102.     /* adjust the image for pixel w/ mismatched luma and chroma */
  103.   if(colors >1) {
  104.     for(i=0;i<Height[0]>>l;i++) {
  105.       for(j=0; j<Width[0]>>l; j++) {
  106. if(outmask[0][i*(Width[0]>>l)+j]==DWT_IN && 
  107. outmask[1][(i>>1)*(Width[1]>>l)+(j>>1)]!=DWT_IN) {
  108.   count=0;
  109.   for(col=1;col<colors;col++) 
  110.     sum[col] = 0;
  111.   for(k=0;k<2;k++) {
  112.     for(n=0;n<2;n++) {
  113.       if(outmask[1][((i>>1)+k)*(Width[1]>>l)+((j>>1)+n)]==DWT_IN) {
  114. count++;
  115. for(col=1;col<colors; col++)
  116.   sum[col]+=outimage[col][((i>>1)+k)*(Width[1]>>l)+((j>>1)+n)];
  117.       }
  118.     }
  119.   }
  120.   if(count==0)  errorHandler("Impossible case occured, check programn") ; /* impossible! no chroma available for this pixel ignore it */
  121.   else {
  122.     for(col=1; col< colors; col++) {
  123.       outmask[col][(i>>1)*(Width[col]>>l)+(j>>1)] = DWT_IN;
  124.       outimage[col][(i>>1)*(Width[col]>>l)+(j>>1)] = sum[col]/count;
  125.     }
  126.   }
  127. }
  128.       }
  129.     }
  130.   }
  131.   for (col=0; col<colors; col++) {
  132.     if(col==0) { /* chroma */
  133.       rwidth[0] = (real_width+lt)>>l;
  134.       rheight[0] = (real_height+lt)>>l;
  135.     }
  136.     else {
  137.       rwidth[col] = (rwidth[0] +1) >> 1;
  138.       rheight[col] = (rheight[0] +1) >>1;
  139.     }
  140.     recmask[col]  = (UChar *)malloc(sizeof(UChar)*
  141.     rwidth[col]*rheight[col]);
  142.     recimage[col] = (UChar *)malloc(sizeof(UChar)*
  143.     rwidth[col]*rheight[col]);
  144.     
  145.     
  146.     
  147.     ret=PutBox(outimage[col], outmask[col], recimage[col], recmask[col], 
  148.        rwidth[col], rheight[col], 
  149.        (Width[col]>>l), (Height[col]>>l),
  150.        origin_x[col]>>l, origin_y[col]>>l, 0, 
  151.        (usemask)?(STO_const_alpha?STO_const_alpha_value:MASK_VAL):RECTANGULAR);
  152.     if(ret!= DWT_OK)
  153.       errorHandler("DWT Error code %d", ret);
  154.     ptr = recimage[col];
  155.     w = rwidth[col];
  156.     h = rheight[col];
  157.     for (i=0; i<h; i++) {
  158.       if ((status = fwrite((UChar *)ptr, sizeof(Char), 
  159.    w, outfptr)) != w)
  160. errorHandler("Error in writing image file.");
  161.       
  162.       ptr += w;
  163.     } 
  164.     if(usemask && col==0) {
  165.       ptr = recmask[col];
  166.       for (i=0; i<h; i++) {
  167. if ((status = fwrite((UChar *)ptr, sizeof(Char), 
  168.      w, maskfptr)) != w)
  169.   errorHandler("Error in writing image file.");
  170. ptr += w;
  171.       } 
  172.     }
  173.     free(recmask[col]);
  174.     free(recimage[col]);
  175.   }  /* col */
  176.   fclose(outfptr);
  177.   if(usemask) fclose(maskfptr);
  178. }