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