Archived
1
0
This repository has been archived on 2024-10-17. You can view files and clone it, but cannot push or open issues or pull requests.
winamp/Src/h264dec/ldecod/src/errorconcealment.c
2024-09-24 14:54:57 +02:00

139 lines
3.8 KiB
C

/*!
***********************************************************************
* \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 <sebastian.purreiter@mch.siemens.de>
***********************************************************************
*/
#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;
}