kopia lustrzana https://github.com/kierank/libmpegts
688 wiersze
21 KiB
C
688 wiersze
21 KiB
C
/*****************************************************************************
|
|
* libmpegts.h : libmpegts public API
|
|
*****************************************************************************
|
|
* Copyright (C) 2010-11 Kieran Kunhya
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
|
|
*****************************************************************************/
|
|
|
|
#ifndef LIBMPEGTS_H
|
|
#define LIBMPEGTS_H
|
|
|
|
#if !defined(_STDINT_H) && !defined(_STDINT_H_) && \
|
|
!defined(_INTTYPES_H) && !defined(_INTTYPES_H_)
|
|
# ifdef _MSC_VER
|
|
# pragma message("You must include stdint.h or inttypes.h before libmpegts.h")
|
|
# else
|
|
# warning You must include stdint.h or inttypes.h before libmpegts.h
|
|
# endif
|
|
#endif
|
|
|
|
/**** Version ****/
|
|
#define LIBMPEGTS_API_VERSION_MAJOR 0
|
|
#define LIBMPEGTS_API_VERSION_MINOR 3
|
|
|
|
/**** Stream Formats ****/
|
|
/* Generic */
|
|
#define LIBMPEGTS_VIDEO_MPEG2 1
|
|
#define LIBMPEGTS_VIDEO_AVC 2
|
|
|
|
#define LIBMPEGTS_AUDIO_MPEG1 32
|
|
#define LIBMPEGTS_AUDIO_MPEG2 33
|
|
#define LIBMPEGTS_AUDIO_ADTS 34 /* Usually MPEG-2 AAC */
|
|
#define LIBMPEGTS_AUDIO_LATM 35 /* Usually MPEG-4 AAC */
|
|
#define LIBMPEGTS_AUDIO_AC3 36
|
|
#define LIBMPEGTS_AUDIO_EAC3 37
|
|
#define LIBMPEGTS_AUDIO_LPCM 38 /* Blu-Ray only */
|
|
#define LIBMPEGTS_AUDIO_DTS 39
|
|
|
|
/* Blu-Ray Stream Formats */
|
|
#define LIBMPEGTS_AUDIO_DOLBY_LOSSLESS 40 /* "Dolby Lossless audio stream for Primary audio" */
|
|
#define LIBMPEGTS_AUDIO_DTS_HD 41 /* "DTS-HD audio stream except XLL for Primary audio" */
|
|
#define LIBMPEGTS_AUDIO_DTS_HD_XLL 42 /* "DTS-HD audio stream XLL for Primary audio" */
|
|
#define LIBMPEGTS_AUDIO_EAC3_SECONDARY 43 /* "Dolby Digital Plus audio stream for Secondary audio" */
|
|
#define LIBMPEGTS_AUDIO_DTS_HD_SECONDARY 44 /* "DTS-HD LBR audio stream for Secondary audio" */
|
|
#define LIBMPEGTS_SUB_PRESENTATION_GRAPHICS 45
|
|
#define LIBMPEGTS_SUB_INTERACTIVE_GRAPHICS 46
|
|
#define LIBMPEGTS_SUB_TEXT 47
|
|
|
|
/* SMPTE Stream Formats */
|
|
#define LIBMPEGTS_AUDIO_302M 96
|
|
#define LIBMPEGTS_ANCILLARY_RDD11 97
|
|
#define LIBMPEGTS_ANCILLARY_2038 98
|
|
|
|
/* DVB Stream Formats */
|
|
#define LIBMPEGTS_DVB_SUB 128
|
|
#define LIBMPEGTS_DVB_TELETEXT 129
|
|
#define LIBMPEGTS_DVB_VBI 130
|
|
|
|
/* Misc */
|
|
|
|
|
|
/**** Stream IDs ****/
|
|
/* SMPTE 302M, AC3, DVB subtitles and Teletext use Private Stream 1 */
|
|
#define LIBMPEGTS_STREAM_ID_PRIVATE_1 0xbd
|
|
#define LIBMPEGTS_STREAM_ID_PRIVATE_2 0xbf
|
|
|
|
/* MPEG Audio (all types): 0xc0-0xdf */
|
|
#define LIBMPEGTS_STREAM_ID_MPEGAUDIO 0xc0
|
|
|
|
/* MPEG Video (all types): 0xe0-0xef */
|
|
#define LIBMPEGTS_STREAM_ID_MPEGVIDEO 0xe0
|
|
|
|
/**** Blu-Ray Information ****/
|
|
/* Blu-Ray Aspect Ratios */
|
|
#define LIBMPEGTS_HDMV_AR_4_3 2
|
|
#define LIBMPEGTS_HDMV_AR_16_9 3
|
|
|
|
/* Blu-Ray Video Formats */
|
|
#define LIBMPEGTS_HDMV_480I 1
|
|
#define LIBMPEGTS_HDMV_576I 2
|
|
#define LIBMPEGTS_HDMV_480P 3
|
|
#define LIBMPEGTS_HDMV_1080I 4
|
|
#define LIBMPEGTS_HDMV_720P 5
|
|
#define LIBMPEGTS_HDMV_1080P 6
|
|
#define LIBMPEGTS_HDMV_576P 7
|
|
|
|
/* DVB-AU AND Blu-Ray Frame Rate */
|
|
#define LIBMPEGTS_DVB_AU_23_976_FPS 1
|
|
#define LIBMPEGTS_DVB_AU_24_FPS 2
|
|
#define LIBMPEGTS_DVB_AU_25_FPS 3
|
|
#define LIBMPEGTS_DVB_AU_29_97_FPS 4
|
|
#define LIBMPEGTS_DVB_AU_30_FPS 5 /* Not allowed in Blu-Ray */
|
|
#define LIBMPEGTS_DVB_AU_50_FPS 6
|
|
#define LIBMPEGTS_DVB_AU_59_94_FPS 7
|
|
#define LIBMPEGTS_DVB_AU_60_FPS 8 /* Not allowed in Blu-Ray */
|
|
|
|
/**** DVB AU_information ****/
|
|
/* DVB-AU Pic-Struct MPEG-2 */
|
|
#define LIBMPEGTS_DVB_AU_PIC_STRUCT_NONE 1
|
|
#define LIBMPEGTS_DVB_AU_PIC_STRUCT_TOP_FIELD 2
|
|
#define LIBMPEGTS_DVB_AU_PIC_STRUCT_BOT_FIELD 3
|
|
|
|
/* DVB-AU Coding type MPEG-2 */
|
|
#define LIBMPEGTS_CODING_TYPE_I 1
|
|
#define LIBMPEGTS_CODING_TYPE_P 2
|
|
#define LIBMPEGTS_CODING_TYPE_B 3
|
|
|
|
/* DVB-AU Coding type H.264 */
|
|
#define LIBMPEGTS_CODING_TYPE_SLICE_IDR (1<<3)
|
|
#define LIBMPEGTS_CODING_TYPE_SLICE_I (1<<2)
|
|
#define LIBMPEGTS_CODING_TYPE_SLICE_P (1<<1)
|
|
#define LIBMPEGTS_CODING_TYPE_SLICE_B (1<<0)
|
|
|
|
/**** Audio Service Type ****/
|
|
#define LIBMPEGTS_AUDIO_SERVICE_UNDEFINED 0
|
|
#define LIBMPEGTS_AUDIO_SERVICE_CLEAN_EFFECTS 1
|
|
#define LIBMPEGTS_AUDIO_SERVICE_HEARING_IMPAIRED 2
|
|
#define LIBMPEGTS_AUDIO_SERVICE_VISUAL_IMPAIRED 3
|
|
|
|
/* TS types: Packetised Elementary Stream,
|
|
* Transport Stream, DVB, ATSC, CableLabs, ISDB, Generic (188 bytes),
|
|
* Blu-Ray HDMV (192 bytes) */
|
|
enum ts_type_t
|
|
{
|
|
TS_TYPE_GENERIC,
|
|
TS_TYPE_DVB,
|
|
TS_TYPE_CABLELABS,
|
|
TS_TYPE_ATSC,
|
|
TS_TYPE_ISDB,
|
|
TS_TYPE_BLU_RAY,
|
|
};
|
|
|
|
/**** Levels and Profiles ****/
|
|
/* MPEG-2 Levels */
|
|
enum mpeg2_level_t
|
|
{
|
|
LIBMPEGTS_MPEG2_LEVEL_LOW = 1,
|
|
LIBMPEGTS_MPEG2_LEVEL_MAIN,
|
|
LIBMPEGTS_MPEG2_LEVEL_HIGH_1440,
|
|
LIBMPEGTS_MPEG2_LEVEL_HIGH,
|
|
LIBMPEGTS_MPEG2_LEVEL_HIGHP,
|
|
};
|
|
|
|
/* MPEG-2 Profiles */
|
|
enum mpeg2_profile_t
|
|
{
|
|
LIBMPEGTS_MPEG2_PROFILE_SIMPLE,
|
|
LIBMPEGTS_MPEG2_PROFILE_MAIN,
|
|
LIBMPEGTS_MPEG2_PROFILE_422,
|
|
};
|
|
|
|
/* AVC Profiles */
|
|
enum avc_profile_t
|
|
{
|
|
AVC_BASELINE,
|
|
AVC_MAIN,
|
|
AVC_HIGH,
|
|
AVC_HIGH_10,
|
|
AVC_HIGH_422,
|
|
AVC_HIGH_444_PRED,
|
|
AVC_HIGH_10_INTRA,
|
|
AVC_HIGH_422_INTRA,
|
|
AVC_HIGH_444_INTRA,
|
|
AVC_CAVLC_444_INTRA,
|
|
};
|
|
|
|
/* Opaque Structure */
|
|
typedef struct ts_writer_t ts_writer_t;
|
|
|
|
// TODO make certain syntax elements updatable
|
|
/* General Stream Information
|
|
*
|
|
* PID
|
|
* stream_format - Use stream formats above
|
|
* stream_id - See Table 2-22 in ISO 13818-1
|
|
*
|
|
* audio_frame_size - size of one audio frame in 90KHz ticks. (e.g. for ac3 1536 * 90000/samplerate )
|
|
*
|
|
* write_lang_code - Write ISO 639 descriptor for audio
|
|
* lang_code - ISO 639 Part 2 Language code (or non-standard codes)
|
|
* audio_type - Audio service type
|
|
*
|
|
* has_stream_identifier - Set to 1 if stream identifier is present
|
|
* stream_identifier - Stream identifier
|
|
*
|
|
* dvb_au - write DVB AU_information elements (video streams only)
|
|
* dvb_au_frame_rate - DVB AU_information frame rate code (see above #defines)
|
|
*
|
|
* hdmv_frame_rate - For H.264 "Frame-rate = time_scale/num_units_in_tick/2" TODO MPEG-2 (see above #defines)
|
|
* hdmv_aspect_ratio - either LIBMPEGTS_HDMV_AR_4_3 or LIBMPEGTS_HDMV_AR_16_9
|
|
* hdmv_video_format - Video format (see above #defines) */
|
|
|
|
typedef struct
|
|
{
|
|
int pid;
|
|
int stream_format;
|
|
int stream_id;
|
|
|
|
int audio_frame_size;
|
|
|
|
int write_lang_code;
|
|
char lang_code[4];
|
|
int audio_type;
|
|
|
|
int has_stream_identifier;
|
|
int stream_identifier;
|
|
|
|
int dvb_au;
|
|
int dvb_au_frame_rate;
|
|
|
|
int hdmv_frame_rate;
|
|
int hdmv_aspect_ratio;
|
|
int hdmv_video_format;
|
|
} ts_stream_t;
|
|
|
|
/**** Stream attributes (DVB) ****/
|
|
|
|
#define DVB_SERVICE_TYPE_DIGITAL_TELEVISION 0x01
|
|
#define DVB_SERVICE_TYPE_DIGITAL_RADIO_SOUND 0x02
|
|
#define DVB_SERVICE_TYPE_TELETEXT 0x03
|
|
#define DVB_SERVICE_TYPE_ADVANCED_CODEC_SD 0x16
|
|
#define DVB_SERVICE_TYPE_ADVANCED_CODEC_HD 0x19
|
|
|
|
/* SDT Stream Information
|
|
*
|
|
* service_type - See above
|
|
* service_name - Self Explanatory
|
|
* provider_name - Self Explanatory */
|
|
|
|
typedef struct
|
|
{
|
|
int service_type;
|
|
char *service_name;
|
|
char *provider_name;
|
|
} sdt_program_ctx_t;
|
|
|
|
/* Program attributes:
|
|
*
|
|
* PIDs must be between 33 and 8190 (DVB)
|
|
* program_num must be between 1 and 8190
|
|
* PCR PID can be the same as a stream in the program (video PID or separate PID recommended)
|
|
*
|
|
* is_3dtv -
|
|
* Write 3d_MPEG2_descriptor in PMT (CableLabs OC-SP-CEP3.0-I01-100827).
|
|
* Stream MUST have appropriate MPEG-2 user_data or AVC SEI with 3D information.
|
|
*
|
|
* Smoothing Buffer (Required for ATSC) -
|
|
* sb_leak_rate - smoothing buffer leak rate (in units of 400 bits/s)
|
|
* sb_size - in bytes
|
|
*/
|
|
typedef struct
|
|
{
|
|
int pmt_pid;
|
|
int program_num;
|
|
int pcr_pid;
|
|
|
|
int num_streams;
|
|
ts_stream_t *streams;
|
|
|
|
int is_3dtv;
|
|
|
|
/* ATSC */
|
|
int sb_leak_rate;
|
|
int sb_size;
|
|
|
|
/* DVB */
|
|
sdt_program_ctx_t sdt;
|
|
} ts_program_t;
|
|
|
|
/**** Functions ****/
|
|
|
|
/* Create Writer */
|
|
ts_writer_t *ts_create_writer( void );
|
|
|
|
/*
|
|
* ts_id - Transport Stream ID
|
|
* muxrate - Transport stream muxing rate
|
|
* cbr - Pad to constant bitrate with null packets
|
|
* ts_type - Type of transport stream to write
|
|
* network_pid - PID of the network table (0 otherwise)
|
|
* legacy_constraints - Comply with CableLabs legacy contraints in Section 7.3 of Content Encoding Profiles 3.0 Specification
|
|
*
|
|
* retransmit periods in milliseconds
|
|
*
|
|
* CURRENT LIMITATIONS
|
|
*
|
|
* Single Program Transport Streams only supported currently.
|
|
* Only one video stream allowed.
|
|
*
|
|
*
|
|
* */
|
|
|
|
typedef struct ts_main_t
|
|
{
|
|
int num_programs;
|
|
ts_program_t *programs;
|
|
|
|
int ts_id;
|
|
int muxrate;
|
|
int cbr;
|
|
int ts_type;
|
|
|
|
int network_pid;
|
|
|
|
int legacy_constraints;
|
|
|
|
int pcr_period;
|
|
int pat_period;
|
|
|
|
// FIXME dvb land
|
|
int network_id;
|
|
int sdt_period;
|
|
int nit_period;
|
|
int tdt_period;
|
|
int tot_period;
|
|
} ts_main_t;
|
|
|
|
int ts_setup_transport_stream( ts_writer_t *w, ts_main_t *params );
|
|
|
|
/**** Additional Codec-Specific functions ****/
|
|
/* Many formats require extra information. Setup the relevant information using the following functions */
|
|
|
|
/* Video */
|
|
/* Setup / Update MPEG Video
|
|
* Mandatory before writing any MPEG Video Stream.
|
|
*
|
|
* MPEG-2 Video Stream
|
|
*
|
|
* level - MPEG-2 level
|
|
* profile - MPEG-2 profile
|
|
* vbv_maxrate - maximum bitrate into the vbv in bits/s
|
|
* vbv_bufsize - vbv buffer size
|
|
* frame_rate - MPEG-2 framerate code
|
|
*
|
|
* AVC Stream
|
|
*
|
|
* level_idc / profile_idc are as defined in the AVC Specification.
|
|
* vbv_maxrate - maximum bitrate into the vbv in bits/s
|
|
* vbv_bufsize - vbv buffer size
|
|
* frame_rate - not used in AVC
|
|
*
|
|
* The only supported AVC files are those with a Buffering Period SEI at each keyframe but nal_hrd_parameters_present set to 0.
|
|
* This is owing to bugs/inconsistencies in the TS specification. This does not apply to Blu-Ray. */
|
|
|
|
int ts_setup_mpegvideo_stream( ts_writer_t *w, int pid, int level, int profile, int vbv_maxrate, int vbv_bufsize, int frame_rate );
|
|
|
|
/* Audio */
|
|
#define LIBMPEGTS_MPEG2_AAC_MAIN_PROFILE 0
|
|
#define LIBMPEGTS_MPEG2_AAC_LC_PROFILE 1
|
|
|
|
#define LIBMPEGTS_MPEG2_AAC_1_CHANNEL 1
|
|
#define LIBMPEGTS_MPEG2_AAC_2_CHANNEL 2
|
|
#define LIBMPEGTS_MPEG2_AAC_3_CHANNEL 3
|
|
#define LIBMPEGTS_MPEG2_AAC_4_CHANNEL 4
|
|
#define LIBMPEGTS_MPEG2_AAC_5_CHANNEL 5
|
|
#define LIBMPEGTS_MPEG2_AAC_5_POINT_1_CHANNEL 6
|
|
#define LIBMPEGTS_MPEG2_AAC_7_POINT_1_CHANNEL 7
|
|
|
|
/* Setup / Update MPEG-2 AAC Stream
|
|
*
|
|
*/
|
|
|
|
int ts_setup_mpeg2_aac_stream( ts_writer_t *w, int pid, int profile, int channel_map );
|
|
|
|
#define LIBMPEGTS_MPEG4_AAC_MAIN_PROFILE_LEVEL_1 0x10
|
|
#define LIBMPEGTS_MPEG4_AAC_MAIN_PROFILE_LEVEL_2 0x11
|
|
#define LIBMPEGTS_MPEG4_AAC_MAIN_PROFILE_LEVEL_3 0x12
|
|
#define LIBMPEGTS_MPEG4_AAC_MAIN_PROFILE_LEVEL_4 0x13
|
|
#define LIBMPEGTS_MPEG4_AAC_PROFILE_LEVEL_1 0x50
|
|
#define LIBMPEGTS_MPEG4_AAC_PROFILE_LEVEL_2 0x51
|
|
#define LIBMPEGTS_MPEG4_AAC_PROFILE_LEVEL_4 0x52
|
|
#define LIBMPEGTS_MPEG4_AAC_PROFILE_LEVEL_5 0x53
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_PROFILE_LEVEL_2 0x58
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_PROFILE_LEVEL_3 0x59
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_PROFILE_LEVEL_4 0x5a
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_PROFILE_LEVEL_5 0x5b
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_V2_PROFILE_LEVEL_2 0x60
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_V2_PROFILE_LEVEL_3 0x61
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_V2_PROFILE_LEVEL_4 0x62
|
|
#define LIBMPEGTS_MPEG4_HE_AAC_V2_PROFILE_LEVEL_5 0x63
|
|
|
|
/* Setup / Update MPEG-4 AAC Stream
|
|
* profile_and_level - self explanatory
|
|
* num_channels - number of channels (excluding LFE channel)
|
|
*
|
|
* It is the responsibility of the calling application to encapsulate using ADTS or LATM
|
|
*/
|
|
|
|
int ts_setup_mpeg4_aac_stream( ts_writer_t *w, int pid, int profile_and_level, int num_channels );
|
|
|
|
/* Setup / Update SMPTE 302M Stream
|
|
* Mandatory before writing any 302M Stream.
|
|
*
|
|
* bit_depth - 16, 20 or 24 bits per sample.
|
|
* num_channels - 2, 4, 6 or 8 channels.
|
|
*
|
|
* As per SMPTE 302M the sample rate can only be 48000Hz.
|
|
* Notes: The PTS of a SMPTE 302M frame shall be within 2ms of the corresponding video frame
|
|
* It is the responsibility of the calling application to encapsulate the SMPTE 302M data. */
|
|
|
|
int ts_setup_302m_stream( ts_writer_t *w, int pid, int bit_depth, int num_channels );
|
|
|
|
/**** DVB Specific Information ****/
|
|
|
|
/* DVB Subtitles */
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_EBU_TELETEXT 0x01
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_ASSOCIATED_EBU_TELETEXT 0x02
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_VBI_DATA 0x03
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_NORMAL_NO_AR 0x10
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_NORMAL_4_3_AR 0x11
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_NORMAL_2_21_1_AR 0x13
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_NORMAL_HD 0x14
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_HEARING_NO_AR 0x20
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_HEARING_4_3_AR 0x21
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_HEARING_16_9_AR 0x22
|
|
#define LIBMPEGTS_DVB_SUB_TYPE_HEARING_HD 0x24
|
|
|
|
/* ts_dvb_sub_t
|
|
*
|
|
* lang_code - ISO 639 Part 2 Language code
|
|
* subtitling_type - see above #defines
|
|
* composition_page_id - composition page
|
|
* ancillary_page_id - optional ancillary page (should be set to composition page otherwise)
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
char lang_code[4];
|
|
int subtitling_type;
|
|
int composition_page_id;
|
|
int ancillary_page_id;
|
|
} ts_dvb_sub_t;
|
|
|
|
/* ts_setup_dvb_subtitles
|
|
*
|
|
* has_dds - has display definition segment
|
|
*/
|
|
|
|
int ts_setup_dvb_subtitles( ts_writer_t *w, int pid, int has_dds, int num_subtitles, ts_dvb_sub_t *subtitles );
|
|
|
|
/* DVB Teletext */
|
|
#define LIBMPEGTS_DVB_TTX_TYPE_INITIAL 0x01
|
|
#define LIBMPEGTS_DVB_TTX_TYPE_SUB 0x02
|
|
#define LIBMPEGTS_DVB_TTX_TYPE_ADDITIONAL_INFO 0x03
|
|
#define LIBMPEGTS_DVB_TTX_TYPE_SCHEDULE 0x04
|
|
#define LIBMPEGTS_DVB_TTX_TYPE_SUB_HEARING_IMP 0x05
|
|
|
|
/* ts_dvb_ttx_t
|
|
* lang_code - ISO 639 Part 2 Language code
|
|
* teletext_type - see above #defines
|
|
* teletext_magazine_number - self explanatory
|
|
* teletext_page_number - self explanatory
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
char lang_code[4];
|
|
int teletext_type;
|
|
int teletext_magazine_number;
|
|
int teletext_page_number;
|
|
} ts_dvb_ttx_t;
|
|
|
|
int ts_setup_dvb_teletext( ts_writer_t *w, int pid, int num_teletexts, ts_dvb_ttx_t *teletexts );
|
|
|
|
/* ts_dvb_vbi_t
|
|
* field_parity - 1 for first field (odd), 0 for second field (even)
|
|
* line_offset - line number on which data is presented if it is transcoded into the VBI
|
|
*/
|
|
typedef struct
|
|
{
|
|
int field_parity;
|
|
int line_offset;
|
|
} ts_dvb_vbi_line_t;
|
|
|
|
/* DVB service-ids */
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_TTX 0x01 /* Requires call to ts_setup_dvb_teletext */
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_INVERTED_TTX 0x02
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_VPS 0x04
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_WSS 0x05
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_CC 0x06
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_MONO_SAMPLES 0x07
|
|
|
|
/* SCTE-127 service-ids */
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_VITC 0xf7
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_COPY_PROTECTION 0xf9
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_TVG2X 0xfb
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_NABTS 0xfc
|
|
#define LIBMPEGTS_DVB_VBI_DATA_SERVICE_ID_AMOL_48_96 0xfe
|
|
|
|
/* ts_dvb_vbi_t
|
|
* data_service_id - see above #defines
|
|
* lines - one ts_dvb_vbi_line_t per line
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
int data_service_id;
|
|
int num_lines;
|
|
ts_dvb_vbi_line_t *lines;
|
|
} ts_dvb_vbi_t;
|
|
|
|
int ts_setup_dvb_vbi( ts_writer_t *w, int pid, int num_vbis, ts_dvb_vbi_t *vbis );
|
|
|
|
/* Service Description Table
|
|
*
|
|
* ts_setup_sdt enables SDT
|
|
* ts_remove_sdt disables SDT
|
|
*
|
|
*/
|
|
|
|
int ts_setup_sdt( ts_writer_t *w );
|
|
void ts_remove_sdt( ts_writer_t *w );
|
|
|
|
/* Network Information Table */
|
|
|
|
typedef struct
|
|
{
|
|
|
|
} ts_dvb_nit_t;
|
|
|
|
int ts_setup_nit( ts_writer_t *w );
|
|
void ts_update_nit( ts_writer_t *w );
|
|
void ts_remove_nit( ts_writer_t *w );
|
|
|
|
/* EIT
|
|
* FIXME only now and next
|
|
* */
|
|
|
|
int ts_setup_eit( ts_writer_t *w );
|
|
void ts_update_eit( ts_writer_t *w );
|
|
void ts_remove_eit( ts_writer_t *w );
|
|
|
|
/* TDT
|
|
*
|
|
* */
|
|
|
|
int ts_setup_tdt( ts_writer_t *w );
|
|
void ts_remove_tdt( ts_writer_t *w );
|
|
|
|
/* Time Offset Table
|
|
*
|
|
* */
|
|
|
|
int ts_setup_tot( ts_writer_t *w );
|
|
void ts_remove_tot( ts_writer_t *w );
|
|
|
|
/**** DVB / Blu-Ray Tables ****/
|
|
|
|
/* SIT
|
|
*
|
|
* */
|
|
|
|
int ts_setup_sit( ts_writer_t *w );
|
|
void ts_update_sit( ts_writer_t *w );
|
|
int ts_remove_sit( ts_writer_t *w );
|
|
|
|
/**** ATSC/CableLabs specific information ****/
|
|
|
|
/* ATSC Setup/Update AC3 stream
|
|
*
|
|
* Note: This channel status refers to channel map the current program being broadcast.
|
|
* If the channel changes from 5.1 to 2.0 for an advertising break, this
|
|
* need not be updated. On changing to a program with a different channel map,
|
|
* this descriptor should be updated.
|
|
*/
|
|
|
|
//int ts_setup_atsc_ac3_stream( ts_writer_t *w, int pid, ts_atsc_ac3_info *ac3_info );
|
|
|
|
/**** Cablelabs specific information ****/
|
|
|
|
|
|
/**** Blu-Ray specific information ****/
|
|
|
|
/* Setup HDMV LPCM Stream
|
|
*
|
|
* num_channels - number of audio channels
|
|
* sample_rate - sample rate in KHz
|
|
* bits_per_sample - number of bits per sample
|
|
*
|
|
* NOTE: It is the responsibility of the calling application to write the appropriate LPCM headers
|
|
*/
|
|
int ts_setup_hdmv_lpcm_stream( ts_writer_t *w, int pid, int num_channels, int sample_rate, int bits_per_sample );
|
|
|
|
/* Digital Transmission Content Protection
|
|
*
|
|
* See Appendix B of DTCP Specification for information about DTCP_descriptor
|
|
* byte_1 and byte_2 correspond to the two private_data_bytes in the DTCP_descriptor
|
|
*/
|
|
int ts_setup_dtcp( ts_writer_t *w, uint8_t byte_1, uint8_t byte_2 );
|
|
|
|
/* TODO: other relevant tables */
|
|
|
|
/* Writing frames to libmpegts
|
|
*
|
|
* The duration of a video frame and associated audio frames must be as close as possible.
|
|
* The duration of audio frames can either be slighly less, equal to (rare), or slightly greater than
|
|
* the video frame duration - libmpegts can handle all three conditions.
|
|
* There should be no more than one frame with a DTS larger than that of the associated video stream.
|
|
*
|
|
* The DTS of a given PID must be monotonically increasing. Interleaving of frames from different streams is allowed.
|
|
* Only a single video frame at a time must be written. */
|
|
|
|
/* ts_frame_t
|
|
*
|
|
* PID - Packet Identifier (i.e. which stream the payload is associated with)
|
|
*
|
|
* ** Video Only **
|
|
*
|
|
* CPB Initial Arrival Time - initial arrival time of picture in CPB (in 27MHz clock ticks)
|
|
* CPB Final Arrival Time - final arrival time of picture in CPB (in 27MHz clock ticks)
|
|
* DTS - Decode Time Stamp (in 90kHz clock ticks - maximum 30 bits)
|
|
* PTS - Presentation Time Stamp (in 90kHz clock ticks - maximum 30 bits)
|
|
* (PTS and DTS may have codec-specific meanings. See ISO 13818-1 for more information)
|
|
* Generally, non-video formats have PTS equal to DTS.
|
|
*
|
|
* This data does not need to be wrapped around )
|
|
* random_access - Data contains an "elementary stream access point"
|
|
* priority - Indicate payload has priority
|
|
* (random_access and priority can be codec specific. See ISO 13818-1 for more information.)
|
|
*
|
|
* DVB AU_information fields
|
|
* frame_type - Single Value for MPEG-2, Bitfield for AVC (see above #defines)
|
|
* ref_pic_idc - Set if frame is needed for reconstruction of other frames (MPEG-2), nal_ref_idc in AVC
|
|
* write_pulldown_info - Write pulldown info in AU_Information
|
|
* pic_struct - AVC pic_struct element - only used if write_pulldown_info set
|
|
*
|
|
* opaque - opaque pointer that libmpegts does nothing with
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t *data;
|
|
int size;
|
|
int pid;
|
|
int64_t cpb_initial_arrival_time;
|
|
int64_t cpb_final_arrival_time;
|
|
int64_t dts;
|
|
int64_t pts;
|
|
int random_access;
|
|
int priority;
|
|
|
|
/* DVB AU_Information specific fields */
|
|
uint8_t frame_type;
|
|
int ref_pic_idc;
|
|
int write_pulldown_info;
|
|
int pic_struct;
|
|
|
|
void *opaque;
|
|
} ts_frame_t;
|
|
|
|
/* ts_write_frames
|
|
*
|
|
* libmpegts buffers one frame so the last set of packets can be output by setting num_frames = 0.
|
|
*
|
|
* pcr_list contains an array of pcr values, one for each output packet. The array length is len/188.
|
|
* NOTE: This PCR list does not wrap around
|
|
*
|
|
*/
|
|
|
|
int ts_write_frames( ts_writer_t *w, ts_frame_t *frames, int num_frames, uint8_t **out, int *len, int64_t **pcr_list );
|
|
|
|
/* INACTIVE
|
|
*
|
|
* */
|
|
int ts_delete_stream( ts_writer_t *w, int pid );
|
|
|
|
|
|
|
|
int ts_close_writer( ts_writer_t *w );
|
|
|
|
/* Examples TODO */
|
|
|
|
|
|
|
|
#endif
|