2 * MPEG2 transport stream (aka DVB) demuxer
3 * Copyright (c) 2002-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/buffer.h"
23 #include "libavutil/crc.h"
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/log.h"
26 #include "libavutil/dict.h"
27 #include "libavutil/mathematics.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/avassert.h"
30 #include "libavcodec/bytestream.h"
31 #include "libavcodec/get_bits.h"
35 #include "avio_internal.h"
40 /* maximum size in which we look for synchronisation if
41 * synchronisation is lost */
42 #define MAX_RESYNC_SIZE 65536
44 #define MAX_PES_PAYLOAD 200 * 1024
46 #define MAX_MP4_DESCR_COUNT 16
48 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
50 if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
51 (modulus) = (dividend) % (divisor); \
52 (prev_dividend) = (dividend); \
55 enum MpegTSFilterType
{
61 typedef struct MpegTSFilter MpegTSFilter
;
63 typedef int PESCallback (MpegTSFilter
*f
, const uint8_t *buf
, int len
,
64 int is_start
, int64_t pos
);
66 typedef struct MpegTSPESFilter
{
71 typedef void SectionCallback (MpegTSFilter
*f
, const uint8_t *buf
, int len
);
73 typedef void SetServiceCallback (void *opaque
, int ret
);
75 typedef struct MpegTSSectionFilter
{
79 unsigned int check_crc
: 1;
80 unsigned int end_of_section_reached
: 1;
81 SectionCallback
*section_cb
;
83 } MpegTSSectionFilter
;
88 int last_cc
; /* last cc code (-1 if first packet) */
90 enum MpegTSFilterType type
;
92 MpegTSPESFilter pes_filter
;
93 MpegTSSectionFilter section_filter
;
97 #define MAX_PIDS_PER_PROGRAM 64
99 unsigned int id
; // program id/service id
100 unsigned int nb_pids
;
101 unsigned int pids
[MAX_PIDS_PER_PROGRAM
];
103 /** have we found pmt for this program */
107 struct MpegTSContext
{
108 const AVClass
*class;
110 AVFormatContext
*stream
;
111 /** raw packet size, including FEC if present */
116 #define SIZE_STAT_THRESHOLD 10
120 /** if true, all pids are analyzed to find streams */
123 /** compute exact PCR for each transport stream packet */
124 int mpeg2ts_compute_pcr
;
126 /** fix dvb teletext pts */
127 int fix_teletext_pts
;
129 int64_t cur_pcr
; /**< used to estimate the exact PCR */
130 int pcr_incr
; /**< used to estimate the exact PCR */
132 /* data needed to handle file based ts */
133 /** stop parsing loop */
135 /** packet containing Audio/Video data */
137 /** to detect seek */
145 /******************************************/
146 /* private mpegts data */
148 /** structure to keep track of Program->pids mapping */
152 int8_t crc_validity
[NB_PID_MAX
];
153 /** filters for various streams specified by PMT + for the PAT and PMT */
154 MpegTSFilter
*pids
[NB_PID_MAX
];
158 #define MPEGTS_OPTIONS \
159 { "resync_size", "Size limit for looking up a new synchronization.", offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }
161 static const AVOption options
[] = {
163 {"fix_teletext_pts", "Try to fix pts values of dvb teletext streams.", offsetof(MpegTSContext
, fix_teletext_pts
), AV_OPT_TYPE_INT
,
164 {.i64
= 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
165 {"ts_packetsize", "Output option carrying the raw packet size.", offsetof(MpegTSContext
, raw_packet_size
), AV_OPT_TYPE_INT
,
166 {.i64
= 0}, 0, 0, AV_OPT_FLAG_DECODING_PARAM
| AV_OPT_FLAG_EXPORT
| AV_OPT_FLAG_READONLY
},
167 {"skip_changes", "Skip changing / adding streams / programs.", offsetof(MpegTSContext
, skip_changes
), AV_OPT_TYPE_INT
,
168 {.i64
= 0}, 0, 1, 0 },
169 {"skip_clear", "Skip clearing programs.", offsetof(MpegTSContext
, skip_clear
), AV_OPT_TYPE_INT
,
170 {.i64
= 0}, 0, 1, 0 },
174 static const AVClass mpegts_class
= {
175 .class_name
= "mpegts demuxer",
176 .item_name
= av_default_item_name
,
178 .version
= LIBAVUTIL_VERSION_INT
,
181 static const AVOption raw_options
[] = {
183 { "compute_pcr", "Compute exact PCR for each transport stream packet.",
184 offsetof(MpegTSContext
, mpeg2ts_compute_pcr
), AV_OPT_TYPE_INT
,
185 { .i64
= 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
186 { "ts_packetsize", "Output option carrying the raw packet size.",
187 offsetof(MpegTSContext
, raw_packet_size
), AV_OPT_TYPE_INT
,
189 AV_OPT_FLAG_DECODING_PARAM
| AV_OPT_FLAG_EXPORT
| AV_OPT_FLAG_READONLY
},
193 static const AVClass mpegtsraw_class
= {
194 .class_name
= "mpegtsraw demuxer",
195 .item_name
= av_default_item_name
,
196 .option
= raw_options
,
197 .version
= LIBAVUTIL_VERSION_INT
,
200 /* TS stream handling */
205 MPEGTS_PESHEADER_FILL
,
210 /* enough for PES header + length */
211 #define PES_START_SIZE 6
212 #define PES_HEADER_SIZE 9
213 #define MAX_PES_HEADER_SIZE (9 + 255)
215 typedef struct PESContext
{
217 int pcr_pid
; /**< if -1 then all packets containing PCR are considered */
220 AVFormatContext
*stream
;
222 AVStream
*sub_st
; /**< stream for the embedded AC3 stream in HDMV TrueHD */
223 enum MpegTSState state
;
224 /* used to get the format */
226 int flags
; /**< copied to the AVPacket flags */
229 int extended_stream_id
;
231 int64_t ts_packet_pos
; /**< position of first TS packet of this PES packet */
232 uint8_t header
[MAX_PES_HEADER_SIZE
];
237 extern AVInputFormat ff_mpegts_demuxer
;
239 static struct Program
* get_program(MpegTSContext
*ts
, unsigned int programid
)
242 for (i
= 0; i
< ts
->nb_prg
; i
++) {
243 if (ts
->prg
[i
].id
== programid
) {
250 static void clear_avprogram(MpegTSContext
*ts
, unsigned int programid
)
252 AVProgram
*prg
= NULL
;
255 for (i
= 0; i
< ts
->stream
->nb_programs
; i
++)
256 if (ts
->stream
->programs
[i
]->id
== programid
) {
257 prg
= ts
->stream
->programs
[i
];
262 prg
->nb_stream_indexes
= 0;
265 static void clear_program(MpegTSContext
*ts
, unsigned int programid
)
269 clear_avprogram(ts
, programid
);
270 for (i
= 0; i
< ts
->nb_prg
; i
++)
271 if (ts
->prg
[i
].id
== programid
) {
272 ts
->prg
[i
].nb_pids
= 0;
273 ts
->prg
[i
].pmt_found
= 0;
277 static void clear_programs(MpegTSContext
*ts
)
283 static void add_pat_entry(MpegTSContext
*ts
, unsigned int programid
)
286 if (av_reallocp_array(&ts
->prg
, ts
->nb_prg
+ 1, sizeof(*ts
->prg
)) < 0) {
290 p
= &ts
->prg
[ts
->nb_prg
];
297 static void add_pid_to_pmt(MpegTSContext
*ts
, unsigned int programid
,
300 struct Program
*p
= get_program(ts
, programid
);
304 if (p
->nb_pids
>= MAX_PIDS_PER_PROGRAM
)
306 p
->pids
[p
->nb_pids
++] = pid
;
309 static void set_pmt_found(MpegTSContext
*ts
, unsigned int programid
)
311 struct Program
*p
= get_program(ts
, programid
);
318 static void set_pcr_pid(AVFormatContext
*s
, unsigned int programid
, unsigned int pid
)
321 for (i
= 0; i
< s
->nb_programs
; i
++) {
322 if (s
->programs
[i
]->id
== programid
) {
323 s
->programs
[i
]->pcr_pid
= pid
;
330 * @brief discard_pid() decides if the pid is to be discarded according
331 * to caller's programs selection
332 * @param ts : - TS context
334 * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
337 static int discard_pid(MpegTSContext
*ts
, unsigned int pid
)
340 int used
= 0, discarded
= 0;
343 /* If none of the programs have .discard=AVDISCARD_ALL then there's
344 * no way we have to discard this packet */
345 for (k
= 0; k
< ts
->stream
->nb_programs
; k
++)
346 if (ts
->stream
->programs
[k
]->discard
== AVDISCARD_ALL
)
348 if (k
== ts
->stream
->nb_programs
)
351 for (i
= 0; i
< ts
->nb_prg
; i
++) {
353 for (j
= 0; j
< p
->nb_pids
; j
++) {
354 if (p
->pids
[j
] != pid
)
356 // is program with id p->id set to be discarded?
357 for (k
= 0; k
< ts
->stream
->nb_programs
; k
++) {
358 if (ts
->stream
->programs
[k
]->id
== p
->id
) {
359 if (ts
->stream
->programs
[k
]->discard
== AVDISCARD_ALL
)
368 return !used
&& discarded
;
372 * Assemble PES packets out of TS packets, and then call the "section_cb"
373 * function when they are complete.
375 static void write_section_data(MpegTSContext
*ts
, MpegTSFilter
*tss1
,
376 const uint8_t *buf
, int buf_size
, int is_start
)
378 MpegTSSectionFilter
*tss
= &tss1
->u
.section_filter
;
382 memcpy(tss
->section_buf
, buf
, buf_size
);
383 tss
->section_index
= buf_size
;
384 tss
->section_h_size
= -1;
385 tss
->end_of_section_reached
= 0;
387 if (tss
->end_of_section_reached
)
389 len
= 4096 - tss
->section_index
;
392 memcpy(tss
->section_buf
+ tss
->section_index
, buf
, len
);
393 tss
->section_index
+= len
;
396 /* compute section length if possible */
397 if (tss
->section_h_size
== -1 && tss
->section_index
>= 3) {
398 len
= (AV_RB16(tss
->section_buf
+ 1) & 0xfff) + 3;
401 tss
->section_h_size
= len
;
404 if (tss
->section_h_size
!= -1 &&
405 tss
->section_index
>= tss
->section_h_size
) {
407 tss
->end_of_section_reached
= 1;
409 if (tss
->check_crc
) {
410 crc_valid
= !av_crc(av_crc_get_table(AV_CRC_32_IEEE
), -1, tss
->section_buf
, tss
->section_h_size
);
412 ts
->crc_validity
[ tss1
->pid
] = 100;
413 }else if (ts
->crc_validity
[ tss1
->pid
] > -10) {
414 ts
->crc_validity
[ tss1
->pid
]--;
419 tss
->section_cb(tss1
, tss
->section_buf
, tss
->section_h_size
);
423 static MpegTSFilter
*mpegts_open_filter(MpegTSContext
*ts
, unsigned int pid
,
424 enum MpegTSFilterType type
)
426 MpegTSFilter
*filter
;
428 av_dlog(ts
->stream
, "Filter: pid=0x%x\n", pid
);
430 if (pid
>= NB_PID_MAX
|| ts
->pids
[pid
])
432 filter
= av_mallocz(sizeof(MpegTSFilter
));
435 ts
->pids
[pid
] = filter
;
440 filter
->last_cc
= -1;
441 filter
->last_pcr
= -1;
446 static MpegTSFilter
*mpegts_open_section_filter(MpegTSContext
*ts
,
448 SectionCallback
*section_cb
,
452 MpegTSFilter
*filter
;
453 MpegTSSectionFilter
*sec
;
455 if (!(filter
= mpegts_open_filter(ts
, pid
, MPEGTS_SECTION
)))
457 sec
= &filter
->u
.section_filter
;
458 sec
->section_cb
= section_cb
;
459 sec
->opaque
= opaque
;
460 sec
->section_buf
= av_malloc(MAX_SECTION_SIZE
);
461 sec
->check_crc
= check_crc
;
462 if (!sec
->section_buf
) {
469 static MpegTSFilter
*mpegts_open_pes_filter(MpegTSContext
*ts
, unsigned int pid
,
473 MpegTSFilter
*filter
;
474 MpegTSPESFilter
*pes
;
476 if (!(filter
= mpegts_open_filter(ts
, pid
, MPEGTS_PES
)))
479 pes
= &filter
->u
.pes_filter
;
480 pes
->pes_cb
= pes_cb
;
481 pes
->opaque
= opaque
;
485 static MpegTSFilter
*mpegts_open_pcr_filter(MpegTSContext
*ts
, unsigned int pid
)
487 return mpegts_open_filter(ts
, pid
, MPEGTS_PCR
);
490 static void mpegts_close_filter(MpegTSContext
*ts
, MpegTSFilter
*filter
)
495 if (filter
->type
== MPEGTS_SECTION
)
496 av_freep(&filter
->u
.section_filter
.section_buf
);
497 else if (filter
->type
== MPEGTS_PES
) {
498 PESContext
*pes
= filter
->u
.pes_filter
.opaque
;
499 av_buffer_unref(&pes
->buffer
);
500 /* referenced private data will be freed later in
501 * avformat_close_input */
502 if (!((PESContext
*)filter
->u
.pes_filter
.opaque
)->st
) {
503 av_freep(&filter
->u
.pes_filter
.opaque
);
508 ts
->pids
[pid
] = NULL
;
511 static int analyze(const uint8_t *buf
, int size
, int packet_size
, int *index
)
513 int stat
[TS_MAX_PACKET_SIZE
];
518 memset(stat
, 0, packet_size
* sizeof(*stat
));
520 for (i
= 0; i
< size
- 3; i
++) {
521 if (buf
[i
] == 0x47 && !(buf
[i
+ 1] & 0x80) && buf
[i
+ 3] != 0x47) {
522 int x
= i
% packet_size
;
525 if (stat
[x
] > best_score
) {
526 best_score
= stat
[x
];
533 return best_score
- FFMAX(stat_all
- 10*best_score
, 0)/10;
536 /* autodetect fec presence. Must have at least 1024 bytes */
537 static int get_packet_size(const uint8_t *buf
, int size
)
539 int score
, fec_score
, dvhs_score
;
541 if (size
< (TS_FEC_PACKET_SIZE
* 5 + 1))
542 return AVERROR_INVALIDDATA
;
544 score
= analyze(buf
, size
, TS_PACKET_SIZE
, NULL
);
545 dvhs_score
= analyze(buf
, size
, TS_DVHS_PACKET_SIZE
, NULL
);
546 fec_score
= analyze(buf
, size
, TS_FEC_PACKET_SIZE
, NULL
);
547 av_dlog(NULL
, "score: %d, dvhs_score: %d, fec_score: %d \n",
548 score
, dvhs_score
, fec_score
);
550 if (score
> fec_score
&& score
> dvhs_score
)
551 return TS_PACKET_SIZE
;
552 else if (dvhs_score
> score
&& dvhs_score
> fec_score
)
553 return TS_DVHS_PACKET_SIZE
;
554 else if (score
< fec_score
&& dvhs_score
< fec_score
)
555 return TS_FEC_PACKET_SIZE
;
557 return AVERROR_INVALIDDATA
;
560 typedef struct SectionHeader
{
565 uint8_t last_sec_num
;
568 static inline int get8(const uint8_t **pp
, const uint8_t *p_end
)
575 return AVERROR_INVALIDDATA
;
581 static inline int get16(const uint8_t **pp
, const uint8_t *p_end
)
587 if ((p
+ 1) >= p_end
)
588 return AVERROR_INVALIDDATA
;
595 /* read and allocate a DVB string preceded by its length */
596 static char *getstr8(const uint8_t **pp
, const uint8_t *p_end
)
603 len
= get8(&p
, p_end
);
606 if ((p
+ len
) > p_end
)
608 str
= av_malloc(len
+ 1);
618 static int parse_section_header(SectionHeader
*h
,
619 const uint8_t **pp
, const uint8_t *p_end
)
623 val
= get8(pp
, p_end
);
628 val
= get16(pp
, p_end
);
632 val
= get8(pp
, p_end
);
635 h
->version
= (val
>> 1) & 0x1f;
636 val
= get8(pp
, p_end
);
640 val
= get8(pp
, p_end
);
643 h
->last_sec_num
= val
;
648 uint32_t stream_type
;
649 enum AVMediaType codec_type
;
650 enum AVCodecID codec_id
;
653 static const StreamType ISO_types
[] = {
654 { 0x01, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_MPEG2VIDEO
},
655 { 0x02, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_MPEG2VIDEO
},
656 { 0x03, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_MP3
},
657 { 0x04, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_MP3
},
658 { 0x0f, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AAC
},
659 { 0x10, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_MPEG4
},
660 /* Makito encoder sets stream type 0x11 for AAC,
661 * so auto-detect LOAS/LATM instead of hardcoding it. */
662 #if !CONFIG_LOAS_DEMUXER
663 { 0x11, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AAC_LATM
}, /* LATM syntax */
665 { 0x1b, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_H264
},
666 { 0x24, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_HEVC
},
667 { 0x42, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_CAVS
},
668 { 0xd1, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_DIRAC
},
669 { 0xea, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_VC1
},
673 static const StreamType HDMV_types
[] = {
674 { 0x80, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_PCM_BLURAY
},
675 { 0x81, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
676 { 0x82, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
677 { 0x83, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_TRUEHD
},
678 { 0x84, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
679 { 0x85, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
}, /* DTS HD */
680 { 0x86, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
}, /* DTS HD MASTER*/
681 { 0xa1, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
}, /* E-AC3 Secondary Audio */
682 { 0xa2, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
}, /* DTS Express Secondary Audio */
683 { 0x90, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_HDMV_PGS_SUBTITLE
},
688 static const StreamType MISC_types
[] = {
689 { 0x81, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
690 { 0x8a, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
694 static const StreamType REGD_types
[] = {
695 { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_DIRAC
},
696 { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
697 { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_S302M
},
698 { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
699 { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
700 { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
701 { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_HEVC
},
702 { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_SMPTE_KLV
},
703 { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_VC1
},
707 static const StreamType METADATA_types
[] = {
708 { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_SMPTE_KLV
},
709 { MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_TIMED_ID3
},
713 /* descriptor present */
714 static const StreamType DESC_types
[] = {
715 { 0x6a, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
}, /* AC-3 descriptor */
716 { 0x7a, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
}, /* E-AC-3 descriptor */
717 { 0x7b, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
718 { 0x56, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_DVB_TELETEXT
},
719 { 0x59, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_DVB_SUBTITLE
}, /* subtitling descriptor */
723 static void mpegts_find_stream_type(AVStream
*st
,
724 uint32_t stream_type
,
725 const StreamType
*types
)
727 if (avcodec_is_open(st
->codec
)) {
728 av_log(NULL
, AV_LOG_DEBUG
, "cannot set stream info, codec is open\n");
732 for (; types
->stream_type
; types
++)
733 if (stream_type
== types
->stream_type
) {
734 st
->codec
->codec_type
= types
->codec_type
;
735 st
->codec
->codec_id
= types
->codec_id
;
736 st
->request_probe
= 0;
741 static int mpegts_set_stream_info(AVStream
*st
, PESContext
*pes
,
742 uint32_t stream_type
, uint32_t prog_reg_desc
)
744 int old_codec_type
= st
->codec
->codec_type
;
745 int old_codec_id
= st
->codec
->codec_id
;
747 if (avcodec_is_open(st
->codec
)) {
748 av_log(pes
->stream
, AV_LOG_DEBUG
, "cannot set stream info, codec is open\n");
752 avpriv_set_pts_info(st
, 33, 1, 90000);
754 st
->codec
->codec_type
= AVMEDIA_TYPE_DATA
;
755 st
->codec
->codec_id
= AV_CODEC_ID_NONE
;
756 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
758 pes
->stream_type
= stream_type
;
760 av_log(pes
->stream
, AV_LOG_DEBUG
,
761 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
762 st
->index
, pes
->stream_type
, pes
->pid
, (char *)&prog_reg_desc
);
764 st
->codec
->codec_tag
= pes
->stream_type
;
766 mpegts_find_stream_type(st
, pes
->stream_type
, ISO_types
);
767 if ((prog_reg_desc
== AV_RL32("HDMV") ||
768 prog_reg_desc
== AV_RL32("HDPR")) &&
769 st
->codec
->codec_id
== AV_CODEC_ID_NONE
) {
770 mpegts_find_stream_type(st
, pes
->stream_type
, HDMV_types
);
771 if (pes
->stream_type
== 0x83) {
772 // HDMV TrueHD streams also contain an AC3 coded version of the
773 // audio track - add a second stream for this
775 // priv_data cannot be shared between streams
776 PESContext
*sub_pes
= av_malloc(sizeof(*sub_pes
));
778 return AVERROR(ENOMEM
);
779 memcpy(sub_pes
, pes
, sizeof(*sub_pes
));
781 sub_st
= avformat_new_stream(pes
->stream
, NULL
);
784 return AVERROR(ENOMEM
);
787 sub_st
->id
= pes
->pid
;
788 avpriv_set_pts_info(sub_st
, 33, 1, 90000);
789 sub_st
->priv_data
= sub_pes
;
790 sub_st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
791 sub_st
->codec
->codec_id
= AV_CODEC_ID_AC3
;
792 sub_st
->need_parsing
= AVSTREAM_PARSE_FULL
;
793 sub_pes
->sub_st
= pes
->sub_st
= sub_st
;
796 if (st
->codec
->codec_id
== AV_CODEC_ID_NONE
)
797 mpegts_find_stream_type(st
, pes
->stream_type
, MISC_types
);
798 if (st
->codec
->codec_id
== AV_CODEC_ID_NONE
) {
799 st
->codec
->codec_id
= old_codec_id
;
800 st
->codec
->codec_type
= old_codec_type
;
806 static void reset_pes_packet_state(PESContext
*pes
)
808 pes
->pts
= AV_NOPTS_VALUE
;
809 pes
->dts
= AV_NOPTS_VALUE
;
812 av_buffer_unref(&pes
->buffer
);
815 static void new_pes_packet(PESContext
*pes
, AVPacket
*pkt
)
819 pkt
->buf
= pes
->buffer
;
820 pkt
->data
= pes
->buffer
->data
;
821 pkt
->size
= pes
->data_index
;
823 if (pes
->total_size
!= MAX_PES_PAYLOAD
&&
824 pes
->pes_header_size
+ pes
->data_index
!= pes
->total_size
+
826 av_log(pes
->stream
, AV_LOG_WARNING
, "PES packet size mismatch\n");
827 pes
->flags
|= AV_PKT_FLAG_CORRUPT
;
829 memset(pkt
->data
+ pkt
->size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
831 // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
832 if (pes
->sub_st
&& pes
->stream_type
== 0x83 && pes
->extended_stream_id
== 0x76)
833 pkt
->stream_index
= pes
->sub_st
->index
;
835 pkt
->stream_index
= pes
->st
->index
;
838 /* store position of first TS packet of this PES packet */
839 pkt
->pos
= pes
->ts_packet_pos
;
840 pkt
->flags
= pes
->flags
;
843 reset_pes_packet_state(pes
);
846 static uint64_t get_ts64(GetBitContext
*gb
, int bits
)
848 if (get_bits_left(gb
) < bits
)
849 return AV_NOPTS_VALUE
;
850 return get_bits64(gb
, bits
);
853 static int read_sl_header(PESContext
*pes
, SLConfigDescr
*sl
,
854 const uint8_t *buf
, int buf_size
)
857 int au_start_flag
= 0, au_end_flag
= 0, ocr_flag
= 0, idle_flag
= 0;
858 int padding_flag
= 0, padding_bits
= 0, inst_bitrate_flag
= 0;
859 int dts_flag
= -1, cts_flag
= -1;
860 int64_t dts
= AV_NOPTS_VALUE
, cts
= AV_NOPTS_VALUE
;
861 uint8_t buf_padded
[128 + FF_INPUT_BUFFER_PADDING_SIZE
];
862 int buf_padded_size
= FFMIN(buf_size
, sizeof(buf_padded
) - FF_INPUT_BUFFER_PADDING_SIZE
);
864 memcpy(buf_padded
, buf
, buf_padded_size
);
866 init_get_bits(&gb
, buf_padded
, buf_padded_size
* 8);
868 if (sl
->use_au_start
)
869 au_start_flag
= get_bits1(&gb
);
871 au_end_flag
= get_bits1(&gb
);
872 if (!sl
->use_au_start
&& !sl
->use_au_end
)
873 au_start_flag
= au_end_flag
= 1;
875 ocr_flag
= get_bits1(&gb
);
877 idle_flag
= get_bits1(&gb
);
879 padding_flag
= get_bits1(&gb
);
881 padding_bits
= get_bits(&gb
, 3);
883 if (!idle_flag
&& (!padding_flag
|| padding_bits
!= 0)) {
884 if (sl
->packet_seq_num_len
)
885 skip_bits_long(&gb
, sl
->packet_seq_num_len
);
886 if (sl
->degr_prior_len
)
888 skip_bits(&gb
, sl
->degr_prior_len
);
890 skip_bits_long(&gb
, sl
->ocr_len
);
892 if (sl
->use_rand_acc_pt
)
894 if (sl
->au_seq_num_len
> 0)
895 skip_bits_long(&gb
, sl
->au_seq_num_len
);
896 if (sl
->use_timestamps
) {
897 dts_flag
= get_bits1(&gb
);
898 cts_flag
= get_bits1(&gb
);
901 if (sl
->inst_bitrate_len
)
902 inst_bitrate_flag
= get_bits1(&gb
);
904 dts
= get_ts64(&gb
, sl
->timestamp_len
);
906 cts
= get_ts64(&gb
, sl
->timestamp_len
);
908 skip_bits_long(&gb
, sl
->au_len
);
909 if (inst_bitrate_flag
)
910 skip_bits_long(&gb
, sl
->inst_bitrate_len
);
913 if (dts
!= AV_NOPTS_VALUE
)
915 if (cts
!= AV_NOPTS_VALUE
)
918 if (sl
->timestamp_len
&& sl
->timestamp_res
)
919 avpriv_set_pts_info(pes
->st
, sl
->timestamp_len
, 1, sl
->timestamp_res
);
921 return (get_bits_count(&gb
) + 7) >> 3;
924 /* return non zero if a packet could be constructed */
925 static int mpegts_push_data(MpegTSFilter
*filter
,
926 const uint8_t *buf
, int buf_size
, int is_start
,
929 PESContext
*pes
= filter
->u
.pes_filter
.opaque
;
930 MpegTSContext
*ts
= pes
->ts
;
938 if (pes
->state
== MPEGTS_PAYLOAD
&& pes
->data_index
> 0) {
939 new_pes_packet(pes
, ts
->pkt
);
942 reset_pes_packet_state(pes
);
944 pes
->state
= MPEGTS_HEADER
;
945 pes
->ts_packet_pos
= pos
;
948 while (buf_size
> 0) {
949 switch (pes
->state
) {
951 len
= PES_START_SIZE
- pes
->data_index
;
954 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
955 pes
->data_index
+= len
;
958 if (pes
->data_index
== PES_START_SIZE
) {
959 /* we got all the PES or section header. We can now
961 if (pes
->header
[0] == 0x00 && pes
->header
[1] == 0x00 &&
962 pes
->header
[2] == 0x01) {
963 /* it must be an mpeg2 PES stream */
964 code
= pes
->header
[3] | 0x100;
965 av_dlog(pes
->stream
, "pid=%x pes_code=%#x\n", pes
->pid
,
968 if ((pes
->st
&& pes
->st
->discard
== AVDISCARD_ALL
&&
970 pes
->sub_st
->discard
== AVDISCARD_ALL
)) ||
971 code
== 0x1be) /* padding_stream */
974 /* stream not present in PMT */
976 if (ts
->skip_changes
)
979 pes
->st
= avformat_new_stream(ts
->stream
, NULL
);
981 return AVERROR(ENOMEM
);
982 pes
->st
->id
= pes
->pid
;
983 mpegts_set_stream_info(pes
->st
, pes
, 0, 0);
986 pes
->total_size
= AV_RB16(pes
->header
+ 4);
987 /* NOTE: a zero total size means the PES size is
989 if (!pes
->total_size
)
990 pes
->total_size
= MAX_PES_PAYLOAD
;
992 /* allocate pes buffer */
993 pes
->buffer
= av_buffer_alloc(pes
->total_size
+
994 FF_INPUT_BUFFER_PADDING_SIZE
);
996 return AVERROR(ENOMEM
);
998 if (code
!= 0x1bc && code
!= 0x1bf && /* program_stream_map, private_stream_2 */
999 code
!= 0x1f0 && code
!= 0x1f1 && /* ECM, EMM */
1000 code
!= 0x1ff && code
!= 0x1f2 && /* program_stream_directory, DSMCC_stream */
1001 code
!= 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */
1002 pes
->state
= MPEGTS_PESHEADER
;
1003 if (pes
->st
->codec
->codec_id
== AV_CODEC_ID_NONE
&& !pes
->st
->request_probe
) {
1004 av_dlog(pes
->stream
,
1005 "pid=%x stream_type=%x probing\n",
1008 pes
->st
->request_probe
= 1;
1011 pes
->state
= MPEGTS_PAYLOAD
;
1012 pes
->data_index
= 0;
1015 /* otherwise, it should be a table */
1018 pes
->state
= MPEGTS_SKIP
;
1023 /**********************************************/
1024 /* PES packing parsing */
1025 case MPEGTS_PESHEADER
:
1026 len
= PES_HEADER_SIZE
- pes
->data_index
;
1028 return AVERROR_INVALIDDATA
;
1031 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
1032 pes
->data_index
+= len
;
1035 if (pes
->data_index
== PES_HEADER_SIZE
) {
1036 pes
->pes_header_size
= pes
->header
[8] + 9;
1037 pes
->state
= MPEGTS_PESHEADER_FILL
;
1040 case MPEGTS_PESHEADER_FILL
:
1041 len
= pes
->pes_header_size
- pes
->data_index
;
1043 return AVERROR_INVALIDDATA
;
1046 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
1047 pes
->data_index
+= len
;
1050 if (pes
->data_index
== pes
->pes_header_size
) {
1052 unsigned int flags
, pes_ext
, skip
;
1054 flags
= pes
->header
[7];
1055 r
= pes
->header
+ 9;
1056 pes
->pts
= AV_NOPTS_VALUE
;
1057 pes
->dts
= AV_NOPTS_VALUE
;
1058 if ((flags
& 0xc0) == 0x80) {
1059 pes
->dts
= pes
->pts
= ff_parse_pes_pts(r
);
1061 } else if ((flags
& 0xc0) == 0xc0) {
1062 pes
->pts
= ff_parse_pes_pts(r
);
1064 pes
->dts
= ff_parse_pes_pts(r
);
1067 pes
->extended_stream_id
= -1;
1068 if (flags
& 0x01) { /* PES extension */
1070 /* Skip PES private data, program packet sequence counter and P-STD buffer */
1071 skip
= (pes_ext
>> 4) & 0xb;
1074 if ((pes_ext
& 0x41) == 0x01 &&
1075 (r
+ 2) <= (pes
->header
+ pes
->pes_header_size
)) {
1076 /* PES extension 2 */
1077 if ((r
[0] & 0x7f) > 0 && (r
[1] & 0x80) == 0)
1078 pes
->extended_stream_id
= r
[1];
1082 /* we got the full header. We parse it and get the payload */
1083 pes
->state
= MPEGTS_PAYLOAD
;
1084 pes
->data_index
= 0;
1085 if (pes
->stream_type
== 0x12 && buf_size
> 0) {
1086 int sl_header_bytes
= read_sl_header(pes
, &pes
->sl
, p
,
1088 pes
->pes_header_size
+= sl_header_bytes
;
1089 p
+= sl_header_bytes
;
1090 buf_size
-= sl_header_bytes
;
1092 if (pes
->stream_type
== 0x15 && buf_size
>= 5) {
1093 /* skip metadata access unit header */
1094 pes
->pes_header_size
+= 5;
1098 if (pes
->ts
->fix_teletext_pts
&& pes
->st
->codec
->codec_id
== AV_CODEC_ID_DVB_TELETEXT
) {
1099 AVProgram
*p
= NULL
;
1100 while ((p
= av_find_program_from_stream(pes
->stream
, p
, pes
->st
->index
))) {
1101 if (p
->pcr_pid
!= -1 && p
->discard
!= AVDISCARD_ALL
) {
1102 MpegTSFilter
*f
= pes
->ts
->pids
[p
->pcr_pid
];
1104 AVStream
*st
= NULL
;
1105 if (f
->type
== MPEGTS_PES
) {
1106 PESContext
*pcrpes
= f
->u
.pes_filter
.opaque
;
1109 } else if (f
->type
== MPEGTS_PCR
) {
1111 for (i
= 0; i
< p
->nb_stream_indexes
; i
++) {
1112 AVStream
*pst
= pes
->stream
->streams
[p
->stream_index
[i
]];
1113 if (pst
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
)
1117 if (f
->last_pcr
!= -1 && st
&& st
->discard
!= AVDISCARD_ALL
) {
1118 // teletext packets do not always have correct timestamps,
1119 // the standard says they should be handled after 40.6 ms at most,
1120 // and the pcr error to this packet should be no more than 100 ms.
1121 // TODO: we should interpolate the PCR, not just use the last one
1122 int64_t pcr
= f
->last_pcr
/ 300;
1123 pes
->st
->pts_wrap_reference
= st
->pts_wrap_reference
;
1124 pes
->st
->pts_wrap_behavior
= st
->pts_wrap_behavior
;
1125 if (pes
->dts
== AV_NOPTS_VALUE
|| pes
->dts
< pcr
) {
1126 pes
->pts
= pes
->dts
= pcr
;
1127 } else if (pes
->dts
> pcr
+ 3654 + 9000) {
1128 pes
->pts
= pes
->dts
= pcr
+ 3654 + 9000;
1138 case MPEGTS_PAYLOAD
:
1140 if (pes
->data_index
> 0 &&
1141 pes
->data_index
+ buf_size
> pes
->total_size
) {
1142 new_pes_packet(pes
, ts
->pkt
);
1143 pes
->total_size
= MAX_PES_PAYLOAD
;
1144 pes
->buffer
= av_buffer_alloc(pes
->total_size
+
1145 FF_INPUT_BUFFER_PADDING_SIZE
);
1147 return AVERROR(ENOMEM
);
1149 } else if (pes
->data_index
== 0 &&
1150 buf_size
> pes
->total_size
) {
1151 // pes packet size is < ts size packet and pes data is padded with 0xff
1152 // not sure if this is legal in ts but see issue #2392
1153 buf_size
= pes
->total_size
;
1155 memcpy(pes
->buffer
->data
+ pes
->data_index
, p
, buf_size
);
1156 pes
->data_index
+= buf_size
;
1157 /* emit complete packets with known packet size
1158 * decreases demuxer delay for infrequent packets like subtitles from
1159 * a couple of seconds to milliseconds for properly muxed files.
1160 * total_size is the number of bytes following pes_packet_length
1161 * in the pes header, i.e. not counting the first PES_START_SIZE bytes */
1162 if (!ts
->stop_parse
&& pes
->total_size
< MAX_PES_PAYLOAD
&&
1163 pes
->pes_header_size
+ pes
->data_index
== pes
->total_size
+ PES_START_SIZE
) {
1165 new_pes_packet(pes
, ts
->pkt
);
1179 static PESContext
*add_pes_stream(MpegTSContext
*ts
, int pid
, int pcr_pid
)
1184 /* if no pid found, then add a pid context */
1185 pes
= av_mallocz(sizeof(PESContext
));
1189 pes
->stream
= ts
->stream
;
1191 pes
->pcr_pid
= pcr_pid
;
1192 pes
->state
= MPEGTS_SKIP
;
1193 pes
->pts
= AV_NOPTS_VALUE
;
1194 pes
->dts
= AV_NOPTS_VALUE
;
1195 tss
= mpegts_open_pes_filter(ts
, pid
, mpegts_push_data
, pes
);
1208 Mp4Descr
*active_descr
;
1210 int max_descr_count
;
1212 int predefined_SLConfigDescriptor_seen
;
1213 } MP4DescrParseContext
;
1215 static int init_MP4DescrParseContext(MP4DescrParseContext
*d
, AVFormatContext
*s
,
1216 const uint8_t *buf
, unsigned size
,
1217 Mp4Descr
*descr
, int max_descr_count
)
1220 if (size
> (1 << 30))
1221 return AVERROR_INVALIDDATA
;
1223 if ((ret
= ffio_init_context(&d
->pb
, (unsigned char *)buf
, size
, 0,
1224 NULL
, NULL
, NULL
, NULL
)) < 0)
1231 d
->active_descr
= NULL
;
1232 d
->max_descr_count
= max_descr_count
;
1237 static void update_offsets(AVIOContext
*pb
, int64_t *off
, int *len
)
1239 int64_t new_off
= avio_tell(pb
);
1240 (*len
) -= new_off
- *off
;
1244 static int parse_mp4_descr(MP4DescrParseContext
*d
, int64_t off
, int len
,
1247 static int parse_mp4_descr_arr(MP4DescrParseContext
*d
, int64_t off
, int len
)
1250 int ret
= parse_mp4_descr(d
, off
, len
, 0);
1253 update_offsets(&d
->pb
, &off
, &len
);
1258 static int parse_MP4IODescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1260 avio_rb16(&d
->pb
); // ID
1266 update_offsets(&d
->pb
, &off
, &len
);
1267 return parse_mp4_descr_arr(d
, off
, len
);
1270 static int parse_MP4ODescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1275 id_flags
= avio_rb16(&d
->pb
);
1276 if (!(id_flags
& 0x0020)) { // URL_Flag
1277 update_offsets(&d
->pb
, &off
, &len
);
1278 return parse_mp4_descr_arr(d
, off
, len
); // ES_Descriptor[]
1284 static int parse_MP4ESDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1287 if (d
->descr_count
>= d
->max_descr_count
)
1288 return AVERROR_INVALIDDATA
;
1289 ff_mp4_parse_es_descr(&d
->pb
, &es_id
);
1290 d
->active_descr
= d
->descr
+ (d
->descr_count
++);
1292 d
->active_descr
->es_id
= es_id
;
1293 update_offsets(&d
->pb
, &off
, &len
);
1294 parse_mp4_descr(d
, off
, len
, MP4DecConfigDescrTag
);
1295 update_offsets(&d
->pb
, &off
, &len
);
1297 parse_mp4_descr(d
, off
, len
, MP4SLDescrTag
);
1298 d
->active_descr
= NULL
;
1302 static int parse_MP4DecConfigDescrTag(MP4DescrParseContext
*d
, int64_t off
,
1305 Mp4Descr
*descr
= d
->active_descr
;
1307 return AVERROR_INVALIDDATA
;
1308 d
->active_descr
->dec_config_descr
= av_malloc(len
);
1309 if (!descr
->dec_config_descr
)
1310 return AVERROR(ENOMEM
);
1311 descr
->dec_config_descr_len
= len
;
1312 avio_read(&d
->pb
, descr
->dec_config_descr
, len
);
1316 static int parse_MP4SLDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1318 Mp4Descr
*descr
= d
->active_descr
;
1321 return AVERROR_INVALIDDATA
;
1323 predefined
= avio_r8(&d
->pb
);
1326 int flags
= avio_r8(&d
->pb
);
1327 descr
->sl
.use_au_start
= !!(flags
& 0x80);
1328 descr
->sl
.use_au_end
= !!(flags
& 0x40);
1329 descr
->sl
.use_rand_acc_pt
= !!(flags
& 0x20);
1330 descr
->sl
.use_padding
= !!(flags
& 0x08);
1331 descr
->sl
.use_timestamps
= !!(flags
& 0x04);
1332 descr
->sl
.use_idle
= !!(flags
& 0x02);
1333 descr
->sl
.timestamp_res
= avio_rb32(&d
->pb
);
1335 descr
->sl
.timestamp_len
= avio_r8(&d
->pb
);
1336 if (descr
->sl
.timestamp_len
> 64) {
1337 avpriv_request_sample(NULL
, "timestamp_len > 64");
1338 descr
->sl
.timestamp_len
= 64;
1339 return AVERROR_PATCHWELCOME
;
1341 descr
->sl
.ocr_len
= avio_r8(&d
->pb
);
1342 descr
->sl
.au_len
= avio_r8(&d
->pb
);
1343 descr
->sl
.inst_bitrate_len
= avio_r8(&d
->pb
);
1344 lengths
= avio_rb16(&d
->pb
);
1345 descr
->sl
.degr_prior_len
= lengths
>> 12;
1346 descr
->sl
.au_seq_num_len
= (lengths
>> 7) & 0x1f;
1347 descr
->sl
.packet_seq_num_len
= (lengths
>> 2) & 0x1f;
1348 } else if (!d
->predefined_SLConfigDescriptor_seen
){
1349 avpriv_report_missing_feature(d
->s
, "Predefined SLConfigDescriptor");
1350 d
->predefined_SLConfigDescriptor_seen
= 1;
1355 static int parse_mp4_descr(MP4DescrParseContext
*d
, int64_t off
, int len
,
1359 int len1
= ff_mp4_read_descr(d
->s
, &d
->pb
, &tag
);
1360 update_offsets(&d
->pb
, &off
, &len
);
1361 if (len
< 0 || len1
> len
|| len1
<= 0) {
1362 av_log(d
->s
, AV_LOG_ERROR
,
1363 "Tag %x length violation new length %d bytes remaining %d\n",
1365 return AVERROR_INVALIDDATA
;
1368 if (d
->level
++ >= MAX_LEVEL
) {
1369 av_log(d
->s
, AV_LOG_ERROR
, "Maximum MP4 descriptor level exceeded\n");
1373 if (target_tag
&& tag
!= target_tag
) {
1374 av_log(d
->s
, AV_LOG_ERROR
, "Found tag %x expected %x\n", tag
,
1381 parse_MP4IODescrTag(d
, off
, len1
);
1384 parse_MP4ODescrTag(d
, off
, len1
);
1387 parse_MP4ESDescrTag(d
, off
, len1
);
1389 case MP4DecConfigDescrTag
:
1390 parse_MP4DecConfigDescrTag(d
, off
, len1
);
1393 parse_MP4SLDescrTag(d
, off
, len1
);
1400 avio_seek(&d
->pb
, off
+ len1
, SEEK_SET
);
1404 static int mp4_read_iods(AVFormatContext
*s
, const uint8_t *buf
, unsigned size
,
1405 Mp4Descr
*descr
, int *descr_count
, int max_descr_count
)
1407 MP4DescrParseContext d
;
1410 ret
= init_MP4DescrParseContext(&d
, s
, buf
, size
, descr
, max_descr_count
);
1414 ret
= parse_mp4_descr(&d
, avio_tell(&d
.pb
), size
, MP4IODescrTag
);
1416 *descr_count
= d
.descr_count
;
1420 static int mp4_read_od(AVFormatContext
*s
, const uint8_t *buf
, unsigned size
,
1421 Mp4Descr
*descr
, int *descr_count
, int max_descr_count
)
1423 MP4DescrParseContext d
;
1426 ret
= init_MP4DescrParseContext(&d
, s
, buf
, size
, descr
, max_descr_count
);
1430 ret
= parse_mp4_descr_arr(&d
, avio_tell(&d
.pb
), size
);
1432 *descr_count
= d
.descr_count
;
1436 static void m4sl_cb(MpegTSFilter
*filter
, const uint8_t *section
,
1439 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1441 const uint8_t *p
, *p_end
;
1443 int mp4_descr_count
= 0;
1444 Mp4Descr mp4_descr
[MAX_MP4_DESCR_COUNT
] = { { 0 } };
1446 AVFormatContext
*s
= ts
->stream
;
1448 p_end
= section
+ section_len
- 4;
1450 if (parse_section_header(&h
, &p
, p_end
) < 0)
1452 if (h
.tid
!= M4OD_TID
)
1455 mp4_read_od(s
, p
, (unsigned) (p_end
- p
), mp4_descr
, &mp4_descr_count
,
1456 MAX_MP4_DESCR_COUNT
);
1458 for (pid
= 0; pid
< NB_PID_MAX
; pid
++) {
1461 for (i
= 0; i
< mp4_descr_count
; i
++) {
1464 if (ts
->pids
[pid
]->es_id
!= mp4_descr
[i
].es_id
)
1466 if (ts
->pids
[pid
]->type
!= MPEGTS_PES
) {
1467 av_log(s
, AV_LOG_ERROR
, "pid %x is not PES\n", pid
);
1470 pes
= ts
->pids
[pid
]->u
.pes_filter
.opaque
;
1475 pes
->sl
= mp4_descr
[i
].sl
;
1477 ffio_init_context(&pb
, mp4_descr
[i
].dec_config_descr
,
1478 mp4_descr
[i
].dec_config_descr_len
, 0,
1479 NULL
, NULL
, NULL
, NULL
);
1480 ff_mp4_read_dec_config_descr(s
, st
, &pb
);
1481 if (st
->codec
->codec_id
== AV_CODEC_ID_AAC
&&
1482 st
->codec
->extradata_size
> 0)
1483 st
->need_parsing
= 0;
1484 if (st
->codec
->codec_id
== AV_CODEC_ID_H264
&&
1485 st
->codec
->extradata_size
> 0)
1486 st
->need_parsing
= 0;
1488 if (st
->codec
->codec_id
<= AV_CODEC_ID_NONE
) {
1490 } else if (st
->codec
->codec_id
< AV_CODEC_ID_FIRST_AUDIO
)
1491 st
->codec
->codec_type
= AVMEDIA_TYPE_VIDEO
;
1492 else if (st
->codec
->codec_id
< AV_CODEC_ID_FIRST_SUBTITLE
)
1493 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
1494 else if (st
->codec
->codec_id
< AV_CODEC_ID_FIRST_UNKNOWN
)
1495 st
->codec
->codec_type
= AVMEDIA_TYPE_SUBTITLE
;
1498 for (i
= 0; i
< mp4_descr_count
; i
++)
1499 av_free(mp4_descr
[i
].dec_config_descr
);
1502 int ff_parse_mpeg2_descriptor(AVFormatContext
*fc
, AVStream
*st
, int stream_type
,
1503 const uint8_t **pp
, const uint8_t *desc_list_end
,
1504 Mp4Descr
*mp4_descr
, int mp4_descr_count
, int pid
,
1507 const uint8_t *desc_end
;
1508 int desc_len
, desc_tag
, desc_es_id
;
1512 desc_tag
= get8(pp
, desc_list_end
);
1514 return AVERROR_INVALIDDATA
;
1515 desc_len
= get8(pp
, desc_list_end
);
1517 return AVERROR_INVALIDDATA
;
1518 desc_end
= *pp
+ desc_len
;
1519 if (desc_end
> desc_list_end
)
1520 return AVERROR_INVALIDDATA
;
1522 av_dlog(fc
, "tag: 0x%02x len=%d\n", desc_tag
, desc_len
);
1524 if ((st
->codec
->codec_id
== AV_CODEC_ID_NONE
|| st
->request_probe
> 0) &&
1525 stream_type
== STREAM_TYPE_PRIVATE_DATA
)
1526 mpegts_find_stream_type(st
, desc_tag
, DESC_types
);
1529 case 0x1E: /* SL descriptor */
1530 desc_es_id
= get16(pp
, desc_end
);
1531 if (ts
&& ts
->pids
[pid
])
1532 ts
->pids
[pid
]->es_id
= desc_es_id
;
1533 for (i
= 0; i
< mp4_descr_count
; i
++)
1534 if (mp4_descr
[i
].dec_config_descr_len
&&
1535 mp4_descr
[i
].es_id
== desc_es_id
) {
1537 ffio_init_context(&pb
, mp4_descr
[i
].dec_config_descr
,
1538 mp4_descr
[i
].dec_config_descr_len
, 0,
1539 NULL
, NULL
, NULL
, NULL
);
1540 ff_mp4_read_dec_config_descr(fc
, st
, &pb
);
1541 if (st
->codec
->codec_id
== AV_CODEC_ID_AAC
&&
1542 st
->codec
->extradata_size
> 0)
1543 st
->need_parsing
= 0;
1544 if (st
->codec
->codec_id
== AV_CODEC_ID_MPEG4SYSTEMS
)
1545 mpegts_open_section_filter(ts
, pid
, m4sl_cb
, ts
, 1);
1548 case 0x1F: /* FMC descriptor */
1549 get16(pp
, desc_end
);
1550 if (mp4_descr_count
> 0 &&
1551 (st
->codec
->codec_id
== AV_CODEC_ID_AAC_LATM
|| st
->request_probe
> 0) &&
1552 mp4_descr
->dec_config_descr_len
&& mp4_descr
->es_id
== pid
) {
1554 ffio_init_context(&pb
, mp4_descr
->dec_config_descr
,
1555 mp4_descr
->dec_config_descr_len
, 0,
1556 NULL
, NULL
, NULL
, NULL
);
1557 ff_mp4_read_dec_config_descr(fc
, st
, &pb
);
1558 if (st
->codec
->codec_id
== AV_CODEC_ID_AAC
&&
1559 st
->codec
->extradata_size
> 0) {
1560 st
->request_probe
= st
->need_parsing
= 0;
1561 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
1565 case 0x56: /* DVB teletext descriptor */
1567 uint8_t *extradata
= NULL
;
1568 int language_count
= desc_len
/ 5;
1570 if (desc_len
> 0 && desc_len
% 5 != 0)
1571 return AVERROR_INVALIDDATA
;
1573 if (language_count
> 0) {
1574 /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1575 if (language_count
> sizeof(language
) / 4) {
1576 language_count
= sizeof(language
) / 4;
1579 if (st
->codec
->extradata
== NULL
) {
1580 if (ff_alloc_extradata(st
->codec
, language_count
* 2)) {
1581 return AVERROR(ENOMEM
);
1585 if (st
->codec
->extradata_size
< language_count
* 2)
1586 return AVERROR_INVALIDDATA
;
1588 extradata
= st
->codec
->extradata
;
1590 for (i
= 0; i
< language_count
; i
++) {
1591 language
[i
* 4 + 0] = get8(pp
, desc_end
);
1592 language
[i
* 4 + 1] = get8(pp
, desc_end
);
1593 language
[i
* 4 + 2] = get8(pp
, desc_end
);
1594 language
[i
* 4 + 3] = ',';
1596 memcpy(extradata
, *pp
, 2);
1602 language
[i
* 4 - 1] = 0;
1603 av_dict_set(&st
->metadata
, "language", language
, 0);
1607 case 0x59: /* subtitling descriptor */
1609 /* 8 bytes per DVB subtitle substream data:
1610 * ISO_639_language_code (3 bytes),
1611 * subtitling_type (1 byte),
1612 * composition_page_id (2 bytes),
1613 * ancillary_page_id (2 bytes) */
1614 int language_count
= desc_len
/ 8;
1616 if (desc_len
> 0 && desc_len
% 8 != 0)
1617 return AVERROR_INVALIDDATA
;
1619 if (language_count
> 1) {
1620 avpriv_request_sample(fc
, "DVB subtitles with multiple languages");
1623 if (language_count
> 0) {
1626 /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1627 if (language_count
> sizeof(language
) / 4) {
1628 language_count
= sizeof(language
) / 4;
1631 if (st
->codec
->extradata
== NULL
) {
1632 if (ff_alloc_extradata(st
->codec
, language_count
* 5)) {
1633 return AVERROR(ENOMEM
);
1637 if (st
->codec
->extradata_size
< language_count
* 5)
1638 return AVERROR_INVALIDDATA
;
1640 extradata
= st
->codec
->extradata
;
1642 for (i
= 0; i
< language_count
; i
++) {
1643 language
[i
* 4 + 0] = get8(pp
, desc_end
);
1644 language
[i
* 4 + 1] = get8(pp
, desc_end
);
1645 language
[i
* 4 + 2] = get8(pp
, desc_end
);
1646 language
[i
* 4 + 3] = ',';
1648 /* hearing impaired subtitles detection using subtitling_type */
1650 case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1651 case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1652 case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1653 case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1654 case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1655 case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1656 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
1660 extradata
[4] = get8(pp
, desc_end
); /* subtitling_type */
1661 memcpy(extradata
, *pp
, 4); /* composition_page_id and ancillary_page_id */
1667 language
[i
* 4 - 1] = 0;
1668 av_dict_set(&st
->metadata
, "language", language
, 0);
1672 case 0x0a: /* ISO 639 language descriptor */
1673 for (i
= 0; i
+ 4 <= desc_len
; i
+= 4) {
1674 language
[i
+ 0] = get8(pp
, desc_end
);
1675 language
[i
+ 1] = get8(pp
, desc_end
);
1676 language
[i
+ 2] = get8(pp
, desc_end
);
1677 language
[i
+ 3] = ',';
1678 switch (get8(pp
, desc_end
)) {
1680 st
->disposition
|= AV_DISPOSITION_CLEAN_EFFECTS
;
1683 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
1686 st
->disposition
|= AV_DISPOSITION_VISUAL_IMPAIRED
;
1690 if (i
&& language
[0]) {
1691 language
[i
- 1] = 0;
1692 av_dict_set(&st
->metadata
, "language", language
, 0);
1695 case 0x05: /* registration descriptor */
1696 st
->codec
->codec_tag
= bytestream_get_le32(pp
);
1697 av_dlog(fc
, "reg_desc=%.4s\n", (char *)&st
->codec
->codec_tag
);
1698 if (st
->codec
->codec_id
== AV_CODEC_ID_NONE
)
1699 mpegts_find_stream_type(st
, st
->codec
->codec_tag
, REGD_types
);
1701 case 0x52: /* stream identifier descriptor */
1702 st
->stream_identifier
= 1 + get8(pp
, desc_end
);
1704 case 0x26: /* metadata descriptor */
1705 if (get16(pp
, desc_end
) == 0xFFFF)
1707 if (get8(pp
, desc_end
) == 0xFF) {
1708 st
->codec
->codec_tag
= bytestream_get_le32(pp
);
1709 if (st
->codec
->codec_id
== AV_CODEC_ID_NONE
)
1710 mpegts_find_stream_type(st
, st
->codec
->codec_tag
, METADATA_types
);
1720 static void pmt_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1722 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1723 SectionHeader h1
, *h
= &h1
;
1726 const uint8_t *p
, *p_end
, *desc_list_end
;
1727 int program_info_length
, pcr_pid
, pid
, stream_type
;
1729 uint32_t prog_reg_desc
= 0; /* registration descriptor */
1731 int mp4_descr_count
= 0;
1732 Mp4Descr mp4_descr
[MAX_MP4_DESCR_COUNT
] = { { 0 } };
1735 av_dlog(ts
->stream
, "PMT: len %i\n", section_len
);
1736 hex_dump_debug(ts
->stream
, section
, section_len
);
1738 p_end
= section
+ section_len
- 4;
1740 if (parse_section_header(h
, &p
, p_end
) < 0)
1743 av_dlog(ts
->stream
, "sid=0x%x sec_num=%d/%d\n",
1744 h
->id
, h
->sec_num
, h
->last_sec_num
);
1746 if (h
->tid
!= PMT_TID
)
1748 if (ts
->skip_changes
)
1751 clear_program(ts
, h
->id
);
1752 pcr_pid
= get16(&p
, p_end
);
1756 add_pid_to_pmt(ts
, h
->id
, pcr_pid
);
1757 set_pcr_pid(ts
->stream
, h
->id
, pcr_pid
);
1759 av_dlog(ts
->stream
, "pcr_pid=0x%x\n", pcr_pid
);
1761 program_info_length
= get16(&p
, p_end
);
1762 if (program_info_length
< 0)
1764 program_info_length
&= 0xfff;
1765 while (program_info_length
>= 2) {
1767 tag
= get8(&p
, p_end
);
1768 len
= get8(&p
, p_end
);
1770 av_dlog(ts
->stream
, "program tag: 0x%02x len=%d\n", tag
, len
);
1772 if (len
> program_info_length
- 2)
1773 // something else is broken, exit the program_descriptors_loop
1775 program_info_length
-= len
+ 2;
1776 if (tag
== 0x1d) { // IOD descriptor
1777 get8(&p
, p_end
); // scope
1778 get8(&p
, p_end
); // label
1780 mp4_read_iods(ts
->stream
, p
, len
, mp4_descr
+ mp4_descr_count
,
1781 &mp4_descr_count
, MAX_MP4_DESCR_COUNT
);
1782 } else if (tag
== 0x05 && len
>= 4) { // registration descriptor
1783 prog_reg_desc
= bytestream_get_le32(&p
);
1788 p
+= program_info_length
;
1792 // stop parsing after pmt, we found header
1793 if (!ts
->stream
->nb_streams
)
1796 set_pmt_found(ts
, h
->id
);
1802 stream_type
= get8(&p
, p_end
);
1803 if (stream_type
< 0)
1805 pid
= get16(&p
, p_end
);
1809 if (pid
== ts
->current_pid
)
1812 /* now create stream */
1813 if (ts
->pids
[pid
] && ts
->pids
[pid
]->type
== MPEGTS_PES
) {
1814 pes
= ts
->pids
[pid
]->u
.pes_filter
.opaque
;
1816 pes
->st
= avformat_new_stream(pes
->stream
, NULL
);
1819 pes
->st
->id
= pes
->pid
;
1822 } else if (stream_type
!= 0x13) {
1824 mpegts_close_filter(ts
, ts
->pids
[pid
]); // wrongly added sdt filter probably
1825 pes
= add_pes_stream(ts
, pid
, pcr_pid
);
1827 st
= avformat_new_stream(pes
->stream
, NULL
);
1833 int idx
= ff_find_stream_index(ts
->stream
, pid
);
1835 st
= ts
->stream
->streams
[idx
];
1837 st
= avformat_new_stream(ts
->stream
, NULL
);
1841 st
->codec
->codec_type
= AVMEDIA_TYPE_DATA
;
1848 if (pes
&& !pes
->stream_type
)
1849 mpegts_set_stream_info(st
, pes
, stream_type
, prog_reg_desc
);
1851 add_pid_to_pmt(ts
, h
->id
, pid
);
1853 ff_program_add_stream_index(ts
->stream
, h
->id
, st
->index
);
1855 desc_list_len
= get16(&p
, p_end
);
1856 if (desc_list_len
< 0)
1858 desc_list_len
&= 0xfff;
1859 desc_list_end
= p
+ desc_list_len
;
1860 if (desc_list_end
> p_end
)
1863 if (ff_parse_mpeg2_descriptor(ts
->stream
, st
, stream_type
, &p
,
1864 desc_list_end
, mp4_descr
,
1865 mp4_descr_count
, pid
, ts
) < 0)
1868 if (pes
&& prog_reg_desc
== AV_RL32("HDMV") &&
1869 stream_type
== 0x83 && pes
->sub_st
) {
1870 ff_program_add_stream_index(ts
->stream
, h
->id
,
1871 pes
->sub_st
->index
);
1872 pes
->sub_st
->codec
->codec_tag
= st
->codec
->codec_tag
;
1878 if (!ts
->pids
[pcr_pid
])
1879 mpegts_open_pcr_filter(ts
, pcr_pid
);
1882 for (i
= 0; i
< mp4_descr_count
; i
++)
1883 av_free(mp4_descr
[i
].dec_config_descr
);
1886 static void pat_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1888 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1889 SectionHeader h1
, *h
= &h1
;
1890 const uint8_t *p
, *p_end
;
1894 av_dlog(ts
->stream
, "PAT:\n");
1895 hex_dump_debug(ts
->stream
, section
, section_len
);
1897 p_end
= section
+ section_len
- 4;
1899 if (parse_section_header(h
, &p
, p_end
) < 0)
1901 if (h
->tid
!= PAT_TID
)
1903 if (ts
->skip_changes
)
1906 ts
->stream
->ts_id
= h
->id
;
1910 sid
= get16(&p
, p_end
);
1913 pmt_pid
= get16(&p
, p_end
);
1918 if (pmt_pid
== ts
->current_pid
)
1921 av_dlog(ts
->stream
, "sid=0x%x pid=0x%x\n", sid
, pmt_pid
);
1923 if (sid
== 0x0000) {
1926 MpegTSFilter
*fil
= ts
->pids
[pmt_pid
];
1927 program
= av_new_program(ts
->stream
, sid
);
1928 program
->program_num
= sid
;
1929 program
->pmt_pid
= pmt_pid
;
1931 if ( fil
->type
!= MPEGTS_SECTION
1932 || fil
->pid
!= pmt_pid
1933 || fil
->u
.section_filter
.section_cb
!= pmt_cb
)
1934 mpegts_close_filter(ts
, ts
->pids
[pmt_pid
]);
1936 if (!ts
->pids
[pmt_pid
])
1937 mpegts_open_section_filter(ts
, pmt_pid
, pmt_cb
, ts
, 1);
1938 add_pat_entry(ts
, sid
);
1939 add_pid_to_pmt(ts
, sid
, 0); // add pat pid to program
1940 add_pid_to_pmt(ts
, sid
, pmt_pid
);
1946 for (j
=0; j
<ts
->stream
->nb_programs
; j
++) {
1947 for (i
= 0; i
< ts
->nb_prg
; i
++)
1948 if (ts
->prg
[i
].id
== ts
->stream
->programs
[j
]->id
)
1950 if (i
==ts
->nb_prg
&& !ts
->skip_clear
)
1951 clear_avprogram(ts
, ts
->stream
->programs
[j
]->id
);
1956 static void sdt_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1958 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1959 SectionHeader h1
, *h
= &h1
;
1960 const uint8_t *p
, *p_end
, *desc_list_end
, *desc_end
;
1961 int onid
, val
, sid
, desc_list_len
, desc_tag
, desc_len
, service_type
;
1962 char *name
, *provider_name
;
1964 av_dlog(ts
->stream
, "SDT:\n");
1965 hex_dump_debug(ts
->stream
, section
, section_len
);
1967 p_end
= section
+ section_len
- 4;
1969 if (parse_section_header(h
, &p
, p_end
) < 0)
1971 if (h
->tid
!= SDT_TID
)
1973 if (ts
->skip_changes
)
1975 onid
= get16(&p
, p_end
);
1978 val
= get8(&p
, p_end
);
1982 sid
= get16(&p
, p_end
);
1985 val
= get8(&p
, p_end
);
1988 desc_list_len
= get16(&p
, p_end
);
1989 if (desc_list_len
< 0)
1991 desc_list_len
&= 0xfff;
1992 desc_list_end
= p
+ desc_list_len
;
1993 if (desc_list_end
> p_end
)
1996 desc_tag
= get8(&p
, desc_list_end
);
1999 desc_len
= get8(&p
, desc_list_end
);
2000 desc_end
= p
+ desc_len
;
2001 if (desc_len
< 0 || desc_end
> desc_list_end
)
2004 av_dlog(ts
->stream
, "tag: 0x%02x len=%d\n",
2005 desc_tag
, desc_len
);
2009 service_type
= get8(&p
, p_end
);
2010 if (service_type
< 0)
2012 provider_name
= getstr8(&p
, p_end
);
2015 name
= getstr8(&p
, p_end
);
2017 AVProgram
*program
= av_new_program(ts
->stream
, sid
);
2019 av_dict_set(&program
->metadata
, "service_name", name
, 0);
2020 av_dict_set(&program
->metadata
, "service_provider",
2025 av_free(provider_name
);
2036 static int parse_pcr(int64_t *ppcr_high
, int *ppcr_low
,
2037 const uint8_t *packet
);
2039 /* handle one TS packet */
2040 static int handle_packet(MpegTSContext
*ts
, const uint8_t *packet
)
2043 int len
, pid
, cc
, expected_cc
, cc_ok
, afc
, is_start
, is_discontinuity
,
2044 has_adaptation
, has_payload
;
2045 const uint8_t *p
, *p_end
;
2048 pid
= AV_RB16(packet
+ 1) & 0x1fff;
2049 if (pid
&& discard_pid(ts
, pid
))
2051 is_start
= packet
[1] & 0x40;
2052 tss
= ts
->pids
[pid
];
2053 if (ts
->auto_guess
&& !tss
&& is_start
) {
2054 add_pes_stream(ts
, pid
, -1);
2055 tss
= ts
->pids
[pid
];
2059 ts
->current_pid
= pid
;
2061 afc
= (packet
[3] >> 4) & 3;
2062 if (afc
== 0) /* reserved value */
2064 has_adaptation
= afc
& 2;
2065 has_payload
= afc
& 1;
2066 is_discontinuity
= has_adaptation
&&
2067 packet
[4] != 0 && /* with length > 0 */
2068 (packet
[5] & 0x80); /* and discontinuity indicated */
2070 /* continuity check (currently not used) */
2071 cc
= (packet
[3] & 0xf);
2072 expected_cc
= has_payload
? (tss
->last_cc
+ 1) & 0x0f : tss
->last_cc
;
2073 cc_ok
= pid
== 0x1FFF || // null packet PID
2080 av_log(ts
->stream
, AV_LOG_DEBUG
,
2081 "Continuity check failed for pid %d expected %d got %d\n",
2082 pid
, expected_cc
, cc
);
2083 if (tss
->type
== MPEGTS_PES
) {
2084 PESContext
*pc
= tss
->u
.pes_filter
.opaque
;
2085 pc
->flags
|= AV_PKT_FLAG_CORRUPT
;
2090 if (has_adaptation
) {
2093 if (parse_pcr(&pcr_h
, &pcr_l
, packet
) == 0)
2094 tss
->last_pcr
= pcr_h
* 300 + pcr_l
;
2095 /* skip adaptation field */
2098 /* if past the end of packet, ignore */
2099 p_end
= packet
+ TS_PACKET_SIZE
;
2100 if (p
>= p_end
|| !has_payload
)
2103 pos
= avio_tell(ts
->stream
->pb
);
2105 av_assert0(pos
>= TS_PACKET_SIZE
);
2106 ts
->pos47_full
= pos
- TS_PACKET_SIZE
;
2109 if (tss
->type
== MPEGTS_SECTION
) {
2111 /* pointer field present */
2113 if (p
+ len
> p_end
)
2116 /* write remaining section bytes */
2117 write_section_data(ts
, tss
,
2119 /* check whether filter has been closed */
2125 write_section_data(ts
, tss
,
2130 write_section_data(ts
, tss
,
2135 // stop find_stream_info from waiting for more streams
2136 // when all programs have received a PMT
2137 if (ts
->stream
->ctx_flags
& AVFMTCTX_NOHEADER
) {
2139 for (i
= 0; i
< ts
->nb_prg
; i
++) {
2140 if (!ts
->prg
[i
].pmt_found
)
2143 if (i
== ts
->nb_prg
&& ts
->nb_prg
> 0) {
2144 if (ts
->stream
->nb_streams
> 1 || pos
> 100000) {
2145 av_log(ts
->stream
, AV_LOG_DEBUG
, "All programs have pmt, headers found\n");
2146 ts
->stream
->ctx_flags
&= ~AVFMTCTX_NOHEADER
;
2153 // Note: The position here points actually behind the current packet.
2154 if (tss
->type
== MPEGTS_PES
) {
2155 if ((ret
= tss
->u
.pes_filter
.pes_cb(tss
, p
, p_end
- p
, is_start
,
2156 pos
- ts
->raw_packet_size
)) < 0)
2164 static void reanalyze(MpegTSContext
*ts
) {
2165 AVIOContext
*pb
= ts
->stream
->pb
;
2166 int64_t pos
= avio_tell(pb
);
2169 pos
-= ts
->pos47_full
;
2170 if (pos
== TS_PACKET_SIZE
) {
2171 ts
->size_stat
[0] ++;
2172 } else if (pos
== TS_DVHS_PACKET_SIZE
) {
2173 ts
->size_stat
[1] ++;
2174 } else if (pos
== TS_FEC_PACKET_SIZE
) {
2175 ts
->size_stat
[2] ++;
2178 ts
->size_stat_count
++;
2179 if (ts
->size_stat_count
> SIZE_STAT_THRESHOLD
) {
2181 if (ts
->size_stat
[0] > SIZE_STAT_THRESHOLD
) {
2182 newsize
= TS_PACKET_SIZE
;
2183 } else if (ts
->size_stat
[1] > SIZE_STAT_THRESHOLD
) {
2184 newsize
= TS_DVHS_PACKET_SIZE
;
2185 } else if (ts
->size_stat
[2] > SIZE_STAT_THRESHOLD
) {
2186 newsize
= TS_FEC_PACKET_SIZE
;
2188 if (newsize
&& newsize
!= ts
->raw_packet_size
) {
2189 av_log(ts
->stream
, AV_LOG_WARNING
, "changing packet size to %d\n", newsize
);
2190 ts
->raw_packet_size
= newsize
;
2192 ts
->size_stat_count
= 0;
2193 memset(ts
->size_stat
, 0, sizeof(ts
->size_stat
));
2197 /* XXX: try to find a better synchro over several packets (use
2198 * get_packet_size() ?) */
2199 static int mpegts_resync(AVFormatContext
*s
)
2201 MpegTSContext
*ts
= s
->priv_data
;
2202 AVIOContext
*pb
= s
->pb
;
2205 for (i
= 0; i
< ts
->resync_size
; i
++) {
2210 avio_seek(pb
, -1, SEEK_CUR
);
2211 reanalyze(s
->priv_data
);
2215 av_log(s
, AV_LOG_ERROR
,
2216 "max resync size reached, could not find sync byte\n");
2218 return AVERROR_INVALIDDATA
;
2221 /* return AVERROR_something if error or EOF. Return 0 if OK. */
2222 static int read_packet(AVFormatContext
*s
, uint8_t *buf
, int raw_packet_size
,
2223 const uint8_t **data
)
2225 AVIOContext
*pb
= s
->pb
;
2229 len
= ffio_read_indirect(pb
, buf
, TS_PACKET_SIZE
, data
);
2230 if (len
!= TS_PACKET_SIZE
)
2231 return len
< 0 ? len
: AVERROR_EOF
;
2232 /* check packet sync byte */
2233 if ((*data
)[0] != 0x47) {
2234 /* find a new packet start */
2235 uint64_t pos
= avio_tell(pb
);
2236 avio_seek(pb
, -FFMIN(raw_packet_size
, pos
), SEEK_CUR
);
2238 if (mpegts_resync(s
) < 0)
2239 return AVERROR(EAGAIN
);
2249 static void finished_reading_packet(AVFormatContext
*s
, int raw_packet_size
)
2251 AVIOContext
*pb
= s
->pb
;
2252 int skip
= raw_packet_size
- TS_PACKET_SIZE
;
2254 avio_skip(pb
, skip
);
2257 static int handle_packets(MpegTSContext
*ts
, int64_t nb_packets
)
2259 AVFormatContext
*s
= ts
->stream
;
2260 uint8_t packet
[TS_PACKET_SIZE
+ FF_INPUT_BUFFER_PADDING_SIZE
];
2261 const uint8_t *data
;
2265 if (avio_tell(s
->pb
) != ts
->last_pos
) {
2267 av_dlog(ts
->stream
, "Skipping after seek\n");
2268 /* seek detected, flush pes buffer */
2269 for (i
= 0; i
< NB_PID_MAX
; i
++) {
2271 if (ts
->pids
[i
]->type
== MPEGTS_PES
) {
2272 PESContext
*pes
= ts
->pids
[i
]->u
.pes_filter
.opaque
;
2273 av_buffer_unref(&pes
->buffer
);
2274 pes
->data_index
= 0;
2275 pes
->state
= MPEGTS_SKIP
; /* skip until pes header */
2277 ts
->pids
[i
]->last_cc
= -1;
2278 ts
->pids
[i
]->last_pcr
= -1;
2285 memset(packet
+ TS_PACKET_SIZE
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2288 if (nb_packets
!= 0 && packet_num
>= nb_packets
||
2289 ts
->stop_parse
> 1) {
2290 ret
= AVERROR(EAGAIN
);
2293 if (ts
->stop_parse
> 0)
2296 ret
= read_packet(s
, packet
, ts
->raw_packet_size
, &data
);
2299 ret
= handle_packet(ts
, data
);
2300 finished_reading_packet(s
, ts
->raw_packet_size
);
2304 ts
->last_pos
= avio_tell(s
->pb
);
2308 static int mpegts_probe(AVProbeData
*p
)
2310 const int size
= p
->buf_size
;
2314 int check_count
= size
/ TS_FEC_PACKET_SIZE
;
2315 #define CHECK_COUNT 10
2316 #define CHECK_BLOCK 100
2318 if (check_count
< CHECK_COUNT
)
2319 return AVERROR_INVALIDDATA
;
2321 for (i
= 0; i
<check_count
; i
+=CHECK_BLOCK
) {
2322 int left
= FFMIN(check_count
- i
, CHECK_BLOCK
);
2323 int score
= analyze(p
->buf
+ TS_PACKET_SIZE
*i
, TS_PACKET_SIZE
*left
, TS_PACKET_SIZE
, NULL
);
2324 int dvhs_score
= analyze(p
->buf
+ TS_DVHS_PACKET_SIZE
*i
, TS_DVHS_PACKET_SIZE
*left
, TS_DVHS_PACKET_SIZE
, NULL
);
2325 int fec_score
= analyze(p
->buf
+ TS_FEC_PACKET_SIZE
*i
, TS_FEC_PACKET_SIZE
*left
, TS_FEC_PACKET_SIZE
, NULL
);
2326 score
= FFMAX3(score
, dvhs_score
, fec_score
);
2328 maxscore
= FFMAX(maxscore
, score
);
2331 sumscore
= sumscore
* CHECK_COUNT
/ check_count
;
2332 maxscore
= maxscore
* CHECK_COUNT
/ CHECK_BLOCK
;
2334 av_dlog(0, "TS score: %d %d\n", sumscore
, maxscore
);
2336 if (sumscore
> 6) return AVPROBE_SCORE_MAX
+ sumscore
- CHECK_COUNT
;
2337 else if (maxscore
> 6) return AVPROBE_SCORE_MAX
/2 + sumscore
- CHECK_COUNT
;
2339 return AVERROR_INVALIDDATA
;
2342 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
2343 * (-1) if not available */
2344 static int parse_pcr(int64_t *ppcr_high
, int *ppcr_low
, const uint8_t *packet
)
2346 int afc
, len
, flags
;
2350 afc
= (packet
[3] >> 4) & 3;
2352 return AVERROR_INVALIDDATA
;
2357 return AVERROR_INVALIDDATA
;
2360 if (!(flags
& 0x10))
2361 return AVERROR_INVALIDDATA
;
2363 return AVERROR_INVALIDDATA
;
2365 *ppcr_high
= ((int64_t) v
<< 1) | (p
[4] >> 7);
2366 *ppcr_low
= ((p
[4] & 1) << 8) | p
[5];
2370 static void seek_back(AVFormatContext
*s
, AVIOContext
*pb
, int64_t pos
) {
2372 /* NOTE: We attempt to seek on non-seekable files as well, as the
2373 * probe buffer usually is big enough. Only warn if the seek failed
2374 * on files where the seek should work. */
2375 if (avio_seek(pb
, pos
, SEEK_SET
) < 0)
2376 av_log(s
, pb
->seekable
? AV_LOG_ERROR
: AV_LOG_INFO
, "Unable to seek back to the start\n");
2379 static int mpegts_read_header(AVFormatContext
*s
)
2381 MpegTSContext
*ts
= s
->priv_data
;
2382 AVIOContext
*pb
= s
->pb
;
2383 uint8_t buf
[8 * 1024] = {0};
2385 int64_t pos
, probesize
= s
->probesize
? s
->probesize
: s
->probesize2
;
2387 ffio_ensure_seekback(pb
, probesize
);
2389 /* read the first 8192 bytes to get packet size */
2390 pos
= avio_tell(pb
);
2391 len
= avio_read(pb
, buf
, sizeof(buf
));
2392 ts
->raw_packet_size
= get_packet_size(buf
, len
);
2393 if (ts
->raw_packet_size
<= 0) {
2394 av_log(s
, AV_LOG_WARNING
, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
2395 ts
->raw_packet_size
= TS_PACKET_SIZE
;
2400 if (s
->iformat
== &ff_mpegts_demuxer
) {
2403 /* first do a scan to get all the services */
2404 seek_back(s
, pb
, pos
);
2406 mpegts_open_section_filter(ts
, SDT_PID
, sdt_cb
, ts
, 1);
2408 mpegts_open_section_filter(ts
, PAT_PID
, pat_cb
, ts
, 1);
2410 handle_packets(ts
, probesize
/ ts
->raw_packet_size
);
2411 /* if could not find service, enable auto_guess */
2415 av_dlog(ts
->stream
, "tuning done\n");
2417 s
->ctx_flags
|= AVFMTCTX_NOHEADER
;
2420 int pcr_pid
, pid
, nb_packets
, nb_pcrs
, ret
, pcr_l
;
2421 int64_t pcrs
[2], pcr_h
;
2422 int packet_count
[2];
2423 uint8_t packet
[TS_PACKET_SIZE
];
2424 const uint8_t *data
;
2426 /* only read packets */
2428 st
= avformat_new_stream(s
, NULL
);
2430 return AVERROR(ENOMEM
);
2431 avpriv_set_pts_info(st
, 60, 1, 27000000);
2432 st
->codec
->codec_type
= AVMEDIA_TYPE_DATA
;
2433 st
->codec
->codec_id
= AV_CODEC_ID_MPEG2TS
;
2435 /* we iterate until we find two PCRs to estimate the bitrate */
2440 ret
= read_packet(s
, packet
, ts
->raw_packet_size
, &data
);
2443 pid
= AV_RB16(data
+ 1) & 0x1fff;
2444 if ((pcr_pid
== -1 || pcr_pid
== pid
) &&
2445 parse_pcr(&pcr_h
, &pcr_l
, data
) == 0) {
2446 finished_reading_packet(s
, ts
->raw_packet_size
);
2448 packet_count
[nb_pcrs
] = nb_packets
;
2449 pcrs
[nb_pcrs
] = pcr_h
* 300 + pcr_l
;
2454 finished_reading_packet(s
, ts
->raw_packet_size
);
2459 /* NOTE1: the bitrate is computed without the FEC */
2460 /* NOTE2: it is only the bitrate of the start of the stream */
2461 ts
->pcr_incr
= (pcrs
[1] - pcrs
[0]) / (packet_count
[1] - packet_count
[0]);
2462 ts
->cur_pcr
= pcrs
[0] - ts
->pcr_incr
* packet_count
[0];
2463 s
->bit_rate
= TS_PACKET_SIZE
* 8 * 27e6
/ ts
->pcr_incr
;
2464 st
->codec
->bit_rate
= s
->bit_rate
;
2465 st
->start_time
= ts
->cur_pcr
;
2466 av_dlog(ts
->stream
, "start=%0.3f pcr=%0.3f incr=%d\n",
2467 st
->start_time
/ 1000000.0, pcrs
[0] / 27e6
, ts
->pcr_incr
);
2470 seek_back(s
, pb
, pos
);
2474 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
2476 static int mpegts_raw_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
2478 MpegTSContext
*ts
= s
->priv_data
;
2480 int64_t pcr_h
, next_pcr_h
, pos
;
2481 int pcr_l
, next_pcr_l
;
2482 uint8_t pcr_buf
[12];
2483 const uint8_t *data
;
2485 if (av_new_packet(pkt
, TS_PACKET_SIZE
) < 0)
2486 return AVERROR(ENOMEM
);
2487 ret
= read_packet(s
, pkt
->data
, ts
->raw_packet_size
, &data
);
2488 pkt
->pos
= avio_tell(s
->pb
);
2490 av_free_packet(pkt
);
2493 if (data
!= pkt
->data
)
2494 memcpy(pkt
->data
, data
, ts
->raw_packet_size
);
2495 finished_reading_packet(s
, ts
->raw_packet_size
);
2496 if (ts
->mpeg2ts_compute_pcr
) {
2497 /* compute exact PCR for each packet */
2498 if (parse_pcr(&pcr_h
, &pcr_l
, pkt
->data
) == 0) {
2499 /* we read the next PCR (XXX: optimize it by using a bigger buffer */
2500 pos
= avio_tell(s
->pb
);
2501 for (i
= 0; i
< MAX_PACKET_READAHEAD
; i
++) {
2502 avio_seek(s
->pb
, pos
+ i
* ts
->raw_packet_size
, SEEK_SET
);
2503 avio_read(s
->pb
, pcr_buf
, 12);
2504 if (parse_pcr(&next_pcr_h
, &next_pcr_l
, pcr_buf
) == 0) {
2505 /* XXX: not precise enough */
2507 ((next_pcr_h
- pcr_h
) * 300 + (next_pcr_l
- pcr_l
)) /
2512 avio_seek(s
->pb
, pos
, SEEK_SET
);
2513 /* no next PCR found: we use previous increment */
2514 ts
->cur_pcr
= pcr_h
* 300 + pcr_l
;
2516 pkt
->pts
= ts
->cur_pcr
;
2517 pkt
->duration
= ts
->pcr_incr
;
2518 ts
->cur_pcr
+= ts
->pcr_incr
;
2520 pkt
->stream_index
= 0;
2524 static int mpegts_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
2526 MpegTSContext
*ts
= s
->priv_data
;
2531 ret
= handle_packets(ts
, 0);
2533 av_free_packet(ts
->pkt
);
2534 /* flush pes data left */
2535 for (i
= 0; i
< NB_PID_MAX
; i
++)
2536 if (ts
->pids
[i
] && ts
->pids
[i
]->type
== MPEGTS_PES
) {
2537 PESContext
*pes
= ts
->pids
[i
]->u
.pes_filter
.opaque
;
2538 if (pes
->state
== MPEGTS_PAYLOAD
&& pes
->data_index
> 0) {
2539 new_pes_packet(pes
, pkt
);
2540 pes
->state
= MPEGTS_SKIP
;
2547 if (!ret
&& pkt
->size
< 0)
2548 ret
= AVERROR(EINTR
);
2552 static void mpegts_free(MpegTSContext
*ts
)
2558 for (i
= 0; i
< NB_PID_MAX
; i
++)
2560 mpegts_close_filter(ts
, ts
->pids
[i
]);
2563 static int mpegts_read_close(AVFormatContext
*s
)
2565 MpegTSContext
*ts
= s
->priv_data
;
2570 static av_unused
int64_t mpegts_get_pcr(AVFormatContext
*s
, int stream_index
,
2571 int64_t *ppos
, int64_t pos_limit
)
2573 MpegTSContext
*ts
= s
->priv_data
;
2574 int64_t pos
, timestamp
;
2575 uint8_t buf
[TS_PACKET_SIZE
];
2576 int pcr_l
, pcr_pid
=
2577 ((PESContext
*)s
->streams
[stream_index
]->priv_data
)->pcr_pid
;
2578 int pos47
= ts
->pos47_full
% ts
->raw_packet_size
;
2580 ((*ppos
+ ts
->raw_packet_size
- 1 - pos47
) / ts
->raw_packet_size
) *
2581 ts
->raw_packet_size
+ pos47
;
2582 while(pos
< pos_limit
) {
2583 if (avio_seek(s
->pb
, pos
, SEEK_SET
) < 0)
2584 return AV_NOPTS_VALUE
;
2585 if (avio_read(s
->pb
, buf
, TS_PACKET_SIZE
) != TS_PACKET_SIZE
)
2586 return AV_NOPTS_VALUE
;
2587 if (buf
[0] != 0x47) {
2588 avio_seek(s
->pb
, -TS_PACKET_SIZE
, SEEK_CUR
);
2589 if (mpegts_resync(s
) < 0)
2590 return AV_NOPTS_VALUE
;
2591 pos
= avio_tell(s
->pb
);
2594 if ((pcr_pid
< 0 || (AV_RB16(buf
+ 1) & 0x1fff) == pcr_pid
) &&
2595 parse_pcr(×tamp
, &pcr_l
, buf
) == 0) {
2599 pos
+= ts
->raw_packet_size
;
2602 return AV_NOPTS_VALUE
;
2605 static int64_t mpegts_get_dts(AVFormatContext
*s
, int stream_index
,
2606 int64_t *ppos
, int64_t pos_limit
)
2608 MpegTSContext
*ts
= s
->priv_data
;
2610 int pos47
= ts
->pos47_full
% ts
->raw_packet_size
;
2611 pos
= ((*ppos
+ ts
->raw_packet_size
- 1 - pos47
) / ts
->raw_packet_size
) * ts
->raw_packet_size
+ pos47
;
2612 ff_read_frame_flush(s
);
2613 if (avio_seek(s
->pb
, pos
, SEEK_SET
) < 0)
2614 return AV_NOPTS_VALUE
;
2615 while(pos
< pos_limit
) {
2618 av_init_packet(&pkt
);
2619 ret
= av_read_frame(s
, &pkt
);
2621 return AV_NOPTS_VALUE
;
2622 av_free_packet(&pkt
);
2623 if (pkt
.dts
!= AV_NOPTS_VALUE
&& pkt
.pos
>= 0) {
2624 ff_reduce_index(s
, pkt
.stream_index
);
2625 av_add_index_entry(s
->streams
[pkt
.stream_index
], pkt
.pos
, pkt
.dts
, 0, 0, AVINDEX_KEYFRAME
/* FIXME keyframe? */);
2626 if (pkt
.stream_index
== stream_index
&& pkt
.pos
>= *ppos
) {
2634 return AV_NOPTS_VALUE
;
2637 /**************************************************************/
2638 /* parsing functions - called from other demuxers such as RTP */
2640 MpegTSContext
*avpriv_mpegts_parse_open(AVFormatContext
*s
)
2644 ts
= av_mallocz(sizeof(MpegTSContext
));
2647 /* no stream case, currently used by RTP */
2648 ts
->raw_packet_size
= TS_PACKET_SIZE
;
2651 mpegts_open_section_filter(ts
, SDT_PID
, sdt_cb
, ts
, 1);
2652 mpegts_open_section_filter(ts
, PAT_PID
, pat_cb
, ts
, 1);
2657 /* return the consumed length if a packet was output, or -1 if no
2658 * packet is output */
2659 int avpriv_mpegts_parse_packet(MpegTSContext
*ts
, AVPacket
*pkt
,
2660 const uint8_t *buf
, int len
)
2668 if (len
< TS_PACKET_SIZE
)
2669 return AVERROR_INVALIDDATA
;
2670 if (buf
[0] != 0x47) {
2674 handle_packet(ts
, buf
);
2675 buf
+= TS_PACKET_SIZE
;
2676 len
-= TS_PACKET_SIZE
;
2677 if (ts
->stop_parse
== 1)
2684 void avpriv_mpegts_parse_close(MpegTSContext
*ts
)
2690 AVInputFormat ff_mpegts_demuxer
= {
2692 .long_name
= NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
2693 .priv_data_size
= sizeof(MpegTSContext
),
2694 .read_probe
= mpegts_probe
,
2695 .read_header
= mpegts_read_header
,
2696 .read_packet
= mpegts_read_packet
,
2697 .read_close
= mpegts_read_close
,
2698 .read_timestamp
= mpegts_get_dts
,
2699 .flags
= AVFMT_SHOW_IDS
| AVFMT_TS_DISCONT
,
2700 .priv_class
= &mpegts_class
,
2703 AVInputFormat ff_mpegtsraw_demuxer
= {
2704 .name
= "mpegtsraw",
2705 .long_name
= NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
2706 .priv_data_size
= sizeof(MpegTSContext
),
2707 .read_header
= mpegts_read_header
,
2708 .read_packet
= mpegts_raw_read_packet
,
2709 .read_close
= mpegts_read_close
,
2710 .read_timestamp
= mpegts_get_dts
,
2711 .flags
= AVFMT_SHOW_IDS
| AVFMT_TS_DISCONT
,
2712 .priv_class
= &mpegtsraw_class
,