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/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");