Fixed handling the "CA PMT" generation

This commit is contained in:
Klaus Schmidinger 2010-01-01 13:38:02 +01:00
parent 2b7c81f72d
commit 39f1ba7e03
2 changed files with 9 additions and 10 deletions

View File

@ -6197,7 +6197,7 @@ Video Disk Recorder Revision History
- Fixed the default value for "Pause key handling" in the MANUAL (reported by - Fixed the default value for "Pause key handling" in the MANUAL (reported by
Diego Pierotto). Diego Pierotto).
2009-12-31: Version 1.7.11 2010-01-01: Version 1.7.11
- Fixed resetting the file size when regenerating the index file. - Fixed resetting the file size when regenerating the index file.
- The new function cDevice::PatPmtParser() can be used in derived devices to access - The new function cDevice::PatPmtParser() can be used in derived devices to access
@ -6240,3 +6240,5 @@ Video Disk Recorder Revision History
to view live or recorded video. If the plugin is not loaded, the card will to view live or recorded video. If the plugin is not loaded, the card will
be treated like a budget DVB card, and there will be no OSD or viewing be treated like a budget DVB card, and there will be no OSD or viewing
capability. capability.
- Fixed handling the "CA PMT" generation (revised a change not mentioned in version
1.7.9's changes, which caused a malfunction with Conax and Viaccess CAMs).

15
ci.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: ci.c 2.4 2009/12/05 15:51:12 kls Exp $ * $Id: ci.c 2.5 2010/01/01 13:38:02 kls Exp $
*/ */
#include "ci.h" #include "ci.h"
@ -610,10 +610,8 @@ cCiCaPmt::cCiCaPmt(uint8_t CmdId, int Source, int Transponder, int ProgramNumber
capmt[length++] = 0x01; // version_number, current_next_indicator - apparently vn doesn't matter, but cni must be 1 capmt[length++] = 0x01; // version_number, current_next_indicator - apparently vn doesn't matter, but cni must be 1
esInfoLengthPos = length; esInfoLengthPos = length;
capmt[length++] = 0x00; // program_info_length H (at program level) capmt[length++] = 0x00; // program_info_length H (at program level)
capmt[length++] = 0x01; // program_info_length L capmt[length++] = 0x00; // program_info_length L
capmt[length++] = cmdId; AddCaDescriptors(caDescriptorsLength, caDescriptors);
if (caDescriptorsLength > 0)
AddCaDescriptors(caDescriptorsLength, caDescriptors);
} }
void cCiCaPmt::SetListManagement(uint8_t ListManagement) void cCiCaPmt::SetListManagement(uint8_t ListManagement)
@ -632,10 +630,8 @@ void cCiCaPmt::AddPid(int Pid, uint8_t StreamType)
capmt[length++] = Pid & 0xFF; capmt[length++] = Pid & 0xFF;
esInfoLengthPos = length; esInfoLengthPos = length;
capmt[length++] = 0x00; // ES_info_length H (at ES level) capmt[length++] = 0x00; // ES_info_length H (at ES level)
capmt[length++] = 0x01; // ES_info_length L capmt[length++] = 0x00; // ES_info_length L
capmt[length++] = cmdId; AddCaDescriptors(caDescriptorsLength, caDescriptors);
if (caDescriptorsLength > 0)
AddCaDescriptors(caDescriptorsLength, caDescriptors);
} }
} }
@ -643,6 +639,7 @@ void cCiCaPmt::AddCaDescriptors(int Length, const uint8_t *Data)
{ {
if (esInfoLengthPos) { if (esInfoLengthPos) {
if (length + Length <= int(sizeof(capmt))) { if (length + Length <= int(sizeof(capmt))) {
capmt[length++] = cmdId;
memcpy(capmt + length, Data, Length); memcpy(capmt + length, Data, Length);
length += Length; length += Length;
int l = length - esInfoLengthPos - 2; int l = length - esInfoLengthPos - 2;