⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video_dec_frame_buffer_manager.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -