From b3545fa4cf6d0abef6ed563f58ba7cbc96b7b97f Mon Sep 17 00:00:00 2001 From: chuangcheng peng Date: Mon, 18 Dec 2023 11:18:30 +0800 Subject: [PATCH] demux: split dvr normal & secure with same sid [1/1] PD#SWPL-149279 Problem: same sid record with normal & secure memory Solution: split dvr normal & secure with same sid Verify: verified at sc2 Change-Id: I95af50fab8c4454a143fea55f026b95ec42a2178 Signed-off-by: chuangcheng peng --- drivers/dvb/demux/aml_dmx.c | 9 +++++---- drivers/dvb/demux/sc2_demux/ts_output.c | 6 +++--- drivers/dvb/demux/sc2_demux/ts_output.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/dvb/demux/aml_dmx.c b/drivers/dvb/demux/aml_dmx.c index b18ec442b..cfac783ce 100644 --- a/drivers/dvb/demux/aml_dmx.c +++ b/drivers/dvb/demux/aml_dmx.c @@ -1102,7 +1102,7 @@ static int _dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, sec_level = (filter->params.pes.flags >> 10) & 0x7; - if (demux->source == INPUT_LOCAL_SEC) + if (demux->source == INPUT_LOCAL_SEC && format != DVR_FORMAT) sec_level = local_sec_level; feed->type = type; @@ -1124,7 +1124,7 @@ static int _dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, } if (format == DVR_FORMAT) { - feed->ts_out_elem = ts_output_find_dvr(sid); + feed->ts_out_elem = ts_output_find_dvr(sid, demux->sec_dvr_size ? 1 : 0); if (feed->ts_out_elem) { pr_dbg("find same pid elem:0x%lx\n", (unsigned long)(feed->ts_out_elem)); @@ -1160,7 +1160,6 @@ static int _dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, if (demux->sec_dvr_size != 0 && format == DVR_FORMAT) { ts_output_set_sec_mem(feed->ts_out_elem, demux->sec_dvr_buff, demux->sec_dvr_size); - demux->sec_dvr_size = 0; sec_level = 1; } if (sec_level != 0) @@ -1777,8 +1776,10 @@ static int _dmx_release_ts_feed(struct dmx_demux *dmx, if (feed->pid == 0x2000) ts_output_remove_pid(feed->ts_out_elem, 0x1fff); ret = ts_output_close(feed->ts_out_elem); - if (ret == 0) + if (ret == 0) { demux->dvr_ts_output = NULL; + demux->sec_dvr_size = 0; + } } else { ts_output_close(feed->ts_out_elem); } diff --git a/drivers/dvb/demux/sc2_demux/ts_output.c b/drivers/dvb/demux/sc2_demux/ts_output.c index 92b203888..a2455e9cf 100644 --- a/drivers/dvb/demux/sc2_demux/ts_output.c +++ b/drivers/dvb/demux/sc2_demux/ts_output.c @@ -2671,7 +2671,7 @@ struct out_elem *ts_output_find_same_section_pid(int sid, int pid) return NULL; } -struct out_elem *ts_output_find_dvr(int sid) +struct out_elem *ts_output_find_dvr(int sid, int sec_level) { int i = 0; @@ -2679,9 +2679,9 @@ struct out_elem *ts_output_find_dvr(int sid) struct out_elem *pout = &out_elem_table[i]; if (pout->used && - pout->sid == sid && pout->format == DVR_FORMAT) { + pout->sid == sid && pout->format == DVR_FORMAT && + pout->pchan && pout->pchan->sec_level == sec_level) return pout; - } } return NULL; } diff --git a/drivers/dvb/demux/sc2_demux/ts_output.h b/drivers/dvb/demux/sc2_demux/ts_output.h index b756c009f..59366ea2c 100644 --- a/drivers/dvb/demux/sc2_demux/ts_output.h +++ b/drivers/dvb/demux/sc2_demux/ts_output.h @@ -186,7 +186,7 @@ int ts_output_add_cb(struct out_elem *pout, ts_output_cb cb, void *udata, int ts_output_remove_cb(struct out_elem *pout, ts_output_cb cb, void *udata, u8 cb_id, bool is_sec); -struct out_elem *ts_output_find_dvr(int sid); +struct out_elem *ts_output_find_dvr(int sid, int sec_level); int ts_output_sid_debug(void); int ts_output_dump_info(char *buf);