upconvert.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: upconvert.cpp,v 1.2 2005/01/30 05:11:40 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Richard Felton (Original Author), Thomas Davies
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #include <libdirac_common/upconvert.h>
  38. using namespace dirac;
  39. #include <iostream>
  40. //Up-convert by a factor of two.
  41. void UpConverter::DoUpConverter(const PicArray& pic_data, PicArray& up_data)
  42. {
  43.     xOld = pic_data.LengthX();
  44.     yOld = pic_data.LengthY();
  45.     xNew = up_data.LengthX();
  46.     yNew = up_data.LengthY();    //assumes up_data has twice the x and y length of the pic_data. 
  47.                                 //TBC: What to do if this is wrong?
  48.     //Variables that will be used by the filter calculations
  49.     int sum;
  50.     int ypos(0);
  51.     //There are three y loops to cope with the leading edge, middle 
  52.     //and trailing edge of each column.
  53.     for(int y = 0 ; y < Stage_I_Size; ++y , ypos += 2)
  54.     {
  55.         //We are filtering each column but doing it bit by bit.
  56.         //This means our main loop is in the x direction and
  57.         //there is a much greater chance the data we need will
  58.         //be in the cache.
  59.         for(int x = 0 , xpos = 0; x < xOld; x++ , xpos+=2 )
  60.         {
  61.             // Copy a Pixel from the original image in each even position
  62.             up_data[ypos][xpos] = pic_data[y][x];
  63.             //Work out the next pixel from filtered values.
  64.             //Excuse the complicated ternary stuff but it sorts out the edge
  65.             sum =  (pic_data[y][x] + pic_data[y+1][x])*StageI_I;
  66.             sum += (pic_data[(y>=1)?(y-1):0][x] + pic_data[y+2][x])*StageI_II;
  67.             sum += (pic_data[(y>=2)?(y-2):0][x] + pic_data[y+3][x])*StageI_III;
  68.             sum += (pic_data[(y>=3)?(y-3):0][x] + pic_data[y+4][x])*StageI_IV;
  69.             sum += (pic_data[(y>=4)?(y-4):0][x] + pic_data[y+5][x])*StageI_V;
  70.             sum += (pic_data[(y>=5)?(y-5):0][x] + pic_data[y+6][x])*StageI_VI;
  71.             up_data[ypos+1][xpos] = sum >> Stage_I_Shift;
  72.         }// x, xpos
  73.         // The row loop.
  74.         RowLoop(up_data, ypos);
  75.     }// y, ypos
  76.     // This loop is like the last one but it deals with the centre
  77.     // section of the image and so the ternary operations are dropped
  78.     // from the filter section.
  79.     for(int y = Stage_I_Size; y < yOld - Stage_I_Size; ++y , ypos += 2)
  80.     {
  81.         for(int x = 0 , xpos=0; x < xOld; x++ , xpos+=2 )
  82.         {
  83.             up_data[ypos][xpos] = pic_data[y][x];
  84.             sum =  (pic_data[y][x]   + pic_data[y+1][x])*StageI_I;
  85.             sum += (pic_data[y-1][x] + pic_data[y+2][x])*StageI_II;
  86.             sum += (pic_data[y-2][x] + pic_data[y+3][x])*StageI_III;
  87.             sum += (pic_data[y-3][x] + pic_data[y+4][x])*StageI_IV;
  88.             sum += (pic_data[y-4][x] + pic_data[y+5][x])*StageI_V;
  89.             sum += (pic_data[y-5][x] + pic_data[y+6][x])*StageI_VI;            
  90.             up_data[ypos+1][xpos] = sum >> Stage_I_Shift;
  91.         }// x,xpos
  92.         RowLoop(up_data, ypos);
  93.     }// y, ypos 
  94.     // Another similar loop! - this time we are dealing with
  95.     // the trailing edge so the ternary stuff is back in the
  96.     // filter calcs but in the second parameter.    
  97.     for(int y = yOld - Stage_I_Size; y < yOld; ++y , ypos+=2)
  98.     {
  99.         for(int x = 0 , xpos=0 ; x < xOld; x++ , xpos+=2)
  100.         {
  101.             up_data[ypos][xpos]=pic_data[y][x];
  102.             sum =  (pic_data[y][x]     + pic_data[((y+1)<yOld)?(y+1):(yOld-1)][x])*StageI_I;
  103.             sum += (pic_data[y - 1][x] + pic_data[((y+2)<yOld)?(y+2):(yOld-1)][x])*StageI_II;
  104.             sum += (pic_data[y - 2][x] + pic_data[((y+3)<yOld)?(y+3):(yOld-1)][x])*StageI_III;
  105.             sum += (pic_data[y - 3][x] + pic_data[((y+4)<yOld)?(y+4):(yOld-1)][x])*StageI_IV;
  106.             sum += (pic_data[y - 4][x] + pic_data[((y+5)<yOld)?(y+5):(yOld-1)][x])*StageI_V;
  107.             sum += (pic_data[y - 5][x] + pic_data[((y+6)<yOld)?(y+6):(yOld-1)][x])*StageI_VI;
  108.             up_data[ypos+1][xpos] = sum >> Stage_I_Shift;
  109.         }//x,xpos
  110.         RowLoop(up_data, ypos);
  111.     }//y,ypos
  112. }
  113. void UpConverter::RowLoop(PicArray&up_data, const int row_num)
  114. {
  115.     //Calculation variable
  116.     int sum;
  117.     int ypos; 
  118.     //Leading row Edge
  119.     //Note the factor of two difference as we only want to fill in every other
  120.     //line as the others have already been created
  121.     for(int i = 0; i < 2; ++i)
  122.     {
  123.         ypos = row_num + i;
  124.         for(int x = 0; x < (2*Stage_I_Size); x+=2)
  125.         {
  126.             sum =  (up_data[ypos][x]     + up_data[ypos][x+2])*StageI_I;
  127.             sum += (up_data[ypos][(x>=2)?(x-2):0] + up_data[ypos][x+4])*StageI_II;
  128.             sum += (up_data[ypos][(x>=4)?(x-4):0] + up_data[ypos][x+6])*StageI_III;
  129.             sum += (up_data[ypos][(x>=6)?(x-6):0] + up_data[ypos][x+8])*StageI_IV;
  130.             sum += (up_data[ypos][(x>=8)?(x-8):0] + up_data[ypos][x+10])*StageI_V;
  131.             sum += (up_data[ypos][(x>=10)?(x-10):0] + up_data[ypos][x+12])*StageI_VI;
  132.             up_data[ypos][x+1] = sum >> Stage_I_Shift;
  133.         }// x
  134.         //Middle of row
  135.         for(int x = (2*Stage_I_Size); x < xNew - (2*Stage_I_Size); x+=2)
  136.         {
  137.             sum =  (up_data[ypos][x]   + up_data[ypos][x+2])*StageI_I;
  138.             sum += (up_data[ypos][x-2] + up_data[ypos][x+4])*StageI_II;
  139.             sum += (up_data[ypos][x-4] + up_data[ypos][x+6])*StageI_III;
  140.             sum += (up_data[ypos][x-6] + up_data[ypos][x+8])*StageI_IV;
  141.             sum += (up_data[ypos][x-8] + up_data[ypos][x+10])*StageI_V;
  142.             sum += (up_data[ypos][x-10] + up_data[ypos][x+12])*StageI_VI;
  143.             up_data[ypos][x+1] = sum >> Stage_I_Shift;
  144.         }// x
  145.         //Trailing row edge
  146.         for(int x = xNew - (2*Stage_I_Size); x < xNew; x+=2)
  147.         {
  148.             sum =  (up_data[ypos][x]   + up_data[ypos][(((x+2)<xNew)?(x+2):(xNew-2))])*StageI_I;
  149.             sum += (up_data[ypos][x-2] + up_data[ypos][(((x+4)<xNew)?(x+4):(xNew-2))])*StageI_II;
  150.             sum += (up_data[ypos][x-4] + up_data[ypos][(((x+6)<xNew)?(x+6):(xNew-2))])*StageI_III;
  151.             sum += (up_data[ypos][x-6] + up_data[ypos][(((x+8)<xNew)?(x+8):(xNew-2))])*StageI_IV;
  152.             sum += (up_data[ypos][x-8] + up_data[ypos][(((x+10)<xNew)?(x+10):(xNew-2))])*StageI_V;
  153.             sum += (up_data[ypos][x-10] + up_data[ypos][(((x+12)<xNew)?(x+12):(xNew-2))])*StageI_VI;
  154.             up_data[ypos][x+1] = sum >> Stage_I_Shift;
  155.         }// x
  156.     }
  157. }