Thanks to visit codestin.com
Credit goes to www.ffmpeg.org

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