[libdvbpsi-devel] [Git][videolan/libdvbpsi][master] 7 commits: chain: reword description
Jean-Paul Saman
gitlab at videolan.org
Fri Dec 8 14:18:52 CET 2017
Jean-Paul Saman pushed to branch master at VideoLAN / libdvbpsi
Commits:
ed25b9aa by Jean-Paul Saman at 2017-07-12T10:12:37+02:00
chain: reword description
- - - - -
302f8bc9 by Jean-Paul Saman at 2017-10-04T18:33:36+02:00
src/chain.h: improve comment
- - - - -
c7a82a0c by Jean-Paul Saman at 2017-10-04T18:33:36+02:00
dvbinfo: fix bugs that prevented multicast from working
- - - - -
68f2ca7b by Jean-Paul Saman at 2017-10-04T18:33:36+02:00
dvbinfo: translate teletext magazine number 0 (means 8)
- - - - -
0d9b071b by Jean-Paul Saman at 2017-11-08T13:56:25+01:00
SIS: refactor common splice command decoding code
- - - - -
fe26249a by Jean-Paul Saman at 2017-11-08T15:44:28+01:00
SIS: generate all SCTE35 commands
- - - - -
78075625 by Jean-Paul Saman at 2017-12-08T13:20:54+01:00
descriptor: 0x41: correct max service count
- - - - -
6 changed files:
- examples/dvbinfo/libdvbpsi.c
- examples/dvbinfo/udp.c
- src/chain.h
- src/descriptors/dvb/dr_41.c
- src/descriptors/dvb/dr_41.h
- src/tables/sis.c
Changes:
=====================================
examples/dvbinfo/libdvbpsi.c
=====================================
--- a/examples/dvbinfo/libdvbpsi.c
+++ b/examples/dvbinfo/libdvbpsi.c
@@ -1419,7 +1419,8 @@ static void DumpTeletextDescriptor(const void *p_descriptor)
p_teletext_descriptor->p_pages[i].i_iso6392_language_code[1],
p_teletext_descriptor->p_pages[i].i_iso6392_language_code[2]);
printf("\t\tteletext type : %d\n", p_teletext_descriptor->p_pages[i].i_teletext_type);
- printf("\t\tteletext magazine : %d\n", p_teletext_descriptor->p_pages[i].i_teletext_magazine_number);
+ printf("\t\tteletext magazine : %d\n", p_teletext_descriptor->p_pages[i].i_teletext_magazine_number ?
+ p_teletext_descriptor->p_pages[i].i_teletext_magazine_number : 8 );
printf("\t\tteletext page : %d\n", p_teletext_descriptor->p_pages[i].i_teletext_page_number);
}
}
@@ -2211,7 +2212,7 @@ static void handle_atsc_MGT(void *p_data, dvbpsi_atsc_mgt_t *p_mgt)
ts_atsc_eit_t *p = calloc(1, sizeof(ts_atsc_eit_t));
if (p)
{
- /* PMT */
+ /* EIT */
p->handle = dvbpsi_new(&dvbpsi_message, p_stream->level);
if (p->handle == NULL)
{
=====================================
examples/dvbinfo/udp.c
=====================================
--- a/examples/dvbinfo/udp.c
+++ b/examples/dvbinfo/udp.c
@@ -284,16 +284,17 @@ int udp_open(const char *interface, const char *ipaddress, int port)
continue;
}
- const struct sockaddr_storage *saddr = (const struct sockaddr_storage *)&ptr->ai_addr;
- if (is_multicast(saddr, ptr->ai_addrlen) &&
- mcast_connect(s_ctl, interface, saddr, ptr->ai_addrlen))
+ const struct sockaddr_storage *saddr = (const struct sockaddr_storage *)ptr->ai_addr;
+ if (is_multicast(saddr, ptr->ai_addrlen))
{
- close(s_ctl);
- s_ctl = -1;
- perror("mcast connect error");
- continue;
+ if (!mcast_connect(s_ctl, interface, saddr, ptr->ai_addrlen))
+ {
+ close(s_ctl);
+ s_ctl = -1;
+ perror("mcast connect error");
+ continue;
+ }
}
-
break;
}
=====================================
src/chain.h
=====================================
--- a/src/chain.h
+++ b/src/chain.h
@@ -42,17 +42,18 @@
* - dvbpsi_Demux | no replacement -
* - dvbpsi_demuxGetSubDecoder | @see dvbpsi_decoder_chain_get -
* - dvbpsi_NewDemuxSubDecoder | no replacement -
- * - dvbpsi_AttachDemuxSubDecoder | no replacement -
- * - dvbspi_DetachDemuxSubDecoder | no replacement -
+ * - dvbpsi_AttachDemuxSubDecoder | @see dvbpsi_decoder_chain_add -
+ * - dvbspi_DetachDemuxSubDecoder | @see dvbpsi_decoder_chain_remove -
* -----------------------------------------------------------------------------------
*
* Note that for dvbpsi_Demux(), dvbpsi_NewDemuxSubDecoder(), dvbpsi_AttachDemuxSubDecoder(),
* and dvbspi_DetachDemuxSubDecoder() no replacement API is available. These functions are
* discontinued since the dvbpsi_subdec_t indirection has been removed. A dvbpsi_decoder_t
- * can be added in a demux chain directly. It is important to use the API call
- * dvbpsi_demux_chain_new(), since that will install the callback function
- * dvbpsi_decoder_chain_demux(). This will do the same job dvbpsi_Demux() function had in
- * the subsdecoder architecture of demux.h.
+ * can be added in a demux chain directly using dvbpsi_decoder_chain_add() or removed using
+ * dvbpsi_decoder_chain_remove() API.
+ * It is IMPORTANT to use the API call dvbpsi_demux_chain_new(), since that will install
+ * the callback function dvbpsi_decoder_chain_demux(). This will do the same job dvbpsi_Demux()
+ * function had in the subsdecoder architecture of demux.h.
*/
#ifndef _DVBPSI_CHAIN_H_
@@ -131,7 +132,7 @@ bool dvbpsi_decoder_chain_remove(dvbpsi_t *p_dvbpsi, const dvbpsi_decoder_t *p_d
* \param p_dvbpsi pointer to dvbpsi_t handle
* \param table_id PSI table id to get
* \param extension PSI subtable id to get
- * \return true on success, false on failure
+ * \return returns pointer to dvbpsi_decoder_t on success, or NULL on failure
*/
dvbpsi_decoder_t *dvbpsi_decoder_chain_get(dvbpsi_t *p_dvbpsi, const uint16_t table_id, const uint16_t extension);
=====================================
src/descriptors/dvb/dr_41.c
=====================================
--- a/src/descriptors/dvb/dr_41.c
+++ b/src/descriptors/dvb/dr_41.c
@@ -39,6 +39,8 @@
#include "dr_41.h"
+#define DVBPSI_SLS_DR_MAX (84)
+
/*****************************************************************************
* dvbpsi_decode_dvb_service_list_dr
*****************************************************************************/
@@ -59,7 +61,7 @@ dvbpsi_dvb_service_list_dr_t* dvbpsi_decode_dvb_service_list_dr(
unsigned int service_count = p_descriptor->i_length / 3;
if ((p_descriptor->i_length < 1) ||
(p_descriptor->i_length % 3 != 0) ||
- (service_count>63))
+ (service_count > DVBPSI_SLS_DR_MAX - 1))
return NULL;
/* Allocate memory */
@@ -91,7 +93,7 @@ dvbpsi_descriptor_t * dvbpsi_gen_dvb_service_list_dr(
bool b_duplicate)
{
/* Check the length */
- if (p_decoded->i_service_count > 63)
+ if (p_decoded->i_service_count > DVBPSI_SLS_DR_MAX - 1)
return NULL;
/* Create the descriptor */
=====================================
src/descriptors/dvb/dr_41.h
=====================================
--- a/src/descriptors/dvb/dr_41.h
+++ b/src/descriptors/dvb/dr_41.h
@@ -59,7 +59,7 @@ typedef struct dvbpsi_dvb_service_list_dr_s
struct dvbpsi_service_list_service_s {
uint16_t i_service_id; /*!< service id */
uint8_t i_service_type; /*!< service type */
- } i_service[64]; /*!< array of services */
+ } i_service[84]; /*!< array of services */
} dvbpsi_dvb_service_list_dr_t;
=====================================
src/tables/sis.c
=====================================
--- a/src/tables/sis.c
+++ b/src/tables/sis.c
@@ -411,6 +411,54 @@ void dvbpsi_sis_sections_gather(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t * p_sec
}
}
+
+/*****************************************************************************
+ * dvbpsi_sis_utc_splice_time
+ *****************************************************************************
+ * extract UTC time
+ *****************************************************************************/
+static inline uint64_t dvbpsi_sis_utc_splice_time(uint8_t *p_data)
+{
+ return (((uint32_t)p_data[0] << 24) |
+ ((uint32_t)p_data[1] << 16) |
+ ((uint32_t)p_data[2] << 8) |
+ (uint32_t)p_data[3]);
+}
+
+/*****************************************************************************
+ * dvbpsi_sis_splice_time
+ *****************************************************************************
+ * decode splice time in 90kHz clock
+ *****************************************************************************/
+static void dvbpsi_sis_splice_time(uint8_t *p_data, dvbpsi_sis_splice_time_t *p_splice_time)
+{
+ p_splice_time->b_time_specified_flag = (p_data[0] & 0x80);
+ if (p_splice_time->b_time_specified_flag) {
+ p_splice_time->i_pts_time =
+ (((uint64_t)(p_data[0] & 0x01) << 32) |
+ ((uint64_t)p_data[1] << 24) |
+ ((uint64_t)p_data[2] << 16) |
+ ((uint64_t)p_data[3] << 8) |
+ (uint64_t)p_data[4]);
+ }
+}
+
+/*****************************************************************************
+ * dvbpsi_sis_break_duration
+ *****************************************************************************
+ * * decode break duration in 90kHz clock
+ *****************************************************************************/
+static void dvbpsi_sis_break_duration(uint8_t *p_data, dvbpsi_sis_break_duration_t *p_break_duration)
+{
+ p_break_duration->b_auto_return = (p_data[0] & 0x80);
+ p_break_duration->i_duration =
+ ((((uint64_t)p_data[0] & 0x01) << 32) |
+ ((uint64_t)p_data[1] << 24) |
+ ((uint64_t)p_data[2] << 16) |
+ ((uint64_t)p_data[3] << 8) |
+ (uint64_t)p_data[4]);
+}
+
/*****************************************************************************
* dvbpsi_sis_cmd_splice_insert_decode
*****************************************************************************
@@ -454,16 +502,9 @@ static dvbpsi_sis_cmd_splice_insert_t *
goto error;
/* splice_time () */
- p_cmd->i_splice_time.b_time_specified_flag = (p_data[pos] & 0x80);
- if (p_cmd->i_splice_time.b_time_specified_flag) {
- p_cmd->i_splice_time.i_pts_time =
- (((uint64_t)(p_data[pos] & 0x01) << 32) |
- ((uint64_t)p_data[pos + 1] << 24) |
- ((uint64_t)p_data[pos + 2] << 16) |
- ((uint64_t)p_data[pos + 3] << 8) |
- (uint64_t)p_data[pos + 4]);
+ dvbpsi_sis_splice_time(&p_data[pos], &p_cmd->i_splice_time);
+ if (p_cmd->i_splice_time.b_time_specified_flag)
pos += 5;
- }
else
pos++;
p_cmd->i_splice_time.p_next = NULL;
@@ -475,7 +516,7 @@ static dvbpsi_sis_cmd_splice_insert_t *
i_needed += p_data[pos] * 6;
else
i_needed += p_data[pos];
- if (i_needed + pos >+ i_length)
+ if (i_needed + pos >= i_length)
goto error;
p_cmd->i_component_count = p_data[pos];
@@ -493,16 +534,9 @@ static dvbpsi_sis_cmd_splice_insert_t *
p_splice_time->i_component_tag = p_data[pos++];
if (!p_cmd->b_splice_immediate_flag) {
/* splice_time */
- p_splice_time->i_splice_time.b_time_specified_flag = (p_data[pos] & 0x80);
- if (p_splice_time->i_splice_time.b_time_specified_flag) {
- p_splice_time->i_splice_time.i_pts_time =
- (((uint64_t)(p_data[pos] & 0x01) << 32) |
- ((uint64_t)p_data[pos + 1] << 24) |
- ((uint64_t)p_data[pos + 2] << 16) |
- ((uint64_t)p_data[pos + 3] << 8) |
- (uint64_t)p_data[pos + 4]);
+ dvbpsi_sis_splice_time(&p_data[pos], &p_splice_time->i_splice_time);
+ if (p_splice_time->i_splice_time.b_time_specified_flag)
pos += 5;
- }
else
pos++;
}
@@ -518,13 +552,7 @@ static dvbpsi_sis_cmd_splice_insert_t *
}
if (p_cmd->b_duration_flag) {
/* break duration */
- p_cmd->i_break_duration.b_auto_return = (p_data[pos] & 0x80);
- p_cmd->i_break_duration.i_duration =
- ((((uint64_t)p_data[pos] & 0x01) << 32) |
- ((uint64_t)p_data[pos + 1] << 24) |
- ((uint64_t)p_data[pos + 2] << 16) |
- ((uint64_t)p_data[pos + 3] << 8) |
- (uint64_t)p_data[pos + 4]);
+ dvbpsi_sis_break_duration(&p_data[pos], &p_cmd->i_break_duration);
pos += 5;
}
p_cmd->i_unique_program_id = (((uint16_t)p_data[pos] << 8) |
@@ -597,10 +625,7 @@ static dvbpsi_sis_cmd_splice_schedule_t *
/* 5 reserved bits */
if (p_event->b_program_splice_flag) {
/* utc_splice_time */
- p_event->i_utc_splice_time = (((uint32_t)p_data[pos ] << 24) |
- ((uint32_t)p_data[pos+1] << 16) |
- ((uint32_t)p_data[pos+2] << 8) |
- (uint32_t)p_data[pos+3]);
+ p_event->i_utc_splice_time = dvbpsi_sis_utc_splice_time(&p_data[pos]);
pos += 4;
}
else { /* component */
@@ -623,7 +648,8 @@ static dvbpsi_sis_cmd_splice_schedule_t *
return NULL;
}
p_time->i_tag = p_data[pos++];
- p_time->i_utc_splice_time = p_data[pos]; /* GPS_UTC time */
+ /* GPS_UTC time */
+ p_time->i_utc_splice_time = dvbpsi_sis_utc_splice_time(&p_data[pos]);
pos += 4;
if (!p_event->p_component)
p_event->p_component = p_list = p_time;
@@ -635,13 +661,7 @@ static dvbpsi_sis_cmd_splice_schedule_t *
}
if (p_event->b_duration_flag) {
/* break duration */
- p_event->i_break_duration.b_auto_return = (p_data[pos] & 0x80);
- p_event->i_break_duration.i_duration =
- ((((uint64_t)p_data[pos] & 0x01) << 32) |
- ((uint64_t)p_data[pos + 1] << 24) |
- ((uint64_t)p_data[pos + 2] << 16) |
- ((uint64_t)p_data[pos + 3] << 8) |
- (uint64_t)p_data[pos + 4]);
+ dvbpsi_sis_break_duration(&p_data[pos], &p_event->i_break_duration);
pos += 5;
}
p_event->i_unique_program_id = p_data[pos];
@@ -682,6 +702,10 @@ void dvbpsi_sis_sections_decode(dvbpsi_t* p_dvbpsi, dvbpsi_sis_t* p_sis,
p_sis->b_encrypted_packet = ((p_byte[4] & 0x80) == 0x80);
/* NOTE: cannot handle encrypted packet */
assert(p_sis->b_encrypted_packet);
+ if (p_sis->b_encrypted_packet) {
+ dvbpsi_error(p_dvbpsi, "SIS decoder", "cannot handle encrypted packets");
+ break;
+ }
p_sis->i_encryption_algorithm = ((p_byte[4] & 0x7E) >> 1);
p_sis->i_pts_adjustment = ((((uint64_t)p_byte[4] & 0x01) << 32) |
((uint64_t)p_byte[5] << 24) |
@@ -775,6 +799,168 @@ void dvbpsi_sis_sections_decode(dvbpsi_t* p_dvbpsi, dvbpsi_sis_t* p_sis,
}
/*****************************************************************************
+ * Generate SIS tables
+ *****************************************************************************/
+static uint32_t dvbpsi_sis_generate_utc_splice_time(uint8_t *p_data, const uint32_t i_time)
+{
+ p_data[0] = (i_time >> 24);
+ p_data[1] = (i_time >> 16);
+ p_data[2] = (i_time >> 8);
+ p_data[3] = (i_time & 0xff);
+ return 4;
+}
+
+static uint32_t dvbpsi_sis_generate_splice_time(uint8_t *p_data, const dvbpsi_sis_splice_time_t *p_splice_time)
+{
+ uint32_t i_pos = 1;
+ p_data[0] = p_splice_time->b_time_specified_flag ? 0x80 : 0x00;
+ if (p_splice_time->b_time_specified_flag)
+ {
+ p_data[0] |= ((p_splice_time->i_pts_time >> 32) & 0x01);
+ p_data[1] = (p_splice_time->i_pts_time >> 24);
+ p_data[2] = (p_splice_time->i_pts_time >> 16);
+ p_data[3] = (p_splice_time->i_pts_time >> 8);
+ p_data[4] = (p_splice_time->i_pts_time & 0xff);
+ i_pos += 4;
+ }
+ return i_pos;
+}
+
+static uint32_t dvbpsi_sis_generate_break_duration(uint8_t *p_data, const dvbpsi_sis_break_duration_t *p_break_duration)
+{
+ p_data[0] = p_break_duration->b_auto_return ? 0x80 : 0x00;
+ p_data[0] |= ((p_break_duration->i_duration >> 32) & 0x01);
+ p_data[1] = (p_break_duration->i_duration >> 24);
+ p_data[2] = (p_break_duration->i_duration >> 16);
+ p_data[3] = (p_break_duration->i_duration >> 8);
+ p_data[4] = (p_break_duration->i_duration & 0xff);
+ return 5;
+}
+
+static uint32_t dvbpsi_sis_generate_splice_cmd_schedule(uint8_t *p_data,
+ const dvbpsi_sis_cmd_splice_schedule_t *p_schedule)
+{
+ uint32_t i_pos = 0, i_event = 0;
+ p_data[i_pos] = p_schedule->i_splice_count;
+ i_pos++;
+ dvbpsi_sis_splice_event_t *p_event = p_schedule->p_splice_event;
+ while (p_event)
+ {
+ p_data[i_pos + 0] = (p_event->i_splice_event_id >> 24);
+ p_data[i_pos + 1] = (p_event->i_splice_event_id >> 16);
+ p_data[i_pos + 2] = (p_event->i_splice_event_id >> 8);
+ p_data[i_pos + 3] = (p_event->i_splice_event_id);
+ p_data[i_pos + 4] = p_event->b_splice_event_cancel_indicator ? 0x80 : 0x00;
+ i_pos += 5;
+
+ if (!p_event->b_splice_event_cancel_indicator)
+ {
+ p_data[i_pos] = p_event->b_out_of_network_indicator ? 0x80 : 0x00;
+ p_data[i_pos] |= p_event->b_program_splice_flag ? 0x40 : 0x00;
+ p_data[i_pos] |= p_event->b_duration_flag ? 0x20 : 0x00;
+ i_pos++;
+ if (p_event->b_program_splice_flag)
+ i_pos += dvbpsi_sis_generate_utc_splice_time(p_data + i_pos, p_event->i_utc_splice_time);
+ else
+ {
+ /* component loop */
+ p_data[i_pos] = p_event->i_component_count;
+ i_pos++;
+
+ int count = p_event->i_component_count;
+ dvbpsi_sis_component_t *p_comp = p_event->p_component;
+ while (p_comp && count > 0)
+ {
+ p_data[i_pos] = p_comp->i_tag;
+ i_pos++;
+ i_pos += dvbpsi_sis_generate_utc_splice_time(p_data + i_pos, p_comp->i_utc_splice_time);
+ p_comp = p_comp->p_next;
+ count--;
+ }
+ assert(count == 0);
+ assert(p_comp == NULL);
+ }
+
+ if (p_event->b_duration_flag)
+ i_pos += dvbpsi_sis_generate_break_duration(p_data + i_pos, &p_event->i_break_duration);
+
+ p_data[i_pos + 0] = (p_event->i_unique_program_id >> 8);
+ p_data[i_pos + 1] = (p_event->i_unique_program_id & 0x00ff);
+ p_data[i_pos + 2] = p_event->i_avail_num;
+ p_data[i_pos + 3] = p_event->i_avails_expected;
+ i_pos += 4;
+ }
+ p_event = p_event->p_next;
+ i_event++;
+ }
+ assert(i_event == p_schedule->i_splice_count);
+ return i_pos;
+}
+
+static uint32_t dvbpsi_sis_generate_splice_cmd_insert(uint8_t *p_data,
+ const dvbpsi_sis_cmd_splice_insert_t *p_insert)
+{
+ p_data[0] = (p_insert->i_splice_event_id >> 24);
+ p_data[1] = (p_insert->i_splice_event_id >> 16);
+ p_data[2] = (p_insert->i_splice_event_id >> 8);
+ p_data[3] = (p_insert->i_splice_event_id & 0x000000ff);
+ p_data[4] = p_insert->b_splice_event_cancel_indicator ? 0x01 : 0x00;
+ if (p_insert->b_splice_event_cancel_indicator)
+ return 5;
+
+ p_data[5] = p_insert->b_out_of_network_indicator ? 0x80 : 0x00;
+ p_data[5] |= p_insert->b_program_splice_flag ? 0x40 : 0x00;
+ p_data[5] |= p_insert->b_duration_flag ? 0x20 : 0x00;
+ p_data[5] |= p_insert->b_splice_immediate_flag ? 0x10 : 0x00;
+
+ uint8_t i_pos = 6;
+ if (p_insert->b_program_splice_flag && !p_insert->b_splice_immediate_flag)
+ {
+ i_pos += dvbpsi_sis_generate_splice_time(p_data + i_pos, &p_insert->i_splice_time);
+ }
+ if (!p_insert->b_program_splice_flag)
+ {
+ p_data[i_pos] = p_insert->i_component_count;
+ i_pos++;
+
+ int count = p_insert->i_component_count;
+ dvbpsi_sis_component_splice_time_t *p_comp = p_insert->p_splice_time;
+ while (p_comp && count > 0)
+ {
+ p_data[i_pos] = p_comp->i_component_tag;
+ i_pos++;
+ i_pos += dvbpsi_sis_generate_splice_time(p_data + i_pos, &p_comp->i_splice_time);
+ p_comp = p_comp->p_next;
+ count--;
+ }
+ assert(count == 0);
+ assert(p_comp == NULL);
+ }
+ if (p_insert->b_duration_flag)
+ {
+ i_pos += dvbpsi_sis_generate_break_duration(p_data + i_pos, &p_insert->i_break_duration);
+ }
+ p_data[i_pos + 0] = (p_insert->i_unique_program_id >> 8);
+ p_data[i_pos + 1] = (p_insert->i_unique_program_id & 0x00ff);
+ p_data[i_pos + 2] = p_insert->i_avail_num;
+ p_data[i_pos + 3] = p_insert->i_avails_expected;
+ i_pos += 4;
+ return i_pos;
+}
+
+static uint32_t dvbpsi_sis_generate_splice_cmd_time_signal(uint8_t *p_data,
+ const dvbpsi_sis_cmd_time_signal_t *p_signal)
+{
+ return dvbpsi_sis_generate_splice_time(p_data, p_signal->p_splice_time);
+}
+
+static uint32_t dvbpsi_sis_generate_splice_cmd_bandwidth_reservation(uint8_t *p_data,
+ const dvbpsi_sis_cmd_bandwidth_reservation_t *p_bandwidth)
+{
+ return 0;
+}
+
+/*****************************************************************************
* dvbpsi_sis_sections_generate
*****************************************************************************
* Generate SIS sections based on the dvbpsi_sis_t structure.
@@ -817,23 +1003,39 @@ dvbpsi_psi_section_t *dvbpsi_sis_sections_generate(dvbpsi_t *p_dvbpsi, dvbpsi_si
if (p_sis->i_splice_command_length > 0xfff)
p_sis->i_splice_command_length = 0xfff; /* truncate */
- /* Handle splice_command_sections */
+ /* TODO: FIXME: Handle splice_command_sections */
uint32_t i_cmd_start = 14;
+ uint32_t i_pos = 0;
switch(p_sis->i_splice_command_type)
{
case 0x00: /* splice_null */
assert(p_sis->i_splice_command_length == 0);
break;
case 0x04: /* splice_schedule */
+ i_pos = dvbpsi_sis_generate_splice_cmd_schedule(p_current->p_data + i_cmd_start,
+ (dvbpsi_sis_cmd_splice_schedule_t *)p_sis->p_splice_command);
+ break;
case 0x05: /* splice_insert */
+ i_pos = dvbpsi_sis_generate_splice_cmd_insert(p_current->p_data + i_cmd_start,
+ (dvbpsi_sis_cmd_splice_insert_t *)p_sis->p_splice_command);
+ break;
case 0x06: /* time_signal */
+ i_pos = dvbpsi_sis_generate_splice_cmd_time_signal(p_current->p_data + i_cmd_start,
+ (dvbpsi_sis_cmd_time_signal_t *) p_sis->p_splice_command);
+ break;
case 0x07: /* bandwidth_reservation */
+ i_pos = dvbpsi_sis_generate_splice_cmd_bandwidth_reservation(p_current->p_data + i_cmd_start,
+ (dvbpsi_sis_cmd_bandwidth_reservation_t *) p_sis->p_splice_command);
+
break;
default:
dvbpsi_error(p_dvbpsi, "SIS decoder", "invalid SIS Command found");
break;
}
+ if (i_pos > 0)
+ i_cmd_start += i_pos;
+
/* The splice command may not overrun the start of the descriptor loop */
assert(i_cmd_start < i_desc_start);
View it on GitLab: https://code.videolan.org/videolan/libdvbpsi/compare/dfa10bae7c6171cd608311f7ad2bcb01e0f739d8...780756255fa3cee630a5cf90e5c519f2d7293e3e
---
View it on GitLab: https://code.videolan.org/videolan/libdvbpsi/compare/dfa10bae7c6171cd608311f7ad2bcb01e0f739d8...780756255fa3cee630a5cf90e5c519f2d7293e3e
You're receiving this email because of your account on code.videolan.org.
More information about the libdvbpsi-devel
mailing list