dvbsi4j uses dual license, GPL or commercial license.
dvbsi4j is an efficient and scalable Java-based software SDK. This will make the analysis of PSI SI of digital TV more simple and intuitive. RD can be liberated from the heavy PSI SI table analysis and only need to focus on business logic .
dvbsi4j can simply analyze the general syntax in DTV SPEC and generate SDK. Current support bellow DTV SPEC,You can simply extend it.
- 13818
- ETSI EN 300 468
- ETSI TS 102 809
- ETSI TS 102 812
- DTG D-Book
- ETSI TR 101 202
- Polsat_stb
- DVB-SI Extension For TURKSAT
Please see DVB Syntax for detail. Here is sample for create SDK GeneratorSDK
User can customize the PID filters easily for runtime usage.
dvbConfig.json is a configuration file in json format, you can configure PID Table ID filter here, and you can change it through API at runtime. please reference DecodePATPMT.java for detail, this example show how to set PMT PID filter after receive PAT.
/**
* <code>
* program_association_section () { - ❶ root node
* table_id 8 uimsbf
* section_syntax_indicator 1 bslbf
* noused 1 bslbf
* reserved 2 bslbf
* section_length 12 uimsbf
* transport_stream_id 16 uimsbf
* reserved 2 bslbf
* version_number 5 uimsbf
* current_next_indicator 1 bslbf
* section_number 8 uimsbf
* last_section_number 8 uimsbf
*
* for (i=0; i<N;i++) /*programs* / { - ❷ default named programs
* user can change it in syntax
* program_number 16 uimsbf - ❸
* reserved 3 bslbf
* if(program_number == 0x0) {
* network_PID 13 uimsbf
* }
* else {
* program_map_PID 13 uimsbf - ❹
* }
* }
*
* CRC_32 32 rpchof
* }
* </code>
*/
log.info("\n" + section.dumpTextResult());
log.info("\n" + section.dumpSectionRawPacket());
List<NodeValue> root = (List<NodeValue>) section.getRoot(); /* ❶ */
List<NodeValue> programsNodeList = TSUtil.getObjectByName(root, "programs"); /* ❷ */
/** loop each program in programs */
for (NodeValue _programNode : programsNodeList) {
List<NodeValue> program = _programNode.getValue();
int program_number = TSUtil.getObjectByName(program, "program_number"); /* ❸ */
if (program_number != 0) {
int program_map_PID = TSUtil.getObjectByName(program, "program_map_PID"); /** ❹ */
/** dynamic set PMT PID filter */
section.getBitStream().getPIDFilter().addPidFilter(program_map_PID, "PMT pid=>" + program_map_PID);
}
}
Sample text result from DecodePATPMT.java :
DecodePATPMT:88
table_id 0 [0x0 ]
section_syntax_indicator 1 [0x1 ]
noused 0 [0x0 ]
reserved 3 [0x3 ]
section_length 37 [0x25 ]
transport_stream_id 32778 [0x800A ]
reserved 3 [0x3 ]
version_number 5 [0x5 ]
current_next_indicator 1 [0x1 ]
section_number 0 [0x0 ]
last_section_number 0 [0x0 ]
programs /* ❷ */
program
program_number 0 [0x0 ]
reserved 7 [0x7 ]
network_PID 16 [0x10 ]
program
program_number 33984 [0x84C0 ]
reserved 7 [0x7 ]
program_map_PID 1020 [0x3FC ]
program
program_number 33472 [0x82C0 ]
reserved 7 [0x7 ]
program_map_PID 1030 [0x406 ]
program
program_number 34048 [0x8500 ]
reserved 7 [0x7 ]
program_map_PID 1040 [0x410 ]
program
program_number 33664 [0x8380 ]
reserved 7 [0x7 ]
program_map_PID 1060 [0x424 ]
program
program_number 32842 [0x804A ]
reserved 7 [0x7 ]
program_map_PID 1010 [0x3F2 ]
program
program_number 34112 [0x8540 ]
reserved 7 [0x7 ]
program_map_PID 1070 [0x42E ]
CRC_32 3893584241 [0xE8136171 ]