#include "libavutil/crc.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/log.h"
#include "libavutil/dict.h"
#include "libavutil/opt.h"
#include "libavcodec/bytestream.h"
#include "avformat.h"
#include "mpegts.h"
#include "internal.h"
#include "avio_internal.h"
#include "seek.h"
#include "mpeg.h"
#include "isom.h"
Go to the source code of this file.
Data Structures | |
struct | MpegTSPESFilter |
struct | MpegTSSectionFilter |
struct | MpegTSFilter |
struct | Program |
struct | MpegTSContext |
struct | PESContext |
struct | SectionHeader |
struct | StreamType |
Defines | |
#define | MAX_RESYNC_SIZE 65536 |
#define | MAX_PES_PAYLOAD 200*1024 |
#define | MAX_PIDS_PER_PROGRAM 64 |
#define | PES_START_SIZE 6 |
#define | PES_HEADER_SIZE 9 |
#define | MAX_PES_HEADER_SIZE (9 + 255) |
#define | CHECK_COUNT 10 |
#define | MAX_PACKET_READAHEAD ((128 * 1024) / 188) |
Typedefs | |
typedef struct MpegTSFilter | MpegTSFilter |
typedef int | PESCallback (MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos) |
typedef void | SectionCallback (MpegTSFilter *f, const uint8_t *buf, int len) |
typedef void | SetServiceCallback (void *opaque, int ret) |
Enumerations | |
enum | MpegTSFilterType { MPEGTS_PES, MPEGTS_SECTION } |
enum | MpegTSState { MPEGTS_HEADER = 0, MPEGTS_PESHEADER, MPEGTS_PESHEADER_FILL, MPEGTS_PAYLOAD, MPEGTS_SKIP } |
Functions | |
static void | clear_program (MpegTSContext *ts, unsigned int programid) |
static void | clear_programs (MpegTSContext *ts) |
static void | add_pat_entry (MpegTSContext *ts, unsigned int programid) |
static void | add_pid_to_pmt (MpegTSContext *ts, unsigned int programid, unsigned int pid) |
static void | set_pcr_pid (AVFormatContext *s, unsigned int programid, unsigned int pid) |
static int | discard_pid (MpegTSContext *ts, unsigned int pid) |
discard_pid() decides if the pid is to be discarded according to caller's programs selection | |
static void | write_section_data (AVFormatContext *s, MpegTSFilter *tss1, const uint8_t *buf, int buf_size, int is_start) |
Assemble PES packets out of TS packets, and then call the "section_cb" function when they are complete. | |
static MpegTSFilter * | mpegts_open_section_filter (MpegTSContext *ts, unsigned int pid, SectionCallback *section_cb, void *opaque, int check_crc) |
static MpegTSFilter * | mpegts_open_pes_filter (MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque) |
static void | mpegts_close_filter (MpegTSContext *ts, MpegTSFilter *filter) |
static int | analyze (const uint8_t *buf, int size, int packet_size, int *index) |
static int | get_packet_size (const uint8_t *buf, int size) |
static int | get8 (const uint8_t **pp, const uint8_t *p_end) |
static int | get16 (const uint8_t **pp, const uint8_t *p_end) |
static char * | getstr8 (const uint8_t **pp, const uint8_t *p_end) |
static int | parse_section_header (SectionHeader *h, const uint8_t **pp, const uint8_t *p_end) |
static void | mpegts_find_stream_type (AVStream *st, uint32_t stream_type, const StreamType *types) |
static int | mpegts_set_stream_info (AVStream *st, PESContext *pes, uint32_t stream_type, uint32_t prog_reg_desc) |
static void | new_pes_packet (PESContext *pes, AVPacket *pkt) |
static int | mpegts_push_data (MpegTSFilter *filter, const uint8_t *buf, int buf_size, int is_start, int64_t pos) |
static PESContext * | add_pes_stream (MpegTSContext *ts, int pid, int pcr_pid) |
static int | mp4_read_iods (AVFormatContext *s, const uint8_t *buf, unsigned size, int *es_id, uint8_t **dec_config_descr, int *dec_config_descr_size) |
int | ff_parse_mpeg2_descriptor (AVFormatContext *fc, AVStream *st, int stream_type, const uint8_t **pp, const uint8_t *desc_list_end, int mp4_dec_config_descr_len, int mp4_es_id, int pid, uint8_t *mp4_dec_config_descr) |
Parse an MPEG-2 descriptor. | |
static void | pmt_cb (MpegTSFilter *filter, const uint8_t *section, int section_len) |
static void | pat_cb (MpegTSFilter *filter, const uint8_t *section, int section_len) |
static void | sdt_cb (MpegTSFilter *filter, const uint8_t *section, int section_len) |
static int | handle_packet (MpegTSContext *ts, const uint8_t *packet) |
static int | mpegts_resync (AVFormatContext *s) |
static int | read_packet (AVFormatContext *s, uint8_t *buf, int raw_packet_size) |
static int | handle_packets (MpegTSContext *ts, int nb_packets) |
static int | mpegts_probe (AVProbeData *p) |
static int | parse_pcr (int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet) |
static int | mpegts_read_header (AVFormatContext *s, AVFormatParameters *ap) |
static int | mpegts_raw_read_packet (AVFormatContext *s, AVPacket *pkt) |
static int | mpegts_read_packet (AVFormatContext *s, AVPacket *pkt) |
static int | mpegts_read_close (AVFormatContext *s) |
static int64_t | mpegts_get_pcr (AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit) |
static int | read_seek (AVFormatContext *s, int stream_index, int64_t target_ts, int flags) |
MpegTSContext * | ff_mpegts_parse_open (AVFormatContext *s) |
int | ff_mpegts_parse_packet (MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len) |
void | ff_mpegts_parse_close (MpegTSContext *ts) |
Variables | |
static const AVOption | options [] |
static const AVClass | mpegtsraw_class |
AVInputFormat | ff_mpegts_demuxer |
static const StreamType | ISO_types [] |
static const StreamType | HDMV_types [] |
static const StreamType | MISC_types [] |
static const StreamType | REGD_types [] |
static const StreamType | DESC_types [] |
AVInputFormat | ff_mpegtsraw_demuxer |
#define CHECK_COUNT 10 |
#define MAX_PACKET_READAHEAD ((128 * 1024) / 188) |
#define MAX_PES_PAYLOAD 200*1024 |
#define MAX_PIDS_PER_PROGRAM 64 |
#define MAX_RESYNC_SIZE 65536 |
#define PES_HEADER_SIZE 9 |
#define PES_START_SIZE 6 |
typedef struct MpegTSFilter MpegTSFilter |
typedef int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos) |
typedef void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len) |
typedef void SetServiceCallback(void *opaque, int ret) |
enum MpegTSFilterType |
enum MpegTSState |
static void add_pat_entry | ( | MpegTSContext * | ts, | |
unsigned int | programid | |||
) | [static] |
static PESContext* add_pes_stream | ( | MpegTSContext * | ts, | |
int | pid, | |||
int | pcr_pid | |||
) | [static] |
static void add_pid_to_pmt | ( | MpegTSContext * | ts, | |
unsigned int | programid, | |||
unsigned int | pid | |||
) | [static] |
static int analyze | ( | const uint8_t * | buf, | |
int | size, | |||
int | packet_size, | |||
int * | index | |||
) | [static] |
static void clear_program | ( | MpegTSContext * | ts, | |
unsigned int | programid | |||
) | [static] |
static void clear_programs | ( | MpegTSContext * | ts | ) | [static] |
static int discard_pid | ( | MpegTSContext * | ts, | |
unsigned int | pid | |||
) | [static] |
discard_pid() decides if the pid is to be discarded according to caller's programs selection
ts | : - TS context | |
pid | : - pid |
Definition at line 242 of file mpegts.c.
Referenced by handle_packet().
void ff_mpegts_parse_close | ( | MpegTSContext * | ts | ) |
MpegTSContext* ff_mpegts_parse_open | ( | AVFormatContext * | s | ) |
int ff_mpegts_parse_packet | ( | MpegTSContext * | ts, | |
AVPacket * | pkt, | |||
const uint8_t * | buf, | |||
int | len | |||
) |
Definition at line 1863 of file mpegts.c.
Referenced by rtp_parse_one_packet(), and rtp_parse_packet_internal().
int ff_parse_mpeg2_descriptor | ( | AVFormatContext * | fc, | |
AVStream * | st, | |||
int | stream_type, | |||
const uint8_t ** | pp, | |||
const uint8_t * | desc_list_end, | |||
int | mp4_dec_config_descr_len, | |||
int | mp4_es_id, | |||
int | pid, | |||
uint8_t * | mp4_dec_config_descr | |||
) |
Parse an MPEG-2 descriptor.
[in] | fc | Format context (used for logging only) |
st | Stream | |
stream_type | STREAM_TYPE_xxx | |
pp | Descriptor buffer pointer | |
desc_list_end | End of buffer | |
mp4_dec_config_descr_len | Length of 'mp4_dec_config_descr', or zero if not present | |
mp4_es_id | ||
pid | ||
mp4_dec_config_descr |
Definition at line 912 of file mpegts.c.
Referenced by parse_chunks(), and pmt_cb().
static int get16 | ( | const uint8_t ** | pp, | |
const uint8_t * | p_end | |||
) | [inline, static] |
Definition at line 447 of file mpegts.c.
Referenced by ff_parse_mpeg2_descriptor(), parse_section_header(), pat_cb(), pmt_cb(), and sdt_cb().
static int get8 | ( | const uint8_t ** | pp, | |
const uint8_t * | p_end | |||
) | [inline, static] |
Definition at line 434 of file mpegts.c.
Referenced by ff_parse_mpeg2_descriptor(), getstr8(), parse_section_header(), pmt_cb(), and sdt_cb().
static int get_packet_size | ( | const uint8_t * | buf, | |
int | size | |||
) | [static] |
static char* getstr8 | ( | const uint8_t ** | pp, | |
const uint8_t * | p_end | |||
) | [static] |
static int handle_packet | ( | MpegTSContext * | ts, | |
const uint8_t * | packet | |||
) | [static] |
Definition at line 1272 of file mpegts.c.
Referenced by ff_mpegts_parse_packet(), and handle_packets().
static int handle_packets | ( | MpegTSContext * | ts, | |
int | nb_packets | |||
) | [static] |
Definition at line 1402 of file mpegts.c.
Referenced by mpegts_read_header(), and mpegts_read_packet().
static int mp4_read_iods | ( | AVFormatContext * | s, | |
const uint8_t * | buf, | |||
unsigned | size, | |||
int * | es_id, | |||
uint8_t ** | dec_config_descr, | |||
int * | dec_config_descr_size | |||
) | [static] |
static void mpegts_close_filter | ( | MpegTSContext * | ts, | |
MpegTSFilter * | filter | |||
) | [static] |
static void mpegts_find_stream_type | ( | AVStream * | st, | |
uint32_t | stream_type, | |||
const StreamType * | types | |||
) | [static] |
Definition at line 567 of file mpegts.c.
Referenced by ff_parse_mpeg2_descriptor(), and mpegts_set_stream_info().
static int64_t mpegts_get_pcr | ( | AVFormatContext * | s, | |
int | stream_index, | |||
int64_t * | ppos, | |||
int64_t | pos_limit | |||
) | [static] |
static MpegTSFilter* mpegts_open_pes_filter | ( | MpegTSContext * | ts, | |
unsigned int | pid, | |||
PESCallback * | pes_cb, | |||
void * | opaque | |||
) | [static] |
static MpegTSFilter* mpegts_open_section_filter | ( | MpegTSContext * | ts, | |
unsigned int | pid, | |||
SectionCallback * | section_cb, | |||
void * | opaque, | |||
int | check_crc | |||
) | [static] |
static int mpegts_probe | ( | AVProbeData * | p | ) | [static] |
static int mpegts_push_data | ( | MpegTSFilter * | filter, | |
const uint8_t * | buf, | |||
int | buf_size, | |||
int | is_start, | |||
int64_t | pos | |||
) | [static] |
static int mpegts_raw_read_packet | ( | AVFormatContext * | s, | |
AVPacket * | pkt | |||
) | [static] |
static int mpegts_read_close | ( | AVFormatContext * | s | ) | [static] |
static int mpegts_read_header | ( | AVFormatContext * | s, | |
AVFormatParameters * | ap | |||
) | [static] |
static int mpegts_read_packet | ( | AVFormatContext * | s, | |
AVPacket * | pkt | |||
) | [static] |
static int mpegts_resync | ( | AVFormatContext * | s | ) | [static] |
static int mpegts_set_stream_info | ( | AVStream * | st, | |
PESContext * | pes, | |||
uint32_t | stream_type, | |||
uint32_t | prog_reg_desc | |||
) | [static] |
static void new_pes_packet | ( | PESContext * | pes, | |
AVPacket * | pkt | |||
) | [static] |
Definition at line 631 of file mpegts.c.
Referenced by mpegts_push_data(), and mpegts_read_packet().
static int parse_pcr | ( | int64_t * | ppcr_high, | |
int * | ppcr_low, | |||
const uint8_t * | packet | |||
) | [static] |
Definition at line 1462 of file mpegts.c.
Referenced by mpegts_get_pcr(), mpegts_raw_read_packet(), and mpegts_read_header().
static int parse_section_header | ( | SectionHeader * | h, | |
const uint8_t ** | pp, | |||
const uint8_t * | p_end | |||
) | [static] |
static void pat_cb | ( | MpegTSFilter * | filter, | |
const uint8_t * | section, | |||
int | section_len | |||
) | [static] |
static void pmt_cb | ( | MpegTSFilter * | filter, | |
const uint8_t * | section, | |||
int | section_len | |||
) | [static] |
static int read_packet | ( | AVFormatContext * | s, | |
uint8_t * | buf, | |||
int | raw_packet_size | |||
) | [static] |
static int read_seek | ( | AVFormatContext * | s, | |
int | stream_index, | |||
int64_t | target_ts, | |||
int | flags | |||
) | [static] |
static void sdt_cb | ( | MpegTSFilter * | filter, | |
const uint8_t * | section, | |||
int | section_len | |||
) | [static] |
static void set_pcr_pid | ( | AVFormatContext * | s, | |
unsigned int | programid, | |||
unsigned int | pid | |||
) | [static] |
static void write_section_data | ( | AVFormatContext * | s, | |
MpegTSFilter * | tss1, | |||
const uint8_t * | buf, | |||
int | buf_size, | |||
int | is_start | |||
) | [static] |
Assemble PES packets out of TS packets, and then call the "section_cb" function when they are complete.
Definition at line 271 of file mpegts.c.
Referenced by handle_packet().
const StreamType DESC_types[] [static] |
Initial value:
{ { 0x6a, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, { 0x7a, AVMEDIA_TYPE_AUDIO, CODEC_ID_EAC3 }, { 0x7b, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS }, { 0x56, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_DVB_TELETEXT }, { 0x59, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_DVB_SUBTITLE }, { 0 }, }
Initial value:
{ "mpegts", NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"), sizeof(MpegTSContext), mpegts_probe, mpegts_read_header, mpegts_read_packet, mpegts_read_close, read_seek, mpegts_get_pcr, .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, }
Initial value:
{ "mpegtsraw", NULL_IF_CONFIG_SMALL("MPEG-2 raw transport stream format"), sizeof(MpegTSContext), NULL, mpegts_read_header, mpegts_raw_read_packet, mpegts_read_close, read_seek, mpegts_get_pcr, .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, .priv_class = &mpegtsraw_class, }
const StreamType HDMV_types[] [static] |
Initial value:
{ { 0x80, AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_BLURAY }, { 0x81, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, { 0x82, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS }, { 0x83, AVMEDIA_TYPE_AUDIO, CODEC_ID_TRUEHD }, { 0x84, AVMEDIA_TYPE_AUDIO, CODEC_ID_EAC3 }, { 0x90, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_HDMV_PGS_SUBTITLE }, { 0 }, }
const StreamType ISO_types[] [static] |
Initial value:
{ { 0x01, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO }, { 0x02, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO }, { 0x03, AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3 }, { 0x04, AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3 }, { 0x0f, AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC }, { 0x10, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG4 }, { 0x11, AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC_LATM }, { 0x1b, AVMEDIA_TYPE_VIDEO, CODEC_ID_H264 }, { 0xd1, AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC }, { 0xea, AVMEDIA_TYPE_VIDEO, CODEC_ID_VC1 }, { 0 }, }
const StreamType MISC_types[] [static] |
Initial value:
{ { 0x81, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, { 0x8a, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS }, { 0 }, }
const AVClass mpegtsraw_class [static] |
Initial value:
{ .class_name = "mpegtsraw demuxer", .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, }
Initial value:
{ {"compute_pcr", "Compute exact PCR for each transport stream packet.", 0x42, FF_OPT_TYPE_INT, {.dbl = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, { NULL }, }
const StreamType REGD_types[] [static] |
Initial value:
{ { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC }, { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, { MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO, CODEC_ID_S302M }, { 0 }, }