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 
25 #include "libavutil/buffer.h"
26 #include "libavutil/crc.h"
27 #include "libavutil/internal.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/log.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/dovi_meta.h"
35 #include "libavcodec/bytestream.h"
36 #include "libavcodec/defs.h"
37 #include "libavcodec/get_bits.h"
38 #include "libavcodec/opus/opus.h"
39 #include "avformat.h"
40 #include "mpegts.h"
41 #include "internal.h"
42 #include "avio_internal.h"
43 #include "demux.h"
44 #include "mpeg.h"
45 #include "isom.h"
46 #include "id3v2.h"
47 #if CONFIG_ICONV
48 #include <iconv.h>
49 #endif
50 
51 /* maximum size in which we look for synchronization if
52  * synchronization is lost */
53 #define MAX_RESYNC_SIZE 65536
54 
55 #define MAX_MP4_DESCR_COUNT 16
56 
57 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
58  do { \
59  if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
60  (modulus) = (dividend) % (divisor); \
61  (prev_dividend) = (dividend); \
62  } while (0)
63 
64 #define PROBE_PACKET_MAX_BUF 8192
65 #define PROBE_PACKET_MARGIN 5
66 
71 };
72 
73 typedef struct MpegTSFilter MpegTSFilter;
74 
75 typedef int PESCallback (MpegTSFilter *f, const uint8_t *buf, int len,
76  int is_start, int64_t pos);
77 
78 typedef struct MpegTSPESFilter {
80  void *opaque;
82 
83 typedef void SectionCallback (MpegTSFilter *f, const uint8_t *buf, int len);
84 
85 typedef void SetServiceCallback (void *opaque, int ret);
86 
87 typedef struct MpegTSSectionFilter {
90  int last_ver;
91  unsigned crc;
92  unsigned last_crc;
93  uint8_t *section_buf;
94  unsigned int check_crc : 1;
95  unsigned int end_of_section_reached : 1;
97  void *opaque;
99 
100 struct MpegTSFilter {
101  int pid;
102  int es_id;
103  int last_cc; /* last cc code (-1 if first packet) */
105  int discard;
107  union {
110  } u;
111 };
112 
113 struct Stream {
114  int idx;
116 };
117 
118 #define MAX_STREAMS_PER_PROGRAM 128
119 #define MAX_PIDS_PER_PROGRAM (MAX_STREAMS_PER_PROGRAM + 2)
120 
121 struct StreamGroup {
123  int id;
124  int dep_pid; /* PID of the linked dependency stream */
125  unsigned int nb_streams;
127 };
128 
129 struct Program {
130  unsigned int id; // program id/service id
131  unsigned int nb_pids;
132  unsigned int pids[MAX_PIDS_PER_PROGRAM];
133  unsigned int nb_streams;
135  unsigned int nb_stream_groups;
137 
138  /** have we found pmt for this program */
140 };
141 
143  const AVClass *class;
144  /* user data */
146  /** raw packet size, including FEC if present */
148 
150 
151  /** if true, all pids are analyzed to find streams */
153 
154  /** compute exact PCR for each transport stream packet */
156 
157  /** fix dvb teletext pts */
159 
160  int64_t cur_pcr; /**< used to estimate the exact PCR */
161  int64_t pcr_incr; /**< used to estimate the exact PCR */
162 
163  /* data needed to handle file based ts */
164  /** stop parsing loop */
166  /** packet containing Audio/Video data */
168  /** to detect seek */
170 
174 
176 
180 
181  int id;
182 
183  /******************************************/
184  /* private mpegts data */
185  /* scan context */
186  /** structure to keep track of Program->pids mapping */
187  unsigned int nb_prg;
188  struct Program *prg;
189 
191  /** filters for various streams specified by PMT + for the PAT and PMT */
194 
197 };
198 
199 #define MPEGTS_OPTIONS \
200  { "resync_size", "set size limit for looking up a new synchronization", \
201  offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, \
202  { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, \
203  { "ts_id", "transport stream id", \
204  offsetof(MpegTSContext, id), AV_OPT_TYPE_INT, \
205  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, \
206  { "ts_packetsize", "output option carrying the raw packet size", \
207  offsetof(MpegTSContext, raw_packet_size), AV_OPT_TYPE_INT, \
208  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }
209 
210 static const AVOption options[] = {
212  {"fix_teletext_pts", "try to fix pts values of dvb teletext streams", offsetof(MpegTSContext, fix_teletext_pts), AV_OPT_TYPE_BOOL,
213  {.i64 = 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
214  {"scan_all_pmts", "scan and combine all PMTs", offsetof(MpegTSContext, scan_all_pmts), AV_OPT_TYPE_BOOL,
215  {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM },
216  {"skip_unknown_pmt", "skip PMTs for programs not advertised in the PAT", offsetof(MpegTSContext, skip_unknown_pmt), AV_OPT_TYPE_BOOL,
217  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
218  {"merge_pmt_versions", "reuse streams when PMT's version/pids change", offsetof(MpegTSContext, merge_pmt_versions), AV_OPT_TYPE_BOOL,
219  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
220  {"skip_changes", "skip changing / adding streams / programs", offsetof(MpegTSContext, skip_changes), AV_OPT_TYPE_BOOL,
221  {.i64 = 0}, 0, 1, 0 },
222  {"skip_clear", "skip clearing programs", offsetof(MpegTSContext, skip_clear), AV_OPT_TYPE_BOOL,
223  {.i64 = 0}, 0, 1, 0 },
224  {"max_packet_size", "maximum size of emitted packet", offsetof(MpegTSContext, max_packet_size), AV_OPT_TYPE_INT,
225  {.i64 = 204800}, 1, INT_MAX/2, AV_OPT_FLAG_DECODING_PARAM },
226  { NULL },
227 };
228 
229 static const AVClass mpegts_class = {
230  .class_name = "mpegts demuxer",
231  .item_name = av_default_item_name,
232  .option = options,
233  .version = LIBAVUTIL_VERSION_INT,
234 };
235 
236 static const AVOption raw_options[] = {
238  { "compute_pcr", "compute exact PCR for each transport stream packet",
239  offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_BOOL,
240  { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
241  { NULL },
242 };
243 
244 static const AVClass mpegtsraw_class = {
245  .class_name = "mpegtsraw demuxer",
246  .item_name = av_default_item_name,
247  .option = raw_options,
248  .version = LIBAVUTIL_VERSION_INT,
249 };
250 
251 /* TS stream handling */
252 
259 };
260 
261 /* enough for PES header + length */
262 #define PES_START_SIZE 6
263 #define PES_HEADER_SIZE 9
264 #define MAX_PES_HEADER_SIZE (9 + 255)
265 
266 typedef struct PESContext {
267  int pid;
268  int pcr_pid; /**< if -1 then all packets containing PCR are considered */
273  AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
275  /* used to get the format */
277  int flags; /**< copied to the AVPacket flags */
281  uint8_t stream_id;
283  int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
288 } PESContext;
289 
291 
292 static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
293 {
294  int i;
295  if (!ts)
296  return NULL;
297  for (i = 0; i < ts->nb_prg; i++) {
298  if (ts->prg[i].id == programid) {
299  return &ts->prg[i];
300  }
301  }
302  return NULL;
303 }
304 
305 static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
306 {
307  AVProgram *prg = NULL;
308  int i;
309 
310  for (i = 0; i < ts->stream->nb_programs; i++)
311  if (ts->stream->programs[i]->id == programid) {
312  prg = ts->stream->programs[i];
313  break;
314  }
315  if (!prg)
316  return;
317  prg->nb_stream_indexes = 0;
318 }
319 
320 static void clear_program(struct Program *p)
321 {
322  if (!p)
323  return;
324  p->nb_pids = 0;
325  p->nb_streams = 0;
326  p->nb_stream_groups = 0;
327  memset(p->stream_groups, 0, sizeof(p->stream_groups));
328  p->pmt_found = 0;
329 }
330 
332 {
333  av_freep(&ts->prg);
334  ts->nb_prg = 0;
335 }
336 
337 static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
338 {
339  struct Program *p = get_program(ts, programid);
340  if (p)
341  return p;
342  if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
343  ts->nb_prg = 0;
344  return NULL;
345  }
346  p = &ts->prg[ts->nb_prg];
347  p->id = programid;
348  clear_program(p);
349  ts->nb_prg++;
350  return p;
351 }
352 
353 static void add_pid_to_program(struct Program *p, unsigned int pid)
354 {
355  int i;
356  if (!p)
357  return;
358 
359  if (p->nb_pids >= MAX_PIDS_PER_PROGRAM)
360  return;
361 
362  for (i = 0; i < p->nb_pids; i++)
363  if (p->pids[i] == pid)
364  return;
365 
366  p->pids[p->nb_pids++] = pid;
367 }
368 
369 static void update_av_program_info(AVFormatContext *s, unsigned int programid,
370  unsigned int pid, int version)
371 {
372  int i;
373  for (i = 0; i < s->nb_programs; i++) {
374  AVProgram *program = s->programs[i];
375  if (program->id == programid) {
376  int old_pcr_pid = program->pcr_pid,
377  old_version = program->pmt_version;
378  program->pcr_pid = pid;
379  program->pmt_version = version;
380 
381  if (old_version != -1 && old_version != version) {
383  "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
384  programid, old_version, version, old_pcr_pid, pid);
385  }
386  break;
387  }
388  }
389 }
390 
391 /**
392  * @brief discard_pid() decides if the pid is to be discarded according
393  * to caller's programs selection
394  * @param ts : - TS context
395  * @param pid : - pid
396  * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
397  * 0 otherwise
398  */
399 static int discard_pid(MpegTSContext *ts, unsigned int pid)
400 {
401  int i, j, k;
402  int used = 0, discarded = 0;
403  struct Program *p;
404 
405  if (pid == PAT_PID)
406  return 0;
407 
408  /* If none of the programs have .discard=AVDISCARD_ALL then there's
409  * no way we have to discard this packet */
410  for (k = 0; k < ts->stream->nb_programs; k++)
411  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
412  break;
413  if (k == ts->stream->nb_programs)
414  return 0;
415 
416  for (i = 0; i < ts->nb_prg; i++) {
417  p = &ts->prg[i];
418  for (j = 0; j < p->nb_pids; j++) {
419  if (p->pids[j] != pid)
420  continue;
421  // is program with id p->id set to be discarded?
422  for (k = 0; k < ts->stream->nb_programs; k++) {
423  if (ts->stream->programs[k]->id == p->id) {
424  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
425  discarded++;
426  else
427  used++;
428  }
429  }
430  }
431  }
432 
433  return !used && discarded;
434 }
435 
436 /**
437  * Assemble PES packets out of TS packets, and then call the "section_cb"
438  * function when they are complete.
439  */
441  const uint8_t *buf, int buf_size, int is_start)
442 {
443  MpegTSSectionFilter *tss = &tss1->u.section_filter;
444  uint8_t *cur_section_buf = NULL;
445  int len, offset;
446 
447  if (is_start) {
448  memcpy(tss->section_buf, buf, buf_size);
449  tss->section_index = buf_size;
450  tss->section_h_size = -1;
451  tss->end_of_section_reached = 0;
452  } else {
453  if (tss->end_of_section_reached)
454  return;
456  if (buf_size < len)
457  len = buf_size;
458  memcpy(tss->section_buf + tss->section_index, buf, len);
459  tss->section_index += len;
460  }
461 
462  offset = 0;
463  cur_section_buf = tss->section_buf;
464  while (cur_section_buf - tss->section_buf < MAX_SECTION_SIZE && cur_section_buf[0] != STUFFING_BYTE) {
465  /* compute section length if possible */
466  if (tss->section_h_size == -1 && tss->section_index - offset >= 3) {
467  len = (AV_RB16(cur_section_buf + 1) & 0xfff) + 3;
468  if (len > MAX_SECTION_SIZE)
469  return;
470  tss->section_h_size = len;
471  }
472 
473  if (tss->section_h_size != -1 &&
474  tss->section_index >= offset + tss->section_h_size) {
475  int crc_valid = 1;
476  tss->end_of_section_reached = 1;
477 
478  if (tss->check_crc) {
479  crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss->section_h_size);
480  if (tss->section_h_size >= 4)
481  tss->crc = AV_RB32(cur_section_buf + tss->section_h_size - 4);
482 
483  if (crc_valid) {
484  ts->crc_validity[ tss1->pid ] = 100;
485  }else if (ts->crc_validity[ tss1->pid ] > -10) {
486  ts->crc_validity[ tss1->pid ]--;
487  }else
488  crc_valid = 2;
489  }
490  if (crc_valid) {
491  tss->section_cb(tss1, cur_section_buf, tss->section_h_size);
492  if (crc_valid != 1)
493  tss->last_ver = -1;
494  }
495 
496  cur_section_buf += tss->section_h_size;
497  offset += tss->section_h_size;
498  tss->section_h_size = -1;
499  } else {
500  tss->section_h_size = -1;
501  tss->end_of_section_reached = 0;
502  break;
503  }
504  }
505 }
506 
507 static MpegTSFilter *mpegts_open_filter(MpegTSContext *ts, unsigned int pid,
508  enum MpegTSFilterType type)
509 {
511 
512  av_log(ts->stream, AV_LOG_TRACE, "Filter: pid=0x%x type=%d\n", pid, type);
513 
514  if (pid >= NB_PID_MAX || ts->pids[pid])
515  return NULL;
516  filter = av_mallocz(sizeof(MpegTSFilter));
517  if (!filter)
518  return NULL;
519  ts->pids[pid] = filter;
520 
521  filter->type = type;
522  filter->pid = pid;
523  filter->es_id = -1;
524  filter->last_cc = -1;
525  filter->last_pcr= -1;
526 
527  return filter;
528 }
529 
531  unsigned int pid,
532  SectionCallback *section_cb,
533  void *opaque,
534  int check_crc)
535 {
537  MpegTSSectionFilter *sec;
538  uint8_t *section_buf = av_mallocz(MAX_SECTION_SIZE);
539 
540  if (!section_buf)
541  return NULL;
542 
543  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_SECTION))) {
544  av_free(section_buf);
545  return NULL;
546  }
547  sec = &filter->u.section_filter;
548  sec->section_cb = section_cb;
549  sec->opaque = opaque;
550  sec->section_buf = section_buf;
551  sec->check_crc = check_crc;
552  sec->last_ver = -1;
553 
554  return filter;
555 }
556 
557 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
558  PESCallback *pes_cb,
559  void *opaque)
560 {
562  MpegTSPESFilter *pes;
563 
564  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_PES)))
565  return NULL;
566 
567  pes = &filter->u.pes_filter;
568  pes->pes_cb = pes_cb;
569  pes->opaque = opaque;
570  return filter;
571 }
572 
573 static MpegTSFilter *mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
574 {
575  return mpegts_open_filter(ts, pid, MPEGTS_PCR);
576 }
577 
579 {
580  int pid;
581 
582  pid = filter->pid;
583  if (filter->type == MPEGTS_SECTION)
584  av_freep(&filter->u.section_filter.section_buf);
585  else if (filter->type == MPEGTS_PES) {
586  PESContext *pes = filter->u.pes_filter.opaque;
587  av_buffer_unref(&pes->buffer);
588  /* referenced private data will be freed later in
589  * avformat_close_input (pes->st->priv_data == pes) */
590  if (!pes->st || pes->merged_st || !pes->st->priv_data) {
591  av_freep(&filter->u.pes_filter.opaque);
592  }
593  }
594 
595  av_free(filter);
596  ts->pids[pid] = NULL;
597 }
598 
599 static int analyze(const uint8_t *buf, int size, int packet_size,
600  int probe)
601 {
602  int stat[TS_MAX_PACKET_SIZE];
603  int stat_all = 0;
604  int i;
605  int best_score = 0;
606 
607  memset(stat, 0, packet_size * sizeof(*stat));
608 
609  for (i = 0; i < size - 3; i++) {
610  if (buf[i] == SYNC_BYTE) {
611  int pid = AV_RB16(buf+1) & 0x1FFF;
612  int asc = buf[i + 3] & 0x30;
613  if (!probe || pid == 0x1FFF || asc) {
614  int x = i % packet_size;
615  stat[x]++;
616  stat_all++;
617  if (stat[x] > best_score) {
618  best_score = stat[x];
619  }
620  }
621  }
622  }
623 
624  return best_score - FFMAX(stat_all - 10*best_score, 0)/10;
625 }
626 
627 /* autodetect fec presence */
629 {
630  int score, fec_score, dvhs_score;
631  int margin;
632  int ret;
633 
634  /*init buffer to store stream for probing */
635  uint8_t buf[PROBE_PACKET_MAX_BUF] = {0};
636  int buf_size = 0;
637  int max_iterations = 16;
638 
639  while (buf_size < PROBE_PACKET_MAX_BUF && max_iterations--) {
640  ret = avio_read_partial(s->pb, buf + buf_size, PROBE_PACKET_MAX_BUF - buf_size);
641  if (ret < 0)
642  return AVERROR_INVALIDDATA;
643  buf_size += ret;
644 
645  score = analyze(buf, buf_size, TS_PACKET_SIZE, 0);
646  dvhs_score = analyze(buf, buf_size, TS_DVHS_PACKET_SIZE, 0);
647  fec_score = analyze(buf, buf_size, TS_FEC_PACKET_SIZE, 0);
648  av_log(s, AV_LOG_TRACE, "Probe: %d, score: %d, dvhs_score: %d, fec_score: %d \n",
649  buf_size, score, dvhs_score, fec_score);
650 
651  margin = mid_pred(score, fec_score, dvhs_score);
652 
653  if (buf_size < PROBE_PACKET_MAX_BUF)
654  margin += PROBE_PACKET_MARGIN; /*if buffer not filled */
655 
656  if (score > margin)
657  return TS_PACKET_SIZE;
658  else if (dvhs_score > margin)
659  return TS_DVHS_PACKET_SIZE;
660  else if (fec_score > margin)
661  return TS_FEC_PACKET_SIZE;
662  }
663  return AVERROR_INVALIDDATA;
664 }
665 
666 typedef struct SectionHeader {
667  uint8_t tid;
668  uint16_t id;
669  uint8_t version;
670  uint8_t current_next;
671  uint8_t sec_num;
672  uint8_t last_sec_num;
673 } SectionHeader;
674 
676 {
677  if (h->version == tssf->last_ver && tssf->last_crc == tssf->crc)
678  return 1;
679 
680  tssf->last_ver = h->version;
681  tssf->last_crc = tssf->crc;
682 
683  return 0;
684 }
685 
686 static inline int get8(const uint8_t **pp, const uint8_t *p_end)
687 {
688  const uint8_t *p;
689  int c;
690 
691  p = *pp;
692  if (p >= p_end)
693  return AVERROR_INVALIDDATA;
694  c = *p++;
695  *pp = p;
696  return c;
697 }
698 
699 static inline int get16(const uint8_t **pp, const uint8_t *p_end)
700 {
701  const uint8_t *p;
702  int c;
703 
704  p = *pp;
705  if (1 >= p_end - p)
706  return AVERROR_INVALIDDATA;
707  c = AV_RB16(p);
708  p += 2;
709  *pp = p;
710  return c;
711 }
712 
713 /* read and allocate a DVB string preceded by its length */
714 static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
715 {
716  int len;
717  const uint8_t *p;
718  char *str;
719 
720  p = *pp;
721  len = get8(&p, p_end);
722  if (len < 0)
723  return NULL;
724  if (len > p_end - p)
725  return NULL;
726 #if CONFIG_ICONV
727  if (len) {
728  const char *encodings[] = {
729  "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
730  "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11",
731  "", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "", "", "", "",
732  "", "UCS-2BE", "KSC_5601", "GB2312", "UCS-2BE", "UTF-8", "", "",
733  "", "", "", "", "", "", "", ""
734  };
735  iconv_t cd;
736  char *in, *out;
737  size_t inlen = len, outlen = inlen * 6 + 1;
738  if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0xf && p[2] != 0xc) {
739  char iso8859[12];
740  snprintf(iso8859, sizeof(iso8859), "ISO-8859-%d", p[2]);
741  inlen -= 3;
742  in = (char *)p + 3;
743  cd = iconv_open("UTF-8", iso8859);
744  } else if (p[0] < 0x20) {
745  inlen -= 1;
746  in = (char *)p + 1;
747  cd = iconv_open("UTF-8", encodings[*p]);
748  } else {
749  in = (char *)p;
750  cd = iconv_open("UTF-8", encodings[0]);
751  }
752  if (cd == (iconv_t)-1)
753  goto no_iconv;
754  str = out = av_malloc(outlen);
755  if (!str) {
756  iconv_close(cd);
757  return NULL;
758  }
759  if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
760  iconv_close(cd);
761  av_freep(&str);
762  goto no_iconv;
763  }
764  iconv_close(cd);
765  *out = 0;
766  *pp = p + len;
767  return str;
768  }
769 no_iconv:
770 #endif
771  str = av_malloc(len + 1);
772  if (!str)
773  return NULL;
774  memcpy(str, p, len);
775  str[len] = '\0';
776  p += len;
777  *pp = p;
778  return str;
779 }
780 
782  const uint8_t **pp, const uint8_t *p_end)
783 {
784  int val;
785 
786  val = get8(pp, p_end);
787  if (val < 0)
788  return val;
789  h->tid = val;
790  *pp += 2;
791  val = get16(pp, p_end);
792  if (val < 0)
793  return val;
794  h->id = val;
795  val = get8(pp, p_end);
796  if (val < 0)
797  return val;
798  h->version = (val >> 1) & 0x1f;
799  h->current_next = val & 0x01;
800  val = get8(pp, p_end);
801  if (val < 0)
802  return val;
803  h->sec_num = val;
804  val = get8(pp, p_end);
805  if (val < 0)
806  return val;
807  h->last_sec_num = val;
808  return 0;
809 }
810 
811 typedef struct StreamType {
812  uint32_t stream_type;
815 } StreamType;
816 
817 static const StreamType ISO_types[] = {
824  /* Makito encoder sets stream type 0x11 for AAC,
825  * so auto-detect LOAS/LATM instead of hardcoding it. */
826 #if !CONFIG_LOAS_DEMUXER
828 #endif
842  { 0 },
843 };
844 
845 static const StreamType HDMV_types[] = {
857  { 0 },
858 };
859 
860 /* SCTE types */
861 static const StreamType SCTE_types[] = {
863  { 0 },
864 };
865 
866 /* ATSC ? */
867 static const StreamType MISC_types[] = {
871  { 0 },
872 };
873 
874 /* HLS Sample Encryption Types */
880  { 0 },
881 };
882 
883 static const StreamType REGD_types[] = {
884  { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
885  { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
886  { MKTAG('A', 'C', '-', '4'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC4 },
887  { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
888  { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
889  { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
890  { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
891  { MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
892  { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
893  { MKTAG('V', 'V', 'C', ' '), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VVC },
894  { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
895  { MKTAG('V', 'A', 'N', 'C'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_2038 },
896  { MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
897  { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
898  { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_OPUS },
899  { 0 },
900 };
901 
902 static const StreamType METADATA_types[] = {
903  { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
904  { MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
905  { 0 },
906 };
907 
908 /* descriptor present */
909 static const StreamType DESC_types[] = {
915  { 0 },
916 };
917 
919  uint32_t stream_type,
920  const StreamType *types)
921 {
922  FFStream *const sti = ffstream(st);
923  for (; types->stream_type; types++)
924  if (stream_type == types->stream_type) {
925  if (st->codecpar->codec_type != types->codec_type ||
926  st->codecpar->codec_id != types->codec_id) {
927  st->codecpar->codec_type = types->codec_type;
928  st->codecpar->codec_id = types->codec_id;
929  sti->need_context_update = 1;
930  }
931  sti->request_probe = 0;
932  return;
933  }
934 }
935 
937  uint32_t stream_type, uint32_t prog_reg_desc)
938 {
939  FFStream *const sti = ffstream(st);
940  int old_codec_type = st->codecpar->codec_type;
941  int old_codec_id = st->codecpar->codec_id;
942  int old_codec_tag = st->codecpar->codec_tag;
943 
944  avpriv_set_pts_info(st, 33, 1, 90000);
945  st->priv_data = pes;
949  pes->st = st;
950  pes->stream_type = stream_type;
951 
952  av_log(pes->stream, AV_LOG_DEBUG,
953  "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
954  st->index, pes->stream_type, pes->pid, (char *)&prog_reg_desc);
955 
956  st->codecpar->codec_tag = pes->stream_type;
957 
960  sti->request_probe = 50;
963  if ((prog_reg_desc == AV_RL32("HDMV") ||
964  prog_reg_desc == AV_RL32("HDPR")) &&
968  // HDMV TrueHD streams also contain an AC3 coded version of the
969  // audio track - add a second stream for this
970  AVStream *sub_st;
971  // priv_data cannot be shared between streams
972  PESContext *sub_pes = av_memdup(pes, sizeof(*sub_pes));
973  if (!sub_pes)
974  return AVERROR(ENOMEM);
975 
976  sub_st = avformat_new_stream(pes->stream, NULL);
977  if (!sub_st) {
978  av_free(sub_pes);
979  return AVERROR(ENOMEM);
980  }
981 
982  sub_st->id = pes->pid;
983  avpriv_set_pts_info(sub_st, 33, 1, 90000);
984  sub_st->priv_data = sub_pes;
986  sub_st->codecpar->codec_id = AV_CODEC_ID_AC3;
988  sub_pes->sub_st = pes->sub_st = sub_st;
989  }
990  }
991  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
993  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
995  if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
996  st->codecpar->codec_id = old_codec_id;
997  st->codecpar->codec_type = old_codec_type;
998  }
999  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE ||
1000  (sti->request_probe > 0 && sti->request_probe < AVPROBE_SCORE_STREAM_RETRY / 5)) &&
1001  sti->probe_packets > 0 &&
1002  stream_type == STREAM_TYPE_PRIVATE_DATA) {
1006  }
1007 
1008  /* queue a context update if properties changed */
1009  if (old_codec_type != st->codecpar->codec_type ||
1010  old_codec_id != st->codecpar->codec_id ||
1011  old_codec_tag != st->codecpar->codec_tag)
1012  sti->need_context_update = 1;
1013 
1014  return 0;
1015 }
1016 
1018 {
1019  pes->pts = AV_NOPTS_VALUE;
1020  pes->dts = AV_NOPTS_VALUE;
1021  pes->data_index = 0;
1022  pes->flags = 0;
1023  av_buffer_unref(&pes->buffer);
1024 }
1025 
1026 static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
1027 {
1029  pkt->data = (uint8_t *)buffer;
1030  pkt->size = len;
1031 }
1032 
1034 {
1035  FFIOContext id3_buf;
1036  ID3v2ExtraMeta *extra_meta = NULL;
1038  int ret = 0;
1039 
1040  ffio_init_read_context(&id3_buf, pkt->data, pkt->size);
1041  ff_id3v2_read_dict(&id3_buf.pub, &metadata, ID3v2_DEFAULT_MAGIC, &extra_meta);
1042  ret = ff_id3v2_parse_priv_dict(&metadata, extra_meta);
1043  ff_id3v2_free_extra_meta(&extra_meta);
1044 
1045  if (ret < 0 || !av_dict_count(metadata))
1046  goto end;
1047 
1048  ret = av_dict_copy(&s->metadata, metadata, 0);
1049  if (ret == 0)
1050  s->event_flags |= AVSTREAM_EVENT_FLAG_METADATA_UPDATED;
1051 
1052 end:
1054  return ret;
1055 }
1056 
1058 {
1059  uint8_t *sd;
1060 
1062 
1063  pkt->buf = pes->buffer;
1064  pkt->data = pes->buffer->data;
1065  pkt->size = pes->data_index;
1066 
1067  if (pes->PES_packet_length &&
1068  pes->pes_header_size + pes->data_index != pes->PES_packet_length +
1069  PES_START_SIZE) {
1070  av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
1071  pes->flags |= AV_PKT_FLAG_CORRUPT;
1072  }
1073 
1074  // JPEG-XS PES payload
1075  if (pes->stream_id == 0xbd && pes->stream_type == 0x32 &&
1076  pkt->size >= 8 && memcmp(pkt->data + 4, "jxes", 4) == 0)
1077  {
1078  uint32_t header_size = AV_RB32(pkt->data);
1079  if (header_size > pkt->size) {
1081  "Invalid JPEG-XS header size %"PRIu32" > packet size %d\n",
1082  header_size, pkt->size);
1083  pes->flags |= AV_PKT_FLAG_CORRUPT;
1084  } else {
1085  pkt->data += header_size;
1086  pkt->size -= header_size;
1087  }
1088  }
1089 
1090  memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1091 
1092  // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
1093  if (pes->sub_st && pes->stream_type == STREAM_TYPE_BLURAY_AUDIO_TRUEHD && pes->extended_stream_id == 0x76)
1094  pkt->stream_index = pes->sub_st->index;
1095  else
1096  pkt->stream_index = pes->st->index;
1097  pkt->pts = pes->pts;
1098  pkt->dts = pes->dts;
1099  /* store position of first TS packet of this PES packet */
1100  pkt->pos = pes->ts_packet_pos;
1101  pkt->flags = pes->flags;
1102 
1103  pes->buffer = NULL;
1105 
1107  if (!sd)
1108  return AVERROR(ENOMEM);
1109  *sd = pes->stream_id;
1110 
1111  if (pes->st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
1112  int ret = timed_id3_update_metadata(pes->st, pkt);
1113  if (ret < 0)
1114  return ret;
1115  }
1116 
1117  return 0;
1118 }
1119 
1120 static uint64_t get_ts64(GetBitContext *gb, int bits)
1121 {
1122  if (get_bits_left(gb) < bits)
1123  return AV_NOPTS_VALUE;
1124  return get_bits64(gb, bits);
1125 }
1126 
1128  const uint8_t *buf, int buf_size)
1129 {
1130  GetBitContext gb;
1131  int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
1132  int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
1133  int dts_flag = -1, cts_flag = -1;
1134  int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
1135  uint8_t buf_padded[128 + AV_INPUT_BUFFER_PADDING_SIZE];
1136  int buf_padded_size = FFMIN(buf_size, sizeof(buf_padded) - AV_INPUT_BUFFER_PADDING_SIZE);
1137 
1138  memcpy(buf_padded, buf, buf_padded_size);
1139 
1140  init_get_bits(&gb, buf_padded, buf_padded_size * 8);
1141 
1142  if (sl->use_au_start)
1143  au_start_flag = get_bits1(&gb);
1144  if (sl->use_au_end)
1145  au_end_flag = get_bits1(&gb);
1146  if (!sl->use_au_start && !sl->use_au_end)
1147  au_start_flag = au_end_flag = 1;
1148  if (sl->ocr_len > 0)
1149  ocr_flag = get_bits1(&gb);
1150  if (sl->use_idle)
1151  idle_flag = get_bits1(&gb);
1152  if (sl->use_padding)
1153  padding_flag = get_bits1(&gb);
1154  if (padding_flag)
1155  padding_bits = get_bits(&gb, 3);
1156 
1157  if (!idle_flag && (!padding_flag || padding_bits != 0)) {
1158  if (sl->packet_seq_num_len)
1160  if (sl->degr_prior_len)
1161  if (get_bits1(&gb))
1162  skip_bits(&gb, sl->degr_prior_len);
1163  if (ocr_flag)
1164  skip_bits_long(&gb, sl->ocr_len);
1165  if (au_start_flag) {
1166  if (sl->use_rand_acc_pt)
1167  get_bits1(&gb);
1168  if (sl->au_seq_num_len > 0)
1169  skip_bits_long(&gb, sl->au_seq_num_len);
1170  if (sl->use_timestamps) {
1171  dts_flag = get_bits1(&gb);
1172  cts_flag = get_bits1(&gb);
1173  }
1174  }
1175  if (sl->inst_bitrate_len)
1176  inst_bitrate_flag = get_bits1(&gb);
1177  if (dts_flag == 1)
1178  dts = get_ts64(&gb, sl->timestamp_len);
1179  if (cts_flag == 1)
1180  cts = get_ts64(&gb, sl->timestamp_len);
1181  if (sl->au_len > 0)
1182  skip_bits_long(&gb, sl->au_len);
1183  if (inst_bitrate_flag)
1184  skip_bits_long(&gb, sl->inst_bitrate_len);
1185  }
1186 
1187  if (dts != AV_NOPTS_VALUE)
1188  pes->dts = dts;
1189  if (cts != AV_NOPTS_VALUE)
1190  pes->pts = cts;
1191 
1192  if (sl->timestamp_len && sl->timestamp_res)
1194 
1195  return (get_bits_count(&gb) + 7) >> 3;
1196 }
1197 
1199 {
1201  if (!ts->pools[index]) {
1202  int pool_size = FFMIN(ts->max_packet_size + AV_INPUT_BUFFER_PADDING_SIZE, 2 << index);
1203  ts->pools[index] = av_buffer_pool_init(pool_size, NULL);
1204  if (!ts->pools[index])
1205  return NULL;
1206  }
1207  return av_buffer_pool_get(ts->pools[index]);
1208 }
1209 
1210 /* return non zero if a packet could be constructed */
1212  const uint8_t *buf, int buf_size, int is_start,
1213  int64_t pos)
1214 {
1215  PESContext *pes = filter->u.pes_filter.opaque;
1216  MpegTSContext *ts = pes->ts;
1217  const uint8_t *p;
1218  int ret, len;
1219 
1220  if (!ts->pkt)
1221  return 0;
1222 
1223  if (is_start) {
1224  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
1225  ret = new_pes_packet(pes, ts->pkt);
1226  if (ret < 0)
1227  return ret;
1228  ts->stop_parse = 1;
1229  } else {
1231  }
1232  pes->state = MPEGTS_HEADER;
1233  pes->ts_packet_pos = pos;
1234  }
1235  p = buf;
1236  while (buf_size > 0) {
1237  switch (pes->state) {
1238  case MPEGTS_HEADER:
1239  len = PES_START_SIZE - pes->data_index;
1240  if (len > buf_size)
1241  len = buf_size;
1242  memcpy(pes->header + pes->data_index, p, len);
1243  pes->data_index += len;
1244  p += len;
1245  buf_size -= len;
1246  if (pes->data_index == PES_START_SIZE) {
1247  /* we got all the PES or section header. We can now
1248  * decide */
1249  if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
1250  pes->header[2] == 0x01) {
1251  /* it must be an MPEG-2 PES stream */
1252  pes->stream_id = pes->header[3];
1253  av_log(pes->stream, AV_LOG_TRACE, "pid=%x stream_id=%#x\n", pes->pid, pes->stream_id);
1254 
1255  if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
1256  (!pes->sub_st ||
1257  pes->sub_st->discard == AVDISCARD_ALL)) ||
1259  goto skip;
1260 
1261  /* stream not present in PMT */
1262  if (!pes->st) {
1263  if (ts->skip_changes)
1264  goto skip;
1265  if (ts->merge_pmt_versions)
1266  goto skip; /* wait for PMT to merge new stream */
1267 
1268  pes->st = avformat_new_stream(ts->stream, NULL);
1269  if (!pes->st)
1270  return AVERROR(ENOMEM);
1271  pes->st->id = pes->pid;
1272  mpegts_set_stream_info(pes->st, pes, 0, 0);
1273  }
1274 
1275  pes->PES_packet_length = AV_RB16(pes->header + 4);
1276  /* NOTE: zero length means the PES size is unbounded */
1277 
1280  pes->stream_id != STREAM_ID_ECM_STREAM &&
1281  pes->stream_id != STREAM_ID_EMM_STREAM &&
1285  FFStream *const pes_sti = ffstream(pes->st);
1286  pes->state = MPEGTS_PESHEADER;
1287  if (pes->st->codecpar->codec_id == AV_CODEC_ID_NONE && !pes_sti->request_probe) {
1288  av_log(pes->stream, AV_LOG_TRACE,
1289  "pid=%x stream_type=%x probing\n",
1290  pes->pid,
1291  pes->stream_type);
1292  pes_sti->request_probe = 1;
1293  }
1294  } else {
1295  pes->pes_header_size = 6;
1296  pes->state = MPEGTS_PAYLOAD;
1297  pes->data_index = 0;
1298  }
1299  } else {
1300  /* otherwise, it should be a table */
1301  /* skip packet */
1302 skip:
1303  pes->state = MPEGTS_SKIP;
1304  continue;
1305  }
1306  }
1307  break;
1308  /**********************************************/
1309  /* PES packing parsing */
1310  case MPEGTS_PESHEADER:
1311  len = PES_HEADER_SIZE - pes->data_index;
1312  if (len < 0)
1313  return AVERROR_INVALIDDATA;
1314  if (len > buf_size)
1315  len = buf_size;
1316  memcpy(pes->header + pes->data_index, p, len);
1317  pes->data_index += len;
1318  p += len;
1319  buf_size -= len;
1320  if (pes->data_index == PES_HEADER_SIZE) {
1321  pes->pes_header_size = pes->header[8] + 9;
1323  }
1324  break;
1325  case MPEGTS_PESHEADER_FILL:
1326  len = pes->pes_header_size - pes->data_index;
1327  if (len < 0)
1328  return AVERROR_INVALIDDATA;
1329  if (len > buf_size)
1330  len = buf_size;
1331  memcpy(pes->header + pes->data_index, p, len);
1332  pes->data_index += len;
1333  p += len;
1334  buf_size -= len;
1335  if (pes->data_index == pes->pes_header_size) {
1336  const uint8_t *r;
1337  unsigned int flags, pes_ext, skip;
1338 
1339  flags = pes->header[7];
1340  r = pes->header + 9;
1341  pes->pts = AV_NOPTS_VALUE;
1342  pes->dts = AV_NOPTS_VALUE;
1343  if ((flags & 0xc0) == 0x80) {
1344  pes->dts = pes->pts = ff_parse_pes_pts(r);
1345  r += 5;
1346  } else if ((flags & 0xc0) == 0xc0) {
1347  pes->pts = ff_parse_pes_pts(r);
1348  r += 5;
1349  pes->dts = ff_parse_pes_pts(r);
1350  r += 5;
1351  }
1352  pes->extended_stream_id = -1;
1353  if (flags & 0x01) { /* PES extension */
1354  pes_ext = *r++;
1355  /* Skip PES private data, program packet sequence counter and P-STD buffer */
1356  skip = (pes_ext >> 4) & 0xb;
1357  skip += skip & 0x9;
1358  r += skip;
1359  if ((pes_ext & 0x41) == 0x01 &&
1360  (r + 2) <= (pes->header + pes->pes_header_size)) {
1361  /* PES extension 2 */
1362  if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
1363  pes->extended_stream_id = r[1];
1364  }
1365  }
1366 
1367  /* we got the full header. We parse it and get the payload */
1368  pes->state = MPEGTS_PAYLOAD;
1369  pes->data_index = 0;
1370  if (pes->stream_type == STREAM_TYPE_ISO_IEC_14496_PES && buf_size > 0) {
1371  int sl_header_bytes = read_sl_header(pes, &pes->sl, p,
1372  buf_size);
1373  pes->pes_header_size += sl_header_bytes;
1374  p += sl_header_bytes;
1375  buf_size -= sl_header_bytes;
1376  }
1377  if (pes->stream_type == STREAM_TYPE_METADATA &&
1380  buf_size >= 5) {
1381  /* skip metadata access unit header - see MISB ST 1402 */
1382  pes->pes_header_size += 5;
1383  p += 5;
1384  buf_size -= 5;
1385  }
1386  if ( pes->ts->fix_teletext_pts
1389  ) {
1390  AVProgram *p = NULL;
1391  int pcr_found = 0;
1392  while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
1393  if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
1394  MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
1395  if (f) {
1396  AVStream *st = NULL;
1397  if (f->type == MPEGTS_PES) {
1398  PESContext *pcrpes = f->u.pes_filter.opaque;
1399  if (pcrpes)
1400  st = pcrpes->st;
1401  } else if (f->type == MPEGTS_PCR) {
1402  int i;
1403  for (i = 0; i < p->nb_stream_indexes; i++) {
1404  AVStream *pst = pes->stream->streams[p->stream_index[i]];
1405  if (pst->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
1406  st = pst;
1407  }
1408  }
1409  if (f->last_pcr != -1 && !f->discard) {
1410  // teletext packets do not always have correct timestamps,
1411  // the standard says they should be handled after 40.6 ms at most,
1412  // and the pcr error to this packet should be no more than 100 ms.
1413  // TODO: we should interpolate the PCR, not just use the last one
1414  int64_t pcr = f->last_pcr / SYSTEM_CLOCK_FREQUENCY_DIVISOR;
1415  pcr_found = 1;
1416  if (st) {
1417  const FFStream *const sti = ffstream(st);
1418  FFStream *const pes_sti = ffstream(pes->st);
1419 
1420  pes_sti->pts_wrap_reference = sti->pts_wrap_reference;
1421  pes_sti->pts_wrap_behavior = sti->pts_wrap_behavior;
1422  }
1423  if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
1424  pes->pts = pes->dts = pcr;
1425  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1426  pes->dts > pcr + 3654 + 9000) {
1427  pes->pts = pes->dts = pcr + 3654 + 9000;
1428  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
1429  pes->dts > pcr + 10*90000) { //10sec
1430  pes->pts = pes->dts = pcr + 3654 + 9000;
1431  }
1432  break;
1433  }
1434  }
1435  }
1436  }
1437 
1438  if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1439  !pcr_found) {
1441  "Forcing DTS/PTS to be unset for a "
1442  "non-trustworthy PES packet for PID %d as "
1443  "PCR hasn't been received yet.\n",
1444  pes->pid);
1445  pes->dts = pes->pts = AV_NOPTS_VALUE;
1446  }
1447  }
1448  }
1449  break;
1450  case MPEGTS_PAYLOAD:
1451  do {
1452  int max_packet_size = ts->max_packet_size;
1454  max_packet_size = pes->PES_packet_length + PES_START_SIZE - pes->pes_header_size;
1455 
1456  if (pes->data_index > 0 &&
1457  pes->data_index + buf_size > max_packet_size) {
1458  ret = new_pes_packet(pes, ts->pkt);
1459  if (ret < 0)
1460  return ret;
1461  pes->PES_packet_length = 0;
1462  max_packet_size = ts->max_packet_size;
1463  ts->stop_parse = 1;
1464  } else if (pes->data_index == 0 &&
1465  buf_size > max_packet_size) {
1466  // pes packet size is < ts size packet and pes data is padded with STUFFING_BYTE
1467  // not sure if this is legal in ts but see issue #2392
1468  buf_size = max_packet_size;
1469  }
1470 
1471  if (!pes->buffer) {
1472  pes->buffer = buffer_pool_get(ts, max_packet_size);
1473  if (!pes->buffer)
1474  return AVERROR(ENOMEM);
1475  }
1476 
1477  memcpy(pes->buffer->data + pes->data_index, p, buf_size);
1478  pes->data_index += buf_size;
1479  /* emit complete packets with known packet size
1480  * decreases demuxer delay for infrequent packets like subtitles from
1481  * a couple of seconds to milliseconds for properly muxed files. */
1482  if (!ts->stop_parse && pes->PES_packet_length &&
1484  ts->stop_parse = 1;
1485  ret = new_pes_packet(pes, ts->pkt);
1486  pes->state = MPEGTS_SKIP;
1487  if (ret < 0)
1488  return ret;
1489  }
1490  } while (0);
1491  buf_size = 0;
1492  break;
1493  case MPEGTS_SKIP:
1494  buf_size = 0;
1495  break;
1496  }
1497  }
1498 
1499  return 0;
1500 }
1501 
1502 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
1503 {
1504  MpegTSFilter *tss;
1505  PESContext *pes;
1506 
1507  /* if no pid found, then add a pid context */
1508  pes = av_mallocz(sizeof(PESContext));
1509  if (!pes)
1510  return 0;
1511  pes->ts = ts;
1512  pes->stream = ts->stream;
1513  pes->pid = pid;
1514  pes->pcr_pid = pcr_pid;
1515  pes->state = MPEGTS_SKIP;
1516  pes->pts = AV_NOPTS_VALUE;
1517  pes->dts = AV_NOPTS_VALUE;
1518  tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
1519  if (!tss) {
1520  av_free(pes);
1521  return 0;
1522  }
1523  return pes;
1524 }
1525 
1526 #define MAX_LEVEL 4
1527 typedef struct MP4DescrParseContext {
1534  int level;
1537 
1539  const uint8_t *buf, unsigned size,
1540  Mp4Descr *descr, int max_descr_count)
1541 {
1542  if (size > (1 << 30))
1543  return AVERROR_INVALIDDATA;
1544 
1545  ffio_init_read_context(&d->pb, buf, size);
1546 
1547  d->s = s;
1548  d->level = 0;
1549  d->descr_count = 0;
1550  d->descr = descr;
1551  d->active_descr = NULL;
1552  d->max_descr_count = max_descr_count;
1553 
1554  return 0;
1555 }
1556 
1557 static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
1558 {
1559  int64_t new_off = avio_tell(pb);
1560  (*len) -= new_off - *off;
1561  *off = new_off;
1562 }
1563 
1564 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1565  int target_tag);
1566 
1568 {
1569  while (len > 0) {
1570  int ret = parse_mp4_descr(d, off, len, 0);
1571  if (ret < 0)
1572  return ret;
1573  update_offsets(&d->pb.pub, &off, &len);
1574  }
1575  return 0;
1576 }
1577 
1579 {
1580  AVIOContext *const pb = &d->pb.pub;
1581  avio_rb16(pb); // ID
1582  avio_r8(pb);
1583  avio_r8(pb);
1584  avio_r8(pb);
1585  avio_r8(pb);
1586  avio_r8(pb);
1587  update_offsets(pb, &off, &len);
1588  return parse_mp4_descr_arr(d, off, len);
1589 }
1590 
1592 {
1593  int id_flags;
1594  if (len < 2)
1595  return 0;
1596  id_flags = avio_rb16(&d->pb.pub);
1597  if (!(id_flags & 0x0020)) { // URL_Flag
1598  update_offsets(&d->pb.pub, &off, &len);
1599  return parse_mp4_descr_arr(d, off, len); // ES_Descriptor[]
1600  } else {
1601  return 0;
1602  }
1603 }
1604 
1606 {
1607  AVIOContext *const pb = &d->pb.pub;
1608  int es_id = 0;
1609  int ret = 0;
1610 
1611  if (d->descr_count >= d->max_descr_count)
1612  return AVERROR_INVALIDDATA;
1613  ff_mp4_parse_es_descr(pb, &es_id);
1614  d->active_descr = d->descr + (d->descr_count++);
1615 
1616  d->active_descr->es_id = es_id;
1617  update_offsets(pb, &off, &len);
1618  if ((ret = parse_mp4_descr(d, off, len, MP4DecConfigDescrTag)) < 0)
1619  return ret;
1620  update_offsets(pb, &off, &len);
1621  if (len > 0)
1622  ret = parse_mp4_descr(d, off, len, MP4SLDescrTag);
1623  d->active_descr = NULL;
1624  return ret;
1625 }
1626 
1628  int len)
1629 {
1630  Mp4Descr *descr = d->active_descr;
1631  if (!descr)
1632  return AVERROR_INVALIDDATA;
1634  if (!descr->dec_config_descr)
1635  return AVERROR(ENOMEM);
1636  descr->dec_config_descr_len = len;
1637  avio_read(&d->pb.pub, descr->dec_config_descr, len);
1638  return 0;
1639 }
1640 
1642 {
1643  Mp4Descr *descr = d->active_descr;
1644  AVIOContext *const pb = &d->pb.pub;
1645  int predefined;
1646  if (!descr)
1647  return AVERROR_INVALIDDATA;
1648 
1649 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \
1650  descr->sl.dst = avio_r8(pb); \
1651  if (descr->sl.dst > maxv) { \
1652  descr->sl.dst = maxv; \
1653  return AVERROR_INVALIDDATA; \
1654  } \
1655 } while (0)
1656 
1657  predefined = avio_r8(pb);
1658  if (!predefined) {
1659  int lengths;
1660  int flags = avio_r8(pb);
1661  descr->sl.use_au_start = !!(flags & 0x80);
1662  descr->sl.use_au_end = !!(flags & 0x40);
1663  descr->sl.use_rand_acc_pt = !!(flags & 0x20);
1664  descr->sl.use_padding = !!(flags & 0x08);
1665  descr->sl.use_timestamps = !!(flags & 0x04);
1666  descr->sl.use_idle = !!(flags & 0x02);
1667  descr->sl.timestamp_res = avio_rb32(pb);
1668  avio_rb32(pb);
1669  R8_CHECK_CLIP_MAX(timestamp_len, 63);
1670  R8_CHECK_CLIP_MAX(ocr_len, 63);
1671  R8_CHECK_CLIP_MAX(au_len, 31);
1672  descr->sl.inst_bitrate_len = avio_r8(pb);
1673  lengths = avio_rb16(pb);
1674  descr->sl.degr_prior_len = lengths >> 12;
1675  descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
1676  descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
1677  } else if (!d->predefined_SLConfigDescriptor_seen){
1678  avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
1680  }
1681  return 0;
1682 }
1683 
1685  int target_tag)
1686 {
1687  int tag;
1688  AVIOContext *const pb = &d->pb.pub;
1689  int len1 = ff_mp4_read_descr(d->s, pb, &tag);
1690  int ret = 0;
1691 
1692  update_offsets(pb, &off, &len);
1693  if (len < 0 || len1 > len || len1 <= 0) {
1694  av_log(d->s, AV_LOG_ERROR,
1695  "Tag %x length violation new length %d bytes remaining %d\n",
1696  tag, len1, len);
1697  return AVERROR_INVALIDDATA;
1698  }
1699 
1700  if (d->level++ >= MAX_LEVEL) {
1701  av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
1703  goto done;
1704  }
1705 
1706  if (target_tag && tag != target_tag) {
1707  av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag,
1708  target_tag);
1710  goto done;
1711  }
1712 
1713  switch (tag) {
1714  case MP4IODescrTag:
1715  ret = parse_MP4IODescrTag(d, off, len1);
1716  break;
1717  case MP4ODescrTag:
1718  ret = parse_MP4ODescrTag(d, off, len1);
1719  break;
1720  case MP4ESDescrTag:
1721  ret = parse_MP4ESDescrTag(d, off, len1);
1722  break;
1723  case MP4DecConfigDescrTag:
1724  ret = parse_MP4DecConfigDescrTag(d, off, len1);
1725  break;
1726  case MP4SLDescrTag:
1727  ret = parse_MP4SLDescrTag(d, off, len1);
1728  break;
1729  }
1730 
1731 
1732 done:
1733  d->level--;
1734  avio_seek(pb, off + len1, SEEK_SET);
1735  return ret;
1736 }
1737 
1738 static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
1739  Mp4Descr *descr, int *descr_count, int max_descr_count)
1740 {
1742  int ret;
1743 
1745 
1746  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1747  if (ret < 0)
1748  return ret;
1749 
1751 
1752  *descr_count += d.descr_count;
1753  return ret;
1754 }
1755 
1756 static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
1757  Mp4Descr *descr, int *descr_count, int max_descr_count)
1758 {
1760  int ret;
1761 
1762  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1763  if (ret < 0)
1764  return ret;
1765 
1767 
1768  *descr_count = d.descr_count;
1769  return ret;
1770 }
1771 
1772 static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
1773  int section_len)
1774 {
1775  MpegTSContext *ts = filter->u.section_filter.opaque;
1776  MpegTSSectionFilter *tssf = &filter->u.section_filter;
1777  SectionHeader h;
1778  const uint8_t *p, *p_end;
1779  int mp4_descr_count = 0;
1780  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
1781  int i, pid;
1782  AVFormatContext *s = ts->stream;
1783 
1784  p_end = section + section_len - 4;
1785  p = section;
1786  if (parse_section_header(&h, &p, p_end) < 0)
1787  return;
1788  if (h.tid != M4OD_TID)
1789  return;
1790  if (skip_identical(&h, tssf))
1791  return;
1792 
1793  mp4_read_od(s, p, (unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
1795 
1796  for (pid = 0; pid < NB_PID_MAX; pid++) {
1797  if (!ts->pids[pid])
1798  continue;
1799  for (i = 0; i < mp4_descr_count; i++) {
1800  PESContext *pes;
1801  AVStream *st;
1802  FFStream *sti;
1803  FFIOContext pb;
1804  if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
1805  continue;
1806  if (ts->pids[pid]->type != MPEGTS_PES) {
1807  av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
1808  continue;
1809  }
1810  pes = ts->pids[pid]->u.pes_filter.opaque;
1811  st = pes->st;
1812  if (!st)
1813  continue;
1814  sti = ffstream(st);
1815 
1816  pes->sl = mp4_descr[i].sl;
1817 
1818  ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
1819  mp4_descr[i].dec_config_descr_len);
1821  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1822  st->codecpar->extradata_size > 0)
1823  sti->need_parsing = 0;
1824  if (st->codecpar->codec_id == AV_CODEC_ID_H264 &&
1825  st->codecpar->extradata_size > 0)
1826  sti->need_parsing = 0;
1827 
1829  sti->need_context_update = 1;
1830  }
1831  }
1832  for (i = 0; i < mp4_descr_count; i++)
1833  av_free(mp4_descr[i].dec_config_descr);
1834 }
1835 
1836 static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section,
1837  int section_len)
1838 {
1839  AVProgram *prg = NULL;
1840  MpegTSContext *ts = filter->u.section_filter.opaque;
1841 
1842  int idx = ff_find_stream_index(ts->stream, filter->pid);
1843  if (idx < 0)
1844  return;
1845 
1846  /**
1847  * In case we receive an SCTE-35 packet before mpegts context is fully
1848  * initialized.
1849  */
1850  if (!ts->pkt)
1851  return;
1852 
1853  new_data_packet(section, section_len, ts->pkt);
1854  ts->pkt->stream_index = idx;
1855  prg = av_find_program_from_stream(ts->stream, NULL, idx);
1856  if (prg && prg->pcr_pid != -1 && prg->discard != AVDISCARD_ALL) {
1857  MpegTSFilter *f = ts->pids[prg->pcr_pid];
1858  if (f && f->last_pcr != -1)
1859  ts->pkt->pts = ts->pkt->dts = f->last_pcr/SYSTEM_CLOCK_FREQUENCY_DIVISOR;
1860  }
1861  ts->stop_parse = 1;
1862 
1863 }
1864 
1865 static const uint8_t opus_coupled_stream_cnt[9] = {
1866  1, 0, 1, 1, 2, 2, 2, 3, 3
1867 };
1868 
1869 static const uint8_t opus_stream_cnt[9] = {
1870  1, 1, 1, 2, 2, 3, 4, 4, 5,
1871 };
1872 
1873 static const uint8_t opus_channel_map[8][8] = {
1874  { 0 },
1875  { 0,1 },
1876  { 0,2,1 },
1877  { 0,1,2,3 },
1878  { 0,4,1,2,3 },
1879  { 0,4,1,2,3,5 },
1880  { 0,4,1,2,3,5,6 },
1881  { 0,6,1,2,3,4,5,7 },
1882 };
1883 
1885  const uint8_t **pp, const uint8_t *desc_end,
1886  MpegTSContext *ts)
1887 {
1888  int ext_tag = get8(pp, desc_end);
1889 
1890  switch (ext_tag) {
1891  case JXS_VIDEO_DESCRIPTOR: /* JPEG-XS video descriptor*/
1892  {
1893  int horizontal_size, vertical_size, schar;
1894  int colour_primaries, transfer_characteristics, matrix_coefficients, video_full_range_flag;
1895  int descriptor_version, interlace_mode, n_fields;
1896  unsigned frat;
1897 
1898  if (desc_end - *pp < 29)
1899  return AVERROR_INVALIDDATA;
1900 
1901  descriptor_version = get8(pp, desc_end);
1902  if (descriptor_version) {
1903  av_log(fc, AV_LOG_WARNING, "Unsupported JPEG-XS descriptor version (%d != 0)", descriptor_version);
1904  return AVERROR_INVALIDDATA;
1905  }
1906 
1907  horizontal_size = get16(pp, desc_end);
1908  vertical_size = get16(pp, desc_end);
1909  *pp += 4; /* brat */
1910  frat = bytestream_get_be32(pp);
1911  schar = get16(pp, desc_end);
1912  *pp += 2; /* Ppih */
1913  *pp += 2; /* Plev */
1914  *pp += 4; /* max_buffer_size */
1915  *pp += 1; /* buffer_model_type */
1916  colour_primaries = get8(pp, desc_end);
1917  transfer_characteristics = get8(pp, desc_end);
1918  matrix_coefficients = get8(pp, desc_end);
1919  video_full_range_flag = (get8(pp, desc_end) & 0x80) == 0x80 ? 1 : 0;
1920 
1921  interlace_mode = (frat >> 30) & 0x3;
1922  if (interlace_mode == 3) {
1923  av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS interlace mode 3");
1924  return AVERROR_INVALIDDATA;
1925  }
1926 
1927  st->codecpar->field_order = interlace_mode == 0 ? AV_FIELD_PROGRESSIVE
1928  : (interlace_mode == 1 ? AV_FIELD_TT : AV_FIELD_BB);
1929  n_fields = st->codecpar->field_order == AV_FIELD_PROGRESSIVE ? 1 : 2;
1930 
1931  st->codecpar->width = horizontal_size;
1932  st->codecpar->height = vertical_size * n_fields;
1933 
1934  if (frat != 0) {
1935  int framerate_num = (frat & 0x0000FFFFU);
1936  int framerate_den = ((frat >> 24) & 0x0000003FU);
1937 
1938  if (framerate_den == 2) {
1939  framerate_num *= 1000;
1940  framerate_den = 1001;
1941  } else if (framerate_den != 1) {
1942  av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS framerate denominator code %u", framerate_den);
1943  return AVERROR_INVALIDDATA;
1944  }
1945 
1946  st->codecpar->framerate.num = framerate_num;
1947  st->codecpar->framerate.den = framerate_den;
1948  }
1949 
1950  switch (schar & 0xf) {
1951  case 0: st->codecpar->format = AV_PIX_FMT_YUV422P10LE; break;
1952  case 1: st->codecpar->format = AV_PIX_FMT_YUV444P10LE; break;
1953  default:
1954  av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS sampling format");
1955  break;
1956  }
1957 
1958  st->codecpar->color_range = video_full_range_flag ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
1959  st->codecpar->color_primaries = colour_primaries;
1961  st->codecpar->color_space = matrix_coefficients;
1962  }
1963  break;
1965  {
1966  struct Program *p = get_program(ts, prg_id);
1967  struct StreamGroup *stg;
1968  int lcevc_stream_tag = get8(pp, desc_end);
1969  int i;
1970 
1971  if (!p)
1972  return 0;
1973 
1974  if (st->codecpar->codec_id != AV_CODEC_ID_LCEVC)
1975  return AVERROR_INVALIDDATA;
1976 
1977  for (i = 0; i < p->nb_stream_groups; i++) {
1978  stg = &p->stream_groups[i];
1979  if (stg->type != AV_STREAM_GROUP_PARAMS_LCEVC)
1980  continue;
1981  if (stg->id == lcevc_stream_tag)
1982  break;
1983  }
1984  if (i == p->nb_stream_groups) {
1985  if (p->nb_stream_groups == MAX_STREAMS_PER_PROGRAM)
1986  return AVERROR(EINVAL);
1987  p->nb_stream_groups++;
1988  }
1989 
1990  stg = &p->stream_groups[i];
1991  stg->id = lcevc_stream_tag;
1993  for (i = 0; i < stg->nb_streams; i++) {
1994  if (stg->streams[i]->codecpar->codec_id == AV_CODEC_ID_LCEVC)
1995  break;
1996  }
1997  if (i == stg->nb_streams) {
1998  if (stg->nb_streams == MAX_STREAMS_PER_PROGRAM)
1999  return AVERROR(EINVAL);
2000  stg->streams[stg->nb_streams++] = st;
2001  } else
2002  stg->streams[i] = st;
2003 
2004  av_assert0(i < stg->nb_streams);
2005  }
2006  break;
2008  {
2009  struct Program *p = get_program(ts, prg_id);
2010  int num_lcevc_stream_tags = get8(pp, desc_end);
2011 
2012  if (!p)
2013  return 0;
2014 
2015  if (st->codecpar->codec_id == AV_CODEC_ID_LCEVC)
2016  return AVERROR_INVALIDDATA;
2017 
2018  for (int i = 0; i < num_lcevc_stream_tags; i++) {
2019  struct StreamGroup *stg = NULL;
2020  int lcevc_stream_tag = get8(pp, desc_end);;
2021  int j;
2022 
2023  for (j = 0; j < p->nb_stream_groups; j++) {
2024  stg = &p->stream_groups[j];
2025  if (stg->type != AV_STREAM_GROUP_PARAMS_LCEVC)
2026  continue;
2027  if (stg->id == lcevc_stream_tag)
2028  break;
2029  }
2030  if (j == p->nb_stream_groups) {
2031  if (p->nb_stream_groups == MAX_STREAMS_PER_PROGRAM)
2032  return AVERROR(EINVAL);
2033  p->nb_stream_groups++;
2034  }
2035 
2036  stg = &p->stream_groups[j];
2037  stg->id = lcevc_stream_tag;
2039  for (j = 0; j < stg->nb_streams; j++) {
2040  if (stg->streams[j]->index == st->index)
2041  break;
2042  }
2043  if (j == stg->nb_streams) {
2044  if (stg->nb_streams == MAX_STREAMS_PER_PROGRAM)
2045  return AVERROR(EINVAL);
2046  stg->streams[stg->nb_streams++] = st;
2047  }
2048  }
2049  }
2050  break;
2051  default:
2052  break;
2053  }
2054 
2055  return 0;
2056 }
2057 
2058 int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, int prg_id,
2059  const uint8_t **pp, const uint8_t *desc_list_end,
2060  Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
2061  MpegTSContext *ts)
2062 {
2063  FFStream *const sti = ffstream(st);
2064  const uint8_t *desc_end;
2065  int desc_len, desc_tag, desc_es_id, ext_desc_tag, channels, channel_config_code;
2066  char language[252];
2067  int i;
2068 
2069  desc_tag = get8(pp, desc_list_end);
2070  if (desc_tag < 0)
2071  return AVERROR_INVALIDDATA;
2072  desc_len = get8(pp, desc_list_end);
2073  if (desc_len < 0)
2074  return AVERROR_INVALIDDATA;
2075  desc_end = *pp + desc_len;
2076  if (desc_end > desc_list_end)
2077  return AVERROR_INVALIDDATA;
2078 
2079  av_log(fc, AV_LOG_TRACE, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
2080 
2081  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE || sti->request_probe > 0) &&
2082  stream_type == STREAM_TYPE_PRIVATE_DATA)
2083  mpegts_find_stream_type(st, desc_tag, DESC_types);
2084 
2085  switch (desc_tag) {
2087  if (get8(pp, desc_end) & 0x1) {
2089  }
2090  break;
2091  case SL_DESCRIPTOR:
2092  desc_es_id = get16(pp, desc_end);
2093  if (desc_es_id < 0)
2094  break;
2095  if (ts && ts->pids[pid])
2096  ts->pids[pid]->es_id = desc_es_id;
2097  for (i = 0; i < mp4_descr_count; i++)
2098  if (mp4_descr[i].dec_config_descr_len &&
2099  mp4_descr[i].es_id == desc_es_id) {
2100  FFIOContext pb;
2101  ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
2102  mp4_descr[i].dec_config_descr_len);
2104  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
2105  st->codecpar->extradata_size > 0) {
2106  sti->need_parsing = 0;
2107  sti->need_context_update = 1;
2108  }
2110  mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
2111  }
2112  break;
2113  case FMC_DESCRIPTOR:
2114  if (get16(pp, desc_end) < 0)
2115  break;
2116  if (mp4_descr_count > 0 &&
2118  (sti->request_probe == 0 && st->codecpar->codec_id == AV_CODEC_ID_NONE) ||
2119  sti->request_probe > 0) &&
2120  mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
2121  FFIOContext pb;
2122  ffio_init_read_context(&pb, mp4_descr->dec_config_descr,
2123  mp4_descr->dec_config_descr_len);
2125  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
2126  st->codecpar->extradata_size > 0) {
2127  sti->request_probe = sti->need_parsing = 0;
2129  sti->need_context_update = 1;
2130  }
2131  }
2132  break;
2133  case TELETEXT_DESCRIPTOR:
2134  {
2135  uint8_t *extradata = NULL;
2136  int language_count = desc_len / 5, ret;
2137 
2138  if (desc_len > 0 && desc_len % 5 != 0)
2139  return AVERROR_INVALIDDATA;
2140 
2141  if (language_count > 0) {
2142  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
2143  av_assert0(language_count <= sizeof(language) / 4);
2144 
2145  if (st->codecpar->extradata == NULL) {
2146  ret = ff_alloc_extradata(st->codecpar, language_count * 2);
2147  if (ret < 0)
2148  return ret;
2149  }
2150 
2151  if (st->codecpar->extradata_size < language_count * 2)
2152  return AVERROR_INVALIDDATA;
2153 
2154  extradata = st->codecpar->extradata;
2155 
2156  for (i = 0; i < language_count; i++) {
2157  language[i * 4 + 0] = get8(pp, desc_end);
2158  language[i * 4 + 1] = get8(pp, desc_end);
2159  language[i * 4 + 2] = get8(pp, desc_end);
2160  language[i * 4 + 3] = ',';
2161 
2162  memcpy(extradata, *pp, 2);
2163  extradata += 2;
2164 
2165  *pp += 2;
2166  }
2167 
2168  language[i * 4 - 1] = 0;
2169  av_dict_set(&st->metadata, "language", language, 0);
2170  sti->need_context_update = 1;
2171  }
2172  }
2173  break;
2174  case SUBTITLING_DESCRIPTOR:
2175  {
2176  /* 8 bytes per DVB subtitle substream data:
2177  * ISO_639_language_code (3 bytes),
2178  * subtitling_type (1 byte),
2179  * composition_page_id (2 bytes),
2180  * ancillary_page_id (2 bytes) */
2181  int language_count = desc_len / 8, ret;
2182 
2183  if (desc_len > 0 && desc_len % 8 != 0)
2184  return AVERROR_INVALIDDATA;
2185 
2186  if (language_count > 1) {
2187  avpriv_request_sample(fc, "DVB subtitles with multiple languages");
2188  }
2189 
2190  if (language_count > 0) {
2191  uint8_t *extradata;
2192 
2193  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
2194  av_assert0(language_count <= sizeof(language) / 4);
2195 
2196  if (st->codecpar->extradata == NULL) {
2197  ret = ff_alloc_extradata(st->codecpar, language_count * 5);
2198  if (ret < 0)
2199  return ret;
2200  }
2201 
2202  if (st->codecpar->extradata_size < language_count * 5)
2203  return AVERROR_INVALIDDATA;
2204 
2205  extradata = st->codecpar->extradata;
2206 
2207  for (i = 0; i < language_count; i++) {
2208  language[i * 4 + 0] = get8(pp, desc_end);
2209  language[i * 4 + 1] = get8(pp, desc_end);
2210  language[i * 4 + 2] = get8(pp, desc_end);
2211  language[i * 4 + 3] = ',';
2212 
2213  /* hearing impaired subtitles detection using subtitling_type */
2214  switch (*pp[0]) {
2215  case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
2216  case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
2217  case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
2218  case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
2219  case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
2220  case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
2222  break;
2223  }
2224 
2225  extradata[4] = get8(pp, desc_end); /* subtitling_type */
2226  memcpy(extradata, *pp, 4); /* composition_page_id and ancillary_page_id */
2227  extradata += 5;
2228 
2229  *pp += 4;
2230  }
2231 
2232  language[i * 4 - 1] = 0;
2233  av_dict_set(&st->metadata, "language", language, 0);
2234  sti->need_context_update = 1;
2235  }
2236  }
2237  break;
2239  for (i = 0; i + 4 <= desc_len; i += 4) {
2240  language[i + 0] = get8(pp, desc_end);
2241  language[i + 1] = get8(pp, desc_end);
2242  language[i + 2] = get8(pp, desc_end);
2243  language[i + 3] = ',';
2244  switch (get8(pp, desc_end)) {
2245  case 0x01:
2247  break;
2248  case 0x02:
2250  break;
2251  case 0x03:
2254  break;
2255  }
2256  }
2257  if (i && language[0]) {
2258  language[i - 1] = 0;
2259  /* don't overwrite language, as it may already have been set by
2260  * another, more specific descriptor (e.g. supplementary audio) */
2262  }
2263  break;
2265  st->codecpar->codec_tag = bytestream_get_le32(pp);
2266  av_log(fc, AV_LOG_TRACE, "reg_desc=%.4s\n", (char *)&st->codecpar->codec_tag);
2267  if (st->codecpar->codec_id == AV_CODEC_ID_NONE || sti->request_probe > 0) {
2269  if (st->codecpar->codec_tag == MKTAG('B', 'S', 'S', 'D'))
2270  sti->request_probe = 50;
2271  }
2272  break;
2274  sti->stream_identifier = 1 + get8(pp, desc_end);
2275  break;
2276  case METADATA_DESCRIPTOR:
2277  if (get16(pp, desc_end) == 0xFFFF)
2278  *pp += 4;
2279  if (get8(pp, desc_end) == 0xFF) {
2280  st->codecpar->codec_tag = bytestream_get_le32(pp);
2281  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2283  }
2284  break;
2285  case DVB_EXTENSION_DESCRIPTOR: /* DVB extension descriptor */
2286  ext_desc_tag = get8(pp, desc_end);
2287  if (ext_desc_tag < 0)
2288  return AVERROR_INVALIDDATA;
2289  if (st->codecpar->codec_id == AV_CODEC_ID_OPUS &&
2290  ext_desc_tag == 0x80) { /* User defined (provisional Opus) */
2291  if (!st->codecpar->extradata) {
2294  if (!st->codecpar->extradata)
2295  return AVERROR(ENOMEM);
2296 
2299 
2300  channel_config_code = get8(pp, desc_end);
2301  if (channel_config_code < 0)
2302  return AVERROR_INVALIDDATA;
2303  if (channel_config_code <= 0x8) {
2304  st->codecpar->extradata[9] = channels = channel_config_code ? channel_config_code : 2;
2305  AV_WL32(&st->codecpar->extradata[12], 48000);
2306  st->codecpar->extradata[18] = channel_config_code ? (channels > 2) : /* Dual Mono */ 255;
2307  st->codecpar->extradata[19] = opus_stream_cnt[channel_config_code];
2308  st->codecpar->extradata[20] = opus_coupled_stream_cnt[channel_config_code];
2309  memcpy(&st->codecpar->extradata[21], opus_channel_map[channels - 1], channels);
2310  st->codecpar->extradata_size = st->codecpar->extradata[18] ? 21 + channels : 19;
2311  } else {
2312  avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code > 0x8");
2313  }
2315  sti->need_context_update = 1;
2316  }
2317  break;
2318  }
2319  if (ext_desc_tag == SUPPLEMENTARY_AUDIO_DESCRIPTOR) {
2320  int flags;
2321 
2322  if (desc_len < 1)
2323  return AVERROR_INVALIDDATA;
2324  flags = get8(pp, desc_end);
2325 
2326  if ((flags & 0x80) == 0) /* mix_type */
2328 
2329  switch ((flags >> 2) & 0x1F) { /* editorial_classification */
2330  case 0x01:
2333  break;
2334  case 0x02:
2336  break;
2337  case 0x03:
2339  break;
2340  }
2341 
2342  if (flags & 0x01) { /* language_code_present */
2343  if (desc_len < 4)
2344  return AVERROR_INVALIDDATA;
2345  language[0] = get8(pp, desc_end);
2346  language[1] = get8(pp, desc_end);
2347  language[2] = get8(pp, desc_end);
2348  language[3] = 0;
2349 
2350  /* This language always has to override a possible
2351  * ISO 639 language descriptor language */
2352  if (language[0])
2353  av_dict_set(&st->metadata, "language", language, 0);
2354  }
2355  break;
2356  }
2357  if (ext_desc_tag == AC4_DESCRIPTOR) {
2360  }
2361  break;
2362  case AC3_DESCRIPTOR:
2364  {
2365  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2366  if (component_type_flag) {
2367  int component_type = get8(pp, desc_end);
2368  int service_type_mask = 0x38; // 0b00111000
2369  int service_type = ((component_type & service_type_mask) >> 3);
2370  if (service_type == 0x02 /* 0b010 */) {
2372  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2373  }
2374  }
2375  }
2376  break;
2378  // STD-B24, fascicle 3, chapter 4 defines private_stream_1
2379  // for captions
2380  if (stream_type == STREAM_TYPE_PRIVATE_DATA) {
2381  // This structure is defined in STD-B10, part 1, listing 5.4 and
2382  // part 2, 6.2.20).
2383  // Listing of data_component_ids is in STD-B10, part 2, Annex J.
2384  // Component tag limits are documented in TR-B14, fascicle 2,
2385  // Vol. 3, Section 2, 4.2.8.1
2386  int actual_component_tag = sti->stream_identifier - 1;
2387  int picked_profile = AV_PROFILE_UNKNOWN;
2388  int data_component_id = get16(pp, desc_end);
2389  if (data_component_id < 0)
2390  return AVERROR_INVALIDDATA;
2391 
2392  switch (data_component_id) {
2393  case 0x0008:
2394  // [0x30..0x37] are component tags utilized for
2395  // non-mobile captioning service ("profile A").
2396  if (actual_component_tag >= 0x30 &&
2397  actual_component_tag <= 0x37) {
2398  picked_profile = AV_PROFILE_ARIB_PROFILE_A;
2399  }
2400  break;
2401  case 0x0012:
2402  // component tag 0x87 signifies a mobile/partial reception
2403  // (1seg) captioning service ("profile C").
2404  if (actual_component_tag == 0x87) {
2405  picked_profile = AV_PROFILE_ARIB_PROFILE_C;
2406  }
2407  break;
2408  default:
2409  break;
2410  }
2411 
2412  if (picked_profile == AV_PROFILE_UNKNOWN)
2413  break;
2414 
2417  if (st->codecpar->profile != picked_profile) {
2418  st->codecpar->profile = picked_profile;
2419  sti->need_context_update = 1;
2420  }
2421  sti->request_probe = 0;
2422  sti->need_parsing = 0;
2423  }
2424  break;
2426  {
2427  uint32_t buf;
2429  size_t dovi_size;
2430  int dependency_pid = -1; // Unset
2431 
2432  if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
2433  return AVERROR_INVALIDDATA;
2434 
2435  dovi = av_dovi_alloc(&dovi_size);
2436  if (!dovi)
2437  return AVERROR(ENOMEM);
2438 
2439  dovi->dv_version_major = get8(pp, desc_end);
2440  dovi->dv_version_minor = get8(pp, desc_end);
2441  buf = get16(pp, desc_end);
2442  dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits
2443  dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits
2444  dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit
2445  dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit
2446  dovi->bl_present_flag = buf & 0x01; // 1 bit
2447  if (!dovi->bl_present_flag && desc_end - *pp >= 2) {
2448  buf = get16(pp, desc_end);
2449  dependency_pid = buf >> 3; // 13 bits
2450  }
2451  if (desc_end - *pp >= 1) { // 8 bits
2452  buf = get8(pp, desc_end);
2453  dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits
2454  dovi->dv_md_compression = (buf >> 2) & 0x03; // 2 bits
2455  } else {
2456  // 0 stands for None
2457  // Dolby Vision V1.2.93 profiles and levels
2460  }
2461 
2465  (uint8_t *)dovi, dovi_size, 0)) {
2466  av_free(dovi);
2467  return AVERROR(ENOMEM);
2468  }
2469 
2470  av_log(fc, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, "
2471  "rpu flag: %d, el flag: %d, bl flag: %d, dependency_pid: %d, "
2472  "compatibility id: %d, compression: %d\n",
2473  dovi->dv_version_major, dovi->dv_version_minor,
2474  dovi->dv_profile, dovi->dv_level,
2475  dovi->rpu_present_flag,
2476  dovi->el_present_flag,
2477  dovi->bl_present_flag,
2478  dependency_pid,
2480  dovi->dv_md_compression);
2481 
2482  /* A Profile 7 dual-track EL stream points at its base layer via
2483  * the descriptor's dependency_pid. Record a pending group entry,
2484  * it will be resolved once all streams are available. */
2485  if (dovi->dv_profile == 7 && dovi->el_present_flag &&
2486  !dovi->bl_present_flag && dependency_pid >= 0) {
2487  struct Program *p = get_program(ts, prg_id);
2488  struct StreamGroup *stg;
2489  int gi;
2490 
2491  if (!p)
2492  break;
2493 
2494  for (gi = 0; gi < p->nb_stream_groups; gi++) {
2495  stg = &p->stream_groups[gi];
2497  stg->nb_streams && stg->streams[0] == st)
2498  break;
2499  }
2500  if (gi == p->nb_stream_groups) {
2501  if (p->nb_stream_groups == MAX_STREAMS_PER_PROGRAM)
2502  return AVERROR(EINVAL);
2503  p->nb_stream_groups++;
2504  stg = &p->stream_groups[gi];
2506  stg->id = st->id;
2507  stg->streams[stg->nb_streams++] = st;
2508  }
2509  stg->dep_pid = dependency_pid;
2510  }
2511  }
2512  break;
2513  case EXTENSION_DESCRIPTOR: /* descriptor extension */
2514  {
2515  int ret = parse_mpeg2_extension_descriptor(fc, st, prg_id, pp, desc_end, ts);
2516 
2517  if (ret < 0)
2518  return ret;
2519  }
2520  break;
2521  default:
2522  break;
2523  }
2524  *pp = desc_end;
2525  return 0;
2526 }
2527 
2528 static AVStream *find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid,
2529  int stream_identifier, int pmt_stream_idx, struct Program *p)
2530 {
2531  AVFormatContext *s = ts->stream;
2532  AVStream *found = NULL;
2533 
2534  if (stream_identifier) { /* match based on "stream identifier descriptor" if present */
2535  for (int i = 0; i < p->nb_streams; i++) {
2536  if (p->streams[i].stream_identifier == stream_identifier)
2537  if (!found || pmt_stream_idx == i) /* fallback to idx based guess if multiple streams have the same identifier */
2538  found = s->streams[p->streams[i].idx];
2539  }
2540  } else if (pmt_stream_idx < p->nb_streams) { /* match based on position within the PMT */
2541  found = s->streams[p->streams[pmt_stream_idx].idx];
2542  }
2543 
2544  if (found) {
2546  "reusing existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2548  found->index, found->id, pid);
2549  }
2550 
2551  return found;
2552 }
2553 
2554 static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
2555 {
2556  const uint8_t **pp = &p;
2557  const uint8_t *desc_list_end;
2558  const uint8_t *desc_end;
2559  int desc_list_len;
2560  int desc_len, desc_tag;
2561 
2562  desc_list_len = get16(pp, p_end);
2563  if (desc_list_len < 0)
2564  return -1;
2565  desc_list_len &= 0xfff;
2566  desc_list_end = p + desc_list_len;
2567  if (desc_list_end > p_end)
2568  return -1;
2569 
2570  while (1) {
2571  desc_tag = get8(pp, desc_list_end);
2572  if (desc_tag < 0)
2573  return -1;
2574  desc_len = get8(pp, desc_list_end);
2575  if (desc_len < 0)
2576  return -1;
2577  desc_end = *pp + desc_len;
2578  if (desc_end > desc_list_end)
2579  return -1;
2580 
2581  if (desc_tag == STREAM_IDENTIFIER_DESCRIPTOR) {
2582  return get8(pp, desc_end);
2583  }
2584  *pp = desc_end;
2585  }
2586 
2587  return -1;
2588 }
2589 
2590 static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
2591 {
2592  switch (stream_type) {
2595  return 0;
2597  /* This User Private stream_type value is used by multiple organizations
2598  for different things. ANSI/SCTE 35 splice_info_section() is a
2599  private_section() not a PES_packet(). */
2600  return !(prog_reg_desc == AV_RL32("CUEI"));
2601  default:
2602  return 1;
2603  }
2604 }
2605 
2606 /* UHD Blu-ray titles don't follow the Dolby Vision MPEG-TS spec [1] when
2607  * signaling a dual-PID Profile 7 stream. The enhancement-layer PID lacks the
2608  * DOVI_video_stream_descriptor, is advertised with stream_type 0x24 (HEVC)
2609  * instead of the spec-mandated 0x06, and uses the HDMV registration descriptor
2610  * instead of "DOVI". EL always has M2TS_VIDEO_EL_PID (0x1015) PID.
2611  * [1] <https://professionalsupport.dolby.com/s/article/How-to-signal-Dolby-Vision-in-MPEG-2-TS>
2612  */
2613 static void detect_bdmv_dovi_group(MpegTSContext *ts, struct Program *prg,
2614  uint32_t prog_reg_desc)
2615 {
2616  AVStream *bl_st = NULL, *el_st = NULL;
2617  struct StreamGroup *grp;
2618 
2619  if (prog_reg_desc != AV_RL32("HDMV"))
2620  return;
2621 
2623  return;
2624 
2625  for (int i = 0; i < prg->nb_stream_groups; i++) {
2627  return;
2628  }
2629 
2630  for (int j = 0; j < prg->nb_streams; j++) {
2631  int idx = prg->streams[j].idx;
2632  AVStream *st;
2633  if (idx < 0 || idx >= ts->stream->nb_streams)
2634  continue;
2635  st = ts->stream->streams[idx];
2636  if (st->codecpar->codec_id != AV_CODEC_ID_HEVC)
2637  continue;
2638  if (st->id == M2TS_VIDEO_PID)
2639  bl_st = st;
2640  else if (st->id == M2TS_VIDEO_EL_PID)
2641  el_st = st;
2642  }
2643 
2644  if (!bl_st || !el_st)
2645  return;
2646 
2647  grp = &prg->stream_groups[prg->nb_stream_groups++];
2649  grp->id = el_st->id;
2650  grp->streams[0] = bl_st;
2651  grp->streams[1] = el_st;
2652  grp->nb_streams = 2;
2653 }
2654 
2655 static void create_stream_groups(MpegTSContext *ts, struct Program *prg)
2656 {
2657  for (int i = 0; i < prg->nb_stream_groups; i++) {
2658  struct StreamGroup *grp = &prg->stream_groups[i];
2659  AVStreamGroup *stg;
2660  int j;
2661 
2662  /* The DOVI descriptor on a Profile 7 EL points at its base layer
2663  * via dependency_pid. Resolve the BL now that all streams of the
2664  * program have been added. */
2665  if (grp->type == AV_STREAM_GROUP_PARAMS_DOLBY_VISION && grp->nb_streams == 1) {
2666  for (j = 0; j < prg->nb_streams; j++) {
2667  int idx = prg->streams[j].idx;
2668  AVStream *cand;
2669  if (idx < 0 || idx >= ts->stream->nb_streams)
2670  continue;
2671  cand = ts->stream->streams[idx];
2672  if (cand == grp->streams[0] || cand->id != grp->dep_pid)
2673  continue;
2674  grp->streams[1] = grp->streams[0];
2675  grp->streams[0] = cand;
2676  grp->nb_streams = 2;
2677  break;
2678  }
2679  }
2680 
2681  if (grp->nb_streams < 2)
2682  continue;
2683  for (j = 0; j < ts->stream->nb_stream_groups; j++) {
2684  stg = ts->stream->stream_groups[j];
2685  if (stg->id == grp->id)
2686  break;
2687  }
2688  if (j == ts->stream->nb_stream_groups)
2689  stg = avformat_stream_group_create(ts->stream, grp->type, NULL);
2690  else
2691  continue;
2692  if (!stg)
2693  continue;
2694  stg->id = grp->id;
2695  for (int j = 0; j < grp->nb_streams; j++) {
2696  int ret = avformat_stream_group_add_stream(stg, grp->streams[j]);
2697  if (ret < 0) {
2698  ff_remove_stream_group(ts->stream, stg);
2699  continue;
2700  }
2701  switch (grp->type) {
2703  if (grp->streams[j]->codecpar->codec_id == AV_CODEC_ID_LCEVC)
2704  stg->params.layered_video->el_index = stg->nb_streams - 1;
2705  break;
2707  if (j == 0) {
2708  stg->params.layered_video->width = grp->streams[j]->codecpar->width;
2709  stg->params.layered_video->height = grp->streams[j]->codecpar->height;
2710  }
2711  if (j == grp->nb_streams - 1)
2712  stg->params.layered_video->el_index = stg->nb_streams - 1;
2713  break;
2714  default:
2715  av_unreachable("Invalid group type!");
2716  }
2717  }
2718  }
2719 }
2720 
2721 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2722 {
2723  MpegTSContext *ts = filter->u.section_filter.opaque;
2724  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2725  struct Program old_program;
2726  SectionHeader h1, *h = &h1;
2727  PESContext *pes;
2728  AVStream *st;
2729  const uint8_t *p, *p_end, *desc_list_end;
2730  int program_info_length, pcr_pid, pid, stream_type;
2731  int desc_list_len;
2732  uint32_t prog_reg_desc = 0; /* registration descriptor */
2733  int stream_identifier = -1;
2734  struct Program *prg;
2735 
2736  int mp4_descr_count = 0;
2737  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
2738  int i;
2739 
2740  av_log(ts->stream, AV_LOG_TRACE, "PMT: len %i\n", section_len);
2741  hex_dump_debug(ts->stream, section, section_len);
2742 
2743  p_end = section + section_len - 4;
2744  p = section;
2745  if (parse_section_header(h, &p, p_end) < 0)
2746  return;
2747  if (h->tid != PMT_TID)
2748  return;
2749  if (!h->current_next)
2750  return;
2751  if (skip_identical(h, tssf))
2752  return;
2753 
2754  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x sec_num=%d/%d version=%d tid=%d\n",
2755  h->id, h->sec_num, h->last_sec_num, h->version, h->tid);
2756 
2757  if (!ts->scan_all_pmts && ts->skip_changes)
2758  return;
2759 
2760  prg = get_program(ts, h->id);
2761  if (prg)
2762  old_program = *prg;
2763  else
2764  clear_program(&old_program);
2765 
2766  if (ts->skip_unknown_pmt && !prg)
2767  return;
2768  if (prg && prg->nb_pids && prg->pids[0] != ts->current_pid)
2769  return;
2770  if (!ts->skip_clear)
2771  clear_avprogram(ts, h->id);
2772  clear_program(prg);
2773  add_pid_to_program(prg, ts->current_pid);
2774 
2775  pcr_pid = get16(&p, p_end);
2776  if (pcr_pid < 0)
2777  return;
2778  pcr_pid &= 0x1fff;
2779  add_pid_to_program(prg, pcr_pid);
2780  update_av_program_info(ts->stream, h->id, pcr_pid, h->version);
2781 
2782  av_log(ts->stream, AV_LOG_TRACE, "pcr_pid=0x%x\n", pcr_pid);
2783 
2784  program_info_length = get16(&p, p_end);
2785 
2786  if (program_info_length < 0 || (program_info_length & 0xFFF) > p_end - p)
2787  return;
2788  program_info_length &= 0xfff;
2789  while (program_info_length >= 2) {
2790  uint8_t tag, len;
2791  tag = get8(&p, p_end);
2792  len = get8(&p, p_end);
2793 
2794  av_log(ts->stream, AV_LOG_TRACE, "program tag: 0x%02x len=%d\n", tag, len);
2795 
2796  program_info_length -= 2;
2797  if (len > program_info_length)
2798  // something else is broken, exit the program_descriptors_loop
2799  break;
2800  program_info_length -= len;
2801  if (tag == IOD_DESCRIPTOR && len >= 2) {
2802  get8(&p, p_end); // scope
2803  get8(&p, p_end); // label
2804  len -= 2;
2805  mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
2806  &mp4_descr_count, MAX_MP4_DESCR_COUNT - mp4_descr_count);
2807  } else if (tag == REGISTRATION_DESCRIPTOR && len >= 4) {
2808  prog_reg_desc = bytestream_get_le32(&p);
2809  len -= 4;
2810  }
2811  p += len;
2812  }
2813  p += program_info_length;
2814  if (p >= p_end)
2815  goto out;
2816 
2817  // stop parsing after pmt, we found header
2818  if (!ts->pkt)
2819  ts->stop_parse = 2;
2820 
2821  if (prg)
2822  prg->pmt_found = 1;
2823 
2824  for (i = 0; i < MAX_STREAMS_PER_PROGRAM; i++) {
2825  st = 0;
2826  pes = NULL;
2827  stream_type = get8(&p, p_end);
2828  if (stream_type < 0)
2829  break;
2830  pid = get16(&p, p_end);
2831  if (pid < 0)
2832  goto out;
2833  pid &= 0x1fff;
2834  if (pid == ts->current_pid)
2835  goto out;
2836 
2837  stream_identifier = parse_stream_identifier_desc(p, p_end) + 1;
2838 
2839  /* now create stream */
2840  if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
2841  pes = ts->pids[pid]->u.pes_filter.opaque;
2842  if (ts->merge_pmt_versions && !pes->st) {
2843  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2844  if (st) {
2845  pes->st = st;
2846  pes->stream_type = stream_type;
2847  pes->merged_st = 1;
2848  }
2849  }
2850  if (!pes->st) {
2851  pes->st = avformat_new_stream(pes->stream, NULL);
2852  if (!pes->st)
2853  goto out;
2854  pes->st->id = pes->pid;
2855  }
2856  st = pes->st;
2857  } else if (is_pes_stream(stream_type, prog_reg_desc)) {
2858  if (ts->pids[pid])
2859  mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably
2860  pes = add_pes_stream(ts, pid, pcr_pid);
2861  if (ts->merge_pmt_versions && pes && !pes->st) {
2862  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2863  if (st) {
2864  pes->st = st;
2865  pes->stream_type = stream_type;
2866  pes->merged_st = 1;
2867  }
2868  }
2869  if (pes && !pes->st) {
2870  st = avformat_new_stream(pes->stream, NULL);
2871  if (!st)
2872  goto out;
2873  st->id = pes->pid;
2874  }
2875  } else {
2876  int idx = ff_find_stream_index(ts->stream, pid);
2877  if (idx >= 0) {
2878  st = ts->stream->streams[idx];
2879  }
2880  if (ts->merge_pmt_versions && !st) {
2881  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2882  }
2883  if (!st) {
2884  st = avformat_new_stream(ts->stream, NULL);
2885  if (!st)
2886  goto out;
2887  st->id = pid;
2889  if (stream_type == STREAM_TYPE_SCTE_DATA_SCTE_35 && prog_reg_desc == AV_RL32("CUEI")) {
2890  mpegts_find_stream_type(st, stream_type, SCTE_types);
2891  mpegts_open_section_filter(ts, pid, scte_data_cb, ts, 1);
2892  }
2893  }
2894  }
2895 
2896  if (!st)
2897  goto out;
2898 
2899  if (pes && pes->stream_type != stream_type)
2900  mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
2901 
2902  add_pid_to_program(prg, pid);
2903  if (prg) {
2904  prg->streams[i].idx = st->index;
2905  prg->streams[i].stream_identifier = stream_identifier;
2906  prg->nb_streams++;
2907  }
2908 
2909  av_program_add_stream_index(ts->stream, h->id, st->index);
2910 
2911  desc_list_len = get16(&p, p_end);
2912  if (desc_list_len < 0)
2913  goto out;
2914  desc_list_len &= 0xfff;
2915  desc_list_end = p + desc_list_len;
2916  if (desc_list_end > p_end)
2917  goto out;
2918  for (;;) {
2919  if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, h->id, &p,
2920  desc_list_end, mp4_descr,
2921  mp4_descr_count, pid, ts) < 0)
2922  break;
2923 
2924  if (pes && prog_reg_desc == AV_RL32("HDMV") &&
2925  stream_type == STREAM_TYPE_BLURAY_AUDIO_TRUEHD && pes->sub_st) {
2927  pes->sub_st->index);
2928  pes->sub_st->codecpar->codec_tag = st->codecpar->codec_tag;
2929  }
2930  }
2931  p = desc_list_end;
2932  }
2933 
2934  if (!ts->pids[pcr_pid])
2935  mpegts_open_pcr_filter(ts, pcr_pid);
2936 
2937 out:
2938  if (prg) {
2939  detect_bdmv_dovi_group(ts, prg, prog_reg_desc);
2940  create_stream_groups(ts, prg);
2941  }
2942 
2943  for (i = 0; i < mp4_descr_count; i++)
2944  av_free(mp4_descr[i].dec_config_descr);
2945 }
2946 
2947 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2948 {
2949  MpegTSContext *ts = filter->u.section_filter.opaque;
2950  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2951  SectionHeader h1, *h = &h1;
2952  const uint8_t *p, *p_end;
2953  int sid, pmt_pid;
2954  int nb_prg = 0;
2955  AVProgram *program;
2956 
2957  av_log(ts->stream, AV_LOG_TRACE, "PAT:\n");
2958  hex_dump_debug(ts->stream, section, section_len);
2959 
2960  p_end = section + section_len - 4;
2961  p = section;
2962  if (parse_section_header(h, &p, p_end) < 0)
2963  return;
2964  if (h->tid != PAT_TID)
2965  return;
2966  if (!h->current_next)
2967  return;
2968  if (ts->skip_changes)
2969  return;
2970 
2971  if (skip_identical(h, tssf))
2972  return;
2973  ts->id = h->id;
2974 
2975  for (;;) {
2976  sid = get16(&p, p_end);
2977  if (sid < 0)
2978  break;
2979  pmt_pid = get16(&p, p_end);
2980  if (pmt_pid < 0)
2981  break;
2982  pmt_pid &= 0x1fff;
2983 
2984  if (pmt_pid <= 0x000F || pmt_pid == 0x1FFF) {
2986  "Ignoring invalid PAT entry: sid=0x%x pid=0x%x\n", sid, pmt_pid);
2987  continue;
2988  }
2989 
2990  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
2991 
2992  if (sid == 0x0000) {
2993  /* NIT info */
2994  } else {
2995  MpegTSFilter *fil = ts->pids[pmt_pid];
2996  struct Program *prg;
2997  program = av_new_program(ts->stream, sid);
2998  if (program) {
2999  program->program_num = sid;
3000  program->pmt_pid = pmt_pid;
3001  }
3002  if (fil)
3003  if ( fil->type != MPEGTS_SECTION
3004  || fil->pid != pmt_pid
3005  || fil->u.section_filter.section_cb != pmt_cb)
3006  mpegts_close_filter(ts, ts->pids[pmt_pid]);
3007 
3008  if (!ts->pids[pmt_pid])
3009  mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
3010  prg = add_program(ts, sid);
3011  if (prg) {
3012  unsigned prg_idx = prg - ts->prg;
3013  if (prg->nb_pids && prg->pids[0] != pmt_pid)
3014  clear_program(prg);
3015  add_pid_to_program(prg, pmt_pid);
3016  if (prg_idx > nb_prg)
3017  FFSWAP(struct Program, ts->prg[nb_prg], ts->prg[prg_idx]);
3018  if (prg_idx >= nb_prg)
3019  nb_prg++;
3020  } else
3021  nb_prg = 0;
3022  }
3023  }
3024  ts->nb_prg = nb_prg;
3025 
3026  if (sid < 0) {
3027  int i,j;
3028  for (j=0; j<ts->stream->nb_programs; j++) {
3029  for (i = 0; i < ts->nb_prg; i++)
3030  if (ts->prg[i].id == ts->stream->programs[j]->id)
3031  break;
3032  if (i==ts->nb_prg && !ts->skip_clear)
3033  clear_avprogram(ts, ts->stream->programs[j]->id);
3034  }
3035  }
3036 }
3037 
3038 static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
3039 {
3040  MpegTSContext *ts = filter->u.section_filter.opaque;
3041  const uint8_t *p, *p_end;
3042  SectionHeader h1, *h = &h1;
3043 
3044  /*
3045  * Sometimes we receive EPG packets but SDT table do not have
3046  * eit_pres_following or eit_sched turned on, so we open EPG
3047  * stream directly here.
3048  */
3049  if (!ts->epg_stream) {
3051  if (!ts->epg_stream)
3052  return;
3053  ts->epg_stream->id = EIT_PID;
3056  }
3057 
3058  if (ts->epg_stream->discard == AVDISCARD_ALL)
3059  return;
3060 
3061  p_end = section + section_len - 4;
3062  p = section;
3063 
3064  if (parse_section_header(h, &p, p_end) < 0)
3065  return;
3066  if (h->tid < EIT_TID || h->tid > OEITS_END_TID)
3067  return;
3068 
3069  av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", h->tid);
3070 
3071  /**
3072  * Service_id 0xFFFF is reserved, it indicates that the current EIT table
3073  * is scrambled.
3074  */
3075  if (h->id == 0xFFFF) {
3076  av_log(ts->stream, AV_LOG_TRACE, "Scrambled EIT table received.\n");
3077  return;
3078  }
3079 
3080  /**
3081  * In case we receive an EPG packet before mpegts context is fully
3082  * initialized.
3083  */
3084  if (!ts->pkt)
3085  return;
3086 
3087  new_data_packet(section, section_len, ts->pkt);
3088  ts->pkt->stream_index = ts->epg_stream->index;
3089  ts->stop_parse = 1;
3090 }
3091 
3092 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
3093 {
3094  MpegTSContext *ts = filter->u.section_filter.opaque;
3095  MpegTSSectionFilter *tssf = &filter->u.section_filter;
3096  SectionHeader h1, *h = &h1;
3097  const uint8_t *p, *p_end, *desc_list_end, *desc_end;
3098  int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
3099  char *name, *provider_name;
3100 
3101  av_log(ts->stream, AV_LOG_TRACE, "SDT:\n");
3102  hex_dump_debug(ts->stream, section, section_len);
3103 
3104  p_end = section + section_len - 4;
3105  p = section;
3106  if (parse_section_header(h, &p, p_end) < 0)
3107  return;
3108  if (h->tid != SDT_TID)
3109  return;
3110  if (!h->current_next)
3111  return;
3112  if (ts->skip_changes)
3113  return;
3114  if (skip_identical(h, tssf))
3115  return;
3116 
3117  onid = get16(&p, p_end);
3118  if (onid < 0)
3119  return;
3120  val = get8(&p, p_end);
3121  if (val < 0)
3122  return;
3123  for (;;) {
3124  sid = get16(&p, p_end);
3125  if (sid < 0)
3126  break;
3127  val = get8(&p, p_end);
3128  if (val < 0)
3129  break;
3130  desc_list_len = get16(&p, p_end);
3131  if (desc_list_len < 0)
3132  break;
3133  desc_list_len &= 0xfff;
3134  desc_list_end = p + desc_list_len;
3135  if (desc_list_end > p_end)
3136  break;
3137  for (;;) {
3138  desc_tag = get8(&p, desc_list_end);
3139  if (desc_tag < 0)
3140  break;
3141  desc_len = get8(&p, desc_list_end);
3142  desc_end = p + desc_len;
3143  if (desc_len < 0 || desc_end > desc_list_end)
3144  break;
3145 
3146  av_log(ts->stream, AV_LOG_TRACE, "tag: 0x%02x len=%d\n",
3147  desc_tag, desc_len);
3148 
3149  switch (desc_tag) {
3150  case SERVICE_DESCRIPTOR:
3151  service_type = get8(&p, desc_end);
3152  if (service_type < 0)
3153  break;
3154  provider_name = getstr8(&p, desc_end);
3155  if (!provider_name)
3156  break;
3157  name = getstr8(&p, desc_end);
3158  if (name) {
3159  AVProgram *program = av_new_program(ts->stream, sid);
3160  if (program) {
3161  av_dict_set(&program->metadata, "service_name", name, 0);
3162  av_dict_set(&program->metadata, "service_provider",
3163  provider_name, 0);
3164  }
3165  }
3166  av_free(name);
3167  av_free(provider_name);
3168  break;
3169  default:
3170  break;
3171  }
3172  p = desc_end;
3173  }
3174  p = desc_list_end;
3175  }
3176 }
3177 
3178 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
3179  const uint8_t *packet);
3180 
3181 /* handle one TS packet */
3182 static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
3183 {
3184  MpegTSFilter *tss;
3185  int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
3186  has_adaptation, has_payload;
3187  const uint8_t *p, *p_end;
3188 
3189  pid = AV_RB16(packet + 1) & 0x1fff;
3190  is_start = packet[1] & 0x40;
3191  tss = ts->pids[pid];
3192  if (ts->auto_guess && !tss && is_start) {
3193  add_pes_stream(ts, pid, -1);
3194  tss = ts->pids[pid];
3195  }
3196  if (!tss)
3197  return 0;
3198  if (is_start)
3199  tss->discard = discard_pid(ts, pid);
3200  if (tss->discard)
3201  return 0;
3202  ts->current_pid = pid;
3203 
3204  afc = (packet[3] >> 4) & 3;
3205  if (afc == 0) /* reserved value */
3206  return 0;
3207  has_adaptation = afc & 2;
3208  has_payload = afc & 1;
3209  is_discontinuity = has_adaptation &&
3210  packet[4] != 0 && /* with length > 0 */
3211  (packet[5] & 0x80); /* and discontinuity indicated */
3212 
3213  /* continuity check (currently not used) */
3214  cc = (packet[3] & 0xf);
3215  expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
3216  cc_ok = pid == NULL_PID ||
3217  is_discontinuity ||
3218  tss->last_cc < 0 ||
3219  expected_cc == cc;
3220 
3221  tss->last_cc = cc;
3222  if (!cc_ok) {
3223  av_log(ts->stream, AV_LOG_DEBUG,
3224  "Continuity check failed for pid %d expected %d got %d\n",
3225  pid, expected_cc, cc);
3226  if (tss->type == MPEGTS_PES) {
3227  PESContext *pc = tss->u.pes_filter.opaque;
3228  pc->flags |= AV_PKT_FLAG_CORRUPT;
3229  }
3230  }
3231 
3232  if (packet[1] & 0x80) {
3233  av_log(ts->stream, AV_LOG_DEBUG, "Packet had TEI flag set; marking as corrupt\n");
3234  if (tss->type == MPEGTS_PES) {
3235  PESContext *pc = tss->u.pes_filter.opaque;
3236  pc->flags |= AV_PKT_FLAG_CORRUPT;
3237  }
3238  }
3239 
3240  p = packet + 4;
3241  if (has_adaptation) {
3242  int64_t pcr_h;
3243  int pcr_l;
3244  if (parse_pcr(&pcr_h, &pcr_l, packet) == 0)
3245  tss->last_pcr = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3246  /* skip adaptation field */
3247  p += p[0] + 1;
3248  }
3249  /* if past the end of packet, ignore */
3250  p_end = packet + TS_PACKET_SIZE;
3251  if (p >= p_end || !has_payload)
3252  return 0;
3253 
3254  if (pos >= 0) {
3256  ts->pos47_full = pos - TS_PACKET_SIZE;
3257  }
3258 
3259  if (tss->type == MPEGTS_SECTION) {
3260  if (is_start) {
3261  /* pointer field present */
3262  len = *p++;
3263  if (len > p_end - p)
3264  return 0;
3265  if (len && cc_ok) {
3266  /* write remaining section bytes */
3267  write_section_data(ts, tss,
3268  p, len, 0);
3269  /* check whether filter has been closed */
3270  if (!ts->pids[pid])
3271  return 0;
3272  }
3273  p += len;
3274  if (p < p_end) {
3275  write_section_data(ts, tss,
3276  p, p_end - p, 1);
3277  }
3278  } else {
3279  if (cc_ok) {
3280  write_section_data(ts, tss,
3281  p, p_end - p, 0);
3282  }
3283  }
3284 
3285  // stop find_stream_info from waiting for more streams
3286  // when all programs have received a PMT
3287  if (ts->stream->ctx_flags & AVFMTCTX_NOHEADER && ts->scan_all_pmts <= 0) {
3288  int i;
3289  for (i = 0; i < ts->nb_prg; i++) {
3290  if (!ts->prg[i].pmt_found)
3291  break;
3292  }
3293  if (i == ts->nb_prg && ts->nb_prg > 0) {
3294  av_log(ts->stream, AV_LOG_DEBUG, "All programs have pmt, headers found\n");
3296  }
3297  }
3298 
3299  } else {
3300  int ret;
3301  // Note: The position here points actually behind the current packet.
3302  if (tss->type == MPEGTS_PES) {
3303  if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
3304  pos - ts->raw_packet_size)) < 0)
3305  return ret;
3306  }
3307  }
3308 
3309  return 0;
3310 }
3311 
3312 static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
3313 {
3314  MpegTSContext *ts = s->priv_data;
3315  AVIOContext *pb = s->pb;
3316  int c, i;
3317  uint64_t pos = avio_tell(pb);
3318  int64_t back = FFMIN(seekback, pos);
3319 
3320  //Special case for files like 01c56b0dc1.ts
3321  if (current_packet[0] == 0x80 && current_packet[12] == SYNC_BYTE && pos >= TS_PACKET_SIZE) {
3322  avio_seek(pb, 12 - TS_PACKET_SIZE, SEEK_CUR);
3323  return 0;
3324  }
3325 
3326  avio_seek(pb, -back, SEEK_CUR);
3327 
3328  for (i = 0; i < ts->resync_size; i++) {
3329  c = avio_r8(pb);
3330  if (avio_feof(pb))
3331  return AVERROR_EOF;
3332  if (c == SYNC_BYTE) {
3333  int new_packet_size, ret;
3334  avio_seek(pb, -1, SEEK_CUR);
3335  pos = avio_tell(pb);
3337  if (ret < 0)
3338  return ret;
3339  new_packet_size = get_packet_size(s);
3340  if (new_packet_size > 0 && new_packet_size != ts->raw_packet_size) {
3341  av_log(ts->stream, AV_LOG_WARNING, "changing packet size to %d\n", new_packet_size);
3342  ts->raw_packet_size = new_packet_size;
3343  }
3344  avio_seek(pb, pos, SEEK_SET);
3345  return 0;
3346  }
3347  }
3349  "max resync size reached, could not find sync byte\n");
3350  /* no sync found */
3351  return AVERROR_INVALIDDATA;
3352 }
3353 
3354 /* return AVERROR_something if error or EOF. Return 0 if OK. */
3355 static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size,
3356  const uint8_t **data)
3357 {
3358  AVIOContext *pb = s->pb;
3359  int len;
3360 
3361  // 192 bytes source packet that start with a 4 bytes TP_extra_header
3362  // followed by 188 bytes of TS packet. The sync byte is at offset 4, so skip
3363  // the first 4 bytes otherwise we'll end up syncing to the wrong packet.
3364  if (raw_packet_size == TS_DVHS_PACKET_SIZE)
3365  avio_skip(pb, 4);
3366 
3367  for (;;) {
3369  if (len != TS_PACKET_SIZE)
3370  return len < 0 ? len : AVERROR_EOF;
3371  /* check packet sync byte */
3372  if ((*data)[0] != SYNC_BYTE) {
3373  /* find a new packet start */
3374 
3375  if (mpegts_resync(s, raw_packet_size, *data) < 0)
3376  return AVERROR(EAGAIN);
3377  else
3378  continue;
3379  } else {
3380  break;
3381  }
3382  }
3383  return 0;
3384 }
3385 
3386 static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
3387 {
3388  AVIOContext *pb = s->pb;
3389  int skip;
3390  if (raw_packet_size == TS_DVHS_PACKET_SIZE)
3391  skip = raw_packet_size - TS_DVHS_PACKET_SIZE;
3392  else
3393  skip = raw_packet_size - TS_PACKET_SIZE;
3394  if (skip > 0)
3395  avio_skip(pb, skip);
3396 }
3397 
3398 static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
3399 {
3400  AVFormatContext *s = ts->stream;
3401  uint8_t packet[TS_PACKET_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
3402  const uint8_t *data;
3403  int64_t packet_num;
3404  int ret = 0;
3405 
3406  if (avio_tell(s->pb) != ts->last_pos) {
3407  int i;
3408  av_log(ts->stream, AV_LOG_TRACE, "Skipping after seek\n");
3409  /* seek detected, flush pes buffer */
3410  for (i = 0; i < NB_PID_MAX; i++) {
3411  if (ts->pids[i]) {
3412  if (ts->pids[i]->type == MPEGTS_PES) {
3413  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3414  av_buffer_unref(&pes->buffer);
3415  pes->data_index = 0;
3416  pes->state = MPEGTS_SKIP; /* skip until pes header */
3417  } else if (ts->pids[i]->type == MPEGTS_SECTION) {
3418  ts->pids[i]->u.section_filter.last_ver = -1;
3419  }
3420  ts->pids[i]->last_cc = -1;
3421  ts->pids[i]->last_pcr = -1;
3422  }
3423  }
3424  }
3425 
3426  ts->stop_parse = 0;
3427  packet_num = 0;
3428  memset(packet + TS_PACKET_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3429  for (;;) {
3430  packet_num++;
3431  if (nb_packets != 0 && packet_num >= nb_packets ||
3432  ts->stop_parse > 1) {
3433  ret = AVERROR(EAGAIN);
3434  break;
3435  }
3436  if (ts->stop_parse > 0)
3437  break;
3438 
3439  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3440  if (ret != 0)
3441  break;
3442  ret = handle_packet(ts, data, avio_tell(s->pb));
3444  if (ret != 0)
3445  break;
3446  }
3447  ts->last_pos = avio_tell(s->pb);
3448  return ret;
3449 }
3450 
3451 static int mpegts_probe(const AVProbeData *p)
3452 {
3453  const int size = p->buf_size;
3454  int maxscore = 0;
3455  int sumscore = 0;
3456  int i;
3457  int check_count = size / TS_FEC_PACKET_SIZE;
3458 #define CHECK_COUNT 10
3459 #define CHECK_BLOCK 100
3460 
3461  if (!check_count)
3462  return 0;
3463 
3464  for (i = 0; i<check_count; i+=CHECK_BLOCK) {
3465  int left = FFMIN(check_count - i, CHECK_BLOCK);
3466  int score = analyze(p->buf + TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , 1);
3468  int fec_score = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , 1);
3469  score = FFMAX3(score, dvhs_score, fec_score);
3470  sumscore += score;
3471  maxscore = FFMAX(maxscore, score);
3472  }
3473 
3474  sumscore = sumscore * CHECK_COUNT / check_count;
3475  maxscore = maxscore * CHECK_COUNT / CHECK_BLOCK;
3476 
3477  ff_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
3478 
3479  if (check_count > CHECK_COUNT && sumscore > 6) {
3480  return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
3481  } else if (check_count >= CHECK_COUNT && sumscore > 6) {
3482  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3483  } else if (check_count >= CHECK_COUNT && maxscore > 6) {
3484  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3485  } else if (sumscore > 6) {
3486  return 2;
3487  } else {
3488  return 0;
3489  }
3490 }
3491 
3492 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
3493  * (-1) if not available */
3494 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
3495 {
3496  int afc, len, flags;
3497  const uint8_t *p;
3498  unsigned int v;
3499 
3500  afc = (packet[3] >> 4) & 3;
3501  if (afc <= 1)
3502  return AVERROR_INVALIDDATA;
3503  p = packet + 4;
3504  len = p[0];
3505  p++;
3506  if (len == 0)
3507  return AVERROR_INVALIDDATA;
3508  flags = *p++;
3509  len--;
3510  if (!(flags & 0x10))
3511  return AVERROR_INVALIDDATA;
3512  if (len < 6)
3513  return AVERROR_INVALIDDATA;
3514  v = AV_RB32(p);
3515  *ppcr_high = ((int64_t) v << 1) | (p[4] >> 7);
3516  *ppcr_low = ((p[4] & 1) << 8) | p[5];
3517  return 0;
3518 }
3519 
3521 
3522  /* NOTE: We attempt to seek on non-seekable files as well, as the
3523  * probe buffer usually is big enough. Only warn if the seek failed
3524  * on files where the seek should work. */
3525  if (avio_seek(pb, pos, SEEK_SET) < 0)
3526  av_log(s, (pb->seekable & AVIO_SEEKABLE_NORMAL) ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
3527 }
3528 
3530 {
3531  MpegTSContext *ts = s->priv_data;
3532  AVIOContext *pb = s->pb;
3533  int64_t pos, probesize = s->probesize;
3534  int64_t seekback = FFMAX(s->probesize, (int64_t)ts->resync_size + PROBE_PACKET_MAX_BUF);
3535 
3536  if (ffio_ensure_seekback(pb, seekback) < 0)
3537  av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n");
3538 
3539  pos = avio_tell(pb);
3541  if (ts->raw_packet_size <= 0) {
3542  av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
3544  }
3545  ts->stream = s;
3546  ts->auto_guess = 0;
3547 
3548  if (s->iformat == &ff_mpegts_demuxer.p) {
3549  /* normal demux */
3550 
3551  /* first do a scan to get all the services */
3552  seek_back(s, pb, pos);
3553 
3557 
3558  handle_packets(ts, probesize / ts->raw_packet_size);
3559  /* if could not find service, enable auto_guess */
3560 
3561  ts->auto_guess = 1;
3562 
3563  av_log(ts->stream, AV_LOG_TRACE, "tuning done\n");
3564 
3565  s->ctx_flags |= AVFMTCTX_NOHEADER;
3566  } else {
3567  AVStream *st;
3568  int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
3569  int64_t pcrs[2], pcr_h;
3570  uint8_t packet[TS_PACKET_SIZE];
3571  const uint8_t *data;
3572 
3573  /* only read packets */
3574 
3575  st = avformat_new_stream(s, NULL);
3576  if (!st)
3577  return AVERROR(ENOMEM);
3578  avpriv_set_pts_info(st, 60, 1, 27000000);
3581 
3582  /* we iterate until we find two PCRs to estimate the bitrate */
3583  pcr_pid = -1;
3584  nb_pcrs = 0;
3585  nb_packets = 0;
3586  for (;;) {
3587  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3588  if (ret < 0)
3589  return ret;
3590  pid = AV_RB16(data + 1) & 0x1fff;
3591  if ((pcr_pid == -1 || pcr_pid == pid) &&
3592  parse_pcr(&pcr_h, &pcr_l, data) == 0) {
3594  pcr_pid = pid;
3595  pcrs[nb_pcrs] = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3596  nb_pcrs++;
3597  if (nb_pcrs >= 2) {
3598  if (pcrs[1] - pcrs[0] > 0) {
3599  /* the difference needs to be positive to make sense for bitrate computation */
3600  break;
3601  } else {
3602  av_log(ts->stream, AV_LOG_WARNING, "invalid pcr pair %"PRId64" >= %"PRId64"\n", pcrs[0], pcrs[1]);
3603  pcrs[0] = pcrs[1];
3604  nb_pcrs--;
3605  }
3606  }
3607  } else {
3609  }
3610  nb_packets++;
3611  }
3612 
3613  /* NOTE1: the bitrate is computed without the FEC */
3614  /* NOTE2: it is only the bitrate of the start of the stream */
3615  ts->pcr_incr = pcrs[1] - pcrs[0];
3616  ts->cur_pcr = pcrs[0] - ts->pcr_incr * (nb_packets - 1);
3617  s->bit_rate = TS_PACKET_SIZE * 8 * 27000000LL / ts->pcr_incr;
3618  st->codecpar->bit_rate = s->bit_rate;
3619  st->start_time = ts->cur_pcr;
3620  av_log(ts->stream, AV_LOG_TRACE, "start=%0.3f pcr=%0.3f incr=%"PRId64"\n",
3621  st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
3622  }
3623 
3624  seek_back(s, pb, pos);
3625  return 0;
3626 }
3627 
3628 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
3629 
3631 {
3632  MpegTSContext *ts = s->priv_data;
3633  int ret, i;
3634  int64_t pcr_h, next_pcr_h, pos;
3635  int pcr_l, next_pcr_l;
3636  uint8_t pcr_buf[12];
3637  const uint8_t *data;
3638 
3639  if ((ret = av_new_packet(pkt, TS_PACKET_SIZE)) < 0)
3640  return ret;
3642  pkt->pos = avio_tell(s->pb);
3643  if (ret < 0) {
3644  return ret;
3645  }
3646  if (data != pkt->data)
3647  memcpy(pkt->data, data, TS_PACKET_SIZE);
3649  if (ts->mpeg2ts_compute_pcr) {
3650  /* compute exact PCR for each packet */
3651  if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
3652  /* we read the next PCR (XXX: optimize it by using a bigger buffer */
3653  pos = avio_tell(s->pb);
3654  for (i = 0; i < MAX_PACKET_READAHEAD; i++) {
3655  avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
3656  avio_read(s->pb, pcr_buf, 12);
3657  if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
3658  /* XXX: not precise enough */
3659  ts->pcr_incr =
3660  ((next_pcr_h - pcr_h) * SYSTEM_CLOCK_FREQUENCY_DIVISOR + (next_pcr_l - pcr_l)) /
3661  (i + 1);
3662  break;
3663  }
3664  }
3665  avio_seek(s->pb, pos, SEEK_SET);
3666  /* no next PCR found: we use previous increment */
3667  ts->cur_pcr = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3668  }
3669  pkt->pts = ts->cur_pcr;
3670  pkt->duration = ts->pcr_incr;
3671  ts->cur_pcr += ts->pcr_incr;
3672  }
3673  pkt->stream_index = 0;
3674  return 0;
3675 }
3676 
3678 {
3679  MpegTSContext *ts = s->priv_data;
3680  int ret, i;
3681 
3682  pkt->size = -1;
3683  ts->pkt = pkt;
3684  ret = handle_packets(ts, 0);
3685  if (ret < 0) {
3686  av_packet_unref(ts->pkt);
3687  /* flush pes data left */
3688  for (i = 0; i < NB_PID_MAX; i++)
3689  if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
3690  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3691  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
3692  ret = new_pes_packet(pes, pkt);
3693  if (ret < 0)
3694  return ret;
3695  pes->state = MPEGTS_SKIP;
3696  ret = 0;
3697  break;
3698  }
3699  }
3700  }
3701 
3702  if (!ret && pkt->size < 0)
3704  return ret;
3705 }
3706 
3707 static void mpegts_free(MpegTSContext *ts)
3708 {
3709  int i;
3710 
3711  clear_programs(ts);
3712 
3713  for (i = 0; i < FF_ARRAY_ELEMS(ts->pools); i++)
3714  av_buffer_pool_uninit(&ts->pools[i]);
3715 
3716  for (i = 0; i < NB_PID_MAX; i++)
3717  if (ts->pids[i])
3718  mpegts_close_filter(ts, ts->pids[i]);
3719 }
3720 
3722 {
3723  MpegTSContext *ts = s->priv_data;
3724  mpegts_free(ts);
3725  return 0;
3726 }
3727 
3729  int64_t *ppos, int64_t pos_limit)
3730 {
3731  MpegTSContext *ts = s->priv_data;
3732  int64_t pos, timestamp;
3733  uint8_t buf[TS_PACKET_SIZE];
3734  int pcr_l, pcr_pid =
3735  ((PESContext *)s->streams[stream_index]->priv_data)->pcr_pid;
3736  int pos47 = ts->pos47_full % ts->raw_packet_size;
3737  pos =
3738  ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) *
3739  ts->raw_packet_size + pos47;
3740  while(pos < pos_limit) {
3741  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3742  return AV_NOPTS_VALUE;
3743  if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
3744  return AV_NOPTS_VALUE;
3745  if (buf[0] != SYNC_BYTE) {
3746  if (mpegts_resync(s, TS_PACKET_SIZE, buf) < 0)
3747  return AV_NOPTS_VALUE;
3748  pos = avio_tell(s->pb);
3749  continue;
3750  }
3751  if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
3752  parse_pcr(&timestamp, &pcr_l, buf) == 0) {
3753  *ppos = pos;
3754  return timestamp;
3755  }
3756  pos += ts->raw_packet_size;
3757  }
3758 
3759  return AV_NOPTS_VALUE;
3760 }
3761 
3762 static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
3763  int64_t *ppos, int64_t pos_limit)
3764 {
3765  MpegTSContext *ts = s->priv_data;
3766  AVPacket *pkt;
3767  int64_t pos;
3768  int pos47 = ts->pos47_full % ts->raw_packet_size;
3769  pos = ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
3771  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3772  return AV_NOPTS_VALUE;
3773  pkt = av_packet_alloc();
3774  if (!pkt)
3775  return AV_NOPTS_VALUE;
3776  while(pos < pos_limit) {
3777  int ret = av_read_frame(s, pkt);
3778  if (ret < 0) {
3779  av_packet_free(&pkt);
3780  return AV_NOPTS_VALUE;
3781  }
3782  if (pkt->dts != AV_NOPTS_VALUE && pkt->pos >= 0) {
3784  av_add_index_entry(s->streams[pkt->stream_index], pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
3785  if (pkt->stream_index == stream_index && pkt->pos >= *ppos) {
3786  int64_t dts = pkt->dts;
3787  *ppos = pkt->pos;
3788  av_packet_free(&pkt);
3789  return dts;
3790  }
3791  }
3792  pos = pkt->pos;
3794  }
3795 
3796  av_packet_free(&pkt);
3797  return AV_NOPTS_VALUE;
3798 }
3799 
3800 /**************************************************************/
3801 /* parsing functions - called from other demuxers such as RTP */
3802 
3804 {
3805  MpegTSContext *ts;
3806 
3807  ts = av_mallocz(sizeof(MpegTSContext));
3808  if (!ts)
3809  return NULL;
3810  /* no stream case, currently used by RTP */
3812  ts->max_packet_size = 2048000;
3813  ts->stream = s;
3814  ts->auto_guess = 1;
3815 
3819 
3820  return ts;
3821 }
3822 
3823 /* return the consumed length if a packet was output, or -1 if no
3824  * packet is output */
3826  const uint8_t *buf, int len)
3827 {
3828  int len1;
3829 
3830  len1 = len;
3831  ts->pkt = pkt;
3832  for (;;) {
3833  ts->stop_parse = 0;
3834  if (len < TS_PACKET_SIZE)
3835  return AVERROR_INVALIDDATA;
3836  if (buf[0] != SYNC_BYTE) {
3837  buf++;
3838  len--;
3839  } else {
3840  handle_packet(ts, buf, len1 - len + TS_PACKET_SIZE);
3841  buf += TS_PACKET_SIZE;
3842  len -= TS_PACKET_SIZE;
3843  if (ts->stop_parse == 1)
3844  break;
3845  }
3846  }
3847  return len1 - len;
3848 }
3849 
3851 {
3852  mpegts_free(ts);
3853  av_free(ts);
3854 }
3855 
3857  .p.name = "mpegts",
3858  .p.long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
3859  .p.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
3860  .p.priv_class = &mpegts_class,
3861  .priv_data_size = sizeof(MpegTSContext),
3867  .flags_internal = FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE,
3868 };
3869 
3871  .p.name = "mpegtsraw",
3872  .p.long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
3873  .p.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
3874  .p.priv_class = &mpegtsraw_class,
3875  .priv_data_size = sizeof(MpegTSContext),
3880  .flags_internal = FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE,
3881 };
parse_MP4DecConfigDescrTag
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1627
flags
const SwsFlags flags[]
Definition: swscale.c:85
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:936
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:434
parse_mp4_descr_arr
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1567
AVStreamGroupParamsType
AVStreamGroupParamsType
Definition: avformat.h:1127
new_pes_packet
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
Definition: mpegts.c:1057
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
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:280
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
StreamType::stream_type
uint32_t stream_type
Definition: mpegts.c:812
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:71
MP4DescrParseContext::descr_count
int descr_count
Definition: mpegts.c:1532
AVFormatContext::stream_groups
AVStreamGroup ** stream_groups
A list of all stream groups in the file.
Definition: avformat.h:1401
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:405
AVStreamGroup::id
int64_t id
Group type-specific group ID.
Definition: avformat.h:1159
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:464
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
StreamGroup::streams
AVStream * streams[MAX_STREAMS_PER_PROGRAM]
Definition: mpegts.c:126
MPEGTS_PESHEADER_FILL
@ MPEGTS_PESHEADER_FILL
Definition: mpegts.c:256
MpegTSFilter::discard
int discard
Definition: mpegts.c:105
Program::nb_streams
unsigned int nb_streams
Definition: mpegts.c:133
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
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:1526
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:363
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:53
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
AV_STREAM_GROUP_PARAMS_LCEVC
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition: avformat.h:1132
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1243
ff_mp4_read_dec_config_descr
int ff_mp4_read_dec_config_descr(void *logctx, AVStream *st, AVIOContext *pb)
Definition: isom.c:329
out
static 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:2721
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
MpegTSFilter::pid
int pid
Definition: mpegts.c:101
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:675
STREAM_TYPE_VIDEO_VC1
#define STREAM_TYPE_VIDEO_VC1
Definition: mpegts.h:154
STREAM_TYPE_PRIVATE_DATA
#define STREAM_TYPE_PRIVATE_DATA
Definition: mpeg.h:54
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:192
PESContext::flags
int flags
copied to the AVPacket flags
Definition: mpegts.c:277
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:772
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:3825
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:3921
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:818
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:213
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:450
STREAM_ID_EMM_STREAM
#define STREAM_ID_EMM_STREAM
Definition: mpegts.h:192
av_dict_count
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
Definition: dict.c:37
detect_bdmv_dovi_group
static void detect_bdmv_dovi_group(MpegTSContext *ts, struct Program *prg, uint32_t prog_reg_desc)
Definition: mpegts.c:2613
mpegts_close_filter
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
Definition: mpegts.c:578
STREAM_ID_PADDING_STREAM
#define STREAM_ID_PADDING_STREAM
Definition: mpegts.h:187
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:185
SLConfigDescr::au_seq_num_len
int au_seq_num_len
Definition: mpegts.h:260
Program::pmt_found
int pmt_found
have we found pmt for this program
Definition: mpegts.c:139
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
PESContext::dts
int64_t dts
Definition: mpegts.c:282
METADATA_types
static const StreamType METADATA_types[]
Definition: mpegts.c:902
MP4DescrParseContext::max_descr_count
int max_descr_count
Definition: mpegts.c:1533
Stream::stream_identifier
int stream_identifier
Definition: mpegts.c:115
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
id3v2.h
MpegTSContext::skip_changes
int skip_changes
Definition: mpegts.c:171
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:1382
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
mpegts_find_stream_type
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
Definition: mpegts.c:918
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:152
AVPacket::data
uint8_t * data
Definition: packet.h:603
AV_CODEC_ID_DVB_TELETEXT
@ AV_CODEC_ID_DVB_TELETEXT
Definition: codec_id.h:580
clear_avprogram
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:305
CHECK_BLOCK
#define CHECK_BLOCK
AVOption
AVOption.
Definition: opt.h:429
NULL_PID
#define NULL_PID
Definition: mpegts.h:70
MpegTSSectionFilter
Definition: mpegts.c:87
MPEGTS_SECTION
@ MPEGTS_SECTION
Definition: mpegts.c:69
getstr8
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:714
MpegTSSectionFilter::section_h_size
int section_h_size
Definition: mpegts.c:89
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:109
HLS_SAMPLE_ENC_types
static const StreamType HLS_SAMPLE_ENC_types[]
Definition: mpegts.c:875
MpegTSState
MpegTSState
Definition: mpegts.c:253
MP4SLDescrTag
#define MP4SLDescrTag
Definition: isom.h:407
DVB_EXTENSION_DESCRIPTOR
#define DVB_EXTENSION_DESCRIPTOR
Definition: mpegts.h:227
AVCodecParameters::framerate
AVRational framerate
Number of frames per second, for streams with constant frame durations.
Definition: codec_par.h:175
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
MP4DescrParseContext::s
AVFormatContext * s
Definition: mpegts.c:1528
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
nb_streams
static unsigned int nb_streams
Definition: ffprobe.c:352
buffer_pool_get
static AVBufferRef * buffer_pool_get(MpegTSContext *ts, int size)
Definition: mpegts.c:1198
PES_HEADER_SIZE
#define PES_HEADER_SIZE
Definition: mpegts.c:263
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1512
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:621
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:61
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:236
AVDictionary
Definition: dict.c:32
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
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
SetServiceCallback
void SetServiceCallback(void *opaque, int ret)
Definition: mpegts.c:85
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1588
AV_PROFILE_ARIB_PROFILE_C
#define AV_PROFILE_ARIB_PROFILE_C
Definition: defs.h:192
Stream::idx
int idx
Definition: mpegts.c:114
AV_CODEC_ID_HDMV_PGS_SUBTITLE
@ AV_CODEC_ID_HDMV_PGS_SUBTITLE
Definition: codec_id.h:579
ff_read_frame_flush
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
Definition: seek.c:716
add_pid_to_program
static void add_pid_to_program(struct Program *p, unsigned int pid)
Definition: mpegts.c:353
PESContext::pts
int64_t pts
Definition: mpegts.c:282
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:505
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:517
STREAM_TYPE_VIDEO_JPEGXS
#define STREAM_TYPE_VIDEO_JPEGXS
Definition: mpegts.h:148
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:74
MpegTSContext::nb_prg
unsigned int nb_prg
structure to keep track of Program->pids mapping
Definition: mpegts.c:187
MpegTSPESFilter::pes_cb
PESCallback * pes_cb
Definition: mpegts.c:79
ENHANCED_AC3_DESCRIPTOR
#define ENHANCED_AC3_DESCRIPTOR
Definition: mpegts.h:225
Program::streams
struct Stream streams[MAX_STREAMS_PER_PROGRAM]
Definition: mpegts.c:134
AV_CODEC_ID_BIN_DATA
@ AV_CODEC_ID_BIN_DATA
Definition: codec_id.h:614
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:268
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:609
SectionHeader::id
uint16_t id
Definition: mpegts.c:668
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:253
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:383
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:190
MpegTSFilter::u
union MpegTSFilter::@494 u
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:464
PROBE_PACKET_MAX_BUF
#define PROBE_PACKET_MAX_BUF
Definition: mpegts.c:64
mpegtsraw_class
static const AVClass mpegtsraw_class
Definition: mpegts.c:244
AV_PROFILE_ARIB_PROFILE_A
#define AV_PROFILE_ARIB_PROFILE_A
Definition: defs.h:191
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:214
PESContext::state
enum MpegTSState state
Definition: mpegts.c:274
MpegTSFilter::pes_filter
MpegTSPESFilter pes_filter
Definition: mpegts.c:108
STREAM_TYPE_HLS_SE_AUDIO_AC3
#define STREAM_TYPE_HLS_SE_AUDIO_AC3
Definition: mpegts.h:180
METADATA_DESCRIPTOR
#define METADATA_DESCRIPTOR
Definition: mpegts.h:206
SLConfigDescr::inst_bitrate_len
int inst_bitrate_len
Definition: mpegts.h:258
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:902
REGISTRATION_DESCRIPTOR
#define REGISTRATION_DESCRIPTOR
Definition: mpegts.h:201
mpegts_read_close
static int mpegts_read_close(AVFormatContext *s)
Definition: mpegts.c:3721
mpegts_raw_read_packet
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3630
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:2528
update_av_program_info
static void update_av_program_info(AVFormatContext *s, unsigned int programid, unsigned int pid, int version)
Definition: mpegts.c:369
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:362
MP4ODescrTag
#define MP4ODescrTag
Definition: isom.h:402
PESCallback
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
Definition: mpegts.c:75
VIDEO_STREAM_DESCRIPTOR
#define VIDEO_STREAM_DESCRIPTOR
Definition: mpegts.h:200
STREAM_TYPE_VIDEO_AVS2
#define STREAM_TYPE_VIDEO_AVS2
Definition: mpegts.h:152
STREAM_TYPE_VIDEO_AVS3
#define STREAM_TYPE_VIDEO_AVS3
Definition: mpegts.h:153
STREAM_ID_DSMCC_STREAM
#define STREAM_ID_DSMCC_STREAM
Definition: mpegts.h:193
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:2947
GetBitContext
Definition: get_bits.h:109
Program::nb_pids
unsigned int nb_pids
Definition: mpegts.c:131
AVDOVIDecoderConfigurationRecord::dv_md_compression
uint8_t dv_md_compression
Definition: dovi_meta.h:64
SLConfigDescr::use_padding
int use_padding
Definition: mpegts.h:251
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:1738
AVProgram::discard
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:1241
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:173
AV_DISPOSITION_STILL_IMAGE
#define AV_DISPOSITION_STILL_IMAGE
The video stream contains still images.
Definition: avformat.h:712
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
M2TS_VIDEO_EL_PID
#define M2TS_VIDEO_EL_PID
Definition: mpegts.h:76
SectionHeader::last_sec_num
uint8_t last_sec_num
Definition: mpegts.c:672
val
static double val(void *priv, double ch)
Definition: aeval.c:77
EIT_TID
#define EIT_TID
Definition: mpegts.h:100
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:403
STREAM_TYPE_HLS_SE_AUDIO_EAC3
#define STREAM_TYPE_HLS_SE_AUDIO_EAC3
Definition: mpegts.h:181
PESContext::sl
SLConfigDescr sl
Definition: mpegts.c:286
StreamGroup::id
int id
Definition: mpegts.c:123
SLConfigDescr::use_rand_acc_pt
int use_rand_acc_pt
Definition: mpegts.h:250
SDT_PID
#define SDT_PID
Definition: mpegts.h:47
av_new_program
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition: avformat.c:278
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:462
AV_STREAM_GROUP_PARAMS_DOLBY_VISION
@ AV_STREAM_GROUP_PARAMS_DOLBY_VISION
Definition: avformat.h:1134
STREAM_TYPE_VIDEO_JPEG2000
#define STREAM_TYPE_VIDEO_JPEG2000
Definition: mpegts.h:146
AVRational::num
int num
Numerator.
Definition: rational.h:59
PESContext::stream
AVFormatContext * stream
Definition: mpegts.c:271
av_unused
#define av_unused
Definition: attributes.h:164
SLConfigDescr::timestamp_len
int timestamp_len
Definition: mpegts.h:255
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:195
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:574
PESContext::sub_st
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
Definition: mpegts.c:273
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:670
MpegTSContext::merge_pmt_versions
int merge_pmt_versions
Definition: mpegts.c:178
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:191
AV_DISPOSITION_CLEAN_EFFECTS
#define AV_DISPOSITION_CLEAN_EFFECTS
The audio stream contains music and sound effects without voice.
Definition: avformat.h:665
PESContext::header
uint8_t header[MAX_PES_HEADER_SIZE]
Definition: mpegts.c:284
SUBTITLING_DESCRIPTOR
#define SUBTITLING_DESCRIPTOR
Definition: mpegts.h:223
avassert.h
MPEGTS_OPTIONS
#define MPEGTS_OPTIONS
Definition: mpegts.c:199
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:764
MpegTSContext::pos47_full
int64_t pos47_full
Definition: mpegts.c:149
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
avpriv_mpegts_parse_close
void avpriv_mpegts_parse_close(MpegTSContext *ts)
Definition: mpegts.c:3850
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
MpegTSContext::id
int id
Definition: mpegts.c:181
STREAM_TYPE_BLURAY_AUDIO_AC3
#define STREAM_TYPE_BLURAY_AUDIO_AC3
Definition: mpegts.h:159
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
StreamType::codec_id
enum AVCodecID codec_id
Definition: mpegts.c:814
PESContext
Definition: mpegts.c:266
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:659
DTS_DESCRIPTOR
#define DTS_DESCRIPTOR
Definition: mpegts.h:226
Mp4Descr::sl
SLConfigDescr sl
Definition: mpegts.h:268
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:1865
AVStreamGroup::params
union AVStreamGroup::@448 params
Group type-specific parameters.
ID3v2ExtraMeta
Definition: id3v2.h:84
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[]
Definition: vf_colorspace.c:178
AVFormatContext::ctx_flags
int ctx_flags
Flags signalling stream properties.
Definition: avformat.h:1363
create_stream_groups
static void create_stream_groups(MpegTSContext *ts, struct Program *prg)
Definition: mpegts.c:2655
AVProgram::id
int id
Definition: avformat.h:1239
MpegTSContext::pools
AVBufferPool * pools[32]
Definition: mpegts.c:196
parse_pcr
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
Definition: mpegts.c:3494
AV_CODEC_ID_S302M
@ AV_CODEC_ID_S302M
Definition: codec_id.h:365
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:145
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:624
STREAM_TYPE_VIDEO_MPEG4
#define STREAM_TYPE_VIDEO_MPEG4
Definition: mpeg.h:56
attributes_internal.h
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:98
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:3728
mpegts_class
static const AVClass mpegts_class
Definition: mpegts.c:229
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1511
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:551
TELETEXT_DESCRIPTOR
#define TELETEXT_DESCRIPTOR
Definition: mpegts.h:222
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
STUFFING_BYTE
#define STUFFING_BYTE
Definition: mpegts.h:37
AVCodecParameters::width
int width
The width of the video frame in pixels.
Definition: codec_par.h:143
STREAM_TYPE_SCTE_DATA_SCTE_35
#define STREAM_TYPE_SCTE_DATA_SCTE_35
Definition: mpegts.h:170
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:136
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:494
bits
uint8_t bits
Definition: vp3data.h:128
SLConfigDescr::degr_prior_len
int degr_prior_len
Definition: mpegts.h:259
STREAM_TYPE_BLURAY_AUDIO_TRUEHD
#define STREAM_TYPE_BLURAY_AUDIO_TRUEHD
Definition: mpegts.h:161
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
SYNC_BYTE
#define SYNC_BYTE
Definition: mpegts.h:36
ff_mpegtsraw_demuxer
const FFInputFormat ff_mpegtsraw_demuxer
Definition: mpegts.c:3870
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
mpegts_open_filter
static MpegTSFilter * mpegts_open_filter(MpegTSContext *ts, unsigned int pid, enum MpegTSFilterType type)
Definition: mpegts.c:507
AVDOVIDecoderConfigurationRecord::dv_profile
uint8_t dv_profile
Definition: dovi_meta.h:58
PES_START_SIZE
#define PES_START_SIZE
Definition: mpegts.c:262
MpegTSContext::resync_size
int resync_size
Definition: mpegts.c:177
channels
channels
Definition: aptx.h:31
get_bits.h
SectionHeader::sec_num
uint8_t sec_num
Definition: mpegts.c:671
STREAM_ID_TYPE_E_STREAM
#define STREAM_ID_TYPE_E_STREAM
Definition: mpegts.h:194
PESContext::stream_type
int stream_type
Definition: mpegts.c:269
parse_MP4IODescrTag
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1578
PMT_TID
#define PMT_TID
Definition: mpegts.h:86
skip_identical
static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf)
Definition: mpegts.c:675
opus_stream_cnt
static const uint8_t opus_stream_cnt[9]
Definition: mpegts.c:1869
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:88
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:202
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
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:258
AVStreamGroup::layered_video
struct AVStreamGroupLayeredVideo * layered_video
Definition: avformat.h:1176
EXTERN
#define EXTERN
Definition: attributes_internal.h:34
AV_PIX_FMT_YUV444P10LE
@ AV_PIX_FMT_YUV444P10LE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition: pixfmt.h:162
MpegTSPESFilter::opaque
void * opaque
Definition: mpegts.c:80
get8
static int get8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:686
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:399
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:598
if
if(ret)
Definition: filter_design.txt:179
MpegTSContext::cur_pcr
int64_t cur_pcr
used to estimate the exact PCR
Definition: mpegts.c:160
clear_programs
static void clear_programs(MpegTSContext *ts)
Definition: mpegts.c:331
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:314
MP4ESDescrTag
#define MP4ESDescrTag
Definition: isom.h:404
AV_CODEC_ID_AVS3
@ AV_CODEC_ID_AVS3
Definition: codec_id.h:250
MP4DescrParseContext::active_descr
Mp4Descr * active_descr
Definition: mpegts.c:1531
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1314
FMC_DESCRIPTOR
#define FMC_DESCRIPTOR
Definition: mpegts.h:205
internal.h
MpegTSContext::pcr_incr
int64_t pcr_incr
used to estimate the exact PCR
Definition: mpegts.c:161
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:586
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:770
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
M2TS_VIDEO_PID
#define M2TS_VIDEO_PID
Definition: mpegts.h:75
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
STREAM_TYPE_ATSC_AUDIO_AC3
#define STREAM_TYPE_ATSC_AUDIO_AC3
Definition: mpegts.h:172
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:339
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:254
MpegTSSectionFilter::crc
unsigned crc
Definition: mpegts.c:91
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:165
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1265
isom.h
AV_CODEC_ID_TIMED_ID3
@ AV_CODEC_ID_TIMED_ID3
Definition: codec_id.h:613
MpegTSContext::current_pid
int current_pid
Definition: mpegts.c:193
MpegTSSectionFilter::section_index
int section_index
Definition: mpegts.c:88
MpegTSContext::last_pos
int64_t last_pos
to detect seek
Definition: mpegts.c:169
Mp4Descr::es_id
int es_id
Definition: mpegts.h:265
MpegTSFilter::es_id
int es_id
Definition: mpegts.c:102
av_unreachable
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition: avassert.h:116
MPEGTS_PESHEADER
@ MPEGTS_PESHEADER
Definition: mpegts.c:255
DESC_types
static const StreamType DESC_types[]
Definition: mpegts.c:909
PESContext::extended_stream_id
int extended_stream_id
Definition: mpegts.c:280
Mp4Descr::dec_config_descr_len
int dec_config_descr_len
Definition: mpegts.h:266
STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
#define STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
Definition: mpegts.h:165
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
MpegTSSectionFilter::section_buf
uint8_t * section_buf
Definition: mpegts.c:93
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
eit_cb
static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:3038
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:106
mpegts_open_pcr_filter
static MpegTSFilter * mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
Definition: mpegts.c:573
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:452
SectionHeader::version
uint8_t version
Definition: mpegts.c:669
options
Definition: swscale.c:50
seek_back
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos)
Definition: mpegts.c:3520
SLConfigDescr::ocr_len
int ocr_len
Definition: mpegts.h:256
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:827
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:622
add_pes_stream
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
Definition: mpegts.c:1502
MpegTSFilterType
MpegTSFilterType
Definition: mpegts.c:67
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
JXS_VIDEO_DESCRIPTOR
#define JXS_VIDEO_DESCRIPTOR
Definition: mpegts.h:212
StreamGroup::dep_pid
int dep_pid
Definition: mpegts.c:124
StreamType
Definition: mpegts.c:811
STREAM_TYPE_HLS_SE_VIDEO_H264
#define STREAM_TYPE_HLS_SE_VIDEO_H264
Definition: mpegts.h:178
Program::stream_groups
struct StreamGroup stream_groups[MAX_STREAMS_PER_PROGRAM]
Definition: mpegts.c:136
AV_CODEC_ID_SMPTE_KLV
@ AV_CODEC_ID_SMPTE_KLV
Definition: codec_id.h:611
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:530
SLConfigDescr::packet_seq_num_len
int packet_seq_num_len
Definition: mpegts.h:261
LCEVC_LINKAGE_DESCRIPTOR
#define LCEVC_LINKAGE_DESCRIPTOR
Definition: mpegts.h:214
EXTENSION_DESCRIPTOR
#define EXTENSION_DESCRIPTOR
Definition: mpegts.h:208
mpegts_open_pes_filter
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
Definition: mpegts.c:557
PESContext::ts
MpegTSContext * ts
Definition: mpegts.c:270
STREAM_TYPE_VIDEO_MVC
#define STREAM_TYPE_VIDEO_MVC
Definition: mpegts.h:145
OEITS_END_TID
#define OEITS_END_TID
Definition: mpegts.h:105
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:1538
MAX_PES_HEADER_SIZE
#define MAX_PES_HEADER_SIZE
Definition: mpegts.c:264
MAX_PACKET_READAHEAD
#define MAX_PACKET_READAHEAD
Definition: mpegts.c:3628
AVSTREAM_EVENT_FLAG_METADATA_UPDATED
#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED
Definition: avformat.h:865
MAX_PIDS_PER_PROGRAM
#define MAX_PIDS_PER_PROGRAM
Definition: mpegts.c:119
MpegTSSectionFilter::end_of_section_reached
unsigned int end_of_section_reached
Definition: mpegts.c:95
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:1591
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:1211
SLConfigDescr::use_au_start
int use_au_start
Definition: mpegts.h:248
new_data_packet
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
Definition: mpegts.c:1026
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:501
avformat_stream_group_add_stream
int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st)
Add an already allocated stream to a stream group.
Definition: options.c:560
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:75
SDT_TID
#define SDT_TID
Definition: mpegts.h:92
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1370
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:463
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
SCTE_types
static const StreamType SCTE_types[]
Definition: mpegts.c:861
MPEGTS_PES
@ MPEGTS_PES
Definition: mpegts.c:68
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
ff_mpegts_demuxer
const EXTERN FFInputFormat ff_mpegts_demuxer
Definition: mpegts.c:290
AVMediaType
AVMediaType
Definition: avutil.h:198
MP4DescrParseContext::descr
Mp4Descr * descr
Definition: mpegts.c:1530
AVPacket::size
int size
Definition: packet.h:604
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:179
STREAM_TYPE_VIDEO_HEVC
#define STREAM_TYPE_VIDEO_HEVC
Definition: mpeg.h:58
FFStream
Definition: internal.h:128
SectionHeader::tid
uint8_t tid
Definition: mpegts.c:667
reset_pes_packet_state
static void reset_pes_packet_state(PESContext *pes)
Definition: mpegts.c:1017
AV_PIX_FMT_YUV422P10LE
@ AV_PIX_FMT_YUV422P10LE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition: pixfmt.h:158
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
AV_CODEC_ID_DTS
@ AV_CODEC_ID_DTS
Definition: codec_id.h:465
Program
Definition: mpegts.c:129
MpegTSContext
Definition: mpegts.c:142
MpegTSFilter
Definition: mpegts.c:100
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
ID3v2_DEFAULT_MAGIC
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
Definition: id3v2.h:35
MPEGTS_PAYLOAD
@ MPEGTS_PAYLOAD
Definition: mpegts.c:257
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
MpegTSContext::raw_packet_size
int raw_packet_size
raw packet size, including FEC if present
Definition: mpegts.c:147
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:3386
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.
STREAM_ID_PRIVATE_STREAM_2
#define STREAM_ID_PRIVATE_STREAM_2
Definition: mpegts.h:188
SLConfigDescr::use_au_end
int use_au_end
Definition: mpegts.h:249
MpegTSSectionFilter::check_crc
unsigned int check_crc
Definition: mpegts.c:94
MpegTSContext::skip_clear
int skip_clear
Definition: mpegts.c:172
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:135
mpegts_get_dts
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:3762
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:521
mpegts_read_packet
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3677
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:356
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
parse_MP4ESDescrTag
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1605
STREAM_IDENTIFIER_DESCRIPTOR
#define STREAM_IDENTIFIER_DESCRIPTOR
Definition: mpegts.h:221
buffer.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:657
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:602
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:144
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
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:1026
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:389
SectionCallback
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
Definition: mpegts.c:83
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:689
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:267
AV_CODEC_ID_LCEVC
@ AV_CODEC_ID_LCEVC
Definition: codec_id.h:616
PESContext::pid
int pid
Definition: mpegts.c:267
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:609
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:63
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:574
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:622
version
version
Definition: libkvazaar.c:313
FFStream::probe_packets
int probe_packets
Number of packets to buffer for codec probing.
Definition: internal.h:311
handle_packet
static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
Definition: mpegts.c:3182
STREAM_TYPE_AUDIO_AAC_LATM
#define STREAM_TYPE_AUDIO_AAC_LATM
Definition: mpegts.h:132
DATA_COMPONENT_DESCRIPTOR
#define DATA_COMPONENT_DESCRIPTOR
Definition: mpegts.h:238
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
update_offsets
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
Definition: mpegts.c:1557
AV_CODEC_ID_JPEGXS
@ AV_CODEC_ID_JPEGXS
Definition: codec_id.h:334
get_bits64
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:456
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:2590
LCEVC_VIDEO_DESCRIPTOR
#define LCEVC_VIDEO_DESCRIPTOR
Definition: mpegts.h:213
STREAM_TYPE_VIDEO_DIRAC
#define STREAM_TYPE_VIDEO_DIRAC
Definition: mpegts.h:155
SectionHeader
Definition: mpegts.c:666
ISO_639_LANGUAGE_DESCRIPTOR
#define ISO_639_LANGUAGE_DESCRIPTOR
Definition: mpegts.h:202
StreamGroup
Definition: mpegts.c:121
MP4DescrParseContext::pb
FFIOContext pb
Definition: mpegts.c:1529
log.h
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:596
avio_internal.h
IOD_DESCRIPTOR
#define IOD_DESCRIPTOR
Definition: mpegts.h:203
parse_stream_identifier_desc
static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
Definition: mpegts.c:2554
MAX_MP4_DESCR_COUNT
#define MAX_MP4_DESCR_COUNT
Definition: mpegts.c:55
PESContext::data_index
int data_index
Definition: mpegts.c:276
AV_CODEC_ID_SMPTE_2038
@ AV_CODEC_ID_SMPTE_2038
Definition: codec_id.h:615
internal.h
get_program
static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:292
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
STREAM_TYPE_BLURAY_SUBTITLE_TEXT
#define STREAM_TYPE_BLURAY_SUBTITLE_TEXT
Definition: mpegts.h:168
PAT_TID
#define PAT_TID
Definition: mpegts.h:84
MpegTSContext::pids
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
Definition: mpegts.c:192
PESContext::pes_header_size
int pes_header_size
Definition: mpegts.c:279
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:699
parse_section_header
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:781
ff_id3v2_read_dict
void ff_id3v2_read_dict(AVIOContext *pb, AVDictionary **metadata, const char *magic, ID3v2ExtraMeta **extra_meta)
Read an ID3v2 tag into specified dictionary and retrieve supported extra metadata.
Definition: id3v2.c:1166
AV_FIELD_BB
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition: defs.h:215
MpegTSContext::epg_stream
AVStream * epg_stream
Definition: mpegts.c:195
AV_CODEC_ID_EPG
@ AV_CODEC_ID_EPG
Definition: codec_id.h:606
AVStreamGroupLayeredVideo::width
int width
Width of the final stream for presentation.
Definition: avformat.h:1095
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
mpegts_resync
static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
Definition: mpegts.c:3312
MpegTSContext::crc_validity
int8_t crc_validity[NB_PID_MAX]
Definition: mpegts.c:190
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
PESContext::st
AVStream * st
Definition: mpegts.c:272
STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
#define STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
Definition: mpegts.h:164
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:1238
handle_packets
static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
Definition: mpegts.c:3398
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:122
demux.h
MpegTSContext::prg
struct Program * prg
Definition: mpegts.c:188
AV_DISPOSITION_DEPENDENT
#define AV_DISPOSITION_DEPENDENT
The stream is intended to be mixed with another stream before presentation.
Definition: avformat.h:708
AVCodecParameters::color_range
enum AVColorRange color_range
Additional colorspace characteristics.
Definition: codec_par.h:189
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:163
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
MpegTSPESFilter
Definition: mpegts.c:78
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:83
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
SERVICE_DESCRIPTOR
#define SERVICE_DESCRIPTOR
Definition: mpegts.h:220
AVCodecParameters::field_order
enum AVFieldOrder field_order
The order of the fields in interlaced video.
Definition: codec_par.h:182
SLConfigDescr::au_len
int au_len
Definition: mpegts.h:257
check_crc
static void check_crc(const AVCRC *table_new, const char *name, unsigned idx)
Definition: crc.c:37
MpegTSFilter::last_pcr
int64_t last_pcr
Definition: mpegts.c:104
STREAM_TYPE_PRIVATE_SECTION
#define STREAM_TYPE_PRIVATE_SECTION
Definition: mpeg.h:53
MpegTSSectionFilter::last_crc
unsigned last_crc
Definition: mpegts.c:92
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:166
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:816
mid_pred
#define mid_pred
Definition: mathops.h:115
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:661
MP4DescrParseContext
Definition: mpegts.c:1527
SUPPLEMENTARY_AUDIO_DESCRIPTOR
#define SUPPLEMENTARY_AUDIO_DESCRIPTOR
Definition: mpegts.h:231
tag
uint32_t tag
Definition: movenc.c:2054
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:759
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:747
MpegTSSectionFilter::last_ver
int last_ver
Definition: mpegts.c:90
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
AVStreamGroupLayeredVideo::height
int height
Height of the final image for presentation.
Definition: avformat.h:1099
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:81
Mp4Descr::dec_config_descr
uint8_t * dec_config_descr
Definition: mpegts.h:267
SLConfigDescr::use_timestamps
int use_timestamps
Definition: mpegts.h:252
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:749
AC4_DESCRIPTOR
#define AC4_DESCRIPTOR
Definition: mpegts.h:232
STREAM_TYPE_BLURAY_AUDIO_EAC3
#define STREAM_TYPE_BLURAY_AUDIO_EAC3
Definition: mpegts.h:162
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:1756
scte_data_cb
static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1836
AC3_DESCRIPTOR
#define AC3_DESCRIPTOR
Definition: mpegts.h:224
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:179
m4sl_cb
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1772
dict.h
AV_DISPOSITION_DESCRIPTIONS
#define AV_DISPOSITION_DESCRIPTIONS
The subtitle stream contains a textual description of the video content.
Definition: avformat.h:697
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
U
#define U(x)
Definition: vpx_arith.h:37
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:158
M4OD_TID
#define M4OD_TID
Definition: mpegts.h:89
AVStreamGroup
Definition: avformat.h:1140
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:753
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:3451
PESContext::PES_packet_length
int PES_packet_length
Definition: mpegts.c:278
AVStreamGroup::nb_streams
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
Definition: avformat.h:1202
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:320
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:231
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:421
AVRational::den
int den
Denominator.
Definition: rational.h:60
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:204
ff_remove_stream_group
void ff_remove_stream_group(AVFormatContext *s, AVStreamGroup *stg)
Remove a stream group from its AVFormatContext and free it.
Definition: avformat.c:129
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:615
STREAM_TYPE_VIDEO_CAVS
#define STREAM_TYPE_VIDEO_CAVS
Definition: mpeg.h:60
PESContext::stream_id
uint8_t stream_id
Definition: mpegts.c:281
parse_MP4SLDescrTag
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1641
avpriv_mpegts_parse_open
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
Definition: mpegts.c:3803
PESContext::buffer
AVBufferRef * buffer
Definition: mpegts.c:285
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:3707
HDMV_types
static const StreamType HDMV_types[]
Definition: mpegts.c:845
AVDOVIDecoderConfigurationRecord::el_present_flag
uint8_t el_present_flag
Definition: dovi_meta.h:61
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVPacket::stream_index
int stream_index
Definition: packet.h:605
AVPROBE_SCORE_STREAM_RETRY
#define AVPROBE_SCORE_STREAM_RETRY
Definition: avformat.h:460
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:321
SLConfigDescr::timestamp_res
int timestamp_res
Definition: mpegts.h:254
ISO_types
static const StreamType ISO_types[]
Definition: mpegts.c:817
StreamGroup::type
enum AVStreamGroupParamsType type
Definition: mpegts.c:122
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:200
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:1127
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:167
mpegts_read_header
static int mpegts_read_header(AVFormatContext *s)
Definition: mpegts.c:3529
AV_DOVI_COMPRESSION_NONE
@ AV_DOVI_COMPRESSION_NONE
Definition: dovi_meta.h:68
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
STREAM_TYPE_METADATA
#define STREAM_TYPE_METADATA
Definition: mpegts.h:140
AVCodecParameters::format
int format
Definition: codec_par.h:94
MPEGTS_PCR
@ MPEGTS_PCR
Definition: mpegts.c:70
STREAM_TYPE_VIDEO_LCEVC
#define STREAM_TYPE_VIDEO_LCEVC
Definition: mpegts.h:150
avformat_stream_group_create
AVStreamGroup * avformat_stream_group_create(AVFormatContext *s, enum AVStreamGroupParamsType type, AVDictionary **options)
Add a new empty stream group to a media file.
Definition: options.c:472
FFStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: internal.h:198
Program::id
unsigned int id
Definition: mpegts.c:130
STREAM_ID_ECM_STREAM
#define STREAM_ID_ECM_STREAM
Definition: mpegts.h:191
MpegTSSectionFilter::opaque
void * opaque
Definition: mpegts.c:97
AVFormatContext::nb_stream_groups
unsigned int nb_stream_groups
Number of elements in AVFormatContext.stream_groups.
Definition: avformat.h:1389
PESContext::merged_st
int merged_st
Definition: mpegts.c:287
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
TS_FEC_PACKET_SIZE
#define TS_FEC_PACKET_SIZE
Definition: mpegts.h:27
Program::nb_stream_groups
unsigned int nb_stream_groups
Definition: mpegts.c:135
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:57
MAX_STREAMS_PER_PROGRAM
#define MAX_STREAMS_PER_PROGRAM
Definition: mpegts.c:118
AVPacket
This structure stores compressed data.
Definition: packet.h:580
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:197
MpegTSFilter::last_cc
int last_cc
Definition: mpegts.c:103
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
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:86
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:247
MpegTSContext::scan_all_pmts
int scan_all_pmts
Definition: mpegts.c:175
ff_id3v2_free_extra_meta
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta)
Free memory allocated parsing special (non-text) metadata.
Definition: id3v2.c:1178
AV_CODEC_ID_AC4
@ AV_CODEC_ID_AC4
Definition: codec_id.h:564
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:623
MP4DescrParseContext::predefined_SLConfigDescriptor_seen
int predefined_SLConfigDescriptor_seen
Definition: mpegts.c:1535
FFInputFormat
Definition: demux.h:66
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
Stream
Definition: mpegts.c:113
StreamGroup::nb_streams
unsigned int nb_streams
Definition: mpegts.c:125
MP4DescrParseContext::level
int level
Definition: mpegts.c:1534
bytestream.h
FFStream::stream_identifier
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Definition: internal.h:342
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:592
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:139
MpegTSContext::skip_unknown_pmt
int skip_unknown_pmt
Definition: mpegts.c:173
raw_options
static const AVOption raw_options[]
Definition: mpegts.c:236
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:173
opus_channel_map
static const uint8_t opus_channel_map[8][8]
Definition: mpegts.c:1873
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:99
Program::pids
unsigned int pids[MAX_PIDS_PER_PROGRAM]
Definition: mpegts.c:132
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:510
ff_parse_mpeg2_descriptor
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, int prg_id, 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:2058
parse_mp4_descr
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
Definition: mpegts.c:1684
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:160
AV_CODEC_ID_HDMV_TEXT_SUBTITLE
@ AV_CODEC_ID_HDMV_TEXT_SUBTITLE
Definition: codec_id.h:596
TS_PACKET_SIZE
#define TS_PACKET_SIZE
Definition: mpegts.h:29
MpegTSSectionFilter::section_cb
SectionCallback * section_cb
Definition: mpegts.c:96
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
PROBE_PACKET_MARGIN
#define PROBE_PACKET_MARGIN
Definition: mpegts.c:65
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:1120
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:796
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
get_packet_size
static int get_packet_size(AVFormatContext *s)
Definition: mpegts.c:628
analyze
static int analyze(const uint8_t *buf, int size, int packet_size, int probe)
Definition: mpegts.c:599
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:440
timed_id3_update_metadata
static int timed_id3_update_metadata(AVStream *s, AVPacket *pkt)
Definition: mpegts.c:1033
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:3355
MpegTSContext::mpeg2ts_compute_pcr
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
Definition: mpegts.c:155
REGD_types
static const StreamType REGD_types[]
Definition: mpegts.c:883
MISC_types
static const StreamType MISC_types[]
Definition: mpegts.c:867
STREAM_TYPE_BLURAY_SUBTITLE_PGS
#define STREAM_TYPE_BLURAY_SUBTITLE_PGS
Definition: mpegts.h:167
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:337
AVStreamGroupLayeredVideo::el_index
unsigned int el_index
Index of the enhancement layer stream in AVStreamGroup.
Definition: avformat.h:1083
options
static const AVOption options[]
Definition: mpegts.c:210
ff_id3v2_parse_priv_dict
int ff_id3v2_parse_priv_dict(AVDictionary **metadata, ID3v2ExtraMeta *extra_meta)
Parse PRIV tags into a dictionary.
Definition: id3v2.c:1250
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:283
parse_mpeg2_extension_descriptor
static int parse_mpeg2_extension_descriptor(AVFormatContext *fc, AVStream *st, int prg_id, const uint8_t **pp, const uint8_t *desc_end, MpegTSContext *ts)
Definition: mpegts.c:1884
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AVProgram::pcr_pid
int pcr_pid
Definition: avformat.h:1248
FFStream::pts_wrap_reference
int64_t pts_wrap_reference
Internal data to check for wrapping of the time stamp.
Definition: internal.h:255
Mp4Descr
Definition: mpegts.h:264
SLConfigDescr
Definition: mpegts.h:247
avio_read_partial
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:687
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
sdt_cb
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:3092
MpegTSContext::fix_teletext_pts
int fix_teletext_pts
fix dvb teletext pts
Definition: mpegts.c:158
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:237
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:349
AV_CODEC_ID_SCTE_35
@ AV_CODEC_ID_SCTE_35
Contain timestamp estimated through PCR of program stream.
Definition: codec_id.h:605
StreamType::codec_type
enum AVMediaType codec_type
Definition: mpegts.c:813