Skip to content

Commit

Permalink
[Updated] Moved alternate ca handling to user UI
Browse files Browse the repository at this point in the history
  • Loading branch information
DimitarCC authored and Huevos committed Oct 5, 2024
1 parent 14cb9bf commit 5303894
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 24 deletions.
2 changes: 0 additions & 2 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,6 @@ fi

if test "$BOXTYPE" == "dm920"; then
AC_DEFINE(DM920, 1, [Dreambox hardware])
AC_DEFINE(USE_ALTERNATE_CA_HANDLING, 1,[define it so to use additional ca device freeing])
fi

if test `echo "$BOXTYPE" | cut -b 1-2` == "gb"; then
Expand Down Expand Up @@ -486,7 +485,6 @@ fi
if test "$BOXTYPE" == "pulse4k" -o "$BOXTYPE" == "pulse4kmini" -o "$BOXTYPE" == "hd61"; then
AC_DEFINE(HAVE_HISILICON, 1,[define add HISILICON chip])
AC_DEFINE(FORCE_NO_BLENDING_ACCELERATION, 1,[define when the framebuffer acceleration has alphablending support, but detection slow down all])
AC_DEFINE(USE_ALTERNATE_CA_HANDLING, 1,[define it so to use additional ca device freeing])
fi

if test "$BOXTYPE" == "u5" -o "$BOXTYPE" == "u5pvr" -o "$BOXTYPE" == "u51" -o "$BOXTYPE" == "u52" -o "$BOXTYPE" == "u53" -o "$BOXTYPE" == "u532" -o "$BOXTYPE" == "u533" -o "$BOXTYPE" == "u54" -o "$BOXTYPE" == "u55" -o "$BOXTYPE" == "u56" -o "$BOXTYPE" == "u57" -o "$BOXTYPE" == "u571" -o "$BOXTYPE" == "u41" -o "$BOXTYPE" == "u42" -o "$BOXTYPE" == "u43"; then
Expand Down
29 changes: 13 additions & 16 deletions lib/dvb_ci/descrambler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,50 +133,47 @@ int descrambler_set_key(int& desc_fd, eDVBCISlot *slot, int parity, unsigned cha
return 0;
}

int descrambler_set_pid(int desc_fd, int index, int enable, int pid)
int descrambler_set_pid(int desc_fd, eDVBCISlot *slot, int enable, int pid)
{
struct ca_pid p = {};
unsigned int flags = 0x80;
eDebug("[CI descrambler]1 index: %x enable: %x pid: %x", index, enable, pid);
eDebug("[CI descrambler]1 index: %x enable: %x pid: %x", slot->getSlotID(), enable, pid);
if (desc_fd < 0)
return -1;

if (index)
if (slot->getSlotID())
flags |= 0x40;

if (enable)
flags |= 0x20;

p.pid = pid;
p.index = flags;
eDebug("[CI descrambler]2 index: %x enable: %x flags: %x pid: %x", index, enable, flags, pid);
eDebug("[CI descrambler]2 index: %x enable: %x flags: %x pid: %x", slot->getSlotID(), enable, flags, pid);
if (ioctl(desc_fd, CA_SET_PID, &p) == -1) {
#ifdef USE_ALTERNATE_CA_HANDLING
return 0;
#else
eWarning("[CI%d descrambler] set pid failed", index);
if (slot->getDescramblingOptions() > 0)
return 0;
eWarning("[CI%d descrambler] set pid failed", slot->getSlotID());
return -1;
#endif
}

return 0;
}

int descrambler_init(int slot, uint8_t ca_demux_id)
int descrambler_init(eDVBCISlot *slot, uint8_t ca_demux_id)
{
int desc_fd;

#ifdef USE_ALTERNATE_CA_HANDLING
std::string filename = "/dev/dvb/adapter0/ca" + std::to_string(ca_demux_id + 1);
#else
std::string filename = "/dev/dvb/adapter0/ca" + std::to_string(ca_demux_id);
#endif

if (slot->getDescramblingOptions() > 1)
filename = "/dev/dvb/adapter0/ca" + std::to_string(ca_demux_id + 1);

desc_fd = open(filename.c_str(), O_RDWR | O_NONBLOCK | O_CLOEXEC);
if (desc_fd == -1) {
eWarning("[CI%d descrambler] can not open %s", slot, filename.c_str());
eWarning("[CI%d descrambler] can not open %s", slot->getSlotID(), filename.c_str());
}
eDebug("[CI%d descrambler] using ca device %s", slot, filename.c_str());
eDebug("[CI%d descrambler] using ca device %s", slot->getSlotID(), filename.c_str());

return desc_fd;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/dvb_ci/descrambler.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

#include <lib/dvb_ci/dvbci.h>

int descrambler_init(int slot, uint8_t ca_demux_id);
int descrambler_init(eDVBCISlot *slot, uint8_t ca_demux_id);
void descrambler_deinit(int desc_fd);
int descrambler_set_key(int& desc_fd, eDVBCISlot *slot, int parity, unsigned char *data);
int descrambler_set_pid(int desc_fd, int index, int enable, int pid);
int descrambler_set_pid(int desc_fd, eDVBCISlot *slot, int enable, int pid);

#endif
4 changes: 4 additions & 0 deletions lib/dvb_ci/dvbci.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1397,6 +1397,10 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr)
snprintf(config_key_operator_profile, 255, "config.ci.%d.disable_operator_profile", slotid);
bool operator_profile_disabled = eSimpleConfig::getBool(config_key_operator_profile, false);
m_operator_profiles_disabled = operator_profile_disabled;
char config_key_alt_ca[255];
snprintf(config_key_alt_ca, 255, "config.ci.%d.alternative_ca_handling", slotid);
int alt_ca = eSimpleConfig::getInt(config_key_alt_ca, 0);
m_alt_ca_handling = alt_ca;
if (enabled)
openDevice();
else
Expand Down
2 changes: 2 additions & 0 deletions lib/dvb_ci/dvbci.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ class eDVBCISlot: public iObject, public sigc::trackable
eMainloop *m_context;
int m_ciplus_routing_tunernum;
bool m_operator_profiles_disabled;
int m_alt_ca_handling;
std::string m_ciplus_routing_input;
std::string m_ciplus_routing_ci_input;

Expand Down Expand Up @@ -129,6 +130,7 @@ class eDVBCISlot: public iObject, public sigc::trackable
int getSlotID();
int getNumOfServices();
int getVersion();
int getDescramblingOptions() { return m_alt_ca_handling; };
bool getIsOperatorProfileDisabled() { return m_operator_profiles_disabled; };
int16_t getCADemuxID() { return m_ca_demux_id; };
int getTunerNum() { return m_tunernum; };
Expand Down
11 changes: 7 additions & 4 deletions lib/dvb_ci/dvbci_ccmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ void eDVBCICcSession::addProgram(uint16_t program_number, std::vector<uint16_t>&
eDebugNoNewLine("\n");

for (std::vector<uint16_t>::iterator it = pids.begin(); it != pids.end(); ++it)
descrambler_set_pid(m_descrambler_fd, m_slot->getSlotID(), 1, *it);
descrambler_set_pid(m_descrambler_fd, m_slot, 1, *it);
}

void eDVBCICcSession::removeProgram(uint16_t program_number, std::vector<uint16_t>& pids)
Expand All @@ -150,7 +150,10 @@ void eDVBCICcSession::removeProgram(uint16_t program_number, std::vector<uint16_
eDebugNoNewLine("\n");

for (std::vector<uint16_t>::iterator it = pids.begin(); it != pids.end(); ++it)
descrambler_set_pid(m_descrambler_fd, m_slot->getSlotID(), 0, *it);
descrambler_set_pid(m_descrambler_fd, m_slot, 0, *it);

if (m_slot->getDescramblingOptions() == 1 || m_slot->getDescramblingOptions() == 3)
descrambler_deinit(m_descrambler_fd);

// removing program means probably decoding on this slot is ending. So mark this slot as not descrambling
eDVBCI_UI::getInstance()->setDecodingState(m_slot->getSlotID(), 0);
Expand Down Expand Up @@ -800,13 +803,13 @@ void eDVBCICcSession::set_descrambler_key()
if (m_descrambler_fd != -1 && m_current_ca_demux_id != m_slot->getCADemuxID())
{
descrambler_deinit(m_descrambler_fd);
m_descrambler_fd = descrambler_init(m_slot->getSlotID(), m_slot->getCADemuxID());
m_descrambler_fd = descrambler_init(m_slot, m_slot->getCADemuxID());
m_current_ca_demux_id = m_slot->getCADemuxID();
}

if (m_descrambler_fd == -1 && m_slot->getCADemuxID() > -1)
{
m_descrambler_fd = descrambler_init(m_slot->getSlotID(), m_slot->getCADemuxID());
m_descrambler_fd = descrambler_init(m_slot, m_slot->getCADemuxID());
m_current_ca_demux_id = m_slot->getCADemuxID();
}

Expand Down
2 changes: 2 additions & 0 deletions lib/python/Screens/Ci.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ def InitCiConfig():
config.ci[slot].static_pin = ConfigPIN(default=0)
config.ci[slot].show_ci_messages = ConfigYesNo(default=True)
config.ci[slot].disable_operator_profile = ConfigYesNo(default=False)
config.ci[slot].alternative_ca_handling = ConfigSelection(choices=[(0, _("off")), (1, _("Close CA device at programm end")), (2, _("Offset CA device index")), (3, _("Offset and close CA device"))], default=0)
if SystemInfo["CI%dSupportsHighBitrates" % slot]:
with open("/proc/stb/tsmux/ci%d_tsclk_choices" % slot) as fd:
procChoices = fd.read().strip()
Expand Down Expand Up @@ -474,6 +475,7 @@ def appendEntries(self, slot, state):
self.list.append((_("Reset persistent PIN code"), ConfigNothing(), 6, slot))
self.list.append(getConfigListEntry(_("Show CI messages"), config.ci[slot].show_ci_messages, 3, slot))
self.list.append(getConfigListEntry(_("Disable operator profiles"), config.ci[slot].disable_operator_profile, 3, slot))
self.list.append(getConfigListEntry(_("Descrambling options") + " *", config.ci[slot].alternative_ca_handling, 3, slot))
self.list.append(getConfigListEntry(_("Multiple service support"), config.ci[slot].canDescrambleMultipleServices, 3, slot))
if SystemInfo["CI%dSupportsHighBitrates" % slot]:
self.list.append(getConfigListEntry(_("High bitrate support"), config.ci[slot].highBitrate))
Expand Down

0 comments on commit 5303894

Please sign in to comment.