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