📄 sei.c
字号:
}
if ( currLayer == 0 )
{
if ( img->number == input->no_frames-1 )
seiSubseqInfo[currLayer].last_picture_flag = 1;
else
seiSubseqInfo[currLayer].last_picture_flag = 0;
}
if ( currLayer == 1 )
{
if ( ((IMG_NUMBER%(input->NumFramesInELSubSeq+1)==0) && (input->successive_Bframe != 0) && (IMG_NUMBER>0)) || // there are B frames
((IMG_NUMBER%(input->NumFramesInELSubSeq+1)==input->NumFramesInELSubSeq) && (input->successive_Bframe==0)) // there are no B frames
)
seiSubseqInfo[currLayer].last_picture_flag = 1;
else
seiSubseqInfo[currLayer].last_picture_flag = 0;
}
}
/*!
************************************************************************
* \brief
* Finalize subseqence info
************************************************************************
*/
void FinalizeSubseqInfo(int currLayer)
{
SyntaxElement sym;
Bitstream *dest = seiSubseqInfo[currLayer].data;
sym.type = SE_HEADER;
sym.mapping = ue_linfo;
sym.value1 = seiSubseqInfo[currLayer].subseq_layer_num;
writeSyntaxElement2Buf_UVLC(&sym, dest);
sym.value1 = seiSubseqInfo[currLayer].subseq_id;
writeSyntaxElement2Buf_UVLC(&sym, dest);
sym.bitpattern = seiSubseqInfo[currLayer].last_picture_flag;
sym.len = 1;
writeSyntaxElement2Buf_Fixed(&sym, dest);
sym.value1 = seiSubseqInfo[currLayer].stored_frame_cnt;
writeSyntaxElement2Buf_UVLC(&sym, dest);
// make sure the payload is byte aligned, stuff bits are 10..0
if ( dest->bits_to_go != 8 )
{
(dest->byte_buf) <<= 1;
dest->byte_buf |= 1;
dest->bits_to_go--;
if ( dest->bits_to_go != 0 ) (dest->byte_buf) <<= (dest->bits_to_go);
dest->bits_to_go = 8;
dest->streamBuffer[dest->byte_pos++]=dest->byte_buf;
dest->byte_buf = 0;
}
seiSubseqInfo[currLayer].payloadSize = dest->byte_pos;
// printf("layer %d, last picture %d, stored_cnt %d\n", currLayer, seiSubseqInfo[currLayer].last_picture_flag, seiSubseqInfo[currLayer].stored_frame_cnt );
}
/*!
************************************************************************
* \brief
* Clear the payload buffer
************************************************************************
*/
void ClearSubseqInfoPayload(int currLayer)
{
seiSubseqInfo[currLayer].data->bits_to_go = 8;
seiSubseqInfo[currLayer].data->byte_pos = 0;
seiSubseqInfo[currLayer].data->byte_buf = 0;
memset( seiSubseqInfo[currLayer].data->streamBuffer, 0, MAXRTPPAYLOADLEN );
seiSubseqInfo[currLayer].payloadSize = 0;
}
/*!
************************************************************************
* \brief
* Close the global variables for spare picture information
************************************************************************
*/
void CloseSubseqInfo(int currLayer)
{
seiSubseqInfo[currLayer].stored_frame_cnt = -1;
seiSubseqInfo[currLayer].payloadSize = 0;
free( seiSubseqInfo[currLayer].data->streamBuffer );
free( seiSubseqInfo[currLayer].data );
}
/*
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* \functions on subseq layer characteristic sei messages
* \brief
* JVT-D098
* \author
* Dong Tian <tian@cs.tut.fi>
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
Boolean seiHasSubseqLayerInfo = FALSE;
subseq_layer_information_struct seiSubseqLayerInfo;
/*!
************************************************************************
* \brief
* Init the global variables for spare picture information
************************************************************************
*/
void InitSubseqLayerInfo()
{
int i;
seiHasSubseqLayerInfo = TRUE;
seiSubseqLayerInfo.layer_number = 0;
for (i=0; i<MAX_LAYER_NUMBER; i++)
{
seiSubseqLayerInfo.bit_rate[i] = 0;
seiSubseqLayerInfo.frame_rate[i] = 0;
seiSubseqLayerInfo.layer_number++;
}
}
/*!
************************************************************************
* \brief
*
************************************************************************
*/
void CloseSubseqLayerInfo()
{
}
/*!
************************************************************************
* \brief
* Write the data to buffer, which is byte aligned
************************************************************************
*/
void FinalizeSubseqLayerInfo()
{
int i, pos;
pos = 0;
seiSubseqLayerInfo.payloadSize = 0;
for (i=0; i<seiSubseqLayerInfo.layer_number; i++)
{
*((unsigned short*)&(seiSubseqLayerInfo.data[pos])) = seiSubseqLayerInfo.bit_rate[i];
pos += 2;
*((unsigned short*)&(seiSubseqLayerInfo.data[pos])) = seiSubseqLayerInfo.frame_rate[i];
pos += 2;
seiSubseqLayerInfo.payloadSize += 4;
}
}
/*
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* \functions on subseq characteristic sei messages
* \brief
* JVT-D098
* \author
* Dong Tian <tian@cs.tut.fi>
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
Boolean seiHasSubseqChar = FALSE;
subseq_char_information_struct seiSubseqChar;
void InitSubseqChar()
{
seiSubseqChar.data = malloc( sizeof(Bitstream) );
if( seiSubseqChar.data == NULL ) no_mem_exit("InitSubseqChar: seiSubseqChar.data");
seiSubseqChar.data->streamBuffer = malloc(MAXRTPPAYLOADLEN);
if( seiSubseqChar.data->streamBuffer == NULL ) no_mem_exit("InitSubseqChar: seiSubseqChar.data->streamBuffer");
ClearSubseqCharPayload();
seiSubseqChar.subseq_layer_num = img->layer;
seiSubseqChar.subseq_id = seiSubseqInfo[img->layer].subseq_id;
seiSubseqChar.duration_flag = 0;
seiSubseqChar.average_rate_flag = 0;
seiSubseqChar.num_referenced_subseqs = 0;
}
void ClearSubseqCharPayload()
{
memset( seiSubseqChar.data->streamBuffer, 0, MAXRTPPAYLOADLEN);
seiSubseqChar.data->bits_to_go = 8;
seiSubseqChar.data->byte_pos = 0;
seiSubseqChar.data->byte_buf = 0;
seiSubseqChar.payloadSize = 0;
seiHasSubseqChar = FALSE;
}
void UpdateSubseqChar()
{
seiSubseqChar.subseq_layer_num = img->layer;
seiSubseqChar.subseq_id = seiSubseqInfo[img->layer].subseq_id;
seiSubseqChar.duration_flag = 0;
seiSubseqChar.average_rate_flag = 0;
seiSubseqChar.average_bit_rate = 100;
seiSubseqChar.average_frame_rate = 30;
seiSubseqChar.num_referenced_subseqs = 0;
seiSubseqChar.ref_subseq_layer_num[0] = 1;
seiSubseqChar.ref_subseq_id[0] = 2;
seiSubseqChar.ref_subseq_layer_num[1] = 3;
seiSubseqChar.ref_subseq_id[1] = 4;
seiHasSubseqChar = TRUE;
}
void FinalizeSubseqChar()
{
int i;
SyntaxElement sym;
Bitstream *dest = seiSubseqChar.data;
sym.type = SE_HEADER;
sym.mapping = ue_linfo;
sym.value1 = seiSubseqChar.subseq_layer_num;
writeSyntaxElement2Buf_UVLC(&sym, dest);
sym.value1 = seiSubseqChar.subseq_id;
writeSyntaxElement2Buf_UVLC(&sym, dest);
sym.bitpattern = seiSubseqChar.duration_flag;
sym.len = 1;
writeSyntaxElement2Buf_Fixed(&sym, dest);
if ( seiSubseqChar.duration_flag )
{
sym.bitpattern = seiSubseqChar.subseq_duration;
sym.len = 32;
writeSyntaxElement2Buf_Fixed(&sym, dest);
}
sym.bitpattern = seiSubseqChar.average_rate_flag;
sym.len = 1;
writeSyntaxElement2Buf_Fixed(&sym, dest);
if ( seiSubseqChar.average_rate_flag )
{
sym.bitpattern = seiSubseqChar.average_bit_rate;
sym.len = 16;
writeSyntaxElement2Buf_Fixed(&sym, dest);
sym.bitpattern = seiSubseqChar.average_frame_rate;
sym.len = 16;
writeSyntaxElement2Buf_Fixed(&sym, dest);
}
sym.value1 = seiSubseqChar.num_referenced_subseqs;
writeSyntaxElement2Buf_UVLC(&sym, dest);
for (i=0; i<seiSubseqChar.num_referenced_subseqs; i++)
{
sym.value1 = seiSubseqChar.ref_subseq_layer_num[i];
writeSyntaxElement2Buf_UVLC(&sym, dest);
sym.value1 = seiSubseqChar.ref_subseq_id[i];
writeSyntaxElement2Buf_UVLC(&sym, dest);
}
// make sure the payload is byte aligned, stuff bits are 10..0
if ( dest->bits_to_go != 8 )
{
(dest->byte_buf) <<= 1;
dest->byte_buf |= 1;
dest->bits_to_go--;
if ( dest->bits_to_go != 0 ) (dest->byte_buf) <<= (dest->bits_to_go);
dest->bits_to_go = 8;
dest->streamBuffer[dest->byte_pos++]=dest->byte_buf;
dest->byte_buf = 0;
}
seiSubseqChar.payloadSize = dest->byte_pos;
}
void CloseSubseqChar()
{
if (seiSubseqChar.data)
{
free(seiSubseqChar.data->streamBuffer);
free(seiSubseqChar.data);
}
seiSubseqChar.data = NULL;
}
// JVT-D099
/*
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* \functions on scene information SEI message
* \brief
* JVT-D099
* \author
* Ye-Kui Wang <wyk@ieee.org>
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
scene_information_struct seiSceneInformation;
void InitSceneInformation()
{
seiHasSceneInformation = TRUE;
seiSceneInformation.scene_id = 0;
seiSceneInformation.scene_transition_type = 0;
seiSceneInformation.second_scene_id = -1;
seiSceneInformation.data = malloc( sizeof(Bitstream) );
if( seiSceneInformation.data == NULL ) no_mem_exit("InitSceneInformation: seiSceneInformation.data");
seiSceneInformation.data->streamBuffer = malloc( MAXRTPPAYLOADLEN );
if( seiSceneInformation.data->streamBuffer == NULL ) no_mem_exit("InitSceneInformation: seiSceneInformation.data->streamBuffer");
seiSceneInformation.data->bits_to_go = 8;
seiSceneInformation.data->byte_pos = 0;
seiSceneInformation.data->byte_buf = 0;
memset( seiSceneInformation.data->streamBuffer, 0, MAXRTPPAYLOADLEN );
}
void CloseSceneInformation()
{
if (seiSceneInformation.data)
{
free(seiSceneInformation.data->streamBuffer);
free(seiSceneInformation.data);
}
seiSceneInformation.data = NULL;
}
void FinalizeSceneInformation()
{
SyntaxElement sym;
Bitstream *dest = seiSceneInformation.data;
sym.type = SE_HEADER;
sym.mapping = ue_linfo;
sym.bitpattern = seiSceneInformation.scene_id;
sym.len = 8;
writeSyntaxElement2Buf_Fixed(&sym, dest);
sym.value1 = seiSceneInformation.scene_transition_type;
writeSyntaxElement2Buf_UVLC(&sym, dest);
if(seiSceneInformation.scene_transition_type > 3)
{
sym.bitpattern = seiSceneInformation.second_scene_id;
sym.len = 8;
writeSyntaxElement2Buf_Fixed(&sym, dest);
}
// make sure the payload is byte aligned, stuff bits are 10..0
if ( dest->bits_to_go != 8 )
{
(dest->byte_buf) <<= 1;
dest->byte_buf |= 1;
dest->bits_to_go--;
if ( dest->bits_to_go != 0 ) (dest->byte_buf) <<= (dest->bits_to_go);
dest->bits_to_go = 8;
dest->streamBuffer[dest->byte_pos++]=dest->byte_buf;
dest->byte_buf = 0;
}
seiSceneInformation.payloadSize = dest->byte_pos;
}
// HasSceneInformation: To include a scene information SEI into the next slice/DP,
// set HasSceneInformation to be TRUE when calling this function. Otherwise,
// set HasSceneInformation to be FALSE.
void UpdateSceneInformation(Boolean HasSceneInformation, int sceneID, int sceneTransType, int secondSceneID)
{
seiHasSceneInformation = HasSceneInformation;
assert (sceneID < 256);
seiSceneInformation.scene_id = sceneID;
assert (sceneTransType <= 6 );
seiSceneInformation.scene_transition_type = sceneTransType;
if(sceneTransType > 3)
{
assert (secondSceneID < 256);
seiSceneInformation.second_scene_id = secondSceneID;
}
}
// End JVT-D099
/*
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* \functions on Pan Scan messages
* \brief
* Based on FCD
* \author
* Shankar Regunathan <tian@cs.tut.fi>
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
Boolean seiHasPanScanRectInfo = FALSE;
panscanrect_information_struct seiPanScanRectInfo;
void InitPanScanRectInfo()
{
seiPanScanRectInfo.data = malloc( sizeof(Bitstream) );
if( seiPanScanRectInfo.data == NULL ) no_mem_exit("InitPanScanRectInfo: seiPanScanRectInfo.data");
seiPanScanRectInfo.data->streamBuffer = malloc(MAXRTPPAYLOADLEN);
if( seiPanScanRectInfo.data->streamBuffer == NULL ) no_mem_exit("InitPanScanRectInfo: seiPanScanRectInfo.data->streamBuffer");
ClearPanScanRectInfoPayload();
seiPanScanRectInfo.pan_scan_rect_left_offset = 0;
seiPanScanRectInfo.pan_scan_rect_right_offset = 0;
seiPanScanRectInfo.pan_scan_rect_top_offset = 0;
seiPanScanRectInfo.pan_scan_rect_bottom_offset = 0;
}
void ClearPanScanRectInfoPayload()
{
memset( seiPanScanRectInfo.data->streamBuffer, 0, MAXRTPPAYLOADLEN);
seiPanScanRectInfo.data->bits_to_go = 8;
seiPanScanRectInfo.data->byte_pos = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -