input.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:19k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file input.c
  4.  *
  5.  * brief
  6.  *    Input related functions
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *     - Karsten S黨ring                 <suehring@hhi.de>
  11.  *     - Alexis Michael Tourapis         <alexismt@ieee.org>
  12.  *     
  13.  *************************************************************************************
  14.  */
  15. #include "contributors.h"
  16. #include <math.h>
  17. #include <time.h>
  18. #include <sys/timeb.h>
  19. #include "global.h"
  20. #include "input.h"
  21. #include "report.h"
  22. unsigned char *buf;
  23.  
  24. void buf2img_basic    ( imgpel** imgX, unsigned char* buf, int size_x, int size_y, int o_size_x, int o_size_y, int symbol_size_in_bytes, int bitshift);
  25. void buf2img_endian   ( imgpel** imgX, unsigned char* buf, int size_x, int size_y, int o_size_x, int o_size_y, int symbol_size_in_bytes, int bitshift);
  26. void buf2img_bitshift ( imgpel** imgX, unsigned char* buf, int size_x, int size_y, int o_size_x, int o_size_y, int symbol_size_in_bytes, int bitshift);
  27. void (*buf2img)       ( imgpel** imgX, unsigned char* buf, int size_x, int size_y, int o_size_x, int o_size_y, int symbol_size_in_bytes, int bitshift);
  28. /*!
  29.  ************************************************************************
  30.  * brief
  31.  *      checks if the System is big- or little-endian
  32.  * return
  33.  *      0, little-endian (e.g. Intel architectures)
  34.  *      1, big-endian (e.g. SPARC, MIPS, PowerPC)
  35.  ************************************************************************
  36.  */
  37. void initInput(FrameFormat *source, FrameFormat *output)
  38. {
  39.   if (source->bit_depth[0] == output->bit_depth[0] && source->bit_depth[1] == output->bit_depth[1])
  40.   {
  41.     if (( sizeof(char) != sizeof (imgpel)) && testEndian())
  42.       buf2img = buf2img_endian;
  43.     else
  44.       buf2img = buf2img_basic;
  45.   }
  46.   else
  47.     buf2img = buf2img_bitshift;
  48. }
  49. /*!
  50.  ************************************************************************
  51.  * brief
  52.  *      checks if the System is big- or little-endian
  53.  * return
  54.  *      0, little-endian (e.g. Intel architectures)
  55.  *      1, big-endian (e.g. SPARC, MIPS, PowerPC)
  56.  ************************************************************************
  57.  */
  58. int testEndian(void)
  59. {
  60.   short s;
  61.   byte *p;
  62.   p=(byte*)&s;
  63.   s=1;
  64.   return (*p==0);
  65. }
  66. #if (DEBUG_BITDEPTH)
  67. /*!
  68.  ************************************************************************
  69.  * brief
  70.  *    Masking to ensure data within appropriate range
  71.  ************************************************************************
  72.  */
  73. static void MaskMSBs (imgpel** imgX, int mask, int width, int height)
  74. {
  75.   int i,j;
  76.   for (j=0; j < height; j++)
  77.   {
  78.     for (i=0; i < width; i++)
  79.     {
  80.       imgX[j][i]=(imgpel) (imgX[j][i] & mask);
  81.     }
  82.   }
  83. }
  84. #endif
  85. /*!
  86.  ************************************************************************
  87.  * brief
  88.  *    Convert file read buffer to source picture structure
  89.  ************************************************************************
  90.  */
  91. void buf2img_bitshift ( imgpel** imgX,           //!< Pointer to image plane
  92.                        unsigned char* buf,       //!< Buffer for file output
  93.                        int size_x,               //!< horizontal size of picture
  94.                        int size_y,               //!< vertical size of picture
  95.                        int o_size_x,             //!< horizontal size of picture
  96.                        int o_size_y,             //!< vertical size of picture
  97.                        int symbol_size_in_bytes, //!< number of bytes in file used for one pixel
  98.                        int bitshift              //!< variable for bitdepth expansion
  99.                        )
  100. {
  101.   int i,j;
  102.   unsigned short tmp16, ui16;
  103.   unsigned long  tmp32, ui32;
  104.   // This test should be done once.
  105.   if (((symbol_size_in_bytes << 3) - bitshift) > (sizeof(imgpel)<< 3))
  106.   {
  107.     error ("Source picture has higher bit depth than imgpel data type. nPlease recompile with larger data type for imgpel.", 500);
  108.   }
  109.   if (testEndian())
  110.   {
  111.     if (size_x != o_size_x || size_y != o_size_y)
  112.     {
  113.       error ("Rescaling not supported in big endian architectures. ", 500);
  114.     }
  115.     // big endian
  116.     switch (symbol_size_in_bytes)
  117.     {
  118.     case 1:
  119.       {
  120.         for(j = 0; j < o_size_y; j++)
  121.           for(i = 0; i < o_size_x; i++)
  122.           {
  123.             imgX[j][i]= (imgpel) rshift_rnd(buf[i + j*size_x], bitshift);
  124.           }
  125.           break;
  126.       }
  127.     case 2:
  128.       {
  129.         for(j = 0; j < o_size_y; j++)
  130.           for(i = 0; i < o_size_x; i++)
  131.           {
  132.             memcpy(&tmp16, buf+((i+j*size_x)*2), 2);
  133.             ui16  = (tmp16 >> 8) | ((tmp16&0xFF)<<8);
  134.             imgX[j][i] = (imgpel) rshift_rnd(ui16, bitshift);
  135.           }
  136.           break;
  137.       }
  138.     case 4:
  139.       {
  140.         for(j = 0; j < o_size_y; j++)
  141.           for(i = 0; i < o_size_x; i++)
  142.           {
  143.             memcpy(&tmp32, buf+((i+j*size_x)*4), 4);
  144.             ui32  = ((tmp32&0xFF00)<<8) | ((tmp32&0xFF)<<24) | ((tmp32&0xFF0000)>>8) | ((tmp32&0xFF000000)>>24);
  145.             imgX[j][i] = (imgpel) rshift_rnd(ui32, bitshift);
  146.           }
  147.       }
  148.     default:
  149.       {
  150.         error ("reading only from formats of 8, 16 or 32 bit allowed on big endian architecture", 500);
  151.         break;
  152.       }
  153.     }
  154.   }
  155.   else
  156.   {
  157.     // little endian
  158.       int j_pos;
  159.       if (size_x == o_size_x && size_y == o_size_y)
  160.       {
  161.         for (j = 0; j < o_size_y; j++)
  162.         {
  163.           j_pos = j*size_x;
  164.           for (i = 0; i < o_size_x; i++)
  165.           {
  166.             ui16=0;
  167.             memcpy(&(ui16), buf + ((i + j_pos) * symbol_size_in_bytes), symbol_size_in_bytes);
  168.             imgX[j][i] = (imgpel) rshift_rnd(ui16,bitshift);
  169.           }
  170.         }  
  171.       }
  172.       else
  173.       {
  174.         int iminwidth   = imin(size_x, o_size_x);
  175.         int iminheight  = imin(size_y, o_size_y);
  176.         int dst_offset_x  = 0, dst_offset_y = 0;        
  177.         int offset_x = 0, offset_y = 0; // currently not used
  178.         // determine whether we need to center the copied frame or crop it
  179.         if ( o_size_x >= size_x ) 
  180.           dst_offset_x = ( o_size_x  - size_x  ) >> 1;
  181.         if (o_size_y >= size_y) 
  182.           dst_offset_y = ( o_size_y - size_y ) >> 1;
  183.         // check copied area to avoid copying memory garbage
  184.         // source
  185.         iminwidth  =  ( (offset_x + iminwidth ) > size_x ) ? (size_x  - offset_x) : iminwidth;
  186.         iminheight =  ( (offset_y + iminheight) > size_y ) ? (size_y - offset_y) : iminheight;
  187.         // destination
  188.         iminwidth  =  ( (dst_offset_x + iminwidth ) > o_size_x  ) ? (o_size_x  - dst_offset_x) : iminwidth;
  189.         iminheight =  ( (dst_offset_y + iminheight) > o_size_y )  ? (o_size_y - dst_offset_y) : iminheight;
  190.         for (j=0; j < iminheight; j++)
  191.         {        
  192.           j_pos = (j + offset_y) * size_x + offset_x;
  193.           for (i=0; i < iminwidth; i++)
  194.           {
  195.             ui16=0;
  196.             memcpy(&(ui16), buf + ((i + j_pos) * symbol_size_in_bytes), symbol_size_in_bytes);
  197.             imgX[j + dst_offset_y][i + dst_offset_x] = (imgpel) rshift_rnd(ui16,bitshift);
  198.           }
  199.         }    
  200.       }
  201.   }
  202. }
  203. /*!
  204.  ************************************************************************
  205.  * brief
  206.  *    Convert file read buffer to source picture structure
  207.  ************************************************************************
  208.  */
  209. void buf2img_basic ( imgpel** imgX,           //!< Pointer to image plane
  210.                     unsigned char* buf,       //!< Buffer for file output
  211.                     int size_x,               //!< horizontal size of picture
  212.                     int size_y,               //!< vertical size of picture
  213.                     int o_size_x,             //!< horizontal size of picture
  214.                     int o_size_y,             //!< vertical size of picture
  215.                     int symbol_size_in_bytes, //!< number of bytes in file used for one pixel
  216.                     int dummy                 //!< dummy variable used for allowing function pointer use
  217.                     )
  218. {
  219.   int i,j;
  220.   unsigned char* temp_buf = buf;
  221.   if (symbol_size_in_bytes> sizeof(imgpel))
  222.   {
  223.     error ("Source picture has higher bit depth than imgpel data type. nPlease recompile with larger data type for imgpel.", 500);
  224.   }
  225.   if (( sizeof (imgpel) == symbol_size_in_bytes))
  226.   {    
  227.     // imgpel == pixel_in_file -> simple copy
  228.     if (size_x == o_size_x && size_y == o_size_y)
  229.       memcpy(&imgX[0][0], temp_buf, size_x * size_y * sizeof(imgpel));
  230.     else
  231.     {
  232.       int iminwidth   = imin(size_x, o_size_x);
  233.       int iminheight  = imin(size_y, o_size_y);
  234.       int dst_offset_x  = 0, dst_offset_y = 0;
  235.       int offset_x = 0, offset_y = 0; // currently not used
  236.       
  237.       // determine whether we need to center the copied frame or crop it
  238.       if ( o_size_x >= size_x ) 
  239.         dst_offset_x = ( o_size_x  - size_x  ) >> 1;
  240.       if (o_size_y >= size_y) 
  241.         dst_offset_y = ( o_size_y - size_y ) >> 1;
  242.       // check copied area to avoid copying memory garbage
  243.       // source
  244.       iminwidth  =  ( (offset_x + iminwidth ) > size_x ) ? (size_x  - offset_x) : iminwidth;
  245.       iminheight =  ( (offset_y + iminheight) > size_y ) ? (size_y - offset_y) : iminheight;
  246.       // destination
  247.       iminwidth  =  ( (dst_offset_x + iminwidth ) > o_size_x  ) ? (o_size_x  - dst_offset_x) : iminwidth;
  248.       iminheight =  ( (dst_offset_y + iminheight) > o_size_y )  ? (o_size_y - dst_offset_y) : iminheight;
  249.       for (i=0; i<iminheight;i++) {
  250.         memcpy(&imgX[i + dst_offset_y][dst_offset_x], &(temp_buf[(i + offset_y) * size_x + offset_x]), iminwidth * sizeof(imgpel));
  251.       }
  252.     }
  253.   }
  254.   else
  255.   {
  256.     int j_pos;
  257.     unsigned short ui16;
  258.     if (size_x == o_size_x && size_y == o_size_y)
  259.     {
  260.       for (j=0; j < o_size_y; j++)
  261.       {
  262.         j_pos = j * size_x;
  263.         for (i=0; i < o_size_x; i++)
  264.         {
  265.           ui16=0;          
  266.           memcpy(&(ui16), buf + ((i + j_pos) * symbol_size_in_bytes), symbol_size_in_bytes);
  267.           imgX[j][i]= (imgpel) ui16;
  268.         }
  269.       }    
  270.     }
  271.     else
  272.     {
  273.       int iminwidth   = imin(size_x, o_size_x);
  274.       int iminheight  = imin(size_y, o_size_y);
  275.       int dst_offset_x  = 0, dst_offset_y = 0;
  276.       int offset_x = 0, offset_y = 0; // currently not used
  277.       
  278.       // determine whether we need to center the copied frame or crop it
  279.       if ( o_size_x >= size_x ) 
  280.         dst_offset_x = ( o_size_x  - size_x  ) >> 1;
  281.       if (o_size_y >= size_y) 
  282.         dst_offset_y = ( o_size_y - size_y ) >> 1;
  283.       // check copied area to avoid copying memory garbage
  284.       // source
  285.       iminwidth  =  ( (offset_x + iminwidth ) > size_x ) ? (size_x  - offset_x) : iminwidth;
  286.       iminheight =  ( (offset_y + iminheight) > size_y ) ? (size_y - offset_y) : iminheight;
  287.       // destination
  288.       iminwidth  =  ( (dst_offset_x + iminwidth ) > o_size_x  ) ? (o_size_x  - dst_offset_x) : iminwidth;
  289.       iminheight =  ( (dst_offset_y + iminheight) > o_size_y )  ? (o_size_y - dst_offset_y) : iminheight;
  290.       for (j = 0; j < iminheight; j++) {
  291.         memcpy(&imgX[j + dst_offset_y][dst_offset_x], &(temp_buf[(j + offset_y) * size_x + offset_x]), iminwidth * sizeof(imgpel));
  292.       }
  293.       for (j=0; j < iminheight; j++)
  294.       {        
  295.         j_pos = (j + offset_y) * size_x + offset_x;
  296.         for (i=0; i < iminwidth; i++)
  297.         {
  298.           ui16 = 0;
  299.           memcpy(&(ui16), buf + ((i + j_pos) * symbol_size_in_bytes), symbol_size_in_bytes);
  300.           imgX[j + dst_offset_y][i + dst_offset_x]= (imgpel) ui16;
  301.         }
  302.       }    
  303.     }
  304.   }
  305. }
  306. /*!
  307.  ************************************************************************
  308.  * brief
  309.  *    Convert file read buffer to source picture structure
  310.  ************************************************************************
  311.  */
  312. void buf2img_endian ( imgpel** imgX,          //!< Pointer to image plane
  313.                     unsigned char* buf,       //!< Buffer for file output
  314.                     int size_x,               //!< horizontal size of picture
  315.                     int size_y,               //!< vertical size of picture
  316.                     int o_size_x,             //!< horizontal size of picture
  317.                     int o_size_y,             //!< vertical size of picture
  318.                     int symbol_size_in_bytes, //!< number of bytes in file used for one pixel
  319.                     int dummy                 //!< dummy variable used for allowing function pointer use
  320.                     )
  321. {
  322.   int i,j;
  323.   unsigned short tmp16, ui16;
  324.   unsigned long  tmp32, ui32;
  325.   if (symbol_size_in_bytes > sizeof(imgpel))
  326.   {
  327.     error ("Source picture has higher bit depth than imgpel data type. nPlease recompile with larger data type for imgpel.", 500);
  328.   }
  329.   if (size_x != o_size_x || size_y != o_size_y)
  330.   {
  331.     error ("Rescaling not supported in big endian architectures. ", 500);
  332.   }
  333.   // big endian
  334.   switch (symbol_size_in_bytes)
  335.   {
  336.   case 1:
  337.     {
  338.       for(j=0;j<size_y;j++)
  339.       {
  340.         for(i=0;i<size_x;i++)
  341.         {
  342.           imgX[j][i]= (imgpel) buf[i + j*size_x];
  343.         }
  344.       }
  345.       break;
  346.     }
  347.   case 2:
  348.     {
  349.       for(j=0;j<size_y;j++)
  350.       {
  351.         for(i=0;i<size_x;i++)
  352.         {
  353.           memcpy(&tmp16, buf+((i+j*size_x)*2), 2);
  354.           ui16  = (tmp16 >> 8) | ((tmp16&0xFF)<<8);
  355.           imgX[j][i] = (imgpel) ui16;
  356.         }
  357.       }
  358.       break;
  359.     }
  360.   case 4:
  361.     {
  362.       for(j=0;j<size_y;j++)
  363.       {
  364.         for(i=0;i<size_x;i++)
  365.         {
  366.           memcpy(&tmp32, buf+((i+j*size_x)*4), 4);
  367.           ui32  = ((tmp32&0xFF00)<<8) | ((tmp32&0xFF)<<24) | ((tmp32&0xFF0000)>>8) | ((tmp32&0xFF000000)>>24);
  368.           imgX[j][i] = (imgpel) ui32;
  369.         }
  370.       }
  371.       break;
  372.     }
  373.   default:
  374.     {
  375.       error ("reading only from formats of 8, 16 or 32 bit allowed on big endian architecture", 500);
  376.       break;
  377.     }
  378.   }   
  379. }
  380. /*!
  381.  ************************************************************************
  382.  * brief
  383.  *    Create Frame Memory buffer
  384.  *
  385.  ************************************************************************
  386.  */
  387. int AllocateFrameMemory (ImageParameters *img, int size)
  388. {
  389.   if (NULL == (buf = malloc (size * (img->pic_unit_size_on_disk >> 3))))
  390.     return (1);
  391.   else
  392.     return (0);
  393. }
  394. /*!
  395.  ************************************************************************
  396.  * brief
  397.  *    Delete Frame Memory buffer
  398.  *
  399.  ************************************************************************
  400.  */
  401. void DeleteFrameMemory (void)
  402. {
  403.   if (buf)
  404.     free (buf);
  405. }
  406. /*!
  407.  ************************************************************************
  408.  * brief
  409.  *    Reads one new frame from file
  410.  *
  411.  * param FrameNoInFile
  412.  *    Frame number in the source file
  413.  * param HeaderSize
  414.  *    Number of bytes in the source file to be skipped
  415.  * param source
  416.  *    source file (on disk) information 
  417.  * param output
  418.  *    output file (for encoding) information
  419.  ************************************************************************
  420.  */
  421. void ReadOneFrame (int FrameNoInFile, int HeaderSize, FrameFormat *source, FrameFormat *output)
  422. {
  423.   unsigned int symbol_size_in_bytes = img->pic_unit_size_on_disk/8;
  424.   const int imgsize_y = source->width * source->height;
  425.   const int imgsize_uv = source->width_cr * source->height_cr;
  426.   const int bytes_y = imgsize_y * symbol_size_in_bytes;
  427.   const int bytes_uv = imgsize_uv * symbol_size_in_bytes;
  428.   int bit_scale;
  429.   const int64 framesize_in_bytes = bytes_y + 2*bytes_uv;
  430.   Boolean rgb_input = (Boolean) (params->rgb_input_flag==1 && params->yuv_format==3);
  431.   assert (p_in != -1);
  432.   // skip Header
  433.   if (lseek (p_in, HeaderSize, SEEK_SET) != HeaderSize)
  434.   {
  435.     error ("ReadOneFrame: cannot fseek to (Header size) in p_in", -1);
  436.   }
  437.   // skip starting frames
  438.   if (lseek (p_in, framesize_in_bytes * params->start_frame, SEEK_CUR) == -1)
  439.   {
  440.     snprintf(errortext, ET_SIZE, "ReadOneFrame: cannot advance file pointer in p_in beyond frame %dn", params->start_frame);
  441.     error (errortext,-1);
  442.   }
  443.   // seek to current frame
  444.   if (lseek (p_in, framesize_in_bytes * (FrameNoInFile), SEEK_CUR) == -1)
  445.   {
  446.     snprintf(errortext, ET_SIZE, "ReadOneFrame: cannot advance file pointer in p_in beyond frame %dn", params->start_frame + FrameNoInFile);
  447.     error (errortext,-1);
  448.   }
  449.   // Here we are at the correct position for the source frame in the file.  
  450.   // Now read it.
  451.   if (img->pic_unit_size_on_disk%8 == 0)
  452.   {
  453. //    if(rgb_input)
  454. //      lseek (p_in, framesize_in_bytes / 3, SEEK_CUR);
  455.     if (read(p_in, buf, (int) framesize_in_bytes) != (int) framesize_in_bytes)
  456.     {
  457.       printf ("ReadOneFrame: cannot read %d bytes from input file, unexpected EOF, exiting...n", (int) framesize_in_bytes);
  458.       report_stats_on_error();
  459.     }
  460.     bit_scale = source->bit_depth[0] - output->bit_depth[0];
  461.     if(rgb_input)
  462.       buf2img(pImgOrg[0], buf + bytes_y, source->width, source->height, output->width, output->height, symbol_size_in_bytes, bit_scale);
  463.     else
  464.       buf2img(pImgOrg[0], buf, source->width, source->height, output->width, output->height, symbol_size_in_bytes, bit_scale);
  465. #if (DEBUG_BITDEPTH)
  466.     MaskMSBs(pImgOrg[0], ((1 << output->bit_depth[0]) - 1), output->width, output->height);
  467. #endif
  468.     if (img->yuv_format != YUV400)
  469.     {
  470.       bit_scale = source->bit_depth[1] - output->bit_depth[1];
  471.       if(rgb_input)
  472.       buf2img(pImgOrg[1], buf + bytes_y + bytes_uv, source->width_cr, source->height_cr, output->width_cr, output->height_cr, symbol_size_in_bytes, bit_scale);
  473.       else
  474.       buf2img(pImgOrg[1], buf + bytes_y, source->width_cr, source->height_cr, output->width_cr, output->height_cr, symbol_size_in_bytes, bit_scale);
  475.       bit_scale = source->bit_depth[2] - output->bit_depth[2];
  476.       if(rgb_input)
  477.       buf2img(pImgOrg[2], buf, source->width_cr, source->height_cr, output->width_cr, output->height_cr, symbol_size_in_bytes, bit_scale);
  478.       else
  479.       buf2img(pImgOrg[2], buf + bytes_y + bytes_uv, source->width_cr, source->height_cr, output->width_cr, output->height_cr, symbol_size_in_bytes, bit_scale);
  480. #if (DEBUG_BITDEPTH)
  481.       MaskMSBs(pImgOrg[1], ((1 << output->bit_depth[1]) - 1), output->width_cr, output->height_cr);
  482.       MaskMSBs(pImgOrg[2], ((1 << output->bit_depth[2]) - 1), output->width_cr, output->height_cr);
  483. #endif
  484.     }
  485.   }
  486.   else
  487.   {
  488.     printf ("ReadOneFrame (NOT IMPLEMENTED): pic unit size on disk must be divided by 8");
  489.     exit (-1);
  490.   }
  491. }