author | Zhiqiang Han <zhiqiang.han@amlogic.com> | 2020-03-04 09:41:32 (GMT) |
---|---|---|
committer | Hui Zhang <hui.zhang@amlogic.com> | 2020-03-18 02:42:44 (GMT) |
commit | db34b14b03b48ebdb8c74623dfdc2a6c2880d109 (patch) | |
tree | 988da2263240abbbf1e0b455b457c7d9ca3b97a2 | |
parent | 7a1edaf272020311b4afa10f218f81d26f4fed1b (diff) | |
download | media_modules-db34b14b03b48ebdb8c74623dfdc2a6c2880d109.zip media_modules-db34b14b03b48ebdb8c74623dfdc2a6c2880d109.tar.gz media_modules-db34b14b03b48ebdb8c74623dfdc2a6c2880d109.tar.bz2 |
subtitle: reset subtitle parser in dmx reset [1/1]
PD#SWPL-22300
Problem:
The parser,
will be operated in driver dmx and amstream,
which must be carefully maintained
with its buf ptr.
The reset procedure among dmx and amstream,
destroyed the buf ptr.
Solution:
reset the buf ptr in dmx
Verify:
Patchbuild
Change-Id: Idc080e4bbba1f30d44193a02f23996d3b62f767d
Signed-off-by: Zhiqiang Han <zhiqiang.han@amlogic.com>
-rw-r--r-- | drivers/stream_input/parser/hw_demux/aml_dmx.c | 40 | ||||
-rw-r--r-- | drivers/stream_input/parser/tsdemux.c | 8 |
2 files changed, 41 insertions, 7 deletions
diff --git a/drivers/stream_input/parser/hw_demux/aml_dmx.c b/drivers/stream_input/parser/hw_demux/aml_dmx.c index 4375999..373cc18 100644 --- a/drivers/stream_input/parser/hw_demux/aml_dmx.c +++ b/drivers/stream_input/parser/hw_demux/aml_dmx.c @@ -73,6 +73,7 @@ #define pr_dbg_ss(args...) pr_dbg_flag(0x8, args) #define pr_dbg_irq_ss(args...) pr_dbg_irq_flag(0x8, args) #define pr_dbg_irq_pes(args...) pr_dbg_irq_flag(0x10, args) +#define pr_dbg_irq_sub(args...) pr_dbg_irq_flag(0x20, args) #ifdef PR_ERROR_SPEED_LIMIT static u32 last_pr_error_time; @@ -315,6 +316,7 @@ static int dsc_set_aes_des_sm4_key(struct aml_dsc_channel *ch, int flags, enum ca_cw_type type, u8 *key); static void aml_ci_plus_disable(void); static void am_ci_plus_set_output(struct aml_dsc_channel *ch); +static int set_subtitle_pes_buffer(struct aml_dmx *dmx); static void dmxn_op_chan(int dmx, int ch, int(*op)(int, int), int ch_op) { @@ -1159,8 +1161,10 @@ static void process_sub(struct aml_dmx *dmx) buffer2_virt = (void *)dmx->sub_buf_base_virt + (buffer2 - start_ptr); #endif -// printk("rd_ptr %p buffer1 %p len1 %d buffer2 %p len2 %d buffer1_virt %p buffer2_virt %p\n", -// (void*)rd_ptr, (void*)buffer1, len1, (void*)buffer2, len2, buffer1_virt, buffer2_virt); + pr_dbg_irq_sub("sub: rd_ptr:%x buf1:%x len1:%d buf2:%x len2:%d\n", + rd_ptr, buffer1, len1, buffer2, len2); + pr_dbg_irq_sub("sub: buf1_virt:%p buf2_virt:%p\n", + buffer1_virt, buffer2_virt); if (len1) dma_sync_single_for_cpu(dmx_get_dev(dmx), @@ -3971,7 +3975,7 @@ void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq) (SEC_GRP_LEN_3 << 12)); } #ifdef NO_SUB -#ifdef SUB_BUF_DMX +#ifndef SUB_PARSER if (dmx->sub_pages) { addr = virt_to_phys((void *)dmx->sub_pages); DMX_WRITE_REG(dmx->id, SB_START, addr >> 12); @@ -3992,6 +3996,20 @@ void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq) /*if (chan->used)*/ { +#ifdef NO_SUB +#ifdef SUB_PARSER + /* + check if subtitle channel was running, + the parser will be used in amstream also, + take care of the buff ptr. + */ + u32 v = dmx_get_chan_target(dmx, n); + if (v != 0xFFFF && + (v & (0x7 << PID_TYPE)) + == (SUB_PACKET << PID_TYPE)) + set_subtitle_pes_buffer(dmx); +#endif +#endif dmx_set_chan_regs(dmx, n); } } @@ -4162,7 +4180,7 @@ void dmx_reset_dmx_hw_ex_unlock(struct aml_dvb *dvb, struct aml_dmx *dmx, (SEC_GRP_LEN_3 << 12)); } #ifdef NO_SUB -#ifdef SUB_BUF_DMX +#ifndef SUB_PARSER if (dmx->sub_pages) { addr = virt_to_phys((void *)dmx->sub_pages); DMX_WRITE_REG(dmx->id, SB_START, addr >> 12); @@ -4183,6 +4201,20 @@ void dmx_reset_dmx_hw_ex_unlock(struct aml_dvb *dvb, struct aml_dmx *dmx, /*if (chan->used)*/ { +#ifdef NO_SUB +#ifdef SUB_PARSER + /* + check if subtitle channel was running, + the parser will be used in amstream also, + take care of the buff ptr. + */ + u32 v = dmx_get_chan_target(dmx, n); + if (v != 0xFFFF && + (v & (0x7 << PID_TYPE)) + == (SUB_PACKET << PID_TYPE)) + set_subtitle_pes_buffer(dmx); +#endif +#endif dmx_set_chan_regs(dmx, n); } } diff --git a/drivers/stream_input/parser/tsdemux.c b/drivers/stream_input/parser/tsdemux.c index 2a02178..e3f61fe 100644 --- a/drivers/stream_input/parser/tsdemux.c +++ b/drivers/stream_input/parser/tsdemux.c @@ -597,9 +597,11 @@ s32 tsdemux_init(u32 vid, u32 aid, u32 sid, u32 pcrid, bool is_hevc, WRITE_AIU_REG(AIU_MEM_AIFIFO_BUF_CNTL, MEM_BUFCTRL_INIT); CLEAR_AIU_REG_MASK(AIU_MEM_AIFIFO_BUF_CNTL, MEM_BUFCTRL_INIT); - WRITE_PARSER_REG(PARSER_SUB_START_PTR, parser_sub_start_ptr); - WRITE_PARSER_REG(PARSER_SUB_END_PTR, parser_sub_end_ptr); - WRITE_PARSER_REG(PARSER_SUB_RP, parser_sub_rp); + if (!enable_demux_driver()) { + WRITE_PARSER_REG(PARSER_SUB_START_PTR, parser_sub_start_ptr); + WRITE_PARSER_REG(PARSER_SUB_END_PTR, parser_sub_end_ptr); + WRITE_PARSER_REG(PARSER_SUB_RP, parser_sub_rp); + } SET_PARSER_REG_MASK(PARSER_ES_CONTROL, (7 << ES_SUB_WR_ENDIAN_BIT) | ES_SUB_MAN_RD_PTR); |