author | shihong.zheng <shihong.zheng@amlogic.com> | 2018-06-13 02:42:08 (GMT) |
---|---|---|
committer | Zhi Zhou <zhi.zhou@amlogic.com> | 2018-06-13 08:52:47 (GMT) |
commit | a674e3cd4c3b8ccc3b087ec8c0e4f5dd0a76b837 (patch) | |
tree | d51885cca2d8e4dc7719e5014ff9fad3e696ac05 | |
parent | 347da3c7d03a6b4f9fdba1a4c840a8d74387726f (diff) | |
download | media_modules-a674e3cd4c3b8ccc3b087ec8c0e4f5dd0a76b837.zip media_modules-a674e3cd4c3b8ccc3b087ec8c0e4f5dd0a76b837.tar.gz media_modules-a674e3cd4c3b8ccc3b087ec8c0e4f5dd0a76b837.tar.bz2 |
decoder: decrease mem use and optimize code
PD#167435
1. decrease some mem use;
2. change vp9 4k mv buf num to 6;
3. reduce max multi-instance channels from 12 to 9;
4. avsp_long_cabac must config by option;
5. remove h264_4k2k module;
6. set_clk before init avoid timer run before work init;.
7. optimize some code in vp9/h265/avs2/mpeg2/avs.
Change-Id: Iaeedd24987649bdf04ec53e1c4c6baffb3bf1ea8
Signed-off-by: shihong.zheng <shihong.zheng@amlogic.com>
-rw-r--r-- | Media.mk | 2 | ||||
-rw-r--r-- | drivers/common/firmware/firmware_drv.c | 2 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/avs/avs.c | 4 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/avs/avs.h | 2 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/avs2/vavs2.c | 105 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/h264/Makefile | 2 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/h265/vh265.c | 147 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/mpeg12/vmpeg12.c | 5 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/vp9/vvp9.c | 97 |
9 files changed, 164 insertions, 202 deletions
@@ -6,8 +6,6 @@ CONFIGS := CONFIG_AMLOGIC_MEDIA_VDEC_MPEG12=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264_MULTI=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H264_MVC=m \ - CONFIG_AMLOGIC_MEDIA_VDEC_H264_4K2K=m \ - CONFIG_AMLOGIC_MEDIA_VDEC_H264_MVC=m \ CONFIG_AMLOGIC_MEDIA_VDEC_H265=m \ CONFIG_AMLOGIC_MEDIA_VDEC_VP9=m \ CONFIG_AMLOGIC_MEDIA_VDEC_MJPEG=m \ diff --git a/drivers/common/firmware/firmware_drv.c b/drivers/common/firmware/firmware_drv.c index a240d95..775f935 100644 --- a/drivers/common/firmware/firmware_drv.c +++ b/drivers/common/firmware/firmware_drv.c @@ -45,7 +45,7 @@ #define CLASS_NAME "firmware_codec" #define DEV_NAME "firmware_vdec" #define DIR "video" -#define FRIMWARE_SIZE (128 * 1024) /*128k*/ +#define FRIMWARE_SIZE (64 * 1024) /*64k*/ #define BUFF_SIZE (1024 * 1024 * 2) #define FW_LOAD_FORCE (0x1) diff --git a/drivers/frame_provider/decoder/avs/avs.c b/drivers/frame_provider/decoder/avs/avs.c index 9180035..bb2ea4a 100644 --- a/drivers/frame_provider/decoder/avs/avs.c +++ b/drivers/frame_provider/decoder/avs/avs.c @@ -730,7 +730,6 @@ static int error_recovery_mode; /*0: blocky 1: mosaic*/ *static uint error_watchdog_count; *static uint error_watchdog_buf_threshold = 0x4000000; */ -static uint long_cabac_busy; static struct vframe_s *vavs_vf_peek(void *op_arg) { @@ -1653,6 +1652,7 @@ static int amvdec_avs_probe(struct platform_device *pdev) user_data_buffer, (u32)user_data_buffer_phys); } #endif + INIT_WORK(&set_clk_work, avs_set_clk); if (vavs_init() < 0) { pr_info("amvdec_avs init failed.\n"); kfree(gvs); @@ -1668,7 +1668,7 @@ static int amvdec_avs_probe(struct platform_device *pdev) INIT_WORK(&userdata_push_work, userdata_push_do_work); #endif INIT_WORK(¬ify_work, vavs_notify_work); - INIT_WORK(&set_clk_work, avs_set_clk); + return 0; } diff --git a/drivers/frame_provider/decoder/avs/avs.h b/drivers/frame_provider/decoder/avs/avs.h index 8fdd7f6..93a04de 100644 --- a/drivers/frame_provider/decoder/avs/avs.h +++ b/drivers/frame_provider/decoder/avs/avs.h @@ -1,7 +1,9 @@ #ifndef AVS_H_ #define AVS_H_ +#ifdef CONFIG_AMLOGIC_AVSP_LONG_CABAC #define AVSP_LONG_CABAC +#endif /*#define BITSTREAM_READ_TMP_NO_CACHE*/ #ifdef AVSP_LONG_CABAC diff --git a/drivers/frame_provider/decoder/avs2/vavs2.c b/drivers/frame_provider/decoder/avs2/vavs2.c index f2c2d93..16b3c29 100644 --- a/drivers/frame_provider/decoder/avs2/vavs2.c +++ b/drivers/frame_provider/decoder/avs2/vavs2.c @@ -139,67 +139,8 @@ #define PARSER_CMD_SKIP_CFG_2 0x001b1910 - #define PARSER_CMD_NUMBER 37 -static unsigned short parser_cmd[PARSER_CMD_NUMBER] = { -0x0401, -0x8401, -0x0800, -0x0402, -0x9002, -0x1423, -0x8CC3, -0x1423, -0x8804, -0x9825, -0x0800, -0x04FE, -0x8406, -0x8411, -0x1800, -0x8408, -0x8409, -0x8C2A, -0x9C2B, -0x1C00, -0x840F, -0x8407, -0x8000, -0x8408, -0x2000, -0xA800, -0x8410, -0x04DE, -0x840C, -0x840D, -0xAC00, -0xA000, -0x08C0, -0x08E0, -0xA40E, -0xFC00, -0x7C00 -}; - -static int32_t g_WqMDefault4x4[16] = { - 64, 64, 64, 68, - 64, 64, 68, 72, - 64, 68, 76, 80, - 72, 76, 84, 96 -}; - - -static int32_t g_WqMDefault8x8[64] = { - 64, 64, 64, 64, 68, 68, 72, 76, - 64, 64, 64, 68, 72, 76, 84, 92, - 64, 64, 68, 72, 76, 80, 88, 100, - 64, 68, 72, 80, 84, 92, 100, 112, - 68, 72, 80, 84, 92, 104, 112, 128, - 76, 80, 84, 92, 104, 116, 132, 152, - 96, 100, 104, 116, 124, 140, 164, 188, - 104, 108, 116, 128, 152, 172, 192, 216 -}; /*#define HEVC_PIC_STRUCT_SUPPORT*/ /* to remove, fix build error */ @@ -218,7 +159,7 @@ static int32_t g_WqMDefault8x8[64] = { #endif #ifdef MULTI_INSTANCE_SUPPORT -#define MAX_DECODE_INSTANCE_NUM 12 +#define MAX_DECODE_INSTANCE_NUM 9 #define MULTI_DRIVER_NAME "ammvdec_avs2" #define lock_buffer(dec, flags) \ @@ -3049,6 +2990,32 @@ static void avs2_init_decoder_hw(struct AVS2Decoder_s *dec) { unsigned int data32; int i; + const unsigned short parser_cmd[PARSER_CMD_NUMBER] = { + 0x0401, 0x8401, 0x0800, 0x0402, 0x9002, 0x1423, + 0x8CC3, 0x1423, 0x8804, 0x9825, 0x0800, 0x04FE, + 0x8406, 0x8411, 0x1800, 0x8408, 0x8409, 0x8C2A, + 0x9C2B, 0x1C00, 0x840F, 0x8407, 0x8000, 0x8408, + 0x2000, 0xA800, 0x8410, 0x04DE, 0x840C, 0x840D, + 0xAC00, 0xA000, 0x08C0, 0x08E0, 0xA40E, 0xFC00, + 0x7C00 + }; + const int32_t g_WqMDefault4x4[16] = { + 64, 64, 64, 68, + 64, 64, 68, 72, + 64, 68, 76, 80, + 72, 76, 84, 96 + }; + + const int32_t g_WqMDefault8x8[64] = { + 64, 64, 64, 64, 68, 68, 72, 76, + 64, 64, 64, 68, 72, 76, 84, 92, + 64, 64, 68, 72, 76, 80, 88, 100, + 64, 68, 72, 80, 84, 92, 100, 112, + 68, 72, 80, 84, 92, 104, 112, 128, + 76, 80, 84, 92, 104, 116, 132, 152, + 96, 100, 104, 116, 124, 140, 164, 188, + 104, 108, 116, 128, 152, 172, 192, 216 + }; /*if (debug & AVS2_DBG_BUFMGR_MORE) pr_info("%s\n", __func__);*/ @@ -3250,7 +3217,7 @@ static void config_avs2_clk_forced_on(void) -static struct AVS2Decoder_s gHevc; +static struct AVS2Decoder_s *gHevc; static void avs2_local_uninit(struct AVS2Decoder_s *dec) { @@ -5022,11 +4989,17 @@ static int amvdec_avs2_probe(struct platform_device *pdev) { struct vdec_s *pdata = *(struct vdec_s **)pdev->dev.platform_data; struct BUF_s BUF[MAX_BUF_NUM]; - struct AVS2Decoder_s *dec = &gHevc; + struct AVS2Decoder_s *dec; int ret; pr_info("%s\n", __func__); mutex_lock(&vavs2_mutex); + dec = vmalloc(sizeof(struct AVS2Decoder_s)); + if (dec == NULL) { + pr_info("failed to vamlloc amvdec_avs2 dec struct\n"); + return -ENOMEM; + } + gHevc = dec; memcpy(&BUF[0], &dec->m_BUF[0], sizeof(struct BUF_s) * MAX_BUF_NUM); memset(dec, 0, sizeof(struct AVS2Decoder_s)); memcpy(&dec->m_BUF[0], &BUF[0], sizeof(struct BUF_s) * MAX_BUF_NUM); @@ -5041,6 +5014,7 @@ static int amvdec_avs2_probe(struct platform_device *pdev) if (pdata == NULL) { avs2_print(dec, 0, "\namvdec_avs2 memory resource undefined.\n"); + vfree(dec); mutex_unlock(&vavs2_mutex); return -EFAULT; } @@ -5049,6 +5023,7 @@ static int amvdec_avs2_probe(struct platform_device *pdev) platform_set_drvdata(pdev, pdata); if (amvdec_avs2_mmu_init(dec) < 0) { + vfree(dec); mutex_unlock(&vavs2_mutex); pr_err("avs2 alloc bmmu box failed!!\n"); return -1; @@ -5058,6 +5033,7 @@ static int amvdec_avs2_probe(struct platform_device *pdev) work_buf_size, DRIVER_NAME, &pdata->mem_start); if (ret < 0) { uninit_mmu_buffers(dec); + vfree(dec); mutex_unlock(&vavs2_mutex); return ret; } @@ -5089,6 +5065,7 @@ static int amvdec_avs2_probe(struct platform_device *pdev) pr_info("\namvdec_avs2 init failed.\n"); avs2_local_uninit(dec); uninit_mmu_buffers(dec); + vfree(dec); mutex_unlock(&vavs2_mutex); return -ENODEV; } @@ -5102,7 +5079,7 @@ static int amvdec_avs2_probe(struct platform_device *pdev) static int amvdec_avs2_remove(struct platform_device *pdev) { - struct AVS2Decoder_s *dec = &gHevc; + struct AVS2Decoder_s *dec = gHevc; if (debug) pr_info("amvdec_avs2_remove\n"); @@ -5119,6 +5096,8 @@ static int amvdec_avs2_remove(struct platform_device *pdev) dec->pts_missed, dec->pts_hit, dec->frame_dur); #endif + vfree(dec); + mutex_unlock(&vavs2_mutex); return 0; diff --git a/drivers/frame_provider/decoder/h264/Makefile b/drivers/frame_provider/decoder/h264/Makefile index a98001c..b7c85ee 100644 --- a/drivers/frame_provider/decoder/h264/Makefile +++ b/drivers/frame_provider/decoder/h264/Makefile @@ -4,5 +4,3 @@ amvdec_h264-objs += vh264.o obj-$(CONFIG_AMLOGIC_MEDIA_VDEC_H264_MVC) += amvdec_h264mvc.o amvdec_h264mvc-objs += vh264_mvc.o -obj-$(CONFIG_AMLOGIC_MEDIA_VDEC_H264_4K2K) += amvdec_h264_4k2k.o -amvdec_h264_4k2k-objs += vh264_4k2k.o diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c index ebf6781..12c4add 100644 --- a/drivers/frame_provider/decoder/h265/vh265.c +++ b/drivers/frame_provider/decoder/h265/vh265.c @@ -95,7 +95,7 @@ #endif #ifdef MULTI_INSTANCE_SUPPORT -#define MAX_DECODE_INSTANCE_NUM 12 +#define MAX_DECODE_INSTANCE_NUM 9 #define MULTI_DRIVER_NAME "ammvdec_h265" #endif #define DRIVER_NAME "amvdec_h265" @@ -174,7 +174,7 @@ static unsigned int decode_timeout_val = 200; static u32 data_resend_policy = 1; #define VIDEO_SIGNAL_TYPE_AVAILABLE_MASK 0x20000000 - +/* static const char * const video_format_names[] = { "component", "PAL", "NTSC", "SECAM", "MAC", "unspecified", "unspecified", "unspecified" @@ -199,7 +199,7 @@ static const char * const matrix_coeffs_names[] = { "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", "bt2020nc", "bt2020c" }; - +*/ #ifdef SUPPORT_10BIT #define HEVC_CM_BODY_START_ADDR 0x3626 #define HEVC_CM_BODY_LENGTH 0x3627 @@ -318,7 +318,7 @@ static uint slice_parse_begin; static u32 step; static bool is_reset; -static u32 dynamic_buf_num_margin = 8; +static u32 dynamic_buf_num_margin = 7; static u32 buf_alloc_width; static u32 buf_alloc_height; @@ -633,46 +633,6 @@ enum NalUnitType { #define PARSER_CMD_NUMBER 37 -static unsigned short parser_cmd[PARSER_CMD_NUMBER] = { - 0x0401, - 0x8401, - 0x0800, - 0x0402, - 0x9002, - 0x1423, - 0x8CC3, - 0x1423, - 0x8804, - 0x9825, - 0x0800, - 0x04FE, - 0x8406, - 0x8411, - 0x1800, - 0x8408, - 0x8409, - 0x8C2A, - 0x9C2B, - 0x1C00, - 0x840F, - 0x8407, - 0x8000, - 0x8408, - 0x2000, - 0xA800, - 0x8410, - 0x04DE, - 0x840C, - 0x840D, - 0xAC00, - 0xA000, - 0x08C0, - 0x08E0, - 0xA40E, - 0xFC00, - 0x7C00 -}; - /************************************************** * *h265 buffer management @@ -1580,6 +1540,8 @@ struct hevc_state_s { u8 head_error_flag; int valve_count; struct firmware_s *fw; + int max_pic_w; + int max_pic_h; #ifdef AGAIN_HAS_THRESHOLD u8 next_again_flag; u32 pre_parser_wr_ptr; @@ -1763,16 +1725,6 @@ static int get_double_write_mode(struct hevc_state_s *hevc) return dw; } -/* for double write buf alloc */ -static int get_double_write_mode_init(struct hevc_state_s *hevc) -{ - u32 valid_dw_mode = get_valid_double_write_mode(hevc); - if (valid_dw_mode == 0x100) - return 0x1; - - return valid_dw_mode; -} - static int get_double_write_ratio(struct hevc_state_s *hevc, int dw_mode) { @@ -2108,12 +2060,21 @@ static int init_mmu_buffers(struct hevc_state_s *hevc) { int tvp_flag = vdec_secure(hw_to_vdec(hevc)) ? CODEC_MM_FLAGS_TVP : 0; + int buf_size = 64; + if ((hevc->max_pic_w * hevc->max_pic_h) > 0 && + (hevc->max_pic_w * hevc->max_pic_h) <= 1920*1088) { + buf_size = 24; + } + if (get_dbg_flag(hevc)) { + hevc_print(hevc, 0, "%s max_w %d max_h %d\n", + __func__, hevc->max_pic_w, hevc->max_pic_h); + } if (hevc->mmu_enable) { hevc->mmu_box = decoder_mmu_box_alloc_box(DRIVER_NAME, hevc->index, MAX_REF_PIC_NUM, - 64 * SZ_1M, + buf_size * SZ_1M, tvp_flag ); if (!hevc->mmu_box) { @@ -2307,7 +2268,7 @@ static int cal_current_buf_size(struct hevc_state_s *hevc, int mc_buffer_size_h = (mc_buffer_size + 0xffff) >> 16; int mc_buffer_size_u_v_h = 0; - int dw_mode = get_double_write_mode_init(hevc); + int dw_mode = get_double_write_mode(hevc); if (hevc->mmu_enable) buf_size = @@ -2512,7 +2473,7 @@ static int config_pic(struct hevc_state_s *hevc, struct PIC_s *pic) unsigned int y_adr = 0; struct buf_stru_s buf_stru; int buf_size = cal_current_buf_size(hevc, &buf_stru); - int dw_mode = get_double_write_mode_init(hevc); + int dw_mode = get_double_write_mode(hevc); for (i = 0; i < BUF_POOL_SIZE; i++) { if (hevc->m_BUF[i].start_adr != 0 && @@ -2584,7 +2545,7 @@ static void init_pic_list(struct hevc_state_s *hevc) { int i; int init_buf_num = get_work_pic_num(hevc); - int dw_mode = get_double_write_mode_init(hevc); + int dw_mode = get_double_write_mode(hevc); /*alloc decoder buf*/ for (i = 0; i < init_buf_num; i++) { @@ -2727,7 +2688,7 @@ static void init_pic_list_hw(struct hevc_state_s *hevc) { int i; int cur_pic_num = MAX_REF_PIC_NUM; - int dw_mode = get_double_write_mode_init(hevc); + int dw_mode = get_double_write_mode(hevc); if (get_cpu_type() >= MESON_CPU_MAJOR_ID_GXL) WRITE_VREG(HEVCD_MPP_ANC2AXI_TBL_CONF_ADDR, (0x1 << 1) | (0x1 << 2)); @@ -3561,6 +3522,22 @@ static void hevc_config_work_space_hw(struct hevc_state_s *hevc) WRITE_VREG(LMEM_DUMP_ADR, (u32)hevc->lmem_phy_addr); } +static void parser_cmd_write(void) +{ + u32 i; + const unsigned short parser_cmd[PARSER_CMD_NUMBER] = { + 0x0401, 0x8401, 0x0800, 0x0402, 0x9002, 0x1423, + 0x8CC3, 0x1423, 0x8804, 0x9825, 0x0800, 0x04FE, + 0x8406, 0x8411, 0x1800, 0x8408, 0x8409, 0x8C2A, + 0x9C2B, 0x1C00, 0x840F, 0x8407, 0x8000, 0x8408, + 0x2000, 0xA800, 0x8410, 0x04DE, 0x840C, 0x840D, + 0xAC00, 0xA000, 0x08C0, 0x08E0, 0xA40E, 0xFC00, + 0x7C00 + }; + for (i = 0; i < PARSER_CMD_NUMBER; i++) + WRITE_VREG(HEVC_PARSER_CMD_WRITE, parser_cmd[i]); +} + static void hevc_init_decoder_hw(struct hevc_state_s *hevc, int decode_pic_begin, int decode_pic_num) { @@ -3688,8 +3665,8 @@ static void hevc_init_decoder_hw(struct hevc_state_s *hevc, /*WRITE_VREG(HEVC_DECODE_COUNT, 0);*/ /* Send parser_cmd */ WRITE_VREG(HEVC_PARSER_CMD_WRITE, (1 << 16) | (0 << 0)); - for (i = 0; i < PARSER_CMD_NUMBER; i++) - WRITE_VREG(HEVC_PARSER_CMD_WRITE, parser_cmd[i]); + + parser_cmd_write(); WRITE_VREG(HEVC_PARSER_CMD_SKIP_0, PARSER_CMD_SKIP_CFG_0); WRITE_VREG(HEVC_PARSER_CMD_SKIP_1, PARSER_CMD_SKIP_CFG_1); @@ -3717,7 +3694,7 @@ static void hevc_init_decoder_hw(struct hevc_state_s *hevc, (0 << 0) /* software reset ipp and mpp */ ); - if (get_double_write_mode_init(hevc) & 0x10) + if (get_double_write_mode(hevc) & 0x10) WRITE_VREG(HEVCD_MPP_DECOMP_CTL1, 0x1 << 31 /*/Enable NV21 reference read mode for MC*/ ); @@ -3801,8 +3778,8 @@ static void decoder_hw_reset(void) /* Send parser_cmd */ WRITE_VREG(HEVC_PARSER_CMD_WRITE, (1 << 16) | (0 << 0)); - for (i = 0; i < PARSER_CMD_NUMBER; i++) - WRITE_VREG(HEVC_PARSER_CMD_WRITE, parser_cmd[i]); + + parser_cmd_write(); WRITE_VREG(HEVC_PARSER_CMD_SKIP_0, PARSER_CMD_SKIP_CFG_0); WRITE_VREG(HEVC_PARSER_CMD_SKIP_1, PARSER_CMD_SKIP_CFG_1); @@ -5785,7 +5762,7 @@ static void release_pic_mmu_buf(struct hevc_state_s *hevc, * ************************************************** */ -static struct hevc_state_s gHevc; +static struct hevc_state_s *gHevc; static void hevc_local_uninit(struct hevc_state_s *hevc) { @@ -7395,7 +7372,7 @@ static int hevc_recover(struct hevc_state_s *hevc) hevc->have_valid_start_slice = 0; - if (get_double_write_mode_init(hevc) & 0x10) + if (get_double_write_mode(hevc) & 0x10) WRITE_VREG(HEVCD_MPP_DECOMP_CTL1, 0x1 << 31 /*/Enable NV21 reference read mode for MC*/ ); @@ -8711,7 +8688,7 @@ static int h265_task_handle(void *data) void vh265_free_cmabuf(void) { - struct hevc_state_s *hevc = &gHevc; + struct hevc_state_s *hevc = gHevc; mutex_lock(&vh265_mutex); @@ -8733,7 +8710,7 @@ int vh265_dec_status(struct vdec_info *vstatus) struct hevc_state_s *hevc = (struct hevc_state_s *)vdec->private; #else - struct hevc_state_s *hevc = &gHevc; + struct hevc_state_s *hevc = gHevc; #endif vstatus->frame_width = hevc->frame_width; vstatus->frame_height = hevc->frame_height; @@ -10004,8 +9981,15 @@ static int amvdec_h265_probe(struct platform_device *pdev) struct vdec_dev_reg_s *pdata = (struct vdec_dev_reg_s *)pdev->dev.platform_data; #endif - struct hevc_state_s *hevc = &gHevc; int ret; + struct hevc_state_s *hevc; + + hevc = vmalloc(sizeof(struct hevc_state_s)); + if (hevc == NULL) { + hevc_print(hevc, 0, "%s vmalloc hevc failed\r\n", __func__); + return -ENOMEM; + } + gHevc = hevc; if ((debug & H265_NO_CHANG_DEBUG_FLAG_IN_CODE) == 0) debug &= (~(H265_DEBUG_DIS_LOC_ERROR_PROC | H265_DEBUG_DIS_SYS_ERROR_PROC)); @@ -10030,6 +10014,7 @@ static int amvdec_h265_probe(struct platform_device *pdev) if (pdata == NULL) { hevc_print(hevc, 0, "\namvdec_h265 memory resource undefined.\n"); + vfree(hevc); mutex_unlock(&vh265_mutex); return -EFAULT; } @@ -10043,6 +10028,7 @@ static int amvdec_h265_probe(struct platform_device *pdev) if (init_mmu_buffers(hevc)) { hevc_print(hevc, 0, "\n 265 mmu init failed!\n"); + vfree(hevc); mutex_unlock(&vh265_mutex); return -EFAULT; } @@ -10052,6 +10038,7 @@ static int amvdec_h265_probe(struct platform_device *pdev) if (ret < 0) { uninit_mmu_buffers(hevc); devm_kfree(&pdev->dev, (void *)hevc); + vfree(hevc); mutex_unlock(&vh265_mutex); return ret; } @@ -10094,6 +10081,7 @@ static int amvdec_h265_probe(struct platform_device *pdev) "\namvdec_h265 init failed.\n"); hevc_local_uninit(hevc); uninit_mmu_buffers(hevc); + vfree(hevc); mutex_unlock(&vh265_mutex); return -ENODEV; } @@ -10107,7 +10095,7 @@ static int amvdec_h265_probe(struct platform_device *pdev) static int amvdec_h265_remove(struct platform_device *pdev) { - struct hevc_state_s *hevc = &gHevc; + struct hevc_state_s *hevc = gHevc; if (get_dbg_flag(hevc)) hevc_print(hevc, 0, "%s\r\n", __func__); @@ -10125,6 +10113,8 @@ static int amvdec_h265_remove(struct platform_device *pdev) hevc->pts_missed, hevc->pts_hit, hevc->frame_dur); #endif + vfree(hevc); + mutex_unlock(&vh265_mutex); return 0; @@ -10375,17 +10365,22 @@ static int ammvdec_h265_probe(struct platform_device *pdev) /*use ptr config for doubel_write_mode, etc*/ hevc_print(hevc, 0, "pdata->config=%s\n", pdata->config); - if (get_config_int(pdata->config, "hevc_buf_margin", - &config_val) == 0) - hevc->dynamic_buf_num_margin = config_val; - else - hevc->dynamic_buf_num_margin = dynamic_buf_num_margin; - if (get_config_int(pdata->config, "hevc_double_write_mode", &config_val) == 0) hevc->double_write_mode = config_val; else hevc->double_write_mode = double_write_mode; + + /*use ptr config for max_pic_w, etc*/ + if (get_config_int(pdata->config, "hevc_buf_width", + &config_val) == 0) { + hevc->max_pic_w = config_val; + } + if (get_config_int(pdata->config, "hevc_buf_height", + &config_val) == 0) { + hevc->max_pic_h = config_val; + } + #endif } else { hevc->vh265_amstream_dec_info.width = 0; diff --git a/drivers/frame_provider/decoder/mpeg12/vmpeg12.c b/drivers/frame_provider/decoder/mpeg12/vmpeg12.c index 04254e5..2e3a90e 100644 --- a/drivers/frame_provider/decoder/mpeg12/vmpeg12.c +++ b/drivers/frame_provider/decoder/mpeg12/vmpeg12.c @@ -2020,6 +2020,7 @@ static int amvdec_mpeg12_probe(struct platform_device *pdev) vmpeg12_vdec_info_init(); + INIT_WORK(&set_clk_work, vmpeg12_set_clk); if (vmpeg12_init() < 0) { amlog_level(LOG_LEVEL_ERROR, "amvdec_mpeg12 init failed.\n"); kfree(gvs); @@ -2036,7 +2037,7 @@ static int amvdec_mpeg12_probe(struct platform_device *pdev) INIT_WORK(&userdata_push_work, userdata_push_do_work); INIT_WORK(¬ify_work, vmpeg12_notify_work); INIT_WORK(&reset_work, reset_do_work); - INIT_WORK(&set_clk_work, vmpeg12_set_clk); + last_offset = 0xFFFFFFFF; #ifdef DUMP_USER_DATA @@ -2168,7 +2169,7 @@ module_param(error_frame_skip_level, uint, 0664); MODULE_PARM_DESC(error_frame_skip_level, "\n amvdec_mpeg12 error_frame_skip_level\n"); module_param(force_first_i_ready, uint, 0664); -MODULE_PARM_DESC(dec_control, "\n amvmpeg12 force_first_i_ready\n"); +MODULE_PARM_DESC(force_first_i_ready, "\n amvmpeg12 force_first_i_ready\n"); module_init(amvdec_mpeg12_driver_init_module); module_exit(amvdec_mpeg12_driver_remove_module); diff --git a/drivers/frame_provider/decoder/vp9/vvp9.c b/drivers/frame_provider/decoder/vp9/vvp9.c index bd249ac..fed0e5f 100644 --- a/drivers/frame_provider/decoder/vp9/vvp9.c +++ b/drivers/frame_provider/decoder/vp9/vvp9.c @@ -123,45 +123,6 @@ #define PARSER_CMD_NUMBER 37 -unsigned short parser_cmd[PARSER_CMD_NUMBER] = { -0x0401, -0x8401, -0x0800, -0x0402, -0x9002, -0x1423, -0x8CC3, -0x1423, -0x8804, -0x9825, -0x0800, -0x04FE, -0x8406, -0x8411, -0x1800, -0x8408, -0x8409, -0x8C2A, -0x9C2B, -0x1C00, -0x840F, -0x8407, -0x8000, -0x8408, -0x2000, -0xA800, -0x8410, -0x04DE, -0x840C, -0x840D, -0xAC00, -0xA000, -0x08C0, -0x08E0, -0xA40E, -0xFC00, -0x7C00 -}; /*#define HEVC_PIC_STRUCT_SUPPORT*/ /* to remove, fix build error */ @@ -181,7 +142,7 @@ unsigned short parser_cmd[PARSER_CMD_NUMBER] = { #endif #ifdef MULTI_INSTANCE_SUPPORT -#define MAX_DECODE_INSTANCE_NUM 12 +#define MAX_DECODE_INSTANCE_NUM 9 #define MULTI_DRIVER_NAME "ammvdec_vp9" static unsigned int max_decode_instance_num @@ -633,6 +594,7 @@ enum REFERENCE_MODE { #define REF_FRAMES_LOG2 3 #define REF_FRAMES (1 << REF_FRAMES_LOG2) +#define REF_FRAMES_4K (6) /*4 scratch frames for the new frames to support a maximum of 4 cores decoding *in parallel, 3 for scaled references on the encoder. @@ -1191,7 +1153,7 @@ struct VP9Decoder_s { union param_u s1_param; u8 back_not_run_ready; #endif -} VP9Decoder; +} ; static void resize_context_buffers(struct VP9Decoder_s *pbi, struct VP9_Common_s *cm, int width, int height) @@ -1720,6 +1682,15 @@ static int init_mv_buf_list(struct VP9Decoder_s *pbi) (~0xffff); if (mv_buf_margin > 0) count = REF_FRAMES + mv_buf_margin; + + if (pbi->init_pic_w > 2048 && pbi->init_pic_h > 1088) + count = REF_FRAMES_4K + mv_buf_margin; + + if (debug) { + pr_info("%s w:%d, h:%d, count: %d\n", + __func__, pbi->init_pic_w, pbi->init_pic_h, count); + } + for (i = 0; i < count && i < MV_BUFFER_NUM; i++) { if (alloc_mv_buf(pbi, i, size) < 0) { @@ -2591,7 +2562,7 @@ int vp9_bufmgr_init(struct VP9Decoder_s *pbi, struct BuffInfo_s *buf_spec_i, struct buff_s *mc_buf_i) { struct VP9_Common_s *cm = &pbi->common; - /*memset(pbi, 0, sizeof(struct VP9Decoder));*/ + /*memset(pbi, 0, sizeof(struct VP9Decoder_s));*/ pbi->frame_count = 0; pbi->pic_count = 0; pbi->pre_stream_offset = 0; @@ -2801,7 +2772,7 @@ static u32 max_decoding_time; static u32 error_handle_policy; /*static u32 parser_sei_enable = 1;*/ -static u32 max_buf_num = 12; +static u32 max_buf_num = 10; static u32 run_ready_min_buf_num = 2; @@ -5632,7 +5603,15 @@ static void vp9_init_decoder_hw(struct VP9Decoder_s *pbi, u32 mask) { unsigned int data32; int i; - + const unsigned short parser_cmd[PARSER_CMD_NUMBER] = { + 0x0401, 0x8401, 0x0800, 0x0402, 0x9002, 0x1423, + 0x8CC3, 0x1423, 0x8804, 0x9825, 0x0800, 0x04FE, + 0x8406, 0x8411, 0x1800, 0x8408, 0x8409, 0x8C2A, + 0x9C2B, 0x1C00, 0x840F, 0x8407, 0x8000, 0x8408, + 0x2000, 0xA800, 0x8410, 0x04DE, 0x840C, 0x840D, + 0xAC00, 0xA000, 0x08C0, 0x08E0, 0xA40E, 0xFC00, + 0x7C00 + }; #if 0 if (get_cpu_type() >= MESON_CPU_MAJOR_ID_G12A) { /* Set MCR fetch priorities*/ @@ -6043,8 +6022,6 @@ static void config_mcrcc_axi_hw_new(struct VP9Decoder_s *pbi) #endif -static struct VP9Decoder_s gHevc; - static void free_lf_buf(struct VP9Decoder_s *pbi) { if (pbi->lfi) @@ -8335,11 +8312,14 @@ static int amvdec_vp9_mmu_init(struct VP9Decoder_s *pbi) } return 0; } + +static struct VP9Decoder_s *gHevc; + static int amvdec_vp9_probe(struct platform_device *pdev) { struct vdec_s *pdata = *(struct vdec_s **)pdev->dev.platform_data; struct BUF_s BUF[MAX_BUF_NUM]; - struct VP9Decoder_s *pbi = &gHevc; + struct VP9Decoder_s *pbi; int ret; #ifndef MULTI_INSTANCE_SUPPORT int i; @@ -8347,9 +8327,16 @@ static int amvdec_vp9_probe(struct platform_device *pdev) pr_debug("%s\n", __func__); mutex_lock(&vvp9_mutex); + pbi = vmalloc(sizeof(struct VP9Decoder_s)); + if (pbi == NULL) { + pr_info("\namvdec_vp9 device data allocation failed\n"); + mutex_unlock(&vvp9_mutex); + return -ENOMEM; + } + gHevc = pbi; memcpy(&BUF[0], &pbi->m_BUF[0], sizeof(struct BUF_s) * MAX_BUF_NUM); - memset(pbi, 0, sizeof(VP9Decoder)); + memset(pbi, 0, sizeof(struct VP9Decoder_s)); memcpy(&pbi->m_BUF[0], &BUF[0], sizeof(struct BUF_s) * MAX_BUF_NUM); pbi->init_flag = 0; @@ -8365,6 +8352,7 @@ static int amvdec_vp9_probe(struct platform_device *pdev) pbi->show_frame_num = 0; if (pdata == NULL) { pr_info("\namvdec_vp9 memory resource undefined.\n"); + vfree(pbi); mutex_unlock(&vvp9_mutex); return -EFAULT; } @@ -8374,6 +8362,7 @@ static int amvdec_vp9_probe(struct platform_device *pdev) platform_set_drvdata(pdev, pdata); #endif if (amvdec_vp9_mmu_init(pbi) < 0) { + vfree(pbi); mutex_unlock(&vvp9_mutex); pr_err("vp9 alloc bmmu box failed!!\n"); return -1; @@ -8383,6 +8372,7 @@ static int amvdec_vp9_probe(struct platform_device *pdev) work_buf_size, DRIVER_NAME, &pdata->mem_start); if (ret < 0) { uninit_mmu_buffers(pbi); + vfree(pbi); mutex_unlock(&vvp9_mutex); return ret; } @@ -8429,6 +8419,7 @@ static int amvdec_vp9_probe(struct platform_device *pdev) pr_info("\namvdec_vp9 init failed.\n"); vp9_local_uninit(pbi); uninit_mmu_buffers(pbi); + vfree(pbi); mutex_unlock(&vvp9_mutex); return -ENODEV; } @@ -8442,7 +8433,7 @@ static int amvdec_vp9_probe(struct platform_device *pdev) static int amvdec_vp9_remove(struct platform_device *pdev) { - struct VP9Decoder_s *pbi = &gHevc; + struct VP9Decoder_s *pbi = gHevc; if (debug) pr_info("amvdec_vp9_remove\n"); @@ -8459,7 +8450,7 @@ static int amvdec_vp9_remove(struct platform_device *pdev) pr_info("pts missed %ld, pts hit %ld, duration %d\n", pbi->pts_missed, pbi->pts_hit, pbi->frame_dur); #endif - + vfree(pbi); mutex_unlock(&vvp9_mutex); return 0; @@ -9256,11 +9247,11 @@ static int ammvdec_vp9_probe(struct platform_device *pdev) sizeof(struct VP9Decoder_s), GFP_KERNEL);*/ memset(&vf_dp, 0, sizeof(struct vframe_master_display_colour_s)); pbi = vmalloc(sizeof(struct VP9Decoder_s)); - memset(pbi, 0, sizeof(struct VP9Decoder_s)); if (pbi == NULL) { pr_info("\nammvdec_vp9 device data allocation failed\n"); return -ENOMEM; } + memset(pbi, 0, sizeof(struct VP9Decoder_s)); pdata->private = pbi; pdata->dec_status = vvp9_dec_status; /* pdata->set_trickmode = set_trickmode; */ @@ -9271,10 +9262,8 @@ static int ammvdec_vp9_probe(struct platform_device *pdev) pdata->threaded_irq_handler = vp9_threaded_irq_cb; pdata->dump_state = vp9_dump_state; - - memcpy(&BUF[0], &pbi->m_BUF[0], sizeof(struct BUF_s) * MAX_BUF_NUM); - memset(pbi, 0, sizeof(VP9Decoder)); + memset(pbi, 0, sizeof(struct VP9Decoder_s)); memcpy(&pbi->m_BUF[0], &BUF[0], sizeof(struct BUF_s) * MAX_BUF_NUM); pbi->index = pdev->id; |