blob: bacd0125d8da4314b8628b573dbd03c68fd3644a [file] [log] [blame]
/*!
***************************************************************************
* \file rdopt_coding_state.c
*
* \brief
* Storing/restoring coding state for
* Rate-Distortion optimized mode decision
*
* \author
* Heiko Schwarz
*
* \date
* 17. April 2001
**************************************************************************/
#include <stdlib.h>
#include <memory.h>
#include "global.h"
#include "rdopt_coding_state.h"
#include "cabac.h"
/*!
************************************************************************
* \brief
* delete structure for storing coding state
************************************************************************
*/
void
delete_coding_state (CSptr cs)
{
if (cs != NULL)
{
//=== structures of data partition array ===
if (cs->encenv != NULL) free (cs->encenv);
if (cs->bitstream != NULL) free (cs->bitstream);
//=== contexts for binary arithmetic coding ===
delete_contexts_MotionInfo (cs->mot_ctx);
delete_contexts_TextureInfo (cs->tex_ctx);
//=== coding state structure ===
free (cs);
cs=NULL;
}
}
/*!
************************************************************************
* \brief
* create structure for storing coding state
************************************************************************
*/
CSptr
create_coding_state ()
{
CSptr cs;
//=== coding state structure ===
if ((cs = (CSptr) calloc (1, sizeof(CSobj))) == NULL)
no_mem_exit("init_coding_state: cs");
//=== important variables of data partition array ===
cs->no_part = input->partition_mode==0?1:3;
if (input->symbol_mode == CABAC)
{
if ((cs->encenv = (EncodingEnvironment*) calloc (cs->no_part, sizeof(EncodingEnvironment))) == NULL)
no_mem_exit("init_coding_state: cs->encenv");
}
else
{
cs->encenv = NULL;
}
if ((cs->bitstream = (Bitstream*) calloc (cs->no_part, sizeof(Bitstream))) == NULL)
no_mem_exit("init_coding_state: cs->bitstream");
//=== context for binary arithmetic coding ===
cs->symbol_mode = input->symbol_mode;
if (cs->symbol_mode == CABAC)
{
cs->mot_ctx = create_contexts_MotionInfo ();
cs->tex_ctx = create_contexts_TextureInfo();
}
else
{
cs->mot_ctx = NULL;
cs->tex_ctx = NULL;
}
return cs;
}
/*!
************************************************************************
* \brief
* store coding state (for rd-optimized mode decision)
************************************************************************
*/
void
store_coding_state (CSptr cs)
{
int i;
int i_last = img->currentPicture->idr_flag? 1:cs->no_part;
Slice *currSlice = img->currentSlice;
Macroblock *currMB = &(img->mb_data [img->current_mb_nr]);
if (!input->rdopt) return;
if (cs->symbol_mode==CABAC)
{
//=== important variables of data partition array ===
//only one partition for IDR img
for (i = 0; i < i_last; i++)
{
cs->encenv[i] = currSlice->partArr[i].ee_cabac;;
cs->bitstream[i] = *currSlice->partArr[i].bitstream;;
}
//=== contexts for binary arithmetic coding ===
*cs->mot_ctx = *currSlice->mot_ctx;
*cs->tex_ctx = *currSlice->tex_ctx;
}
else
{
//=== important variables of data partition array ===
for (i = 0; i < i_last; i++)
{
cs->bitstream[i] = *currSlice->partArr[i].bitstream;;
}
}
//=== syntax element number and bitcounters ===
memcpy (cs->bitcounter, currMB->bitcounter, MAX_BITCOUNTER_MB * sizeof(int));
//=== elements of current macroblock ===
memcpy (cs->mvd, currMB->mvd, BLOCK_CONTEXT * sizeof(int));
cs->cbp_bits = currMB->cbp_bits;
}
/*!
************************************************************************
* \brief
* restore coding state (for rd-optimized mode decision)
************************************************************************
*/
void reset_coding_state (CSptr cs)
{
int i;
int i_last = img->currentPicture->idr_flag? 1:cs->no_part;
Slice *currSlice = img->currentSlice;
Macroblock *currMB = &(img->mb_data [img->current_mb_nr]);
if (!input->rdopt) return;
if (cs->symbol_mode==CABAC)
{
//=== important variables of data partition array ===
//only one partition for IDR img
for (i = 0; i < i_last; i++)
{
//--- parameters of encoding environments ---
currSlice->partArr[i].ee_cabac = cs->encenv[i];
*currSlice->partArr[i].bitstream = cs->bitstream[i];
}
//=== contexts for binary arithmetic coding ===
*currSlice->mot_ctx = *cs->mot_ctx;
*currSlice->tex_ctx = *cs->tex_ctx;
}
else
{
//=== important variables of data partition array ===
//only one partition for IDR img
for (i = 0; i < i_last; i++)
{
//--- parameters of encoding environments ---
*currSlice->partArr[i].bitstream = cs->bitstream[i];
}
}
//=== syntax element number and bit counters ===
memcpy (currMB->bitcounter, cs->bitcounter, MAX_BITCOUNTER_MB * sizeof(int));
//=== elements of current macroblock ===
memcpy (currMB->mvd, cs->mvd, BLOCK_CONTEXT * sizeof(int));
currMB->cbp_bits = cs->cbp_bits;
}