FFmpeg
mpegts.c
Go to the documentation of this file.
1 /*
2  * MPEG-2 transport stream (aka DVB) demuxer
3  * Copyright (c) 2002-2003 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 #include "config_components.h"
23 
24 #include "libavutil/buffer.h"
25 #include "libavutil/crc.h"
26 #include "libavutil/internal.h"
27 #include "libavutil/intreadwrite.h"
28 #include "libavutil/log.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/mem.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/dovi_meta.h"
34 #include "libavcodec/bytestream.h"
35 #include "libavcodec/defs.h"
36 #include "libavcodec/get_bits.h"
37 #include "libavcodec/opus/opus.h"
38 #include "avformat.h"
39 #include "mpegts.h"
40 #include "internal.h"
41 #include "avio_internal.h"
42 #include "demux.h"
43 #include "mpeg.h"
44 #include "isom.h"
45 #if CONFIG_ICONV
46 #include <iconv.h>
47 #endif
48 
49 /* maximum size in which we look for synchronization if
50  * synchronization is lost */
51 #define MAX_RESYNC_SIZE 65536
52 
53 #define MAX_MP4_DESCR_COUNT 16
54 
55 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
56  do { \
57  if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
58  (modulus) = (dividend) % (divisor); \
59  (prev_dividend) = (dividend); \
60  } while (0)
61 
62 #define PROBE_PACKET_MAX_BUF 8192
63 #define PROBE_PACKET_MARGIN 5
64 
69 };
70 
71 typedef struct MpegTSFilter MpegTSFilter;
72 
73 typedef int PESCallback (MpegTSFilter *f, const uint8_t *buf, int len,
74  int is_start, int64_t pos);
75 
76 typedef struct MpegTSPESFilter {
78  void *opaque;
80 
81 typedef void SectionCallback (MpegTSFilter *f, const uint8_t *buf, int len);
82 
83 typedef void SetServiceCallback (void *opaque, int ret);
84 
85 typedef struct MpegTSSectionFilter {
88  int last_ver;
89  unsigned crc;
90  unsigned last_crc;
91  uint8_t *section_buf;
92  unsigned int check_crc : 1;
93  unsigned int end_of_section_reached : 1;
95  void *opaque;
97 
98 struct MpegTSFilter {
99  int pid;
100  int es_id;
101  int last_cc; /* last cc code (-1 if first packet) */
103  int discard;
105  union {
108  } u;
109 };
110 
111 struct Stream {
112  int idx;
114 };
115 
116 #define MAX_STREAMS_PER_PROGRAM 128
117 #define MAX_PIDS_PER_PROGRAM (MAX_STREAMS_PER_PROGRAM + 2)
118 struct Program {
119  unsigned int id; // program id/service id
120  unsigned int nb_pids;
121  unsigned int pids[MAX_PIDS_PER_PROGRAM];
122  unsigned int nb_streams;
124 
125  /** have we found pmt for this program */
127 };
128 
130  const AVClass *class;
131  /* user data */
133  /** raw packet size, including FEC if present */
135 
137 
138  /** if true, all pids are analyzed to find streams */
140 
141  /** compute exact PCR for each transport stream packet */
143 
144  /** fix dvb teletext pts */
146 
147  int64_t cur_pcr; /**< used to estimate the exact PCR */
148  int64_t pcr_incr; /**< used to estimate the exact PCR */
149 
150  /* data needed to handle file based ts */
151  /** stop parsing loop */
153  /** packet containing Audio/Video data */
155  /** to detect seek */
157 
161 
163 
167 
168  int id;
169 
170  /******************************************/
171  /* private mpegts data */
172  /* scan context */
173  /** structure to keep track of Program->pids mapping */
174  unsigned int nb_prg;
175  struct Program *prg;
176 
178  /** filters for various streams specified by PMT + for the PAT and PMT */
181 
184 };
185 
186 #define MPEGTS_OPTIONS \
187  { "resync_size", "set size limit for looking up a new synchronization", \
188  offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, \
189  { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, \
190  { "ts_id", "transport stream id", \
191  offsetof(MpegTSContext, id), AV_OPT_TYPE_INT, \
192  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, \
193  { "ts_packetsize", "output option carrying the raw packet size", \
194  offsetof(MpegTSContext, raw_packet_size), AV_OPT_TYPE_INT, \
195  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }
196 
197 static const AVOption options[] = {
199  {"fix_teletext_pts", "try to fix pts values of dvb teletext streams", offsetof(MpegTSContext, fix_teletext_pts), AV_OPT_TYPE_BOOL,
200  {.i64 = 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
201  {"scan_all_pmts", "scan and combine all PMTs", offsetof(MpegTSContext, scan_all_pmts), AV_OPT_TYPE_BOOL,
202  {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM },
203  {"skip_unknown_pmt", "skip PMTs for programs not advertised in the PAT", offsetof(MpegTSContext, skip_unknown_pmt), AV_OPT_TYPE_BOOL,
204  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
205  {"merge_pmt_versions", "re-use streams when PMT's version/pids change", offsetof(MpegTSContext, merge_pmt_versions), AV_OPT_TYPE_BOOL,
206  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
207  {"skip_changes", "skip changing / adding streams / programs", offsetof(MpegTSContext, skip_changes), AV_OPT_TYPE_BOOL,
208  {.i64 = 0}, 0, 1, 0 },
209  {"skip_clear", "skip clearing programs", offsetof(MpegTSContext, skip_clear), AV_OPT_TYPE_BOOL,
210  {.i64 = 0}, 0, 1, 0 },
211  {"max_packet_size", "maximum size of emitted packet", offsetof(MpegTSContext, max_packet_size), AV_OPT_TYPE_INT,
212  {.i64 = 204800}, 1, INT_MAX/2, AV_OPT_FLAG_DECODING_PARAM },
213  { NULL },
214 };
215 
216 static const AVClass mpegts_class = {
217  .class_name = "mpegts demuxer",
218  .item_name = av_default_item_name,
219  .option = options,
220  .version = LIBAVUTIL_VERSION_INT,
221 };
222 
223 static const AVOption raw_options[] = {
225  { "compute_pcr", "compute exact PCR for each transport stream packet",
226  offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_BOOL,
227  { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
228  { NULL },
229 };
230 
231 static const AVClass mpegtsraw_class = {
232  .class_name = "mpegtsraw demuxer",
233  .item_name = av_default_item_name,
234  .option = raw_options,
235  .version = LIBAVUTIL_VERSION_INT,
236 };
237 
238 /* TS stream handling */
239 
246 };
247 
248 /* enough for PES header + length */
249 #define PES_START_SIZE 6
250 #define PES_HEADER_SIZE 9
251 #define MAX_PES_HEADER_SIZE (9 + 255)
252 
253 typedef struct PESContext {
254  int pid;
255  int pcr_pid; /**< if -1 then all packets containing PCR are considered */
260  AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
262  /* used to get the format */
264  int flags; /**< copied to the AVPacket flags */
268  uint8_t stream_id;
270  int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
275 } PESContext;
276 
277 extern const FFInputFormat ff_mpegts_demuxer;
278 
279 static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
280 {
281  int i;
282  for (i = 0; i < ts->nb_prg; i++) {
283  if (ts->prg[i].id == programid) {
284  return &ts->prg[i];
285  }
286  }
287  return NULL;
288 }
289 
290 static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
291 {
292  AVProgram *prg = NULL;
293  int i;
294 
295  for (i = 0; i < ts->stream->nb_programs; i++)
296  if (ts->stream->programs[i]->id == programid) {
297  prg = ts->stream->programs[i];
298  break;
299  }
300  if (!prg)
301  return;
302  prg->nb_stream_indexes = 0;
303 }
304 
305 static void clear_program(struct Program *p)
306 {
307  if (!p)
308  return;
309  p->nb_pids = 0;
310  p->nb_streams = 0;
311  p->pmt_found = 0;
312 }
313 
315 {
316  av_freep(&ts->prg);
317  ts->nb_prg = 0;
318 }
319 
320 static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
321 {
322  struct Program *p = get_program(ts, programid);
323  if (p)
324  return p;
325  if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
326  ts->nb_prg = 0;
327  return NULL;
328  }
329  p = &ts->prg[ts->nb_prg];
330  p->id = programid;
331  clear_program(p);
332  ts->nb_prg++;
333  return p;
334 }
335 
336 static void add_pid_to_program(struct Program *p, unsigned int pid)
337 {
338  int i;
339  if (!p)
340  return;
341 
342  if (p->nb_pids >= MAX_PIDS_PER_PROGRAM)
343  return;
344 
345  for (i = 0; i < p->nb_pids; i++)
346  if (p->pids[i] == pid)
347  return;
348 
349  p->pids[p->nb_pids++] = pid;
350 }
351 
352 static void update_av_program_info(AVFormatContext *s, unsigned int programid,
353  unsigned int pid, int version)
354 {
355  int i;
356  for (i = 0; i < s->nb_programs; i++) {
357  AVProgram *program = s->programs[i];
358  if (program->id == programid) {
359  int old_pcr_pid = program->pcr_pid,
360  old_version = program->pmt_version;
361  program->pcr_pid = pid;
362  program->pmt_version = version;
363 
364  if (old_version != -1 && old_version != version) {
366  "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
367  programid, old_version, version, old_pcr_pid, pid);
368  }
369  break;
370  }
371  }
372 }
373 
374 /**
375  * @brief discard_pid() decides if the pid is to be discarded according
376  * to caller's programs selection
377  * @param ts : - TS context
378  * @param pid : - pid
379  * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
380  * 0 otherwise
381  */
382 static int discard_pid(MpegTSContext *ts, unsigned int pid)
383 {
384  int i, j, k;
385  int used = 0, discarded = 0;
386  struct Program *p;
387 
388  if (pid == PAT_PID)
389  return 0;
390 
391  /* If none of the programs have .discard=AVDISCARD_ALL then there's
392  * no way we have to discard this packet */
393  for (k = 0; k < ts->stream->nb_programs; k++)
394  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
395  break;
396  if (k == ts->stream->nb_programs)
397  return 0;
398 
399  for (i = 0; i < ts->nb_prg; i++) {
400  p = &ts->prg[i];
401  for (j = 0; j < p->nb_pids; j++) {
402  if (p->pids[j] != pid)
403  continue;
404  // is program with id p->id set to be discarded?
405  for (k = 0; k < ts->stream->nb_programs; k++) {
406  if (ts->stream->programs[k]->id == p->id) {
407  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
408  discarded++;
409  else
410  used++;
411  }
412  }
413  }
414  }
415 
416  return !used && discarded;
417 }
418 
419 /**
420  * Assemble PES packets out of TS packets, and then call the "section_cb"
421  * function when they are complete.
422  */
424  const uint8_t *buf, int buf_size, int is_start)
425 {
426  MpegTSSectionFilter *tss = &tss1->u.section_filter;
427  uint8_t *cur_section_buf = NULL;
428  int len, offset;
429 
430  if (is_start) {
431  memcpy(tss->section_buf, buf, buf_size);
432  tss->section_index = buf_size;
433  tss->section_h_size = -1;
434  tss->end_of_section_reached = 0;
435  } else {
436  if (tss->end_of_section_reached)
437  return;
439  if (buf_size < len)
440  len = buf_size;
441  memcpy(tss->section_buf + tss->section_index, buf, len);
442  tss->section_index += len;
443  }
444 
445  offset = 0;
446  cur_section_buf = tss->section_buf;
447  while (cur_section_buf - tss->section_buf < MAX_SECTION_SIZE && cur_section_buf[0] != STUFFING_BYTE) {
448  /* compute section length if possible */
449  if (tss->section_h_size == -1 && tss->section_index - offset >= 3) {
450  len = (AV_RB16(cur_section_buf + 1) & 0xfff) + 3;
451  if (len > MAX_SECTION_SIZE)
452  return;
453  tss->section_h_size = len;
454  }
455 
456  if (tss->section_h_size != -1 &&
457  tss->section_index >= offset + tss->section_h_size) {
458  int crc_valid = 1;
459  tss->end_of_section_reached = 1;
460 
461  if (tss->check_crc) {
462  crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss->section_h_size);
463  if (tss->section_h_size >= 4)
464  tss->crc = AV_RB32(cur_section_buf + tss->section_h_size - 4);
465 
466  if (crc_valid) {
467  ts->crc_validity[ tss1->pid ] = 100;
468  }else if (ts->crc_validity[ tss1->pid ] > -10) {
469  ts->crc_validity[ tss1->pid ]--;
470  }else
471  crc_valid = 2;
472  }
473  if (crc_valid) {
474  tss->section_cb(tss1, cur_section_buf, tss->section_h_size);
475  if (crc_valid != 1)
476  tss->last_ver = -1;
477  }
478 
479  cur_section_buf += tss->section_h_size;
480  offset += tss->section_h_size;
481  tss->section_h_size = -1;
482  } else {
483  tss->section_h_size = -1;
484  tss->end_of_section_reached = 0;
485  break;
486  }
487  }
488 }
489 
490 static MpegTSFilter *mpegts_open_filter(MpegTSContext *ts, unsigned int pid,
491  enum MpegTSFilterType type)
492 {
494 
495  av_log(ts->stream, AV_LOG_TRACE, "Filter: pid=0x%x type=%d\n", pid, type);
496 
497  if (pid >= NB_PID_MAX || ts->pids[pid])
498  return NULL;
499  filter = av_mallocz(sizeof(MpegTSFilter));
500  if (!filter)
501  return NULL;
502  ts->pids[pid] = filter;
503 
504  filter->type = type;
505  filter->pid = pid;
506  filter->es_id = -1;
507  filter->last_cc = -1;
508  filter->last_pcr= -1;
509 
510  return filter;
511 }
512 
514  unsigned int pid,
515  SectionCallback *section_cb,
516  void *opaque,
517  int check_crc)
518 {
520  MpegTSSectionFilter *sec;
521  uint8_t *section_buf = av_mallocz(MAX_SECTION_SIZE);
522 
523  if (!section_buf)
524  return NULL;
525 
526  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_SECTION))) {
527  av_free(section_buf);
528  return NULL;
529  }
530  sec = &filter->u.section_filter;
531  sec->section_cb = section_cb;
532  sec->opaque = opaque;
533  sec->section_buf = section_buf;
534  sec->check_crc = check_crc;
535  sec->last_ver = -1;
536 
537  return filter;
538 }
539 
540 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
541  PESCallback *pes_cb,
542  void *opaque)
543 {
545  MpegTSPESFilter *pes;
546 
547  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_PES)))
548  return NULL;
549 
550  pes = &filter->u.pes_filter;
551  pes->pes_cb = pes_cb;
552  pes->opaque = opaque;
553  return filter;
554 }
555 
556 static MpegTSFilter *mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
557 {
558  return mpegts_open_filter(ts, pid, MPEGTS_PCR);
559 }
560 
562 {
563  int pid;
564 
565  pid = filter->pid;
566  if (filter->type == MPEGTS_SECTION)
567  av_freep(&filter->u.section_filter.section_buf);
568  else if (filter->type == MPEGTS_PES) {
569  PESContext *pes = filter->u.pes_filter.opaque;
570  av_buffer_unref(&pes->buffer);
571  /* referenced private data will be freed later in
572  * avformat_close_input (pes->st->priv_data == pes) */
573  if (!pes->st || pes->merged_st) {
574  av_freep(&filter->u.pes_filter.opaque);
575  }
576  }
577 
578  av_free(filter);
579  ts->pids[pid] = NULL;
580 }
581 
582 static int analyze(const uint8_t *buf, int size, int packet_size,
583  int probe)
584 {
585  int stat[TS_MAX_PACKET_SIZE];
586  int stat_all = 0;
587  int i;
588  int best_score = 0;
589 
590  memset(stat, 0, packet_size * sizeof(*stat));
591 
592  for (i = 0; i < size - 3; i++) {
593  if (buf[i] == SYNC_BYTE) {
594  int pid = AV_RB16(buf+1) & 0x1FFF;
595  int asc = buf[i + 3] & 0x30;
596  if (!probe || pid == 0x1FFF || asc) {
597  int x = i % packet_size;
598  stat[x]++;
599  stat_all++;
600  if (stat[x] > best_score) {
601  best_score = stat[x];
602  }
603  }
604  }
605  }
606 
607  return best_score - FFMAX(stat_all - 10*best_score, 0)/10;
608 }
609 
610 /* autodetect fec presence */
612 {
613  int score, fec_score, dvhs_score;
614  int margin;
615  int ret;
616 
617  /*init buffer to store stream for probing */
618  uint8_t buf[PROBE_PACKET_MAX_BUF] = {0};
619  int buf_size = 0;
620  int max_iterations = 16;
621 
622  while (buf_size < PROBE_PACKET_MAX_BUF && max_iterations--) {
623  ret = avio_read_partial(s->pb, buf + buf_size, PROBE_PACKET_MAX_BUF - buf_size);
624  if (ret < 0)
625  return AVERROR_INVALIDDATA;
626  buf_size += ret;
627 
628  score = analyze(buf, buf_size, TS_PACKET_SIZE, 0);
629  dvhs_score = analyze(buf, buf_size, TS_DVHS_PACKET_SIZE, 0);
630  fec_score = analyze(buf, buf_size, TS_FEC_PACKET_SIZE, 0);
631  av_log(s, AV_LOG_TRACE, "Probe: %d, score: %d, dvhs_score: %d, fec_score: %d \n",
632  buf_size, score, dvhs_score, fec_score);
633 
634  margin = mid_pred(score, fec_score, dvhs_score);
635 
636  if (buf_size < PROBE_PACKET_MAX_BUF)
637  margin += PROBE_PACKET_MARGIN; /*if buffer not filled */
638 
639  if (score > margin)
640  return TS_PACKET_SIZE;
641  else if (dvhs_score > margin)
642  return TS_DVHS_PACKET_SIZE;
643  else if (fec_score > margin)
644  return TS_FEC_PACKET_SIZE;
645  }
646  return AVERROR_INVALIDDATA;
647 }
648 
649 typedef struct SectionHeader {
650  uint8_t tid;
651  uint16_t id;
652  uint8_t version;
653  uint8_t current_next;
654  uint8_t sec_num;
655  uint8_t last_sec_num;
656 } SectionHeader;
657 
659 {
660  if (h->version == tssf->last_ver && tssf->last_crc == tssf->crc)
661  return 1;
662 
663  tssf->last_ver = h->version;
664  tssf->last_crc = tssf->crc;
665 
666  return 0;
667 }
668 
669 static inline int get8(const uint8_t **pp, const uint8_t *p_end)
670 {
671  const uint8_t *p;
672  int c;
673 
674  p = *pp;
675  if (p >= p_end)
676  return AVERROR_INVALIDDATA;
677  c = *p++;
678  *pp = p;
679  return c;
680 }
681 
682 static inline int get16(const uint8_t **pp, const uint8_t *p_end)
683 {
684  const uint8_t *p;
685  int c;
686 
687  p = *pp;
688  if (1 >= p_end - p)
689  return AVERROR_INVALIDDATA;
690  c = AV_RB16(p);
691  p += 2;
692  *pp = p;
693  return c;
694 }
695 
696 /* read and allocate a DVB string preceded by its length */
697 static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
698 {
699  int len;
700  const uint8_t *p;
701  char *str;
702 
703  p = *pp;
704  len = get8(&p, p_end);
705  if (len < 0)
706  return NULL;
707  if (len > p_end - p)
708  return NULL;
709 #if CONFIG_ICONV
710  if (len) {
711  const char *encodings[] = {
712  "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
713  "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11",
714  "", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "", "", "", "",
715  "", "UCS-2BE", "KSC_5601", "GB2312", "UCS-2BE", "UTF-8", "", "",
716  "", "", "", "", "", "", "", ""
717  };
718  iconv_t cd;
719  char *in, *out;
720  size_t inlen = len, outlen = inlen * 6 + 1;
721  if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0xf && p[2] != 0xc) {
722  char iso8859[12];
723  snprintf(iso8859, sizeof(iso8859), "ISO-8859-%d", p[2]);
724  inlen -= 3;
725  in = (char *)p + 3;
726  cd = iconv_open("UTF-8", iso8859);
727  } else if (p[0] < 0x20) {
728  inlen -= 1;
729  in = (char *)p + 1;
730  cd = iconv_open("UTF-8", encodings[*p]);
731  } else {
732  in = (char *)p;
733  cd = iconv_open("UTF-8", encodings[0]);
734  }
735  if (cd == (iconv_t)-1)
736  goto no_iconv;
737  str = out = av_malloc(outlen);
738  if (!str) {
739  iconv_close(cd);
740  return NULL;
741  }
742  if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
743  iconv_close(cd);
744  av_freep(&str);
745  goto no_iconv;
746  }
747  iconv_close(cd);
748  *out = 0;
749  *pp = p + len;
750  return str;
751  }
752 no_iconv:
753 #endif
754  str = av_malloc(len + 1);
755  if (!str)
756  return NULL;
757  memcpy(str, p, len);
758  str[len] = '\0';
759  p += len;
760  *pp = p;
761  return str;
762 }
763 
765  const uint8_t **pp, const uint8_t *p_end)
766 {
767  int val;
768 
769  val = get8(pp, p_end);
770  if (val < 0)
771  return val;
772  h->tid = val;
773  *pp += 2;
774  val = get16(pp, p_end);
775  if (val < 0)
776  return val;
777  h->id = val;
778  val = get8(pp, p_end);
779  if (val < 0)
780  return val;
781  h->version = (val >> 1) & 0x1f;
782  h->current_next = val & 0x01;
783  val = get8(pp, p_end);
784  if (val < 0)
785  return val;
786  h->sec_num = val;
787  val = get8(pp, p_end);
788  if (val < 0)
789  return val;
790  h->last_sec_num = val;
791  return 0;
792 }
793 
794 typedef struct StreamType {
795  uint32_t stream_type;
798 } StreamType;
799 
800 static const StreamType ISO_types[] = {
807  /* Makito encoder sets stream type 0x11 for AAC,
808  * so auto-detect LOAS/LATM instead of hardcoding it. */
809 #if !CONFIG_LOAS_DEMUXER
811 #endif
823  { 0 },
824 };
825 
826 static const StreamType HDMV_types[] = {
838  { 0 },
839 };
840 
841 /* SCTE types */
842 static const StreamType SCTE_types[] = {
844  { 0 },
845 };
846 
847 /* ATSC ? */
848 static const StreamType MISC_types[] = {
852  { 0 },
853 };
854 
855 /* HLS Sample Encryption Types */
861  { 0 },
862 };
863 
864 static const StreamType REGD_types[] = {
865  { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
866  { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
867  { MKTAG('A', 'C', '-', '4'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC4 },
868  { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
869  { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
870  { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
871  { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
872  { MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
873  { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
874  { MKTAG('V', 'V', 'C', ' '), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VVC },
875  { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
876  { MKTAG('V', 'A', 'N', 'C'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_2038 },
877  { MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
878  { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
879  { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_OPUS },
880  { 0 },
881 };
882 
883 static const StreamType METADATA_types[] = {
884  { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
885  { MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
886  { 0 },
887 };
888 
889 /* descriptor present */
890 static const StreamType DESC_types[] = {
896  { 0 },
897 };
898 
900  uint32_t stream_type,
901  const StreamType *types)
902 {
903  FFStream *const sti = ffstream(st);
904  for (; types->stream_type; types++)
905  if (stream_type == types->stream_type) {
906  if (st->codecpar->codec_type != types->codec_type ||
907  st->codecpar->codec_id != types->codec_id) {
908  st->codecpar->codec_type = types->codec_type;
909  st->codecpar->codec_id = types->codec_id;
910  sti->need_context_update = 1;
911  }
912  sti->request_probe = 0;
913  return;
914  }
915 }
916 
918  uint32_t stream_type, uint32_t prog_reg_desc)
919 {
920  FFStream *const sti = ffstream(st);
921  int old_codec_type = st->codecpar->codec_type;
922  int old_codec_id = st->codecpar->codec_id;
923  int old_codec_tag = st->codecpar->codec_tag;
924 
925  avpriv_set_pts_info(st, 33, 1, 90000);
926  st->priv_data = pes;
930  pes->st = st;
931  pes->stream_type = stream_type;
932 
933  av_log(pes->stream, AV_LOG_DEBUG,
934  "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
935  st->index, pes->stream_type, pes->pid, (char *)&prog_reg_desc);
936 
937  st->codecpar->codec_tag = pes->stream_type;
938 
941  sti->request_probe = 50;
942  if ((prog_reg_desc == AV_RL32("HDMV") ||
943  prog_reg_desc == AV_RL32("HDPR")) &&
947  // HDMV TrueHD streams also contain an AC3 coded version of the
948  // audio track - add a second stream for this
949  AVStream *sub_st;
950  // priv_data cannot be shared between streams
951  PESContext *sub_pes = av_memdup(pes, sizeof(*sub_pes));
952  if (!sub_pes)
953  return AVERROR(ENOMEM);
954 
955  sub_st = avformat_new_stream(pes->stream, NULL);
956  if (!sub_st) {
957  av_free(sub_pes);
958  return AVERROR(ENOMEM);
959  }
960 
961  sub_st->id = pes->pid;
962  avpriv_set_pts_info(sub_st, 33, 1, 90000);
963  sub_st->priv_data = sub_pes;
965  sub_st->codecpar->codec_id = AV_CODEC_ID_AC3;
967  sub_pes->sub_st = pes->sub_st = sub_st;
968  }
969  }
970  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
972  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
974  if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
975  st->codecpar->codec_id = old_codec_id;
976  st->codecpar->codec_type = old_codec_type;
977  }
978  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE ||
979  (sti->request_probe > 0 && sti->request_probe < AVPROBE_SCORE_STREAM_RETRY / 5)) &&
980  sti->probe_packets > 0 &&
981  stream_type == STREAM_TYPE_PRIVATE_DATA) {
985  }
986 
987  /* queue a context update if properties changed */
988  if (old_codec_type != st->codecpar->codec_type ||
989  old_codec_id != st->codecpar->codec_id ||
990  old_codec_tag != st->codecpar->codec_tag)
991  sti->need_context_update = 1;
992 
993  return 0;
994 }
995 
997 {
998  pes->pts = AV_NOPTS_VALUE;
999  pes->dts = AV_NOPTS_VALUE;
1000  pes->data_index = 0;
1001  pes->flags = 0;
1002  av_buffer_unref(&pes->buffer);
1003 }
1004 
1005 static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
1006 {
1008  pkt->data = (uint8_t *)buffer;
1009  pkt->size = len;
1010 }
1011 
1013 {
1014  uint8_t *sd;
1015 
1017 
1018  pkt->buf = pes->buffer;
1019  pkt->data = pes->buffer->data;
1020  pkt->size = pes->data_index;
1021 
1022  if (pes->PES_packet_length &&
1023  pes->pes_header_size + pes->data_index != pes->PES_packet_length +
1024  PES_START_SIZE) {
1025  av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
1026  pes->flags |= AV_PKT_FLAG_CORRUPT;
1027  }
1028  memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1029 
1030  // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
1031  if (pes->sub_st && pes->stream_type == STREAM_TYPE_BLURAY_AUDIO_TRUEHD && pes->extended_stream_id == 0x76)
1032  pkt->stream_index = pes->sub_st->index;
1033  else
1034  pkt->stream_index = pes->st->index;
1035  pkt->pts = pes->pts;
1036  pkt->dts = pes->dts;
1037  /* store position of first TS packet of this PES packet */
1038  pkt->pos = pes->ts_packet_pos;
1039  pkt->flags = pes->flags;
1040 
1041  pes->buffer = NULL;
1043 
1045  if (!sd)
1046  return AVERROR(ENOMEM);
1047  *sd = pes->stream_id;
1048 
1049  return 0;
1050 }
1051 
1052 static uint64_t get_ts64(GetBitContext *gb, int bits)
1053 {
1054  if (get_bits_left(gb) < bits)
1055  return AV_NOPTS_VALUE;
1056  return get_bits64(gb, bits);
1057 }
1058 
1060  const uint8_t *buf, int buf_size)
1061 {
1062  GetBitContext gb;
1063  int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
1064  int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
1065  int dts_flag = -1, cts_flag = -1;
1066  int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
1067  uint8_t buf_padded[128 + AV_INPUT_BUFFER_PADDING_SIZE];
1068  int buf_padded_size = FFMIN(buf_size, sizeof(buf_padded) - AV_INPUT_BUFFER_PADDING_SIZE);
1069 
1070  memcpy(buf_padded, buf, buf_padded_size);
1071 
1072  init_get_bits(&gb, buf_padded, buf_padded_size * 8);
1073 
1074  if (sl->use_au_start)
1075  au_start_flag = get_bits1(&gb);
1076  if (sl->use_au_end)
1077  au_end_flag = get_bits1(&gb);
1078  if (!sl->use_au_start && !sl->use_au_end)
1079  au_start_flag = au_end_flag = 1;
1080  if (sl->ocr_len > 0)
1081  ocr_flag = get_bits1(&gb);
1082  if (sl->use_idle)
1083  idle_flag = get_bits1(&gb);
1084  if (sl->use_padding)
1085  padding_flag = get_bits1(&gb);
1086  if (padding_flag)
1087  padding_bits = get_bits(&gb, 3);
1088 
1089  if (!idle_flag && (!padding_flag || padding_bits != 0)) {
1090  if (sl->packet_seq_num_len)
1092  if (sl->degr_prior_len)
1093  if (get_bits1(&gb))
1094  skip_bits(&gb, sl->degr_prior_len);
1095  if (ocr_flag)
1096  skip_bits_long(&gb, sl->ocr_len);
1097  if (au_start_flag) {
1098  if (sl->use_rand_acc_pt)
1099  get_bits1(&gb);
1100  if (sl->au_seq_num_len > 0)
1101  skip_bits_long(&gb, sl->au_seq_num_len);
1102  if (sl->use_timestamps) {
1103  dts_flag = get_bits1(&gb);
1104  cts_flag = get_bits1(&gb);
1105  }
1106  }
1107  if (sl->inst_bitrate_len)
1108  inst_bitrate_flag = get_bits1(&gb);
1109  if (dts_flag == 1)
1110  dts = get_ts64(&gb, sl->timestamp_len);
1111  if (cts_flag == 1)
1112  cts = get_ts64(&gb, sl->timestamp_len);
1113  if (sl->au_len > 0)
1114  skip_bits_long(&gb, sl->au_len);
1115  if (inst_bitrate_flag)
1116  skip_bits_long(&gb, sl->inst_bitrate_len);
1117  }
1118 
1119  if (dts != AV_NOPTS_VALUE)
1120  pes->dts = dts;
1121  if (cts != AV_NOPTS_VALUE)
1122  pes->pts = cts;
1123 
1124  if (sl->timestamp_len && sl->timestamp_res)
1126 
1127  return (get_bits_count(&gb) + 7) >> 3;
1128 }
1129 
1131 {
1133  if (!ts->pools[index]) {
1134  int pool_size = FFMIN(ts->max_packet_size + AV_INPUT_BUFFER_PADDING_SIZE, 2 << index);
1135  ts->pools[index] = av_buffer_pool_init(pool_size, NULL);
1136  if (!ts->pools[index])
1137  return NULL;
1138  }
1139  return av_buffer_pool_get(ts->pools[index]);
1140 }
1141 
1142 /* return non zero if a packet could be constructed */
1144  const uint8_t *buf, int buf_size, int is_start,
1145  int64_t pos)
1146 {
1147  PESContext *pes = filter->u.pes_filter.opaque;
1148  MpegTSContext *ts = pes->ts;
1149  const uint8_t *p;
1150  int ret, len;
1151 
1152  if (!ts->pkt)
1153  return 0;
1154 
1155  if (is_start) {
1156  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
1157  ret = new_pes_packet(pes, ts->pkt);
1158  if (ret < 0)
1159  return ret;
1160  ts->stop_parse = 1;
1161  } else {
1163  }
1164  pes->state = MPEGTS_HEADER;
1165  pes->ts_packet_pos = pos;
1166  }
1167  p = buf;
1168  while (buf_size > 0) {
1169  switch (pes->state) {
1170  case MPEGTS_HEADER:
1171  len = PES_START_SIZE - pes->data_index;
1172  if (len > buf_size)
1173  len = buf_size;
1174  memcpy(pes->header + pes->data_index, p, len);
1175  pes->data_index += len;
1176  p += len;
1177  buf_size -= len;
1178  if (pes->data_index == PES_START_SIZE) {
1179  /* we got all the PES or section header. We can now
1180  * decide */
1181  if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
1182  pes->header[2] == 0x01) {
1183  /* it must be an MPEG-2 PES stream */
1184  pes->stream_id = pes->header[3];
1185  av_log(pes->stream, AV_LOG_TRACE, "pid=%x stream_id=%#x\n", pes->pid, pes->stream_id);
1186 
1187  if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
1188  (!pes->sub_st ||
1189  pes->sub_st->discard == AVDISCARD_ALL)) ||
1191  goto skip;
1192 
1193  /* stream not present in PMT */
1194  if (!pes->st) {
1195  if (ts->skip_changes)
1196  goto skip;
1197  if (ts->merge_pmt_versions)
1198  goto skip; /* wait for PMT to merge new stream */
1199 
1200  pes->st = avformat_new_stream(ts->stream, NULL);
1201  if (!pes->st)
1202  return AVERROR(ENOMEM);
1203  pes->st->id = pes->pid;
1204  mpegts_set_stream_info(pes->st, pes, 0, 0);
1205  }
1206 
1207  pes->PES_packet_length = AV_RB16(pes->header + 4);
1208  /* NOTE: zero length means the PES size is unbounded */
1209 
1212  pes->stream_id != STREAM_ID_ECM_STREAM &&
1213  pes->stream_id != STREAM_ID_EMM_STREAM &&
1217  FFStream *const pes_sti = ffstream(pes->st);
1218  pes->state = MPEGTS_PESHEADER;
1219  if (pes->st->codecpar->codec_id == AV_CODEC_ID_NONE && !pes_sti->request_probe) {
1220  av_log(pes->stream, AV_LOG_TRACE,
1221  "pid=%x stream_type=%x probing\n",
1222  pes->pid,
1223  pes->stream_type);
1224  pes_sti->request_probe = 1;
1225  }
1226  } else {
1227  pes->pes_header_size = 6;
1228  pes->state = MPEGTS_PAYLOAD;
1229  pes->data_index = 0;
1230  }
1231  } else {
1232  /* otherwise, it should be a table */
1233  /* skip packet */
1234 skip:
1235  pes->state = MPEGTS_SKIP;
1236  continue;
1237  }
1238  }
1239  break;
1240  /**********************************************/
1241  /* PES packing parsing */
1242  case MPEGTS_PESHEADER:
1243  len = PES_HEADER_SIZE - pes->data_index;
1244  if (len < 0)
1245  return AVERROR_INVALIDDATA;
1246  if (len > buf_size)
1247  len = buf_size;
1248  memcpy(pes->header + pes->data_index, p, len);
1249  pes->data_index += len;
1250  p += len;
1251  buf_size -= len;
1252  if (pes->data_index == PES_HEADER_SIZE) {
1253  pes->pes_header_size = pes->header[8] + 9;
1255  }
1256  break;
1257  case MPEGTS_PESHEADER_FILL:
1258  len = pes->pes_header_size - pes->data_index;
1259  if (len < 0)
1260  return AVERROR_INVALIDDATA;
1261  if (len > buf_size)
1262  len = buf_size;
1263  memcpy(pes->header + pes->data_index, p, len);
1264  pes->data_index += len;
1265  p += len;
1266  buf_size -= len;
1267  if (pes->data_index == pes->pes_header_size) {
1268  const uint8_t *r;
1269  unsigned int flags, pes_ext, skip;
1270 
1271  flags = pes->header[7];
1272  r = pes->header + 9;
1273  pes->pts = AV_NOPTS_VALUE;
1274  pes->dts = AV_NOPTS_VALUE;
1275  if ((flags & 0xc0) == 0x80) {
1276  pes->dts = pes->pts = ff_parse_pes_pts(r);
1277  r += 5;
1278  } else if ((flags & 0xc0) == 0xc0) {
1279  pes->pts = ff_parse_pes_pts(r);
1280  r += 5;
1281  pes->dts = ff_parse_pes_pts(r);
1282  r += 5;
1283  }
1284  pes->extended_stream_id = -1;
1285  if (flags & 0x01) { /* PES extension */
1286  pes_ext = *r++;
1287  /* Skip PES private data, program packet sequence counter and P-STD buffer */
1288  skip = (pes_ext >> 4) & 0xb;
1289  skip += skip & 0x9;
1290  r += skip;
1291  if ((pes_ext & 0x41) == 0x01 &&
1292  (r + 2) <= (pes->header + pes->pes_header_size)) {
1293  /* PES extension 2 */
1294  if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
1295  pes->extended_stream_id = r[1];
1296  }
1297  }
1298 
1299  /* we got the full header. We parse it and get the payload */
1300  pes->state = MPEGTS_PAYLOAD;
1301  pes->data_index = 0;
1302  if (pes->stream_type == STREAM_TYPE_ISO_IEC_14496_PES && buf_size > 0) {
1303  int sl_header_bytes = read_sl_header(pes, &pes->sl, p,
1304  buf_size);
1305  pes->pes_header_size += sl_header_bytes;
1306  p += sl_header_bytes;
1307  buf_size -= sl_header_bytes;
1308  }
1309  if (pes->stream_type == STREAM_TYPE_METADATA &&
1312  buf_size >= 5) {
1313  /* skip metadata access unit header - see MISB ST 1402 */
1314  pes->pes_header_size += 5;
1315  p += 5;
1316  buf_size -= 5;
1317  }
1318  if ( pes->ts->fix_teletext_pts
1321  ) {
1322  AVProgram *p = NULL;
1323  int pcr_found = 0;
1324  while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
1325  if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
1326  MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
1327  if (f) {
1328  AVStream *st = NULL;
1329  if (f->type == MPEGTS_PES) {
1330  PESContext *pcrpes = f->u.pes_filter.opaque;
1331  if (pcrpes)
1332  st = pcrpes->st;
1333  } else if (f->type == MPEGTS_PCR) {
1334  int i;
1335  for (i = 0; i < p->nb_stream_indexes; i++) {
1336  AVStream *pst = pes->stream->streams[p->stream_index[i]];
1337  if (pst->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
1338  st = pst;
1339  }
1340  }
1341  if (f->last_pcr != -1 && !f->discard) {
1342  // teletext packets do not always have correct timestamps,
1343  // the standard says they should be handled after 40.6 ms at most,
1344  // and the pcr error to this packet should be no more than 100 ms.
1345  // TODO: we should interpolate the PCR, not just use the last one
1346  int64_t pcr = f->last_pcr / SYSTEM_CLOCK_FREQUENCY_DIVISOR;
1347  pcr_found = 1;
1348  if (st) {
1349  const FFStream *const sti = ffstream(st);
1350  FFStream *const pes_sti = ffstream(pes->st);
1351 
1352  pes_sti->pts_wrap_reference = sti->pts_wrap_reference;
1353  pes_sti->pts_wrap_behavior = sti->pts_wrap_behavior;
1354  }
1355  if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
1356  pes->pts = pes->dts = pcr;
1357  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1358  pes->dts > pcr + 3654 + 9000) {
1359  pes->pts = pes->dts = pcr + 3654 + 9000;
1360  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
1361  pes->dts > pcr + 10*90000) { //10sec
1362  pes->pts = pes->dts = pcr + 3654 + 9000;
1363  }
1364  break;
1365  }
1366  }
1367  }
1368  }
1369 
1370  if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1371  !pcr_found) {
1373  "Forcing DTS/PTS to be unset for a "
1374  "non-trustworthy PES packet for PID %d as "
1375  "PCR hasn't been received yet.\n",
1376  pes->pid);
1377  pes->dts = pes->pts = AV_NOPTS_VALUE;
1378  }
1379  }
1380  }
1381  break;
1382  case MPEGTS_PAYLOAD:
1383  do {
1384  int max_packet_size = ts->max_packet_size;
1386  max_packet_size = pes->PES_packet_length + PES_START_SIZE - pes->pes_header_size;
1387 
1388  if (pes->data_index > 0 &&
1389  pes->data_index + buf_size > max_packet_size) {
1390  ret = new_pes_packet(pes, ts->pkt);
1391  if (ret < 0)
1392  return ret;
1393  pes->PES_packet_length = 0;
1394  max_packet_size = ts->max_packet_size;
1395  ts->stop_parse = 1;
1396  } else if (pes->data_index == 0 &&
1397  buf_size > max_packet_size) {
1398  // pes packet size is < ts size packet and pes data is padded with STUFFING_BYTE
1399  // not sure if this is legal in ts but see issue #2392
1400  buf_size = max_packet_size;
1401  }
1402 
1403  if (!pes->buffer) {
1404  pes->buffer = buffer_pool_get(ts, max_packet_size);
1405  if (!pes->buffer)
1406  return AVERROR(ENOMEM);
1407  }
1408 
1409  memcpy(pes->buffer->data + pes->data_index, p, buf_size);
1410  pes->data_index += buf_size;
1411  /* emit complete packets with known packet size
1412  * decreases demuxer delay for infrequent packets like subtitles from
1413  * a couple of seconds to milliseconds for properly muxed files. */
1414  if (!ts->stop_parse && pes->PES_packet_length &&
1416  ts->stop_parse = 1;
1417  ret = new_pes_packet(pes, ts->pkt);
1418  pes->state = MPEGTS_SKIP;
1419  if (ret < 0)
1420  return ret;
1421  }
1422  } while (0);
1423  buf_size = 0;
1424  break;
1425  case MPEGTS_SKIP:
1426  buf_size = 0;
1427  break;
1428  }
1429  }
1430 
1431  return 0;
1432 }
1433 
1434 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
1435 {
1436  MpegTSFilter *tss;
1437  PESContext *pes;
1438 
1439  /* if no pid found, then add a pid context */
1440  pes = av_mallocz(sizeof(PESContext));
1441  if (!pes)
1442  return 0;
1443  pes->ts = ts;
1444  pes->stream = ts->stream;
1445  pes->pid = pid;
1446  pes->pcr_pid = pcr_pid;
1447  pes->state = MPEGTS_SKIP;
1448  pes->pts = AV_NOPTS_VALUE;
1449  pes->dts = AV_NOPTS_VALUE;
1450  tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
1451  if (!tss) {
1452  av_free(pes);
1453  return 0;
1454  }
1455  return pes;
1456 }
1457 
1458 #define MAX_LEVEL 4
1459 typedef struct MP4DescrParseContext {
1466  int level;
1469 
1471  const uint8_t *buf, unsigned size,
1472  Mp4Descr *descr, int max_descr_count)
1473 {
1474  if (size > (1 << 30))
1475  return AVERROR_INVALIDDATA;
1476 
1477  ffio_init_read_context(&d->pb, buf, size);
1478 
1479  d->s = s;
1480  d->level = 0;
1481  d->descr_count = 0;
1482  d->descr = descr;
1483  d->active_descr = NULL;
1484  d->max_descr_count = max_descr_count;
1485 
1486  return 0;
1487 }
1488 
1489 static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
1490 {
1491  int64_t new_off = avio_tell(pb);
1492  (*len) -= new_off - *off;
1493  *off = new_off;
1494 }
1495 
1496 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1497  int target_tag);
1498 
1500 {
1501  while (len > 0) {
1502  int ret = parse_mp4_descr(d, off, len, 0);
1503  if (ret < 0)
1504  return ret;
1505  update_offsets(&d->pb.pub, &off, &len);
1506  }
1507  return 0;
1508 }
1509 
1511 {
1512  AVIOContext *const pb = &d->pb.pub;
1513  avio_rb16(pb); // ID
1514  avio_r8(pb);
1515  avio_r8(pb);
1516  avio_r8(pb);
1517  avio_r8(pb);
1518  avio_r8(pb);
1519  update_offsets(pb, &off, &len);
1520  return parse_mp4_descr_arr(d, off, len);
1521 }
1522 
1524 {
1525  int id_flags;
1526  if (len < 2)
1527  return 0;
1528  id_flags = avio_rb16(&d->pb.pub);
1529  if (!(id_flags & 0x0020)) { // URL_Flag
1530  update_offsets(&d->pb.pub, &off, &len);
1531  return parse_mp4_descr_arr(d, off, len); // ES_Descriptor[]
1532  } else {
1533  return 0;
1534  }
1535 }
1536 
1538 {
1539  AVIOContext *const pb = &d->pb.pub;
1540  int es_id = 0;
1541  int ret = 0;
1542 
1543  if (d->descr_count >= d->max_descr_count)
1544  return AVERROR_INVALIDDATA;
1545  ff_mp4_parse_es_descr(pb, &es_id);
1546  d->active_descr = d->descr + (d->descr_count++);
1547 
1548  d->active_descr->es_id = es_id;
1549  update_offsets(pb, &off, &len);
1550  if ((ret = parse_mp4_descr(d, off, len, MP4DecConfigDescrTag)) < 0)
1551  return ret;
1552  update_offsets(pb, &off, &len);
1553  if (len > 0)
1554  ret = parse_mp4_descr(d, off, len, MP4SLDescrTag);
1555  d->active_descr = NULL;
1556  return ret;
1557 }
1558 
1560  int len)
1561 {
1562  Mp4Descr *descr = d->active_descr;
1563  if (!descr)
1564  return AVERROR_INVALIDDATA;
1566  if (!descr->dec_config_descr)
1567  return AVERROR(ENOMEM);
1568  descr->dec_config_descr_len = len;
1569  avio_read(&d->pb.pub, descr->dec_config_descr, len);
1570  return 0;
1571 }
1572 
1574 {
1575  Mp4Descr *descr = d->active_descr;
1576  AVIOContext *const pb = &d->pb.pub;
1577  int predefined;
1578  if (!descr)
1579  return AVERROR_INVALIDDATA;
1580 
1581 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \
1582  descr->sl.dst = avio_r8(pb); \
1583  if (descr->sl.dst > maxv) { \
1584  descr->sl.dst = maxv; \
1585  return AVERROR_INVALIDDATA; \
1586  } \
1587 } while (0)
1588 
1589  predefined = avio_r8(pb);
1590  if (!predefined) {
1591  int lengths;
1592  int flags = avio_r8(pb);
1593  descr->sl.use_au_start = !!(flags & 0x80);
1594  descr->sl.use_au_end = !!(flags & 0x40);
1595  descr->sl.use_rand_acc_pt = !!(flags & 0x20);
1596  descr->sl.use_padding = !!(flags & 0x08);
1597  descr->sl.use_timestamps = !!(flags & 0x04);
1598  descr->sl.use_idle = !!(flags & 0x02);
1599  descr->sl.timestamp_res = avio_rb32(pb);
1600  avio_rb32(pb);
1601  R8_CHECK_CLIP_MAX(timestamp_len, 63);
1602  R8_CHECK_CLIP_MAX(ocr_len, 63);
1603  R8_CHECK_CLIP_MAX(au_len, 31);
1604  descr->sl.inst_bitrate_len = avio_r8(pb);
1605  lengths = avio_rb16(pb);
1606  descr->sl.degr_prior_len = lengths >> 12;
1607  descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
1608  descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
1609  } else if (!d->predefined_SLConfigDescriptor_seen){
1610  avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
1612  }
1613  return 0;
1614 }
1615 
1617  int target_tag)
1618 {
1619  int tag;
1620  AVIOContext *const pb = &d->pb.pub;
1621  int len1 = ff_mp4_read_descr(d->s, pb, &tag);
1622  int ret = 0;
1623 
1624  update_offsets(pb, &off, &len);
1625  if (len < 0 || len1 > len || len1 <= 0) {
1626  av_log(d->s, AV_LOG_ERROR,
1627  "Tag %x length violation new length %d bytes remaining %d\n",
1628  tag, len1, len);
1629  return AVERROR_INVALIDDATA;
1630  }
1631 
1632  if (d->level++ >= MAX_LEVEL) {
1633  av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
1635  goto done;
1636  }
1637 
1638  if (target_tag && tag != target_tag) {
1639  av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag,
1640  target_tag);
1642  goto done;
1643  }
1644 
1645  switch (tag) {
1646  case MP4IODescrTag:
1647  ret = parse_MP4IODescrTag(d, off, len1);
1648  break;
1649  case MP4ODescrTag:
1650  ret = parse_MP4ODescrTag(d, off, len1);
1651  break;
1652  case MP4ESDescrTag:
1653  ret = parse_MP4ESDescrTag(d, off, len1);
1654  break;
1655  case MP4DecConfigDescrTag:
1656  ret = parse_MP4DecConfigDescrTag(d, off, len1);
1657  break;
1658  case MP4SLDescrTag:
1659  ret = parse_MP4SLDescrTag(d, off, len1);
1660  break;
1661  }
1662 
1663 
1664 done:
1665  d->level--;
1666  avio_seek(pb, off + len1, SEEK_SET);
1667  return ret;
1668 }
1669 
1670 static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
1671  Mp4Descr *descr, int *descr_count, int max_descr_count)
1672 {
1674  int ret;
1675 
1677 
1678  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1679  if (ret < 0)
1680  return ret;
1681 
1683 
1684  *descr_count = d.descr_count;
1685  return ret;
1686 }
1687 
1688 static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
1689  Mp4Descr *descr, int *descr_count, int max_descr_count)
1690 {
1692  int ret;
1693 
1694  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1695  if (ret < 0)
1696  return ret;
1697 
1699 
1700  *descr_count = d.descr_count;
1701  return ret;
1702 }
1703 
1704 static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
1705  int section_len)
1706 {
1707  MpegTSContext *ts = filter->u.section_filter.opaque;
1708  MpegTSSectionFilter *tssf = &filter->u.section_filter;
1709  SectionHeader h;
1710  const uint8_t *p, *p_end;
1711  int mp4_descr_count = 0;
1712  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
1713  int i, pid;
1714  AVFormatContext *s = ts->stream;
1715 
1716  p_end = section + section_len - 4;
1717  p = section;
1718  if (parse_section_header(&h, &p, p_end) < 0)
1719  return;
1720  if (h.tid != M4OD_TID)
1721  return;
1722  if (skip_identical(&h, tssf))
1723  return;
1724 
1725  mp4_read_od(s, p, (unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
1727 
1728  for (pid = 0; pid < NB_PID_MAX; pid++) {
1729  if (!ts->pids[pid])
1730  continue;
1731  for (i = 0; i < mp4_descr_count; i++) {
1732  PESContext *pes;
1733  AVStream *st;
1734  FFStream *sti;
1735  FFIOContext pb;
1736  if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
1737  continue;
1738  if (ts->pids[pid]->type != MPEGTS_PES) {
1739  av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
1740  continue;
1741  }
1742  pes = ts->pids[pid]->u.pes_filter.opaque;
1743  st = pes->st;
1744  if (!st)
1745  continue;
1746  sti = ffstream(st);
1747 
1748  pes->sl = mp4_descr[i].sl;
1749 
1750  ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
1751  mp4_descr[i].dec_config_descr_len);
1753  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1754  st->codecpar->extradata_size > 0)
1755  sti->need_parsing = 0;
1756  if (st->codecpar->codec_id == AV_CODEC_ID_H264 &&
1757  st->codecpar->extradata_size > 0)
1758  sti->need_parsing = 0;
1759 
1761  sti->need_context_update = 1;
1762  }
1763  }
1764  for (i = 0; i < mp4_descr_count; i++)
1765  av_free(mp4_descr[i].dec_config_descr);
1766 }
1767 
1768 static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section,
1769  int section_len)
1770 {
1771  AVProgram *prg = NULL;
1772  MpegTSContext *ts = filter->u.section_filter.opaque;
1773 
1774  int idx = ff_find_stream_index(ts->stream, filter->pid);
1775  if (idx < 0)
1776  return;
1777 
1778  /**
1779  * In case we receive an SCTE-35 packet before mpegts context is fully
1780  * initialized.
1781  */
1782  if (!ts->pkt)
1783  return;
1784 
1785  new_data_packet(section, section_len, ts->pkt);
1786  ts->pkt->stream_index = idx;
1787  prg = av_find_program_from_stream(ts->stream, NULL, idx);
1788  if (prg && prg->pcr_pid != -1 && prg->discard != AVDISCARD_ALL) {
1789  MpegTSFilter *f = ts->pids[prg->pcr_pid];
1790  if (f && f->last_pcr != -1)
1791  ts->pkt->pts = ts->pkt->dts = f->last_pcr/SYSTEM_CLOCK_FREQUENCY_DIVISOR;
1792  }
1793  ts->stop_parse = 1;
1794 
1795 }
1796 
1797 static const uint8_t opus_coupled_stream_cnt[9] = {
1798  1, 0, 1, 1, 2, 2, 2, 3, 3
1799 };
1800 
1801 static const uint8_t opus_stream_cnt[9] = {
1802  1, 1, 1, 2, 2, 3, 4, 4, 5,
1803 };
1804 
1805 static const uint8_t opus_channel_map[8][8] = {
1806  { 0 },
1807  { 0,1 },
1808  { 0,2,1 },
1809  { 0,1,2,3 },
1810  { 0,4,1,2,3 },
1811  { 0,4,1,2,3,5 },
1812  { 0,4,1,2,3,5,6 },
1813  { 0,6,1,2,3,4,5,7 },
1814 };
1815 
1817  const uint8_t **pp, const uint8_t *desc_list_end,
1818  Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
1819  MpegTSContext *ts)
1820 {
1821  FFStream *const sti = ffstream(st);
1822  const uint8_t *desc_end;
1823  int desc_len, desc_tag, desc_es_id, ext_desc_tag, channels, channel_config_code;
1824  char language[252];
1825  int i;
1826 
1827  desc_tag = get8(pp, desc_list_end);
1828  if (desc_tag < 0)
1829  return AVERROR_INVALIDDATA;
1830  desc_len = get8(pp, desc_list_end);
1831  if (desc_len < 0)
1832  return AVERROR_INVALIDDATA;
1833  desc_end = *pp + desc_len;
1834  if (desc_end > desc_list_end)
1835  return AVERROR_INVALIDDATA;
1836 
1837  av_log(fc, AV_LOG_TRACE, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
1838 
1839  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE || sti->request_probe > 0) &&
1840  stream_type == STREAM_TYPE_PRIVATE_DATA)
1841  mpegts_find_stream_type(st, desc_tag, DESC_types);
1842 
1843  switch (desc_tag) {
1845  if (get8(pp, desc_end) & 0x1) {
1847  }
1848  break;
1849  case SL_DESCRIPTOR:
1850  desc_es_id = get16(pp, desc_end);
1851  if (desc_es_id < 0)
1852  break;
1853  if (ts && ts->pids[pid])
1854  ts->pids[pid]->es_id = desc_es_id;
1855  for (i = 0; i < mp4_descr_count; i++)
1856  if (mp4_descr[i].dec_config_descr_len &&
1857  mp4_descr[i].es_id == desc_es_id) {
1858  FFIOContext pb;
1859  ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
1860  mp4_descr[i].dec_config_descr_len);
1862  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1863  st->codecpar->extradata_size > 0) {
1864  sti->need_parsing = 0;
1865  sti->need_context_update = 1;
1866  }
1868  mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
1869  }
1870  break;
1871  case FMC_DESCRIPTOR:
1872  if (get16(pp, desc_end) < 0)
1873  break;
1874  if (mp4_descr_count > 0 &&
1876  (sti->request_probe == 0 && st->codecpar->codec_id == AV_CODEC_ID_NONE) ||
1877  sti->request_probe > 0) &&
1878  mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
1879  FFIOContext pb;
1880  ffio_init_read_context(&pb, mp4_descr->dec_config_descr,
1881  mp4_descr->dec_config_descr_len);
1883  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1884  st->codecpar->extradata_size > 0) {
1885  sti->request_probe = sti->need_parsing = 0;
1887  sti->need_context_update = 1;
1888  }
1889  }
1890  break;
1891  case TELETEXT_DESCRIPTOR:
1892  {
1893  uint8_t *extradata = NULL;
1894  int language_count = desc_len / 5, ret;
1895 
1896  if (desc_len > 0 && desc_len % 5 != 0)
1897  return AVERROR_INVALIDDATA;
1898 
1899  if (language_count > 0) {
1900  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1901  av_assert0(language_count <= sizeof(language) / 4);
1902 
1903  if (st->codecpar->extradata == NULL) {
1904  ret = ff_alloc_extradata(st->codecpar, language_count * 2);
1905  if (ret < 0)
1906  return ret;
1907  }
1908 
1909  if (st->codecpar->extradata_size < language_count * 2)
1910  return AVERROR_INVALIDDATA;
1911 
1912  extradata = st->codecpar->extradata;
1913 
1914  for (i = 0; i < language_count; i++) {
1915  language[i * 4 + 0] = get8(pp, desc_end);
1916  language[i * 4 + 1] = get8(pp, desc_end);
1917  language[i * 4 + 2] = get8(pp, desc_end);
1918  language[i * 4 + 3] = ',';
1919 
1920  memcpy(extradata, *pp, 2);
1921  extradata += 2;
1922 
1923  *pp += 2;
1924  }
1925 
1926  language[i * 4 - 1] = 0;
1927  av_dict_set(&st->metadata, "language", language, 0);
1928  sti->need_context_update = 1;
1929  }
1930  }
1931  break;
1932  case SUBTITLING_DESCRIPTOR:
1933  {
1934  /* 8 bytes per DVB subtitle substream data:
1935  * ISO_639_language_code (3 bytes),
1936  * subtitling_type (1 byte),
1937  * composition_page_id (2 bytes),
1938  * ancillary_page_id (2 bytes) */
1939  int language_count = desc_len / 8, ret;
1940 
1941  if (desc_len > 0 && desc_len % 8 != 0)
1942  return AVERROR_INVALIDDATA;
1943 
1944  if (language_count > 1) {
1945  avpriv_request_sample(fc, "DVB subtitles with multiple languages");
1946  }
1947 
1948  if (language_count > 0) {
1949  uint8_t *extradata;
1950 
1951  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1952  av_assert0(language_count <= sizeof(language) / 4);
1953 
1954  if (st->codecpar->extradata == NULL) {
1955  ret = ff_alloc_extradata(st->codecpar, language_count * 5);
1956  if (ret < 0)
1957  return ret;
1958  }
1959 
1960  if (st->codecpar->extradata_size < language_count * 5)
1961  return AVERROR_INVALIDDATA;
1962 
1963  extradata = st->codecpar->extradata;
1964 
1965  for (i = 0; i < language_count; i++) {
1966  language[i * 4 + 0] = get8(pp, desc_end);
1967  language[i * 4 + 1] = get8(pp, desc_end);
1968  language[i * 4 + 2] = get8(pp, desc_end);
1969  language[i * 4 + 3] = ',';
1970 
1971  /* hearing impaired subtitles detection using subtitling_type */
1972  switch (*pp[0]) {
1973  case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1974  case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1975  case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1976  case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1977  case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1978  case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1980  break;
1981  }
1982 
1983  extradata[4] = get8(pp, desc_end); /* subtitling_type */
1984  memcpy(extradata, *pp, 4); /* composition_page_id and ancillary_page_id */
1985  extradata += 5;
1986 
1987  *pp += 4;
1988  }
1989 
1990  language[i * 4 - 1] = 0;
1991  av_dict_set(&st->metadata, "language", language, 0);
1992  sti->need_context_update = 1;
1993  }
1994  }
1995  break;
1997  for (i = 0; i + 4 <= desc_len; i += 4) {
1998  language[i + 0] = get8(pp, desc_end);
1999  language[i + 1] = get8(pp, desc_end);
2000  language[i + 2] = get8(pp, desc_end);
2001  language[i + 3] = ',';
2002  switch (get8(pp, desc_end)) {
2003  case 0x01:
2005  break;
2006  case 0x02:
2008  break;
2009  case 0x03:
2012  break;
2013  }
2014  }
2015  if (i && language[0]) {
2016  language[i - 1] = 0;
2017  /* don't overwrite language, as it may already have been set by
2018  * another, more specific descriptor (e.g. supplementary audio) */
2020  }
2021  break;
2023  st->codecpar->codec_tag = bytestream_get_le32(pp);
2024  av_log(fc, AV_LOG_TRACE, "reg_desc=%.4s\n", (char *)&st->codecpar->codec_tag);
2025  if (st->codecpar->codec_id == AV_CODEC_ID_NONE || sti->request_probe > 0) {
2027  if (st->codecpar->codec_tag == MKTAG('B', 'S', 'S', 'D'))
2028  sti->request_probe = 50;
2029  }
2030  break;
2032  sti->stream_identifier = 1 + get8(pp, desc_end);
2033  break;
2034  case METADATA_DESCRIPTOR:
2035  if (get16(pp, desc_end) == 0xFFFF)
2036  *pp += 4;
2037  if (get8(pp, desc_end) == 0xFF) {
2038  st->codecpar->codec_tag = bytestream_get_le32(pp);
2039  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2041  }
2042  break;
2043  case EXTENSION_DESCRIPTOR: /* DVB extension descriptor */
2044  ext_desc_tag = get8(pp, desc_end);
2045  if (ext_desc_tag < 0)
2046  return AVERROR_INVALIDDATA;
2047  if (st->codecpar->codec_id == AV_CODEC_ID_OPUS &&
2048  ext_desc_tag == 0x80) { /* User defined (provisional Opus) */
2049  if (!st->codecpar->extradata) {
2052  if (!st->codecpar->extradata)
2053  return AVERROR(ENOMEM);
2054 
2057 
2058  channel_config_code = get8(pp, desc_end);
2059  if (channel_config_code < 0)
2060  return AVERROR_INVALIDDATA;
2061  if (channel_config_code <= 0x8) {
2062  st->codecpar->extradata[9] = channels = channel_config_code ? channel_config_code : 2;
2063  AV_WL32(&st->codecpar->extradata[12], 48000);
2064  st->codecpar->extradata[18] = channel_config_code ? (channels > 2) : /* Dual Mono */ 255;
2065  st->codecpar->extradata[19] = opus_stream_cnt[channel_config_code];
2066  st->codecpar->extradata[20] = opus_coupled_stream_cnt[channel_config_code];
2067  memcpy(&st->codecpar->extradata[21], opus_channel_map[channels - 1], channels);
2068  st->codecpar->extradata_size = st->codecpar->extradata[18] ? 21 + channels : 19;
2069  } else {
2070  avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code > 0x8");
2071  }
2073  sti->need_context_update = 1;
2074  }
2075  }
2076  if (ext_desc_tag == SUPPLEMENTARY_AUDIO_DESCRIPTOR) {
2077  int flags;
2078 
2079  if (desc_len < 1)
2080  return AVERROR_INVALIDDATA;
2081  flags = get8(pp, desc_end);
2082 
2083  if ((flags & 0x80) == 0) /* mix_type */
2085 
2086  switch ((flags >> 2) & 0x1F) { /* editorial_classification */
2087  case 0x01:
2090  break;
2091  case 0x02:
2093  break;
2094  case 0x03:
2096  break;
2097  }
2098 
2099  if (flags & 0x01) { /* language_code_present */
2100  if (desc_len < 4)
2101  return AVERROR_INVALIDDATA;
2102  language[0] = get8(pp, desc_end);
2103  language[1] = get8(pp, desc_end);
2104  language[2] = get8(pp, desc_end);
2105  language[3] = 0;
2106 
2107  /* This language always has to override a possible
2108  * ISO 639 language descriptor language */
2109  if (language[0])
2110  av_dict_set(&st->metadata, "language", language, 0);
2111  }
2112  }
2113  break;
2114  case AC3_DESCRIPTOR:
2115  {
2116  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2117  if (component_type_flag) {
2118  int component_type = get8(pp, desc_end);
2119  int service_type_mask = 0x38; // 0b00111000
2120  int service_type = ((component_type & service_type_mask) >> 3);
2121  if (service_type == 0x02 /* 0b010 */) {
2123  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2124  }
2125  }
2126  }
2127  break;
2129  {
2130  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2131  if (component_type_flag) {
2132  int component_type = get8(pp, desc_end);
2133  int service_type_mask = 0x38; // 0b00111000
2134  int service_type = ((component_type & service_type_mask) >> 3);
2135  if (service_type == 0x02 /* 0b010 */) {
2137  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2138  }
2139  }
2140  }
2141  break;
2143  // STD-B24, fascicle 3, chapter 4 defines private_stream_1
2144  // for captions
2145  if (stream_type == STREAM_TYPE_PRIVATE_DATA) {
2146  // This structure is defined in STD-B10, part 1, listing 5.4 and
2147  // part 2, 6.2.20).
2148  // Listing of data_component_ids is in STD-B10, part 2, Annex J.
2149  // Component tag limits are documented in TR-B14, fascicle 2,
2150  // Vol. 3, Section 2, 4.2.8.1
2151  int actual_component_tag = sti->stream_identifier - 1;
2152  int picked_profile = AV_PROFILE_UNKNOWN;
2153  int data_component_id = get16(pp, desc_end);
2154  if (data_component_id < 0)
2155  return AVERROR_INVALIDDATA;
2156 
2157  switch (data_component_id) {
2158  case 0x0008:
2159  // [0x30..0x37] are component tags utilized for
2160  // non-mobile captioning service ("profile A").
2161  if (actual_component_tag >= 0x30 &&
2162  actual_component_tag <= 0x37) {
2163  picked_profile = AV_PROFILE_ARIB_PROFILE_A;
2164  }
2165  break;
2166  case 0x0012:
2167  // component tag 0x87 signifies a mobile/partial reception
2168  // (1seg) captioning service ("profile C").
2169  if (actual_component_tag == 0x87) {
2170  picked_profile = AV_PROFILE_ARIB_PROFILE_C;
2171  }
2172  break;
2173  default:
2174  break;
2175  }
2176 
2177  if (picked_profile == AV_PROFILE_UNKNOWN)
2178  break;
2179 
2182  if (st->codecpar->profile != picked_profile) {
2183  st->codecpar->profile = picked_profile;
2184  sti->need_context_update = 1;
2185  }
2186  sti->request_probe = 0;
2187  sti->need_parsing = 0;
2188  }
2189  break;
2191  {
2192  uint32_t buf;
2194  size_t dovi_size;
2195  int dependency_pid = -1; // Unset
2196 
2197  if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
2198  return AVERROR_INVALIDDATA;
2199 
2200  dovi = av_dovi_alloc(&dovi_size);
2201  if (!dovi)
2202  return AVERROR(ENOMEM);
2203 
2204  dovi->dv_version_major = get8(pp, desc_end);
2205  dovi->dv_version_minor = get8(pp, desc_end);
2206  buf = get16(pp, desc_end);
2207  dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits
2208  dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits
2209  dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit
2210  dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit
2211  dovi->bl_present_flag = buf & 0x01; // 1 bit
2212  if (!dovi->bl_present_flag && desc_end - *pp >= 2) {
2213  buf = get16(pp, desc_end);
2214  dependency_pid = buf >> 3; // 13 bits
2215  }
2216  if (desc_end - *pp >= 1) { // 8 bits
2217  buf = get8(pp, desc_end);
2218  dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits
2219  dovi->dv_md_compression = (buf >> 2) & 0x03; // 2 bits
2220  } else {
2221  // 0 stands for None
2222  // Dolby Vision V1.2.93 profiles and levels
2225  }
2226 
2230  (uint8_t *)dovi, dovi_size, 0)) {
2231  av_free(dovi);
2232  return AVERROR(ENOMEM);
2233  }
2234 
2235  av_log(fc, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, "
2236  "rpu flag: %d, el flag: %d, bl flag: %d, dependency_pid: %d, "
2237  "compatibility id: %d, compression: %d\n",
2238  dovi->dv_version_major, dovi->dv_version_minor,
2239  dovi->dv_profile, dovi->dv_level,
2240  dovi->rpu_present_flag,
2241  dovi->el_present_flag,
2242  dovi->bl_present_flag,
2243  dependency_pid,
2245  dovi->dv_md_compression);
2246  }
2247  break;
2248  default:
2249  break;
2250  }
2251  *pp = desc_end;
2252  return 0;
2253 }
2254 
2255 static AVStream *find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid,
2256  int stream_identifier, int pmt_stream_idx, struct Program *p)
2257 {
2258  AVFormatContext *s = ts->stream;
2259  AVStream *found = NULL;
2260 
2261  if (stream_identifier) { /* match based on "stream identifier descriptor" if present */
2262  for (int i = 0; i < p->nb_streams; i++) {
2263  if (p->streams[i].stream_identifier == stream_identifier)
2264  if (!found || pmt_stream_idx == i) /* fallback to idx based guess if multiple streams have the same identifier */
2265  found = s->streams[p->streams[i].idx];
2266  }
2267  } else if (pmt_stream_idx < p->nb_streams) { /* match based on position within the PMT */
2268  found = s->streams[p->streams[pmt_stream_idx].idx];
2269  }
2270 
2271  if (found) {
2273  "re-using existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2275  found->index, found->id, pid);
2276  }
2277 
2278  return found;
2279 }
2280 
2281 static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
2282 {
2283  const uint8_t **pp = &p;
2284  const uint8_t *desc_list_end;
2285  const uint8_t *desc_end;
2286  int desc_list_len;
2287  int desc_len, desc_tag;
2288 
2289  desc_list_len = get16(pp, p_end);
2290  if (desc_list_len < 0)
2291  return -1;
2292  desc_list_len &= 0xfff;
2293  desc_list_end = p + desc_list_len;
2294  if (desc_list_end > p_end)
2295  return -1;
2296 
2297  while (1) {
2298  desc_tag = get8(pp, desc_list_end);
2299  if (desc_tag < 0)
2300  return -1;
2301  desc_len = get8(pp, desc_list_end);
2302  if (desc_len < 0)
2303  return -1;
2304  desc_end = *pp + desc_len;
2305  if (desc_end > desc_list_end)
2306  return -1;
2307 
2308  if (desc_tag == STREAM_IDENTIFIER_DESCRIPTOR) {
2309  return get8(pp, desc_end);
2310  }
2311  *pp = desc_end;
2312  }
2313 
2314  return -1;
2315 }
2316 
2317 static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
2318 {
2319  switch (stream_type) {
2322  return 0;
2324  /* This User Private stream_type value is used by multiple organizations
2325  for different things. ANSI/SCTE 35 splice_info_section() is a
2326  private_section() not a PES_packet(). */
2327  return !(prog_reg_desc == AV_RL32("CUEI"));
2328  default:
2329  return 1;
2330  }
2331 }
2332 
2333 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2334 {
2335  MpegTSContext *ts = filter->u.section_filter.opaque;
2336  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2337  struct Program old_program;
2338  SectionHeader h1, *h = &h1;
2339  PESContext *pes;
2340  AVStream *st;
2341  const uint8_t *p, *p_end, *desc_list_end;
2342  int program_info_length, pcr_pid, pid, stream_type;
2343  int desc_list_len;
2344  uint32_t prog_reg_desc = 0; /* registration descriptor */
2345  int stream_identifier = -1;
2346  struct Program *prg;
2347 
2348  int mp4_descr_count = 0;
2349  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
2350  int i;
2351 
2352  av_log(ts->stream, AV_LOG_TRACE, "PMT: len %i\n", section_len);
2353  hex_dump_debug(ts->stream, section, section_len);
2354 
2355  p_end = section + section_len - 4;
2356  p = section;
2357  if (parse_section_header(h, &p, p_end) < 0)
2358  return;
2359  if (h->tid != PMT_TID)
2360  return;
2361  if (!h->current_next)
2362  return;
2363  if (skip_identical(h, tssf))
2364  return;
2365 
2366  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x sec_num=%d/%d version=%d tid=%d\n",
2367  h->id, h->sec_num, h->last_sec_num, h->version, h->tid);
2368 
2369  if (!ts->scan_all_pmts && ts->skip_changes)
2370  return;
2371 
2372  prg = get_program(ts, h->id);
2373  if (prg)
2374  old_program = *prg;
2375  else
2376  clear_program(&old_program);
2377 
2378  if (ts->skip_unknown_pmt && !prg)
2379  return;
2380  if (prg && prg->nb_pids && prg->pids[0] != ts->current_pid)
2381  return;
2382  if (!ts->skip_clear)
2383  clear_avprogram(ts, h->id);
2384  clear_program(prg);
2385  add_pid_to_program(prg, ts->current_pid);
2386 
2387  pcr_pid = get16(&p, p_end);
2388  if (pcr_pid < 0)
2389  return;
2390  pcr_pid &= 0x1fff;
2391  add_pid_to_program(prg, pcr_pid);
2392  update_av_program_info(ts->stream, h->id, pcr_pid, h->version);
2393 
2394  av_log(ts->stream, AV_LOG_TRACE, "pcr_pid=0x%x\n", pcr_pid);
2395 
2396  program_info_length = get16(&p, p_end);
2397  if (program_info_length < 0)
2398  return;
2399  program_info_length &= 0xfff;
2400  while (program_info_length >= 2) {
2401  uint8_t tag, len;
2402  tag = get8(&p, p_end);
2403  len = get8(&p, p_end);
2404 
2405  av_log(ts->stream, AV_LOG_TRACE, "program tag: 0x%02x len=%d\n", tag, len);
2406 
2407  program_info_length -= 2;
2408  if (len > program_info_length)
2409  // something else is broken, exit the program_descriptors_loop
2410  break;
2411  program_info_length -= len;
2412  if (tag == IOD_DESCRIPTOR) {
2413  get8(&p, p_end); // scope
2414  get8(&p, p_end); // label
2415  len -= 2;
2416  mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
2417  &mp4_descr_count, MAX_MP4_DESCR_COUNT);
2418  } else if (tag == REGISTRATION_DESCRIPTOR && len >= 4) {
2419  prog_reg_desc = bytestream_get_le32(&p);
2420  len -= 4;
2421  }
2422  p += len;
2423  }
2424  p += program_info_length;
2425  if (p >= p_end)
2426  goto out;
2427 
2428  // stop parsing after pmt, we found header
2429  if (!ts->pkt)
2430  ts->stop_parse = 2;
2431 
2432  if (prg)
2433  prg->pmt_found = 1;
2434 
2435  for (i = 0; i < MAX_STREAMS_PER_PROGRAM; i++) {
2436  st = 0;
2437  pes = NULL;
2438  stream_type = get8(&p, p_end);
2439  if (stream_type < 0)
2440  break;
2441  pid = get16(&p, p_end);
2442  if (pid < 0)
2443  goto out;
2444  pid &= 0x1fff;
2445  if (pid == ts->current_pid)
2446  goto out;
2447 
2448  stream_identifier = parse_stream_identifier_desc(p, p_end) + 1;
2449 
2450  /* now create stream */
2451  if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
2452  pes = ts->pids[pid]->u.pes_filter.opaque;
2453  if (ts->merge_pmt_versions && !pes->st) {
2454  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2455  if (st) {
2456  pes->st = st;
2457  pes->stream_type = stream_type;
2458  pes->merged_st = 1;
2459  }
2460  }
2461  if (!pes->st) {
2462  pes->st = avformat_new_stream(pes->stream, NULL);
2463  if (!pes->st)
2464  goto out;
2465  pes->st->id = pes->pid;
2466  }
2467  st = pes->st;
2468  } else if (is_pes_stream(stream_type, prog_reg_desc)) {
2469  if (ts->pids[pid])
2470  mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably
2471  pes = add_pes_stream(ts, pid, pcr_pid);
2472  if (ts->merge_pmt_versions && pes && !pes->st) {
2473  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2474  if (st) {
2475  pes->st = st;
2476  pes->stream_type = stream_type;
2477  pes->merged_st = 1;
2478  }
2479  }
2480  if (pes && !pes->st) {
2481  st = avformat_new_stream(pes->stream, NULL);
2482  if (!st)
2483  goto out;
2484  st->id = pes->pid;
2485  }
2486  } else {
2487  int idx = ff_find_stream_index(ts->stream, pid);
2488  if (idx >= 0) {
2489  st = ts->stream->streams[idx];
2490  }
2491  if (ts->merge_pmt_versions && !st) {
2492  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2493  }
2494  if (!st) {
2495  st = avformat_new_stream(ts->stream, NULL);
2496  if (!st)
2497  goto out;
2498  st->id = pid;
2500  if (stream_type == STREAM_TYPE_SCTE_DATA_SCTE_35 && prog_reg_desc == AV_RL32("CUEI")) {
2501  mpegts_find_stream_type(st, stream_type, SCTE_types);
2502  mpegts_open_section_filter(ts, pid, scte_data_cb, ts, 1);
2503  }
2504  }
2505  }
2506 
2507  if (!st)
2508  goto out;
2509 
2510  if (pes && !pes->stream_type)
2511  mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
2512 
2513  add_pid_to_program(prg, pid);
2514  if (prg) {
2515  prg->streams[i].idx = st->index;
2516  prg->streams[i].stream_identifier = stream_identifier;
2517  prg->nb_streams++;
2518  }
2519 
2520  av_program_add_stream_index(ts->stream, h->id, st->index);
2521 
2522  desc_list_len = get16(&p, p_end);
2523  if (desc_list_len < 0)
2524  goto out;
2525  desc_list_len &= 0xfff;
2526  desc_list_end = p + desc_list_len;
2527  if (desc_list_end > p_end)
2528  goto out;
2529  for (;;) {
2530  if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, &p,
2531  desc_list_end, mp4_descr,
2532  mp4_descr_count, pid, ts) < 0)
2533  break;
2534 
2535  if (pes && prog_reg_desc == AV_RL32("HDMV") &&
2536  stream_type == STREAM_TYPE_BLURAY_AUDIO_TRUEHD && pes->sub_st) {
2538  pes->sub_st->index);
2539  pes->sub_st->codecpar->codec_tag = st->codecpar->codec_tag;
2540  }
2541  }
2542  p = desc_list_end;
2543  }
2544 
2545  if (!ts->pids[pcr_pid])
2546  mpegts_open_pcr_filter(ts, pcr_pid);
2547 
2548 out:
2549  for (i = 0; i < mp4_descr_count; i++)
2550  av_free(mp4_descr[i].dec_config_descr);
2551 }
2552 
2553 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2554 {
2555  MpegTSContext *ts = filter->u.section_filter.opaque;
2556  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2557  SectionHeader h1, *h = &h1;
2558  const uint8_t *p, *p_end;
2559  int sid, pmt_pid;
2560  int nb_prg = 0;
2561  AVProgram *program;
2562 
2563  av_log(ts->stream, AV_LOG_TRACE, "PAT:\n");
2564  hex_dump_debug(ts->stream, section, section_len);
2565 
2566  p_end = section + section_len - 4;
2567  p = section;
2568  if (parse_section_header(h, &p, p_end) < 0)
2569  return;
2570  if (h->tid != PAT_TID)
2571  return;
2572  if (!h->current_next)
2573  return;
2574  if (ts->skip_changes)
2575  return;
2576 
2577  if (skip_identical(h, tssf))
2578  return;
2579  ts->id = h->id;
2580 
2581  for (;;) {
2582  sid = get16(&p, p_end);
2583  if (sid < 0)
2584  break;
2585  pmt_pid = get16(&p, p_end);
2586  if (pmt_pid < 0)
2587  break;
2588  pmt_pid &= 0x1fff;
2589 
2590  if (pmt_pid == ts->current_pid)
2591  break;
2592 
2593  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
2594 
2595  if (sid == 0x0000) {
2596  /* NIT info */
2597  } else {
2598  MpegTSFilter *fil = ts->pids[pmt_pid];
2599  struct Program *prg;
2600  program = av_new_program(ts->stream, sid);
2601  if (program) {
2602  program->program_num = sid;
2603  program->pmt_pid = pmt_pid;
2604  }
2605  if (fil)
2606  if ( fil->type != MPEGTS_SECTION
2607  || fil->pid != pmt_pid
2608  || fil->u.section_filter.section_cb != pmt_cb)
2609  mpegts_close_filter(ts, ts->pids[pmt_pid]);
2610 
2611  if (!ts->pids[pmt_pid])
2612  mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
2613  prg = add_program(ts, sid);
2614  if (prg) {
2615  unsigned prg_idx = prg - ts->prg;
2616  if (prg->nb_pids && prg->pids[0] != pmt_pid)
2617  clear_program(prg);
2618  add_pid_to_program(prg, pmt_pid);
2619  if (prg_idx > nb_prg)
2620  FFSWAP(struct Program, ts->prg[nb_prg], ts->prg[prg_idx]);
2621  if (prg_idx >= nb_prg)
2622  nb_prg++;
2623  } else
2624  nb_prg = 0;
2625  }
2626  }
2627  ts->nb_prg = nb_prg;
2628 
2629  if (sid < 0) {
2630  int i,j;
2631  for (j=0; j<ts->stream->nb_programs; j++) {
2632  for (i = 0; i < ts->nb_prg; i++)
2633  if (ts->prg[i].id == ts->stream->programs[j]->id)
2634  break;
2635  if (i==ts->nb_prg && !ts->skip_clear)
2636  clear_avprogram(ts, ts->stream->programs[j]->id);
2637  }
2638  }
2639 }
2640 
2641 static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2642 {
2643  MpegTSContext *ts = filter->u.section_filter.opaque;
2644  const uint8_t *p, *p_end;
2645  SectionHeader h1, *h = &h1;
2646 
2647  /*
2648  * Sometimes we receive EPG packets but SDT table do not have
2649  * eit_pres_following or eit_sched turned on, so we open EPG
2650  * stream directly here.
2651  */
2652  if (!ts->epg_stream) {
2654  if (!ts->epg_stream)
2655  return;
2656  ts->epg_stream->id = EIT_PID;
2659  }
2660 
2661  if (ts->epg_stream->discard == AVDISCARD_ALL)
2662  return;
2663 
2664  p_end = section + section_len - 4;
2665  p = section;
2666 
2667  if (parse_section_header(h, &p, p_end) < 0)
2668  return;
2669  if (h->tid < EIT_TID || h->tid > OEITS_END_TID)
2670  return;
2671 
2672  av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", h->tid);
2673 
2674  /**
2675  * Service_id 0xFFFF is reserved, it indicates that the current EIT table
2676  * is scrambled.
2677  */
2678  if (h->id == 0xFFFF) {
2679  av_log(ts->stream, AV_LOG_TRACE, "Scrambled EIT table received.\n");
2680  return;
2681  }
2682 
2683  /**
2684  * In case we receive an EPG packet before mpegts context is fully
2685  * initialized.
2686  */
2687  if (!ts->pkt)
2688  return;
2689 
2690  new_data_packet(section, section_len, ts->pkt);
2691  ts->pkt->stream_index = ts->epg_stream->index;
2692  ts->stop_parse = 1;
2693 }
2694 
2695 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2696 {
2697  MpegTSContext *ts = filter->u.section_filter.opaque;
2698  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2699  SectionHeader h1, *h = &h1;
2700  const uint8_t *p, *p_end, *desc_list_end, *desc_end;
2701  int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
2702  char *name, *provider_name;
2703 
2704  av_log(ts->stream, AV_LOG_TRACE, "SDT:\n");
2705  hex_dump_debug(ts->stream, section, section_len);
2706 
2707  p_end = section + section_len - 4;
2708  p = section;
2709  if (parse_section_header(h, &p, p_end) < 0)
2710  return;
2711  if (h->tid != SDT_TID)
2712  return;
2713  if (!h->current_next)
2714  return;
2715  if (ts->skip_changes)
2716  return;
2717  if (skip_identical(h, tssf))
2718  return;
2719 
2720  onid = get16(&p, p_end);
2721  if (onid < 0)
2722  return;
2723  val = get8(&p, p_end);
2724  if (val < 0)
2725  return;
2726  for (;;) {
2727  sid = get16(&p, p_end);
2728  if (sid < 0)
2729  break;
2730  val = get8(&p, p_end);
2731  if (val < 0)
2732  break;
2733  desc_list_len = get16(&p, p_end);
2734  if (desc_list_len < 0)
2735  break;
2736  desc_list_len &= 0xfff;
2737  desc_list_end = p + desc_list_len;
2738  if (desc_list_end > p_end)
2739  break;
2740  for (;;) {
2741  desc_tag = get8(&p, desc_list_end);
2742  if (desc_tag < 0)
2743  break;
2744  desc_len = get8(&p, desc_list_end);
2745  desc_end = p + desc_len;
2746  if (desc_len < 0 || desc_end > desc_list_end)
2747  break;
2748 
2749  av_log(ts->stream, AV_LOG_TRACE, "tag: 0x%02x len=%d\n",
2750  desc_tag, desc_len);
2751 
2752  switch (desc_tag) {
2753  case SERVICE_DESCRIPTOR:
2754  service_type = get8(&p, desc_end);
2755  if (service_type < 0)
2756  break;
2757  provider_name = getstr8(&p, desc_end);
2758  if (!provider_name)
2759  break;
2760  name = getstr8(&p, desc_end);
2761  if (name) {
2762  AVProgram *program = av_new_program(ts->stream, sid);
2763  if (program) {
2764  av_dict_set(&program->metadata, "service_name", name, 0);
2765  av_dict_set(&program->metadata, "service_provider",
2766  provider_name, 0);
2767  }
2768  }
2769  av_free(name);
2770  av_free(provider_name);
2771  break;
2772  default:
2773  break;
2774  }
2775  p = desc_end;
2776  }
2777  p = desc_list_end;
2778  }
2779 }
2780 
2781 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
2782  const uint8_t *packet);
2783 
2784 /* handle one TS packet */
2785 static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
2786 {
2787  MpegTSFilter *tss;
2788  int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
2789  has_adaptation, has_payload;
2790  const uint8_t *p, *p_end;
2791 
2792  pid = AV_RB16(packet + 1) & 0x1fff;
2793  is_start = packet[1] & 0x40;
2794  tss = ts->pids[pid];
2795  if (ts->auto_guess && !tss && is_start) {
2796  add_pes_stream(ts, pid, -1);
2797  tss = ts->pids[pid];
2798  }
2799  if (!tss)
2800  return 0;
2801  if (is_start)
2802  tss->discard = discard_pid(ts, pid);
2803  if (tss->discard)
2804  return 0;
2805  ts->current_pid = pid;
2806 
2807  afc = (packet[3] >> 4) & 3;
2808  if (afc == 0) /* reserved value */
2809  return 0;
2810  has_adaptation = afc & 2;
2811  has_payload = afc & 1;
2812  is_discontinuity = has_adaptation &&
2813  packet[4] != 0 && /* with length > 0 */
2814  (packet[5] & 0x80); /* and discontinuity indicated */
2815 
2816  /* continuity check (currently not used) */
2817  cc = (packet[3] & 0xf);
2818  expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
2819  cc_ok = pid == NULL_PID ||
2820  is_discontinuity ||
2821  tss->last_cc < 0 ||
2822  expected_cc == cc;
2823 
2824  tss->last_cc = cc;
2825  if (!cc_ok) {
2826  av_log(ts->stream, AV_LOG_DEBUG,
2827  "Continuity check failed for pid %d expected %d got %d\n",
2828  pid, expected_cc, cc);
2829  if (tss->type == MPEGTS_PES) {
2830  PESContext *pc = tss->u.pes_filter.opaque;
2831  pc->flags |= AV_PKT_FLAG_CORRUPT;
2832  }
2833  }
2834 
2835  if (packet[1] & 0x80) {
2836  av_log(ts->stream, AV_LOG_DEBUG, "Packet had TEI flag set; marking as corrupt\n");
2837  if (tss->type == MPEGTS_PES) {
2838  PESContext *pc = tss->u.pes_filter.opaque;
2839  pc->flags |= AV_PKT_FLAG_CORRUPT;
2840  }
2841  }
2842 
2843  p = packet + 4;
2844  if (has_adaptation) {
2845  int64_t pcr_h;
2846  int pcr_l;
2847  if (parse_pcr(&pcr_h, &pcr_l, packet) == 0)
2848  tss->last_pcr = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
2849  /* skip adaptation field */
2850  p += p[0] + 1;
2851  }
2852  /* if past the end of packet, ignore */
2853  p_end = packet + TS_PACKET_SIZE;
2854  if (p >= p_end || !has_payload)
2855  return 0;
2856 
2857  if (pos >= 0) {
2859  ts->pos47_full = pos - TS_PACKET_SIZE;
2860  }
2861 
2862  if (tss->type == MPEGTS_SECTION) {
2863  if (is_start) {
2864  /* pointer field present */
2865  len = *p++;
2866  if (len > p_end - p)
2867  return 0;
2868  if (len && cc_ok) {
2869  /* write remaining section bytes */
2870  write_section_data(ts, tss,
2871  p, len, 0);
2872  /* check whether filter has been closed */
2873  if (!ts->pids[pid])
2874  return 0;
2875  }
2876  p += len;
2877  if (p < p_end) {
2878  write_section_data(ts, tss,
2879  p, p_end - p, 1);
2880  }
2881  } else {
2882  if (cc_ok) {
2883  write_section_data(ts, tss,
2884  p, p_end - p, 0);
2885  }
2886  }
2887 
2888  // stop find_stream_info from waiting for more streams
2889  // when all programs have received a PMT
2890  if (ts->stream->ctx_flags & AVFMTCTX_NOHEADER && ts->scan_all_pmts <= 0) {
2891  int i;
2892  for (i = 0; i < ts->nb_prg; i++) {
2893  if (!ts->prg[i].pmt_found)
2894  break;
2895  }
2896  if (i == ts->nb_prg && ts->nb_prg > 0) {
2897  av_log(ts->stream, AV_LOG_DEBUG, "All programs have pmt, headers found\n");
2899  }
2900  }
2901 
2902  } else {
2903  int ret;
2904  // Note: The position here points actually behind the current packet.
2905  if (tss->type == MPEGTS_PES) {
2906  if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
2907  pos - ts->raw_packet_size)) < 0)
2908  return ret;
2909  }
2910  }
2911 
2912  return 0;
2913 }
2914 
2915 static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
2916 {
2917  MpegTSContext *ts = s->priv_data;
2918  AVIOContext *pb = s->pb;
2919  int c, i;
2920  uint64_t pos = avio_tell(pb);
2921  int64_t back = FFMIN(seekback, pos);
2922 
2923  //Special case for files like 01c56b0dc1.ts
2924  if (current_packet[0] == 0x80 && current_packet[12] == SYNC_BYTE && pos >= TS_PACKET_SIZE) {
2925  avio_seek(pb, 12 - TS_PACKET_SIZE, SEEK_CUR);
2926  return 0;
2927  }
2928 
2929  avio_seek(pb, -back, SEEK_CUR);
2930 
2931  for (i = 0; i < ts->resync_size; i++) {
2932  c = avio_r8(pb);
2933  if (avio_feof(pb))
2934  return AVERROR_EOF;
2935  if (c == SYNC_BYTE) {
2936  int new_packet_size, ret;
2937  avio_seek(pb, -1, SEEK_CUR);
2938  pos = avio_tell(pb);
2940  if (ret < 0)
2941  return ret;
2942  new_packet_size = get_packet_size(s);
2943  if (new_packet_size > 0 && new_packet_size != ts->raw_packet_size) {
2944  av_log(ts->stream, AV_LOG_WARNING, "changing packet size to %d\n", new_packet_size);
2945  ts->raw_packet_size = new_packet_size;
2946  }
2947  avio_seek(pb, pos, SEEK_SET);
2948  return 0;
2949  }
2950  }
2952  "max resync size reached, could not find sync byte\n");
2953  /* no sync found */
2954  return AVERROR_INVALIDDATA;
2955 }
2956 
2957 /* return AVERROR_something if error or EOF. Return 0 if OK. */
2958 static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size,
2959  const uint8_t **data)
2960 {
2961  AVIOContext *pb = s->pb;
2962  int len;
2963 
2964  // 192 bytes source packet that start with a 4 bytes TP_extra_header
2965  // followed by 188 bytes of TS packet. The sync byte is at offset 4, so skip
2966  // the first 4 bytes otherwise we'll end up syncing to the wrong packet.
2967  if (raw_packet_size == TS_DVHS_PACKET_SIZE)
2968  avio_skip(pb, 4);
2969 
2970  for (;;) {
2972  if (len != TS_PACKET_SIZE)
2973  return len < 0 ? len : AVERROR_EOF;
2974  /* check packet sync byte */
2975  if ((*data)[0] != SYNC_BYTE) {
2976  /* find a new packet start */
2977 
2978  if (mpegts_resync(s, raw_packet_size, *data) < 0)
2979  return AVERROR(EAGAIN);
2980  else
2981  continue;
2982  } else {
2983  break;
2984  }
2985  }
2986  return 0;
2987 }
2988 
2989 static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
2990 {
2991  AVIOContext *pb = s->pb;
2992  int skip;
2993  if (raw_packet_size == TS_DVHS_PACKET_SIZE)
2994  skip = raw_packet_size - TS_DVHS_PACKET_SIZE;
2995  else
2996  skip = raw_packet_size - TS_PACKET_SIZE;
2997  if (skip > 0)
2998  avio_skip(pb, skip);
2999 }
3000 
3001 static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
3002 {
3003  AVFormatContext *s = ts->stream;
3004  uint8_t packet[TS_PACKET_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
3005  const uint8_t *data;
3006  int64_t packet_num;
3007  int ret = 0;
3008 
3009  if (avio_tell(s->pb) != ts->last_pos) {
3010  int i;
3011  av_log(ts->stream, AV_LOG_TRACE, "Skipping after seek\n");
3012  /* seek detected, flush pes buffer */
3013  for (i = 0; i < NB_PID_MAX; i++) {
3014  if (ts->pids[i]) {
3015  if (ts->pids[i]->type == MPEGTS_PES) {
3016  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3017  av_buffer_unref(&pes->buffer);
3018  pes->data_index = 0;
3019  pes->state = MPEGTS_SKIP; /* skip until pes header */
3020  } else if (ts->pids[i]->type == MPEGTS_SECTION) {
3021  ts->pids[i]->u.section_filter.last_ver = -1;
3022  }
3023  ts->pids[i]->last_cc = -1;
3024  ts->pids[i]->last_pcr = -1;
3025  }
3026  }
3027  }
3028 
3029  ts->stop_parse = 0;
3030  packet_num = 0;
3031  memset(packet + TS_PACKET_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3032  for (;;) {
3033  packet_num++;
3034  if (nb_packets != 0 && packet_num >= nb_packets ||
3035  ts->stop_parse > 1) {
3036  ret = AVERROR(EAGAIN);
3037  break;
3038  }
3039  if (ts->stop_parse > 0)
3040  break;
3041 
3042  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3043  if (ret != 0)
3044  break;
3045  ret = handle_packet(ts, data, avio_tell(s->pb));
3047  if (ret != 0)
3048  break;
3049  }
3050  ts->last_pos = avio_tell(s->pb);
3051  return ret;
3052 }
3053 
3054 static int mpegts_probe(const AVProbeData *p)
3055 {
3056  const int size = p->buf_size;
3057  int maxscore = 0;
3058  int sumscore = 0;
3059  int i;
3060  int check_count = size / TS_FEC_PACKET_SIZE;
3061 #define CHECK_COUNT 10
3062 #define CHECK_BLOCK 100
3063 
3064  if (!check_count)
3065  return 0;
3066 
3067  for (i = 0; i<check_count; i+=CHECK_BLOCK) {
3068  int left = FFMIN(check_count - i, CHECK_BLOCK);
3069  int score = analyze(p->buf + TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , 1);
3072  score = FFMAX3(score, dvhs_score, fec_score);
3073  sumscore += score;
3074  maxscore = FFMAX(maxscore, score);
3075  }
3076 
3077  sumscore = sumscore * CHECK_COUNT / check_count;
3078  maxscore = maxscore * CHECK_COUNT / CHECK_BLOCK;
3079 
3080  ff_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
3081 
3082  if (check_count > CHECK_COUNT && sumscore > 6) {
3083  return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
3084  } else if (check_count >= CHECK_COUNT && sumscore > 6) {
3085  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3086  } else if (check_count >= CHECK_COUNT && maxscore > 6) {
3087  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3088  } else if (sumscore > 6) {
3089  return 2;
3090  } else {
3091  return 0;
3092  }
3093 }
3094 
3095 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
3096  * (-1) if not available */
3097 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
3098 {
3099  int afc, len, flags;
3100  const uint8_t *p;
3101  unsigned int v;
3102 
3103  afc = (packet[3] >> 4) & 3;
3104  if (afc <= 1)
3105  return AVERROR_INVALIDDATA;
3106  p = packet + 4;
3107  len = p[0];
3108  p++;
3109  if (len == 0)
3110  return AVERROR_INVALIDDATA;
3111  flags = *p++;
3112  len--;
3113  if (!(flags & 0x10))
3114  return AVERROR_INVALIDDATA;
3115  if (len < 6)
3116  return AVERROR_INVALIDDATA;
3117  v = AV_RB32(p);
3118  *ppcr_high = ((int64_t) v << 1) | (p[4] >> 7);
3119  *ppcr_low = ((p[4] & 1) << 8) | p[5];
3120  return 0;
3121 }
3122 
3124 
3125  /* NOTE: We attempt to seek on non-seekable files as well, as the
3126  * probe buffer usually is big enough. Only warn if the seek failed
3127  * on files where the seek should work. */
3128  if (avio_seek(pb, pos, SEEK_SET) < 0)
3129  av_log(s, (pb->seekable & AVIO_SEEKABLE_NORMAL) ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
3130 }
3131 
3133 {
3134  MpegTSContext *ts = s->priv_data;
3135  AVIOContext *pb = s->pb;
3136  int64_t pos, probesize = s->probesize;
3137  int64_t seekback = FFMAX(s->probesize, (int64_t)ts->resync_size + PROBE_PACKET_MAX_BUF);
3138 
3139  if (ffio_ensure_seekback(pb, seekback) < 0)
3140  av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n");
3141 
3142  pos = avio_tell(pb);
3144  if (ts->raw_packet_size <= 0) {
3145  av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
3147  }
3148  ts->stream = s;
3149  ts->auto_guess = 0;
3150 
3151  if (s->iformat == &ff_mpegts_demuxer.p) {
3152  /* normal demux */
3153 
3154  /* first do a scan to get all the services */
3155  seek_back(s, pb, pos);
3156 
3160 
3161  handle_packets(ts, probesize / ts->raw_packet_size);
3162  /* if could not find service, enable auto_guess */
3163 
3164  ts->auto_guess = 1;
3165 
3166  av_log(ts->stream, AV_LOG_TRACE, "tuning done\n");
3167 
3168  s->ctx_flags |= AVFMTCTX_NOHEADER;
3169  } else {
3170  AVStream *st;
3171  int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
3172  int64_t pcrs[2], pcr_h;
3173  uint8_t packet[TS_PACKET_SIZE];
3174  const uint8_t *data;
3175 
3176  /* only read packets */
3177 
3178  st = avformat_new_stream(s, NULL);
3179  if (!st)
3180  return AVERROR(ENOMEM);
3181  avpriv_set_pts_info(st, 60, 1, 27000000);
3184 
3185  /* we iterate until we find two PCRs to estimate the bitrate */
3186  pcr_pid = -1;
3187  nb_pcrs = 0;
3188  nb_packets = 0;
3189  for (;;) {
3190  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3191  if (ret < 0)
3192  return ret;
3193  pid = AV_RB16(data + 1) & 0x1fff;
3194  if ((pcr_pid == -1 || pcr_pid == pid) &&
3195  parse_pcr(&pcr_h, &pcr_l, data) == 0) {
3197  pcr_pid = pid;
3198  pcrs[nb_pcrs] = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3199  nb_pcrs++;
3200  if (nb_pcrs >= 2) {
3201  if (pcrs[1] - pcrs[0] > 0) {
3202  /* the difference needs to be positive to make sense for bitrate computation */
3203  break;
3204  } else {
3205  av_log(ts->stream, AV_LOG_WARNING, "invalid pcr pair %"PRId64" >= %"PRId64"\n", pcrs[0], pcrs[1]);
3206  pcrs[0] = pcrs[1];
3207  nb_pcrs--;
3208  }
3209  }
3210  } else {
3212  }
3213  nb_packets++;
3214  }
3215 
3216  /* NOTE1: the bitrate is computed without the FEC */
3217  /* NOTE2: it is only the bitrate of the start of the stream */
3218  ts->pcr_incr = pcrs[1] - pcrs[0];
3219  ts->cur_pcr = pcrs[0] - ts->pcr_incr * (nb_packets - 1);
3220  s->bit_rate = TS_PACKET_SIZE * 8 * 27000000LL / ts->pcr_incr;
3221  st->codecpar->bit_rate = s->bit_rate;
3222  st->start_time = ts->cur_pcr;
3223  av_log(ts->stream, AV_LOG_TRACE, "start=%0.3f pcr=%0.3f incr=%"PRId64"\n",
3224  st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
3225  }
3226 
3227  seek_back(s, pb, pos);
3228  return 0;
3229 }
3230 
3231 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
3232 
3234 {
3235  MpegTSContext *ts = s->priv_data;
3236  int ret, i;
3237  int64_t pcr_h, next_pcr_h, pos;
3238  int pcr_l, next_pcr_l;
3239  uint8_t pcr_buf[12];
3240  const uint8_t *data;
3241 
3242  if ((ret = av_new_packet(pkt, TS_PACKET_SIZE)) < 0)
3243  return ret;
3245  pkt->pos = avio_tell(s->pb);
3246  if (ret < 0) {
3247  return ret;
3248  }
3249  if (data != pkt->data)
3250  memcpy(pkt->data, data, TS_PACKET_SIZE);
3252  if (ts->mpeg2ts_compute_pcr) {
3253  /* compute exact PCR for each packet */
3254  if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
3255  /* we read the next PCR (XXX: optimize it by using a bigger buffer */
3256  pos = avio_tell(s->pb);
3257  for (i = 0; i < MAX_PACKET_READAHEAD; i++) {
3258  avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
3259  avio_read(s->pb, pcr_buf, 12);
3260  if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
3261  /* XXX: not precise enough */
3262  ts->pcr_incr =
3263  ((next_pcr_h - pcr_h) * SYSTEM_CLOCK_FREQUENCY_DIVISOR + (next_pcr_l - pcr_l)) /
3264  (i + 1);
3265  break;
3266  }
3267  }
3268  avio_seek(s->pb, pos, SEEK_SET);
3269  /* no next PCR found: we use previous increment */
3270  ts->cur_pcr = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3271  }
3272  pkt->pts = ts->cur_pcr;
3273  pkt->duration = ts->pcr_incr;
3274  ts->cur_pcr += ts->pcr_incr;
3275  }
3276  pkt->stream_index = 0;
3277  return 0;
3278 }
3279 
3281 {
3282  MpegTSContext *ts = s->priv_data;
3283  int ret, i;
3284 
3285  pkt->size = -1;
3286  ts->pkt = pkt;
3287  ret = handle_packets(ts, 0);
3288  if (ret < 0) {
3289  av_packet_unref(ts->pkt);
3290  /* flush pes data left */
3291  for (i = 0; i < NB_PID_MAX; i++)
3292  if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
3293  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3294  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
3295  ret = new_pes_packet(pes, pkt);
3296  if (ret < 0)
3297  return ret;
3298  pes->state = MPEGTS_SKIP;
3299  ret = 0;
3300  break;
3301  }
3302  }
3303  }
3304 
3305  if (!ret && pkt->size < 0)
3307  return ret;
3308 }
3309 
3310 static void mpegts_free(MpegTSContext *ts)
3311 {
3312  int i;
3313 
3314  clear_programs(ts);
3315 
3316  for (i = 0; i < FF_ARRAY_ELEMS(ts->pools); i++)
3317  av_buffer_pool_uninit(&ts->pools[i]);
3318 
3319  for (i = 0; i < NB_PID_MAX; i++)
3320  if (ts->pids[i])
3321  mpegts_close_filter(ts, ts->pids[i]);
3322 }
3323 
3325 {
3326  MpegTSContext *ts = s->priv_data;
3327  mpegts_free(ts);
3328  return 0;
3329 }
3330 
3332  int64_t *ppos, int64_t pos_limit)
3333 {
3334  MpegTSContext *ts = s->priv_data;
3335  int64_t pos, timestamp;
3336  uint8_t buf[TS_PACKET_SIZE];
3337  int pcr_l, pcr_pid =
3338  ((PESContext *)s->streams[stream_index]->priv_data)->pcr_pid;
3339  int pos47 = ts->pos47_full % ts->raw_packet_size;
3340  pos =
3341  ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) *
3342  ts->raw_packet_size + pos47;
3343  while(pos < pos_limit) {
3344  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3345  return AV_NOPTS_VALUE;
3346  if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
3347  return AV_NOPTS_VALUE;
3348  if (buf[0] != SYNC_BYTE) {
3349  if (mpegts_resync(s, TS_PACKET_SIZE, buf) < 0)
3350  return AV_NOPTS_VALUE;
3351  pos = avio_tell(s->pb);
3352  continue;
3353  }
3354  if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
3355  parse_pcr(&timestamp, &pcr_l, buf) == 0) {
3356  *ppos = pos;
3357  return timestamp;
3358  }
3359  pos += ts->raw_packet_size;
3360  }
3361 
3362  return AV_NOPTS_VALUE;
3363 }
3364 
3365 static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
3366  int64_t *ppos, int64_t pos_limit)
3367 {
3368  MpegTSContext *ts = s->priv_data;
3369  AVPacket *pkt;
3370  int64_t pos;
3371  int pos47 = ts->pos47_full % ts->raw_packet_size;
3372  pos = ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
3374  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3375  return AV_NOPTS_VALUE;
3376  pkt = av_packet_alloc();
3377  if (!pkt)
3378  return AV_NOPTS_VALUE;
3379  while(pos < pos_limit) {
3380  int ret = av_read_frame(s, pkt);
3381  if (ret < 0) {
3382  av_packet_free(&pkt);
3383  return AV_NOPTS_VALUE;
3384  }
3385  if (pkt->dts != AV_NOPTS_VALUE && pkt->pos >= 0) {
3387  av_add_index_entry(s->streams[pkt->stream_index], pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
3388  if (pkt->stream_index == stream_index && pkt->pos >= *ppos) {
3389  int64_t dts = pkt->dts;
3390  *ppos = pkt->pos;
3391  av_packet_free(&pkt);
3392  return dts;
3393  }
3394  }
3395  pos = pkt->pos;
3397  }
3398 
3399  av_packet_free(&pkt);
3400  return AV_NOPTS_VALUE;
3401 }
3402 
3403 /**************************************************************/
3404 /* parsing functions - called from other demuxers such as RTP */
3405 
3407 {
3408  MpegTSContext *ts;
3409 
3410  ts = av_mallocz(sizeof(MpegTSContext));
3411  if (!ts)
3412  return NULL;
3413  /* no stream case, currently used by RTP */
3415  ts->max_packet_size = 2048000;
3416  ts->stream = s;
3417  ts->auto_guess = 1;
3418 
3422 
3423  return ts;
3424 }
3425 
3426 /* return the consumed length if a packet was output, or -1 if no
3427  * packet is output */
3429  const uint8_t *buf, int len)
3430 {
3431  int len1;
3432 
3433  len1 = len;
3434  ts->pkt = pkt;
3435  for (;;) {
3436  ts->stop_parse = 0;
3437  if (len < TS_PACKET_SIZE)
3438  return AVERROR_INVALIDDATA;
3439  if (buf[0] != SYNC_BYTE) {
3440  buf++;
3441  len--;
3442  } else {
3443  handle_packet(ts, buf, len1 - len + TS_PACKET_SIZE);
3444  buf += TS_PACKET_SIZE;
3445  len -= TS_PACKET_SIZE;
3446  if (ts->stop_parse == 1)
3447  break;
3448  }
3449  }
3450  return len1 - len;
3451 }
3452 
3454 {
3455  mpegts_free(ts);
3456  av_free(ts);
3457 }
3458 
3460  .p.name = "mpegts",
3461  .p.long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
3462  .p.extensions = "ts,m4s",
3463  .p.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
3464  .p.priv_class = &mpegts_class,
3465  .priv_data_size = sizeof(MpegTSContext),
3471  .flags_internal = FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE,
3472 };
3473 
3475  .p.name = "mpegtsraw",
3476  .p.long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
3477  .p.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
3478  .p.priv_class = &mpegtsraw_class,
3479  .priv_data_size = sizeof(MpegTSContext),
3484  .flags_internal = FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE,
3485 };
parse_MP4DecConfigDescrTag
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1559
mpegts_set_stream_info
static int mpegts_set_stream_info(AVStream *st, PESContext *pes, uint32_t stream_type, uint32_t prog_reg_desc)
Definition: mpegts.c:917
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:430
parse_mp4_descr_arr
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1499
new_pes_packet
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
Definition: mpegts.c:1012
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
av_buffer_pool_init
AVBufferPool * av_buffer_pool_init(size_t size, AVBufferRef *(*alloc)(size_t size))
Allocate and initialize a buffer pool.
Definition: buffer.c:283
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:278
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
StreamType::stream_type
uint32_t stream_type
Definition: mpegts.c:795
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
MP4DescrParseContext::descr_count
int descr_count
Definition: mpegts.c:1464
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
MP4DecConfigDescrTag
#define MP4DecConfigDescrTag
Definition: isom.h:391
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:451
program
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C program
Definition: undefined.txt:6
MPEGTS_PESHEADER_FILL
@ MPEGTS_PESHEADER_FILL
Definition: mpegts.c:243
MpegTSFilter::discard
int discard
Definition: mpegts.c:103
Program::nb_streams
unsigned int nb_streams
Definition: mpegts.c:122
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
MAX_LEVEL
#define MAX_LEVEL
Definition: mpegts.c:1458
SYSTEM_CLOCK_FREQUENCY_DIVISOR
#define SYSTEM_CLOCK_FREQUENCY_DIVISOR
Definition: mpegts.h:38
AV_CODEC_ID_PCM_BLURAY
@ AV_CODEC_ID_PCM_BLURAY
Definition: codec_id.h:359
PAT_PID
#define PAT_PID
Definition: mpegts.h:41
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
AVFMT_SHOW_IDS
#define AVFMT_SHOW_IDS
Show format stream IDs numbers.
Definition: avformat.h:477
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
mpegts.h
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1229
ff_mp4_read_dec_config_descr
int ff_mp4_read_dec_config_descr(void *logctx, AVStream *st, AVIOContext *pb)
Definition: isom.c:329
out
FILE * out
Definition: movenc.c:55
STREAM_TYPE_AUDIO_AAC
#define STREAM_TYPE_AUDIO_AAC
Definition: mpeg.h:55
ff_parse_pes_pts
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
Definition: mpeg.h:69
TS_DVHS_PACKET_SIZE
#define TS_DVHS_PACKET_SIZE
Definition: mpegts.h:28
pmt_cb
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2333
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
MpegTSFilter::pid
int pid
Definition: mpegts.c:99
ffio_read_indirect
int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
Read size bytes from AVIOContext, returning a pointer.
Definition: aviobuf.c:672
STREAM_TYPE_VIDEO_VC1
#define STREAM_TYPE_VIDEO_VC1
Definition: mpegts.h:151
STREAM_TYPE_PRIVATE_DATA
#define STREAM_TYPE_PRIVATE_DATA
Definition: mpeg.h:54
PESContext::flags
int flags
copied to the AVPacket flags
Definition: mpegts.c:264
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AVStream::priv_data
void * priv_data
Definition: avformat.h:773
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
avpriv_mpegts_parse_packet
int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
Definition: mpegts.c:3428
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
opus_default_extradata
static const uint8_t opus_default_extradata[30]
Definition: opus.h:35
avcodec_get_type
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
Get the type of the given codec.
Definition: codec_desc.c:3799
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:819
av_find_program_from_stream
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
Definition: avformat.c:405
STREAM_ID_EMM_STREAM
#define STREAM_ID_EMM_STREAM
Definition: mpegts.h:189
mpegts_close_filter
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
Definition: mpegts.c:561
STREAM_ID_PADDING_STREAM
#define STREAM_ID_PADDING_STREAM
Definition: mpegts.h:184
AV_CODEC_ID_DIRAC
@ AV_CODEC_ID_DIRAC
Definition: codec_id.h:168
int64_t
long long int64_t
Definition: coverity.c:34
STREAM_ID_PROGRAM_STREAM_MAP
#define STREAM_ID_PROGRAM_STREAM_MAP
Definition: mpegts.h:182
SLConfigDescr::au_seq_num_len
int au_seq_num_len
Definition: mpegts.h:250
Program::pmt_found
int pmt_found
have we found pmt for this program
Definition: mpegts.c:126
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
PESContext::dts
int64_t dts
Definition: mpegts.c:269
METADATA_types
static const StreamType METADATA_types[]
Definition: mpegts.c:883
av_unused
#define av_unused
Definition: attributes.h:131
MP4DescrParseContext::max_descr_count
int max_descr_count
Definition: mpegts.c:1465
Stream::stream_identifier
int stream_identifier
Definition: mpegts.c:113
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
MpegTSContext::skip_changes
int skip_changes
Definition: mpegts.c:158
STREAM_TYPE_AUDIO_MPEG1
#define STREAM_TYPE_AUDIO_MPEG1
Definition: mpeg.h:51
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1368
mpegts_find_stream_type
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
Definition: mpegts.c:899
STREAM_TYPE_VIDEO_VVC
#define STREAM_TYPE_VIDEO_VVC
Definition: mpeg.h:59
MpegTSContext::auto_guess
int auto_guess
if true, all pids are analyzed to find streams
Definition: mpegts.c:139
AVPacket::data
uint8_t * data
Definition: packet.h:539
AV_CODEC_ID_DVB_TELETEXT
@ AV_CODEC_ID_DVB_TELETEXT
Definition: codec_id.h:565
clear_avprogram
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:290
CHECK_BLOCK
#define CHECK_BLOCK
AVOption
AVOption.
Definition: opt.h:429
NULL_PID
#define NULL_PID
Definition: mpegts.h:70
MpegTSSectionFilter
Definition: mpegts.c:85
MPEGTS_SECTION
@ MPEGTS_SECTION
Definition: mpegts.c:67
getstr8
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:697
MpegTSSectionFilter::section_h_size
int section_h_size
Definition: mpegts.c:87
AV_CODEC_ID_AVS2
@ AV_CODEC_ID_AVS2
Definition: codec_id.h:248
data
const char data[16]
Definition: mxf.c:149
opus.h
MpegTSFilter::section_filter
MpegTSSectionFilter section_filter
Definition: mpegts.c:107
HLS_SAMPLE_ENC_types
static const StreamType HLS_SAMPLE_ENC_types[]
Definition: mpegts.c:856
MpegTSState
MpegTSState
Definition: mpegts.c:240
MP4SLDescrTag
#define MP4SLDescrTag
Definition: isom.h:393
MpegTSFilter::u
union MpegTSFilter::@412 u
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
MP4DescrParseContext::s
AVFormatContext * s
Definition: mpegts.c:1460
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
buffer_pool_get
static AVBufferRef * buffer_pool_get(MpegTSContext *ts, int size)
Definition: mpegts.c:1130
PES_HEADER_SIZE
#define PES_HEADER_SIZE
Definition: mpegts.c:250
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:472
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1501
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:557
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
DOVI_VIDEO_STREAM_DESCRIPTOR
#define DOVI_VIDEO_STREAM_DESCRIPTOR
see "Dolby Vision Streams Within the MPEG-2 Transport Stream Format" https://professional....
Definition: mpegts.h:226
ffio_init_read_context
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
Definition: aviobuf.c:99
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:454
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
SetServiceCallback
void SetServiceCallback(void *opaque, int ret)
Definition: mpegts.c:83
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1547
AV_PROFILE_ARIB_PROFILE_C
#define AV_PROFILE_ARIB_PROFILE_C
Definition: defs.h:189
Stream::idx
int idx
Definition: mpegts.c:112
AV_CODEC_ID_HDMV_PGS_SUBTITLE
@ AV_CODEC_ID_HDMV_PGS_SUBTITLE
Definition: codec_id.h:564
ff_read_frame_flush
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
Definition: seek.c:722
add_pid_to_program
static void add_pid_to_program(struct Program *p, unsigned int pid)
Definition: mpegts.c:336
PESContext::pts
int64_t pts
Definition: mpegts.c:269
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:492
FFIOContext
Definition: avio_internal.h:28
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:514
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:75
MpegTSContext::nb_prg
unsigned int nb_prg
structure to keep track of Program->pids mapping
Definition: mpegts.c:174
MpegTSPESFilter::pes_cb
PESCallback * pes_cb
Definition: mpegts.c:77
ENHANCED_AC3_DESCRIPTOR
#define ENHANCED_AC3_DESCRIPTOR
Definition: mpegts.h:216
Program::streams
struct Stream streams[MAX_STREAMS_PER_PROGRAM]
Definition: mpegts.c:123
AV_CODEC_ID_BIN_DATA
@ AV_CODEC_ID_BIN_DATA
Definition: codec_id.h:598
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
STREAM_TYPE_AUDIO_MPEG2
#define STREAM_TYPE_AUDIO_MPEG2
Definition: mpeg.h:52
PESContext::pcr_pid
int pcr_pid
if -1 then all packets containing PCR are considered
Definition: mpegts.c:255
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:610
SectionHeader::id
uint16_t id
Definition: mpegts.c:651
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
SLConfigDescr::use_idle
int use_idle
Definition: mpegts.h:243
AV_PKT_DATA_DOVI_CONF
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition: packet.h:280
crc.h
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:381
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
PROBE_PACKET_MAX_BUF
#define PROBE_PACKET_MAX_BUF
Definition: mpegts.c:62
mpegtsraw_class
static const AVClass mpegtsraw_class
Definition: mpegts.c:231
AV_PROFILE_ARIB_PROFILE_A
#define AV_PROFILE_ARIB_PROFILE_A
Definition: defs.h:188
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
PESContext::state
enum MpegTSState state
Definition: mpegts.c:261
MpegTSFilter::pes_filter
MpegTSPESFilter pes_filter
Definition: mpegts.c:106
STREAM_TYPE_HLS_SE_AUDIO_AC3
#define STREAM_TYPE_HLS_SE_AUDIO_AC3
Definition: mpegts.h:177
METADATA_DESCRIPTOR
#define METADATA_DESCRIPTOR
Definition: mpegts.h:203
SLConfigDescr::inst_bitrate_len
int inst_bitrate_len
Definition: mpegts.h:248
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:868
REGISTRATION_DESCRIPTOR
#define REGISTRATION_DESCRIPTOR
Definition: mpegts.h:198
mpegts_read_close
static int mpegts_read_close(AVFormatContext *s)
Definition: mpegts.c:3324
mpegts_raw_read_packet
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3233
find_matching_stream
static AVStream * find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid, int stream_identifier, int pmt_stream_idx, struct Program *p)
Definition: mpegts.c:2255
update_av_program_info
static void update_av_program_info(AVFormatContext *s, unsigned int programid, unsigned int pid, int version)
Definition: mpegts.c:352
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:358
MP4ODescrTag
#define MP4ODescrTag
Definition: isom.h:388
PESCallback
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
Definition: mpegts.c:73
VIDEO_STREAM_DESCRIPTOR
#define VIDEO_STREAM_DESCRIPTOR
Definition: mpegts.h:197
STREAM_TYPE_VIDEO_AVS2
#define STREAM_TYPE_VIDEO_AVS2
Definition: mpegts.h:149
STREAM_TYPE_VIDEO_AVS3
#define STREAM_TYPE_VIDEO_AVS3
Definition: mpegts.h:150
STREAM_ID_DSMCC_STREAM
#define STREAM_ID_DSMCC_STREAM
Definition: mpegts.h:190
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: seek.c:122
pat_cb
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2553
GetBitContext
Definition: get_bits.h:108
Program::nb_pids
unsigned int nb_pids
Definition: mpegts.c:120
AVDOVIDecoderConfigurationRecord::dv_md_compression
uint8_t dv_md_compression
Definition: dovi_meta.h:64
SLConfigDescr::use_padding
int use_padding
Definition: mpegts.h:241
mp4_read_iods
static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
Definition: mpegts.c:1670
AVProgram::discard
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:1227
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:143
STREAM_TYPE_ATSC_AUDIO_EAC3
#define STREAM_TYPE_ATSC_AUDIO_EAC3
Definition: mpegts.h:170
AV_DISPOSITION_STILL_IMAGE
#define AV_DISPOSITION_STILL_IMAGE
The video stream contains still images.
Definition: avformat.h:713
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
SectionHeader::last_sec_num
uint8_t last_sec_num
Definition: mpegts.c:655
val
static double val(void *priv, double ch)
Definition: aeval.c:77
EIT_TID
#define EIT_TID
Definition: mpegts.h:99
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
MP4IODescrTag
#define MP4IODescrTag
Definition: isom.h:389
STREAM_TYPE_HLS_SE_AUDIO_EAC3
#define STREAM_TYPE_HLS_SE_AUDIO_EAC3
Definition: mpegts.h:178
PESContext::sl
SLConfigDescr sl
Definition: mpegts.c:273
SLConfigDescr::use_rand_acc_pt
int use_rand_acc_pt
Definition: mpegts.h:240
SDT_PID
#define SDT_PID
Definition: mpegts.h:47
av_new_program
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition: avformat.c:347
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:449
STREAM_TYPE_VIDEO_JPEG2000
#define STREAM_TYPE_VIDEO_JPEG2000
Definition: mpegts.h:145
PESContext::stream
AVFormatContext * stream
Definition: mpegts.c:258
SLConfigDescr::timestamp_len
int timestamp_len
Definition: mpegts.h:245
MAX_SECTION_SIZE
#define MAX_SECTION_SIZE
Definition: mpegts.h:34
av_dovi_alloc
AVDOVIDecoderConfigurationRecord * av_dovi_alloc(size_t *size)
Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its fields to default values.
Definition: dovi_meta.c:26
STREAM_ID_METADATA_STREAM
#define STREAM_ID_METADATA_STREAM
Definition: mpegts.h:192
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:559
PESContext::sub_st
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
Definition: mpegts.c:260
ff_mp4_parse_es_descr
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
Definition: isom.c:304
SectionHeader::current_next
uint8_t current_next
Definition: mpegts.c:653
MpegTSContext::merge_pmt_versions
int merge_pmt_versions
Definition: mpegts.c:165
AV_DISPOSITION_CLEAN_EFFECTS
#define AV_DISPOSITION_CLEAN_EFFECTS
The audio stream contains music and sound effects without voice.
Definition: avformat.h:666
PESContext::header
uint8_t header[MAX_PES_HEADER_SIZE]
Definition: mpegts.c:271
SUBTITLING_DESCRIPTOR
#define SUBTITLING_DESCRIPTOR
Definition: mpegts.h:214
avassert.h
MPEGTS_OPTIONS
#define MPEGTS_OPTIONS
Definition: mpegts.c:186
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:761
MpegTSContext::pos47_full
int64_t pos47_full
Definition: mpegts.c:136
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:235
avpriv_mpegts_parse_close
void avpriv_mpegts_parse_close(MpegTSContext *ts)
Definition: mpegts.c:3453
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
MpegTSContext::id
int id
Definition: mpegts.c:168
STREAM_TYPE_BLURAY_AUDIO_AC3
#define STREAM_TYPE_BLURAY_AUDIO_AC3
Definition: mpegts.h:156
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
StreamType::codec_id
enum AVCodecID codec_id
Definition: mpegts.c:797
PESContext
Definition: mpegts.c:253
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:595
DTS_DESCRIPTOR
#define DTS_DESCRIPTOR
Definition: mpegts.h:217
Mp4Descr::sl
SLConfigDescr sl
Definition: mpegts.h:258
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
opus_coupled_stream_cnt
static const uint8_t opus_coupled_stream_cnt[9]
Definition: mpegts.c:1797
AVFormatContext::ctx_flags
int ctx_flags
Flags signalling stream properties.
Definition: avformat.h:1349
AVProgram::id
int id
Definition: avformat.h:1225
ff_parse_mpeg2_descriptor
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, const uint8_t **pp, const uint8_t *desc_list_end, Mp4Descr *mp4_descr, int mp4_descr_count, int pid, MpegTSContext *ts)
Parse an MPEG-2 descriptor.
Definition: mpegts.c:1816
MpegTSContext::pools
AVBufferPool * pools[32]
Definition: mpegts.c:183
parse_pcr
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
Definition: mpegts.c:3097
AV_CODEC_ID_S302M
@ AV_CODEC_ID_S302M
Definition: codec_id.h:361
av_buffer_pool_get
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition: buffer.c:390
MpegTSContext::stream
AVFormatContext * stream
Definition: mpegts.c:132
AV_CODEC_ID_MPEG4SYSTEMS
@ AV_CODEC_ID_MPEG4SYSTEMS
FAKE codec to indicate a MPEG-4 Systems stream (only used by libavformat)
Definition: codec_id.h:607
STREAM_TYPE_VIDEO_MPEG4
#define STREAM_TYPE_VIDEO_MPEG4
Definition: mpeg.h:56
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:99
mpegts_get_pcr
static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:3331
mpegts_class
static const AVClass mpegts_class
Definition: mpegts.c:216
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1500
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:553
TELETEXT_DESCRIPTOR
#define TELETEXT_DESCRIPTOR
Definition: mpegts.h:213
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:453
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
STUFFING_BYTE
#define STUFFING_BYTE
Definition: mpegts.h:37
STREAM_TYPE_SCTE_DATA_SCTE_35
#define STREAM_TYPE_SCTE_DATA_SCTE_35
Definition: mpegts.h:167
STREAM_TYPE_ISO_IEC_14496_PES
#define STREAM_TYPE_ISO_IEC_14496_PES
ISO/IEC 14496-1 (MPEG-4 Systems) SL-packetized stream or FlexMux stream carried in PES packets.
Definition: mpegts.h:135
bits
uint8_t bits
Definition: vp3data.h:128
SLConfigDescr::degr_prior_len
int degr_prior_len
Definition: mpegts.h:249
STREAM_TYPE_BLURAY_AUDIO_TRUEHD
#define STREAM_TYPE_BLURAY_AUDIO_TRUEHD
Definition: mpegts.h:158
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
SYNC_BYTE
#define SYNC_BYTE
Definition: mpegts.h:36
ff_mpegtsraw_demuxer
const FFInputFormat ff_mpegtsraw_demuxer
Definition: mpegts.c:3474
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
mpegts_open_filter
static MpegTSFilter * mpegts_open_filter(MpegTSContext *ts, unsigned int pid, enum MpegTSFilterType type)
Definition: mpegts.c:490
AVDOVIDecoderConfigurationRecord::dv_profile
uint8_t dv_profile
Definition: dovi_meta.h:58
PES_START_SIZE
#define PES_START_SIZE
Definition: mpegts.c:249
MpegTSContext::resync_size
int resync_size
Definition: mpegts.c:164
channels
channels
Definition: aptx.h:31
get_bits.h
SectionHeader::sec_num
uint8_t sec_num
Definition: mpegts.c:654
STREAM_ID_TYPE_E_STREAM
#define STREAM_ID_TYPE_E_STREAM
Definition: mpegts.h:191
nb_streams
static int nb_streams
Definition: ffprobe.c:385
PESContext::stream_type
int stream_type
Definition: mpegts.c:256
parse_MP4IODescrTag
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1510
PMT_TID
#define PMT_TID
Definition: mpegts.h:85
skip_identical
static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf)
Definition: mpegts.c:658
opus_stream_cnt
static const uint8_t opus_stream_cnt[9]
Definition: mpegts.c:1801
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
STREAM_TYPE_VIDEO_MPEG1
#define STREAM_TYPE_VIDEO_MPEG1
Definition: mpeg.h:49
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
AVDOVIDecoderConfigurationRecord::dv_version_major
uint8_t dv_version_major
Definition: dovi_meta.h:56
MPEGTS_SKIP
@ MPEGTS_SKIP
Definition: mpegts.c:245
MpegTSPESFilter::opaque
void * opaque
Definition: mpegts.c:78
get8
static int get8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:669
discard_pid
static int discard_pid(MpegTSContext *ts, unsigned int pid)
discard_pid() decides if the pid is to be discarded according to caller's programs selection
Definition: mpegts.c:382
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:583
if
if(ret)
Definition: filter_design.txt:179
MpegTSContext::cur_pcr
int64_t cur_pcr
used to estimate the exact PCR
Definition: mpegts.c:147
clear_programs
static void clear_programs(MpegTSContext *ts)
Definition: mpegts.c:314
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:325
MP4ESDescrTag
#define MP4ESDescrTag
Definition: isom.h:390
AV_CODEC_ID_AVS3
@ AV_CODEC_ID_AVS3
Definition: codec_id.h:250
MP4DescrParseContext::active_descr
Mp4Descr * active_descr
Definition: mpegts.c:1463
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:221
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
FMC_DESCRIPTOR
#define FMC_DESCRIPTOR
Definition: mpegts.h:202
internal.h
MpegTSContext::pcr_incr
int64_t pcr_incr
used to estimate the exact PCR
Definition: mpegts.c:148
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:522
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:771
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
STREAM_TYPE_ATSC_AUDIO_AC3
#define STREAM_TYPE_ATSC_AUDIO_AC3
Definition: mpegts.h:169
NULL
#define NULL
Definition: coverity.c:32
AVDOVIDecoderConfigurationRecord::dv_level
uint8_t dv_level
Definition: dovi_meta.h:59
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:378
AVDOVIDecoderConfigurationRecord::dv_bl_signal_compatibility_id
uint8_t dv_bl_signal_compatibility_id
Definition: dovi_meta.h:63
MPEGTS_HEADER
@ MPEGTS_HEADER
Definition: mpegts.c:241
MpegTSSectionFilter::crc
unsigned crc
Definition: mpegts.c:89
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
MpegTSContext::stop_parse
int stop_parse
stop parsing loop
Definition: mpegts.c:152
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1251
isom.h
AV_CODEC_ID_TIMED_ID3
@ AV_CODEC_ID_TIMED_ID3
Definition: codec_id.h:597
MpegTSContext::current_pid
int current_pid
Definition: mpegts.c:180
MpegTSSectionFilter::section_index
int section_index
Definition: mpegts.c:86
MpegTSContext::last_pos
int64_t last_pos
to detect seek
Definition: mpegts.c:156
Mp4Descr::es_id
int es_id
Definition: mpegts.h:255
MpegTSFilter::es_id
int es_id
Definition: mpegts.c:100
MPEGTS_PESHEADER
@ MPEGTS_PESHEADER
Definition: mpegts.c:242
DESC_types
static const StreamType DESC_types[]
Definition: mpegts.c:890
PESContext::extended_stream_id
int extended_stream_id
Definition: mpegts.c:267
Mp4Descr::dec_config_descr_len
int dec_config_descr_len
Definition: mpegts.h:256
STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
#define STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
Definition: mpegts.h:162
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
MpegTSSectionFilter::section_buf
uint8_t * section_buf
Definition: mpegts.c:91
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
eit_cb
static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2641
av_buffer_pool_uninit
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition: buffer.c:328
MpegTSFilter::type
enum MpegTSFilterType type
Definition: mpegts.c:104
mpegts_open_pcr_filter
static MpegTSFilter * mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
Definition: mpegts.c:556
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
SectionHeader::version
uint8_t version
Definition: mpegts.c:652
options
Definition: swscale.c:42
seek_back
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos)
Definition: mpegts.c:3123
SLConfigDescr::ocr_len
int ocr_len
Definition: mpegts.h:246
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1228
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:828
AV_CODEC_ID_MPEG2TS
@ AV_CODEC_ID_MPEG2TS
FAKE codec to indicate a raw MPEG-2 TS stream (only used by libavformat)
Definition: codec_id.h:605
add_pes_stream
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
Definition: mpegts.c:1434
MpegTSFilterType
MpegTSFilterType
Definition: mpegts.c:65
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
StreamType
Definition: mpegts.c:794
STREAM_TYPE_HLS_SE_VIDEO_H264
#define STREAM_TYPE_HLS_SE_VIDEO_H264
Definition: mpegts.h:175
AV_CODEC_ID_SMPTE_KLV
@ AV_CODEC_ID_SMPTE_KLV
Definition: codec_id.h:595
mpegts_open_section_filter
static MpegTSFilter * mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, SectionCallback *section_cb, void *opaque, int check_crc)
Definition: mpegts.c:513
SLConfigDescr::packet_seq_num_len
int packet_seq_num_len
Definition: mpegts.h:251
EXTENSION_DESCRIPTOR
#define EXTENSION_DESCRIPTOR
Definition: mpegts.h:218
mpegts_open_pes_filter
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
Definition: mpegts.c:540
PESContext::ts
MpegTSContext * ts
Definition: mpegts.c:257
STREAM_TYPE_VIDEO_MVC
#define STREAM_TYPE_VIDEO_MVC
Definition: mpegts.h:144
OEITS_END_TID
#define OEITS_END_TID
Definition: mpegts.h:104
init_MP4DescrParseContext
static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int max_descr_count)
Definition: mpegts.c:1470
MAX_PES_HEADER_SIZE
#define MAX_PES_HEADER_SIZE
Definition: mpegts.c:251
MAX_PACKET_READAHEAD
#define MAX_PACKET_READAHEAD
Definition: mpegts.c:3231
MAX_PIDS_PER_PROGRAM
#define MAX_PIDS_PER_PROGRAM
Definition: mpegts.c:117
MpegTSSectionFilter::end_of_section_reached
unsigned int end_of_section_reached
Definition: mpegts.c:93
index
int index
Definition: gxfenc.c:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
parse_MP4ODescrTag
static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1523
ff_mp4_read_descr
int ff_mp4_read_descr(void *logctx, AVIOContext *pb, int *tag)
Definition: isom.c:295
mpegts_push_data
static int mpegts_push_data(MpegTSFilter *filter, const uint8_t *buf, int buf_size, int is_start, int64_t pos)
Definition: mpegts.c:1143
SLConfigDescr::use_au_start
int use_au_start
Definition: mpegts.h:238
new_data_packet
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
Definition: mpegts.c:1005
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
AV_CODEC_ID_EAC3
@ AV_CODEC_ID_EAC3
Definition: codec_id.h:488
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
SDT_TID
#define SDT_TID
Definition: mpegts.h:91
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:450
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
SCTE_types
static const StreamType SCTE_types[]
Definition: mpegts.c:842
MPEGTS_PES
@ MPEGTS_PES
Definition: mpegts.c:66
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
ff_mpegts_demuxer
const FFInputFormat ff_mpegts_demuxer
Definition: mpegts.c:3459
AVMediaType
AVMediaType
Definition: avutil.h:199
MP4DescrParseContext::descr
Mp4Descr * descr
Definition: mpegts.c:1462
AVPacket::size
int size
Definition: packet.h:540
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:261
MpegTSContext::max_packet_size
int max_packet_size
Definition: mpegts.c:166
STREAM_TYPE_VIDEO_HEVC
#define STREAM_TYPE_VIDEO_HEVC
Definition: mpeg.h:58
FFStream
Definition: internal.h:132
SectionHeader::tid
uint8_t tid
Definition: mpegts.c:650
reset_pes_packet_state
static void reset_pes_packet_state(PESContext *pes)
Definition: mpegts.c:996
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
AV_CODEC_ID_DTS
@ AV_CODEC_ID_DTS
Definition: codec_id.h:452
Program
Definition: mpegts.c:118
MpegTSContext
Definition: mpegts.c:129
MpegTSFilter
Definition: mpegts.c:98
size
int size
Definition: twinvq_data.h:10344
FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE
#define FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE
Definition: demux.h:40
MPEGTS_PAYLOAD
@ MPEGTS_PAYLOAD
Definition: mpegts.c:244
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
MpegTSContext::raw_packet_size
int raw_packet_size
raw packet size, including FEC if present
Definition: mpegts.c:134
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
finished_reading_packet
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
Definition: mpegts.c:2989
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
section
Definition: ffprobe.c:242
STREAM_ID_PRIVATE_STREAM_2
#define STREAM_ID_PRIVATE_STREAM_2
Definition: mpegts.h:185
SLConfigDescr::use_au_end
int use_au_end
Definition: mpegts.h:239
MpegTSSectionFilter::check_crc
unsigned int check_crc
Definition: mpegts.c:92
MpegTSContext::skip_clear
int skip_clear
Definition: mpegts.c:159
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:128
mpegts_get_dts
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:3365
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:508
mpegts_read_packet
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3280
ff_find_stream_index
int ff_find_stream_index(const AVFormatContext *s, int id)
Find stream index based on format-specific stream ID.
Definition: demux_utils.c:354
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:46
parse_MP4ESDescrTag
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1537
STREAM_IDENTIFIER_DESCRIPTOR
#define STREAM_IDENTIFIER_DESCRIPTOR
Definition: mpegts.h:212
buffer.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:658
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:538
STREAM_TYPE_AUDIO_MPEG4
#define STREAM_TYPE_AUDIO_MPEG4
ISO/IEC 14496-3 Audio, without using any additional transport syntax, such as DST,...
Definition: mpegts.h:143
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:603
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
STREAM_TYPE_VIDEO_MPEG2
#define STREAM_TYPE_VIDEO_MPEG2
Definition: mpeg.h:50
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1023
AV_CODEC_ID_VVC
@ AV_CODEC_ID_VVC
Definition: codec_id.h:252
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
SectionCallback
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
Definition: mpegts.c:81
av_packet_side_data_add
AVPacketSideData * av_packet_side_data_add(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, void *data, size_t size, int flags)
Wrap existing data as packet side data.
Definition: packet.c:700
mpeg.h
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
FFStream::pts_wrap_behavior
int pts_wrap_behavior
Options for behavior, when a wrap is detected.
Definition: internal.h:271
PESContext::pid
int pid
Definition: mpegts.c:254
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:545
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:64
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:553
version
version
Definition: libkvazaar.c:321
FFStream::probe_packets
int probe_packets
Number of packets to buffer for codec probing.
Definition: internal.h:322
handle_packet
static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
Definition: mpegts.c:2785
STREAM_TYPE_AUDIO_AAC_LATM
#define STREAM_TYPE_AUDIO_AAC_LATM
Definition: mpegts.h:131
DATA_COMPONENT_DESCRIPTOR
#define DATA_COMPONENT_DESCRIPTOR
Definition: mpegts.h:228
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:220
update_offsets
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
Definition: mpegts.c:1489
get_bits64
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:453
EIT_PID
#define EIT_PID
Definition: mpegts.h:49
is_pes_stream
static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
Definition: mpegts.c:2317
STREAM_TYPE_VIDEO_DIRAC
#define STREAM_TYPE_VIDEO_DIRAC
Definition: mpegts.h:152
SectionHeader
Definition: mpegts.c:649
ISO_639_LANGUAGE_DESCRIPTOR
#define ISO_639_LANGUAGE_DESCRIPTOR
Definition: mpegts.h:199
MP4DescrParseContext::pb
FFIOContext pb
Definition: mpegts.c:1461
log.h
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:532
avio_internal.h
IOD_DESCRIPTOR
#define IOD_DESCRIPTOR
Definition: mpegts.h:200
parse_stream_identifier_desc
static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
Definition: mpegts.c:2281
MAX_MP4_DESCR_COUNT
#define MAX_MP4_DESCR_COUNT
Definition: mpegts.c:53
PESContext::data_index
int data_index
Definition: mpegts.c:263
AV_CODEC_ID_SMPTE_2038
@ AV_CODEC_ID_SMPTE_2038
Definition: codec_id.h:599
internal.h
get_program
static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:279
STREAM_TYPE_BLURAY_SUBTITLE_TEXT
#define STREAM_TYPE_BLURAY_SUBTITLE_TEXT
Definition: mpegts.h:165
PAT_TID
#define PAT_TID
Definition: mpegts.h:83
MpegTSContext::pids
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
Definition: mpegts.c:179
PESContext::pes_header_size
int pes_header_size
Definition: mpegts.c:266
AV_CODEC_ID_CAVS
@ AV_CODEC_ID_CAVS
Definition: codec_id.h:139
get16
static int get16(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:682
parse_section_header
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:764
MpegTSContext::epg_stream
AVStream * epg_stream
Definition: mpegts.c:182
AV_CODEC_ID_EPG
@ AV_CODEC_ID_EPG
Definition: codec_id.h:590
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:598
mpegts_resync
static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
Definition: mpegts.c:2915
MpegTSContext::crc_validity
int8_t crc_validity[NB_PID_MAX]
Definition: mpegts.c:177
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
PESContext::st
AVStream * st
Definition: mpegts.c:259
STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
#define STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
Definition: mpegts.h:161
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AV_PKT_DATA_MPEGTS_STREAM_ID
@ AV_PKT_DATA_MPEGTS_STREAM_ID
MPEGTS stream ID as uint8_t, this is required to pass the stream ID information from the demuxer to t...
Definition: packet.h:212
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1224
handle_packets
static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
Definition: mpegts.c:3001
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:122
demux.h
MpegTSContext::prg
struct Program * prg
Definition: mpegts.c:175
AV_DISPOSITION_DEPENDENT
#define AV_DISPOSITION_DEPENDENT
The stream is intended to be mixed with another stream before presentation.
Definition: avformat.h:709
len
int len
Definition: vorbis_enc_data.h:426
AV_CODEC_ID_JPEG2000
@ AV_CODEC_ID_JPEG2000
Definition: codec_id.h:140
STREAM_TYPE_BLURAY_AUDIO_DTS_HD
#define STREAM_TYPE_BLURAY_AUDIO_DTS_HD
Definition: mpegts.h:160
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
MpegTSPESFilter
Definition: mpegts.c:76
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
SERVICE_DESCRIPTOR
#define SERVICE_DESCRIPTOR
Definition: mpegts.h:211
SLConfigDescr::au_len
int au_len
Definition: mpegts.h:247
MpegTSFilter::last_pcr
int64_t last_pcr
Definition: mpegts.c:102
STREAM_TYPE_PRIVATE_SECTION
#define STREAM_TYPE_PRIVATE_SECTION
Definition: mpeg.h:53
MpegTSSectionFilter::last_crc
unsigned last_crc
Definition: mpegts.c:90
language
Undefined Behavior In the C language
Definition: undefined.txt:3
STREAM_TYPE_BLURAY_AUDIO_DTS_EXPRESS_SECONDARY
#define STREAM_TYPE_BLURAY_AUDIO_DTS_EXPRESS_SECONDARY
Definition: mpegts.h:163
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:817
mid_pred
#define mid_pred
Definition: mathops.h:96
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:662
MP4DescrParseContext
Definition: mpegts.c:1459
SUPPLEMENTARY_AUDIO_DESCRIPTOR
#define SUPPLEMENTARY_AUDIO_DESCRIPTOR
Definition: mpegts.h:222
tag
uint32_t tag
Definition: movenc.c:1879
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:760
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
MpegTSSectionFilter::last_ver
int last_ver
Definition: mpegts.c:88
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:231
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:80
Mp4Descr::dec_config_descr
uint8_t * dec_config_descr
Definition: mpegts.h:257
SLConfigDescr::use_timestamps
int use_timestamps
Definition: mpegts.h:242
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:746
STREAM_TYPE_BLURAY_AUDIO_EAC3
#define STREAM_TYPE_BLURAY_AUDIO_EAC3
Definition: mpegts.h:159
mp4_read_od
static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
Definition: mpegts.c:1688
scte_data_cb
static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1768
AC3_DESCRIPTOR
#define AC3_DESCRIPTOR
Definition: mpegts.h:215
pos
unsigned int pos
Definition: spdifenc.c:414
avformat.h
dovi_meta.h
STREAM_TYPE_HLS_SE_AUDIO_AAC
#define STREAM_TYPE_HLS_SE_AUDIO_AAC
Definition: mpegts.h:176
m4sl_cb
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1704
dict.h
AV_DISPOSITION_DESCRIPTIONS
#define AV_DISPOSITION_DESCRIPTIONS
The subtitle stream contains a textual description of the video content.
Definition: avformat.h:698
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
TS_MAX_PACKET_SIZE
#define TS_MAX_PACKET_SIZE
Definition: mpegts.h:30
STREAM_TYPE_BLURAY_AUDIO_PCM_BLURAY
#define STREAM_TYPE_BLURAY_AUDIO_PCM_BLURAY
Definition: mpegts.h:155
M4OD_TID
#define M4OD_TID
Definition: mpegts.h:88
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:28
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:754
R8_CHECK_CLIP_MAX
#define R8_CHECK_CLIP_MAX(dst, maxv)
probe
static int probe(const AVProbeData *p)
Definition: act.c:39
mpegts_probe
static int mpegts_probe(const AVProbeData *p)
Definition: mpegts.c:3054
PESContext::PES_packet_length
int PES_packet_length
Definition: mpegts.c:265
STREAM_TYPE_VIDEO_H264
#define STREAM_TYPE_VIDEO_H264
Definition: mpeg.h:57
clear_program
static void clear_program(struct Program *p)
Definition: mpegts.c:305
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: packet.c:232
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
NB_PID_MAX
#define NB_PID_MAX
Definition: mpegts.h:32
AVDOVIDecoderConfigurationRecord::bl_present_flag
uint8_t bl_present_flag
Definition: dovi_meta.h:62
SL_DESCRIPTOR
#define SL_DESCRIPTOR
Definition: mpegts.h:201
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
defs.h
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:612
STREAM_TYPE_VIDEO_CAVS
#define STREAM_TYPE_VIDEO_CAVS
Definition: mpeg.h:60
PESContext::stream_id
uint8_t stream_id
Definition: mpegts.c:268
parse_MP4SLDescrTag
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1573
avpriv_mpegts_parse_open
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
Definition: mpegts.c:3406
PESContext::buffer
AVBufferRef * buffer
Definition: mpegts.c:272
CHECK_COUNT
#define CHECK_COUNT
AVDOVIDecoderConfigurationRecord::rpu_present_flag
uint8_t rpu_present_flag
Definition: dovi_meta.h:60
mpegts_free
static void mpegts_free(MpegTSContext *ts)
Definition: mpegts.c:3310
HDMV_types
static const StreamType HDMV_types[]
Definition: mpegts.c:826
AVDOVIDecoderConfigurationRecord::el_present_flag
uint8_t el_present_flag
Definition: dovi_meta.h:61
AVPacket::stream_index
int stream_index
Definition: packet.h:541
AVPROBE_SCORE_STREAM_RETRY
#define AVPROBE_SCORE_STREAM_RETRY
Definition: avformat.h:459
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:318
SLConfigDescr::timestamp_res
int timestamp_res
Definition: mpegts.h:244
ISO_types
static const StreamType ISO_types[]
Definition: mpegts.c:800
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:356
AVDOVIDecoderConfigurationRecord::dv_version_minor
uint8_t dv_version_minor
Definition: dovi_meta.h:57
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
hex_dump_debug
#define hex_dump_debug(class, buf, size)
Definition: internal.h:39
read_sl_header
static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
Definition: mpegts.c:1059
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:481
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
MpegTSContext::pkt
AVPacket * pkt
packet containing Audio/Video data
Definition: mpegts.c:154
mpegts_read_header
static int mpegts_read_header(AVFormatContext *s)
Definition: mpegts.c:3132
AV_DOVI_COMPRESSION_NONE
@ AV_DOVI_COMPRESSION_NONE
Definition: dovi_meta.h:68
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
STREAM_TYPE_METADATA
#define STREAM_TYPE_METADATA
Definition: mpegts.h:139
MPEGTS_PCR
@ MPEGTS_PCR
Definition: mpegts.c:68
FFStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: internal.h:202
Program::id
unsigned int id
Definition: mpegts.c:119
STREAM_ID_ECM_STREAM
#define STREAM_ID_ECM_STREAM
Definition: mpegts.h:188
MpegTSSectionFilter::opaque
void * opaque
Definition: mpegts.c:95
PESContext::merged_st
int merged_st
Definition: mpegts.c:274
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
TS_FEC_PACKET_SIZE
#define TS_FEC_PACKET_SIZE
Definition: mpegts.h:27
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
MAX_STREAMS_PER_PROGRAM
#define MAX_STREAMS_PER_PROGRAM
Definition: mpegts.c:116
AVPacket
This structure stores compressed data.
Definition: packet.h:516
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
STREAM_ID_PROGRAM_STREAM_DIRECTORY
#define STREAM_ID_PROGRAM_STREAM_DIRECTORY
Definition: mpegts.h:194
MpegTSFilter::last_cc
int last_cc
Definition: mpegts.c:101
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
MpegTSContext::scan_all_pmts
int scan_all_pmts
Definition: mpegts.c:162
AV_CODEC_ID_AC4
@ AV_CODEC_ID_AC4
Definition: codec_id.h:551
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:559
MP4DescrParseContext::predefined_SLConfigDescriptor_seen
int predefined_SLConfigDescriptor_seen
Definition: mpegts.c:1467
FFInputFormat
Definition: demux.h:42
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
Stream
Definition: mpegts.c:111
MP4DescrParseContext::level
int level
Definition: mpegts.c:1466
bytestream.h
FFStream::stream_identifier
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Definition: internal.h:338
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:593
STREAM_TYPE_ISO_IEC_14496_SECTION
#define STREAM_TYPE_ISO_IEC_14496_SECTION
ISO/IEC 14496-1 (MPEG-4 Systems) SL-packetized stream or FlexMux stream carried in ISO_IEC_14496_sect...
Definition: mpegts.h:138
MpegTSContext::skip_unknown_pmt
int skip_unknown_pmt
Definition: mpegts.c:160
raw_options
static const AVOption raw_options[]
Definition: mpegts.c:223
FFStream::need_context_update
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
Definition: internal.h:177
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
opus_channel_map
static const uint8_t opus_channel_map[8][8]
Definition: mpegts.c:1805
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
Program::pids
unsigned int pids[MAX_PIDS_PER_PROGRAM]
Definition: mpegts.c:121
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_CODEC_ID_AAC_LATM
@ AV_CODEC_ID_AAC_LATM
Definition: codec_id.h:497
parse_mp4_descr
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
Definition: mpegts.c:1616
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
STREAM_TYPE_BLURAY_AUDIO_DTS
#define STREAM_TYPE_BLURAY_AUDIO_DTS
Definition: mpegts.h:157
AV_CODEC_ID_HDMV_TEXT_SUBTITLE
@ AV_CODEC_ID_HDMV_TEXT_SUBTITLE
Definition: codec_id.h:581
TS_PACKET_SIZE
#define TS_PACKET_SIZE
Definition: mpegts.h:29
MpegTSSectionFilter::section_cb
SectionCallback * section_cb
Definition: mpegts.c:94
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
PROBE_PACKET_MARGIN
#define PROBE_PACKET_MARGIN
Definition: mpegts.c:63
h
h
Definition: vp9dsp_template.c:2070
read_timestamp
static int64_t read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit, int64_t(*read_timestamp)(struct AVFormatContext *, int, int64_t *, int64_t))
Definition: seek.c:281
get_ts64
static uint64_t get_ts64(GetBitContext *gb, int bits)
Definition: mpegts.c:1052
AVStream::start_time
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
Definition: avformat.h:797
get_packet_size
static int get_packet_size(AVFormatContext *s)
Definition: mpegts.c:611
analyze
static int analyze(const uint8_t *buf, int size, int packet_size, int probe)
Definition: mpegts.c:582
write_section_data
static void write_section_data(MpegTSContext *ts, MpegTSFilter *tss1, const uint8_t *buf, int buf_size, int is_start)
Assemble PES packets out of TS packets, and then call the "section_cb" function when they are complet...
Definition: mpegts.c:423
ff_reduce_index
void ff_reduce_index(AVFormatContext *s, int stream_index)
Ensure the index uses less memory than the maximum specified in AVFormatContext.max_index_size by dis...
Definition: seek.c:50
read_packet
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, const uint8_t **data)
Definition: mpegts.c:2958
MpegTSContext::mpeg2ts_compute_pcr
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
Definition: mpegts.c:142
REGD_types
static const StreamType REGD_types[]
Definition: mpegts.c:864
MISC_types
static const StreamType MISC_types[]
Definition: mpegts.c:848
STREAM_TYPE_BLURAY_SUBTITLE_PGS
#define STREAM_TYPE_BLURAY_SUBTITLE_PGS
Definition: mpegts.h:164
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:54
add_program
static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:320
options
static const AVOption options[]
Definition: mpegts.c:197
snprintf
#define snprintf
Definition: snprintf.h:34
PESContext::ts_packet_pos
int64_t ts_packet_pos
position of first TS packet of this PES packet
Definition: mpegts.c:270
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AVProgram::pcr_pid
int pcr_pid
Definition: avformat.h:1234
FFStream::pts_wrap_reference
int64_t pts_wrap_reference
Internal data to check for wrapping of the time stamp.
Definition: internal.h:259
Mp4Descr
Definition: mpegts.h:254
SLConfigDescr
Definition: mpegts.h:237
avio_read_partial
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:684
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:375
sdt_cb
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2695
MpegTSContext::fix_teletext_pts
int fix_teletext_pts
fix dvb teletext pts
Definition: mpegts.c:145
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98
ff_alloc_extradata
int ff_alloc_extradata(AVCodecParameters *par, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0.
Definition: utils.c:227
AVDOVIDecoderConfigurationRecord
Definition: dovi_meta.h:55
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:346
AV_CODEC_ID_SCTE_35
@ AV_CODEC_ID_SCTE_35
Contain timestamp estimated through PCR of program stream.
Definition: codec_id.h:589
StreamType::codec_type
enum AVMediaType codec_type
Definition: mpegts.c:796