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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *****************************************************************************
  3.  *
  4.  * file intrarefresh.c
  5.  *
  6.  * brief
  7.  *    Encoder support for pseudo-random intra macroblock refresh
  8.  *
  9.  * date
  10.  *    16 June 2002
  11.  *
  12.  * author
  13.  *    Stephan Wenger   stewe@cs.tu-berlin.de
  14.  *****************************************************************************/
  15. #include "global.h"
  16. static int *RefreshPattern;
  17. static int *IntraMBs;
  18. static int WalkAround = 0;
  19. static int NumberOfMBs = 0;
  20. static int NumberIntraPerPicture;
  21. /*!
  22.  ************************************************************************
  23.  * brief
  24.  *    RandomIntraInit: Initializes Random Intra module.  Should be called
  25.  *    only after initialization (or changes) of the picture size or the
  26.  *    random intra refresh value.  In version jm2.1 it is impossible to
  27.  *    change those values on-the-fly, hence RandomIntraInit should be
  28.  *    called immediately after the parsing of the config file
  29.  *
  30.  * par Input:
  31.  *    xsize, ysize: size of the picture (in MBs)
  32.  *    refresh     : refresh rate in MBs per picture
  33.  ************************************************************************
  34.  */
  35. void RandomIntraInit(int xsize, int ysize, int refresh)
  36. {
  37.   int i, pos;
  38.   srand (1);      // A fixed random initializer to make things reproducible
  39.   NumberOfMBs = xsize * ysize;
  40.   NumberIntraPerPicture = refresh;
  41.   if (refresh != 0)
  42.   {
  43.     RefreshPattern = malloc (sizeof (int) * NumberOfMBs);
  44.     if (RefreshPattern == NULL) no_mem_exit("RandomIntraInit: RefreshPattern");
  45.     IntraMBs = malloc (sizeof (int) * refresh);
  46.     if (IntraMBs == NULL) no_mem_exit("RandomIntraInit: IntraMBs");
  47.     for (i= 0; i<NumberOfMBs; i++)
  48.       RefreshPattern[i] = -1;
  49.     for (i=0; i<NumberOfMBs; i++)
  50.     {
  51.       do
  52.       {
  53.         pos = rand() % NumberOfMBs;
  54.       } while (RefreshPattern [pos] != -1);
  55.       RefreshPattern [pos] = i;
  56.     }
  57.     /*
  58.     for (i=0; i<NumberOfMBs; i++) printf ("%dt", RefreshPattern[i]);
  59.     getchar();
  60.     */
  61.   }
  62.   else
  63.   {
  64.     RefreshPattern = NULL;
  65.     IntraMBs = NULL;
  66.   }
  67. }
  68. /*!
  69.  ************************************************************************
  70.  * brief
  71.  *    RandomIntra: Code an MB as Intra?
  72.  *
  73.  * par Input
  74.  *    MacroblockNumberInScanOrder
  75.  * par Output
  76.  *    1 if an MB should be forced to Intra, according the the
  77.  *      RefreshPattern
  78.  *    0 otherwise
  79.  *
  80.  ************************************************************************
  81.  */
  82. int RandomIntra (int mb)
  83. {
  84.   int i;
  85.   for (i=0; i<NumberIntraPerPicture; i++)
  86.     if (IntraMBs[i] == mb)
  87.       return 1;
  88.   return 0;
  89. }
  90. /*!
  91.  ************************************************************************
  92.  * brief
  93.  *    RandomIntraNewPicture: Selects new set of MBs for forced Intra
  94.  *
  95.  * par
  96.  *    This function should be called exactly once per picture, and
  97.  *    requires a finished initialization
  98.  *
  99.  ************************************************************************
  100.  */
  101. void RandomIntraNewPicture ()
  102. {
  103.   int i, j;
  104.   WalkAround += NumberIntraPerPicture;
  105.   for (j=0,i=WalkAround; j<NumberIntraPerPicture; j++, i++)
  106.     IntraMBs[j] = RefreshPattern [i%NumberOfMBs];
  107. }
  108. void RandomIntraUninit()
  109. {
  110.   if (NumberIntraPerPicture >0 )
  111.   {
  112.     free(RefreshPattern);
  113.     free(IntraMBs);
  114.   }
  115. }