2 * MPEG-2 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 "config_components.h"
24 #include "libavutil/attributes_internal.h"
25 #include "libavutil/buffer.h"
26 #include "libavutil/crc.h"
27 #include "libavutil/internal.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/log.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/dovi_meta.h"
35 #include "libavcodec/bytestream.h"
36 #include "libavcodec/defs.h"
37 #include "libavcodec/get_bits.h"
38 #include "libavcodec/opus/opus.h"
42 #include "avio_internal.h"
50 /* maximum size in which we look for synchronization if
51 * synchronization is lost */
52 #define MAX_RESYNC_SIZE 65536
54 #define MAX_MP4_DESCR_COUNT 16
56 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
58 if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
59 (modulus) = (dividend) % (divisor); \
60 (prev_dividend) = (dividend); \
63 #define PROBE_PACKET_MAX_BUF 8192
64 #define PROBE_PACKET_MARGIN 5
66 enum MpegTSFilterType
{
72 typedef struct MpegTSFilter MpegTSFilter
;
74 typedef int PESCallback (MpegTSFilter
*f
, const uint8_t *buf
, int len
,
75 int is_start
, int64_t pos
);
77 typedef struct MpegTSPESFilter
{
82 typedef void SectionCallback (MpegTSFilter
*f
, const uint8_t *buf
, int len
);
84 typedef void SetServiceCallback (void *opaque
, int ret
);
86 typedef struct MpegTSSectionFilter
{
93 unsigned int check_crc
: 1;
94 unsigned int end_of_section_reached
: 1;
95 SectionCallback
*section_cb
;
97 } MpegTSSectionFilter
;
102 int last_cc
; /* last cc code (-1 if first packet) */
105 enum MpegTSFilterType type
;
107 MpegTSPESFilter pes_filter
;
108 MpegTSSectionFilter section_filter
;
114 int stream_identifier
;
117 #define MAX_STREAMS_PER_PROGRAM 128
118 #define MAX_PIDS_PER_PROGRAM (MAX_STREAMS_PER_PROGRAM + 2)
120 unsigned int id
; // program id/service id
121 unsigned int nb_pids
;
122 unsigned int pids
[MAX_PIDS_PER_PROGRAM
];
123 unsigned int nb_streams
;
124 struct Stream streams
[MAX_STREAMS_PER_PROGRAM
];
126 /** have we found pmt for this program */
130 struct MpegTSContext
{
131 const AVClass
*class;
133 AVFormatContext
*stream
;
134 /** raw packet size, including FEC if present */
139 /** if true, all pids are analyzed to find streams */
142 /** compute exact PCR for each transport stream packet */
143 int mpeg2ts_compute_pcr
;
145 /** fix dvb teletext pts */
146 int fix_teletext_pts
;
148 int64_t cur_pcr
; /**< used to estimate the exact PCR */
149 int64_t pcr_incr
; /**< used to estimate the exact PCR */
151 /* data needed to handle file based ts */
152 /** stop parsing loop */
154 /** packet containing Audio/Video data */
156 /** to detect seek */
161 int skip_unknown_pmt
;
166 int merge_pmt_versions
;
171 /******************************************/
172 /* private mpegts data */
174 /** structure to keep track of Program->pids mapping */
178 int8_t crc_validity
[NB_PID_MAX
];
179 /** filters for various streams specified by PMT + for the PAT and PMT */
180 MpegTSFilter
*pids
[NB_PID_MAX
];
183 AVStream
*epg_stream
;
184 AVBufferPool
* pools
[32];
187 #define MPEGTS_OPTIONS \
188 { "resync_size", "set size limit for looking up a new synchronization", \
189 offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, \
190 { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, \
191 { "ts_id", "transport stream id", \
192 offsetof(MpegTSContext, id), AV_OPT_TYPE_INT, \
193 { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, \
194 { "ts_packetsize", "output option carrying the raw packet size", \
195 offsetof(MpegTSContext, raw_packet_size), AV_OPT_TYPE_INT, \
196 { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }
198 static const AVOption options
[] = {
200 {"fix_teletext_pts", "try to fix pts values of dvb teletext streams", offsetof(MpegTSContext
, fix_teletext_pts
), AV_OPT_TYPE_BOOL
,
201 {.i64
= 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
202 {"scan_all_pmts", "scan and combine all PMTs", offsetof(MpegTSContext
, scan_all_pmts
), AV_OPT_TYPE_BOOL
,
203 {.i64
= -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM
},
204 {"skip_unknown_pmt", "skip PMTs for programs not advertised in the PAT", offsetof(MpegTSContext
, skip_unknown_pmt
), AV_OPT_TYPE_BOOL
,
205 {.i64
= 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
206 {"merge_pmt_versions", "reuse streams when PMT's version/pids change", offsetof(MpegTSContext
, merge_pmt_versions
), AV_OPT_TYPE_BOOL
,
207 {.i64
= 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
208 {"skip_changes", "skip changing / adding streams / programs", offsetof(MpegTSContext
, skip_changes
), AV_OPT_TYPE_BOOL
,
209 {.i64
= 0}, 0, 1, 0 },
210 {"skip_clear", "skip clearing programs", offsetof(MpegTSContext
, skip_clear
), AV_OPT_TYPE_BOOL
,
211 {.i64
= 0}, 0, 1, 0 },
212 {"max_packet_size", "maximum size of emitted packet", offsetof(MpegTSContext
, max_packet_size
), AV_OPT_TYPE_INT
,
213 {.i64
= 204800}, 1, INT_MAX
/2, AV_OPT_FLAG_DECODING_PARAM
},
217 static const AVClass mpegts_class
= {
218 .class_name
= "mpegts demuxer",
219 .item_name
= av_default_item_name
,
221 .version
= LIBAVUTIL_VERSION_INT
,
224 static const AVOption raw_options
[] = {
226 { "compute_pcr", "compute exact PCR for each transport stream packet",
227 offsetof(MpegTSContext
, mpeg2ts_compute_pcr
), AV_OPT_TYPE_BOOL
,
228 { .i64
= 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
232 static const AVClass mpegtsraw_class
= {
233 .class_name
= "mpegtsraw demuxer",
234 .item_name
= av_default_item_name
,
235 .option
= raw_options
,
236 .version
= LIBAVUTIL_VERSION_INT
,
239 /* TS stream handling */
244 MPEGTS_PESHEADER_FILL
,
249 /* enough for PES header + length */
250 #define PES_START_SIZE 6
251 #define PES_HEADER_SIZE 9
252 #define MAX_PES_HEADER_SIZE (9 + 255)
254 typedef struct PESContext
{
256 int pcr_pid
; /**< if -1 then all packets containing PCR are considered */
259 AVFormatContext
*stream
;
261 AVStream
*sub_st
; /**< stream for the embedded AC3 stream in HDMV TrueHD */
262 enum MpegTSState state
;
263 /* used to get the format */
265 int flags
; /**< copied to the AVPacket flags */
266 int PES_packet_length
;
268 int extended_stream_id
;
271 int64_t ts_packet_pos
; /**< position of first TS packet of this PES packet */
272 uint8_t header
[MAX_PES_HEADER_SIZE
];
278 EXTERN
const FFInputFormat ff_mpegts_demuxer
;
280 static struct Program
* get_program(MpegTSContext
*ts
, unsigned int programid
)
283 for (i
= 0; i
< ts
->nb_prg
; i
++) {
284 if (ts
->prg
[i
].id
== programid
) {
291 static void clear_avprogram(MpegTSContext
*ts
, unsigned int programid
)
293 AVProgram
*prg
= NULL
;
296 for (i
= 0; i
< ts
->stream
->nb_programs
; i
++)
297 if (ts
->stream
->programs
[i
]->id
== programid
) {
298 prg
= ts
->stream
->programs
[i
];
303 prg
->nb_stream_indexes
= 0;
306 static void clear_program(struct Program
*p
)
315 static void clear_programs(MpegTSContext
*ts
)
321 static struct Program
* add_program(MpegTSContext
*ts
, unsigned int programid
)
323 struct Program
*p
= get_program(ts
, programid
);
326 if (av_reallocp_array(&ts
->prg
, ts
->nb_prg
+ 1, sizeof(*ts
->prg
)) < 0) {
330 p
= &ts
->prg
[ts
->nb_prg
];
337 static void add_pid_to_program(struct Program
*p
, unsigned int pid
)
343 if (p
->nb_pids
>= MAX_PIDS_PER_PROGRAM
)
346 for (i
= 0; i
< p
->nb_pids
; i
++)
347 if (p
->pids
[i
] == pid
)
350 p
->pids
[p
->nb_pids
++] = pid
;
353 static void update_av_program_info(AVFormatContext
*s
, unsigned int programid
,
354 unsigned int pid
, int version
)
357 for (i
= 0; i
< s
->nb_programs
; i
++) {
358 AVProgram
*program
= s
->programs
[i
];
359 if (program
->id
== programid
) {
360 int old_pcr_pid
= program
->pcr_pid
,
361 old_version
= program
->pmt_version
;
362 program
->pcr_pid
= pid
;
363 program
->pmt_version
= version
;
365 if (old_version
!= -1 && old_version
!= version
) {
366 av_log(s
, AV_LOG_VERBOSE
,
367 "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
368 programid
, old_version
, version
, old_pcr_pid
, pid
);
376 * @brief discard_pid() decides if the pid is to be discarded according
377 * to caller's programs selection
378 * @param ts : - TS context
380 * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
383 static int discard_pid(MpegTSContext
*ts
, unsigned int pid
)
386 int used
= 0, discarded
= 0;
392 /* If none of the programs have .discard=AVDISCARD_ALL then there's
393 * no way we have to discard this packet */
394 for (k
= 0; k
< ts
->stream
->nb_programs
; k
++)
395 if (ts
->stream
->programs
[k
]->discard
== AVDISCARD_ALL
)
397 if (k
== ts
->stream
->nb_programs
)
400 for (i
= 0; i
< ts
->nb_prg
; i
++) {
402 for (j
= 0; j
< p
->nb_pids
; j
++) {
403 if (p
->pids
[j
] != pid
)
405 // is program with id p->id set to be discarded?
406 for (k
= 0; k
< ts
->stream
->nb_programs
; k
++) {
407 if (ts
->stream
->programs
[k
]->id
== p
->id
) {
408 if (ts
->stream
->programs
[k
]->discard
== AVDISCARD_ALL
)
417 return !used
&& discarded
;
421 * Assemble PES packets out of TS packets, and then call the "section_cb"
422 * function when they are complete.
424 static void write_section_data(MpegTSContext
*ts
, MpegTSFilter
*tss1
,
425 const uint8_t *buf
, int buf_size
, int is_start
)
427 MpegTSSectionFilter
*tss
= &tss1
->u
.section_filter
;
428 uint8_t *cur_section_buf
= NULL
;
432 memcpy(tss
->section_buf
, buf
, buf_size
);
433 tss
->section_index
= buf_size
;
434 tss
->section_h_size
= -1;
435 tss
->end_of_section_reached
= 0;
437 if (tss
->end_of_section_reached
)
439 len
= MAX_SECTION_SIZE
- tss
->section_index
;
442 memcpy(tss
->section_buf
+ tss
->section_index
, buf
, len
);
443 tss
->section_index
+= len
;
447 cur_section_buf
= tss
->section_buf
;
448 while (cur_section_buf
- tss
->section_buf
< MAX_SECTION_SIZE
&& cur_section_buf
[0] != STUFFING_BYTE
) {
449 /* compute section length if possible */
450 if (tss
->section_h_size
== -1 && tss
->section_index
- offset
>= 3) {
451 len
= (AV_RB16(cur_section_buf
+ 1) & 0xfff) + 3;
452 if (len
> MAX_SECTION_SIZE
)
454 tss
->section_h_size
= len
;
457 if (tss
->section_h_size
!= -1 &&
458 tss
->section_index
>= offset
+ tss
->section_h_size
) {
460 tss
->end_of_section_reached
= 1;
462 if (tss
->check_crc
) {
463 crc_valid
= !av_crc(av_crc_get_table(AV_CRC_32_IEEE
), -1, cur_section_buf
, tss
->section_h_size
);
464 if (tss
->section_h_size
>= 4)
465 tss
->crc
= AV_RB32(cur_section_buf
+ tss
->section_h_size
- 4);
468 ts
->crc_validity
[ tss1
->pid
] = 100;
469 }else if (ts
->crc_validity
[ tss1
->pid
] > -10) {
470 ts
->crc_validity
[ tss1
->pid
]--;
475 tss
->section_cb(tss1
, cur_section_buf
, tss
->section_h_size
);
480 cur_section_buf
+= tss
->section_h_size
;
481 offset
+= tss
->section_h_size
;
482 tss
->section_h_size
= -1;
484 tss
->section_h_size
= -1;
485 tss
->end_of_section_reached
= 0;
491 static MpegTSFilter
*mpegts_open_filter(MpegTSContext
*ts
, unsigned int pid
,
492 enum MpegTSFilterType type
)
494 MpegTSFilter
*filter
;
496 av_log(ts
->stream
, AV_LOG_TRACE
, "Filter: pid=0x%x type=%d\n", pid
, type
);
498 if (pid
>= NB_PID_MAX
|| ts
->pids
[pid
])
500 filter
= av_mallocz(sizeof(MpegTSFilter
));
503 ts
->pids
[pid
] = filter
;
508 filter
->last_cc
= -1;
509 filter
->last_pcr
= -1;
514 static MpegTSFilter
*mpegts_open_section_filter(MpegTSContext
*ts
,
516 SectionCallback
*section_cb
,
520 MpegTSFilter
*filter
;
521 MpegTSSectionFilter
*sec
;
522 uint8_t *section_buf
= av_mallocz(MAX_SECTION_SIZE
);
527 if (!(filter
= mpegts_open_filter(ts
, pid
, MPEGTS_SECTION
))) {
528 av_free(section_buf
);
531 sec
= &filter
->u
.section_filter
;
532 sec
->section_cb
= section_cb
;
533 sec
->opaque
= opaque
;
534 sec
->section_buf
= section_buf
;
535 sec
->check_crc
= check_crc
;
541 static MpegTSFilter
*mpegts_open_pes_filter(MpegTSContext
*ts
, unsigned int pid
,
545 MpegTSFilter
*filter
;
546 MpegTSPESFilter
*pes
;
548 if (!(filter
= mpegts_open_filter(ts
, pid
, MPEGTS_PES
)))
551 pes
= &filter
->u
.pes_filter
;
552 pes
->pes_cb
= pes_cb
;
553 pes
->opaque
= opaque
;
557 static MpegTSFilter
*mpegts_open_pcr_filter(MpegTSContext
*ts
, unsigned int pid
)
559 return mpegts_open_filter(ts
, pid
, MPEGTS_PCR
);
562 static void mpegts_close_filter(MpegTSContext
*ts
, MpegTSFilter
*filter
)
567 if (filter
->type
== MPEGTS_SECTION
)
568 av_freep(&filter
->u
.section_filter
.section_buf
);
569 else if (filter
->type
== MPEGTS_PES
) {
570 PESContext
*pes
= filter
->u
.pes_filter
.opaque
;
571 av_buffer_unref(&pes
->buffer
);
572 /* referenced private data will be freed later in
573 * avformat_close_input (pes->st->priv_data == pes) */
574 if (!pes
->st
|| pes
->merged_st
) {
575 av_freep(&filter
->u
.pes_filter
.opaque
);
580 ts
->pids
[pid
] = NULL
;
583 static int analyze(const uint8_t *buf
, int size
, int packet_size
,
586 int stat
[TS_MAX_PACKET_SIZE
];
591 memset(stat
, 0, packet_size
* sizeof(*stat
));
593 for (i
= 0; i
< size
- 3; i
++) {
594 if (buf
[i
] == SYNC_BYTE
) {
595 int pid
= AV_RB16(buf
+1) & 0x1FFF;
596 int asc
= buf
[i
+ 3] & 0x30;
597 if (!probe
|| pid
== 0x1FFF || asc
) {
598 int x
= i
% packet_size
;
601 if (stat
[x
] > best_score
) {
602 best_score
= stat
[x
];
608 return best_score
- FFMAX(stat_all
- 10*best_score
, 0)/10;
611 /* autodetect fec presence */
612 static int get_packet_size(AVFormatContext
* s
)
614 int score
, fec_score
, dvhs_score
;
618 /*init buffer to store stream for probing */
619 uint8_t buf
[PROBE_PACKET_MAX_BUF
] = {0};
621 int max_iterations
= 16;
623 while (buf_size
< PROBE_PACKET_MAX_BUF
&& max_iterations
--) {
624 ret
= avio_read_partial(s
->pb
, buf
+ buf_size
, PROBE_PACKET_MAX_BUF
- buf_size
);
626 return AVERROR_INVALIDDATA
;
629 score
= analyze(buf
, buf_size
, TS_PACKET_SIZE
, 0);
630 dvhs_score
= analyze(buf
, buf_size
, TS_DVHS_PACKET_SIZE
, 0);
631 fec_score
= analyze(buf
, buf_size
, TS_FEC_PACKET_SIZE
, 0);
632 av_log(s
, AV_LOG_TRACE
, "Probe: %d, score: %d, dvhs_score: %d, fec_score: %d \n",
633 buf_size
, score
, dvhs_score
, fec_score
);
635 margin
= mid_pred(score
, fec_score
, dvhs_score
);
637 if (buf_size
< PROBE_PACKET_MAX_BUF
)
638 margin
+= PROBE_PACKET_MARGIN
; /*if buffer not filled */
641 return TS_PACKET_SIZE
;
642 else if (dvhs_score
> margin
)
643 return TS_DVHS_PACKET_SIZE
;
644 else if (fec_score
> margin
)
645 return TS_FEC_PACKET_SIZE
;
647 return AVERROR_INVALIDDATA
;
650 typedef struct SectionHeader
{
654 uint8_t current_next
;
656 uint8_t last_sec_num
;
659 static int skip_identical(const SectionHeader
*h
, MpegTSSectionFilter
*tssf
)
661 if (h
->version
== tssf
->last_ver
&& tssf
->last_crc
== tssf
->crc
)
664 tssf
->last_ver
= h
->version
;
665 tssf
->last_crc
= tssf
->crc
;
670 static inline int get8(const uint8_t **pp
, const uint8_t *p_end
)
677 return AVERROR_INVALIDDATA
;
683 static inline int get16(const uint8_t **pp
, const uint8_t *p_end
)
690 return AVERROR_INVALIDDATA
;
697 /* read and allocate a DVB string preceded by its length */
698 static char *getstr8(const uint8_t **pp
, const uint8_t *p_end
)
705 len
= get8(&p
, p_end
);
712 const char *encodings
[] = {
713 "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
714 "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11",
715 "", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "", "", "", "",
716 "", "UCS-2BE", "KSC_5601", "GB2312", "UCS-2BE", "UTF-8", "", "",
717 "", "", "", "", "", "", "", ""
721 size_t inlen
= len
, outlen
= inlen
* 6 + 1;
722 if (len
>= 3 && p
[0] == 0x10 && !p
[1] && p
[2] && p
[2] <= 0xf && p
[2] != 0xc) {
724 snprintf(iso8859
, sizeof(iso8859
), "ISO-8859-%d", p
[2]);
727 cd
= iconv_open("UTF-8", iso8859
);
728 } else if (p
[0] < 0x20) {
731 cd
= iconv_open("UTF-8", encodings
[*p
]);
734 cd
= iconv_open("UTF-8", encodings
[0]);
736 if (cd
== (iconv_t
)-1)
738 str
= out
= av_malloc(outlen
);
743 if (iconv(cd
, &in
, &inlen
, &out
, &outlen
) == -1) {
755 str
= av_malloc(len
+ 1);
765 static int parse_section_header(SectionHeader
*h
,
766 const uint8_t **pp
, const uint8_t *p_end
)
770 val
= get8(pp
, p_end
);
775 val
= get16(pp
, p_end
);
779 val
= get8(pp
, p_end
);
782 h
->version
= (val
>> 1) & 0x1f;
783 h
->current_next
= val
& 0x01;
784 val
= get8(pp
, p_end
);
788 val
= get8(pp
, p_end
);
791 h
->last_sec_num
= val
;
795 typedef struct StreamType
{
796 uint32_t stream_type
;
797 enum AVMediaType codec_type
;
798 enum AVCodecID codec_id
;
801 static const StreamType ISO_types
[] = {
802 { STREAM_TYPE_VIDEO_MPEG1
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_MPEG2VIDEO
},
803 { STREAM_TYPE_VIDEO_MPEG2
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_MPEG2VIDEO
},
804 { STREAM_TYPE_AUDIO_MPEG1
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_MP3
},
805 { STREAM_TYPE_AUDIO_MPEG2
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_MP3
},
806 { STREAM_TYPE_AUDIO_AAC
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AAC
},
807 { STREAM_TYPE_VIDEO_MPEG4
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_MPEG4
},
808 /* Makito encoder sets stream type 0x11 for AAC,
809 * so auto-detect LOAS/LATM instead of hardcoding it. */
810 #if !CONFIG_LOAS_DEMUXER
811 { STREAM_TYPE_AUDIO_AAC_LATM
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AAC_LATM
}, /* LATM syntax */
813 { STREAM_TYPE_VIDEO_H264
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_H264
},
814 { STREAM_TYPE_AUDIO_MPEG4
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AAC
},
815 { STREAM_TYPE_VIDEO_MVC
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_H264
},
816 { STREAM_TYPE_VIDEO_JPEG2000
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_JPEG2000
},
817 { STREAM_TYPE_VIDEO_HEVC
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_HEVC
},
818 { STREAM_TYPE_VIDEO_VVC
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_VVC
},
819 { STREAM_TYPE_VIDEO_CAVS
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_CAVS
},
820 { STREAM_TYPE_VIDEO_DIRAC
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_DIRAC
},
821 { STREAM_TYPE_VIDEO_AVS2
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_AVS2
},
822 { STREAM_TYPE_VIDEO_AVS3
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_AVS3
},
823 { STREAM_TYPE_VIDEO_VC1
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_VC1
},
827 static const StreamType HDMV_types
[] = {
828 { STREAM_TYPE_BLURAY_AUDIO_PCM_BLURAY
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_PCM_BLURAY
},
829 { STREAM_TYPE_BLURAY_AUDIO_AC3
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
830 { STREAM_TYPE_BLURAY_AUDIO_DTS
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
831 { STREAM_TYPE_BLURAY_AUDIO_TRUEHD
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_TRUEHD
},
832 { STREAM_TYPE_BLURAY_AUDIO_EAC3
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
833 { STREAM_TYPE_BLURAY_AUDIO_DTS_HD
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
834 { STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
835 { STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
836 { STREAM_TYPE_BLURAY_AUDIO_DTS_EXPRESS_SECONDARY
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
837 { STREAM_TYPE_BLURAY_SUBTITLE_PGS
, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_HDMV_PGS_SUBTITLE
},
838 { STREAM_TYPE_BLURAY_SUBTITLE_TEXT
, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_HDMV_TEXT_SUBTITLE
},
843 static const StreamType SCTE_types
[] = {
844 { STREAM_TYPE_SCTE_DATA_SCTE_35
, AVMEDIA_TYPE_DATA
, AV_CODEC_ID_SCTE_35
},
849 static const StreamType MISC_types
[] = {
850 { STREAM_TYPE_ATSC_AUDIO_AC3
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
851 { STREAM_TYPE_ATSC_AUDIO_EAC3
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
852 { 0x8a, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
856 /* HLS Sample Encryption Types */
857 static const StreamType HLS_SAMPLE_ENC_types
[] = {
858 { STREAM_TYPE_HLS_SE_VIDEO_H264
, AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_H264
},
859 { STREAM_TYPE_HLS_SE_AUDIO_AAC
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AAC
},
860 { STREAM_TYPE_HLS_SE_AUDIO_AC3
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
861 { STREAM_TYPE_HLS_SE_AUDIO_EAC3
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
865 static const StreamType REGD_types
[] = {
866 { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_DIRAC
},
867 { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
868 { MKTAG('A', 'C', '-', '4'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC4
},
869 { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_S302M
},
870 { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
871 { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
872 { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
873 { MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
874 { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_HEVC
},
875 { MKTAG('V', 'V', 'C', ' '), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_VVC
},
876 { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_SMPTE_KLV
},
877 { MKTAG('V', 'A', 'N', 'C'), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_SMPTE_2038
},
878 { MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_TIMED_ID3
},
879 { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO
, AV_CODEC_ID_VC1
},
880 { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_OPUS
},
884 static const StreamType METADATA_types
[] = {
885 { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_SMPTE_KLV
},
886 { MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA
, AV_CODEC_ID_TIMED_ID3
},
890 /* descriptor present */
891 static const StreamType DESC_types
[] = {
892 { AC3_DESCRIPTOR
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_AC3
},
893 { ENHANCED_AC3_DESCRIPTOR
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_EAC3
},
894 { DTS_DESCRIPTOR
, AVMEDIA_TYPE_AUDIO
, AV_CODEC_ID_DTS
},
895 { TELETEXT_DESCRIPTOR
, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_DVB_TELETEXT
},
896 { SUBTITLING_DESCRIPTOR
, AVMEDIA_TYPE_SUBTITLE
, AV_CODEC_ID_DVB_SUBTITLE
},
900 static void mpegts_find_stream_type(AVStream
*st
,
901 uint32_t stream_type
,
902 const StreamType
*types
)
904 FFStream
*const sti
= ffstream(st
);
905 for (; types
->stream_type
; types
++)
906 if (stream_type
== types
->stream_type
) {
907 if (st
->codecpar
->codec_type
!= types
->codec_type
||
908 st
->codecpar
->codec_id
!= types
->codec_id
) {
909 st
->codecpar
->codec_type
= types
->codec_type
;
910 st
->codecpar
->codec_id
= types
->codec_id
;
911 sti
->need_context_update
= 1;
913 sti
->request_probe
= 0;
918 static int mpegts_set_stream_info(AVStream
*st
, PESContext
*pes
,
919 uint32_t stream_type
, uint32_t prog_reg_desc
)
921 FFStream
*const sti
= ffstream(st
);
922 int old_codec_type
= st
->codecpar
->codec_type
;
923 int old_codec_id
= st
->codecpar
->codec_id
;
924 int old_codec_tag
= st
->codecpar
->codec_tag
;
926 avpriv_set_pts_info(st
, 33, 1, 90000);
928 st
->codecpar
->codec_type
= AVMEDIA_TYPE_DATA
;
929 st
->codecpar
->codec_id
= AV_CODEC_ID_NONE
;
930 sti
->need_parsing
= AVSTREAM_PARSE_FULL
;
932 pes
->stream_type
= stream_type
;
934 av_log(pes
->stream
, AV_LOG_DEBUG
,
935 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
936 st
->index
, pes
->stream_type
, pes
->pid
, (char *)&prog_reg_desc
);
938 st
->codecpar
->codec_tag
= pes
->stream_type
;
940 mpegts_find_stream_type(st
, pes
->stream_type
, ISO_types
);
941 if (pes
->stream_type
== STREAM_TYPE_AUDIO_MPEG2
|| pes
->stream_type
== STREAM_TYPE_AUDIO_AAC
)
942 sti
->request_probe
= 50;
943 if (pes
->stream_type
== STREAM_TYPE_PRIVATE_DATA
)
944 sti
->request_probe
= AVPROBE_SCORE_STREAM_RETRY
;
945 if ((prog_reg_desc
== AV_RL32("HDMV") ||
946 prog_reg_desc
== AV_RL32("HDPR")) &&
947 st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
) {
948 mpegts_find_stream_type(st
, pes
->stream_type
, HDMV_types
);
949 if (pes
->stream_type
== STREAM_TYPE_BLURAY_AUDIO_TRUEHD
) {
950 // HDMV TrueHD streams also contain an AC3 coded version of the
951 // audio track - add a second stream for this
953 // priv_data cannot be shared between streams
954 PESContext
*sub_pes
= av_memdup(pes
, sizeof(*sub_pes
));
956 return AVERROR(ENOMEM
);
958 sub_st
= avformat_new_stream(pes
->stream
, NULL
);
961 return AVERROR(ENOMEM
);
964 sub_st
->id
= pes
->pid
;
965 avpriv_set_pts_info(sub_st
, 33, 1, 90000);
966 sub_st
->priv_data
= sub_pes
;
967 sub_st
->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
968 sub_st
->codecpar
->codec_id
= AV_CODEC_ID_AC3
;
969 ffstream(sub_st
)->need_parsing
= AVSTREAM_PARSE_FULL
;
970 sub_pes
->sub_st
= pes
->sub_st
= sub_st
;
973 if (st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
)
974 mpegts_find_stream_type(st
, pes
->stream_type
, MISC_types
);
975 if (st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
)
976 mpegts_find_stream_type(st
, pes
->stream_type
, HLS_SAMPLE_ENC_types
);
977 if (st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
) {
978 st
->codecpar
->codec_id
= old_codec_id
;
979 st
->codecpar
->codec_type
= old_codec_type
;
981 if ((st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
||
982 (sti
->request_probe
> 0 && sti
->request_probe
< AVPROBE_SCORE_STREAM_RETRY
/ 5)) &&
983 sti
->probe_packets
> 0 &&
984 stream_type
== STREAM_TYPE_PRIVATE_DATA
) {
985 st
->codecpar
->codec_type
= AVMEDIA_TYPE_DATA
;
986 st
->codecpar
->codec_id
= AV_CODEC_ID_BIN_DATA
;
987 sti
->request_probe
= AVPROBE_SCORE_STREAM_RETRY
/ 5;
990 /* queue a context update if properties changed */
991 if (old_codec_type
!= st
->codecpar
->codec_type
||
992 old_codec_id
!= st
->codecpar
->codec_id
||
993 old_codec_tag
!= st
->codecpar
->codec_tag
)
994 sti
->need_context_update
= 1;
999 static void reset_pes_packet_state(PESContext
*pes
)
1001 pes
->pts
= AV_NOPTS_VALUE
;
1002 pes
->dts
= AV_NOPTS_VALUE
;
1003 pes
->data_index
= 0;
1005 av_buffer_unref(&pes
->buffer
);
1008 static void new_data_packet(const uint8_t *buffer
, int len
, AVPacket
*pkt
)
1010 av_packet_unref(pkt
);
1011 pkt
->data
= (uint8_t *)buffer
;
1015 static int new_pes_packet(PESContext
*pes
, AVPacket
*pkt
)
1019 av_packet_unref(pkt
);
1021 pkt
->buf
= pes
->buffer
;
1022 pkt
->data
= pes
->buffer
->data
;
1023 pkt
->size
= pes
->data_index
;
1025 if (pes
->PES_packet_length
&&
1026 pes
->pes_header_size
+ pes
->data_index
!= pes
->PES_packet_length
+
1028 av_log(pes
->stream
, AV_LOG_WARNING
, "PES packet size mismatch\n");
1029 pes
->flags
|= AV_PKT_FLAG_CORRUPT
;
1031 memset(pkt
->data
+ pkt
->size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
1033 // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
1034 if (pes
->sub_st
&& pes
->stream_type
== STREAM_TYPE_BLURAY_AUDIO_TRUEHD
&& pes
->extended_stream_id
== 0x76)
1035 pkt
->stream_index
= pes
->sub_st
->index
;
1037 pkt
->stream_index
= pes
->st
->index
;
1038 pkt
->pts
= pes
->pts
;
1039 pkt
->dts
= pes
->dts
;
1040 /* store position of first TS packet of this PES packet */
1041 pkt
->pos
= pes
->ts_packet_pos
;
1042 pkt
->flags
= pes
->flags
;
1045 reset_pes_packet_state(pes
);
1047 sd
= av_packet_new_side_data(pkt
, AV_PKT_DATA_MPEGTS_STREAM_ID
, 1);
1049 return AVERROR(ENOMEM
);
1050 *sd
= pes
->stream_id
;
1055 static uint64_t get_ts64(GetBitContext
*gb
, int bits
)
1057 if (get_bits_left(gb
) < bits
)
1058 return AV_NOPTS_VALUE
;
1059 return get_bits64(gb
, bits
);
1062 static int read_sl_header(PESContext
*pes
, SLConfigDescr
*sl
,
1063 const uint8_t *buf
, int buf_size
)
1066 int au_start_flag
= 0, au_end_flag
= 0, ocr_flag
= 0, idle_flag
= 0;
1067 int padding_flag
= 0, padding_bits
= 0, inst_bitrate_flag
= 0;
1068 int dts_flag
= -1, cts_flag
= -1;
1069 int64_t dts
= AV_NOPTS_VALUE
, cts
= AV_NOPTS_VALUE
;
1070 uint8_t buf_padded
[128 + AV_INPUT_BUFFER_PADDING_SIZE
];
1071 int buf_padded_size
= FFMIN(buf_size
, sizeof(buf_padded
) - AV_INPUT_BUFFER_PADDING_SIZE
);
1073 memcpy(buf_padded
, buf
, buf_padded_size
);
1075 init_get_bits(&gb
, buf_padded
, buf_padded_size
* 8);
1077 if (sl
->use_au_start
)
1078 au_start_flag
= get_bits1(&gb
);
1080 au_end_flag
= get_bits1(&gb
);
1081 if (!sl
->use_au_start
&& !sl
->use_au_end
)
1082 au_start_flag
= au_end_flag
= 1;
1083 if (sl
->ocr_len
> 0)
1084 ocr_flag
= get_bits1(&gb
);
1086 idle_flag
= get_bits1(&gb
);
1087 if (sl
->use_padding
)
1088 padding_flag
= get_bits1(&gb
);
1090 padding_bits
= get_bits(&gb
, 3);
1092 if (!idle_flag
&& (!padding_flag
|| padding_bits
!= 0)) {
1093 if (sl
->packet_seq_num_len
)
1094 skip_bits_long(&gb
, sl
->packet_seq_num_len
);
1095 if (sl
->degr_prior_len
)
1097 skip_bits(&gb
, sl
->degr_prior_len
);
1099 skip_bits_long(&gb
, sl
->ocr_len
);
1100 if (au_start_flag
) {
1101 if (sl
->use_rand_acc_pt
)
1103 if (sl
->au_seq_num_len
> 0)
1104 skip_bits_long(&gb
, sl
->au_seq_num_len
);
1105 if (sl
->use_timestamps
) {
1106 dts_flag
= get_bits1(&gb
);
1107 cts_flag
= get_bits1(&gb
);
1110 if (sl
->inst_bitrate_len
)
1111 inst_bitrate_flag
= get_bits1(&gb
);
1113 dts
= get_ts64(&gb
, sl
->timestamp_len
);
1115 cts
= get_ts64(&gb
, sl
->timestamp_len
);
1117 skip_bits_long(&gb
, sl
->au_len
);
1118 if (inst_bitrate_flag
)
1119 skip_bits_long(&gb
, sl
->inst_bitrate_len
);
1122 if (dts
!= AV_NOPTS_VALUE
)
1124 if (cts
!= AV_NOPTS_VALUE
)
1127 if (sl
->timestamp_len
&& sl
->timestamp_res
)
1128 avpriv_set_pts_info(pes
->st
, sl
->timestamp_len
, 1, sl
->timestamp_res
);
1130 return (get_bits_count(&gb
) + 7) >> 3;
1133 static AVBufferRef
*buffer_pool_get(MpegTSContext
*ts
, int size
)
1135 int index
= av_log2(size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
1136 if (!ts
->pools
[index
]) {
1137 int pool_size
= FFMIN(ts
->max_packet_size
+ AV_INPUT_BUFFER_PADDING_SIZE
, 2 << index
);
1138 ts
->pools
[index
] = av_buffer_pool_init(pool_size
, NULL
);
1139 if (!ts
->pools
[index
])
1142 return av_buffer_pool_get(ts
->pools
[index
]);
1145 /* return non zero if a packet could be constructed */
1146 static int mpegts_push_data(MpegTSFilter
*filter
,
1147 const uint8_t *buf
, int buf_size
, int is_start
,
1150 PESContext
*pes
= filter
->u
.pes_filter
.opaque
;
1151 MpegTSContext
*ts
= pes
->ts
;
1159 if (pes
->state
== MPEGTS_PAYLOAD
&& pes
->data_index
> 0) {
1160 ret
= new_pes_packet(pes
, ts
->pkt
);
1165 reset_pes_packet_state(pes
);
1167 pes
->state
= MPEGTS_HEADER
;
1168 pes
->ts_packet_pos
= pos
;
1171 while (buf_size
> 0) {
1172 switch (pes
->state
) {
1174 len
= PES_START_SIZE
- pes
->data_index
;
1177 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
1178 pes
->data_index
+= len
;
1181 if (pes
->data_index
== PES_START_SIZE
) {
1182 /* we got all the PES or section header. We can now
1184 if (pes
->header
[0] == 0x00 && pes
->header
[1] == 0x00 &&
1185 pes
->header
[2] == 0x01) {
1186 /* it must be an MPEG-2 PES stream */
1187 pes
->stream_id
= pes
->header
[3];
1188 av_log(pes
->stream
, AV_LOG_TRACE
, "pid=%x stream_id=%#x\n", pes
->pid
, pes
->stream_id
);
1190 if ((pes
->st
&& pes
->st
->discard
== AVDISCARD_ALL
&&
1192 pes
->sub_st
->discard
== AVDISCARD_ALL
)) ||
1193 pes
->stream_id
== STREAM_ID_PADDING_STREAM
)
1196 /* stream not present in PMT */
1198 if (ts
->skip_changes
)
1200 if (ts
->merge_pmt_versions
)
1201 goto skip
; /* wait for PMT to merge new stream */
1203 pes
->st
= avformat_new_stream(ts
->stream
, NULL
);
1205 return AVERROR(ENOMEM
);
1206 pes
->st
->id
= pes
->pid
;
1207 mpegts_set_stream_info(pes
->st
, pes
, 0, 0);
1210 pes
->PES_packet_length
= AV_RB16(pes
->header
+ 4);
1211 /* NOTE: zero length means the PES size is unbounded */
1213 if (pes
->stream_id
!= STREAM_ID_PROGRAM_STREAM_MAP
&&
1214 pes
->stream_id
!= STREAM_ID_PRIVATE_STREAM_2
&&
1215 pes
->stream_id
!= STREAM_ID_ECM_STREAM
&&
1216 pes
->stream_id
!= STREAM_ID_EMM_STREAM
&&
1217 pes
->stream_id
!= STREAM_ID_PROGRAM_STREAM_DIRECTORY
&&
1218 pes
->stream_id
!= STREAM_ID_DSMCC_STREAM
&&
1219 pes
->stream_id
!= STREAM_ID_TYPE_E_STREAM
) {
1220 FFStream
*const pes_sti
= ffstream(pes
->st
);
1221 pes
->state
= MPEGTS_PESHEADER
;
1222 if (pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
&& !pes_sti
->request_probe
) {
1223 av_log(pes
->stream
, AV_LOG_TRACE
,
1224 "pid=%x stream_type=%x probing\n",
1227 pes_sti
->request_probe
= 1;
1230 pes
->pes_header_size
= 6;
1231 pes
->state
= MPEGTS_PAYLOAD
;
1232 pes
->data_index
= 0;
1235 /* otherwise, it should be a table */
1238 pes
->state
= MPEGTS_SKIP
;
1243 /**********************************************/
1244 /* PES packing parsing */
1245 case MPEGTS_PESHEADER
:
1246 len
= PES_HEADER_SIZE
- pes
->data_index
;
1248 return AVERROR_INVALIDDATA
;
1251 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
1252 pes
->data_index
+= len
;
1255 if (pes
->data_index
== PES_HEADER_SIZE
) {
1256 pes
->pes_header_size
= pes
->header
[8] + 9;
1257 pes
->state
= MPEGTS_PESHEADER_FILL
;
1260 case MPEGTS_PESHEADER_FILL
:
1261 len
= pes
->pes_header_size
- pes
->data_index
;
1263 return AVERROR_INVALIDDATA
;
1266 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
1267 pes
->data_index
+= len
;
1270 if (pes
->data_index
== pes
->pes_header_size
) {
1272 unsigned int flags
, pes_ext
, skip
;
1274 flags
= pes
->header
[7];
1275 r
= pes
->header
+ 9;
1276 pes
->pts
= AV_NOPTS_VALUE
;
1277 pes
->dts
= AV_NOPTS_VALUE
;
1278 if ((flags
& 0xc0) == 0x80) {
1279 pes
->dts
= pes
->pts
= ff_parse_pes_pts(r
);
1281 } else if ((flags
& 0xc0) == 0xc0) {
1282 pes
->pts
= ff_parse_pes_pts(r
);
1284 pes
->dts
= ff_parse_pes_pts(r
);
1287 pes
->extended_stream_id
= -1;
1288 if (flags
& 0x01) { /* PES extension */
1290 /* Skip PES private data, program packet sequence counter and P-STD buffer */
1291 skip
= (pes_ext
>> 4) & 0xb;
1294 if ((pes_ext
& 0x41) == 0x01 &&
1295 (r
+ 2) <= (pes
->header
+ pes
->pes_header_size
)) {
1296 /* PES extension 2 */
1297 if ((r
[0] & 0x7f) > 0 && (r
[1] & 0x80) == 0)
1298 pes
->extended_stream_id
= r
[1];
1302 /* we got the full header. We parse it and get the payload */
1303 pes
->state
= MPEGTS_PAYLOAD
;
1304 pes
->data_index
= 0;
1305 if (pes
->stream_type
== STREAM_TYPE_ISO_IEC_14496_PES
&& buf_size
> 0) {
1306 int sl_header_bytes
= read_sl_header(pes
, &pes
->sl
, p
,
1308 pes
->pes_header_size
+= sl_header_bytes
;
1309 p
+= sl_header_bytes
;
1310 buf_size
-= sl_header_bytes
;
1312 if (pes
->stream_type
== STREAM_TYPE_METADATA
&&
1313 pes
->stream_id
== STREAM_ID_METADATA_STREAM
&&
1314 pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_SMPTE_KLV
&&
1316 /* skip metadata access unit header - see MISB ST 1402 */
1317 pes
->pes_header_size
+= 5;
1321 if ( pes
->ts
->fix_teletext_pts
1322 && ( pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_DVB_TELETEXT
1323 || pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_DVB_SUBTITLE
)
1325 AVProgram
*p
= NULL
;
1327 while ((p
= av_find_program_from_stream(pes
->stream
, p
, pes
->st
->index
))) {
1328 if (p
->pcr_pid
!= -1 && p
->discard
!= AVDISCARD_ALL
) {
1329 MpegTSFilter
*f
= pes
->ts
->pids
[p
->pcr_pid
];
1331 AVStream
*st
= NULL
;
1332 if (f
->type
== MPEGTS_PES
) {
1333 PESContext
*pcrpes
= f
->u
.pes_filter
.opaque
;
1336 } else if (f
->type
== MPEGTS_PCR
) {
1338 for (i
= 0; i
< p
->nb_stream_indexes
; i
++) {
1339 AVStream
*pst
= pes
->stream
->streams
[p
->stream_index
[i
]];
1340 if (pst
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
)
1344 if (f
->last_pcr
!= -1 && !f
->discard
) {
1345 // teletext packets do not always have correct timestamps,
1346 // the standard says they should be handled after 40.6 ms at most,
1347 // and the pcr error to this packet should be no more than 100 ms.
1348 // TODO: we should interpolate the PCR, not just use the last one
1349 int64_t pcr
= f
->last_pcr
/ SYSTEM_CLOCK_FREQUENCY_DIVISOR
;
1352 const FFStream
*const sti
= ffstream(st
);
1353 FFStream
*const pes_sti
= ffstream(pes
->st
);
1355 pes_sti
->pts_wrap_reference
= sti
->pts_wrap_reference
;
1356 pes_sti
->pts_wrap_behavior
= sti
->pts_wrap_behavior
;
1358 if (pes
->dts
== AV_NOPTS_VALUE
|| pes
->dts
< pcr
) {
1359 pes
->pts
= pes
->dts
= pcr
;
1360 } else if (pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_DVB_TELETEXT
&&
1361 pes
->dts
> pcr
+ 3654 + 9000) {
1362 pes
->pts
= pes
->dts
= pcr
+ 3654 + 9000;
1363 } else if (pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_DVB_SUBTITLE
&&
1364 pes
->dts
> pcr
+ 10*90000) { //10sec
1365 pes
->pts
= pes
->dts
= pcr
+ 3654 + 9000;
1373 if (pes
->st
->codecpar
->codec_id
== AV_CODEC_ID_DVB_TELETEXT
&&
1375 av_log(pes
->stream
, AV_LOG_VERBOSE
,
1376 "Forcing DTS/PTS to be unset for a "
1377 "non-trustworthy PES packet for PID %d as "
1378 "PCR hasn't been received yet.\n",
1380 pes
->dts
= pes
->pts
= AV_NOPTS_VALUE
;
1385 case MPEGTS_PAYLOAD
:
1387 int max_packet_size
= ts
->max_packet_size
;
1388 if (pes
->PES_packet_length
&& pes
->PES_packet_length
+ PES_START_SIZE
> pes
->pes_header_size
)
1389 max_packet_size
= pes
->PES_packet_length
+ PES_START_SIZE
- pes
->pes_header_size
;
1391 if (pes
->data_index
> 0 &&
1392 pes
->data_index
+ buf_size
> max_packet_size
) {
1393 ret
= new_pes_packet(pes
, ts
->pkt
);
1396 pes
->PES_packet_length
= 0;
1397 max_packet_size
= ts
->max_packet_size
;
1399 } else if (pes
->data_index
== 0 &&
1400 buf_size
> max_packet_size
) {
1401 // pes packet size is < ts size packet and pes data is padded with STUFFING_BYTE
1402 // not sure if this is legal in ts but see issue #2392
1403 buf_size
= max_packet_size
;
1407 pes
->buffer
= buffer_pool_get(ts
, max_packet_size
);
1409 return AVERROR(ENOMEM
);
1412 memcpy(pes
->buffer
->data
+ pes
->data_index
, p
, buf_size
);
1413 pes
->data_index
+= buf_size
;
1414 /* emit complete packets with known packet size
1415 * decreases demuxer delay for infrequent packets like subtitles from
1416 * a couple of seconds to milliseconds for properly muxed files. */
1417 if (!ts
->stop_parse
&& pes
->PES_packet_length
&&
1418 pes
->pes_header_size
+ pes
->data_index
== pes
->PES_packet_length
+ PES_START_SIZE
) {
1420 ret
= new_pes_packet(pes
, ts
->pkt
);
1421 pes
->state
= MPEGTS_SKIP
;
1437 static PESContext
*add_pes_stream(MpegTSContext
*ts
, int pid
, int pcr_pid
)
1442 /* if no pid found, then add a pid context */
1443 pes
= av_mallocz(sizeof(PESContext
));
1447 pes
->stream
= ts
->stream
;
1449 pes
->pcr_pid
= pcr_pid
;
1450 pes
->state
= MPEGTS_SKIP
;
1451 pes
->pts
= AV_NOPTS_VALUE
;
1452 pes
->dts
= AV_NOPTS_VALUE
;
1453 tss
= mpegts_open_pes_filter(ts
, pid
, mpegts_push_data
, pes
);
1462 typedef struct MP4DescrParseContext
{
1466 Mp4Descr
*active_descr
;
1468 int max_descr_count
;
1470 int predefined_SLConfigDescriptor_seen
;
1471 } MP4DescrParseContext
;
1473 static int init_MP4DescrParseContext(MP4DescrParseContext
*d
, AVFormatContext
*s
,
1474 const uint8_t *buf
, unsigned size
,
1475 Mp4Descr
*descr
, int max_descr_count
)
1477 if (size
> (1 << 30))
1478 return AVERROR_INVALIDDATA
;
1480 ffio_init_read_context(&d
->pb
, buf
, size
);
1486 d
->active_descr
= NULL
;
1487 d
->max_descr_count
= max_descr_count
;
1492 static void update_offsets(AVIOContext
*pb
, int64_t *off
, int *len
)
1494 int64_t new_off
= avio_tell(pb
);
1495 (*len
) -= new_off
- *off
;
1499 static int parse_mp4_descr(MP4DescrParseContext
*d
, int64_t off
, int len
,
1502 static int parse_mp4_descr_arr(MP4DescrParseContext
*d
, int64_t off
, int len
)
1505 int ret
= parse_mp4_descr(d
, off
, len
, 0);
1508 update_offsets(&d
->pb
.pub
, &off
, &len
);
1513 static int parse_MP4IODescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1515 AVIOContext
*const pb
= &d
->pb
.pub
;
1516 avio_rb16(pb
); // ID
1522 update_offsets(pb
, &off
, &len
);
1523 return parse_mp4_descr_arr(d
, off
, len
);
1526 static int parse_MP4ODescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1531 id_flags
= avio_rb16(&d
->pb
.pub
);
1532 if (!(id_flags
& 0x0020)) { // URL_Flag
1533 update_offsets(&d
->pb
.pub
, &off
, &len
);
1534 return parse_mp4_descr_arr(d
, off
, len
); // ES_Descriptor[]
1540 static int parse_MP4ESDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1542 AVIOContext
*const pb
= &d
->pb
.pub
;
1546 if (d
->descr_count
>= d
->max_descr_count
)
1547 return AVERROR_INVALIDDATA
;
1548 ff_mp4_parse_es_descr(pb
, &es_id
);
1549 d
->active_descr
= d
->descr
+ (d
->descr_count
++);
1551 d
->active_descr
->es_id
= es_id
;
1552 update_offsets(pb
, &off
, &len
);
1553 if ((ret
= parse_mp4_descr(d
, off
, len
, MP4DecConfigDescrTag
)) < 0)
1555 update_offsets(pb
, &off
, &len
);
1557 ret
= parse_mp4_descr(d
, off
, len
, MP4SLDescrTag
);
1558 d
->active_descr
= NULL
;
1562 static int parse_MP4DecConfigDescrTag(MP4DescrParseContext
*d
, int64_t off
,
1565 Mp4Descr
*descr
= d
->active_descr
;
1567 return AVERROR_INVALIDDATA
;
1568 d
->active_descr
->dec_config_descr
= av_malloc(len
);
1569 if (!descr
->dec_config_descr
)
1570 return AVERROR(ENOMEM
);
1571 descr
->dec_config_descr_len
= len
;
1572 avio_read(&d
->pb
.pub
, descr
->dec_config_descr
, len
);
1576 static int parse_MP4SLDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1578 Mp4Descr
*descr
= d
->active_descr
;
1579 AVIOContext
*const pb
= &d
->pb
.pub
;
1582 return AVERROR_INVALIDDATA
;
1584 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \
1585 descr->sl.dst = avio_r8(pb); \
1586 if (descr->sl.dst > maxv) { \
1587 descr->sl.dst = maxv; \
1588 return AVERROR_INVALIDDATA; \
1592 predefined
= avio_r8(pb
);
1595 int flags
= avio_r8(pb
);
1596 descr
->sl
.use_au_start
= !!(flags
& 0x80);
1597 descr
->sl
.use_au_end
= !!(flags
& 0x40);
1598 descr
->sl
.use_rand_acc_pt
= !!(flags
& 0x20);
1599 descr
->sl
.use_padding
= !!(flags
& 0x08);
1600 descr
->sl
.use_timestamps
= !!(flags
& 0x04);
1601 descr
->sl
.use_idle
= !!(flags
& 0x02);
1602 descr
->sl
.timestamp_res
= avio_rb32(pb
);
1604 R8_CHECK_CLIP_MAX(timestamp_len
, 63);
1605 R8_CHECK_CLIP_MAX(ocr_len
, 63);
1606 R8_CHECK_CLIP_MAX(au_len
, 31);
1607 descr
->sl
.inst_bitrate_len
= avio_r8(pb
);
1608 lengths
= avio_rb16(pb
);
1609 descr
->sl
.degr_prior_len
= lengths
>> 12;
1610 descr
->sl
.au_seq_num_len
= (lengths
>> 7) & 0x1f;
1611 descr
->sl
.packet_seq_num_len
= (lengths
>> 2) & 0x1f;
1612 } else if (!d
->predefined_SLConfigDescriptor_seen
){
1613 avpriv_report_missing_feature(d
->s
, "Predefined SLConfigDescriptor");
1614 d
->predefined_SLConfigDescriptor_seen
= 1;
1619 static int parse_mp4_descr(MP4DescrParseContext
*d
, int64_t off
, int len
,
1623 AVIOContext
*const pb
= &d
->pb
.pub
;
1624 int len1
= ff_mp4_read_descr(d
->s
, pb
, &tag
);
1627 update_offsets(pb
, &off
, &len
);
1628 if (len
< 0 || len1
> len
|| len1
<= 0) {
1629 av_log(d
->s
, AV_LOG_ERROR
,
1630 "Tag %x length violation new length %d bytes remaining %d\n",
1632 return AVERROR_INVALIDDATA
;
1635 if (d
->level
++ >= MAX_LEVEL
) {
1636 av_log(d
->s
, AV_LOG_ERROR
, "Maximum MP4 descriptor level exceeded\n");
1637 ret
= AVERROR_INVALIDDATA
;
1641 if (target_tag
&& tag
!= target_tag
) {
1642 av_log(d
->s
, AV_LOG_ERROR
, "Found tag %x expected %x\n", tag
,
1644 ret
= AVERROR_INVALIDDATA
;
1650 ret
= parse_MP4IODescrTag(d
, off
, len1
);
1653 ret
= parse_MP4ODescrTag(d
, off
, len1
);
1656 ret
= parse_MP4ESDescrTag(d
, off
, len1
);
1658 case MP4DecConfigDescrTag
:
1659 ret
= parse_MP4DecConfigDescrTag(d
, off
, len1
);
1662 ret
= parse_MP4SLDescrTag(d
, off
, len1
);
1669 avio_seek(pb
, off
+ len1
, SEEK_SET
);
1673 static int mp4_read_iods(AVFormatContext
*s
, const uint8_t *buf
, unsigned size
,
1674 Mp4Descr
*descr
, int *descr_count
, int max_descr_count
)
1676 MP4DescrParseContext d
;
1679 d
.predefined_SLConfigDescriptor_seen
= 0;
1681 ret
= init_MP4DescrParseContext(&d
, s
, buf
, size
, descr
, max_descr_count
);
1685 ret
= parse_mp4_descr(&d
, avio_tell(&d
.pb
.pub
), size
, MP4IODescrTag
);
1687 *descr_count
= d
.descr_count
;
1691 static int mp4_read_od(AVFormatContext
*s
, const uint8_t *buf
, unsigned size
,
1692 Mp4Descr
*descr
, int *descr_count
, int max_descr_count
)
1694 MP4DescrParseContext d
;
1697 ret
= init_MP4DescrParseContext(&d
, s
, buf
, size
, descr
, max_descr_count
);
1701 ret
= parse_mp4_descr_arr(&d
, avio_tell(&d
.pb
.pub
), size
);
1703 *descr_count
= d
.descr_count
;
1707 static void m4sl_cb(MpegTSFilter
*filter
, const uint8_t *section
,
1710 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1711 MpegTSSectionFilter
*tssf
= &filter
->u
.section_filter
;
1713 const uint8_t *p
, *p_end
;
1714 int mp4_descr_count
= 0;
1715 Mp4Descr mp4_descr
[MAX_MP4_DESCR_COUNT
] = { { 0 } };
1717 AVFormatContext
*s
= ts
->stream
;
1719 p_end
= section
+ section_len
- 4;
1721 if (parse_section_header(&h
, &p
, p_end
) < 0)
1723 if (h
.tid
!= M4OD_TID
)
1725 if (skip_identical(&h
, tssf
))
1728 mp4_read_od(s
, p
, (unsigned) (p_end
- p
), mp4_descr
, &mp4_descr_count
,
1729 MAX_MP4_DESCR_COUNT
);
1731 for (pid
= 0; pid
< NB_PID_MAX
; pid
++) {
1734 for (i
= 0; i
< mp4_descr_count
; i
++) {
1739 if (ts
->pids
[pid
]->es_id
!= mp4_descr
[i
].es_id
)
1741 if (ts
->pids
[pid
]->type
!= MPEGTS_PES
) {
1742 av_log(s
, AV_LOG_ERROR
, "pid %x is not PES\n", pid
);
1745 pes
= ts
->pids
[pid
]->u
.pes_filter
.opaque
;
1751 pes
->sl
= mp4_descr
[i
].sl
;
1753 ffio_init_read_context(&pb
, mp4_descr
[i
].dec_config_descr
,
1754 mp4_descr
[i
].dec_config_descr_len
);
1755 ff_mp4_read_dec_config_descr(s
, st
, &pb
.pub
);
1756 if (st
->codecpar
->codec_id
== AV_CODEC_ID_AAC
&&
1757 st
->codecpar
->extradata_size
> 0)
1758 sti
->need_parsing
= 0;
1759 if (st
->codecpar
->codec_id
== AV_CODEC_ID_H264
&&
1760 st
->codecpar
->extradata_size
> 0)
1761 sti
->need_parsing
= 0;
1763 st
->codecpar
->codec_type
= avcodec_get_type(st
->codecpar
->codec_id
);
1764 sti
->need_context_update
= 1;
1767 for (i
= 0; i
< mp4_descr_count
; i
++)
1768 av_free(mp4_descr
[i
].dec_config_descr
);
1771 static void scte_data_cb(MpegTSFilter
*filter
, const uint8_t *section
,
1774 AVProgram
*prg
= NULL
;
1775 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1777 int idx
= ff_find_stream_index(ts
->stream
, filter
->pid
);
1782 * In case we receive an SCTE-35 packet before mpegts context is fully
1788 new_data_packet(section
, section_len
, ts
->pkt
);
1789 ts
->pkt
->stream_index
= idx
;
1790 prg
= av_find_program_from_stream(ts
->stream
, NULL
, idx
);
1791 if (prg
&& prg
->pcr_pid
!= -1 && prg
->discard
!= AVDISCARD_ALL
) {
1792 MpegTSFilter
*f
= ts
->pids
[prg
->pcr_pid
];
1793 if (f
&& f
->last_pcr
!= -1)
1794 ts
->pkt
->pts
= ts
->pkt
->dts
= f
->last_pcr
/SYSTEM_CLOCK_FREQUENCY_DIVISOR
;
1800 static const uint8_t opus_coupled_stream_cnt
[9] = {
1801 1, 0, 1, 1, 2, 2, 2, 3, 3
1804 static const uint8_t opus_stream_cnt
[9] = {
1805 1, 1, 1, 2, 2, 3, 4, 4, 5,
1808 static const uint8_t opus_channel_map
[8][8] = {
1816 { 0,6,1,2,3,4,5,7 },
1819 int ff_parse_mpeg2_descriptor(AVFormatContext
*fc
, AVStream
*st
, int stream_type
,
1820 const uint8_t **pp
, const uint8_t *desc_list_end
,
1821 Mp4Descr
*mp4_descr
, int mp4_descr_count
, int pid
,
1824 FFStream
*const sti
= ffstream(st
);
1825 const uint8_t *desc_end
;
1826 int desc_len
, desc_tag
, desc_es_id
, ext_desc_tag
, channels
, channel_config_code
;
1830 desc_tag
= get8(pp
, desc_list_end
);
1832 return AVERROR_INVALIDDATA
;
1833 desc_len
= get8(pp
, desc_list_end
);
1835 return AVERROR_INVALIDDATA
;
1836 desc_end
= *pp
+ desc_len
;
1837 if (desc_end
> desc_list_end
)
1838 return AVERROR_INVALIDDATA
;
1840 av_log(fc
, AV_LOG_TRACE
, "tag: 0x%02x len=%d\n", desc_tag
, desc_len
);
1842 if ((st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
|| sti
->request_probe
> 0) &&
1843 stream_type
== STREAM_TYPE_PRIVATE_DATA
)
1844 mpegts_find_stream_type(st
, desc_tag
, DESC_types
);
1847 case VIDEO_STREAM_DESCRIPTOR
:
1848 if (get8(pp
, desc_end
) & 0x1) {
1849 st
->disposition
|= AV_DISPOSITION_STILL_IMAGE
;
1853 desc_es_id
= get16(pp
, desc_end
);
1856 if (ts
&& ts
->pids
[pid
])
1857 ts
->pids
[pid
]->es_id
= desc_es_id
;
1858 for (i
= 0; i
< mp4_descr_count
; i
++)
1859 if (mp4_descr
[i
].dec_config_descr_len
&&
1860 mp4_descr
[i
].es_id
== desc_es_id
) {
1862 ffio_init_read_context(&pb
, mp4_descr
[i
].dec_config_descr
,
1863 mp4_descr
[i
].dec_config_descr_len
);
1864 ff_mp4_read_dec_config_descr(fc
, st
, &pb
.pub
);
1865 if (st
->codecpar
->codec_id
== AV_CODEC_ID_AAC
&&
1866 st
->codecpar
->extradata_size
> 0) {
1867 sti
->need_parsing
= 0;
1868 sti
->need_context_update
= 1;
1870 if (st
->codecpar
->codec_id
== AV_CODEC_ID_MPEG4SYSTEMS
)
1871 mpegts_open_section_filter(ts
, pid
, m4sl_cb
, ts
, 1);
1874 case FMC_DESCRIPTOR
:
1875 if (get16(pp
, desc_end
) < 0)
1877 if (mp4_descr_count
> 0 &&
1878 (st
->codecpar
->codec_id
== AV_CODEC_ID_AAC_LATM
||
1879 (sti
->request_probe
== 0 && st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
) ||
1880 sti
->request_probe
> 0) &&
1881 mp4_descr
->dec_config_descr_len
&& mp4_descr
->es_id
== pid
) {
1883 ffio_init_read_context(&pb
, mp4_descr
->dec_config_descr
,
1884 mp4_descr
->dec_config_descr_len
);
1885 ff_mp4_read_dec_config_descr(fc
, st
, &pb
.pub
);
1886 if (st
->codecpar
->codec_id
== AV_CODEC_ID_AAC
&&
1887 st
->codecpar
->extradata_size
> 0) {
1888 sti
->request_probe
= sti
->need_parsing
= 0;
1889 st
->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
1890 sti
->need_context_update
= 1;
1894 case TELETEXT_DESCRIPTOR
:
1896 uint8_t *extradata
= NULL
;
1897 int language_count
= desc_len
/ 5, ret
;
1899 if (desc_len
> 0 && desc_len
% 5 != 0)
1900 return AVERROR_INVALIDDATA
;
1902 if (language_count
> 0) {
1903 /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1904 av_assert0(language_count
<= sizeof(language
) / 4);
1906 if (st
->codecpar
->extradata
== NULL
) {
1907 ret
= ff_alloc_extradata(st
->codecpar
, language_count
* 2);
1912 if (st
->codecpar
->extradata_size
< language_count
* 2)
1913 return AVERROR_INVALIDDATA
;
1915 extradata
= st
->codecpar
->extradata
;
1917 for (i
= 0; i
< language_count
; i
++) {
1918 language
[i
* 4 + 0] = get8(pp
, desc_end
);
1919 language
[i
* 4 + 1] = get8(pp
, desc_end
);
1920 language
[i
* 4 + 2] = get8(pp
, desc_end
);
1921 language
[i
* 4 + 3] = ',';
1923 memcpy(extradata
, *pp
, 2);
1929 language
[i
* 4 - 1] = 0;
1930 av_dict_set(&st
->metadata
, "language", language
, 0);
1931 sti
->need_context_update
= 1;
1935 case SUBTITLING_DESCRIPTOR
:
1937 /* 8 bytes per DVB subtitle substream data:
1938 * ISO_639_language_code (3 bytes),
1939 * subtitling_type (1 byte),
1940 * composition_page_id (2 bytes),
1941 * ancillary_page_id (2 bytes) */
1942 int language_count
= desc_len
/ 8, ret
;
1944 if (desc_len
> 0 && desc_len
% 8 != 0)
1945 return AVERROR_INVALIDDATA
;
1947 if (language_count
> 1) {
1948 avpriv_request_sample(fc
, "DVB subtitles with multiple languages");
1951 if (language_count
> 0) {
1954 /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1955 av_assert0(language_count
<= sizeof(language
) / 4);
1957 if (st
->codecpar
->extradata
== NULL
) {
1958 ret
= ff_alloc_extradata(st
->codecpar
, language_count
* 5);
1963 if (st
->codecpar
->extradata_size
< language_count
* 5)
1964 return AVERROR_INVALIDDATA
;
1966 extradata
= st
->codecpar
->extradata
;
1968 for (i
= 0; i
< language_count
; i
++) {
1969 language
[i
* 4 + 0] = get8(pp
, desc_end
);
1970 language
[i
* 4 + 1] = get8(pp
, desc_end
);
1971 language
[i
* 4 + 2] = get8(pp
, desc_end
);
1972 language
[i
* 4 + 3] = ',';
1974 /* hearing impaired subtitles detection using subtitling_type */
1976 case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1977 case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1978 case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1979 case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1980 case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1981 case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1982 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
1986 extradata
[4] = get8(pp
, desc_end
); /* subtitling_type */
1987 memcpy(extradata
, *pp
, 4); /* composition_page_id and ancillary_page_id */
1993 language
[i
* 4 - 1] = 0;
1994 av_dict_set(&st
->metadata
, "language", language
, 0);
1995 sti
->need_context_update
= 1;
1999 case ISO_639_LANGUAGE_DESCRIPTOR
:
2000 for (i
= 0; i
+ 4 <= desc_len
; i
+= 4) {
2001 language
[i
+ 0] = get8(pp
, desc_end
);
2002 language
[i
+ 1] = get8(pp
, desc_end
);
2003 language
[i
+ 2] = get8(pp
, desc_end
);
2004 language
[i
+ 3] = ',';
2005 switch (get8(pp
, desc_end
)) {
2007 st
->disposition
|= AV_DISPOSITION_CLEAN_EFFECTS
;
2010 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
2013 st
->disposition
|= AV_DISPOSITION_VISUAL_IMPAIRED
;
2014 st
->disposition
|= AV_DISPOSITION_DESCRIPTIONS
;
2018 if (i
&& language
[0]) {
2019 language
[i
- 1] = 0;
2020 /* don't overwrite language, as it may already have been set by
2021 * another, more specific descriptor (e.g. supplementary audio) */
2022 av_dict_set(&st
->metadata
, "language", language
, AV_DICT_DONT_OVERWRITE
);
2025 case REGISTRATION_DESCRIPTOR
:
2026 st
->codecpar
->codec_tag
= bytestream_get_le32(pp
);
2027 av_log(fc
, AV_LOG_TRACE
, "reg_desc=%.4s\n", (char *)&st
->codecpar
->codec_tag
);
2028 if (st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
|| sti
->request_probe
> 0) {
2029 mpegts_find_stream_type(st
, st
->codecpar
->codec_tag
, REGD_types
);
2030 if (st
->codecpar
->codec_tag
== MKTAG('B', 'S', 'S', 'D'))
2031 sti
->request_probe
= 50;
2034 case STREAM_IDENTIFIER_DESCRIPTOR
:
2035 sti
->stream_identifier
= 1 + get8(pp
, desc_end
);
2037 case METADATA_DESCRIPTOR
:
2038 if (get16(pp
, desc_end
) == 0xFFFF)
2040 if (get8(pp
, desc_end
) == 0xFF) {
2041 st
->codecpar
->codec_tag
= bytestream_get_le32(pp
);
2042 if (st
->codecpar
->codec_id
== AV_CODEC_ID_NONE
)
2043 mpegts_find_stream_type(st
, st
->codecpar
->codec_tag
, METADATA_types
);
2046 case EXTENSION_DESCRIPTOR
: /* DVB extension descriptor */
2047 ext_desc_tag
= get8(pp
, desc_end
);
2048 if (ext_desc_tag
< 0)
2049 return AVERROR_INVALIDDATA
;
2050 if (st
->codecpar
->codec_id
== AV_CODEC_ID_OPUS
&&
2051 ext_desc_tag
== 0x80) { /* User defined (provisional Opus) */
2052 if (!st
->codecpar
->extradata
) {
2053 st
->codecpar
->extradata
= av_mallocz(sizeof(opus_default_extradata
) +
2054 AV_INPUT_BUFFER_PADDING_SIZE
);
2055 if (!st
->codecpar
->extradata
)
2056 return AVERROR(ENOMEM
);
2058 st
->codecpar
->extradata_size
= sizeof(opus_default_extradata
);
2059 memcpy(st
->codecpar
->extradata
, opus_default_extradata
, sizeof(opus_default_extradata
));
2061 channel_config_code
= get8(pp
, desc_end
);
2062 if (channel_config_code
< 0)
2063 return AVERROR_INVALIDDATA
;
2064 if (channel_config_code
<= 0x8) {
2065 st
->codecpar
->extradata
[9] = channels
= channel_config_code
? channel_config_code
: 2;
2066 AV_WL32(&st
->codecpar
->extradata
[12], 48000);
2067 st
->codecpar
->extradata
[18] = channel_config_code
? (channels
> 2) : /* Dual Mono */ 255;
2068 st
->codecpar
->extradata
[19] = opus_stream_cnt
[channel_config_code
];
2069 st
->codecpar
->extradata
[20] = opus_coupled_stream_cnt
[channel_config_code
];
2070 memcpy(&st
->codecpar
->extradata
[21], opus_channel_map
[channels
- 1], channels
);
2071 st
->codecpar
->extradata_size
= st
->codecpar
->extradata
[18] ? 21 + channels
: 19;
2073 avpriv_request_sample(fc
, "Opus in MPEG-TS - channel_config_code > 0x8");
2075 sti
->need_parsing
= AVSTREAM_PARSE_FULL
;
2076 sti
->need_context_update
= 1;
2079 if (ext_desc_tag
== SUPPLEMENTARY_AUDIO_DESCRIPTOR
) {
2083 return AVERROR_INVALIDDATA
;
2084 flags
= get8(pp
, desc_end
);
2086 if ((flags
& 0x80) == 0) /* mix_type */
2087 st
->disposition
|= AV_DISPOSITION_DEPENDENT
;
2089 switch ((flags
>> 2) & 0x1F) { /* editorial_classification */
2091 st
->disposition
|= AV_DISPOSITION_VISUAL_IMPAIRED
;
2092 st
->disposition
|= AV_DISPOSITION_DESCRIPTIONS
;
2095 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
2098 st
->disposition
|= AV_DISPOSITION_VISUAL_IMPAIRED
;
2102 if (flags
& 0x01) { /* language_code_present */
2104 return AVERROR_INVALIDDATA
;
2105 language
[0] = get8(pp
, desc_end
);
2106 language
[1] = get8(pp
, desc_end
);
2107 language
[2] = get8(pp
, desc_end
);
2110 /* This language always has to override a possible
2111 * ISO 639 language descriptor language */
2113 av_dict_set(&st
->metadata
, "language", language
, 0);
2117 case AC3_DESCRIPTOR
:
2119 int component_type_flag
= get8(pp
, desc_end
) & (1 << 7);
2120 if (component_type_flag
) {
2121 int component_type
= get8(pp
, desc_end
);
2122 int service_type_mask
= 0x38; // 0b00111000
2123 int service_type
= ((component_type
& service_type_mask
) >> 3);
2124 if (service_type
== 0x02 /* 0b010 */) {
2125 st
->disposition
|= AV_DISPOSITION_DESCRIPTIONS
;
2126 av_log(ts
? ts
->stream
: fc
, AV_LOG_DEBUG
, "New track disposition for id %u: %u\n", st
->id
, st
->disposition
);
2131 case ENHANCED_AC3_DESCRIPTOR
:
2133 int component_type_flag
= get8(pp
, desc_end
) & (1 << 7);
2134 if (component_type_flag
) {
2135 int component_type
= get8(pp
, desc_end
);
2136 int service_type_mask
= 0x38; // 0b00111000
2137 int service_type
= ((component_type
& service_type_mask
) >> 3);
2138 if (service_type
== 0x02 /* 0b010 */) {
2139 st
->disposition
|= AV_DISPOSITION_DESCRIPTIONS
;
2140 av_log(ts
? ts
->stream
: fc
, AV_LOG_DEBUG
, "New track disposition for id %u: %u\n", st
->id
, st
->disposition
);
2145 case DATA_COMPONENT_DESCRIPTOR
:
2146 // STD-B24, fascicle 3, chapter 4 defines private_stream_1
2148 if (stream_type
== STREAM_TYPE_PRIVATE_DATA
) {
2149 // This structure is defined in STD-B10, part 1, listing 5.4 and
2151 // Listing of data_component_ids is in STD-B10, part 2, Annex J.
2152 // Component tag limits are documented in TR-B14, fascicle 2,
2153 // Vol. 3, Section 2, 4.2.8.1
2154 int actual_component_tag
= sti
->stream_identifier
- 1;
2155 int picked_profile
= AV_PROFILE_UNKNOWN
;
2156 int data_component_id
= get16(pp
, desc_end
);
2157 if (data_component_id
< 0)
2158 return AVERROR_INVALIDDATA
;
2160 switch (data_component_id
) {
2162 // [0x30..0x37] are component tags utilized for
2163 // non-mobile captioning service ("profile A").
2164 if (actual_component_tag
>= 0x30 &&
2165 actual_component_tag
<= 0x37) {
2166 picked_profile
= AV_PROFILE_ARIB_PROFILE_A
;
2170 // component tag 0x87 signifies a mobile/partial reception
2171 // (1seg) captioning service ("profile C").
2172 if (actual_component_tag
== 0x87) {
2173 picked_profile
= AV_PROFILE_ARIB_PROFILE_C
;
2180 if (picked_profile
== AV_PROFILE_UNKNOWN
)
2183 st
->codecpar
->codec_type
= AVMEDIA_TYPE_SUBTITLE
;
2184 st
->codecpar
->codec_id
= AV_CODEC_ID_ARIB_CAPTION
;
2185 if (st
->codecpar
->profile
!= picked_profile
) {
2186 st
->codecpar
->profile
= picked_profile
;
2187 sti
->need_context_update
= 1;
2189 sti
->request_probe
= 0;
2190 sti
->need_parsing
= 0;
2193 case DOVI_VIDEO_STREAM_DESCRIPTOR
:
2196 AVDOVIDecoderConfigurationRecord
*dovi
;
2198 int dependency_pid
= -1; // Unset
2200 if (desc_end
- *pp
< 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
2201 return AVERROR_INVALIDDATA
;
2203 dovi
= av_dovi_alloc(&dovi_size
);
2205 return AVERROR(ENOMEM
);
2207 dovi
->dv_version_major
= get8(pp
, desc_end
);
2208 dovi
->dv_version_minor
= get8(pp
, desc_end
);
2209 buf
= get16(pp
, desc_end
);
2210 dovi
->dv_profile
= (buf
>> 9) & 0x7f; // 7 bits
2211 dovi
->dv_level
= (buf
>> 3) & 0x3f; // 6 bits
2212 dovi
->rpu_present_flag
= (buf
>> 2) & 0x01; // 1 bit
2213 dovi
->el_present_flag
= (buf
>> 1) & 0x01; // 1 bit
2214 dovi
->bl_present_flag
= buf
& 0x01; // 1 bit
2215 if (!dovi
->bl_present_flag
&& desc_end
- *pp
>= 2) {
2216 buf
= get16(pp
, desc_end
);
2217 dependency_pid
= buf
>> 3; // 13 bits
2219 if (desc_end
- *pp
>= 1) { // 8 bits
2220 buf
= get8(pp
, desc_end
);
2221 dovi
->dv_bl_signal_compatibility_id
= (buf
>> 4) & 0x0f; // 4 bits
2222 dovi
->dv_md_compression
= (buf
>> 2) & 0x03; // 2 bits
2224 // 0 stands for None
2225 // Dolby Vision V1.2.93 profiles and levels
2226 dovi
->dv_bl_signal_compatibility_id
= 0;
2227 dovi
->dv_md_compression
= AV_DOVI_COMPRESSION_NONE
;
2230 if (!av_packet_side_data_add(&st
->codecpar
->coded_side_data
,
2231 &st
->codecpar
->nb_coded_side_data
,
2232 AV_PKT_DATA_DOVI_CONF
,
2233 (uint8_t *)dovi
, dovi_size
, 0)) {
2235 return AVERROR(ENOMEM
);
2238 av_log(fc
, AV_LOG_TRACE
, "DOVI, version: %d.%d, profile: %d, level: %d, "
2239 "rpu flag: %d, el flag: %d, bl flag: %d, dependency_pid: %d, "
2240 "compatibility id: %d, compression: %d\n",
2241 dovi
->dv_version_major
, dovi
->dv_version_minor
,
2242 dovi
->dv_profile
, dovi
->dv_level
,
2243 dovi
->rpu_present_flag
,
2244 dovi
->el_present_flag
,
2245 dovi
->bl_present_flag
,
2247 dovi
->dv_bl_signal_compatibility_id
,
2248 dovi
->dv_md_compression
);
2258 static AVStream
*find_matching_stream(MpegTSContext
*ts
, int pid
, unsigned int programid
,
2259 int stream_identifier
, int pmt_stream_idx
, struct Program
*p
)
2261 AVFormatContext
*s
= ts
->stream
;
2262 AVStream
*found
= NULL
;
2264 if (stream_identifier
) { /* match based on "stream identifier descriptor" if present */
2265 for (int i
= 0; i
< p
->nb_streams
; i
++) {
2266 if (p
->streams
[i
].stream_identifier
== stream_identifier
)
2267 if (!found
|| pmt_stream_idx
== i
) /* fallback to idx based guess if multiple streams have the same identifier */
2268 found
= s
->streams
[p
->streams
[i
].idx
];
2270 } else if (pmt_stream_idx
< p
->nb_streams
) { /* match based on position within the PMT */
2271 found
= s
->streams
[p
->streams
[pmt_stream_idx
].idx
];
2275 av_log(ts
->stream
, AV_LOG_VERBOSE
,
2276 "reusing existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2277 av_get_media_type_string(found
->codecpar
->codec_type
),
2278 found
->index
, found
->id
, pid
);
2284 static int parse_stream_identifier_desc(const uint8_t *p
, const uint8_t *p_end
)
2286 const uint8_t **pp
= &p
;
2287 const uint8_t *desc_list_end
;
2288 const uint8_t *desc_end
;
2290 int desc_len
, desc_tag
;
2292 desc_list_len
= get16(pp
, p_end
);
2293 if (desc_list_len
< 0)
2295 desc_list_len
&= 0xfff;
2296 desc_list_end
= p
+ desc_list_len
;
2297 if (desc_list_end
> p_end
)
2301 desc_tag
= get8(pp
, desc_list_end
);
2304 desc_len
= get8(pp
, desc_list_end
);
2307 desc_end
= *pp
+ desc_len
;
2308 if (desc_end
> desc_list_end
)
2311 if (desc_tag
== STREAM_IDENTIFIER_DESCRIPTOR
) {
2312 return get8(pp
, desc_end
);
2320 static int is_pes_stream(int stream_type
, uint32_t prog_reg_desc
)
2322 switch (stream_type
) {
2323 case STREAM_TYPE_PRIVATE_SECTION
:
2324 case STREAM_TYPE_ISO_IEC_14496_SECTION
:
2326 case STREAM_TYPE_SCTE_DATA_SCTE_35
:
2327 /* This User Private stream_type value is used by multiple organizations
2328 for different things. ANSI/SCTE 35 splice_info_section() is a
2329 private_section() not a PES_packet(). */
2330 return !(prog_reg_desc
== AV_RL32("CUEI"));
2336 static void pmt_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
2338 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
2339 MpegTSSectionFilter
*tssf
= &filter
->u
.section_filter
;
2340 struct Program old_program
;
2341 SectionHeader h1
, *h
= &h1
;
2344 const uint8_t *p
, *p_end
, *desc_list_end
;
2345 int program_info_length
, pcr_pid
, pid
, stream_type
;
2347 uint32_t prog_reg_desc
= 0; /* registration descriptor */
2348 int stream_identifier
= -1;
2349 struct Program
*prg
;
2351 int mp4_descr_count
= 0;
2352 Mp4Descr mp4_descr
[MAX_MP4_DESCR_COUNT
] = { { 0 } };
2355 av_log(ts
->stream
, AV_LOG_TRACE
, "PMT: len %i\n", section_len
);
2356 hex_dump_debug(ts
->stream
, section
, section_len
);
2358 p_end
= section
+ section_len
- 4;
2360 if (parse_section_header(h
, &p
, p_end
) < 0)
2362 if (h
->tid
!= PMT_TID
)
2364 if (!h
->current_next
)
2366 if (skip_identical(h
, tssf
))
2369 av_log(ts
->stream
, AV_LOG_TRACE
, "sid=0x%x sec_num=%d/%d version=%d tid=%d\n",
2370 h
->id
, h
->sec_num
, h
->last_sec_num
, h
->version
, h
->tid
);
2372 if (!ts
->scan_all_pmts
&& ts
->skip_changes
)
2375 prg
= get_program(ts
, h
->id
);
2379 clear_program(&old_program
);
2381 if (ts
->skip_unknown_pmt
&& !prg
)
2383 if (prg
&& prg
->nb_pids
&& prg
->pids
[0] != ts
->current_pid
)
2385 if (!ts
->skip_clear
)
2386 clear_avprogram(ts
, h
->id
);
2388 add_pid_to_program(prg
, ts
->current_pid
);
2390 pcr_pid
= get16(&p
, p_end
);
2394 add_pid_to_program(prg
, pcr_pid
);
2395 update_av_program_info(ts
->stream
, h
->id
, pcr_pid
, h
->version
);
2397 av_log(ts
->stream
, AV_LOG_TRACE
, "pcr_pid=0x%x\n", pcr_pid
);
2399 program_info_length
= get16(&p
, p_end
);
2400 if (program_info_length
< 0)
2402 program_info_length
&= 0xfff;
2403 while (program_info_length
>= 2) {
2405 tag
= get8(&p
, p_end
);
2406 len
= get8(&p
, p_end
);
2408 av_log(ts
->stream
, AV_LOG_TRACE
, "program tag: 0x%02x len=%d\n", tag
, len
);
2410 program_info_length
-= 2;
2411 if (len
> program_info_length
)
2412 // something else is broken, exit the program_descriptors_loop
2414 program_info_length
-= len
;
2415 if (tag
== IOD_DESCRIPTOR
) {
2416 get8(&p
, p_end
); // scope
2417 get8(&p
, p_end
); // label
2419 mp4_read_iods(ts
->stream
, p
, len
, mp4_descr
+ mp4_descr_count
,
2420 &mp4_descr_count
, MAX_MP4_DESCR_COUNT
);
2421 } else if (tag
== REGISTRATION_DESCRIPTOR
&& len
>= 4) {
2422 prog_reg_desc
= bytestream_get_le32(&p
);
2427 p
+= program_info_length
;
2431 // stop parsing after pmt, we found header
2438 for (i
= 0; i
< MAX_STREAMS_PER_PROGRAM
; i
++) {
2441 stream_type
= get8(&p
, p_end
);
2442 if (stream_type
< 0)
2444 pid
= get16(&p
, p_end
);
2448 if (pid
== ts
->current_pid
)
2451 stream_identifier
= parse_stream_identifier_desc(p
, p_end
) + 1;
2453 /* now create stream */
2454 if (ts
->pids
[pid
] && ts
->pids
[pid
]->type
== MPEGTS_PES
) {
2455 pes
= ts
->pids
[pid
]->u
.pes_filter
.opaque
;
2456 if (ts
->merge_pmt_versions
&& !pes
->st
) {
2457 st
= find_matching_stream(ts
, pid
, h
->id
, stream_identifier
, i
, &old_program
);
2460 pes
->stream_type
= stream_type
;
2465 pes
->st
= avformat_new_stream(pes
->stream
, NULL
);
2468 pes
->st
->id
= pes
->pid
;
2471 } else if (is_pes_stream(stream_type
, prog_reg_desc
)) {
2473 mpegts_close_filter(ts
, ts
->pids
[pid
]); // wrongly added sdt filter probably
2474 pes
= add_pes_stream(ts
, pid
, pcr_pid
);
2475 if (ts
->merge_pmt_versions
&& pes
&& !pes
->st
) {
2476 st
= find_matching_stream(ts
, pid
, h
->id
, stream_identifier
, i
, &old_program
);
2479 pes
->stream_type
= stream_type
;
2483 if (pes
&& !pes
->st
) {
2484 st
= avformat_new_stream(pes
->stream
, NULL
);
2490 int idx
= ff_find_stream_index(ts
->stream
, pid
);
2492 st
= ts
->stream
->streams
[idx
];
2494 if (ts
->merge_pmt_versions
&& !st
) {
2495 st
= find_matching_stream(ts
, pid
, h
->id
, stream_identifier
, i
, &old_program
);
2498 st
= avformat_new_stream(ts
->stream
, NULL
);
2502 st
->codecpar
->codec_type
= AVMEDIA_TYPE_DATA
;
2503 if (stream_type
== STREAM_TYPE_SCTE_DATA_SCTE_35
&& prog_reg_desc
== AV_RL32("CUEI")) {
2504 mpegts_find_stream_type(st
, stream_type
, SCTE_types
);
2505 mpegts_open_section_filter(ts
, pid
, scte_data_cb
, ts
, 1);
2513 if (pes
&& pes
->stream_type
!= stream_type
)
2514 mpegts_set_stream_info(st
, pes
, stream_type
, prog_reg_desc
);
2516 add_pid_to_program(prg
, pid
);
2518 prg
->streams
[i
].idx
= st
->index
;
2519 prg
->streams
[i
].stream_identifier
= stream_identifier
;
2523 av_program_add_stream_index(ts
->stream
, h
->id
, st
->index
);
2525 desc_list_len
= get16(&p
, p_end
);
2526 if (desc_list_len
< 0)
2528 desc_list_len
&= 0xfff;
2529 desc_list_end
= p
+ desc_list_len
;
2530 if (desc_list_end
> p_end
)
2533 if (ff_parse_mpeg2_descriptor(ts
->stream
, st
, stream_type
, &p
,
2534 desc_list_end
, mp4_descr
,
2535 mp4_descr_count
, pid
, ts
) < 0)
2538 if (pes
&& prog_reg_desc
== AV_RL32("HDMV") &&
2539 stream_type
== STREAM_TYPE_BLURAY_AUDIO_TRUEHD
&& pes
->sub_st
) {
2540 av_program_add_stream_index(ts
->stream
, h
->id
,
2541 pes
->sub_st
->index
);
2542 pes
->sub_st
->codecpar
->codec_tag
= st
->codecpar
->codec_tag
;
2548 if (!ts
->pids
[pcr_pid
])
2549 mpegts_open_pcr_filter(ts
, pcr_pid
);
2552 for (i
= 0; i
< mp4_descr_count
; i
++)
2553 av_free(mp4_descr
[i
].dec_config_descr
);
2556 static void pat_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
2558 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
2559 MpegTSSectionFilter
*tssf
= &filter
->u
.section_filter
;
2560 SectionHeader h1
, *h
= &h1
;
2561 const uint8_t *p
, *p_end
;
2566 av_log(ts
->stream
, AV_LOG_TRACE
, "PAT:\n");
2567 hex_dump_debug(ts
->stream
, section
, section_len
);
2569 p_end
= section
+ section_len
- 4;
2571 if (parse_section_header(h
, &p
, p_end
) < 0)
2573 if (h
->tid
!= PAT_TID
)
2575 if (!h
->current_next
)
2577 if (ts
->skip_changes
)
2580 if (skip_identical(h
, tssf
))
2585 sid
= get16(&p
, p_end
);
2588 pmt_pid
= get16(&p
, p_end
);
2593 if (pmt_pid
== ts
->current_pid
)
2596 av_log(ts
->stream
, AV_LOG_TRACE
, "sid=0x%x pid=0x%x\n", sid
, pmt_pid
);
2598 if (sid
== 0x0000) {
2601 MpegTSFilter
*fil
= ts
->pids
[pmt_pid
];
2602 struct Program
*prg
;
2603 program
= av_new_program(ts
->stream
, sid
);
2605 program
->program_num
= sid
;
2606 program
->pmt_pid
= pmt_pid
;
2609 if ( fil
->type
!= MPEGTS_SECTION
2610 || fil
->pid
!= pmt_pid
2611 || fil
->u
.section_filter
.section_cb
!= pmt_cb
)
2612 mpegts_close_filter(ts
, ts
->pids
[pmt_pid
]);
2614 if (!ts
->pids
[pmt_pid
])
2615 mpegts_open_section_filter(ts
, pmt_pid
, pmt_cb
, ts
, 1);
2616 prg
= add_program(ts
, sid
);
2618 unsigned prg_idx
= prg
- ts
->prg
;
2619 if (prg
->nb_pids
&& prg
->pids
[0] != pmt_pid
)
2621 add_pid_to_program(prg
, pmt_pid
);
2622 if (prg_idx
> nb_prg
)
2623 FFSWAP(struct Program
, ts
->prg
[nb_prg
], ts
->prg
[prg_idx
]);
2624 if (prg_idx
>= nb_prg
)
2630 ts
->nb_prg
= nb_prg
;
2634 for (j
=0; j
<ts
->stream
->nb_programs
; j
++) {
2635 for (i
= 0; i
< ts
->nb_prg
; i
++)
2636 if (ts
->prg
[i
].id
== ts
->stream
->programs
[j
]->id
)
2638 if (i
==ts
->nb_prg
&& !ts
->skip_clear
)
2639 clear_avprogram(ts
, ts
->stream
->programs
[j
]->id
);
2644 static void eit_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
2646 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
2647 const uint8_t *p
, *p_end
;
2648 SectionHeader h1
, *h
= &h1
;
2651 * Sometimes we receive EPG packets but SDT table do not have
2652 * eit_pres_following or eit_sched turned on, so we open EPG
2653 * stream directly here.
2655 if (!ts
->epg_stream
) {
2656 ts
->epg_stream
= avformat_new_stream(ts
->stream
, NULL
);
2657 if (!ts
->epg_stream
)
2659 ts
->epg_stream
->id
= EIT_PID
;
2660 ts
->epg_stream
->codecpar
->codec_type
= AVMEDIA_TYPE_DATA
;
2661 ts
->epg_stream
->codecpar
->codec_id
= AV_CODEC_ID_EPG
;
2664 if (ts
->epg_stream
->discard
== AVDISCARD_ALL
)
2667 p_end
= section
+ section_len
- 4;
2670 if (parse_section_header(h
, &p
, p_end
) < 0)
2672 if (h
->tid
< EIT_TID
|| h
->tid
> OEITS_END_TID
)
2675 av_log(ts
->stream
, AV_LOG_TRACE
, "EIT: tid received = %.02x\n", h
->tid
);
2678 * Service_id 0xFFFF is reserved, it indicates that the current EIT table
2681 if (h
->id
== 0xFFFF) {
2682 av_log(ts
->stream
, AV_LOG_TRACE
, "Scrambled EIT table received.\n");
2687 * In case we receive an EPG packet before mpegts context is fully
2693 new_data_packet(section
, section_len
, ts
->pkt
);
2694 ts
->pkt
->stream_index
= ts
->epg_stream
->index
;
2698 static void sdt_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
2700 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
2701 MpegTSSectionFilter
*tssf
= &filter
->u
.section_filter
;
2702 SectionHeader h1
, *h
= &h1
;
2703 const uint8_t *p
, *p_end
, *desc_list_end
, *desc_end
;
2704 int onid
, val
, sid
, desc_list_len
, desc_tag
, desc_len
, service_type
;
2705 char *name
, *provider_name
;
2707 av_log(ts
->stream
, AV_LOG_TRACE
, "SDT:\n");
2708 hex_dump_debug(ts
->stream
, section
, section_len
);
2710 p_end
= section
+ section_len
- 4;
2712 if (parse_section_header(h
, &p
, p_end
) < 0)
2714 if (h
->tid
!= SDT_TID
)
2716 if (!h
->current_next
)
2718 if (ts
->skip_changes
)
2720 if (skip_identical(h
, tssf
))
2723 onid
= get16(&p
, p_end
);
2726 val
= get8(&p
, p_end
);
2730 sid
= get16(&p
, p_end
);
2733 val
= get8(&p
, p_end
);
2736 desc_list_len
= get16(&p
, p_end
);
2737 if (desc_list_len
< 0)
2739 desc_list_len
&= 0xfff;
2740 desc_list_end
= p
+ desc_list_len
;
2741 if (desc_list_end
> p_end
)
2744 desc_tag
= get8(&p
, desc_list_end
);
2747 desc_len
= get8(&p
, desc_list_end
);
2748 desc_end
= p
+ desc_len
;
2749 if (desc_len
< 0 || desc_end
> desc_list_end
)
2752 av_log(ts
->stream
, AV_LOG_TRACE
, "tag: 0x%02x len=%d\n",
2753 desc_tag
, desc_len
);
2756 case SERVICE_DESCRIPTOR
:
2757 service_type
= get8(&p
, desc_end
);
2758 if (service_type
< 0)
2760 provider_name
= getstr8(&p
, desc_end
);
2763 name
= getstr8(&p
, desc_end
);
2765 AVProgram
*program
= av_new_program(ts
->stream
, sid
);
2767 av_dict_set(&program
->metadata
, "service_name", name
, 0);
2768 av_dict_set(&program
->metadata
, "service_provider",
2773 av_free(provider_name
);
2784 static int parse_pcr(int64_t *ppcr_high
, int *ppcr_low
,
2785 const uint8_t *packet
);
2787 /* handle one TS packet */
2788 static int handle_packet(MpegTSContext
*ts
, const uint8_t *packet
, int64_t pos
)
2791 int len
, pid
, cc
, expected_cc
, cc_ok
, afc
, is_start
, is_discontinuity
,
2792 has_adaptation
, has_payload
;
2793 const uint8_t *p
, *p_end
;
2795 pid
= AV_RB16(packet
+ 1) & 0x1fff;
2796 is_start
= packet
[1] & 0x40;
2797 tss
= ts
->pids
[pid
];
2798 if (ts
->auto_guess
&& !tss
&& is_start
) {
2799 add_pes_stream(ts
, pid
, -1);
2800 tss
= ts
->pids
[pid
];
2805 tss
->discard
= discard_pid(ts
, pid
);
2808 ts
->current_pid
= pid
;
2810 afc
= (packet
[3] >> 4) & 3;
2811 if (afc
== 0) /* reserved value */
2813 has_adaptation
= afc
& 2;
2814 has_payload
= afc
& 1;
2815 is_discontinuity
= has_adaptation
&&
2816 packet
[4] != 0 && /* with length > 0 */
2817 (packet
[5] & 0x80); /* and discontinuity indicated */
2819 /* continuity check (currently not used) */
2820 cc
= (packet
[3] & 0xf);
2821 expected_cc
= has_payload
? (tss
->last_cc
+ 1) & 0x0f : tss
->last_cc
;
2822 cc_ok
= pid
== NULL_PID
||
2829 av_log(ts
->stream
, AV_LOG_DEBUG
,
2830 "Continuity check failed for pid %d expected %d got %d\n",
2831 pid
, expected_cc
, cc
);
2832 if (tss
->type
== MPEGTS_PES
) {
2833 PESContext
*pc
= tss
->u
.pes_filter
.opaque
;
2834 pc
->flags
|= AV_PKT_FLAG_CORRUPT
;
2838 if (packet
[1] & 0x80) {
2839 av_log(ts
->stream
, AV_LOG_DEBUG
, "Packet had TEI flag set; marking as corrupt\n");
2840 if (tss
->type
== MPEGTS_PES
) {
2841 PESContext
*pc
= tss
->u
.pes_filter
.opaque
;
2842 pc
->flags
|= AV_PKT_FLAG_CORRUPT
;
2847 if (has_adaptation
) {
2850 if (parse_pcr(&pcr_h
, &pcr_l
, packet
) == 0)
2851 tss
->last_pcr
= pcr_h
* SYSTEM_CLOCK_FREQUENCY_DIVISOR
+ pcr_l
;
2852 /* skip adaptation field */
2855 /* if past the end of packet, ignore */
2856 p_end
= packet
+ TS_PACKET_SIZE
;
2857 if (p
>= p_end
|| !has_payload
)
2861 av_assert0(pos
>= TS_PACKET_SIZE
);
2862 ts
->pos47_full
= pos
- TS_PACKET_SIZE
;
2865 if (tss
->type
== MPEGTS_SECTION
) {
2867 /* pointer field present */
2869 if (len
> p_end
- p
)
2872 /* write remaining section bytes */
2873 write_section_data(ts
, tss
,
2875 /* check whether filter has been closed */
2881 write_section_data(ts
, tss
,
2886 write_section_data(ts
, tss
,
2891 // stop find_stream_info from waiting for more streams
2892 // when all programs have received a PMT
2893 if (ts
->stream
->ctx_flags
& AVFMTCTX_NOHEADER
&& ts
->scan_all_pmts
<= 0) {
2895 for (i
= 0; i
< ts
->nb_prg
; i
++) {
2896 if (!ts
->prg
[i
].pmt_found
)
2899 if (i
== ts
->nb_prg
&& ts
->nb_prg
> 0) {
2900 av_log(ts
->stream
, AV_LOG_DEBUG
, "All programs have pmt, headers found\n");
2901 ts
->stream
->ctx_flags
&= ~AVFMTCTX_NOHEADER
;
2907 // Note: The position here points actually behind the current packet.
2908 if (tss
->type
== MPEGTS_PES
) {
2909 if ((ret
= tss
->u
.pes_filter
.pes_cb(tss
, p
, p_end
- p
, is_start
,
2910 pos
- ts
->raw_packet_size
)) < 0)
2918 static int mpegts_resync(AVFormatContext
*s
, int seekback
, const uint8_t *current_packet
)
2920 MpegTSContext
*ts
= s
->priv_data
;
2921 AVIOContext
*pb
= s
->pb
;
2923 uint64_t pos
= avio_tell(pb
);
2924 int64_t back
= FFMIN(seekback
, pos
);
2926 //Special case for files like 01c56b0dc1.ts
2927 if (current_packet
[0] == 0x80 && current_packet
[12] == SYNC_BYTE
&& pos
>= TS_PACKET_SIZE
) {
2928 avio_seek(pb
, 12 - TS_PACKET_SIZE
, SEEK_CUR
);
2932 avio_seek(pb
, -back
, SEEK_CUR
);
2934 for (i
= 0; i
< ts
->resync_size
; i
++) {
2938 if (c
== SYNC_BYTE
) {
2939 int new_packet_size
, ret
;
2940 avio_seek(pb
, -1, SEEK_CUR
);
2941 pos
= avio_tell(pb
);
2942 ret
= ffio_ensure_seekback(pb
, PROBE_PACKET_MAX_BUF
);
2945 new_packet_size
= get_packet_size(s
);
2946 if (new_packet_size
> 0 && new_packet_size
!= ts
->raw_packet_size
) {
2947 av_log(ts
->stream
, AV_LOG_WARNING
, "changing packet size to %d\n", new_packet_size
);
2948 ts
->raw_packet_size
= new_packet_size
;
2950 avio_seek(pb
, pos
, SEEK_SET
);
2954 av_log(s
, AV_LOG_ERROR
,
2955 "max resync size reached, could not find sync byte\n");
2957 return AVERROR_INVALIDDATA
;
2960 /* return AVERROR_something if error or EOF. Return 0 if OK. */
2961 static int read_packet(AVFormatContext
*s
, uint8_t *buf
, int raw_packet_size
,
2962 const uint8_t **data
)
2964 AVIOContext
*pb
= s
->pb
;
2967 // 192 bytes source packet that start with a 4 bytes TP_extra_header
2968 // followed by 188 bytes of TS packet. The sync byte is at offset 4, so skip
2969 // the first 4 bytes otherwise we'll end up syncing to the wrong packet.
2970 if (raw_packet_size
== TS_DVHS_PACKET_SIZE
)
2974 len
= ffio_read_indirect(pb
, buf
, TS_PACKET_SIZE
, data
);
2975 if (len
!= TS_PACKET_SIZE
)
2976 return len
< 0 ? len
: AVERROR_EOF
;
2977 /* check packet sync byte */
2978 if ((*data
)[0] != SYNC_BYTE
) {
2979 /* find a new packet start */
2981 if (mpegts_resync(s
, raw_packet_size
, *data
) < 0)
2982 return AVERROR(EAGAIN
);
2992 static void finished_reading_packet(AVFormatContext
*s
, int raw_packet_size
)
2994 AVIOContext
*pb
= s
->pb
;
2996 if (raw_packet_size
== TS_DVHS_PACKET_SIZE
)
2997 skip
= raw_packet_size
- TS_DVHS_PACKET_SIZE
;
2999 skip
= raw_packet_size
- TS_PACKET_SIZE
;
3001 avio_skip(pb
, skip
);
3004 static int handle_packets(MpegTSContext
*ts
, int64_t nb_packets
)
3006 AVFormatContext
*s
= ts
->stream
;
3007 uint8_t packet
[TS_PACKET_SIZE
+ AV_INPUT_BUFFER_PADDING_SIZE
];
3008 const uint8_t *data
;
3012 if (avio_tell(s
->pb
) != ts
->last_pos
) {
3014 av_log(ts
->stream
, AV_LOG_TRACE
, "Skipping after seek\n");
3015 /* seek detected, flush pes buffer */
3016 for (i
= 0; i
< NB_PID_MAX
; i
++) {
3018 if (ts
->pids
[i
]->type
== MPEGTS_PES
) {
3019 PESContext
*pes
= ts
->pids
[i
]->u
.pes_filter
.opaque
;
3020 av_buffer_unref(&pes
->buffer
);
3021 pes
->data_index
= 0;
3022 pes
->state
= MPEGTS_SKIP
; /* skip until pes header */
3023 } else if (ts
->pids
[i
]->type
== MPEGTS_SECTION
) {
3024 ts
->pids
[i
]->u
.section_filter
.last_ver
= -1;
3026 ts
->pids
[i
]->last_cc
= -1;
3027 ts
->pids
[i
]->last_pcr
= -1;
3034 memset(packet
+ TS_PACKET_SIZE
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
3037 if (nb_packets
!= 0 && packet_num
>= nb_packets
||
3038 ts
->stop_parse
> 1) {
3039 ret
= AVERROR(EAGAIN
);
3042 if (ts
->stop_parse
> 0)
3045 ret
= read_packet(s
, packet
, ts
->raw_packet_size
, &data
);
3048 ret
= handle_packet(ts
, data
, avio_tell(s
->pb
));
3049 finished_reading_packet(s
, ts
->raw_packet_size
);
3053 ts
->last_pos
= avio_tell(s
->pb
);
3057 static int mpegts_probe(const AVProbeData
*p
)
3059 const int size
= p
->buf_size
;
3063 int check_count
= size
/ TS_FEC_PACKET_SIZE
;
3064 #define CHECK_COUNT 10
3065 #define CHECK_BLOCK 100
3070 for (i
= 0; i
<check_count
; i
+=CHECK_BLOCK
) {
3071 int left
= FFMIN(check_count
- i
, CHECK_BLOCK
);
3072 int score
= analyze(p
->buf
+ TS_PACKET_SIZE
*i
, TS_PACKET_SIZE
*left
, TS_PACKET_SIZE
, 1);
3073 int dvhs_score
= analyze(p
->buf
+ TS_DVHS_PACKET_SIZE
*i
, TS_DVHS_PACKET_SIZE
*left
, TS_DVHS_PACKET_SIZE
, 1);
3074 int fec_score
= analyze(p
->buf
+ TS_FEC_PACKET_SIZE
*i
, TS_FEC_PACKET_SIZE
*left
, TS_FEC_PACKET_SIZE
, 1);
3075 score
= FFMAX3(score
, dvhs_score
, fec_score
);
3077 maxscore
= FFMAX(maxscore
, score
);
3080 sumscore
= sumscore
* CHECK_COUNT
/ check_count
;
3081 maxscore
= maxscore
* CHECK_COUNT
/ CHECK_BLOCK
;
3083 ff_dlog(0, "TS score: %d %d\n", sumscore
, maxscore
);
3085 if (check_count
> CHECK_COUNT
&& sumscore
> 6) {
3086 return AVPROBE_SCORE_MAX
+ sumscore
- CHECK_COUNT
;
3087 } else if (check_count
>= CHECK_COUNT
&& sumscore
> 6) {
3088 return AVPROBE_SCORE_MAX
/2 + sumscore
- CHECK_COUNT
;
3089 } else if (check_count
>= CHECK_COUNT
&& maxscore
> 6) {
3090 return AVPROBE_SCORE_MAX
/2 + sumscore
- CHECK_COUNT
;
3091 } else if (sumscore
> 6) {
3098 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
3099 * (-1) if not available */
3100 static int parse_pcr(int64_t *ppcr_high
, int *ppcr_low
, const uint8_t *packet
)
3102 int afc
, len
, flags
;
3106 afc
= (packet
[3] >> 4) & 3;
3108 return AVERROR_INVALIDDATA
;
3113 return AVERROR_INVALIDDATA
;
3116 if (!(flags
& 0x10))
3117 return AVERROR_INVALIDDATA
;
3119 return AVERROR_INVALIDDATA
;
3121 *ppcr_high
= ((int64_t) v
<< 1) | (p
[4] >> 7);
3122 *ppcr_low
= ((p
[4] & 1) << 8) | p
[5];
3126 static void seek_back(AVFormatContext
*s
, AVIOContext
*pb
, int64_t pos
) {
3128 /* NOTE: We attempt to seek on non-seekable files as well, as the
3129 * probe buffer usually is big enough. Only warn if the seek failed
3130 * on files where the seek should work. */
3131 if (avio_seek(pb
, pos
, SEEK_SET
) < 0)
3132 av_log(s
, (pb
->seekable
& AVIO_SEEKABLE_NORMAL
) ? AV_LOG_ERROR
: AV_LOG_INFO
, "Unable to seek back to the start\n");
3135 static int mpegts_read_header(AVFormatContext
*s
)
3137 MpegTSContext
*ts
= s
->priv_data
;
3138 AVIOContext
*pb
= s
->pb
;
3139 int64_t pos
, probesize
= s
->probesize
;
3140 int64_t seekback
= FFMAX(s
->probesize
, (int64_t)ts
->resync_size
+ PROBE_PACKET_MAX_BUF
);
3142 if (ffio_ensure_seekback(pb
, seekback
) < 0)
3143 av_log(s
, AV_LOG_WARNING
, "Failed to allocate buffers for seekback\n");
3145 pos
= avio_tell(pb
);
3146 ts
->raw_packet_size
= get_packet_size(s
);
3147 if (ts
->raw_packet_size
<= 0) {
3148 av_log(s
, AV_LOG_WARNING
, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
3149 ts
->raw_packet_size
= TS_PACKET_SIZE
;
3154 if (s
->iformat
== &ff_mpegts_demuxer
.p
) {
3157 /* first do a scan to get all the services */
3158 seek_back(s
, pb
, pos
);
3160 mpegts_open_section_filter(ts
, SDT_PID
, sdt_cb
, ts
, 1);
3161 mpegts_open_section_filter(ts
, PAT_PID
, pat_cb
, ts
, 1);
3162 mpegts_open_section_filter(ts
, EIT_PID
, eit_cb
, ts
, 1);
3164 handle_packets(ts
, probesize
/ ts
->raw_packet_size
);
3165 /* if could not find service, enable auto_guess */
3169 av_log(ts
->stream
, AV_LOG_TRACE
, "tuning done\n");
3171 s
->ctx_flags
|= AVFMTCTX_NOHEADER
;
3174 int pcr_pid
, pid
, nb_packets
, nb_pcrs
, ret
, pcr_l
;
3175 int64_t pcrs
[2], pcr_h
;
3176 uint8_t packet
[TS_PACKET_SIZE
];
3177 const uint8_t *data
;
3179 /* only read packets */
3181 st
= avformat_new_stream(s
, NULL
);
3183 return AVERROR(ENOMEM
);
3184 avpriv_set_pts_info(st
, 60, 1, 27000000);
3185 st
->codecpar
->codec_type
= AVMEDIA_TYPE_DATA
;
3186 st
->codecpar
->codec_id
= AV_CODEC_ID_MPEG2TS
;
3188 /* we iterate until we find two PCRs to estimate the bitrate */
3193 ret
= read_packet(s
, packet
, ts
->raw_packet_size
, &data
);
3196 pid
= AV_RB16(data
+ 1) & 0x1fff;
3197 if ((pcr_pid
== -1 || pcr_pid
== pid
) &&
3198 parse_pcr(&pcr_h
, &pcr_l
, data
) == 0) {
3199 finished_reading_packet(s
, ts
->raw_packet_size
);
3201 pcrs
[nb_pcrs
] = pcr_h
* SYSTEM_CLOCK_FREQUENCY_DIVISOR
+ pcr_l
;
3204 if (pcrs
[1] - pcrs
[0] > 0) {
3205 /* the difference needs to be positive to make sense for bitrate computation */
3208 av_log(ts
->stream
, AV_LOG_WARNING
, "invalid pcr pair %"PRId64
" >= %"PRId64
"\n", pcrs
[0], pcrs
[1]);
3214 finished_reading_packet(s
, ts
->raw_packet_size
);
3219 /* NOTE1: the bitrate is computed without the FEC */
3220 /* NOTE2: it is only the bitrate of the start of the stream */
3221 ts
->pcr_incr
= pcrs
[1] - pcrs
[0];
3222 ts
->cur_pcr
= pcrs
[0] - ts
->pcr_incr
* (nb_packets
- 1);
3223 s
->bit_rate
= TS_PACKET_SIZE
* 8 * 27000000LL / ts
->pcr_incr
;
3224 st
->codecpar
->bit_rate
= s
->bit_rate
;
3225 st
->start_time
= ts
->cur_pcr
;
3226 av_log(ts
->stream
, AV_LOG_TRACE
, "start=%0.3f pcr=%0.3f incr=%"PRId64
"\n",
3227 st
->start_time
/ 1000000.0, pcrs
[0] / 27e6
, ts
->pcr_incr
);
3230 seek_back(s
, pb
, pos
);
3234 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
3236 static int mpegts_raw_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
3238 MpegTSContext
*ts
= s
->priv_data
;
3240 int64_t pcr_h
, next_pcr_h
, pos
;
3241 int pcr_l
, next_pcr_l
;
3242 uint8_t pcr_buf
[12];
3243 const uint8_t *data
;
3245 if ((ret
= av_new_packet(pkt
, TS_PACKET_SIZE
)) < 0)
3247 ret
= read_packet(s
, pkt
->data
, ts
->raw_packet_size
, &data
);
3248 pkt
->pos
= avio_tell(s
->pb
);
3252 if (data
!= pkt
->data
)
3253 memcpy(pkt
->data
, data
, TS_PACKET_SIZE
);
3254 finished_reading_packet(s
, ts
->raw_packet_size
);
3255 if (ts
->mpeg2ts_compute_pcr
) {
3256 /* compute exact PCR for each packet */
3257 if (parse_pcr(&pcr_h
, &pcr_l
, pkt
->data
) == 0) {
3258 /* we read the next PCR (XXX: optimize it by using a bigger buffer */
3259 pos
= avio_tell(s
->pb
);
3260 for (i
= 0; i
< MAX_PACKET_READAHEAD
; i
++) {
3261 avio_seek(s
->pb
, pos
+ i
* ts
->raw_packet_size
, SEEK_SET
);
3262 avio_read(s
->pb
, pcr_buf
, 12);
3263 if (parse_pcr(&next_pcr_h
, &next_pcr_l
, pcr_buf
) == 0) {
3264 /* XXX: not precise enough */
3266 ((next_pcr_h
- pcr_h
) * SYSTEM_CLOCK_FREQUENCY_DIVISOR
+ (next_pcr_l
- pcr_l
)) /
3271 avio_seek(s
->pb
, pos
, SEEK_SET
);
3272 /* no next PCR found: we use previous increment */
3273 ts
->cur_pcr
= pcr_h
* SYSTEM_CLOCK_FREQUENCY_DIVISOR
+ pcr_l
;
3275 pkt
->pts
= ts
->cur_pcr
;
3276 pkt
->duration
= ts
->pcr_incr
;
3277 ts
->cur_pcr
+= ts
->pcr_incr
;
3279 pkt
->stream_index
= 0;
3283 static int mpegts_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
3285 MpegTSContext
*ts
= s
->priv_data
;
3290 ret
= handle_packets(ts
, 0);
3292 av_packet_unref(ts
->pkt
);
3293 /* flush pes data left */
3294 for (i
= 0; i
< NB_PID_MAX
; i
++)
3295 if (ts
->pids
[i
] && ts
->pids
[i
]->type
== MPEGTS_PES
) {
3296 PESContext
*pes
= ts
->pids
[i
]->u
.pes_filter
.opaque
;
3297 if (pes
->state
== MPEGTS_PAYLOAD
&& pes
->data_index
> 0) {
3298 ret
= new_pes_packet(pes
, pkt
);
3301 pes
->state
= MPEGTS_SKIP
;
3308 if (!ret
&& pkt
->size
< 0)
3309 ret
= AVERROR_INVALIDDATA
;
3313 static void mpegts_free(MpegTSContext
*ts
)
3319 for (i
= 0; i
< FF_ARRAY_ELEMS(ts
->pools
); i
++)
3320 av_buffer_pool_uninit(&ts
->pools
[i
]);
3322 for (i
= 0; i
< NB_PID_MAX
; i
++)
3324 mpegts_close_filter(ts
, ts
->pids
[i
]);
3327 static int mpegts_read_close(AVFormatContext
*s
)
3329 MpegTSContext
*ts
= s
->priv_data
;
3334 av_unused
static int64_t mpegts_get_pcr(AVFormatContext
*s
, int stream_index
,
3335 int64_t *ppos
, int64_t pos_limit
)
3337 MpegTSContext
*ts
= s
->priv_data
;
3338 int64_t pos
, timestamp
;
3339 uint8_t buf
[TS_PACKET_SIZE
];
3340 int pcr_l
, pcr_pid
=
3341 ((PESContext
*)s
->streams
[stream_index
]->priv_data
)->pcr_pid
;
3342 int pos47
= ts
->pos47_full
% ts
->raw_packet_size
;
3344 ((*ppos
+ ts
->raw_packet_size
- 1 - pos47
) / ts
->raw_packet_size
) *
3345 ts
->raw_packet_size
+ pos47
;
3346 while(pos
< pos_limit
) {
3347 if (avio_seek(s
->pb
, pos
, SEEK_SET
) < 0)
3348 return AV_NOPTS_VALUE
;
3349 if (avio_read(s
->pb
, buf
, TS_PACKET_SIZE
) != TS_PACKET_SIZE
)
3350 return AV_NOPTS_VALUE
;
3351 if (buf
[0] != SYNC_BYTE
) {
3352 if (mpegts_resync(s
, TS_PACKET_SIZE
, buf
) < 0)
3353 return AV_NOPTS_VALUE
;
3354 pos
= avio_tell(s
->pb
);
3357 if ((pcr_pid
< 0 || (AV_RB16(buf
+ 1) & 0x1fff) == pcr_pid
) &&
3358 parse_pcr(×tamp
, &pcr_l
, buf
) == 0) {
3362 pos
+= ts
->raw_packet_size
;
3365 return AV_NOPTS_VALUE
;
3368 static int64_t mpegts_get_dts(AVFormatContext
*s
, int stream_index
,
3369 int64_t *ppos
, int64_t pos_limit
)
3371 MpegTSContext
*ts
= s
->priv_data
;
3374 int pos47
= ts
->pos47_full
% ts
->raw_packet_size
;
3375 pos
= ((*ppos
+ ts
->raw_packet_size
- 1 - pos47
) / ts
->raw_packet_size
) * ts
->raw_packet_size
+ pos47
;
3376 ff_read_frame_flush(s
);
3377 if (avio_seek(s
->pb
, pos
, SEEK_SET
) < 0)
3378 return AV_NOPTS_VALUE
;
3379 pkt
= av_packet_alloc();
3381 return AV_NOPTS_VALUE
;
3382 while(pos
< pos_limit
) {
3383 int ret
= av_read_frame(s
, pkt
);
3385 av_packet_free(&pkt
);
3386 return AV_NOPTS_VALUE
;
3388 if (pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pos
>= 0) {
3389 ff_reduce_index(s
, pkt
->stream_index
);
3390 av_add_index_entry(s
->streams
[pkt
->stream_index
], pkt
->pos
, pkt
->dts
, 0, 0, AVINDEX_KEYFRAME
/* FIXME keyframe? */);
3391 if (pkt
->stream_index
== stream_index
&& pkt
->pos
>= *ppos
) {
3392 int64_t dts
= pkt
->dts
;
3394 av_packet_free(&pkt
);
3399 av_packet_unref(pkt
);
3402 av_packet_free(&pkt
);
3403 return AV_NOPTS_VALUE
;
3406 /**************************************************************/
3407 /* parsing functions - called from other demuxers such as RTP */
3409 MpegTSContext
*avpriv_mpegts_parse_open(AVFormatContext
*s
)
3413 ts
= av_mallocz(sizeof(MpegTSContext
));
3416 /* no stream case, currently used by RTP */
3417 ts
->raw_packet_size
= TS_PACKET_SIZE
;
3418 ts
->max_packet_size
= 2048000;
3422 mpegts_open_section_filter(ts
, SDT_PID
, sdt_cb
, ts
, 1);
3423 mpegts_open_section_filter(ts
, PAT_PID
, pat_cb
, ts
, 1);
3424 mpegts_open_section_filter(ts
, EIT_PID
, eit_cb
, ts
, 1);
3429 /* return the consumed length if a packet was output, or -1 if no
3430 * packet is output */
3431 int avpriv_mpegts_parse_packet(MpegTSContext
*ts
, AVPacket
*pkt
,
3432 const uint8_t *buf
, int len
)
3440 if (len
< TS_PACKET_SIZE
)
3441 return AVERROR_INVALIDDATA
;
3442 if (buf
[0] != SYNC_BYTE
) {
3446 handle_packet(ts
, buf
, len1
- len
+ TS_PACKET_SIZE
);
3447 buf
+= TS_PACKET_SIZE
;
3448 len
-= TS_PACKET_SIZE
;
3449 if (ts
->stop_parse
== 1)
3456 void avpriv_mpegts_parse_close(MpegTSContext
*ts
)
3462 const FFInputFormat ff_mpegts_demuxer
= {
3464 .p
.long_name
= NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
3465 .p
.flags
= AVFMT_SHOW_IDS
| AVFMT_TS_DISCONT
,
3466 .p
.priv_class
= &mpegts_class
,
3467 .priv_data_size
= sizeof(MpegTSContext
),
3468 .read_probe
= mpegts_probe
,
3469 .read_header
= mpegts_read_header
,
3470 .read_packet
= mpegts_read_packet
,
3471 .read_close
= mpegts_read_close
,
3472 .read_timestamp
= mpegts_get_dts
,
3473 .flags_internal
= FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE
,
3476 const FFInputFormat ff_mpegtsraw_demuxer
= {
3477 .p
.name
= "mpegtsraw",
3478 .p
.long_name
= NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
3479 .p
.flags
= AVFMT_SHOW_IDS
| AVFMT_TS_DISCONT
,
3480 .p
.priv_class
= &mpegtsraw_class
,
3481 .priv_data_size
= sizeof(MpegTSContext
),
3482 .read_header
= mpegts_read_header
,
3483 .read_packet
= mpegts_raw_read_packet
,
3484 .read_close
= mpegts_read_close
,
3485 .read_timestamp
= mpegts_get_dts
,
3486 .flags_internal
= FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE
,