xine-lib  1.2.9
Data Structures | Macros | Enumerations | Functions
demux_ts.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include "group_video.h"
#include <xine/xine_internal.h>
#include <xine/xineutils.h>
#include <xine/demux.h>

Data Structures

struct  demux_ts_media
 
struct  demux_ts_spu_lang
 
struct  demux_ts_audio_track
 
struct  demux_ts_class_t
 
struct  demux_ts_t
 

Macros

#define LOG_MODULE   "demux_ts"
 
#define LOG_VERBOSE
 
#define PKT_SIZE   188
 
#define BODY_SIZE   (188 - 4)
 
#define MAX_PIDS   ((BODY_SIZE - 1 - 13) / 4) + 40
 
#define MAX_PMTS   128
 
#define PAT_BUF_SIZE   (4 * MAX_PMTS + 20)
 
#define SYNC_BYTE   0x47
 
#define MIN_SYNCS   3
 
#define NPKT_PER_READ   96
 
#define BUF_SIZE   (NPKT_PER_READ * (PKT_SIZE + 4))
 
#define CORRUPT_PES_THRESHOLD   10
 
#define NULL_PID   0x1fff
 
#define INVALID_PID   ((unsigned int)(-1))
 
#define INVALID_PROGRAM   ((unsigned int)(-1))
 
#define INVALID_CC   ((unsigned int)(-1))
 
#define PROG_STREAM_MAP   0xBC
 
#define PRIVATE_STREAM1   0xBD
 
#define PADDING_STREAM   0xBE
 
#define PRIVATE_STREAM2   0xBF
 
#define AUDIO_STREAM_S   0xC0
 
#define AUDIO_STREAM_E   0xDF
 
#define VIDEO_STREAM_S   0xE0
 
#define VIDEO_STREAM_E   0xEF
 
#define ECM_STREAM   0xF0
 
#define EMM_STREAM   0xF1
 
#define DSM_CC_STREAM   0xF2
 
#define ISO13522_STREAM   0xF3
 
#define PROG_STREAM_DIR   0xFF
 
#define DESCRIPTOR_REG_FORMAT   0x05
 
#define DESCRIPTOR_LANG   0x0a
 
#define DESCRIPTOR_TELETEXT   0x56
 
#define DESCRIPTOR_DVBSUB   0x59
 
#define DESCRIPTOR_AC3   0x6a
 
#define DESCRIPTOR_EAC3   0x7a
 
#define DESCRIPTOR_DTS   0x7b
 
#define DESCRIPTOR_AAC   0x7c
 
#define WRAP_THRESHOLD   360000
 
#define PTS_AUDIO   0
 
#define PTS_VIDEO   1
 
#define TBRE_MIN_TIME   ( 2 * 90000)
 
#define TBRE_TIME   (480 * 90000)
 
#define TBRE_MODE_PROBE   0
 
#define TBRE_MODE_AUDIO_PTS   1
 
#define TBRE_MODE_AUDIO_PCR   2
 
#define TBRE_MODE_PCR   3
 
#define TBRE_MODE_DONE   4
 
#define MIN(a, b)   ((a)<(b)?(a):(b))
 
#define MAX(a, b)   ((a)>(b)?(a):(b))
 
#define MAX_SPU_LANGS   32
 
#define MAX_AUDIO_TRACKS   32
 
#define abs(x)   ( ((x)<0) ? -(x) : (x) )
 

Enumerations

enum  streamType {
  ISO_11172_VIDEO = 0x01, ISO_13818_VIDEO = 0x02, ISO_11172_AUDIO = 0x03, ISO_13818_AUDIO = 0x04,
  ISO_13818_PRIVATE = 0x05, ISO_13818_PES_PRIVATE = 0x06, ISO_13522_MHEG = 0x07, ISO_13818_DSMCC = 0x08,
  ISO_13818_TYPE_A = 0x0a, ISO_13818_TYPE_B = 0x0b, ISO_13818_TYPE_C = 0x0c, ISO_13818_TYPE_D = 0x0d,
  ISO_13818_AUX = 0x0e, ISO_13818_PART7_AUDIO = 0x0f, ISO_14496_PART2_VIDEO = 0x10, ISO_14496_PART3_AUDIO = 0x11,
  ISO_14496_PART10_VIDEO = 0x1b, STREAM_VIDEO_HEVC = 0x24, STREAM_VIDEO_MPEG = 0x80, STREAM_AUDIO_AC3 = 0x81,
  STREAM_VIDEO_VC1 = 0xea, HDMV_AUDIO_80_PCM = 0x80, HDMV_AUDIO_82_DTS = 0x82, HDMV_AUDIO_83_TRUEHD = 0x83,
  HDMV_AUDIO_84_EAC3 = 0x84, HDMV_AUDIO_85_DTS_HRA = 0x85, HDMV_AUDIO_86_DTS_HD_MA = 0x86, HDMV_SPU_BITMAP = 0x90,
  HDMV_SPU_INTERACTIVE = 0x91, HDMV_SPU_TEXT = 0x92, STREAM_AUDIO_EAC3 = ( 0x7a << 8), STREAM_AUDIO_DTS = ( 0x7b << 8)
}
 

Functions

static void reset_track_map (fifo_buffer_t *fifo)
 
static int demux_ts_dynamic_pmt_find (demux_ts_t *this, int pid, int type, unsigned int descriptor_tag)
 
static void demux_ts_dynamic_pmt_clean (demux_ts_t *this)
 
static void demux_ts_dynamic_pmt_clear (demux_ts_t *this)
 
static void demux_ts_tbre_reset (demux_ts_t *this)
 
static void demux_ts_tbre_update (demux_ts_t *this, unsigned int mode, int64_t now)
 
static void check_newpts (demux_ts_t *this, int64_t pts, int video)
 
static void demux_send_special_spu_buf (demux_ts_t *this, uint32_t spu_type, int spu_channel)
 
static void demux_ts_update_spu_channel (demux_ts_t *this)
 
static void demux_ts_send_buffer (demux_ts_media *m, int flags)
 
static void demux_ts_flush_media (demux_ts_media *m)
 
static void post_sequence_end (fifo_buffer_t *fifo, uint32_t video_type)
 
static void demux_ts_flush (demux_ts_t *this)
 
static void demux_ts_parse_pat (demux_ts_t *this, unsigned char *original_pkt, unsigned char *pkt, unsigned int pusi, int len)
 
static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, uint8_t *buf, int packet_len)
 
static void update_extra_info (demux_ts_t *this, demux_ts_media *m)
 
static void demux_ts_buffer_pes (demux_ts_t *this, unsigned char *ts, unsigned int mediaIndex, unsigned int pus, unsigned int cc, unsigned int len)
 
static void demux_ts_get_lang_desc (demux_ts_t *this, char *dest, const unsigned char *data, int length)
 
static void demux_ts_get_reg_desc (demux_ts_t *this, uint32_t *dest, const unsigned char *data, int length)
 
static int ts_payloadsize (unsigned char *tsp)
 
static int apid_check (demux_ts_t *this, unsigned int pid)
 
static void demux_ts_parse_pmt (demux_ts_t *this, unsigned char *originalPkt, unsigned char *pkt, unsigned int pusi, int plen, uint32_t program_count)
 
static int sync_correct (demux_ts_t *this, uint8_t *buf, int32_t npkt_read)
 
static int sync_detect (demux_ts_t *this, uint8_t *buf, int32_t npkt_read)
 
static unsigned char * demux_synchronise (demux_ts_t *this)
 
static int64_t demux_ts_adaptation_field_parse (uint8_t *data, uint32_t adaptation_field_length)
 
static void demux_ts_parse_packet (demux_ts_t *this)
 
static void demux_ts_event_handler (demux_ts_t *this)
 
static int demux_ts_send_chunk (demux_plugin_t *this_gen)
 
static void demux_ts_dispose (demux_plugin_t *this_gen)
 
static int demux_ts_get_status (demux_plugin_t *this_gen)
 
static void demux_ts_send_headers (demux_plugin_t *this_gen)
 
static int demux_ts_seek (demux_plugin_t *this_gen, off_t start_pos, int start_time, int playing)
 
static int demux_ts_get_stream_length (demux_plugin_t *this_gen)
 
static uint32_t demux_ts_get_capabilities (demux_plugin_t *this_gen)
 
static int demux_ts_get_optional_data (demux_plugin_t *this_gen, void *data, int data_type)
 
static int detect_ts (uint8_t *buf, size_t len, int ts_size)
 
static demux_plugin_topen_plugin (demux_class_t *class_gen, xine_stream_t *stream, input_plugin_t *input)
 
void * demux_ts_init_class (xine_t *xine, void *data)
 

Macro Definition Documentation

◆ abs

#define abs (   x)    ( ((x)<0) ? -(x) : (x) )

Referenced by check_newpts().

◆ AUDIO_STREAM_E

#define AUDIO_STREAM_E   0xDF

◆ AUDIO_STREAM_S

#define AUDIO_STREAM_S   0xC0

◆ BODY_SIZE

#define BODY_SIZE   (188 - 4)

◆ BUF_SIZE

#define BUF_SIZE   (NPKT_PER_READ * (PKT_SIZE + 4))

◆ CORRUPT_PES_THRESHOLD

#define CORRUPT_PES_THRESHOLD   10

◆ DESCRIPTOR_AAC

#define DESCRIPTOR_AAC   0x7c

◆ DESCRIPTOR_AC3

#define DESCRIPTOR_AC3   0x6a

Referenced by demux_ts_parse_pmt().

◆ DESCRIPTOR_DTS

#define DESCRIPTOR_DTS   0x7b

Referenced by demux_ts_parse_pmt().

◆ DESCRIPTOR_DVBSUB

#define DESCRIPTOR_DVBSUB   0x59

Referenced by demux_ts_parse_pmt().

◆ DESCRIPTOR_EAC3

#define DESCRIPTOR_EAC3   0x7a

Referenced by demux_ts_parse_pmt().

◆ DESCRIPTOR_LANG

#define DESCRIPTOR_LANG   0x0a

Referenced by demux_ts_get_lang_desc().

◆ DESCRIPTOR_REG_FORMAT

#define DESCRIPTOR_REG_FORMAT   0x05

Referenced by demux_ts_get_reg_desc().

◆ DESCRIPTOR_TELETEXT

#define DESCRIPTOR_TELETEXT   0x56

Referenced by demux_ts_parse_pmt().

◆ DSM_CC_STREAM

#define DSM_CC_STREAM   0xF2

◆ ECM_STREAM

#define ECM_STREAM   0xF0

◆ EMM_STREAM

#define EMM_STREAM   0xF1

◆ INVALID_CC

#define INVALID_CC   ((unsigned int)(-1))

◆ INVALID_PID

#define INVALID_PID   ((unsigned int)(-1))

◆ INVALID_PROGRAM

#define INVALID_PROGRAM   ((unsigned int)(-1))

◆ ISO13522_STREAM

#define ISO13522_STREAM   0xF3

◆ LOG_MODULE

#define LOG_MODULE   "demux_ts"

HOW TO IMPLEMENT A DVBSUB DECODER.

The DVBSUB protocol is specified in ETSI EN 300 743. It can be downloaded for free (registration required, though) from www.etsi.org.

The spu_decoder should handle the packet type BUF_SPU_DVB.

BUF_SPU_DVBSUB packets without the flag BUF_FLAG_SPECIAL contain the payload of the PES packets carrying DVBSUB data. Since the payload can be broken up over several buf_element_t and the DVBSUB is PES oriented, the decoder_info[2] field (low 16 bits) is used to convey the packet boundaries to the decoder:

  • For the first buffer of a packet, buf->content points to the first byte of the PES payload. decoder_info[2] is set to the length of the payload. The decoder can use this value to determine when a complete PES packet has been collected.
  • For the following buffers of the PES packet, decoder_info[2] is 0.

The decoder can either use this information to reconstruct the PES payload, or ignore it and implement a parser that handles the irregularites at the start and end of PES packets.

In any case buf->pts is always set to the PTS of the PES packet.

BUF_SPU_DVB with BUF_FLAG_SPECIAL set contains no payload, and is used to pass control information to the decoder.

If decoder_info[1] == BUF_SPECIAL_SPU_DVB_DESCRIPTOR then decoder_info_ptr[2] either points to a spu_dvb_descriptor_t or is NULL.

If it is 0, the user has disabled the subtitling, or has selected a channel that is not present in the stream. The decoder should remove any visible subtitling.

If it is a pointer, the decoder should reset itself and start extracting the subtitle service identified by comp_page_id and aux_page_id in the spu_dvb_descriptor_t, (the composition and auxilliary page ids, respectively).

◆ LOG_VERBOSE

#define LOG_VERBOSE

◆ MAX

#define MAX (   a,
 
)    ((a)>(b)?(a):(b))

◆ MAX_AUDIO_TRACKS

#define MAX_AUDIO_TRACKS   32

◆ MAX_PIDS

#define MAX_PIDS   ((BODY_SIZE - 1 - 13) / 4) + 40

◆ MAX_PMTS

#define MAX_PMTS   128

◆ MAX_SPU_LANGS

#define MAX_SPU_LANGS   32

Referenced by demux_ts_parse_pmt().

◆ MIN

#define MIN (   a,
 
)    ((a)<(b)?(a):(b))

◆ MIN_SYNCS

#define MIN_SYNCS   3

Referenced by sync_correct(), and sync_detect().

◆ NPKT_PER_READ

#define NPKT_PER_READ   96

Referenced by demux_synchronise().

◆ NULL_PID

#define NULL_PID   0x1fff

Referenced by demux_ts_parse_packet().

◆ PADDING_STREAM

#define PADDING_STREAM   0xBE

◆ PAT_BUF_SIZE

#define PAT_BUF_SIZE   (4 * MAX_PMTS + 20)

Referenced by demux_ts_parse_pat().

◆ PKT_SIZE

#define PKT_SIZE   188

◆ PRIVATE_STREAM1

#define PRIVATE_STREAM1   0xBD

◆ PRIVATE_STREAM2

#define PRIVATE_STREAM2   0xBF

◆ PROG_STREAM_DIR

#define PROG_STREAM_DIR   0xFF

◆ PROG_STREAM_MAP

#define PROG_STREAM_MAP   0xBC

◆ PTS_AUDIO

#define PTS_AUDIO   0

Referenced by demux_ts_parse_packet().

◆ PTS_VIDEO

#define PTS_VIDEO   1

Referenced by demux_ts_parse_packet().

◆ SYNC_BYTE

#define SYNC_BYTE   0x47

◆ TBRE_MIN_TIME

#define TBRE_MIN_TIME   ( 2 * 90000)

Referenced by demux_ts_tbre_update().

◆ TBRE_MODE_AUDIO_PCR

#define TBRE_MODE_AUDIO_PCR   2

Referenced by demux_ts_parse_packet().

◆ TBRE_MODE_AUDIO_PTS

#define TBRE_MODE_AUDIO_PTS   1

Referenced by demux_ts_buffer_pes().

◆ TBRE_MODE_DONE

#define TBRE_MODE_DONE   4

Referenced by demux_ts_tbre_update().

◆ TBRE_MODE_PCR

#define TBRE_MODE_PCR   3

Referenced by demux_ts_parse_packet().

◆ TBRE_MODE_PROBE

#define TBRE_MODE_PROBE   0

Referenced by demux_ts_tbre_reset().

◆ TBRE_TIME

#define TBRE_TIME   (480 * 90000)

◆ VIDEO_STREAM_E

#define VIDEO_STREAM_E   0xEF

◆ VIDEO_STREAM_S

#define VIDEO_STREAM_S   0xE0

◆ WRAP_THRESHOLD

#define WRAP_THRESHOLD   360000

Referenced by check_newpts().

Enumeration Type Documentation

◆ streamType

enum streamType
Enumerator
ISO_11172_VIDEO 
ISO_13818_VIDEO 
ISO_11172_AUDIO 
ISO_13818_AUDIO 
ISO_13818_PRIVATE 
ISO_13818_PES_PRIVATE 
ISO_13522_MHEG 
ISO_13818_DSMCC 
ISO_13818_TYPE_A 
ISO_13818_TYPE_B 
ISO_13818_TYPE_C 
ISO_13818_TYPE_D 
ISO_13818_AUX 
ISO_13818_PART7_AUDIO 
ISO_14496_PART2_VIDEO 
ISO_14496_PART3_AUDIO 
ISO_14496_PART10_VIDEO 
STREAM_VIDEO_HEVC 
STREAM_VIDEO_MPEG 
STREAM_AUDIO_AC3 
STREAM_VIDEO_VC1 
HDMV_AUDIO_80_PCM 
HDMV_AUDIO_82_DTS 
HDMV_AUDIO_83_TRUEHD 
HDMV_AUDIO_84_EAC3 
HDMV_AUDIO_85_DTS_HRA 
HDMV_AUDIO_86_DTS_HD_MA 
HDMV_SPU_BITMAP 
HDMV_SPU_INTERACTIVE 
HDMV_SPU_TEXT 
STREAM_AUDIO_EAC3 
STREAM_AUDIO_DTS 

Function Documentation

◆ apid_check()

static int apid_check ( demux_ts_t this,
unsigned int  pid 
)
static

Referenced by demux_ts_parse_packet().

◆ check_newpts()

static void check_newpts ( demux_ts_t this,
int64_t  pts,
int  video 
)
static

◆ demux_send_special_spu_buf()

static void demux_send_special_spu_buf ( demux_ts_t this,
uint32_t  spu_type,
int  spu_channel 
)
static

◆ demux_synchronise()

static unsigned char* demux_synchronise ( demux_ts_t this)
static

◆ demux_ts_adaptation_field_parse()

static int64_t demux_ts_adaptation_field_parse ( uint8_t *  data,
uint32_t  adaptation_field_length 
)
static

Referenced by demux_ts_parse_packet().

◆ demux_ts_buffer_pes()

static void demux_ts_buffer_pes ( demux_ts_t this,
unsigned char *  ts,
unsigned int  mediaIndex,
unsigned int  pus,
unsigned int  cc,
unsigned int  len 
)
static

◆ demux_ts_dispose()

static void demux_ts_dispose ( demux_plugin_t this_gen)
static

References MAX_PIDS, MAX_PMTS, NULL, and xine_event_dispose_queue().

Referenced by open_plugin().

◆ demux_ts_dynamic_pmt_clean()

static void demux_ts_dynamic_pmt_clean ( demux_ts_t this)
static

◆ demux_ts_dynamic_pmt_clear()

static void demux_ts_dynamic_pmt_clear ( demux_ts_t this)
static

References INVALID_PID, and NULL.

Referenced by demux_ts_event_handler(), and demux_ts_parse_pat().

◆ demux_ts_dynamic_pmt_find()

static int demux_ts_dynamic_pmt_find ( demux_ts_t this,
int  pid,
int  type,
unsigned int  descriptor_tag 
)
static

◆ demux_ts_event_handler()

static void demux_ts_event_handler ( demux_ts_t this)
static

◆ demux_ts_flush()

static void demux_ts_flush ( demux_ts_t this)
static

◆ demux_ts_flush_media()

static void demux_ts_flush_media ( demux_ts_media m)
static

◆ demux_ts_get_capabilities()

static uint32_t demux_ts_get_capabilities ( demux_plugin_t this_gen)
static

References DEMUX_CAP_AUDIOLANG, and DEMUX_CAP_SPULANG.

Referenced by open_plugin().

◆ demux_ts_get_lang_desc()

static void demux_ts_get_lang_desc ( demux_ts_t this,
char *  dest,
const unsigned char *  data,
int  length 
)
static

◆ demux_ts_get_optional_data()

static int demux_ts_get_optional_data ( demux_plugin_t this_gen,
void *  data,
int  data_type 
)
static

◆ demux_ts_get_reg_desc()

static void demux_ts_get_reg_desc ( demux_ts_t this,
uint32_t *  dest,
const unsigned char *  data,
int  length 
)
static

◆ demux_ts_get_status()

static int demux_ts_get_status ( demux_plugin_t this_gen)
static

Referenced by open_plugin().

◆ demux_ts_get_stream_length()

static int demux_ts_get_stream_length ( demux_plugin_t this_gen)
static

References input().

Referenced by open_plugin().

◆ demux_ts_init_class()

void* demux_ts_init_class ( xine_t xine,
void *  data 
)

◆ demux_ts_parse_packet()

static void demux_ts_parse_packet ( demux_ts_t this)
static

◆ demux_ts_parse_pat()

static void demux_ts_parse_pat ( demux_ts_t this,
unsigned char *  original_pkt,
unsigned char *  pkt,
unsigned int  pusi,
int  len 
)
static

◆ demux_ts_parse_pes_header()

static int demux_ts_parse_pes_header ( xine_t xine,
demux_ts_media m,
uint8_t *  buf,
int  packet_len 
)
static

◆ demux_ts_parse_pmt()

static void demux_ts_parse_pmt ( demux_ts_t this,
unsigned char *  originalPkt,
unsigned char *  pkt,
unsigned int  pusi,
int  plen,
uint32_t  program_count 
)
static

◆ demux_ts_seek()

static int demux_ts_seek ( demux_plugin_t this_gen,
off_t  start_pos,
int  start_time,
int  playing 
)
static

◆ demux_ts_send_buffer()

static void demux_ts_send_buffer ( demux_ts_media m,
int  flags 
)
static

◆ demux_ts_send_chunk()

static int demux_ts_send_chunk ( demux_plugin_t this_gen)
static

◆ demux_ts_send_headers()

static void demux_ts_send_headers ( demux_plugin_t this_gen)
static

◆ demux_ts_tbre_reset()

static void demux_ts_tbre_reset ( demux_ts_t this)
static

◆ demux_ts_tbre_update()

static void demux_ts_tbre_update ( demux_ts_t this,
unsigned int  mode,
int64_t  now 
)
static

◆ demux_ts_update_spu_channel()

static void demux_ts_update_spu_channel ( demux_ts_t this)
static

◆ detect_ts()

static int detect_ts ( uint8_t *  buf,
size_t  len,
int  ts_size 
)
static

References SYNC_BYTE.

Referenced by open_plugin().

◆ open_plugin()

static demux_plugin_t* open_plugin ( demux_class_t class_gen,
xine_stream_t stream,
input_plugin_t input 
)
static

◆ post_sequence_end()

static void post_sequence_end ( fifo_buffer_t fifo,
uint32_t  video_type 
)
static

◆ reset_track_map()

static void reset_track_map ( fifo_buffer_t fifo)
static

◆ sync_correct()

static int sync_correct ( demux_ts_t this,
uint8_t *  buf,
int32_t  npkt_read 
)
static

◆ sync_detect()

static int sync_detect ( demux_ts_t this,
uint8_t *  buf,
int32_t  npkt_read 
)
static

References MIN, MIN_SYNCS, PKT_SIZE, SYNC_BYTE, and sync_correct().

Referenced by demux_synchronise().

◆ ts_payloadsize()

static int ts_payloadsize ( unsigned char *  tsp)
inlinestatic

◆ update_extra_info()

static void update_extra_info ( demux_ts_t this,
demux_ts_media m 
)
static