123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*!
- ***********************************************************************
- * \file errorconcealment.c
- *
- * \brief
- * Implements error concealment scheme for H.264 decoder
- *
- * \date
- * 6.10.2000
- *
- * \version
- * 1.0
- *
- * \note
- * This simple error concealment implemented in this decoder uses
- * the existing dependencies of syntax elements.
- * In case that an element is detected as false this elements and all
- * dependend elements are marked as elements to conceal in the p_Vid->ec_flag[]
- * array. If the decoder requests a new element by the function
- * readSyntaxElement_xxxx() this array is checked first if an error concealment has
- * to be applied on this element.
- * In case that an error occured a concealed element is given to the
- * decoding function in macroblock().
- *
- * \author
- * Main contributors (see contributors.h for copyright, address and affiliation details)
- * - Sebastian Purreiter <[email protected]>
- ***********************************************************************
- */
- #include "contributors.h"
- #include "global.h"
- #include "elements.h"
- /*!
- ***********************************************************************
- * \brief
- * set concealment for all elements in same partition
- * and dependend syntax elements
- * \param p_Vid
- * image encoding parameters for current picture
- * \param se
- * type of syntax element to conceal
- * \return
- * EC_REQ, elements of same type or depending type need error concealment. \n
- * EX_SYNC sync on next header
- ***********************************************************************
- */
- int set_ec_flag(VideoParameters *p_Vid, int se)
- {
- /*
- if (p_Vid->ec_flag[se] == NO_EC)
- printf("Error concealment on element %s\n",SEtypes[se]);
- */
- switch (se)
- {
- case SE_HEADER :
- p_Vid->ec_flag[SE_HEADER] = EC_REQ;
- case SE_PTYPE :
- p_Vid->ec_flag[SE_PTYPE] = EC_REQ;
- case SE_MBTYPE :
- p_Vid->ec_flag[SE_MBTYPE] = EC_REQ;
- case SE_REFFRAME :
- p_Vid->ec_flag[SE_REFFRAME] = EC_REQ;
- p_Vid->ec_flag[SE_MVD] = EC_REQ; // set all motion vectors to zero length
- se = SE_CBP_INTER; // conceal also Inter texture elements
- break;
- case SE_INTRAPREDMODE :
- p_Vid->ec_flag[SE_INTRAPREDMODE] = EC_REQ;
- se = SE_CBP_INTRA; // conceal also Intra texture elements
- break;
- case SE_MVD :
- p_Vid->ec_flag[SE_MVD] = EC_REQ;
- se = SE_CBP_INTER; // conceal also Inter texture elements
- break;
- default:
- break;
- }
- switch (se)
- {
- case SE_CBP_INTRA :
- p_Vid->ec_flag[SE_CBP_INTRA] = EC_REQ;
- case SE_LUM_DC_INTRA :
- p_Vid->ec_flag[SE_LUM_DC_INTRA] = EC_REQ;
- case SE_CHR_DC_INTRA :
- p_Vid->ec_flag[SE_CHR_DC_INTRA] = EC_REQ;
- case SE_LUM_AC_INTRA :
- p_Vid->ec_flag[SE_LUM_AC_INTRA] = EC_REQ;
- case SE_CHR_AC_INTRA :
- p_Vid->ec_flag[SE_CHR_AC_INTRA] = EC_REQ;
- break;
- case SE_CBP_INTER :
- p_Vid->ec_flag[SE_CBP_INTER] = EC_REQ;
- case SE_LUM_DC_INTER :
- p_Vid->ec_flag[SE_LUM_DC_INTER] = EC_REQ;
- case SE_CHR_DC_INTER :
- p_Vid->ec_flag[SE_CHR_DC_INTER] = EC_REQ;
- case SE_LUM_AC_INTER :
- p_Vid->ec_flag[SE_LUM_AC_INTER] = EC_REQ;
- case SE_CHR_AC_INTER :
- p_Vid->ec_flag[SE_CHR_AC_INTER] = EC_REQ;
- break;
- case SE_DELTA_QUANT_INTER :
- p_Vid->ec_flag[SE_DELTA_QUANT_INTER] = EC_REQ;
- break;
- case SE_DELTA_QUANT_INTRA :
- p_Vid->ec_flag[SE_DELTA_QUANT_INTRA] = EC_REQ;
- break;
- default:
- break;
- }
- return EC_REQ;
- }
- /*!
- ***********************************************************************
- * \brief
- * resets EC_Flags called at the start of each slice
- *
- ***********************************************************************
- */
- void reset_ec_flags(VideoParameters *p_Vid)
- {
- int i;
- for (i=0; i<SE_MAX_ELEMENTS; i++)
- p_Vid->ec_flag[i] = NO_EC;
- }
|