?? erc_api.c
字號:
/*
***********************************************************************
* COPYRIGHT AND WARRANTY INFORMATION
*
* Copyright 2001, International Telecommunications Union, Geneva
*
* DISCLAIMER OF WARRANTY
*
* These software programs are available to the user without any
* license fee or royalty on an "as is" basis. The ITU disclaims
* any and all warranties, whether express, implied, or
* statutory, including any implied warranties of merchantability
* or of fitness for a particular purpose. In no event shall the
* contributor or the ITU be liable for any incidental, punitive, or
* consequential damages of any kind whatsoever arising from the
* use of these programs.
*
* This disclaimer of warranty extends to the user of these programs
* and user's customers, employees, agents, transferees, successors,
* and assigns.
*
* The ITU does not represent or warrant that the programs furnished
* hereunder are free of infringement of any third-party patents.
* Commercial implementations of ITU-T Recommendations, including
* shareware, may be subject to royalty fees to patent holders.
* Information regarding the ITU-T patent policy is available from
* the ITU Web site at http://www.itu.int.
*
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
************************************************************************
*/
/*!
*************************************************************************************
* \file erc_api.c
*
* \brief
* External (still inside video decoder) interface for error concealment module
*
* \author
* - Ari Hourunranta <ari.hourunranta@nokia.com>
* - Viktor Varsa <viktor.varsa@nokia.com>
* - Ye-Kui Wang <wangy@cs.tut.fi>
*
*************************************************************************************
*/
#include <stdlib.h>
#include <memory.h>
#include "global.h"
#include "memalloc.h"
#include "erc_api.h"
objectBuffer_t *erc_object_list;
ercVariables_t *erc_errorVar;
frame erc_recfr;
int erc_mvperMB;
/*!
************************************************************************
* \brief
* Initinize the error concealment module
************************************************************************
*/
void ercInit(int pic_sizex, int pic_sizey, int flag)
{
erc_object_list = (objectBuffer_t *) calloc((pic_sizex * pic_sizey) >> 6, sizeof(objectBuffer_t));
if (erc_object_list == NULL) no_mem_exit("ercInit: erc_object_list");
/* the error concelament instance is allocated */
erc_errorVar = ercOpen();
/* set error concealment ON */
ercSetErrorConcealment(erc_errorVar, flag);
}
/*!
************************************************************************
* \brief
* Allocates data structures used in error concealment.
*\return
* The allocated ercVariables_t is returned.
************************************************************************
*/
ercVariables_t *ercOpen( void )
{
ercVariables_t *errorVar = NULL;
errorVar = (ercVariables_t *)malloc( sizeof(ercVariables_t));
if ( errorVar == NULL ) no_mem_exit("ercOpen: errorVar");
errorVar->nOfMBs = 0;
errorVar->segments = NULL;
errorVar->currSegment = 0;
errorVar->yCondition = NULL;
errorVar->uCondition = NULL;
errorVar->vCondition = NULL;
errorVar->prevFrameYCondition = NULL;
errorVar->concealment = 1;
return errorVar;
}
/*!
************************************************************************
* \brief
* Resets the variables used in error detection.
* Should be called always when starting to decode a new frame.
* \param errorVar
* Variables for error concealment
* \param nOfMBs
* Number of macroblocks in a frame
* \param numOfSegments
* Estimated number of segments (memory reserved)
************************************************************************
*/
void ercReset( ercVariables_t *errorVar, int nOfMBs, int numOfSegments )
{
int *tmp = NULL;
if ( errorVar && errorVar->concealment )
{
/* If frame size has been changed */
if ( nOfMBs != errorVar->nOfMBs && errorVar->yCondition != NULL )
{
free( errorVar->yCondition );
errorVar->yCondition = NULL;
free( errorVar->prevFrameYCondition );
errorVar->prevFrameYCondition = NULL;
free( errorVar->uCondition );
errorVar->uCondition = NULL;
free( errorVar->vCondition );
errorVar->vCondition = NULL;
free( errorVar->segments );
errorVar->segments = NULL;
}
/* If the structures are uninitialized (first frame, or frame size is chaned) */
if ( errorVar->yCondition == NULL )
{
errorVar->segments = (ercSegment_t *)malloc( numOfSegments*sizeof(ercSegment_t) );
if ( errorVar->segments == NULL ) no_mem_exit("ercReset: errorVar->segments");
memset( errorVar->segments, 0, numOfSegments*sizeof(ercSegment_t));
errorVar->nOfSegments = numOfSegments;
errorVar->yCondition = (int *)malloc( 4*nOfMBs*sizeof(int) );
if ( errorVar->yCondition == NULL ) no_mem_exit("ercReset: errorVar->yCondition");
errorVar->prevFrameYCondition = (int *)malloc( 4*nOfMBs*sizeof(int) );
if ( errorVar->prevFrameYCondition == NULL ) no_mem_exit("ercReset: errorVar->prevFrameYCondition");
errorVar->uCondition = (int *)malloc( nOfMBs*sizeof(int) );
if ( errorVar->uCondition == NULL ) no_mem_exit("ercReset: errorVar->uCondition");
errorVar->vCondition = (int *)malloc( nOfMBs*sizeof(int) );
if ( errorVar->vCondition == NULL ) no_mem_exit("ercReset: errorVar->vCondition");
errorVar->nOfMBs = nOfMBs;
}
else
{
/* Store the yCondition struct of the previous frame */
tmp = errorVar->prevFrameYCondition;
errorVar->prevFrameYCondition = errorVar->yCondition;
errorVar->yCondition = tmp;
}
/* Reset tables and parameters */
memset( errorVar->yCondition, 0, 4*nOfMBs*sizeof(*errorVar->yCondition));
memset( errorVar->uCondition, 0, nOfMBs*sizeof(*errorVar->uCondition));
memset( errorVar->vCondition, 0, nOfMBs*sizeof(*errorVar->vCondition));
if (errorVar->nOfSegments != numOfSegments)
{
free( errorVar->segments );
errorVar->segments = NULL;
errorVar->segments = (ercSegment_t *)malloc( numOfSegments*sizeof(ercSegment_t) );
if ( errorVar->segments == NULL ) no_mem_exit("ercReset: errorVar->segments");
errorVar->nOfSegments = numOfSegments;
}
memset( errorVar->segments, 0, errorVar->nOfSegments*sizeof(ercSegment_t));
errorVar->currSegment = 0;
errorVar->currSegmentCorrupted = 0;
errorVar->nOfCorruptedSegments = 0;
}
}
/*!
************************************************************************
* \brief
* Resets the variables used in error detection.
* Should be called always when starting to decode a new frame.
* \param errorVar
* Variables for error concealment
************************************************************************
*/
void ercClose( ercVariables_t *errorVar )
{
if ( errorVar != NULL )
{
if (errorVar->yCondition != NULL)
{
free( errorVar->segments );
free( errorVar->yCondition );
free( errorVar->uCondition );
free( errorVar->vCondition );
free( errorVar->prevFrameYCondition );
}
free( errorVar );
}
free(erc_object_list);
}
/*!
************************************************************************
* \brief
* Sets error concealment ON/OFF. Can be invoked only between frames, not during a frame
* \param errorVar
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -