2 * MPEG2 transport stream (aka DVB) demuxer
3 * Copyright (c) 2002-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 //#define USE_SYNCPOINT_SEARCH
24 #include "libavutil/crc.h"
25 #include "libavutil/intreadwrite.h"
26 #include "libavutil/log.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/mathematics.h"
29 #include "libavutil/opt.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 enum MpegTSFilterType
{
53 typedef struct MpegTSFilter MpegTSFilter
;
55 typedef int PESCallback(MpegTSFilter
*f
, const uint8_t *buf
, int len
, int is_start
, int64_t pos
);
57 typedef struct MpegTSPESFilter
{
62 typedef void SectionCallback(MpegTSFilter
*f
, const uint8_t *buf
, int len
);
64 typedef void SetServiceCallback(void *opaque
, int ret
);
66 typedef struct MpegTSSectionFilter
{
70 unsigned int check_crc
:1;
71 unsigned int end_of_section_reached
:1;
72 SectionCallback
*section_cb
;
74 } MpegTSSectionFilter
;
79 int last_cc
; /* last cc code (-1 if first packet) */
80 enum MpegTSFilterType type
;
82 MpegTSPESFilter pes_filter
;
83 MpegTSSectionFilter section_filter
;
87 #define MAX_PIDS_PER_PROGRAM 64
89 unsigned int id
; //program id/service id
91 unsigned int pids
[MAX_PIDS_PER_PROGRAM
];
94 struct MpegTSContext
{
97 AVFormatContext
*stream
;
98 /** raw packet size, including FEC if present */
103 /** if true, all pids are analyzed to find streams */
106 /** compute exact PCR for each transport stream packet */
107 int mpeg2ts_compute_pcr
;
109 int64_t cur_pcr
; /**< used to estimate the exact PCR */
110 int pcr_incr
; /**< used to estimate the exact PCR */
112 /* data needed to handle file based ts */
113 /** stop parsing loop */
115 /** packet containing Audio/Video data */
117 /** to detect seek */
120 /******************************************/
121 /* private mpegts data */
123 /** structure to keep track of Program->pids mapping */
128 /** filters for various streams specified by PMT + for the PAT and PMT */
129 MpegTSFilter
*pids
[NB_PID_MAX
];
132 static const AVOption options
[] = {
133 {"compute_pcr", "Compute exact PCR for each transport stream packet.", offsetof(MpegTSContext
, mpeg2ts_compute_pcr
), AV_OPT_TYPE_INT
,
134 {.dbl
= 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
138 static const AVClass mpegtsraw_class
= {
139 .class_name
= "mpegtsraw demuxer",
140 .item_name
= av_default_item_name
,
142 .version
= LIBAVUTIL_VERSION_INT
,
145 /* TS stream handling */
150 MPEGTS_PESHEADER_FILL
,
155 /* enough for PES header + length */
156 #define PES_START_SIZE 6
157 #define PES_HEADER_SIZE 9
158 #define MAX_PES_HEADER_SIZE (9 + 255)
160 typedef struct PESContext
{
162 int pcr_pid
; /**< if -1 then all packets containing PCR are considered */
165 AVFormatContext
*stream
;
167 AVStream
*sub_st
; /**< stream for the embedded AC3 stream in HDMV TrueHD */
168 enum MpegTSState state
;
169 /* used to get the format */
171 int flags
; /**< copied to the AVPacket flags */
174 int extended_stream_id
;
176 int64_t ts_packet_pos
; /**< position of first TS packet of this PES packet */
177 uint8_t header
[MAX_PES_HEADER_SIZE
];
182 extern AVInputFormat ff_mpegts_demuxer
;
184 static void clear_program(MpegTSContext
*ts
, unsigned int programid
)
188 for(i
=0; i
<ts
->nb_prg
; i
++)
189 if(ts
->prg
[i
].id
== programid
)
190 ts
->prg
[i
].nb_pids
= 0;
193 static void clear_programs(MpegTSContext
*ts
)
199 static void add_pat_entry(MpegTSContext
*ts
, unsigned int programid
)
202 void *tmp
= av_realloc(ts
->prg
, (ts
->nb_prg
+1)*sizeof(struct Program
));
206 p
= &ts
->prg
[ts
->nb_prg
];
212 static void add_pid_to_pmt(MpegTSContext
*ts
, unsigned int programid
, unsigned int pid
)
215 struct Program
*p
= NULL
;
216 for(i
=0; i
<ts
->nb_prg
; i
++) {
217 if(ts
->prg
[i
].id
== programid
) {
225 if(p
->nb_pids
>= MAX_PIDS_PER_PROGRAM
)
227 p
->pids
[p
->nb_pids
++] = pid
;
231 * @brief discard_pid() decides if the pid is to be discarded according
232 * to caller's programs selection
233 * @param ts : - TS context
235 * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
238 static int discard_pid(MpegTSContext
*ts
, unsigned int pid
)
241 int used
= 0, discarded
= 0;
243 for(i
=0; i
<ts
->nb_prg
; i
++) {
245 for(j
=0; j
<p
->nb_pids
; j
++) {
246 if(p
->pids
[j
] != pid
)
248 //is program with id p->id set to be discarded?
249 for(k
=0; k
<ts
->stream
->nb_programs
; k
++) {
250 if(ts
->stream
->programs
[k
]->id
== p
->id
) {
251 if(ts
->stream
->programs
[k
]->discard
== AVDISCARD_ALL
)
260 return !used
&& discarded
;
264 * Assemble PES packets out of TS packets, and then call the "section_cb"
265 * function when they are complete.
267 static void write_section_data(AVFormatContext
*s
, MpegTSFilter
*tss1
,
268 const uint8_t *buf
, int buf_size
, int is_start
)
270 MpegTSSectionFilter
*tss
= &tss1
->u
.section_filter
;
274 memcpy(tss
->section_buf
, buf
, buf_size
);
275 tss
->section_index
= buf_size
;
276 tss
->section_h_size
= -1;
277 tss
->end_of_section_reached
= 0;
279 if (tss
->end_of_section_reached
)
281 len
= 4096 - tss
->section_index
;
284 memcpy(tss
->section_buf
+ tss
->section_index
, buf
, len
);
285 tss
->section_index
+= len
;
288 /* compute section length if possible */
289 if (tss
->section_h_size
== -1 && tss
->section_index
>= 3) {
290 len
= (AV_RB16(tss
->section_buf
+ 1) & 0xfff) + 3;
293 tss
->section_h_size
= len
;
296 if (tss
->section_h_size
!= -1 && tss
->section_index
>= tss
->section_h_size
) {
297 tss
->end_of_section_reached
= 1;
298 if (!tss
->check_crc
||
299 av_crc(av_crc_get_table(AV_CRC_32_IEEE
), -1,
300 tss
->section_buf
, tss
->section_h_size
) == 0)
301 tss
->section_cb(tss1
, tss
->section_buf
, tss
->section_h_size
);
305 static MpegTSFilter
*mpegts_open_section_filter(MpegTSContext
*ts
, unsigned int pid
,
306 SectionCallback
*section_cb
, void *opaque
,
310 MpegTSFilter
*filter
;
311 MpegTSSectionFilter
*sec
;
313 av_dlog(ts
->stream
, "Filter: pid=0x%x\n", pid
);
315 if (pid
>= NB_PID_MAX
|| ts
->pids
[pid
])
317 filter
= av_mallocz(sizeof(MpegTSFilter
));
320 ts
->pids
[pid
] = filter
;
321 filter
->type
= MPEGTS_SECTION
;
324 filter
->last_cc
= -1;
325 sec
= &filter
->u
.section_filter
;
326 sec
->section_cb
= section_cb
;
327 sec
->opaque
= opaque
;
328 sec
->section_buf
= av_malloc(MAX_SECTION_SIZE
);
329 sec
->check_crc
= check_crc
;
330 if (!sec
->section_buf
) {
337 static MpegTSFilter
*mpegts_open_pes_filter(MpegTSContext
*ts
, unsigned int pid
,
341 MpegTSFilter
*filter
;
342 MpegTSPESFilter
*pes
;
344 if (pid
>= NB_PID_MAX
|| ts
->pids
[pid
])
346 filter
= av_mallocz(sizeof(MpegTSFilter
));
349 ts
->pids
[pid
] = filter
;
350 filter
->type
= MPEGTS_PES
;
353 filter
->last_cc
= -1;
354 pes
= &filter
->u
.pes_filter
;
355 pes
->pes_cb
= pes_cb
;
356 pes
->opaque
= opaque
;
360 static void mpegts_close_filter(MpegTSContext
*ts
, MpegTSFilter
*filter
)
365 if (filter
->type
== MPEGTS_SECTION
)
366 av_freep(&filter
->u
.section_filter
.section_buf
);
367 else if (filter
->type
== MPEGTS_PES
) {
368 PESContext
*pes
= filter
->u
.pes_filter
.opaque
;
369 av_freep(&pes
->buffer
);
370 /* referenced private data will be freed later in
371 * av_close_input_stream */
372 if (!((PESContext
*)filter
->u
.pes_filter
.opaque
)->st
) {
373 av_freep(&filter
->u
.pes_filter
.opaque
);
378 ts
->pids
[pid
] = NULL
;
381 static int analyze(const uint8_t *buf
, int size
, int packet_size
, int *index
){
382 int stat
[TS_MAX_PACKET_SIZE
];
387 memset(stat
, 0, packet_size
*sizeof(int));
389 for(x
=i
=0; i
<size
-3; i
++){
390 if(buf
[i
] == 0x47 && !(buf
[i
+1] & 0x80) && (buf
[i
+3] & 0x30)){
392 if(stat
[x
] > best_score
){
399 if(x
== packet_size
) x
= 0;
405 /* autodetect fec presence. Must have at least 1024 bytes */
406 static int get_packet_size(const uint8_t *buf
, int size
)
408 int score
, fec_score
, dvhs_score
;
410 if (size
< (TS_FEC_PACKET_SIZE
* 5 + 1))
413 score
= analyze(buf
, size
, TS_PACKET_SIZE
, NULL
);
414 dvhs_score
= analyze(buf
, size
, TS_DVHS_PACKET_SIZE
, NULL
);
415 fec_score
= analyze(buf
, size
, TS_FEC_PACKET_SIZE
, NULL
);
416 // av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score);
418 if (score
> fec_score
&& score
> dvhs_score
) return TS_PACKET_SIZE
;
419 else if(dvhs_score
> score
&& dvhs_score
> fec_score
) return TS_DVHS_PACKET_SIZE
;
420 else if(score
< fec_score
&& dvhs_score
< fec_score
) return TS_FEC_PACKET_SIZE
;
424 typedef struct SectionHeader
{
429 uint8_t last_sec_num
;
432 static inline int get8(const uint8_t **pp
, const uint8_t *p_end
)
445 static inline int get16(const uint8_t **pp
, const uint8_t *p_end
)
451 if ((p
+ 1) >= p_end
)
459 /* read and allocate a DVB string preceded by its length */
460 static char *getstr8(const uint8_t **pp
, const uint8_t *p_end
)
467 len
= get8(&p
, p_end
);
470 if ((p
+ len
) > p_end
)
472 str
= av_malloc(len
+ 1);
482 static int parse_section_header(SectionHeader
*h
,
483 const uint8_t **pp
, const uint8_t *p_end
)
487 val
= get8(pp
, p_end
);
492 val
= get16(pp
, p_end
);
496 val
= get8(pp
, p_end
);
499 h
->version
= (val
>> 1) & 0x1f;
500 val
= get8(pp
, p_end
);
504 val
= get8(pp
, p_end
);
507 h
->last_sec_num
= val
;
512 uint32_t stream_type
;
513 enum AVMediaType codec_type
;
514 enum CodecID codec_id
;
517 static const StreamType ISO_types
[] = {
518 { 0x01, AVMEDIA_TYPE_VIDEO
, CODEC_ID_MPEG2VIDEO
},
519 { 0x02, AVMEDIA_TYPE_VIDEO
, CODEC_ID_MPEG2VIDEO
},
520 { 0x03, AVMEDIA_TYPE_AUDIO
, CODEC_ID_MP3
},
521 { 0x04, AVMEDIA_TYPE_AUDIO
, CODEC_ID_MP3
},
522 { 0x0f, AVMEDIA_TYPE_AUDIO
, CODEC_ID_AAC
},
523 { 0x10, AVMEDIA_TYPE_VIDEO
, CODEC_ID_MPEG4
},
524 { 0x11, AVMEDIA_TYPE_AUDIO
, CODEC_ID_AAC_LATM
}, /* LATM syntax */
525 { 0x1b, AVMEDIA_TYPE_VIDEO
, CODEC_ID_H264
},
526 { 0xd1, AVMEDIA_TYPE_VIDEO
, CODEC_ID_DIRAC
},
527 { 0xea, AVMEDIA_TYPE_VIDEO
, CODEC_ID_VC1
},
531 static const StreamType HDMV_types
[] = {
532 { 0x80, AVMEDIA_TYPE_AUDIO
, CODEC_ID_PCM_BLURAY
},
533 { 0x81, AVMEDIA_TYPE_AUDIO
, CODEC_ID_AC3
},
534 { 0x82, AVMEDIA_TYPE_AUDIO
, CODEC_ID_DTS
},
535 { 0x83, AVMEDIA_TYPE_AUDIO
, CODEC_ID_TRUEHD
},
536 { 0x84, AVMEDIA_TYPE_AUDIO
, CODEC_ID_EAC3
},
537 { 0x90, AVMEDIA_TYPE_SUBTITLE
, CODEC_ID_HDMV_PGS_SUBTITLE
},
542 static const StreamType MISC_types
[] = {
543 { 0x81, AVMEDIA_TYPE_AUDIO
, CODEC_ID_AC3
},
544 { 0x8a, AVMEDIA_TYPE_AUDIO
, CODEC_ID_DTS
},
548 static const StreamType REGD_types
[] = {
549 { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO
, CODEC_ID_DIRAC
},
550 { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO
, CODEC_ID_AC3
},
551 { MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO
, CODEC_ID_S302M
},
555 /* descriptor present */
556 static const StreamType DESC_types
[] = {
557 { 0x6a, AVMEDIA_TYPE_AUDIO
, CODEC_ID_AC3
}, /* AC-3 descriptor */
558 { 0x7a, AVMEDIA_TYPE_AUDIO
, CODEC_ID_EAC3
}, /* E-AC-3 descriptor */
559 { 0x7b, AVMEDIA_TYPE_AUDIO
, CODEC_ID_DTS
},
560 { 0x56, AVMEDIA_TYPE_SUBTITLE
, CODEC_ID_DVB_TELETEXT
},
561 { 0x59, AVMEDIA_TYPE_SUBTITLE
, CODEC_ID_DVB_SUBTITLE
}, /* subtitling descriptor */
565 static void mpegts_find_stream_type(AVStream
*st
,
566 uint32_t stream_type
, const StreamType
*types
)
568 for (; types
->stream_type
; types
++) {
569 if (stream_type
== types
->stream_type
) {
570 st
->codec
->codec_type
= types
->codec_type
;
571 st
->codec
->codec_id
= types
->codec_id
;
577 static int mpegts_set_stream_info(AVStream
*st
, PESContext
*pes
,
578 uint32_t stream_type
, uint32_t prog_reg_desc
)
580 avpriv_set_pts_info(st
, 33, 1, 90000);
582 st
->codec
->codec_type
= AVMEDIA_TYPE_DATA
;
583 st
->codec
->codec_id
= CODEC_ID_NONE
;
584 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
586 pes
->stream_type
= stream_type
;
588 av_log(pes
->stream
, AV_LOG_DEBUG
,
589 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
590 st
->index
, pes
->stream_type
, pes
->pid
, (char*)&prog_reg_desc
);
592 st
->codec
->codec_tag
= pes
->stream_type
;
594 mpegts_find_stream_type(st
, pes
->stream_type
, ISO_types
);
595 if (prog_reg_desc
== AV_RL32("HDMV") &&
596 st
->codec
->codec_id
== CODEC_ID_NONE
) {
597 mpegts_find_stream_type(st
, pes
->stream_type
, HDMV_types
);
598 if (pes
->stream_type
== 0x83) {
599 // HDMV TrueHD streams also contain an AC3 coded version of the
600 // audio track - add a second stream for this
602 // priv_data cannot be shared between streams
603 PESContext
*sub_pes
= av_malloc(sizeof(*sub_pes
));
605 return AVERROR(ENOMEM
);
606 memcpy(sub_pes
, pes
, sizeof(*sub_pes
));
608 sub_st
= avformat_new_stream(pes
->stream
, NULL
);
611 return AVERROR(ENOMEM
);
614 sub_st
->id
= pes
->pid
;
615 avpriv_set_pts_info(sub_st
, 33, 1, 90000);
616 sub_st
->priv_data
= sub_pes
;
617 sub_st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
618 sub_st
->codec
->codec_id
= CODEC_ID_AC3
;
619 sub_st
->need_parsing
= AVSTREAM_PARSE_FULL
;
620 sub_pes
->sub_st
= pes
->sub_st
= sub_st
;
623 if (st
->codec
->codec_id
== CODEC_ID_NONE
)
624 mpegts_find_stream_type(st
, pes
->stream_type
, MISC_types
);
629 static void new_pes_packet(PESContext
*pes
, AVPacket
*pkt
)
633 pkt
->destruct
= av_destruct_packet
;
634 pkt
->data
= pes
->buffer
;
635 pkt
->size
= pes
->data_index
;
637 if(pes
->total_size
!= MAX_PES_PAYLOAD
&&
638 pes
->pes_header_size
+ pes
->data_index
!= pes
->total_size
+ 6) {
639 av_log(pes
->stream
, AV_LOG_WARNING
, "PES packet size mismatch\n");
640 pes
->flags
|= AV_PKT_FLAG_CORRUPT
;
642 memset(pkt
->data
+pkt
->size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
644 // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
645 if (pes
->sub_st
&& pes
->stream_type
== 0x83 && pes
->extended_stream_id
== 0x76)
646 pkt
->stream_index
= pes
->sub_st
->index
;
648 pkt
->stream_index
= pes
->st
->index
;
651 /* store position of first TS packet of this PES packet */
652 pkt
->pos
= pes
->ts_packet_pos
;
653 pkt
->flags
= pes
->flags
;
655 /* reset pts values */
656 pes
->pts
= AV_NOPTS_VALUE
;
657 pes
->dts
= AV_NOPTS_VALUE
;
663 static uint64_t get_bits64(GetBitContext
*gb
, int bits
)
668 ret
|= get_bits(gb
, 17);
672 ret
|= get_bits(gb
, bits
);
676 static int read_sl_header(PESContext
*pes
, SLConfigDescr
*sl
, const uint8_t *buf
, int buf_size
)
679 int au_start_flag
= 0, au_end_flag
= 0, ocr_flag
= 0, idle_flag
= 0;
680 int padding_flag
= 0, padding_bits
= 0, inst_bitrate_flag
= 0;
681 int dts_flag
= -1, cts_flag
= -1;
682 int64_t dts
= AV_NOPTS_VALUE
, cts
= AV_NOPTS_VALUE
;
683 init_get_bits(&gb
, buf
, buf_size
*8);
685 if (sl
->use_au_start
)
686 au_start_flag
= get_bits1(&gb
);
688 au_end_flag
= get_bits1(&gb
);
689 if (!sl
->use_au_start
&& !sl
->use_au_end
)
690 au_start_flag
= au_end_flag
= 1;
692 ocr_flag
= get_bits1(&gb
);
694 idle_flag
= get_bits1(&gb
);
696 padding_flag
= get_bits1(&gb
);
698 padding_bits
= get_bits(&gb
, 3);
700 if (!idle_flag
&& (!padding_flag
|| padding_bits
!= 0)) {
701 if (sl
->packet_seq_num_len
)
702 skip_bits_long(&gb
, sl
->packet_seq_num_len
);
703 if (sl
->degr_prior_len
)
705 skip_bits(&gb
, sl
->degr_prior_len
);
707 skip_bits_long(&gb
, sl
->ocr_len
);
709 if (sl
->use_rand_acc_pt
)
711 if (sl
->au_seq_num_len
> 0)
712 skip_bits_long(&gb
, sl
->au_seq_num_len
);
713 if (sl
->use_timestamps
) {
714 dts_flag
= get_bits1(&gb
);
715 cts_flag
= get_bits1(&gb
);
718 if (sl
->inst_bitrate_len
)
719 inst_bitrate_flag
= get_bits1(&gb
);
721 dts
= get_bits64(&gb
, sl
->timestamp_len
);
723 cts
= get_bits64(&gb
, sl
->timestamp_len
);
725 skip_bits_long(&gb
, sl
->au_len
);
726 if (inst_bitrate_flag
)
727 skip_bits_long(&gb
, sl
->inst_bitrate_len
);
730 if (dts
!= AV_NOPTS_VALUE
)
732 if (cts
!= AV_NOPTS_VALUE
)
735 avpriv_set_pts_info(pes
->st
, sl
->timestamp_len
, 1, sl
->timestamp_res
);
737 return (get_bits_count(&gb
) + 7) >> 3;
740 /* return non zero if a packet could be constructed */
741 static int mpegts_push_data(MpegTSFilter
*filter
,
742 const uint8_t *buf
, int buf_size
, int is_start
,
745 PESContext
*pes
= filter
->u
.pes_filter
.opaque
;
746 MpegTSContext
*ts
= pes
->ts
;
754 if (pes
->state
== MPEGTS_PAYLOAD
&& pes
->data_index
> 0) {
755 new_pes_packet(pes
, ts
->pkt
);
758 pes
->state
= MPEGTS_HEADER
;
760 pes
->ts_packet_pos
= pos
;
763 while (buf_size
> 0) {
766 len
= PES_START_SIZE
- pes
->data_index
;
769 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
770 pes
->data_index
+= len
;
773 if (pes
->data_index
== PES_START_SIZE
) {
774 /* we got all the PES or section header. We can now
776 if (pes
->header
[0] == 0x00 && pes
->header
[1] == 0x00 &&
777 pes
->header
[2] == 0x01) {
778 /* it must be an mpeg2 PES stream */
779 code
= pes
->header
[3] | 0x100;
780 av_dlog(pes
->stream
, "pid=%x pes_code=%#x\n", pes
->pid
, code
);
782 if ((pes
->st
&& pes
->st
->discard
== AVDISCARD_ALL
) ||
783 code
== 0x1be) /* padding_stream */
786 /* stream not present in PMT */
788 pes
->st
= avformat_new_stream(ts
->stream
, NULL
);
790 return AVERROR(ENOMEM
);
791 pes
->st
->id
= pes
->pid
;
792 mpegts_set_stream_info(pes
->st
, pes
, 0, 0);
795 pes
->total_size
= AV_RB16(pes
->header
+ 4);
796 /* NOTE: a zero total size means the PES size is
798 if (!pes
->total_size
)
799 pes
->total_size
= MAX_PES_PAYLOAD
;
801 /* allocate pes buffer */
802 pes
->buffer
= av_malloc(pes
->total_size
+FF_INPUT_BUFFER_PADDING_SIZE
);
804 return AVERROR(ENOMEM
);
806 if (code
!= 0x1bc && code
!= 0x1bf && /* program_stream_map, private_stream_2 */
807 code
!= 0x1f0 && code
!= 0x1f1 && /* ECM, EMM */
808 code
!= 0x1ff && code
!= 0x1f2 && /* program_stream_directory, DSMCC_stream */
809 code
!= 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */
810 pes
->state
= MPEGTS_PESHEADER
;
811 if (pes
->st
->codec
->codec_id
== CODEC_ID_NONE
) {
812 av_dlog(pes
->stream
, "pid=%x stream_type=%x probing\n",
813 pes
->pid
, pes
->stream_type
);
814 pes
->st
->codec
->codec_id
= CODEC_ID_PROBE
;
817 pes
->state
= MPEGTS_PAYLOAD
;
821 /* otherwise, it should be a table */
824 pes
->state
= MPEGTS_SKIP
;
829 /**********************************************/
830 /* PES packing parsing */
831 case MPEGTS_PESHEADER
:
832 len
= PES_HEADER_SIZE
- pes
->data_index
;
837 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
838 pes
->data_index
+= len
;
841 if (pes
->data_index
== PES_HEADER_SIZE
) {
842 pes
->pes_header_size
= pes
->header
[8] + 9;
843 pes
->state
= MPEGTS_PESHEADER_FILL
;
846 case MPEGTS_PESHEADER_FILL
:
847 len
= pes
->pes_header_size
- pes
->data_index
;
852 memcpy(pes
->header
+ pes
->data_index
, p
, len
);
853 pes
->data_index
+= len
;
856 if (pes
->data_index
== pes
->pes_header_size
) {
858 unsigned int flags
, pes_ext
, skip
;
860 flags
= pes
->header
[7];
862 pes
->pts
= AV_NOPTS_VALUE
;
863 pes
->dts
= AV_NOPTS_VALUE
;
864 if ((flags
& 0xc0) == 0x80) {
865 pes
->dts
= pes
->pts
= ff_parse_pes_pts(r
);
867 } else if ((flags
& 0xc0) == 0xc0) {
868 pes
->pts
= ff_parse_pes_pts(r
);
870 pes
->dts
= ff_parse_pes_pts(r
);
873 pes
->extended_stream_id
= -1;
874 if (flags
& 0x01) { /* PES extension */
876 /* Skip PES private data, program packet sequence counter and P-STD buffer */
877 skip
= (pes_ext
>> 4) & 0xb;
880 if ((pes_ext
& 0x41) == 0x01 &&
881 (r
+ 2) <= (pes
->header
+ pes
->pes_header_size
)) {
882 /* PES extension 2 */
883 if ((r
[0] & 0x7f) > 0 && (r
[1] & 0x80) == 0)
884 pes
->extended_stream_id
= r
[1];
888 /* we got the full header. We parse it and get the payload */
889 pes
->state
= MPEGTS_PAYLOAD
;
891 if (pes
->stream_type
== 0x12) {
892 int sl_header_bytes
= read_sl_header(pes
, &pes
->sl
, p
, buf_size
);
893 pes
->pes_header_size
+= sl_header_bytes
;
894 p
+= sl_header_bytes
;
895 buf_size
-= sl_header_bytes
;
900 if (buf_size
> 0 && pes
->buffer
) {
901 if (pes
->data_index
> 0 && pes
->data_index
+buf_size
> pes
->total_size
) {
902 new_pes_packet(pes
, ts
->pkt
);
903 pes
->total_size
= MAX_PES_PAYLOAD
;
904 pes
->buffer
= av_malloc(pes
->total_size
+FF_INPUT_BUFFER_PADDING_SIZE
);
906 return AVERROR(ENOMEM
);
908 } else if (pes
->data_index
== 0 && buf_size
> pes
->total_size
) {
909 // pes packet size is < ts size packet and pes data is padded with 0xff
910 // not sure if this is legal in ts but see issue #2392
911 buf_size
= pes
->total_size
;
913 memcpy(pes
->buffer
+pes
->data_index
, p
, buf_size
);
914 pes
->data_index
+= buf_size
;
917 /* emit complete packets with known packet size
918 * decreases demuxer delay for infrequent packets like subtitles from
919 * a couple of seconds to milliseconds for properly muxed files.
920 * total_size is the number of bytes following pes_packet_length
921 * in the pes header, i.e. not counting the first 6 bytes */
922 if (!ts
->stop_parse
&& pes
->total_size
< MAX_PES_PAYLOAD
&&
923 pes
->pes_header_size
+ pes
->data_index
== pes
->total_size
+ 6) {
925 new_pes_packet(pes
, ts
->pkt
);
937 static PESContext
*add_pes_stream(MpegTSContext
*ts
, int pid
, int pcr_pid
)
942 /* if no pid found, then add a pid context */
943 pes
= av_mallocz(sizeof(PESContext
));
947 pes
->stream
= ts
->stream
;
949 pes
->pcr_pid
= pcr_pid
;
950 pes
->state
= MPEGTS_SKIP
;
951 pes
->pts
= AV_NOPTS_VALUE
;
952 pes
->dts
= AV_NOPTS_VALUE
;
953 tss
= mpegts_open_pes_filter(ts
, pid
, mpegts_push_data
, pes
);
966 Mp4Descr
*active_descr
;
970 } MP4DescrParseContext
;
972 static int init_MP4DescrParseContext(
973 MP4DescrParseContext
*d
, AVFormatContext
*s
, const uint8_t *buf
,
974 unsigned size
, Mp4Descr
*descr
, int max_descr_count
)
978 return AVERROR_INVALIDDATA
;
980 if ((ret
= ffio_init_context(&d
->pb
, (unsigned char*)buf
, size
, 0,
981 NULL
, NULL
, NULL
, NULL
)) < 0)
988 d
->active_descr
= NULL
;
989 d
->max_descr_count
= max_descr_count
;
994 static void update_offsets(AVIOContext
*pb
, int64_t *off
, int *len
) {
995 int64_t new_off
= avio_tell(pb
);
996 (*len
) -= new_off
- *off
;
1000 static int parse_mp4_descr(MP4DescrParseContext
*d
, int64_t off
, int len
,
1003 static int parse_mp4_descr_arr(MP4DescrParseContext
*d
, int64_t off
, int len
)
1006 if (parse_mp4_descr(d
, off
, len
, 0) < 0)
1008 update_offsets(&d
->pb
, &off
, &len
);
1013 static int parse_MP4IODescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1015 avio_rb16(&d
->pb
); // ID
1021 update_offsets(&d
->pb
, &off
, &len
);
1022 return parse_mp4_descr_arr(d
, off
, len
);
1025 static int parse_MP4ODescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1030 id_flags
= avio_rb16(&d
->pb
);
1031 if (!(id_flags
& 0x0020)) { //URL_Flag
1032 update_offsets(&d
->pb
, &off
, &len
);
1033 return parse_mp4_descr_arr(d
, off
, len
); //ES_Descriptor[]
1039 static int parse_MP4ESDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1042 if (d
->descr_count
>= d
->max_descr_count
)
1044 ff_mp4_parse_es_descr(&d
->pb
, &es_id
);
1045 d
->active_descr
= d
->descr
+ (d
->descr_count
++);
1047 d
->active_descr
->es_id
= es_id
;
1048 update_offsets(&d
->pb
, &off
, &len
);
1049 parse_mp4_descr(d
, off
, len
, MP4DecConfigDescrTag
);
1050 update_offsets(&d
->pb
, &off
, &len
);
1052 parse_mp4_descr(d
, off
, len
, MP4SLDescrTag
);
1053 d
->active_descr
= NULL
;
1057 static int parse_MP4DecConfigDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1059 Mp4Descr
*descr
= d
->active_descr
;
1062 d
->active_descr
->dec_config_descr
= av_malloc(len
);
1063 if (!descr
->dec_config_descr
)
1064 return AVERROR(ENOMEM
);
1065 descr
->dec_config_descr_len
= len
;
1066 avio_read(&d
->pb
, descr
->dec_config_descr
, len
);
1070 static int parse_MP4SLDescrTag(MP4DescrParseContext
*d
, int64_t off
, int len
)
1072 Mp4Descr
*descr
= d
->active_descr
;
1077 predefined
= avio_r8(&d
->pb
);
1080 int flags
= avio_r8(&d
->pb
);
1081 descr
->sl
.use_au_start
= !!(flags
& 0x80);
1082 descr
->sl
.use_au_end
= !!(flags
& 0x40);
1083 descr
->sl
.use_rand_acc_pt
= !!(flags
& 0x20);
1084 descr
->sl
.use_padding
= !!(flags
& 0x08);
1085 descr
->sl
.use_timestamps
= !!(flags
& 0x04);
1086 descr
->sl
.use_idle
= !!(flags
& 0x02);
1087 descr
->sl
.timestamp_res
= avio_rb32(&d
->pb
);
1089 descr
->sl
.timestamp_len
= avio_r8(&d
->pb
);
1090 descr
->sl
.ocr_len
= avio_r8(&d
->pb
);
1091 descr
->sl
.au_len
= avio_r8(&d
->pb
);
1092 descr
->sl
.inst_bitrate_len
= avio_r8(&d
->pb
);
1093 lengths
= avio_rb16(&d
->pb
);
1094 descr
->sl
.degr_prior_len
= lengths
>> 12;
1095 descr
->sl
.au_seq_num_len
= (lengths
>> 7) & 0x1f;
1096 descr
->sl
.packet_seq_num_len
= (lengths
>> 2) & 0x1f;
1098 av_log_missing_feature(d
->s
, "Predefined SLConfigDescriptor\n", 0);
1103 static int parse_mp4_descr(MP4DescrParseContext
*d
, int64_t off
, int len
,
1106 int len1
= ff_mp4_read_descr(d
->s
, &d
->pb
, &tag
);
1107 update_offsets(&d
->pb
, &off
, &len
);
1108 if (len
< 0 || len1
> len
|| len1
<= 0) {
1109 av_log(d
->s
, AV_LOG_ERROR
, "Tag %x length violation new length %d bytes remaining %d\n", tag
, len1
, len
);
1113 if (d
->level
++ >= MAX_LEVEL
) {
1114 av_log(d
->s
, AV_LOG_ERROR
, "Maximum MP4 descriptor level exceeded\n");
1118 if (target_tag
&& tag
!= target_tag
) {
1119 av_log(d
->s
, AV_LOG_ERROR
, "Found tag %x expected %x\n", tag
, target_tag
);
1125 parse_MP4IODescrTag(d
, off
, len1
);
1128 parse_MP4ODescrTag(d
, off
, len1
);
1131 parse_MP4ESDescrTag(d
, off
, len1
);
1133 case MP4DecConfigDescrTag
:
1134 parse_MP4DecConfigDescrTag(d
, off
, len1
);
1137 parse_MP4SLDescrTag(d
, off
, len1
);
1143 avio_seek(&d
->pb
, off
+ len1
, SEEK_SET
);
1147 static int mp4_read_iods(AVFormatContext
*s
, const uint8_t *buf
, unsigned size
,
1148 Mp4Descr
*descr
, int *descr_count
, int max_descr_count
)
1150 MP4DescrParseContext d
;
1151 if (init_MP4DescrParseContext(&d
, s
, buf
, size
, descr
, max_descr_count
) < 0)
1154 parse_mp4_descr(&d
, avio_tell(&d
.pb
), size
, MP4IODescrTag
);
1156 *descr_count
= d
.descr_count
;
1160 static int mp4_read_od(AVFormatContext
*s
, const uint8_t *buf
, unsigned size
,
1161 Mp4Descr
*descr
, int *descr_count
, int max_descr_count
)
1163 MP4DescrParseContext d
;
1164 if (init_MP4DescrParseContext(&d
, s
, buf
, size
, descr
, max_descr_count
) < 0)
1167 parse_mp4_descr_arr(&d
, avio_tell(&d
.pb
), size
);
1169 *descr_count
= d
.descr_count
;
1173 static void m4sl_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1175 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1177 const uint8_t *p
, *p_end
;
1179 Mp4Descr mp4_descr
[MAX_MP4_DESCR_COUNT
] = {{ 0 }};
1180 int mp4_descr_count
= 0;
1182 AVFormatContext
*s
= ts
->stream
;
1184 p_end
= section
+ section_len
- 4;
1186 if (parse_section_header(&h
, &p
, p_end
) < 0)
1188 if (h
.tid
!= M4OD_TID
)
1191 mp4_read_od(s
, p
, (unsigned)(p_end
- p
), mp4_descr
, &mp4_descr_count
, MAX_MP4_DESCR_COUNT
);
1193 for (pid
= 0; pid
< NB_PID_MAX
; pid
++) {
1196 for (i
= 0; i
< mp4_descr_count
; i
++) {
1199 if (ts
->pids
[pid
]->es_id
!= mp4_descr
[i
].es_id
)
1201 if (!(ts
->pids
[pid
] && ts
->pids
[pid
]->type
== MPEGTS_PES
)) {
1202 av_log(s
, AV_LOG_ERROR
, "pid %x is not PES\n", pid
);
1205 pes
= ts
->pids
[pid
]->u
.pes_filter
.opaque
;
1211 pes
->sl
= mp4_descr
[i
].sl
;
1213 ffio_init_context(&pb
, mp4_descr
[i
].dec_config_descr
,
1214 mp4_descr
[i
].dec_config_descr_len
, 0, NULL
, NULL
, NULL
, NULL
);
1215 ff_mp4_read_dec_config_descr(s
, st
, &pb
);
1216 if (st
->codec
->codec_id
== CODEC_ID_AAC
&&
1217 st
->codec
->extradata_size
> 0)
1218 st
->need_parsing
= 0;
1219 if (st
->codec
->codec_id
== CODEC_ID_H264
&&
1220 st
->codec
->extradata_size
> 0)
1221 st
->need_parsing
= 0;
1223 if (st
->codec
->codec_id
<= CODEC_ID_NONE
) {
1224 } else if (st
->codec
->codec_id
< CODEC_ID_FIRST_AUDIO
) {
1225 st
->codec
->codec_type
= AVMEDIA_TYPE_VIDEO
;
1226 } else if (st
->codec
->codec_id
< CODEC_ID_FIRST_SUBTITLE
) {
1227 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
1228 } else if (st
->codec
->codec_id
< CODEC_ID_FIRST_UNKNOWN
) {
1229 st
->codec
->codec_type
= AVMEDIA_TYPE_SUBTITLE
;
1233 for (i
= 0; i
< mp4_descr_count
; i
++)
1234 av_free(mp4_descr
[i
].dec_config_descr
);
1237 int ff_parse_mpeg2_descriptor(AVFormatContext
*fc
, AVStream
*st
, int stream_type
,
1238 const uint8_t **pp
, const uint8_t *desc_list_end
,
1239 Mp4Descr
*mp4_descr
, int mp4_descr_count
, int pid
,
1242 const uint8_t *desc_end
;
1243 int desc_len
, desc_tag
, desc_es_id
;
1247 desc_tag
= get8(pp
, desc_list_end
);
1250 desc_len
= get8(pp
, desc_list_end
);
1253 desc_end
= *pp
+ desc_len
;
1254 if (desc_end
> desc_list_end
)
1257 av_dlog(fc
, "tag: 0x%02x len=%d\n", desc_tag
, desc_len
);
1259 if (st
->codec
->codec_id
== CODEC_ID_NONE
&&
1260 stream_type
== STREAM_TYPE_PRIVATE_DATA
)
1261 mpegts_find_stream_type(st
, desc_tag
, DESC_types
);
1264 case 0x1E: /* SL descriptor */
1265 desc_es_id
= get16(pp
, desc_end
);
1266 if (ts
&& ts
->pids
[pid
])
1267 ts
->pids
[pid
]->es_id
= desc_es_id
;
1268 for (i
= 0; i
< mp4_descr_count
; i
++)
1269 if (mp4_descr
[i
].dec_config_descr_len
&&
1270 mp4_descr
[i
].es_id
== desc_es_id
) {
1272 ffio_init_context(&pb
, mp4_descr
[i
].dec_config_descr
,
1273 mp4_descr
[i
].dec_config_descr_len
, 0, NULL
, NULL
, NULL
, NULL
);
1274 ff_mp4_read_dec_config_descr(fc
, st
, &pb
);
1275 if (st
->codec
->codec_id
== CODEC_ID_AAC
&&
1276 st
->codec
->extradata_size
> 0)
1277 st
->need_parsing
= 0;
1278 if (st
->codec
->codec_id
== CODEC_ID_MPEG4SYSTEMS
)
1279 mpegts_open_section_filter(ts
, pid
, m4sl_cb
, ts
, 1);
1282 case 0x1F: /* FMC descriptor */
1283 get16(pp
, desc_end
);
1284 if (mp4_descr_count
> 0 && st
->codec
->codec_id
== CODEC_ID_AAC_LATM
&&
1285 mp4_descr
->dec_config_descr_len
&& mp4_descr
->es_id
== pid
) {
1287 ffio_init_context(&pb
, mp4_descr
->dec_config_descr
,
1288 mp4_descr
->dec_config_descr_len
, 0, NULL
, NULL
, NULL
, NULL
);
1289 ff_mp4_read_dec_config_descr(fc
, st
, &pb
);
1290 if (st
->codec
->codec_id
== CODEC_ID_AAC
&&
1291 st
->codec
->extradata_size
> 0)
1292 st
->need_parsing
= 0;
1295 case 0x56: /* DVB teletext descriptor */
1296 language
[0] = get8(pp
, desc_end
);
1297 language
[1] = get8(pp
, desc_end
);
1298 language
[2] = get8(pp
, desc_end
);
1300 av_dict_set(&st
->metadata
, "language", language
, 0);
1302 case 0x59: /* subtitling descriptor */
1303 language
[0] = get8(pp
, desc_end
);
1304 language
[1] = get8(pp
, desc_end
);
1305 language
[2] = get8(pp
, desc_end
);
1307 /* hearing impaired subtitles detection */
1308 switch(get8(pp
, desc_end
)) {
1309 case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1310 case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1311 case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1312 case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1313 case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1314 case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1315 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
1318 if (st
->codec
->extradata
) {
1319 if (st
->codec
->extradata_size
== 4 && memcmp(st
->codec
->extradata
, *pp
, 4))
1320 av_log_ask_for_sample(fc
, "DVB sub with multiple IDs\n");
1322 st
->codec
->extradata
= av_malloc(4 + FF_INPUT_BUFFER_PADDING_SIZE
);
1323 if (st
->codec
->extradata
) {
1324 st
->codec
->extradata_size
= 4;
1325 memcpy(st
->codec
->extradata
, *pp
, 4);
1329 av_dict_set(&st
->metadata
, "language", language
, 0);
1331 case 0x0a: /* ISO 639 language descriptor */
1332 for (i
= 0; i
+ 4 <= desc_len
; i
+= 4) {
1333 language
[i
+ 0] = get8(pp
, desc_end
);
1334 language
[i
+ 1] = get8(pp
, desc_end
);
1335 language
[i
+ 2] = get8(pp
, desc_end
);
1336 language
[i
+ 3] = ',';
1337 switch (get8(pp
, desc_end
)) {
1338 case 0x01: st
->disposition
|= AV_DISPOSITION_CLEAN_EFFECTS
; break;
1339 case 0x02: st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
; break;
1340 case 0x03: st
->disposition
|= AV_DISPOSITION_VISUAL_IMPAIRED
; break;
1344 language
[i
- 1] = 0;
1345 av_dict_set(&st
->metadata
, "language", language
, 0);
1348 case 0x05: /* registration descriptor */
1349 st
->codec
->codec_tag
= bytestream_get_le32(pp
);
1350 av_dlog(fc
, "reg_desc=%.4s\n", (char*)&st
->codec
->codec_tag
);
1351 if (st
->codec
->codec_id
== CODEC_ID_NONE
&&
1352 stream_type
== STREAM_TYPE_PRIVATE_DATA
)
1353 mpegts_find_stream_type(st
, st
->codec
->codec_tag
, REGD_types
);
1362 static void pmt_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1364 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1365 SectionHeader h1
, *h
= &h1
;
1368 const uint8_t *p
, *p_end
, *desc_list_end
;
1369 int program_info_length
, pcr_pid
, pid
, stream_type
;
1371 uint32_t prog_reg_desc
= 0; /* registration descriptor */
1373 Mp4Descr mp4_descr
[MAX_MP4_DESCR_COUNT
] = {{ 0 }};
1374 int mp4_descr_count
= 0;
1377 av_dlog(ts
->stream
, "PMT: len %i\n", section_len
);
1378 hex_dump_debug(ts
->stream
, (uint8_t *)section
, section_len
);
1380 p_end
= section
+ section_len
- 4;
1382 if (parse_section_header(h
, &p
, p_end
) < 0)
1385 av_dlog(ts
->stream
, "sid=0x%x sec_num=%d/%d\n",
1386 h
->id
, h
->sec_num
, h
->last_sec_num
);
1388 if (h
->tid
!= PMT_TID
)
1391 clear_program(ts
, h
->id
);
1392 pcr_pid
= get16(&p
, p_end
) & 0x1fff;
1395 add_pid_to_pmt(ts
, h
->id
, pcr_pid
);
1397 av_dlog(ts
->stream
, "pcr_pid=0x%x\n", pcr_pid
);
1399 program_info_length
= get16(&p
, p_end
) & 0xfff;
1400 if (program_info_length
< 0)
1402 while(program_info_length
>= 2) {
1404 tag
= get8(&p
, p_end
);
1405 len
= get8(&p
, p_end
);
1407 av_dlog(ts
->stream
, "program tag: 0x%02x len=%d\n", tag
, len
);
1409 if(len
> program_info_length
- 2)
1410 //something else is broken, exit the program_descriptors_loop
1412 program_info_length
-= len
+ 2;
1413 if (tag
== 0x1d) { // IOD descriptor
1414 get8(&p
, p_end
); // scope
1415 get8(&p
, p_end
); // label
1417 mp4_read_iods(ts
->stream
, p
, len
, mp4_descr
+ mp4_descr_count
,
1418 &mp4_descr_count
, MAX_MP4_DESCR_COUNT
);
1419 } else if (tag
== 0x05 && len
>= 4) { // registration descriptor
1420 prog_reg_desc
= bytestream_get_le32(&p
);
1425 p
+= program_info_length
;
1429 // stop parsing after pmt, we found header
1430 if (!ts
->stream
->nb_streams
)
1436 stream_type
= get8(&p
, p_end
);
1437 if (stream_type
< 0)
1439 pid
= get16(&p
, p_end
) & 0x1fff;
1443 /* now create stream */
1444 if (ts
->pids
[pid
] && ts
->pids
[pid
]->type
== MPEGTS_PES
) {
1445 pes
= ts
->pids
[pid
]->u
.pes_filter
.opaque
;
1447 pes
->st
= avformat_new_stream(pes
->stream
, NULL
);
1448 pes
->st
->id
= pes
->pid
;
1451 } else if (stream_type
!= 0x13) {
1452 if (ts
->pids
[pid
]) mpegts_close_filter(ts
, ts
->pids
[pid
]); //wrongly added sdt filter probably
1453 pes
= add_pes_stream(ts
, pid
, pcr_pid
);
1455 st
= avformat_new_stream(pes
->stream
, NULL
);
1459 int idx
= ff_find_stream_index(ts
->stream
, pid
);
1461 st
= ts
->stream
->streams
[idx
];
1463 st
= avformat_new_stream(pes
->stream
, NULL
);
1465 st
->codec
->codec_type
= AVMEDIA_TYPE_DATA
;
1472 if (pes
&& !pes
->stream_type
)
1473 mpegts_set_stream_info(st
, pes
, stream_type
, prog_reg_desc
);
1475 add_pid_to_pmt(ts
, h
->id
, pid
);
1477 ff_program_add_stream_index(ts
->stream
, h
->id
, st
->index
);
1479 desc_list_len
= get16(&p
, p_end
) & 0xfff;
1480 if (desc_list_len
< 0)
1482 desc_list_end
= p
+ desc_list_len
;
1483 if (desc_list_end
> p_end
)
1486 if (ff_parse_mpeg2_descriptor(ts
->stream
, st
, stream_type
, &p
, desc_list_end
,
1487 mp4_descr
, mp4_descr_count
, pid
, ts
) < 0)
1490 if (pes
&& prog_reg_desc
== AV_RL32("HDMV") && stream_type
== 0x83 && pes
->sub_st
) {
1491 ff_program_add_stream_index(ts
->stream
, h
->id
, pes
->sub_st
->index
);
1492 pes
->sub_st
->codec
->codec_tag
= st
->codec
->codec_tag
;
1499 for (i
= 0; i
< mp4_descr_count
; i
++)
1500 av_free(mp4_descr
[i
].dec_config_descr
);
1503 static void pat_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1505 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1506 SectionHeader h1
, *h
= &h1
;
1507 const uint8_t *p
, *p_end
;
1510 av_dlog(ts
->stream
, "PAT:\n");
1511 hex_dump_debug(ts
->stream
, (uint8_t *)section
, section_len
);
1513 p_end
= section
+ section_len
- 4;
1515 if (parse_section_header(h
, &p
, p_end
) < 0)
1517 if (h
->tid
!= PAT_TID
)
1522 sid
= get16(&p
, p_end
);
1525 pmt_pid
= get16(&p
, p_end
) & 0x1fff;
1529 av_dlog(ts
->stream
, "sid=0x%x pid=0x%x\n", sid
, pmt_pid
);
1531 if (sid
== 0x0000) {
1534 av_new_program(ts
->stream
, sid
);
1535 if (ts
->pids
[pmt_pid
])
1536 mpegts_close_filter(ts
, ts
->pids
[pmt_pid
]);
1537 mpegts_open_section_filter(ts
, pmt_pid
, pmt_cb
, ts
, 1);
1538 add_pat_entry(ts
, sid
);
1539 add_pid_to_pmt(ts
, sid
, 0); //add pat pid to program
1540 add_pid_to_pmt(ts
, sid
, pmt_pid
);
1545 static void sdt_cb(MpegTSFilter
*filter
, const uint8_t *section
, int section_len
)
1547 MpegTSContext
*ts
= filter
->u
.section_filter
.opaque
;
1548 SectionHeader h1
, *h
= &h1
;
1549 const uint8_t *p
, *p_end
, *desc_list_end
, *desc_end
;
1550 int onid
, val
, sid
, desc_list_len
, desc_tag
, desc_len
, service_type
;
1551 char *name
, *provider_name
;
1553 av_dlog(ts
->stream
, "SDT:\n");
1554 hex_dump_debug(ts
->stream
, (uint8_t *)section
, section_len
);
1556 p_end
= section
+ section_len
- 4;
1558 if (parse_section_header(h
, &p
, p_end
) < 0)
1560 if (h
->tid
!= SDT_TID
)
1562 onid
= get16(&p
, p_end
);
1565 val
= get8(&p
, p_end
);
1569 sid
= get16(&p
, p_end
);
1572 val
= get8(&p
, p_end
);
1575 desc_list_len
= get16(&p
, p_end
) & 0xfff;
1576 if (desc_list_len
< 0)
1578 desc_list_end
= p
+ desc_list_len
;
1579 if (desc_list_end
> p_end
)
1582 desc_tag
= get8(&p
, desc_list_end
);
1585 desc_len
= get8(&p
, desc_list_end
);
1586 desc_end
= p
+ desc_len
;
1587 if (desc_end
> desc_list_end
)
1590 av_dlog(ts
->stream
, "tag: 0x%02x len=%d\n",
1591 desc_tag
, desc_len
);
1595 service_type
= get8(&p
, p_end
);
1596 if (service_type
< 0)
1598 provider_name
= getstr8(&p
, p_end
);
1601 name
= getstr8(&p
, p_end
);
1603 AVProgram
*program
= av_new_program(ts
->stream
, sid
);
1605 av_dict_set(&program
->metadata
, "service_name", name
, 0);
1606 av_dict_set(&program
->metadata
, "service_provider", provider_name
, 0);
1610 av_free(provider_name
);
1621 /* handle one TS packet */
1622 static int handle_packet(MpegTSContext
*ts
, const uint8_t *packet
)
1624 AVFormatContext
*s
= ts
->stream
;
1626 int len
, pid
, cc
, expected_cc
, cc_ok
, afc
, is_start
, is_discontinuity
,
1627 has_adaptation
, has_payload
;
1628 const uint8_t *p
, *p_end
;
1631 pid
= AV_RB16(packet
+ 1) & 0x1fff;
1632 if(pid
&& discard_pid(ts
, pid
))
1634 is_start
= packet
[1] & 0x40;
1635 tss
= ts
->pids
[pid
];
1636 if (ts
->auto_guess
&& tss
== NULL
&& is_start
) {
1637 add_pes_stream(ts
, pid
, -1);
1638 tss
= ts
->pids
[pid
];
1643 afc
= (packet
[3] >> 4) & 3;
1644 if (afc
== 0) /* reserved value */
1646 has_adaptation
= afc
& 2;
1647 has_payload
= afc
& 1;
1648 is_discontinuity
= has_adaptation
1649 && packet
[4] != 0 /* with length > 0 */
1650 && (packet
[5] & 0x80); /* and discontinuity indicated */
1652 /* continuity check (currently not used) */
1653 cc
= (packet
[3] & 0xf);
1654 expected_cc
= has_payload ?
(tss
->last_cc
+ 1) & 0x0f : tss
->last_cc
;
1655 cc_ok
= pid
== 0x1FFF // null packet PID
1658 || expected_cc
== cc
;
1662 av_log(ts
->stream
, AV_LOG_WARNING
,
1663 "Continuity check failed for pid %d expected %d got %d\n",
1664 pid
, expected_cc
, cc
);
1665 if(tss
->type
== MPEGTS_PES
) {
1666 PESContext
*pc
= tss
->u
.pes_filter
.opaque
;
1667 pc
->flags
|= AV_PKT_FLAG_CORRUPT
;
1674 if (has_adaptation
) {
1675 /* skip adaptation field */
1678 /* if past the end of packet, ignore */
1679 p_end
= packet
+ TS_PACKET_SIZE
;
1683 pos
= avio_tell(ts
->stream
->pb
);
1684 ts
->pos47
= pos
% ts
->raw_packet_size
;
1686 if (tss
->type
== MPEGTS_SECTION
) {
1688 /* pointer field present */
1690 if (p
+ len
> p_end
)
1693 /* write remaining section bytes */
1694 write_section_data(s
, tss
,
1696 /* check whether filter has been closed */
1702 write_section_data(s
, tss
,
1707 write_section_data(s
, tss
,
1713 // Note: The position here points actually behind the current packet.
1714 if ((ret
= tss
->u
.pes_filter
.pes_cb(tss
, p
, p_end
- p
, is_start
,
1715 pos
- ts
->raw_packet_size
)) < 0)
1722 /* XXX: try to find a better synchro over several packets (use
1723 get_packet_size() ?) */
1724 static int mpegts_resync(AVFormatContext
*s
)
1726 AVIOContext
*pb
= s
->pb
;
1729 for(i
= 0;i
< MAX_RESYNC_SIZE
; i
++) {
1731 if (pb
->eof_reached
)
1734 avio_seek(pb
, -1, SEEK_CUR
);
1738 av_log(s
, AV_LOG_ERROR
, "max resync size reached, could not find sync byte\n");
1743 /* return -1 if error or EOF. Return 0 if OK. */
1744 static int read_packet(AVFormatContext
*s
, uint8_t *buf
, int raw_packet_size
)
1746 AVIOContext
*pb
= s
->pb
;
1750 len
= avio_read(pb
, buf
, TS_PACKET_SIZE
);
1751 if (len
!= TS_PACKET_SIZE
)
1752 return len
< 0 ? len
: AVERROR_EOF
;
1753 /* check packet sync byte */
1754 if (buf
[0] != 0x47) {
1755 /* find a new packet start */
1756 avio_seek(pb
, -TS_PACKET_SIZE
, SEEK_CUR
);
1757 if (mpegts_resync(s
) < 0)
1758 return AVERROR(EAGAIN
);
1762 skip
= raw_packet_size
- TS_PACKET_SIZE
;
1764 avio_skip(pb
, skip
);
1771 static int handle_packets(MpegTSContext
*ts
, int nb_packets
)
1773 AVFormatContext
*s
= ts
->stream
;
1774 uint8_t packet
[TS_PACKET_SIZE
];
1775 int packet_num
, ret
= 0;
1777 if (avio_tell(s
->pb
) != ts
->last_pos
) {
1779 av_dlog(ts
->stream
, "Skipping after seek\n");
1780 /* seek detected, flush pes buffer */
1781 for (i
= 0; i
< NB_PID_MAX
; i
++) {
1783 if (ts
->pids
[i
]->type
== MPEGTS_PES
) {
1784 PESContext
*pes
= ts
->pids
[i
]->u
.pes_filter
.opaque
;
1785 av_freep(&pes
->buffer
);
1786 pes
->data_index
= 0;
1787 pes
->state
= MPEGTS_SKIP
; /* skip until pes header */
1789 ts
->pids
[i
]->last_cc
= -1;
1797 if (ts
->stop_parse
>0)
1800 if (nb_packets
!= 0 && packet_num
>= nb_packets
)
1802 ret
= read_packet(s
, packet
, ts
->raw_packet_size
);
1805 ret
= handle_packet(ts
, packet
);
1809 ts
->last_pos
= avio_tell(s
->pb
);
1813 static int mpegts_probe(AVProbeData
*p
)
1816 const int size
= p
->buf_size
;
1817 int score
, fec_score
, dvhs_score
;
1818 int check_count
= size
/ TS_FEC_PACKET_SIZE
;
1819 #define CHECK_COUNT 10
1821 if (check_count
< CHECK_COUNT
)
1824 score
= analyze(p
->buf
, TS_PACKET_SIZE
*check_count
, TS_PACKET_SIZE
, NULL
)*CHECK_COUNT
/check_count
;
1825 dvhs_score
= analyze(p
->buf
, TS_DVHS_PACKET_SIZE
*check_count
, TS_DVHS_PACKET_SIZE
, NULL
)*CHECK_COUNT
/check_count
;
1826 fec_score
= analyze(p
->buf
, TS_FEC_PACKET_SIZE
*check_count
, TS_FEC_PACKET_SIZE
, NULL
)*CHECK_COUNT
/check_count
;
1827 // av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score);
1829 // we need a clear definition for the returned score otherwise things will become messy sooner or later
1830 if (score
> fec_score
&& score
> dvhs_score
&& score
> 6) return AVPROBE_SCORE_MAX
+ score
- CHECK_COUNT
;
1831 else if(dvhs_score
> score
&& dvhs_score
> fec_score
&& dvhs_score
> 6) return AVPROBE_SCORE_MAX
+ dvhs_score
- CHECK_COUNT
;
1832 else if( fec_score
> 6) return AVPROBE_SCORE_MAX
+ fec_score
- CHECK_COUNT
;
1835 /* only use the extension for safer guess */
1836 if (av_match_ext(p
->filename
, "ts"))
1837 return AVPROBE_SCORE_MAX
;
1843 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
1844 (-1) if not available */
1845 static int parse_pcr(int64_t *ppcr_high
, int *ppcr_low
,
1846 const uint8_t *packet
)
1848 int afc
, len
, flags
;
1852 afc
= (packet
[3] >> 4) & 3;
1862 if (!(flags
& 0x10))
1867 *ppcr_high
= ((int64_t)v
<< 1) | (p
[4] >> 7);
1868 *ppcr_low
= ((p
[4] & 1) << 8) | p
[5];
1872 static int mpegts_read_header(AVFormatContext
*s
,
1873 AVFormatParameters
*ap
)
1875 MpegTSContext
*ts
= s
->priv_data
;
1876 AVIOContext
*pb
= s
->pb
;
1877 uint8_t buf
[5*1024];
1881 /* read the first 1024 bytes to get packet size */
1882 pos
= avio_tell(pb
);
1883 len
= avio_read(pb
, buf
, sizeof(buf
));
1884 if (len
!= sizeof(buf
))
1886 ts
->raw_packet_size
= get_packet_size(buf
, sizeof(buf
));
1887 if (ts
->raw_packet_size
<= 0)
1892 if (s
->iformat
== &ff_mpegts_demuxer
) {
1895 /* first do a scan to get all the services */
1896 if (pb
->seekable
&& avio_seek(pb
, pos
, SEEK_SET
) < 0)
1897 av_log(s
, AV_LOG_ERROR
, "Unable to seek back to the start\n");
1899 mpegts_open_section_filter(ts
, SDT_PID
, sdt_cb
, ts
, 1);
1901 mpegts_open_section_filter(ts
, PAT_PID
, pat_cb
, ts
, 1);
1903 handle_packets(ts
, s
->probesize
/ ts
->raw_packet_size
);
1904 /* if could not find service, enable auto_guess */
1908 av_dlog(ts
->stream
, "tuning done\n");
1910 s
->ctx_flags
|= AVFMTCTX_NOHEADER
;
1913 int pcr_pid
, pid
, nb_packets
, nb_pcrs
, ret
, pcr_l
;
1914 int64_t pcrs
[2], pcr_h
;
1915 int packet_count
[2];
1916 uint8_t packet
[TS_PACKET_SIZE
];
1918 /* only read packets */
1920 st
= avformat_new_stream(s
, NULL
);
1923 avpriv_set_pts_info(st
, 60, 1, 27000000);
1924 st
->codec
->codec_type
= AVMEDIA_TYPE_DATA
;
1925 st
->codec
->codec_id
= CODEC_ID_MPEG2TS
;
1927 /* we iterate until we find two PCRs to estimate the bitrate */
1932 ret
= read_packet(s
, packet
, ts
->raw_packet_size
);
1935 pid
= AV_RB16(packet
+ 1) & 0x1fff;
1936 if ((pcr_pid
== -1 || pcr_pid
== pid
) &&
1937 parse_pcr(&pcr_h
, &pcr_l
, packet
) == 0) {
1939 packet_count
[nb_pcrs
] = nb_packets
;
1940 pcrs
[nb_pcrs
] = pcr_h
* 300 + pcr_l
;
1948 /* NOTE1: the bitrate is computed without the FEC */
1949 /* NOTE2: it is only the bitrate of the start of the stream */
1950 ts
->pcr_incr
= (pcrs
[1] - pcrs
[0]) / (packet_count
[1] - packet_count
[0]);
1951 ts
->cur_pcr
= pcrs
[0] - ts
->pcr_incr
* packet_count
[0];
1952 s
->bit_rate
= (TS_PACKET_SIZE
* 8) * 27e6
/ ts
->pcr_incr
;
1953 st
->codec
->bit_rate
= s
->bit_rate
;
1954 st
->start_time
= ts
->cur_pcr
;
1955 av_dlog(ts
->stream
, "start=%0.3f pcr=%0.3f incr=%d\n",
1956 st
->start_time
/ 1000000.0, pcrs
[0] / 27e6
, ts
->pcr_incr
);
1959 avio_seek(pb
, pos
, SEEK_SET
);
1965 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
1967 static int mpegts_raw_read_packet(AVFormatContext
*s
,
1970 MpegTSContext
*ts
= s
->priv_data
;
1972 int64_t pcr_h
, next_pcr_h
, pos
;
1973 int pcr_l
, next_pcr_l
;
1974 uint8_t pcr_buf
[12];
1976 if (av_new_packet(pkt
, TS_PACKET_SIZE
) < 0)
1977 return AVERROR(ENOMEM
);
1978 pkt
->pos
= avio_tell(s
->pb
);
1979 ret
= read_packet(s
, pkt
->data
, ts
->raw_packet_size
);
1981 av_free_packet(pkt
);
1984 if (ts
->mpeg2ts_compute_pcr
) {
1985 /* compute exact PCR for each packet */
1986 if (parse_pcr(&pcr_h
, &pcr_l
, pkt
->data
) == 0) {
1987 /* we read the next PCR (XXX: optimize it by using a bigger buffer */
1988 pos
= avio_tell(s
->pb
);
1989 for(i
= 0; i
< MAX_PACKET_READAHEAD
; i
++) {
1990 avio_seek(s
->pb
, pos
+ i
* ts
->raw_packet_size
, SEEK_SET
);
1991 avio_read(s
->pb
, pcr_buf
, 12);
1992 if (parse_pcr(&next_pcr_h
, &next_pcr_l
, pcr_buf
) == 0) {
1993 /* XXX: not precise enough */
1994 ts
->pcr_incr
= ((next_pcr_h
- pcr_h
) * 300 + (next_pcr_l
- pcr_l
)) /
1999 avio_seek(s
->pb
, pos
, SEEK_SET
);
2000 /* no next PCR found: we use previous increment */
2001 ts
->cur_pcr
= pcr_h
* 300 + pcr_l
;
2003 pkt
->pts
= ts
->cur_pcr
;
2004 pkt
->duration
= ts
->pcr_incr
;
2005 ts
->cur_pcr
+= ts
->pcr_incr
;
2007 pkt
->stream_index
= 0;
2011 static int mpegts_read_packet(AVFormatContext
*s
,
2014 MpegTSContext
*ts
= s
->priv_data
;
2018 ret
= handle_packets(ts
, 0);
2020 /* flush pes data left */
2021 for (i
= 0; i
< NB_PID_MAX
; i
++) {
2022 if (ts
->pids
[i
] && ts
->pids
[i
]->type
== MPEGTS_PES
) {
2023 PESContext
*pes
= ts
->pids
[i
]->u
.pes_filter
.opaque
;
2024 if (pes
->state
== MPEGTS_PAYLOAD
&& pes
->data_index
> 0) {
2025 new_pes_packet(pes
, pkt
);
2026 pes
->state
= MPEGTS_SKIP
;
2037 static int mpegts_read_close(AVFormatContext
*s
)
2039 MpegTSContext
*ts
= s
->priv_data
;
2044 for(i
=0;i
<NB_PID_MAX
;i
++)
2045 if (ts
->pids
[i
]) mpegts_close_filter(ts
, ts
->pids
[i
]);
2050 static int64_t mpegts_get_pcr(AVFormatContext
*s
, int stream_index
,
2051 int64_t *ppos
, int64_t pos_limit
)
2053 MpegTSContext
*ts
= s
->priv_data
;
2054 int64_t pos
, timestamp
;
2055 uint8_t buf
[TS_PACKET_SIZE
];
2056 int pcr_l
, pcr_pid
= ((PESContext
*)s
->streams
[stream_index
]->priv_data
)->pcr_pid
;
2057 const int find_next
= 1;
2058 pos
= ((*ppos
+ ts
->raw_packet_size
- 1 - ts
->pos47
) / ts
->raw_packet_size
) * ts
->raw_packet_size
+ ts
->pos47
;
2061 avio_seek(s
->pb
, pos
, SEEK_SET
);
2062 if (avio_read(s
->pb
, buf
, TS_PACKET_SIZE
) != TS_PACKET_SIZE
)
2063 return AV_NOPTS_VALUE
;
2064 if ((pcr_pid
< 0 || (AV_RB16(buf
+ 1) & 0x1fff) == pcr_pid
) &&
2065 parse_pcr(×tamp
, &pcr_l
, buf
) == 0) {
2068 pos
+= ts
->raw_packet_size
;
2072 pos
-= ts
->raw_packet_size
;
2074 return AV_NOPTS_VALUE
;
2075 avio_seek(s
->pb
, pos
, SEEK_SET
);
2076 if (avio_read(s
->pb
, buf
, TS_PACKET_SIZE
) != TS_PACKET_SIZE
)
2077 return AV_NOPTS_VALUE
;
2078 if ((pcr_pid
< 0 || (AV_RB16(buf
+ 1) & 0x1fff) == pcr_pid
) &&
2079 parse_pcr(×tamp
, &pcr_l
, buf
) == 0) {
2089 #ifdef USE_SYNCPOINT_SEARCH
2091 static int read_seek2(AVFormatContext
*s
,
2100 int64_t ts_ret
, ts_adj
;
2101 int stream_index_gen_search
;
2103 AVParserState
*backup
;
2105 backup
= ff_store_parser_state(s
);
2107 // detect direction of seeking for search purposes
2108 flags
|= (target_ts
- min_ts
> (uint64_t)(max_ts
- target_ts
)) ?
2109 AVSEEK_FLAG_BACKWARD
: 0;
2111 if (flags
& AVSEEK_FLAG_BYTE
) {
2112 // use position directly, we will search starting from it
2115 // search for some position with good timestamp match
2116 if (stream_index
< 0) {
2117 stream_index_gen_search
= av_find_default_stream_index(s
);
2118 if (stream_index_gen_search
< 0) {
2119 ff_restore_parser_state(s
, backup
);
2123 st
= s
->streams
[stream_index_gen_search
];
2124 // timestamp for default must be expressed in AV_TIME_BASE units
2125 ts_adj
= av_rescale(target_ts
,
2127 AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
2130 stream_index_gen_search
= stream_index
;
2132 pos
= ff_gen_search(s
, stream_index_gen_search
, ts_adj
,
2136 flags
, &ts_ret
, mpegts_get_pcr
);
2138 ff_restore_parser_state(s
, backup
);
2143 // search for actual matching keyframe/starting position for all streams
2144 if (ff_gen_syncpoint_search(s
, stream_index
, pos
,
2145 min_ts
, target_ts
, max_ts
,
2147 ff_restore_parser_state(s
, backup
);
2151 ff_free_parser_state(s
, backup
);
2155 static int read_seek(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
)
2158 if (flags
& AVSEEK_FLAG_BACKWARD
) {
2159 flags
&= ~AVSEEK_FLAG_BACKWARD
;
2160 ret
= read_seek2(s
, stream_index
, INT64_MIN
, target_ts
, target_ts
, flags
);
2162 // for compatibility reasons, seek to the best-fitting timestamp
2163 ret
= read_seek2(s
, stream_index
, INT64_MIN
, target_ts
, INT64_MAX
, flags
);
2165 ret
= read_seek2(s
, stream_index
, target_ts
, target_ts
, INT64_MAX
, flags
);
2167 // for compatibility reasons, seek to the best-fitting timestamp
2168 ret
= read_seek2(s
, stream_index
, INT64_MIN
, target_ts
, INT64_MAX
, flags
);
2175 static int read_seek(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
2176 MpegTSContext
*ts
= s
->priv_data
;
2177 uint8_t buf
[TS_PACKET_SIZE
];
2180 if (ff_seek_frame_binary(s
, stream_index
, target_ts
, flags
) < 0)
2183 pos
= avio_tell(s
->pb
);
2186 avio_seek(s
->pb
, pos
, SEEK_SET
);
2187 if (avio_read(s
->pb
, buf
, TS_PACKET_SIZE
) != TS_PACKET_SIZE
)
2189 // pid = AV_RB16(buf + 1) & 0x1fff;
2190 if(buf
[1] & 0x40) break;
2191 pos
+= ts
->raw_packet_size
;
2193 avio_seek(s
->pb
, pos
, SEEK_SET
);
2200 /**************************************************************/
2201 /* parsing functions - called from other demuxers such as RTP */
2203 MpegTSContext
*ff_mpegts_parse_open(AVFormatContext
*s
)
2207 ts
= av_mallocz(sizeof(MpegTSContext
));
2210 /* no stream case, currently used by RTP */
2211 ts
->raw_packet_size
= TS_PACKET_SIZE
;
2217 /* return the consumed length if a packet was output, or -1 if no
2219 int ff_mpegts_parse_packet(MpegTSContext
*ts
, AVPacket
*pkt
,
2220 const uint8_t *buf
, int len
)
2228 if (ts
->stop_parse
>0)
2230 if (len
< TS_PACKET_SIZE
)
2232 if (buf
[0] != 0x47) {
2236 handle_packet(ts
, buf
);
2237 buf
+= TS_PACKET_SIZE
;
2238 len
-= TS_PACKET_SIZE
;
2244 void ff_mpegts_parse_close(MpegTSContext
*ts
)
2248 for(i
=0;i
<NB_PID_MAX
;i
++)
2249 av_free(ts
->pids
[i
]);
2253 AVInputFormat ff_mpegts_demuxer
= {
2255 .long_name
= NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
2256 .priv_data_size
= sizeof(MpegTSContext
),
2257 .read_probe
= mpegts_probe
,
2258 .read_header
= mpegts_read_header
,
2259 .read_packet
= mpegts_read_packet
,
2260 .read_close
= mpegts_read_close
,
2261 .read_seek
= read_seek
,
2262 .read_timestamp
= mpegts_get_pcr
,
2263 .flags
= AVFMT_SHOW_IDS
|AVFMT_TS_DISCONT
,
2264 #ifdef USE_SYNCPOINT_SEARCH
2265 .read_seek2
= read_seek2
,
2269 AVInputFormat ff_mpegtsraw_demuxer
= {
2270 .name
= "mpegtsraw",
2271 .long_name
= NULL_IF_CONFIG_SMALL("MPEG-2 raw transport stream format"),
2272 .priv_data_size
= sizeof(MpegTSContext
),
2273 .read_header
= mpegts_read_header
,
2274 .read_packet
= mpegts_raw_read_packet
,
2275 .read_close
= mpegts_read_close
,
2276 .read_seek
= read_seek
,
2277 .read_timestamp
= mpegts_get_pcr
,
2278 .flags
= AVFMT_SHOW_IDS
|AVFMT_TS_DISCONT
,
2279 #ifdef USE_SYNCPOINT_SEARCH
2280 .read_seek2
= read_seek2
,
2282 .priv_class
= &mpegtsraw_class
,