-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/mjpeg/vmjpeg_multi.c b/drivers/frame_provider/decoder/mjpeg/vmjpeg_multi.c index 1ac107f..493231b 100644 --- a/drivers/frame_provider/decoder/mjpeg/vmjpeg_multi.c +++ b/drivers/frame_provider/decoder/mjpeg/vmjpeg_multi.c @@ -44,6 +44,7 @@ #include <linux/amlogic/media/codec_mm/configs.h> #include "../utils/firmware.h" #include "../utils/vdec_v4l2_buffer_ops.h" +#include "../utils/config_parser.h" #define MEM_NAME "codec_mmjpeg" @@ -72,8 +73,9 @@ #define PICINFO_INTERLACE_AVI1_BOT 0x0010 #define PICINFO_INTERLACE_FIRST 0x0010 -#define VF_POOL_SIZE 16 -#define DECODE_BUFFER_NUM_MAX 4 +#define VF_POOL_SIZE 64 +#define DECODE_BUFFER_NUM_MAX 16 +#define DECODE_BUFFER_NUM_DEF 4 #define MAX_BMMU_BUFFER_NUM DECODE_BUFFER_NUM_MAX #define DEFAULT_MEM_SIZE (32*SZ_1M) @@ -96,6 +98,7 @@ static void vmjpeg_work(struct work_struct *work); static int pre_decode_buf_level = 0x800; static int start_decode_buf_level = 0x2000; static u32 without_display_mode; +static u32 dynamic_buf_num_margin; #undef pr_info #define pr_info printk unsigned int mmjpeg_debug_mask = 0xff; @@ -112,6 +115,7 @@ unsigned int mmjpeg_debug_mask = 0xff; #define PRINT_FRAMEBASE_DATA 0x0400 #define PRINT_FLAG_TIMEOUT_STATUS 0x1000 #define PRINT_FLAG_V4L_DETAIL 0x8000 +#define IGNORE_PARAM_FROM_CONFIG 0x8000000 int mmjpeg_debug_print(int index, int debug_flag, const char *fmt, ...) { @@ -216,6 +220,8 @@ struct vdec_mjpeg_hw_s { bool is_used_v4l; void *v4l2_ctx; bool v4l_params_parsed; + int buf_num; + int dynamic_buf_num_margin; }; static void reset_process_time(struct vdec_mjpeg_hw_s *hw); @@ -276,7 +282,7 @@ static irqreturn_t vmjpeg_isr(struct vdec_s *vdec, int irq) reg = READ_VREG(MREG_FROM_AMRISC); index = READ_VREG(AV_SCRATCH_5); - if (index >= DECODE_BUFFER_NUM_MAX) { + if (index >= hw->buf_num) { pr_err("fatal error, invalid buffer index."); return IRQ_HANDLED; } @@ -298,7 +304,7 @@ static irqreturn_t vmjpeg_isr(struct vdec_s *vdec, int irq) ps.visible_height = hw->frame_height; ps.coded_width = ALIGN(hw->frame_width, 64); ps.coded_height = ALIGN(hw->frame_height, 64); - ps.dpb_size = MAX_BMMU_BUFFER_NUM - 1; + ps.dpb_size = hw->buf_num; hw->v4l_params_parsed = true; vdec_v4l_set_ps_infos(ctx, &ps); } @@ -465,7 +471,7 @@ static void vmjpeg_canvas_init(struct vdec_mjpeg_hw_s *hw) decbuf_uv_size = 0x80000; decbuf_size = 0x300000; - for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) { + for (i = 0; i < hw->buf_num; i++) { int canvas; if (hw->is_used_v4l) { @@ -641,9 +647,10 @@ static void vmjpeg_dump_state(struct vdec_s *vdec) mmjpeg_debug_print(DECODE_ID(hw), 0, "====== %s\n", __func__); mmjpeg_debug_print(DECODE_ID(hw), 0, - "width/height (%d/%d)\n", + "width/height (%d/%d) buf_num %d\n", hw->frame_width, - hw->frame_height + hw->frame_height, + hw->buf_num ); mmjpeg_debug_print(DECODE_ID(hw), 0, "is_framebase(%d), eos %d, state 0x%x, dec_result 0x%x dec_frm %d put_frm %d run %d not_run_ready %d input_empty %d\n", @@ -937,28 +944,40 @@ static int vmjpeg_v4l_alloc_buff_config_canvas(struct vdec_mjpeg_hw_s *hw, int i return 0; } +static int vmjpeg_get_buf_num(struct vdec_mjpeg_hw_s *hw) +{ + int buf_num = DECODE_BUFFER_NUM_DEF; + + buf_num += hw->dynamic_buf_num_margin; + + if (buf_num > DECODE_BUFFER_NUM_MAX) + buf_num = DECODE_BUFFER_NUM_MAX; + + return buf_num; +} + static bool is_enough_free_buffer(struct vdec_mjpeg_hw_s *hw) { int i; - for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) { + for (i = 0; i < hw->buf_num; i++) { if (hw->vfbuf_use[i] == 0) break; } - return i == DECODE_BUFFER_NUM_MAX ? false : true; + return i == hw->buf_num ? false : true; } static int find_free_buffer(struct vdec_mjpeg_hw_s *hw) { int i; - for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) { + for (i = 0; i < hw->buf_num; i++) { if (hw->vfbuf_use[i] == 0) break; } - if (i == DECODE_BUFFER_NUM_MAX) + if (i == hw->buf_num) return -1; if (hw->is_used_v4l) @@ -971,7 +990,7 @@ static int find_free_buffer(struct vdec_mjpeg_hw_s *hw) static int vmjpeg_hw_ctx_restore(struct vdec_mjpeg_hw_s *hw) { struct buffer_spec_s *buff_spec; - u32 index, i; + int index, i; index = find_free_buffer(hw); if (index < 0) @@ -984,7 +1003,7 @@ static int vmjpeg_hw_ctx_restore(struct vdec_mjpeg_hw_s *hw) vmjpeg_canvas_init(hw); } else { if (!hw->is_used_v4l) { - for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) { + for (i = 0; i < hw->buf_num; i++) { buff_spec = &hw->buffer_spec[i]; canvas_config_config(buff_spec->y_canvas_index, &buff_spec->canvas_config[0]); @@ -1146,12 +1165,12 @@ static void run(struct vdec_s *vdec, unsigned long mask, hw->run_count++; vdec_reset_core(vdec); - for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) { + for (i = 0; i < hw->buf_num; i++) { if (hw->vfbuf_use[i] == 0) break; } - if (i == DECODE_BUFFER_NUM_MAX) { + if (i == hw->buf_num) { hw->dec_result = DEC_RESULT_AGAIN; vdec_schedule_work(&hw->work); return; @@ -1391,6 +1410,7 @@ static int ammvdec_mjpeg_probe(struct platform_device *pdev) { struct vdec_s *pdata = *(struct vdec_s **)pdev->dev.platform_data; struct vdec_mjpeg_hw_s *hw = NULL; + int config_val = 0; if (pdata == NULL) { pr_info("ammvdec_mjpeg memory resource undefined.\n"); @@ -1430,6 +1450,19 @@ static int ammvdec_mjpeg_probe(struct platform_device *pdev) snprintf(pdata->vf_provider_name, VDEC_PROVIDER_NAME_SIZE, PROVIDER_NAME ".%02x", pdev->id & 0xff); + if (((debug_enable & IGNORE_PARAM_FROM_CONFIG) == 0) && pdata->config_len) { + mmjpeg_debug_print(DECODE_ID(hw), 0, "pdata->config: %s\n", pdata->config); + if (get_config_int(pdata->config, "parm_v4l_buffer_margin", + &config_val) == 0) + hw->dynamic_buf_num_margin = config_val; + else + hw->dynamic_buf_num_margin = dynamic_buf_num_margin; + } else { + hw->dynamic_buf_num_margin = dynamic_buf_num_margin; + } + + hw->buf_num = vmjpeg_get_buf_num(hw); + vf_provider_init(&pdata->vframe_provider, pdata->vf_provider_name, &vf_provider_ops, pdata); @@ -1555,6 +1588,8 @@ MODULE_PARM_DESC(pre_decode_buf_level, module_param(udebug_flag, uint, 0664); MODULE_PARM_DESC(udebug_flag, "\n amvdec_mmpeg12 udebug_flag\n"); +module_param(dynamic_buf_num_margin, uint, 0664); +MODULE_PARM_DESC(dynamic_buf_num_margin, "\n dynamic_buf_num_margin\n"); module_param(decode_timeout_val, uint, 0664); MODULE_PARM_DESC(decode_timeout_val, "\n ammvdec_mjpeg decode_timeout_val\n"); |