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