From 811a75ee84d570cf9b3751cdd29d2b32046056fa Mon Sep 17 00:00:00 2001 From: Kieran Kunhya Date: Fri, 17 Jul 2020 23:34:46 +0100 Subject: [PATCH 1/7] Fix various build failures --- Makefile | 2 +- examples/Makefile | 2 +- ietf/rtp2435.h | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 1c8d719..96e2d4b 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ HEADER_LIST = $$(find * -name '*.h') FLAGS = -I. -Werror -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Wformat=2 -compiler_c = $(CC) $(FLAGS) $(CFLAGS) +compiler_c = $(CC) $(FLAGS) $(CFLAGS) -std=gnu99 compiler_c++ = $(CXX) $(FLAGS) $(CXXFLAGS) compile = $(compiler_$1) -include "$$header" -c -x $1 /dev/null -o /dev/null diff --git a/examples/Makefile b/examples/Makefile index b5541d3..2a18ac9 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,7 +1,7 @@ PREFIX ?= /usr/local WARN = -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare CPPFLAGS = -I. -I.. -I../.. -CFLAGS := $(WARN) -O2 -g $(CFLAGS) +CFLAGS := $(WARN) -O2 -g -std=gnu99 $(CFLAGS) OBJ = dvb_print_si dvb_gen_si dvb_ecmg dvb_ecmg_test mpeg_print_pcr rtp_check_seqnum mpeg_restamp ifeq "$(shell uname -s)" "Linux" diff --git a/ietf/rtp2435.h b/ietf/rtp2435.h index 11b5d8b..23e8343 100644 --- a/ietf/rtp2435.h +++ b/ietf/rtp2435.h @@ -31,6 +31,10 @@ #ifndef __BITSTREAM_IETF_RTP2435_H__ #define __BITSTREAM_IETF_RTP2435_H__ +#include +#include +#include + #ifdef __cplusplus extern "C" { @@ -125,7 +129,7 @@ static inline uint8_t *rtp2435_restart(uint8_t *header) static inline uint8_t *rtp2435_quantization_table(uint8_t *header) { uint8_t q = rtp2435_get_q(header); - if (128 <= q && q <= 255) { + if (128 <= q) { uint8_t *p; if ((p = rtp2435_restart(header))) return p + RTP_2435_RESTART_HEADER_SIZE; From f64596d98ac56837706e9ffbd13cd96ca00ef569 Mon Sep 17 00:00:00 2001 From: Kieran Kunhya Date: Sat, 18 Jul 2020 00:57:25 +0200 Subject: [PATCH 2/7] Add .gitlab-ci.yml --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..d248d7a --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,6 @@ +image: gcc + +test: + stage: test + script: + - make check From 8b7855f6873e5377a4506c0d81bc85a92240913d Mon Sep 17 00:00:00 2001 From: Kieran Kunhya Date: Sat, 18 Jul 2020 14:26:22 +0100 Subject: [PATCH 3/7] CI: Add runner tags --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d248d7a..d5ae0d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,3 +4,6 @@ test: stage: test script: - make check + tags: + - docker + - amd64 From 82abd7df0dec4f2aa37a7ac6267d7814006f9f83 Mon Sep 17 00:00:00 2001 From: Kieran Kunhya Date: Sat, 18 Jul 2020 14:28:51 +0100 Subject: [PATCH 4/7] CI: Use correct image --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d5ae0d6..c328bc4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: gcc +image: registry.videolan.org/x264-debian-unstable:20190404162201 test: stage: test From df2746417195a7730bb4225d47cd6141c2676a3b Mon Sep 17 00:00:00 2001 From: Kieran Kunhya Date: Sat, 18 Jul 2020 14:30:46 +0100 Subject: [PATCH 5/7] CI: Use VideoLAN base image --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c328bc4..ee11072 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: registry.videolan.org/x264-debian-unstable:20190404162201 +image: registry.videolan.org/videolan-base-xenial test: stage: test From a6f3f840fe9670c642b1e83c21a896aac3099463 Mon Sep 17 00:00:00 2001 From: Arnaud de Turckheim Date: Mon, 15 Jun 2020 18:13:29 +0200 Subject: [PATCH 6/7] scte35: add segmentation descriptor --- scte/35.h | 435 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 435 insertions(+) diff --git a/scte/35.h b/scte/35.h index 7284f32..486ff18 100644 --- a/scte/35.h +++ b/scte/35.h @@ -664,6 +664,441 @@ static inline bool scte35_private_validate(const uint8_t *p_scte35) return scte35_get_command_length(p_scte35) >= SCTE35_PRIVATE_HEADER_SIZE; } +/***************************************************************************** + * Splice Information Table - splice descriptor + *****************************************************************************/ +#define SCTE35_SPLICE_DESC_HEADER_SIZE 6 + +#define SCTE35_SPLICE_DESC_TAG_AVAIL 0x00 +#define SCTE35_SPLICE_DESC_TAG_DTMF 0x01 +#define SCTE35_SPLICE_DESC_TAG_SEG 0x02 + +#define scte35_splice_desc_get_tag desc_get_tag +#define scte35_splice_desc_get_length desc_get_length + +static inline uint32_t scte35_splice_desc_get_identifier(const uint8_t *p_desc) +{ + return ((uint32_t)p_desc[2] << 24) | (p_desc[3] << 16) | + (p_desc[4] << 8) | p_desc[5]; +} + +/***************************************************************************** + * Splice Information Table - segmentation descriptor + *****************************************************************************/ +static inline uint32_t scte35_seg_desc_get_event_id(const uint8_t *p_desc) +{ + return ((uint32_t)p_desc[6] << 24) | (p_desc[7] << 16) | + (p_desc[8] << 8) | p_desc[9]; +} + +static inline bool scte35_seg_desc_has_cancel(const uint8_t *p_desc) +{ + return !!(p_desc[10] & 0x80); +} + +static inline bool scte35_seg_desc_has_program_seg(const uint8_t *p_desc) +{ + return !scte35_seg_desc_has_cancel(p_desc) && + !!(p_desc[11] & 0x80); +} + +static inline bool scte35_seg_desc_has_duration(const uint8_t *p_desc) +{ + return !scte35_seg_desc_has_cancel(p_desc) && + !!(p_desc[11] & 0x40); +} + +static inline bool +scte35_seg_desc_has_delivery_not_restricted(const uint8_t *p_desc) +{ + return !scte35_seg_desc_has_cancel(p_desc) && + !!(p_desc[11] & 0x20); +} + +static inline bool +scte35_seg_desc_has_web_delivery_allowed(const uint8_t *p_desc) +{ + return !scte35_seg_desc_has_delivery_not_restricted(p_desc) && + !!(p_desc[11] & 0x10); +} + +static inline bool +scte35_seg_desc_has_no_regional_blackout(const uint8_t *p_desc) +{ + return !scte35_seg_desc_has_delivery_not_restricted(p_desc) && + !!(p_desc[11] & 0x08); +} + +static inline bool +scte35_seg_desc_has_archive_allowed(const uint8_t *p_desc) +{ + return !scte35_seg_desc_has_delivery_not_restricted(p_desc) && + !!(p_desc[11] & 0x04); +} + +#define SCTE35_SEG_DESC_DEVICE_RESTRICTION_GRP0 0x00 +#define SCTE35_SEG_DESC_DEVICE_RESTRICTION_GRP1 0x01 +#define SCTE35_SEG_DESC_DEVICE_RESTRICTION_GRP2 0x02 +#define SCTE35_SEG_DESC_DEVICE_RESTRICTION_NONE 0x03 + +static inline uint8_t +scte35_seg_desc_get_device_restrictions(const uint8_t *p_desc) +{ + return p_desc[11] & 0x03; +} + +static inline uint8_t scte35_seg_desc_get_component_count(const uint8_t *p_desc) +{ + return scte35_seg_desc_has_program_seg(p_desc) ? 0 : p_desc[12]; +} + +static inline uint8_t *scte35_seg_desc_get_component(const uint8_t *p_desc, + uint8_t i) +{ + if (i < scte35_seg_desc_get_component_count(p_desc)) + return (uint8_t *)p_desc + 13 + 6 * i; + return NULL; +} + +static inline uint8_t scte35_seg_desc_component_get_tag(const uint8_t *p_comp) +{ + return p_comp[0]; +} + +static inline uint64_t +scte35_seg_desc_component_get_pts_off(const uint8_t *p_comp) +{ + return (((uint64_t)p_comp[1] & 0x1) << 32) | (p_comp[2] << 24) | + (p_comp[3] << 16) | (p_comp[4] << 8) | p_comp[5]; +} + +static inline uint64_t scte35_seg_desc_get_duration(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc) || + !scte35_seg_desc_has_duration(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + return ((uint64_t)p[0] << 32) | (p[1] << 24) | (p[2] << 16) | (p[3] < 8) | + p[4]; +} + +#define SCTE35_SEG_DESC_UPID_TYPE_NOT_USED 0x00 +#define SCTE35_SEG_DESC_UPID_TYPE_USER_DEFINED 0x01 /* deprecated */ +#define SCTE35_SEG_DESC_UPID_TYPE_ISCI 0x02 /* deprecated */ +#define SCTE35_SEG_DESC_UPID_TYPE_AD_ID 0x03 +#define SCTE35_SEG_DESC_UPID_TYPE_UMID 0x04 +#define SCTE35_SEG_DESC_UPID_TYPE_ISAN_DEPRECATED 0x05 /* deprecated */ +#define SCTE35_SEG_DESC_UPID_TYPE_ISAN 0x06 +#define SCTE35_SEG_DESC_UPID_TYPE_TID 0x07 +#define SCTE35_SEG_DESC_UPID_TYPE_TI 0x08 +#define SCTE35_SEG_DESC_UPID_TYPE_ADI 0x09 +#define SCTE35_SEG_DESC_UPID_TYPE_EIDR 0x0A +#define SCTE35_SEG_DESC_UPID_TYPE_ATSC 0x0B +#define SCTE35_SEG_DESC_UPID_TYPE_MPU 0x0C +#define SCTE35_SEG_DESC_UPID_TYPE_MID 0x0D +#define SCTE35_SEG_DESC_UPID_TYPE_ADS 0x0E +#define SCTE35_SEG_DESC_UPID_TYPE_URI 0x0F + +static inline const char *scte35_seg_desc_upid_type_to_str(uint8_t upid) +{ + switch (upid) { + case SCTE35_SEG_DESC_UPID_TYPE_NOT_USED: + return "not_used"; + case SCTE35_SEG_DESC_UPID_TYPE_USER_DEFINED: + return "user_defined"; + case SCTE35_SEG_DESC_UPID_TYPE_ISCI: + return "ISCI"; + case SCTE35_SEG_DESC_UPID_TYPE_AD_ID: + return "AD_ID"; + case SCTE35_SEG_DESC_UPID_TYPE_UMID: + return "IMID"; + case SCTE35_SEG_DESC_UPID_TYPE_ISAN_DEPRECATED: + return "ISAN_deprecated"; + case SCTE35_SEG_DESC_UPID_TYPE_ISAN: + return "ISAN"; + case SCTE35_SEG_DESC_UPID_TYPE_TID: + return "TID"; + case SCTE35_SEG_DESC_UPID_TYPE_TI: + return "TI"; + case SCTE35_SEG_DESC_UPID_TYPE_ADI: + return "ADI"; + case SCTE35_SEG_DESC_UPID_TYPE_EIDR: + return "EIDR"; + case SCTE35_SEG_DESC_UPID_TYPE_ATSC: + return "ATSC"; + case SCTE35_SEG_DESC_UPID_TYPE_MPU: + return "MPU"; + case SCTE35_SEG_DESC_UPID_TYPE_MID: + return "MID"; + case SCTE35_SEG_DESC_UPID_TYPE_ADS: + return "ADS"; + case SCTE35_SEG_DESC_UPID_TYPE_URI: + return "URI"; + } + return "unknown"; +} + +static inline uint8_t scte35_seg_desc_get_upid_type(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + return p[0]; +} + +static inline uint8_t scte35_seg_desc_get_upid_length(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + return p[1]; +} + +static inline uint8_t *scte35_seg_desc_get_upid(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + return (uint8_t *)p + 2; +} + +#define SCTE35_SEG_DESC_TYPE_ID_NOT_INDICATED 0x00 +#define SCTE35_SEG_DESC_TYPE_ID_CONTENT_ID 0x01 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_START 0x10 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_END 0x11 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_EARLY_TERM 0x12 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_BREAKAWAY 0x13 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_RESUMPTION 0x14 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_RUNOVER_PLANNED 0x15 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_RUNOVER_UNPLANNED 0x16 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_OVERLAP_START 0x17 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_BLACKOUT_OVERRIDE 0x18 +#define SCTE35_SEG_DESC_TYPE_ID_PROG_START_IN_PROGRESS 0x19 +#define SCTE35_SEG_DESC_TYPE_ID_CHAPTER_START 0x20 +#define SCTE35_SEG_DESC_TYPE_ID_CHAPTER_END 0x21 +#define SCTE35_SEG_DESC_TYPE_ID_BREAK_START 0x22 +#define SCTE35_SEG_DESC_TYPE_ID_BREAK_END 0x23 +#define SCTE35_SEG_DESC_TYPE_ID_PROVIDER_AD_START 0x30 +#define SCTE35_SEG_DESC_TYPE_ID_PROVIDER_AD_END 0x31 +#define SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_AD_START 0x32 +#define SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_AD_END 0x33 +#define SCTE35_SEG_DESC_TYPE_ID_PROVIDER_PO_START 0x34 +#define SCTE35_SEG_DESC_TYPE_ID_PROVIDER_PO_END 0x35 +#define SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_PO_START 0x36 +#define SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_PO_END 0x37 +#define SCTE35_SEG_DESC_TYPE_ID_UNSCHEDULED_EV_START 0x40 +#define SCTE35_SEG_DESC_TYPE_ID_UNSCHEDULED_EV_END 0x41 +#define SCTE35_SEG_DESC_TYPE_ID_NETWORK_START 0x50 +#define SCTE35_SEG_DESC_TYPE_ID_NETWORK_END 0x51 +/* SNPTV */ +#define SCTE35_SEG_DESC_TYPE_ID_AD_SERVER 0x02 + +static inline const char *scte35_seg_desc_type_id_to_str(uint8_t type_id) +{ + switch (type_id) { + case SCTE35_SEG_DESC_TYPE_ID_NOT_INDICATED: + return "not_indicated"; + case SCTE35_SEG_DESC_TYPE_ID_CONTENT_ID: + return "content_id"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_START: + return "prog_start"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_END: + return "prog_end"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_EARLY_TERM: + return "prog_early_term"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_BREAKAWAY: + return "prog_breakaway"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_RESUMPTION: + return "prog_resumption"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_RUNOVER_PLANNED: + return "prog_runover_planned"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_RUNOVER_UNPLANNED: + return "prog_runover_unplanned"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_OVERLAP_START: + return "prog_overlap_start"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_BLACKOUT_OVERRIDE: + return "prog_blackout_override"; + case SCTE35_SEG_DESC_TYPE_ID_PROG_START_IN_PROGRESS: + return "prog_start_in_progress"; + case SCTE35_SEG_DESC_TYPE_ID_CHAPTER_START: + return "chapter_start"; + case SCTE35_SEG_DESC_TYPE_ID_CHAPTER_END: + return "chapter_end"; + case SCTE35_SEG_DESC_TYPE_ID_BREAK_START: + return "break_start"; + case SCTE35_SEG_DESC_TYPE_ID_BREAK_END: + return "break_end"; + case SCTE35_SEG_DESC_TYPE_ID_PROVIDER_AD_START: + return "provider_ad_start"; + case SCTE35_SEG_DESC_TYPE_ID_PROVIDER_AD_END: + return "provider_ad_end"; + case SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_AD_START: + return "distributor_ad_start"; + case SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_AD_END: + return "distributor_ad_end"; + case SCTE35_SEG_DESC_TYPE_ID_PROVIDER_PO_START: + return "provider_po_start"; + case SCTE35_SEG_DESC_TYPE_ID_PROVIDER_PO_END: + return "provider_po_end"; + case SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_PO_START: + return "distributor_po_start"; + case SCTE35_SEG_DESC_TYPE_ID_DISTRIBUTOR_PO_END: + return "distributor_po_end"; + case SCTE35_SEG_DESC_TYPE_ID_UNSCHEDULED_EV_START: + return "unscheduled_ev_start"; + case SCTE35_SEG_DESC_TYPE_ID_UNSCHEDULED_EV_END: + return "unscheduled_ev_end"; + case SCTE35_SEG_DESC_TYPE_ID_NETWORK_START: + return "network_start"; + case SCTE35_SEG_DESC_TYPE_ID_NETWORK_END: + return "network_end"; + + case SCTE35_SEG_DESC_TYPE_ID_AD_SERVER: + return "ad_server"; + } + return "unknown"; +} + +static inline uint8_t scte35_seg_desc_get_type_id(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + return p[0]; +} + +static inline uint8_t scte35_seg_desc_get_num(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + return p[1]; +} + +static inline uint8_t scte35_seg_desc_get_expected(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + return p[2]; +} + +static inline bool scte35_seg_desc_has_sub_num(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return false; + + uint8_t type_id = scte35_seg_desc_get_type_id(p_desc); + if (type_id != 0x34 && type_id != 0x36) + return false; + + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + if (p + 3 < p_desc + scte35_splice_desc_get_length(p_desc)) + return true; + return false; +} + +static inline uint8_t scte35_seg_desc_get_sub_num(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + + uint8_t type_id = scte35_seg_desc_get_type_id(p_desc); + if (type_id != 0x34 && type_id != 0x36) + return 0; + + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + if (p + 3 < p_desc + scte35_splice_desc_get_length(p_desc)) + return p[3]; + return 0; +} + +static inline bool scte35_seg_desc_has_sub_expected(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return false; + + uint8_t type_id = scte35_seg_desc_get_type_id(p_desc); + if (type_id != 0x34 && type_id != 0x36) + return false; + + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + if (p + 4 < p_desc + scte35_splice_desc_get_length(p_desc)) + return true; + return false; +} + +static inline uint8_t scte35_seg_desc_get_sub_expected(const uint8_t *p_desc) +{ + if (scte35_seg_desc_has_cancel(p_desc)) + return 0; + + uint8_t type_id = scte35_seg_desc_get_type_id(p_desc); + if (type_id != 0x34 && type_id != 0x36) + return 0; + + const uint8_t *p = p_desc + 12; + if (!scte35_seg_desc_has_program_seg(p_desc)) + p += 1 + 6 * scte35_seg_desc_get_component_count(p_desc); + if (scte35_seg_desc_has_duration(p_desc)) + p += 5; + p += 2; + p += scte35_seg_desc_get_upid_length(p_desc); + if (p + 4 < p_desc + scte35_splice_desc_get_length(p_desc)) + return p[4]; + return 0; +} + /***************************************************************************** * Splice Information Table validation *****************************************************************************/ From 01b7d692f461962c8000145fb7e9f61c118e1057 Mon Sep 17 00:00:00 2001 From: Arnaud de Turckheim Date: Tue, 1 Sep 2020 16:17:28 +0200 Subject: [PATCH 7/7] scte104: add getters for time signal support --- scte/104.h | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 5 deletions(-) diff --git a/scte/104.h b/scte/104.h index 10b1d9b..69e246a 100644 --- a/scte/104.h +++ b/scte/104.h @@ -171,11 +171,13 @@ static inline void scte104t_set_gpi_edge(uint8_t *p, uint8_t i_gpi_edge) *****************************************************************************/ #define SCTE104_HEADER_SIZE 4 -#define SCTE104_OPID_INJECT_SECTION 0x0100 -#define SCTE104_OPID_SPLICE 0x0101 -#define SCTE104_OPID_SPLICE_NULL 0x0102 -#define SCTE104_OPID_TIME_SIGNAL 0x0104 -#define SCTE104_OPID_MULTIPLE 0xffff +#define SCTE104_OPID_INJECT_SECTION 0x0100 +#define SCTE104_OPID_SPLICE 0x0101 +#define SCTE104_OPID_SPLICE_NULL 0x0102 +#define SCTE104_OPID_TIME_SIGNAL 0x0104 +#define SCTE104_OPID_INSERT_DESCRIPTOR 0x0108 +#define SCTE104_OPID_INSERT_SEGMENTATION_DESCRIPTOR 0x010B +#define SCTE104_OPID_MULTIPLE 0xffff static inline uint16_t scte104_get_opid(const uint8_t *p) { @@ -523,6 +525,146 @@ static inline void scte104srd_set_auto_return(uint8_t *p, uint8_t i_auto_return) p[13] = i_auto_return; } +/***************************************************************************** + * SCTE-104 : time_signal_request_data + *****************************************************************************/ +static inline uint16_t scte104tsrd_get_pre_roll_time(const uint8_t *p) +{ + return ((uint16_t)p[0] << 8) | ((uint16_t)p[1]); +} + +/***************************************************************************** + * SCTE-104 : insert_descriptor_request_data + *****************************************************************************/ +static inline uint8_t scte104idrd_get_count(const uint8_t *p) +{ + return p[0]; +} + +static inline uint8_t *scte104idrd_get_image(const uint8_t *p) +{ + return (uint8_t *)(p + 1); +} + +/***************************************************************************** + * SCTE-104 : insert_segmentation_descriptor_request_data + *****************************************************************************/ +static inline uint32_t scte104isdrd_get_event_id(const uint8_t *p) +{ + return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | + ((uint32_t)p[2] << 8) | ((uint32_t)p[3]); +} + +static inline uint8_t scte104isdrd_get_cancel_indicator(const uint8_t *p) +{ + return p[4]; +} + +static inline uint16_t scte104isdrd_get_duration(const uint8_t *p) +{ + return ((uint16_t)p[5] << 8) | ((uint16_t)p[6]); +} + +static inline uint8_t scte104isdrd_get_upid_type(const uint8_t *p) +{ + return p[7]; +} + +static inline uint8_t scte104isdrd_get_upid_length(const uint8_t *p) +{ + return p[8]; +} + +static inline uint8_t *scte104isdrd_get_upid(const uint8_t *p) +{ + return (uint8_t *)p + 9; +} + +static inline uint8_t scte104isdrd_get_type_id(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[0]; +} + +static inline uint8_t scte104isdrd_get_num(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[1]; +} + +static inline uint8_t scte104isdrd_get_expected(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[2]; +} + +static inline uint8_t +scte104isdrd_get_duration_extension_frames(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[3]; +} + +static inline uint8_t scte104isdrd_get_delivery_not_restricted(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[4]; +} + +static inline uint8_t scte104isdrd_get_web_delivery_allowed(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[5]; +} + +static inline uint8_t scte104isdrd_get_no_regional_blackout(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[6]; +} + +static inline uint8_t scte104isdrd_get_archive_allowed(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[7]; +} + +static inline uint8_t scte104isdrd_get_device_restrictions(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[8]; +} + +static inline uint8_t scte104isdrd_get_insert_sub_info(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[9]; +} + +static inline uint8_t scte104isdrd_get_sub_num(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[10]; +} + +static inline uint8_t scte104isdrd_get_sub_expected(const uint8_t *p) +{ + uint8_t upid_length = scte104isdrd_get_upid_length(p); + p += 9 + upid_length; + return p[11]; +} + #ifdef __cplusplus } #endif