summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--drivers/frame_provider/decoder/avs2/vavs2.c11
-rw-r--r--drivers/frame_provider/decoder/h264/vh264_mvc.c38
-rw-r--r--drivers/frame_provider/decoder/mjpeg/vmjpeg_multi.c65
-rw-r--r--drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c94
-rw-r--r--drivers/frame_provider/decoder/mpeg4/vmpeg4_multi.c68
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");