📄 video_dec_frame_buffer_manager.c
字号:
/* Get previous frame buffer setting according to current index
* @param frame_buffer MPEG4_FRAME_BUFFER_ADDR
* @return None
*/
void mpeg4_dec_frame_buffer_prev(MPEG4_FRAME_BUFFER_ADDR * frame_buffer)
{
/* decrement rec frame index */
g_mpeg4_frame_buffer_info.rec_frame_index = (g_mpeg4_frame_buffer_info.rec_frame_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 1)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count;
frame_buffer->rec_addr
= g_mpeg4_frame_buffer_info.frame_buffer_addr[g_mpeg4_frame_buffer_info.rec_frame_index];
frame_buffer->ref_addr
= g_mpeg4_frame_buffer_info.frame_buffer_addr[(g_mpeg4_frame_buffer_info.rec_frame_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 1)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
frame_buffer->deblock_addr =
g_mpeg4_frame_buffer_info.frame_buffer_addr[(g_mpeg4_frame_buffer_info.rec_frame_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 2)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
}
/* Sort frame buffer according to the rec_addr input
* @param rec_addr sort according to the rec address
* @param frame_buffer MPEG4_FRAME_BUFFER_ADDR
* @return None
*/
void mpeg4_dec_sort_frame_buffer(kal_uint32 rec_addr, MPEG4_FRAME_BUFFER_ADDR * frame_buffer)
{
kal_uint8 index;
kal_uint8 temp_index = 0;
/* Find the reconstrcut addres maps to which frame buffer index */
for (index = 0; index < g_mpeg4_frame_buffer_info.max_frame_buffer_count; index++)
{
if (rec_addr == g_mpeg4_frame_buffer_info.frame_buffer_addr[index])
{
temp_index = index;
break;
}
}
/* assert when not matches to any frame buffer */
if(temp_index>=g_mpeg4_frame_buffer_info.max_frame_buffer_count)
EXT_ASSERT(0, temp_index, g_mpeg4_frame_buffer_info.max_frame_buffer_count, 0);
/* constrcut according to the previous result */
frame_buffer->rec_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[temp_index];
frame_buffer->ref_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[(temp_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 1)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
frame_buffer->deblock_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[(temp_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 2)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
}
/* Sort frame buffer according to the rec_addr input, and get next frame buffer setting.
* @param rec_addr sort according to the rec address
* @param frame_buffer MPEG4_FRAME_BUFFER_ADDR
* @return None
*/
void mpeg4_dec_sort_frame_buffer_next(kal_uint32 rec_addr, MPEG4_FRAME_BUFFER_ADDR * frame_buffer)
{
kal_uint8 index;
kal_uint8 temp_index = 0;
/* Find the reconstrcut addres maps to which frame buffer index */
for (index = 0; index < g_mpeg4_frame_buffer_info.max_frame_buffer_count; index++)
{
if (rec_addr == g_mpeg4_frame_buffer_info.frame_buffer_addr[index])
{
temp_index = index;
break;
}
}
/* assert when not matches to any frame buffer */
if(temp_index>=g_mpeg4_frame_buffer_info.max_frame_buffer_count)
EXT_ASSERT(0, temp_index, g_mpeg4_frame_buffer_info.max_frame_buffer_count, 0);
/* increment rec frame index */
temp_index = (temp_index + 1) % g_mpeg4_frame_buffer_info.max_frame_buffer_count;
frame_buffer->rec_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[temp_index];
frame_buffer->ref_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[(temp_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 1)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
frame_buffer->deblock_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[(temp_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 2)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
}
/* Sort frame buffer according to the rec_addr input, and get previous frame buffer setting.
* @param rec_addr sort according to the rec address
* @param frame_buffer MPEG4_FRAME_BUFFER_ADDR
* @return None
*/
void mpeg4_dec_sort_frame_buffer_prev(kal_uint32 rec_addr, MPEG4_FRAME_BUFFER_ADDR * frame_buffer)
{
kal_uint8 index;
kal_uint8 temp_index = 0;
/* Find the reconstrcut addres maps to which frame buffer index */
for (index = 0; index < g_mpeg4_frame_buffer_info.max_frame_buffer_count; index++)
{
if (rec_addr == g_mpeg4_frame_buffer_info.frame_buffer_addr[index])
{
temp_index = index;
break;
}
}
/* assert when not matches to any frame buffer */
if(temp_index>=g_mpeg4_frame_buffer_info.max_frame_buffer_count)
EXT_ASSERT(0, temp_index, g_mpeg4_frame_buffer_info.max_frame_buffer_count, 0);
/* decrement rec frame index */
temp_index = (temp_index + g_mpeg4_frame_buffer_info.max_frame_buffer_count - 1)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count;
frame_buffer->rec_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[temp_index];
frame_buffer->ref_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[(temp_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 1)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
frame_buffer->deblock_addr = g_mpeg4_frame_buffer_info.frame_buffer_addr[(temp_index
+ g_mpeg4_frame_buffer_info.max_frame_buffer_count - 2)
% g_mpeg4_frame_buffer_info.max_frame_buffer_count];
}
/* Reduce one frame buffer. The reduced one is used for TV out display.
* It is used memory display mode.
* @param None
* @return None
*/
static void mpeg4_dec_reduce_frame_buffer(void)
{
kal_uint8 index;
kal_uint8 temp_index = 0;
if (g_mpeg4_frame_buffer_info.max_frame_buffer_count == MPEG4_FRAME_BUFFER_COUNT)
{
/* Find the reconstrcut addres maps to which frame buffer index */
for (index = 0; index < g_mpeg4_frame_buffer_info.max_frame_buffer_count; index++)
{
if (DRV_Reg32(MP4_DEC_REC_ADDR) == g_mpeg4_frame_buffer_info.frame_buffer_addr[index])
{
temp_index = index;
break;
}
}
/* assert when not matches to any frame buffer */
if(temp_index>=g_mpeg4_frame_buffer_info.max_frame_buffer_count)
EXT_ASSERT(0, temp_index, g_mpeg4_frame_buffer_info.max_frame_buffer_count, 0);
if (index == (MPEG4_FRAME_BUFFER_COUNT - 1))
{
/* If the rec frame is the last one. Copy to the first one and set rec index to the first one */
kal_mem_cpy((void *)g_mpeg4_frame_buffer_info.frame_buffer_addr[0],
(void *)DRV_Reg32(MP4_DEC_REC_ADDR),
g_mpeg4_frame_buffer_info.frame_buffer_size);
g_mpeg4_frame_buffer_info.rec_frame_index = 0;
}
else
{
/* Keep rec index setting. Just copy its content to the last one */
kal_mem_cpy(
(void *)g_mpeg4_frame_buffer_info.frame_buffer_addr[MPEG4_FRAME_BUFFER_COUNT - 1],
(void *)DRV_Reg32(MP4_DEC_REC_ADDR),
g_mpeg4_frame_buffer_info.frame_buffer_size);
}
g_mpeg4_frame_buffer_info.max_frame_buffer_count--;
if(g_mpeg4_frame_buffer_info.max_frame_buffer_count != (MPEG4_FRAME_BUFFER_COUNT - 1))
EXT_ASSERT(0, g_mpeg4_frame_buffer_info.max_frame_buffer_count, MPEG4_FRAME_BUFFER_COUNT, 0);
}
else
{
kal_mem_cpy((void *)g_mpeg4_frame_buffer_info.frame_buffer_addr[MPEG4_FRAME_BUFFER_COUNT - 1],
(void *)DRV_Reg32(MP4_DEC_REC_ADDR),
g_mpeg4_frame_buffer_info.frame_buffer_size);
}
return;
}
/* Recover one frame buffer.
* It is used in normal decode display mode.
* @param None
* @return None
*/
static void mpeg4_dec_recover_frame_buffer(void)
{
if (g_mpeg4_frame_buffer_info.max_frame_buffer_count < MPEG4_FRAME_BUFFER_COUNT)
{
/* only need to add frame buffer count by 1. The original setting in hardware register is fit to use*/
ASSERT(g_mpeg4_frame_buffer_info.max_frame_buffer_count == (MPEG4_FRAME_BUFFER_COUNT - 1));
g_mpeg4_frame_buffer_info.max_frame_buffer_count++;
}
}
/* Config frame buffer mode.
* @param frame_buffer_mode MPEG4_FRAME_BUFFER_MODE(normal and memory mode)
* @return None
*/
void mpeg4_dec_config_frame_buffer_mode(MPEG4_FRAME_BUFFER_MODE frame_buffer_mode)
{
g_mpeg4_frame_buffer_info.frame_buffer_mode = frame_buffer_mode;
if(g_mpeg4_frame_buffer_info.frame_buffer_mode == MPEG4_FRAME_BUFFER_NORMAL_MODE)
{
/* recover in normal mode */
mpeg4_dec_recover_frame_buffer();
}
else
{
/* reduce in memory mode */
mpeg4_dec_reduce_frame_buffer();
}
}
/* Get current display frame address.
* @param None
* @return frame buffer start address
*/
kal_uint32 mpeg4_dec_get_display_frame_addr(void)
{
if(g_mpeg4_frame_buffer_info.frame_buffer_mode == MPEG4_FRAME_BUFFER_NORMAL_MODE)
{
/* In normal mode, show deblock or reconstrcu frame buffer */
if (DRV_Reg32(MP4_DEC_DEBLOCK_ADDR) == 0)
{
return DRV_Reg32(MP4_DEC_REC_ADDR);
}
else
{
return DRV_Reg32(MP4_DEC_DEBLOCK_ADDR);
}
}
else
{
/* In memory mode, show the last frame buffer */
/* When reduce to memory mode, the displayed frame has copied to the last frame buffer*/
return g_mpeg4_frame_buffer_info.frame_buffer_addr[MPEG4_FRAME_BUFFER_COUNT - 1];
}
}
#endif /* ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )*/
#endif /*MP4_CODEC*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -