Hi.
We use theora in games and find out that although PostProcessingLevel
is off by default, theora allocates memory for postprocessing in any
case.
The code below differs from original alpha5 only by adding in certain
places
"... pbi->PostProcessingLevel == 0 ? 0 : ..."
It is working and allocate less memory.
May be it is good idea to add this (or gather all
preprocess things in one if(), for example) in future releases.
void InitFragmentInfo(PB_INSTANCE * pbi){
/* clear any existing info */
ClearFragmentInfo(pbi);
/* Perform Fragment Allocations */
pbi->display_fragments _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->display_fragments));
pbi->pixel_index_table _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->pixel_index_table));
pbi->recon_pixel_index_table _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->recon_pixel_index_table));
pbi->FragTokenCounts pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->UnitFragments * sizeof(*pbi->FragTokenCounts));
pbi->CodedBlockList _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->CodedBlockList));
pbi->FragMVect _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->FragMVect));
pbi->FragCoeffs _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->FragCoeffs));
pbi->FragCoefEOB _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->FragCoefEOB));
pbi->skipped_display_fragments _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->skipped_display_fragments));
pbi->QFragData _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->QFragData));
pbi->TokenList pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->UnitFragments * sizeof(*pbi->TokenList));
pbi->FragCodingMethod _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->FragCodingMethod));
pbi->FragCoordinates _ogg_malloc(pbi->UnitFragments *
sizeof(*pbi->FragCoordinates));
pbi->FragQIndex pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->UnitFragments * sizeof(*pbi->FragQIndex));
pbi->PPCoefBuffer pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->UnitFragments * sizeof(*pbi->PPCoefBuffer));
pbi->FragmentVariances pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->UnitFragments * sizeof(*pbi->FragmentVariances));
pbi->_Nodes pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->UnitFragments * sizeof(*pbi->_Nodes));
/* Super Block Initialization */
pbi->SBCodedFlags _ogg_malloc(pbi->SuperBlocks *
sizeof(*pbi->SBCodedFlags));
pbi->SBFullyFlags _ogg_malloc(pbi->SuperBlocks *
sizeof(*pbi->SBFullyFlags));
/* Macro Block Initialization */
pbi->MBCodedFlags _ogg_malloc(pbi->MacroBlocks *
sizeof(*pbi->MBCodedFlags));
pbi->MBFullyFlags pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(pbi->MacroBlocks * sizeof(*pbi->MBFullyFlags));
pbi->BlockMap _ogg_malloc(pbi->SuperBlocks *
sizeof(*pbi->BlockMap));
}
void InitFrameInfo(PB_INSTANCE * pbi, unsigned int FrameSize){
/* clear any existing info */
ClearFrameInfo(pbi);
/* allocate frames */
pbi->ThisFrameRecon
_ogg_malloc(FrameSize*sizeof(*pbi->ThisFrameRecon));
pbi->GoldenFrame _ogg_malloc(FrameSize*sizeof(*pbi->GoldenFrame));
pbi->LastFrameRecon
_ogg_malloc(FrameSize*sizeof(*pbi->LastFrameRecon));
pbi->PostProcessBuffer pbi->PostProcessingLevel == 0 ? 0 :
_ogg_malloc(FrameSize*sizeof(*pbi->PostProcessBuffer));
}
Best regards,
Yudintsev Anton.