-rw-r--r-- | drivers/frame_provider/decoder/avs2/vavs2.c | 11 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/h264/vh264_mvc.c | 38 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/mjpeg/vmjpeg_multi.c | 65 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c | 94 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/mpeg4/vmpeg4_multi.c | 68 |
5 files changed, 214 insertions, 62 deletions
diff --git a/drivers/frame_provider/decoder/h264/vh264_mvc.c b/drivers/frame_provider/decoder/h264/vh264_mvc.c index fdb0535..821b3c1 100644 --- a/drivers/frame_provider/decoder/h264/vh264_mvc.c +++ b/drivers/frame_provider/decoder/h264/vh264_mvc.c @@ -46,6 +46,7 @@ #include <linux/amlogic/media/codec_mm/configs.h> #include "../utils/firmware.h" #include <linux/amlogic/tee.h> +#include "../utils/config_parser.h" #define TIME_TASK_PRINT_ENABLE 0x100 #define PUT_PRINT_ENABLE 0x200 @@ -185,9 +186,11 @@ static s32 vh264mvc_init(void); unsigned int DECODE_BUFFER_START = 0x00200000; unsigned int DECODE_BUFFER_END = 0x05000000; +/* #define DISPLAY_BUFFER_NUM 4 */ +static unsigned int dynamic_buf_num_margin = 8; + #define DECODE_BUFFER_NUM_MAX 16 -#define DISPLAY_BUFFER_NUM 4 -#define MAX_BMMU_BUFFER_NUM (DECODE_BUFFER_NUM_MAX + DISPLAY_BUFFER_NUM) +#define MAX_BMMU_BUFFER_NUM (DECODE_BUFFER_NUM_MAX + dynamic_buf_num_margin) #define TOTAL_BMMU_BUFF_NUM (MAX_BMMU_BUFFER_NUM * 2 + 3) #define VF_BUFFER_IDX(n) (2 + n) @@ -223,8 +226,12 @@ struct buffer_spec_s { unsigned long phy_addr; int alloc_count; }; +/* static struct buffer_spec_s buffer_spec0[MAX_BMMU_BUFFER_NUM]; static struct buffer_spec_s buffer_spec1[MAX_BMMU_BUFFER_NUM]; +*/ +static struct buffer_spec_s *buffer_spec0; +static struct buffer_spec_s *buffer_spec1; static void *mm_blk_handle; /* @@ -741,7 +748,7 @@ static void do_alloc_work(struct work_struct *work) mb_width, mb_height); total_dec_frame_buffering[0] = - max_dec_frame_buffering[0] + DISPLAY_BUFFER_NUM; + max_dec_frame_buffering[0] + dynamic_buf_num_margin; mb_width = (mb_width + 3) & 0xfffffffc; mb_height = (mb_height + 3) & 0xfffffffc; @@ -822,7 +829,7 @@ static void do_alloc_work(struct work_struct *work) } total_dec_frame_buffering[1] = - max_dec_frame_buffering[1] + DISPLAY_BUFFER_NUM; + max_dec_frame_buffering[1] + dynamic_buf_num_margin; mb_width = (mb_width + 3) & 0xfffffffc; mb_height = (mb_height + 3) & 0xfffffffc; @@ -1369,6 +1376,7 @@ static int vh264mvc_local_init(void) max_dec_frame_buffering[1] = -1; fill_ptr = get_ptr = put_ptr = putting_ptr = 0; dirty_frame_num = 0; + for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) { view0_vfbuf_use[i] = 0; view1_vfbuf_use[i] = 0; @@ -1412,7 +1420,6 @@ static s32 vh264mvc_init(void) { int ret = -1; char *buf = vmalloc(0x1000 * 16); - if (buf == NULL) return -ENOMEM; @@ -1582,6 +1589,7 @@ static void error_do_work(struct work_struct *work) static int amvdec_h264mvc_probe(struct platform_device *pdev) { struct vdec_s *pdata = *(struct vdec_s **)pdev->dev.platform_data; + int config_val = 0; pr_info("amvdec_h264mvc probe start.\n"); mutex_lock(&vh264_mvc_mutex); @@ -1603,13 +1611,28 @@ static int amvdec_h264mvc_probe(struct platform_device *pdev) if (pdata->sys_info) vh264mvc_amstream_dec_info = *pdata->sys_info; + if (pdata->config_len) { + pr_info("pdata->config: %s\n", pdata->config); + if (get_config_int(pdata->config, "parm_v4l_buffer_margin", + &config_val) == 0) + dynamic_buf_num_margin = config_val; + } + pdata->dec_status = vh264mvc_dec_status; /* pdata->set_trickmode = vh264mvc_set_trickmode; */ + buffer_spec0 = (struct buffer_spec_s *)vzalloc( + sizeof(struct buffer_spec_s) * MAX_BMMU_BUFFER_NUM * 2); + if (NULL == buffer_spec0) + return -ENOMEM; + buffer_spec1 = &buffer_spec0[MAX_BMMU_BUFFER_NUM]; + if (vh264mvc_init() < 0) { pr_info("\namvdec_h264mvc init failed.\n"); kfree(gvs); gvs = NULL; + vfree(buffer_spec0); + buffer_spec0 = NULL; mutex_unlock(&vh264_mvc_mutex); return -ENODEV; } @@ -1649,6 +1672,8 @@ static int amvdec_h264mvc_remove(struct platform_device *pdev) #ifdef DEBUG_SKIP pr_info("view_total = %ld, dropped %ld\n", view_total, view_dropped); #endif + vfree(buffer_spec0); + buffer_spec0 = NULL; kfree(gvs); gvs = NULL; @@ -1734,6 +1759,9 @@ MODULE_PARM_DESC(stat, "\n amvdec_h264mvc stat\n"); module_param(dbg_mode, uint, 0664); MODULE_PARM_DESC(dbg_mode, "\n amvdec_h264mvc dbg mode\n"); +module_param(dynamic_buf_num_margin, uint, 0664); +MODULE_PARM_DESC(dynamic_buf_num_margin, "\n amvdec_h264mvc dynamic_buf_num_margin\n"); + module_param(view_mode, uint, 0664); MODULE_PARM_DESC(view_mode, "\n amvdec_h264mvc view mode\n"); |