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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***********************************************************************
  3.  * file errorconcealment.c
  4.  *
  5.  * brief
  6.  *    Implements error concealment scheme for H.264 decoder
  7.  *
  8.  * date
  9.  *    6.10.2000
  10.  *
  11.  * version
  12.  *    1.0
  13.  *
  14.  * note
  15.  *    This simple error concealment implemented in this decoder uses
  16.  *    the existing dependencies of syntax elements.
  17.  *    In case that an element is detected as false this elements and all
  18.  *    dependend elements are marked as elements to conceal in the ec_flag[]
  19.  *    array. If the decoder requests a new element by the function
  20.  *    readSyntaxElement_xxxx() this array is checked first if an error concealment has
  21.  *    to be applied on this element.
  22.  *    In case that an error occured a concealed element is given to the
  23.  *    decoding function in macroblock().
  24.  *
  25.  * author
  26.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  27.  *    - Sebastian Purreiter   <sebastian.purreiter@mch.siemens.de>
  28.  ***********************************************************************
  29.  */
  30. #include "contributors.h"
  31. #include "global.h"
  32. #include "elements.h"
  33. static int ec_flag[SE_MAX_ELEMENTS];        //!< array to set errorconcealment
  34. /*
  35. static char SEtypes[][25] =
  36. {
  37.     "SE_HEADER",
  38.     "SE_PTYPE",
  39.     "SE_MBTYPE",
  40.     "SE_REFFRAME",
  41.     "SE_INTRAPREDMODE",
  42.     "SE_MVD",
  43.     "SE_CBP_INTRA",
  44.     "SE_LUM_DC_INTRA",
  45.     "SE_CHR_DC_INTRA",
  46.     "SE_LUM_AC_INTRA",
  47.     "SE_CHR_AC_INTRA",
  48.     "SE_CBP_INTER",
  49.     "SE_LUM_DC_INTER",
  50.     "SE_CHR_DC_INTER",
  51.     "SE_LUM_AC_INTER",
  52.     "SE_CHR_AC_INTER",
  53.     "SE_DELTA_QUANT_INTER",
  54.     "SE_DELTA_QUANT_INTRA",
  55.     "SE_BFRAME",
  56.     "SE_EOS"
  57. };
  58. */
  59. /*!
  60.  ***********************************************************************
  61.  * brief
  62.  *    set concealment for all elements in same partition
  63.  *    and dependend syntax elements
  64.  * return
  65.  *    EC_REQ, elements of same type or depending type need error concealment. n
  66.  *    EX_SYNC   sync on next header
  67.  ***********************************************************************
  68.  */
  69. int set_ec_flag(
  70.   int se)   //!< type of syntax element to conceal
  71. {
  72.   /*
  73.   if (ec_flag[se] == NO_EC)
  74.     printf("Error concealment on element %sn",SEtypes[se]);
  75.   */
  76.   switch (se)
  77.   {
  78.   case SE_HEADER :
  79.     ec_flag[SE_HEADER] = EC_REQ;
  80.   case SE_PTYPE :
  81.     ec_flag[SE_PTYPE] = EC_REQ;
  82.   case SE_MBTYPE :
  83.     ec_flag[SE_MBTYPE] = EC_REQ;
  84.   case SE_REFFRAME :
  85.     ec_flag[SE_REFFRAME] = EC_REQ;
  86.     ec_flag[SE_MVD] = EC_REQ; // set all motion vectors to zero length
  87.     se = SE_CBP_INTER;      // conceal also Inter texture elements
  88.     break;
  89.   case SE_INTRAPREDMODE :
  90.     ec_flag[SE_INTRAPREDMODE] = EC_REQ;
  91.     se = SE_CBP_INTRA;      // conceal also Intra texture elements
  92.     break;
  93.   case SE_MVD :
  94.     ec_flag[SE_MVD] = EC_REQ;
  95.     se = SE_CBP_INTER;      // conceal also Inter texture elements
  96.     break;
  97.   default:
  98.     break;
  99.   }
  100.   switch (se)
  101.   {
  102.   case SE_CBP_INTRA :
  103.     ec_flag[SE_CBP_INTRA] = EC_REQ;
  104.   case SE_LUM_DC_INTRA :
  105.     ec_flag[SE_LUM_DC_INTRA] = EC_REQ;
  106.   case SE_CHR_DC_INTRA :
  107.     ec_flag[SE_CHR_DC_INTRA] = EC_REQ;
  108.   case SE_LUM_AC_INTRA :
  109.     ec_flag[SE_LUM_AC_INTRA] = EC_REQ;
  110.   case SE_CHR_AC_INTRA :
  111.     ec_flag[SE_CHR_AC_INTRA] = EC_REQ;
  112.     break;
  113.   case SE_CBP_INTER :
  114.     ec_flag[SE_CBP_INTER] = EC_REQ;
  115.   case SE_LUM_DC_INTER :
  116.     ec_flag[SE_LUM_DC_INTER] = EC_REQ;
  117.   case SE_CHR_DC_INTER :
  118.     ec_flag[SE_CHR_DC_INTER] = EC_REQ;
  119.   case SE_LUM_AC_INTER :
  120.     ec_flag[SE_LUM_AC_INTER] = EC_REQ;
  121.   case SE_CHR_AC_INTER :
  122.     ec_flag[SE_CHR_AC_INTER] = EC_REQ;
  123.     break;
  124.   case SE_DELTA_QUANT_INTER :
  125.     ec_flag[SE_DELTA_QUANT_INTER] = EC_REQ;
  126.     break;
  127.   case SE_DELTA_QUANT_INTRA :
  128.     ec_flag[SE_DELTA_QUANT_INTRA] = EC_REQ;
  129.     break;
  130.   default:
  131.     break;
  132.   }
  133.   return EC_REQ;
  134. }
  135. /*!
  136.  ***********************************************************************
  137.  * brief
  138.  *    resets EC_Flags called at the start of each slice
  139.  *
  140.  ***********************************************************************
  141.  */
  142. void reset_ec_flags()
  143. {
  144.   int i;
  145.   for (i=0; i<SE_MAX_ELEMENTS; i++)
  146.     ec_flag[i] = NO_EC;
  147. }
  148. /*!
  149.  ***********************************************************************
  150.  * brief
  151.  *    get error concealed element in dependence of syntax
  152.  *    element se.                                                          n
  153.  *    This function implements the error concealment.
  154.  * return
  155.  *    NO_EC if no error concealment required                               n
  156.  *    EC_REQ if element requires error concealment
  157.  ***********************************************************************
  158.  */
  159. int get_concealed_element(SyntaxElement *sym)
  160. {
  161.   if (ec_flag[sym->type] == NO_EC)
  162.     return NO_EC;
  163. /*
  164. #if TRACE
  165.   printf("TRACE: get concealed element for %s!!!n", SEtypes[sym->type]);
  166. #endif
  167. */
  168.   switch (sym->type)
  169.   {
  170.   case SE_HEADER :
  171.     sym->len = 31;
  172.     sym->inf = 0; // Picture Header
  173.     break;
  174.   case SE_PTYPE : // inter_img_1
  175.   case SE_MBTYPE : // set COPY_MB
  176.   case SE_REFFRAME :
  177.     sym->len = 1;
  178.     sym->inf = 0;
  179.     break;
  180.   case SE_INTRAPREDMODE :
  181.   case SE_MVD :
  182.     sym->len = 1;
  183.     sym->inf = 0;  // set vector to zero length
  184.     break;
  185.   case SE_CBP_INTRA :
  186.     sym->len = 5;
  187.     sym->inf = 0; // codenumber 3 <=> no CBP information for INTRA images
  188.     break;
  189.   case SE_LUM_DC_INTRA :
  190.   case SE_CHR_DC_INTRA :
  191.   case SE_LUM_AC_INTRA :
  192.   case SE_CHR_AC_INTRA :
  193.     sym->len = 1;
  194.     sym->inf = 0;  // return EOB
  195.     break;
  196.   case SE_CBP_INTER :
  197.     sym->len = 1;
  198.     sym->inf = 0; // codenumber 1 <=> no CBP information for INTER images
  199.     break;
  200.   case SE_LUM_DC_INTER :
  201.   case SE_CHR_DC_INTER :
  202.   case SE_LUM_AC_INTER :
  203.   case SE_CHR_AC_INTER :
  204.     sym->len = 1;
  205.     sym->inf = 0;  // return EOB
  206.     break;
  207.   case SE_DELTA_QUANT_INTER:
  208.     sym->len = 1;
  209.     sym->inf = 0;
  210.     break;
  211.   case SE_DELTA_QUANT_INTRA:
  212.     sym->len = 1;
  213.     sym->inf = 0;
  214.     break;
  215.   default:
  216.     break;
  217.   }
  218.   return EC_REQ;
  219. }