mpegts.c
Go to the documentation of this file.
1 /*
2  * MPEG2 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 "libavutil/buffer.h"
23 #include "libavutil/crc.h"
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/log.h"
26 #include "libavutil/dict.h"
27 #include "libavutil/mathematics.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/avassert.h"
30 #include "libavcodec/bytestream.h"
31 #include "libavcodec/get_bits.h"
32 #include "avformat.h"
33 #include "mpegts.h"
34 #include "internal.h"
35 #include "avio_internal.h"
36 #include "seek.h"
37 #include "mpeg.h"
38 #include "isom.h"
39 
40 /* maximum size in which we look for synchronisation if
41  synchronisation is lost */
42 #define MAX_RESYNC_SIZE 65536
43 
44 #define MAX_PES_PAYLOAD 200*1024
45 
46 #define MAX_MP4_DESCR_COUNT 16
47 
51 };
52 
53 typedef struct MpegTSFilter MpegTSFilter;
54 
55 typedef int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos);
56 
57 typedef struct MpegTSPESFilter {
59  void *opaque;
61 
62 typedef void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len);
63 
64 typedef void SetServiceCallback(void *opaque, int ret);
65 
66 typedef struct MpegTSSectionFilter {
70  unsigned int check_crc:1;
71  unsigned int end_of_section_reached:1;
73  void *opaque;
75 
76 struct MpegTSFilter {
77  int pid;
78  int es_id;
79  int last_cc; /* last cc code (-1 if first packet) */
81  union {
84  } u;
85 };
86 
87 #define MAX_PIDS_PER_PROGRAM 64
88 struct Program {
89  unsigned int id; //program id/service id
90  unsigned int nb_pids;
91  unsigned int pids[MAX_PIDS_PER_PROGRAM];
92 };
93 
94 struct MpegTSContext {
95  const AVClass *class;
96  /* user data */
98  /** raw packet size, including FEC if present */
100 
101  int pos47;
102 
103  /** if true, all pids are analyzed to find streams */
105 
106  /** compute exact PCR for each transport stream packet */
108 
109  int64_t cur_pcr; /**< used to estimate the exact PCR */
110  int pcr_incr; /**< used to estimate the exact PCR */
111 
112  /* data needed to handle file based ts */
113  /** stop parsing loop */
115  /** packet containing Audio/Video data */
117  /** to detect seek */
118  int64_t last_pos;
119 
120  /******************************************/
121  /* private mpegts data */
122  /* scan context */
123  /** structure to keep track of Program->pids mapping */
124  unsigned int nb_prg;
125  struct Program *prg;
126 
127  int8_t crc_validity[NB_PID_MAX];
128 
129  /** filters for various streams specified by PMT + for the PAT and PMT */
132 };
133 
134 static const AVOption options[] = {
135  {"compute_pcr", "Compute exact PCR for each transport stream packet.", offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_INT,
136  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
137  { NULL },
138 };
139 
140 static const AVClass mpegtsraw_class = {
141  .class_name = "mpegtsraw demuxer",
142  .item_name = av_default_item_name,
143  .option = options,
144  .version = LIBAVUTIL_VERSION_INT,
145 };
146 
147 /* TS stream handling */
148 
155 };
156 
157 /* enough for PES header + length */
158 #define PES_START_SIZE 6
159 #define PES_HEADER_SIZE 9
160 #define MAX_PES_HEADER_SIZE (9 + 255)
161 
162 typedef struct PESContext {
163  int pid;
164  int pcr_pid; /**< if -1 then all packets containing PCR are considered */
169  AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
171  /* used to get the format */
173  int flags; /**< copied to the AVPacket flags */
177  int64_t pts, dts;
178  int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
182 } PESContext;
183 
185 
186 static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
187 {
188  AVProgram *prg = NULL;
189  int i;
190  for(i=0; i<ts->stream->nb_programs; i++)
191  if(ts->stream->programs[i]->id == programid){
192  prg = ts->stream->programs[i];
193  break;
194  }
195  if (!prg)
196  return;
197  prg->nb_stream_indexes = 0;
198 }
199 
200 static void clear_program(MpegTSContext *ts, unsigned int programid)
201 {
202  int i;
203 
204  clear_avprogram(ts, programid);
205  for(i=0; i<ts->nb_prg; i++)
206  if(ts->prg[i].id == programid)
207  ts->prg[i].nb_pids = 0;
208 }
209 
211 {
212  av_freep(&ts->prg);
213  ts->nb_prg=0;
214 }
215 
216 static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
217 {
218  struct Program *p;
219  void *tmp = av_realloc(ts->prg, (ts->nb_prg+1)*sizeof(struct Program));
220  if(!tmp)
221  return;
222  ts->prg = tmp;
223  p = &ts->prg[ts->nb_prg];
224  p->id = programid;
225  p->nb_pids = 0;
226  ts->nb_prg++;
227 }
228 
229 static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
230 {
231  int i;
232  struct Program *p = NULL;
233  for(i=0; i<ts->nb_prg; i++) {
234  if(ts->prg[i].id == programid) {
235  p = &ts->prg[i];
236  break;
237  }
238  }
239  if(!p)
240  return;
241 
242  if(p->nb_pids >= MAX_PIDS_PER_PROGRAM)
243  return;
244  p->pids[p->nb_pids++] = pid;
245 }
246 
247 static void set_pcr_pid(AVFormatContext *s, unsigned int programid, unsigned int pid)
248 {
249  int i;
250  for(i=0; i<s->nb_programs; i++) {
251  if(s->programs[i]->id == programid) {
252  s->programs[i]->pcr_pid = pid;
253  break;
254  }
255  }
256 }
257 
258 /**
259  * @brief discard_pid() decides if the pid is to be discarded according
260  * to caller's programs selection
261  * @param ts : - TS context
262  * @param pid : - pid
263  * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
264  * 0 otherwise
265  */
266 static int discard_pid(MpegTSContext *ts, unsigned int pid)
267 {
268  int i, j, k;
269  int used = 0, discarded = 0;
270  struct Program *p;
271  for(i=0; i<ts->nb_prg; i++) {
272  p = &ts->prg[i];
273  for(j=0; j<p->nb_pids; j++) {
274  if(p->pids[j] != pid)
275  continue;
276  //is program with id p->id set to be discarded?
277  for(k=0; k<ts->stream->nb_programs; k++) {
278  if(ts->stream->programs[k]->id == p->id) {
279  if(ts->stream->programs[k]->discard == AVDISCARD_ALL)
280  discarded++;
281  else
282  used++;
283  }
284  }
285  }
286  }
287 
288  return !used && discarded;
289 }
290 
291 /**
292  * Assemble PES packets out of TS packets, and then call the "section_cb"
293  * function when they are complete.
294  */
296  const uint8_t *buf, int buf_size, int is_start)
297 {
298  MpegTSContext *ts = s->priv_data;
299  MpegTSSectionFilter *tss = &tss1->u.section_filter;
300  int len;
301 
302  if (is_start) {
303  memcpy(tss->section_buf, buf, buf_size);
304  tss->section_index = buf_size;
305  tss->section_h_size = -1;
306  tss->end_of_section_reached = 0;
307  } else {
308  if (tss->end_of_section_reached)
309  return;
310  len = 4096 - tss->section_index;
311  if (buf_size < len)
312  len = buf_size;
313  memcpy(tss->section_buf + tss->section_index, buf, len);
314  tss->section_index += len;
315  }
316 
317  /* compute section length if possible */
318  if (tss->section_h_size == -1 && tss->section_index >= 3) {
319  len = (AV_RB16(tss->section_buf + 1) & 0xfff) + 3;
320  if (len > 4096)
321  return;
322  tss->section_h_size = len;
323  }
324 
325  if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) {
326  int crc_valid = 1;
327  tss->end_of_section_reached = 1;
328 
329  if (tss->check_crc){
330  crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, tss->section_buf, tss->section_h_size);
331  if (crc_valid){
332  ts->crc_validity[ tss1->pid ] = 100;
333  }else if(ts->crc_validity[ tss1->pid ] > -10){
334  ts->crc_validity[ tss1->pid ]--;
335  }else
336  crc_valid = 2;
337  }
338  if (crc_valid)
339  tss->section_cb(tss1, tss->section_buf, tss->section_h_size);
340  }
341 }
342 
344  SectionCallback *section_cb, void *opaque,
345  int check_crc)
346 
347 {
349  MpegTSSectionFilter *sec;
350 
351  av_dlog(ts->stream, "Filter: pid=0x%x\n", pid);
352 
353  if (pid >= NB_PID_MAX || ts->pids[pid])
354  return NULL;
355  filter = av_mallocz(sizeof(MpegTSFilter));
356  if (!filter)
357  return NULL;
358  ts->pids[pid] = filter;
359  filter->type = MPEGTS_SECTION;
360  filter->pid = pid;
361  filter->es_id = -1;
362  filter->last_cc = -1;
363  sec = &filter->u.section_filter;
364  sec->section_cb = section_cb;
365  sec->opaque = opaque;
367  sec->check_crc = check_crc;
368  if (!sec->section_buf) {
369  av_free(filter);
370  return NULL;
371  }
372  return filter;
373 }
374 
375 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
377  void *opaque)
378 {
380  MpegTSPESFilter *pes;
381 
382  if (pid >= NB_PID_MAX || ts->pids[pid])
383  return NULL;
384  filter = av_mallocz(sizeof(MpegTSFilter));
385  if (!filter)
386  return NULL;
387  ts->pids[pid] = filter;
388  filter->type = MPEGTS_PES;
389  filter->pid = pid;
390  filter->es_id = -1;
391  filter->last_cc = -1;
392  pes = &filter->u.pes_filter;
393  pes->pes_cb = pes_cb;
394  pes->opaque = opaque;
395  return filter;
396 }
397 
399 {
400  int pid;
401 
402  pid = filter->pid;
403  if (filter->type == MPEGTS_SECTION)
405  else if (filter->type == MPEGTS_PES) {
406  PESContext *pes = filter->u.pes_filter.opaque;
407  av_buffer_unref(&pes->buffer);
408  /* referenced private data will be freed later in
409  * avformat_close_input */
410  if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
411  av_freep(&filter->u.pes_filter.opaque);
412  }
413  }
414 
415  av_free(filter);
416  ts->pids[pid] = NULL;
417 }
418 
419 static int analyze(const uint8_t *buf, int size, int packet_size, int *index){
420  int stat[TS_MAX_PACKET_SIZE];
421  int i;
422  int x=0;
423  int best_score=0;
424 
425  memset(stat, 0, packet_size*sizeof(int));
426 
427  for(x=i=0; i<size-3; i++){
428  if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && buf[i+3] != 0x47){
429  stat[x]++;
430  if(stat[x] > best_score){
431  best_score= stat[x];
432  if(index) *index= x;
433  }
434  }
435 
436  x++;
437  if(x == packet_size) x= 0;
438  }
439 
440  return best_score;
441 }
442 
443 /* autodetect fec presence. Must have at least 1024 bytes */
444 static int get_packet_size(const uint8_t *buf, int size)
445 {
446  int score, fec_score, dvhs_score;
447 
448  if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
449  return -1;
450 
451  score = analyze(buf, size, TS_PACKET_SIZE, NULL);
452  dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL);
453  fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);
454  av_dlog(NULL, "score: %d, dvhs_score: %d, fec_score: %d \n",
455  score, dvhs_score, fec_score);
456 
457  if (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE;
458  else if(dvhs_score > score && dvhs_score > fec_score) return TS_DVHS_PACKET_SIZE;
459  else if(score < fec_score && dvhs_score < fec_score) return TS_FEC_PACKET_SIZE;
460  else return -1;
461 }
462 
463 typedef struct SectionHeader {
465  uint16_t id;
469 } SectionHeader;
470 
471 static inline int get8(const uint8_t **pp, const uint8_t *p_end)
472 {
473  const uint8_t *p;
474  int c;
475 
476  p = *pp;
477  if (p >= p_end)
478  return -1;
479  c = *p++;
480  *pp = p;
481  return c;
482 }
483 
484 static inline int get16(const uint8_t **pp, const uint8_t *p_end)
485 {
486  const uint8_t *p;
487  int c;
488 
489  p = *pp;
490  if ((p + 1) >= p_end)
491  return -1;
492  c = AV_RB16(p);
493  p += 2;
494  *pp = p;
495  return c;
496 }
497 
498 /* read and allocate a DVB string preceded by its length */
499 static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
500 {
501  int len;
502  const uint8_t *p;
503  char *str;
504 
505  p = *pp;
506  len = get8(&p, p_end);
507  if (len < 0)
508  return NULL;
509  if ((p + len) > p_end)
510  return NULL;
511  str = av_malloc(len + 1);
512  if (!str)
513  return NULL;
514  memcpy(str, p, len);
515  str[len] = '\0';
516  p += len;
517  *pp = p;
518  return str;
519 }
520 
522  const uint8_t **pp, const uint8_t *p_end)
523 {
524  int val;
525 
526  val = get8(pp, p_end);
527  if (val < 0)
528  return -1;
529  h->tid = val;
530  *pp += 2;
531  val = get16(pp, p_end);
532  if (val < 0)
533  return -1;
534  h->id = val;
535  val = get8(pp, p_end);
536  if (val < 0)
537  return -1;
538  h->version = (val >> 1) & 0x1f;
539  val = get8(pp, p_end);
540  if (val < 0)
541  return -1;
542  h->sec_num = val;
543  val = get8(pp, p_end);
544  if (val < 0)
545  return -1;
546  h->last_sec_num = val;
547  return 0;
548 }
549 
550 typedef struct {
551  uint32_t stream_type;
554 } StreamType;
555 
556 static const StreamType ISO_types[] = {
558  { 0x02, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
560  { 0x04, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },
563  /* Makito encoder sets stream type 0x11 for AAC,
564  * so auto-detect LOAS/LATM instead of hardcoding it. */
565 #if !CONFIG_LOAS_DEMUXER
566  { 0x11, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC_LATM }, /* LATM syntax */
567 #endif
572  { 0 },
573 };
574 
575 static const StreamType HDMV_types[] = {
581  { 0x85, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD */
582  { 0x86, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD MASTER*/
583  { 0xa1, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC3 Secondary Audio */
584  { 0xa2, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS Express Secondary Audio */
586  { 0 },
587 };
588 
589 /* ATSC ? */
590 static const StreamType MISC_types[] = {
593  { 0 },
594 };
595 
596 static const StreamType REGD_types[] = {
597  { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
598  { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
599  { MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
600  { MKTAG('D','T','S','1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
601  { MKTAG('D','T','S','2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
602  { MKTAG('D','T','S','3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
603  { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
604  { MKTAG('V','C','-','1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
605  { 0 },
606 };
607 
608 /* descriptor present */
609 static const StreamType DESC_types[] = {
610  { 0x6a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, /* AC-3 descriptor */
611  { 0x7a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC-3 descriptor */
614  { 0x59, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */
615  { 0 },
616 };
617 
619  uint32_t stream_type, const StreamType *types)
620 {
621  if (avcodec_is_open(st->codec)) {
622  av_log(NULL, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");
623  return;
624  }
625 
626  for (; types->stream_type; types++) {
627  if (stream_type == types->stream_type) {
628  st->codec->codec_type = types->codec_type;
629  st->codec->codec_id = types->codec_id;
630  st->request_probe = 0;
631  return;
632  }
633  }
634 }
635 
637  uint32_t stream_type, uint32_t prog_reg_desc)
638 {
639  int old_codec_type= st->codec->codec_type;
640  int old_codec_id = st->codec->codec_id;
641 
642  if (avcodec_is_open(st->codec)) {
643  av_log(pes->stream, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");
644  return 0;
645  }
646 
647  avpriv_set_pts_info(st, 33, 1, 90000);
648  st->priv_data = pes;
652  pes->st = st;
653  pes->stream_type = stream_type;
654 
655  av_log(pes->stream, AV_LOG_DEBUG,
656  "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
657  st->index, pes->stream_type, pes->pid, (char*)&prog_reg_desc);
658 
659  st->codec->codec_tag = pes->stream_type;
660 
661  mpegts_find_stream_type(st, pes->stream_type, ISO_types);
662  if ((prog_reg_desc == AV_RL32("HDMV") ||
663  prog_reg_desc == AV_RL32("HDPR")) &&
664  st->codec->codec_id == AV_CODEC_ID_NONE) {
665  mpegts_find_stream_type(st, pes->stream_type, HDMV_types);
666  if (pes->stream_type == 0x83) {
667  // HDMV TrueHD streams also contain an AC3 coded version of the
668  // audio track - add a second stream for this
669  AVStream *sub_st;
670  // priv_data cannot be shared between streams
671  PESContext *sub_pes = av_malloc(sizeof(*sub_pes));
672  if (!sub_pes)
673  return AVERROR(ENOMEM);
674  memcpy(sub_pes, pes, sizeof(*sub_pes));
675 
676  sub_st = avformat_new_stream(pes->stream, NULL);
677  if (!sub_st) {
678  av_free(sub_pes);
679  return AVERROR(ENOMEM);
680  }
681 
682  sub_st->id = pes->pid;
683  avpriv_set_pts_info(sub_st, 33, 1, 90000);
684  sub_st->priv_data = sub_pes;
686  sub_st->codec->codec_id = AV_CODEC_ID_AC3;
688  sub_pes->sub_st = pes->sub_st = sub_st;
689  }
690  }
691  if (st->codec->codec_id == AV_CODEC_ID_NONE)
692  mpegts_find_stream_type(st, pes->stream_type, MISC_types);
693  if (st->codec->codec_id == AV_CODEC_ID_NONE){
694  st->codec->codec_id = old_codec_id;
695  st->codec->codec_type= old_codec_type;
696  }
697 
698  return 0;
699 }
700 
702 {
703  av_init_packet(pkt);
704 
705  pkt->buf = pes->buffer;
706  pkt->data = pes->buffer->data;
707  pkt->size = pes->data_index;
708 
709  if(pes->total_size != MAX_PES_PAYLOAD &&
710  pes->pes_header_size + pes->data_index != pes->total_size + PES_START_SIZE) {
711  av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
712  pes->flags |= AV_PKT_FLAG_CORRUPT;
713  }
714  memset(pkt->data+pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
715 
716  // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
717  if (pes->sub_st && pes->stream_type == 0x83 && pes->extended_stream_id == 0x76)
718  pkt->stream_index = pes->sub_st->index;
719  else
720  pkt->stream_index = pes->st->index;
721  pkt->pts = pes->pts;
722  pkt->dts = pes->dts;
723  /* store position of first TS packet of this PES packet */
724  pkt->pos = pes->ts_packet_pos;
725  pkt->flags = pes->flags;
726 
727  /* reset pts values */
728  pes->pts = AV_NOPTS_VALUE;
729  pes->dts = AV_NOPTS_VALUE;
730  pes->buffer = NULL;
731  pes->data_index = 0;
732  pes->flags = 0;
733 }
734 
735 static uint64_t get_ts64(GetBitContext *gb, int bits)
736 {
737  if (get_bits_left(gb) < bits)
738  return AV_NOPTS_VALUE;
739  return get_bits64(gb, bits);
740 }
741 
742 static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
743 {
744  GetBitContext gb;
745  int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
746  int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
747  int dts_flag = -1, cts_flag = -1;
748  int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
749 
750  init_get_bits(&gb, buf, buf_size*8);
751 
752  if (sl->use_au_start)
753  au_start_flag = get_bits1(&gb);
754  if (sl->use_au_end)
755  au_end_flag = get_bits1(&gb);
756  if (!sl->use_au_start && !sl->use_au_end)
757  au_start_flag = au_end_flag = 1;
758  if (sl->ocr_len > 0)
759  ocr_flag = get_bits1(&gb);
760  if (sl->use_idle)
761  idle_flag = get_bits1(&gb);
762  if (sl->use_padding)
763  padding_flag = get_bits1(&gb);
764  if (padding_flag)
765  padding_bits = get_bits(&gb, 3);
766 
767  if (!idle_flag && (!padding_flag || padding_bits != 0)) {
768  if (sl->packet_seq_num_len)
770  if (sl->degr_prior_len)
771  if (get_bits1(&gb))
772  skip_bits(&gb, sl->degr_prior_len);
773  if (ocr_flag)
774  skip_bits_long(&gb, sl->ocr_len);
775  if (au_start_flag) {
776  if (sl->use_rand_acc_pt)
777  get_bits1(&gb);
778  if (sl->au_seq_num_len > 0)
779  skip_bits_long(&gb, sl->au_seq_num_len);
780  if (sl->use_timestamps) {
781  dts_flag = get_bits1(&gb);
782  cts_flag = get_bits1(&gb);
783  }
784  }
785  if (sl->inst_bitrate_len)
786  inst_bitrate_flag = get_bits1(&gb);
787  if (dts_flag == 1)
788  dts = get_ts64(&gb, sl->timestamp_len);
789  if (cts_flag == 1)
790  cts = get_ts64(&gb, sl->timestamp_len);
791  if (sl->au_len > 0)
792  skip_bits_long(&gb, sl->au_len);
793  if (inst_bitrate_flag)
795  }
796 
797  if (dts != AV_NOPTS_VALUE)
798  pes->dts = dts;
799  if (cts != AV_NOPTS_VALUE)
800  pes->pts = cts;
801 
802  if (sl->timestamp_len && sl->timestamp_res)
804 
805  return (get_bits_count(&gb) + 7) >> 3;
806 }
807 
808 /* return non zero if a packet could be constructed */
810  const uint8_t *buf, int buf_size, int is_start,
811  int64_t pos)
812 {
813  PESContext *pes = filter->u.pes_filter.opaque;
814  MpegTSContext *ts = pes->ts;
815  const uint8_t *p;
816  int len, code;
817 
818  if(!ts->pkt)
819  return 0;
820 
821  if (is_start) {
822  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
823  new_pes_packet(pes, ts->pkt);
824  ts->stop_parse = 1;
825  }
826  pes->state = MPEGTS_HEADER;
827  pes->data_index = 0;
828  pes->ts_packet_pos = pos;
829  }
830  p = buf;
831  while (buf_size > 0) {
832  switch(pes->state) {
833  case MPEGTS_HEADER:
834  len = PES_START_SIZE - pes->data_index;
835  if (len > buf_size)
836  len = buf_size;
837  memcpy(pes->header + pes->data_index, p, len);
838  pes->data_index += len;
839  p += len;
840  buf_size -= len;
841  if (pes->data_index == PES_START_SIZE) {
842  /* we got all the PES or section header. We can now
843  decide */
844  if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
845  pes->header[2] == 0x01) {
846  /* it must be an mpeg2 PES stream */
847  code = pes->header[3] | 0x100;
848  av_dlog(pes->stream, "pid=%x pes_code=%#x\n", pes->pid, code);
849 
850  if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
851  (!pes->sub_st || pes->sub_st->discard == AVDISCARD_ALL)) ||
852  code == 0x1be) /* padding_stream */
853  goto skip;
854 
855  /* stream not present in PMT */
856  if (!pes->st) {
857  pes->st = avformat_new_stream(ts->stream, NULL);
858  if (!pes->st)
859  return AVERROR(ENOMEM);
860  pes->st->id = pes->pid;
861  mpegts_set_stream_info(pes->st, pes, 0, 0);
862  }
863 
864  pes->total_size = AV_RB16(pes->header + 4);
865  /* NOTE: a zero total size means the PES size is
866  unbounded */
867  if (!pes->total_size)
869 
870  /* allocate pes buffer */
871  pes->buffer = av_buffer_alloc(pes->total_size +
873  if (!pes->buffer)
874  return AVERROR(ENOMEM);
875 
876  if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */
877  code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */
878  code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */
879  code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */
880  pes->state = MPEGTS_PESHEADER;
881  if (pes->st->codec->codec_id == AV_CODEC_ID_NONE && !pes->st->request_probe) {
882  av_dlog(pes->stream, "pid=%x stream_type=%x probing\n",
883  pes->pid, pes->stream_type);
884  pes->st->request_probe= 1;
885  }
886  } else {
887  pes->state = MPEGTS_PAYLOAD;
888  pes->data_index = 0;
889  }
890  } else {
891  /* otherwise, it should be a table */
892  /* skip packet */
893  skip:
894  pes->state = MPEGTS_SKIP;
895  continue;
896  }
897  }
898  break;
899  /**********************************************/
900  /* PES packing parsing */
901  case MPEGTS_PESHEADER:
902  len = PES_HEADER_SIZE - pes->data_index;
903  if (len < 0)
904  return -1;
905  if (len > buf_size)
906  len = buf_size;
907  memcpy(pes->header + pes->data_index, p, len);
908  pes->data_index += len;
909  p += len;
910  buf_size -= len;
911  if (pes->data_index == PES_HEADER_SIZE) {
912  pes->pes_header_size = pes->header[8] + 9;
914  }
915  break;
917  len = pes->pes_header_size - pes->data_index;
918  if (len < 0)
919  return -1;
920  if (len > buf_size)
921  len = buf_size;
922  memcpy(pes->header + pes->data_index, p, len);
923  pes->data_index += len;
924  p += len;
925  buf_size -= len;
926  if (pes->data_index == pes->pes_header_size) {
927  const uint8_t *r;
928  unsigned int flags, pes_ext, skip;
929 
930  flags = pes->header[7];
931  r = pes->header + 9;
932  pes->pts = AV_NOPTS_VALUE;
933  pes->dts = AV_NOPTS_VALUE;
934  if ((flags & 0xc0) == 0x80) {
935  pes->dts = pes->pts = ff_parse_pes_pts(r);
936  r += 5;
937  } else if ((flags & 0xc0) == 0xc0) {
938  pes->pts = ff_parse_pes_pts(r);
939  r += 5;
940  pes->dts = ff_parse_pes_pts(r);
941  r += 5;
942  }
943  pes->extended_stream_id = -1;
944  if (flags & 0x01) { /* PES extension */
945  pes_ext = *r++;
946  /* Skip PES private data, program packet sequence counter and P-STD buffer */
947  skip = (pes_ext >> 4) & 0xb;
948  skip += skip & 0x9;
949  r += skip;
950  if ((pes_ext & 0x41) == 0x01 &&
951  (r + 2) <= (pes->header + pes->pes_header_size)) {
952  /* PES extension 2 */
953  if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
954  pes->extended_stream_id = r[1];
955  }
956  }
957 
958  /* we got the full header. We parse it and get the payload */
959  pes->state = MPEGTS_PAYLOAD;
960  pes->data_index = 0;
961  if (pes->stream_type == 0x12 && buf_size > 0) {
962  int sl_header_bytes = read_sl_header(pes, &pes->sl, p, buf_size);
963  pes->pes_header_size += sl_header_bytes;
964  p += sl_header_bytes;
965  buf_size -= sl_header_bytes;
966  }
967  }
968  break;
969  case MPEGTS_PAYLOAD:
970  if (buf_size > 0 && pes->buffer) {
971  if (pes->data_index > 0 && pes->data_index+buf_size > pes->total_size) {
972  new_pes_packet(pes, ts->pkt);
975  if (!pes->buffer)
976  return AVERROR(ENOMEM);
977  ts->stop_parse = 1;
978  } else if (pes->data_index == 0 && buf_size > pes->total_size) {
979  // pes packet size is < ts size packet and pes data is padded with 0xff
980  // not sure if this is legal in ts but see issue #2392
981  buf_size = pes->total_size;
982  }
983  memcpy(pes->buffer->data + pes->data_index, p, buf_size);
984  pes->data_index += buf_size;
985  }
986  buf_size = 0;
987  /* emit complete packets with known packet size
988  * decreases demuxer delay for infrequent packets like subtitles from
989  * a couple of seconds to milliseconds for properly muxed files.
990  * total_size is the number of bytes following pes_packet_length
991  * in the pes header, i.e. not counting the first PES_START_SIZE bytes */
992  if (!ts->stop_parse && pes->total_size < MAX_PES_PAYLOAD &&
993  pes->pes_header_size + pes->data_index == pes->total_size + PES_START_SIZE) {
994  ts->stop_parse = 1;
995  new_pes_packet(pes, ts->pkt);
996  }
997  break;
998  case MPEGTS_SKIP:
999  buf_size = 0;
1000  break;
1001  }
1002  }
1003 
1004  return 0;
1005 }
1006 
1007 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
1008 {
1009  MpegTSFilter *tss;
1010  PESContext *pes;
1011 
1012  /* if no pid found, then add a pid context */
1013  pes = av_mallocz(sizeof(PESContext));
1014  if (!pes)
1015  return 0;
1016  pes->ts = ts;
1017  pes->stream = ts->stream;
1018  pes->pid = pid;
1019  pes->pcr_pid = pcr_pid;
1020  pes->state = MPEGTS_SKIP;
1021  pes->pts = AV_NOPTS_VALUE;
1022  pes->dts = AV_NOPTS_VALUE;
1023  tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
1024  if (!tss) {
1025  av_free(pes);
1026  return 0;
1027  }
1028  return pes;
1029 }
1030 
1031 #define MAX_LEVEL 4
1032 typedef struct {
1039  int level;
1041 
1044  unsigned size, Mp4Descr *descr, int max_descr_count)
1045 {
1046  int ret;
1047  if (size > (1<<30))
1048  return AVERROR_INVALIDDATA;
1049 
1050  if ((ret = ffio_init_context(&d->pb, (unsigned char*)buf, size, 0,
1051  NULL, NULL, NULL, NULL)) < 0)
1052  return ret;
1053 
1054  d->s = s;
1055  d->level = 0;
1056  d->descr_count = 0;
1057  d->descr = descr;
1058  d->active_descr = NULL;
1059  d->max_descr_count = max_descr_count;
1060 
1061  return 0;
1062 }
1063 
1064 static void update_offsets(AVIOContext *pb, int64_t *off, int *len) {
1065  int64_t new_off = avio_tell(pb);
1066  (*len) -= new_off - *off;
1067  *off = new_off;
1068 }
1069 
1070 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1071  int target_tag);
1072 
1073 static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
1074 {
1075  while (len > 0) {
1076  if (parse_mp4_descr(d, off, len, 0) < 0)
1077  return -1;
1078  update_offsets(&d->pb, &off, &len);
1079  }
1080  return 0;
1081 }
1082 
1083 static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
1084 {
1085  avio_rb16(&d->pb); // ID
1086  avio_r8(&d->pb);
1087  avio_r8(&d->pb);
1088  avio_r8(&d->pb);
1089  avio_r8(&d->pb);
1090  avio_r8(&d->pb);
1091  update_offsets(&d->pb, &off, &len);
1092  return parse_mp4_descr_arr(d, off, len);
1093 }
1094 
1095 static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
1096 {
1097  int id_flags;
1098  if (len < 2)
1099  return 0;
1100  id_flags = avio_rb16(&d->pb);
1101  if (!(id_flags & 0x0020)) { //URL_Flag
1102  update_offsets(&d->pb, &off, &len);
1103  return parse_mp4_descr_arr(d, off, len); //ES_Descriptor[]
1104  } else {
1105  return 0;
1106  }
1107 }
1108 
1109 static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1110 {
1111  int es_id = 0;
1112  if (d->descr_count >= d->max_descr_count)
1113  return -1;
1114  ff_mp4_parse_es_descr(&d->pb, &es_id);
1115  d->active_descr = d->descr + (d->descr_count++);
1116 
1117  d->active_descr->es_id = es_id;
1118  update_offsets(&d->pb, &off, &len);
1119  parse_mp4_descr(d, off, len, MP4DecConfigDescrTag);
1120  update_offsets(&d->pb, &off, &len);
1121  if (len > 0)
1122  parse_mp4_descr(d, off, len, MP4SLDescrTag);
1123  d->active_descr = NULL;
1124  return 0;
1125 }
1126 
1128 {
1129  Mp4Descr *descr = d->active_descr;
1130  if (!descr)
1131  return -1;
1133  if (!descr->dec_config_descr)
1134  return AVERROR(ENOMEM);
1135  descr->dec_config_descr_len = len;
1136  avio_read(&d->pb, descr->dec_config_descr, len);
1137  return 0;
1138 }
1139 
1140 static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1141 {
1142  Mp4Descr *descr = d->active_descr;
1143  int predefined;
1144  if (!descr)
1145  return -1;
1146 
1147  predefined = avio_r8(&d->pb);
1148  if (!predefined) {
1149  int lengths;
1150  int flags = avio_r8(&d->pb);
1151  descr->sl.use_au_start = !!(flags & 0x80);
1152  descr->sl.use_au_end = !!(flags & 0x40);
1153  descr->sl.use_rand_acc_pt = !!(flags & 0x20);
1154  descr->sl.use_padding = !!(flags & 0x08);
1155  descr->sl.use_timestamps = !!(flags & 0x04);
1156  descr->sl.use_idle = !!(flags & 0x02);
1157  descr->sl.timestamp_res = avio_rb32(&d->pb);
1158  avio_rb32(&d->pb);
1159  descr->sl.timestamp_len = avio_r8(&d->pb);
1160  descr->sl.ocr_len = avio_r8(&d->pb);
1161  descr->sl.au_len = avio_r8(&d->pb);
1162  descr->sl.inst_bitrate_len = avio_r8(&d->pb);
1163  lengths = avio_rb16(&d->pb);
1164  descr->sl.degr_prior_len = lengths >> 12;
1165  descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
1166  descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
1167  } else {
1168  avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
1169  }
1170  return 0;
1171 }
1172 
1173 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1174  int target_tag) {
1175  int tag;
1176  int len1 = ff_mp4_read_descr(d->s, &d->pb, &tag);
1177  update_offsets(&d->pb, &off, &len);
1178  if (len < 0 || len1 > len || len1 <= 0) {
1179  av_log(d->s, AV_LOG_ERROR, "Tag %x length violation new length %d bytes remaining %d\n", tag, len1, len);
1180  return -1;
1181  }
1182 
1183  if (d->level++ >= MAX_LEVEL) {
1184  av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
1185  goto done;
1186  }
1187 
1188  if (target_tag && tag != target_tag) {
1189  av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag, target_tag);
1190  goto done;
1191  }
1192 
1193  switch (tag) {
1194  case MP4IODescrTag:
1195  parse_MP4IODescrTag(d, off, len1);
1196  break;
1197  case MP4ODescrTag:
1198  parse_MP4ODescrTag(d, off, len1);
1199  break;
1200  case MP4ESDescrTag:
1201  parse_MP4ESDescrTag(d, off, len1);
1202  break;
1203  case MP4DecConfigDescrTag:
1204  parse_MP4DecConfigDescrTag(d, off, len1);
1205  break;
1206  case MP4SLDescrTag:
1207  parse_MP4SLDescrTag(d, off, len1);
1208  break;
1209  }
1210 
1211 done:
1212  d->level--;
1213  avio_seek(&d->pb, off + len1, SEEK_SET);
1214  return 0;
1215 }
1216 
1217 static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
1218  Mp4Descr *descr, int *descr_count, int max_descr_count)
1219 {
1221  if (init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count) < 0)
1222  return -1;
1223 
1224  parse_mp4_descr(&d, avio_tell(&d.pb), size, MP4IODescrTag);
1225 
1226  *descr_count = d.descr_count;
1227  return 0;
1228 }
1229 
1230 static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
1231  Mp4Descr *descr, int *descr_count, int max_descr_count)
1232 {
1234  if (init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count) < 0)
1235  return -1;
1236 
1237  parse_mp4_descr_arr(&d, avio_tell(&d.pb), size);
1238 
1239  *descr_count = d.descr_count;
1240  return 0;
1241 }
1242 
1243 static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1244 {
1245  MpegTSContext *ts = filter->u.section_filter.opaque;
1246  SectionHeader h;
1247  const uint8_t *p, *p_end;
1248  AVIOContext pb;
1249  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = {{ 0 }};
1250  int mp4_descr_count = 0;
1251  int i, pid;
1252  AVFormatContext *s = ts->stream;
1253 
1254  p_end = section + section_len - 4;
1255  p = section;
1256  if (parse_section_header(&h, &p, p_end) < 0)
1257  return;
1258  if (h.tid != M4OD_TID)
1259  return;
1260 
1261  mp4_read_od(s, p, (unsigned)(p_end - p), mp4_descr, &mp4_descr_count, MAX_MP4_DESCR_COUNT);
1262 
1263  for (pid = 0; pid < NB_PID_MAX; pid++) {
1264  if (!ts->pids[pid])
1265  continue;
1266  for (i = 0; i < mp4_descr_count; i++) {
1267  PESContext *pes;
1268  AVStream *st;
1269  if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
1270  continue;
1271  if (!(ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES)) {
1272  av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
1273  continue;
1274  }
1275  pes = ts->pids[pid]->u.pes_filter.opaque;
1276  st = pes->st;
1277  if (!st) {
1278  continue;
1279  }
1280 
1281  pes->sl = mp4_descr[i].sl;
1282 
1283  ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
1284  mp4_descr[i].dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
1285  ff_mp4_read_dec_config_descr(s, st, &pb);
1286  if (st->codec->codec_id == AV_CODEC_ID_AAC &&
1287  st->codec->extradata_size > 0)
1288  st->need_parsing = 0;
1289  if (st->codec->codec_id == AV_CODEC_ID_H264 &&
1290  st->codec->extradata_size > 0)
1291  st->need_parsing = 0;
1292 
1293  if (st->codec->codec_id <= AV_CODEC_ID_NONE) {
1294  } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_AUDIO) {
1296  } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_SUBTITLE) {
1298  } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_UNKNOWN) {
1300  }
1301  }
1302  }
1303  for (i = 0; i < mp4_descr_count; i++)
1304  av_free(mp4_descr[i].dec_config_descr);
1305 }
1306 
1308  const uint8_t **pp, const uint8_t *desc_list_end,
1309  Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
1310  MpegTSContext *ts)
1311 {
1312  const uint8_t *desc_end;
1313  int desc_len, desc_tag, desc_es_id;
1314  char language[252];
1315  int i;
1316 
1317  desc_tag = get8(pp, desc_list_end);
1318  if (desc_tag < 0)
1319  return -1;
1320  desc_len = get8(pp, desc_list_end);
1321  if (desc_len < 0)
1322  return -1;
1323  desc_end = *pp + desc_len;
1324  if (desc_end > desc_list_end)
1325  return -1;
1326 
1327  av_dlog(fc, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
1328 
1329  if (st->codec->codec_id == AV_CODEC_ID_NONE &&
1330  stream_type == STREAM_TYPE_PRIVATE_DATA)
1331  mpegts_find_stream_type(st, desc_tag, DESC_types);
1332 
1333  switch(desc_tag) {
1334  case 0x1E: /* SL descriptor */
1335  desc_es_id = get16(pp, desc_end);
1336  if (ts && ts->pids[pid])
1337  ts->pids[pid]->es_id = desc_es_id;
1338  for (i = 0; i < mp4_descr_count; i++)
1339  if (mp4_descr[i].dec_config_descr_len &&
1340  mp4_descr[i].es_id == desc_es_id) {
1341  AVIOContext pb;
1342  ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
1343  mp4_descr[i].dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
1344  ff_mp4_read_dec_config_descr(fc, st, &pb);
1345  if (st->codec->codec_id == AV_CODEC_ID_AAC &&
1346  st->codec->extradata_size > 0)
1347  st->need_parsing = 0;
1349  mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
1350  }
1351  break;
1352  case 0x1F: /* FMC descriptor */
1353  get16(pp, desc_end);
1354  if (mp4_descr_count > 0 && (st->codec->codec_id == AV_CODEC_ID_AAC_LATM || st->request_probe>0) &&
1355  mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
1356  AVIOContext pb;
1357  ffio_init_context(&pb, mp4_descr->dec_config_descr,
1358  mp4_descr->dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
1359  ff_mp4_read_dec_config_descr(fc, st, &pb);
1360  if (st->codec->codec_id == AV_CODEC_ID_AAC &&
1361  st->codec->extradata_size > 0){
1362  st->request_probe= st->need_parsing = 0;
1364  }
1365  }
1366  break;
1367  case 0x56: /* DVB teletext descriptor */
1368  language[0] = get8(pp, desc_end);
1369  language[1] = get8(pp, desc_end);
1370  language[2] = get8(pp, desc_end);
1371  language[3] = 0;
1372  av_dict_set(&st->metadata, "language", language, 0);
1373  break;
1374  case 0x59: /* subtitling descriptor */
1375  language[0] = get8(pp, desc_end);
1376  language[1] = get8(pp, desc_end);
1377  language[2] = get8(pp, desc_end);
1378  language[3] = 0;
1379  /* hearing impaired subtitles detection */
1380  switch(get8(pp, desc_end)) {
1381  case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1382  case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1383  case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1384  case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1385  case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1386  case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1388  break;
1389  }
1390  if (st->codec->extradata) {
1391  if (st->codec->extradata_size == 4 && memcmp(st->codec->extradata, *pp, 4))
1392  avpriv_request_sample(fc, "DVB sub with multiple IDs");
1393  } else {
1395  if (st->codec->extradata) {
1396  st->codec->extradata_size = 4;
1397  memcpy(st->codec->extradata, *pp, 4);
1398  }
1399  }
1400  *pp += 4;
1401  av_dict_set(&st->metadata, "language", language, 0);
1402  break;
1403  case 0x0a: /* ISO 639 language descriptor */
1404  for (i = 0; i + 4 <= desc_len; i += 4) {
1405  language[i + 0] = get8(pp, desc_end);
1406  language[i + 1] = get8(pp, desc_end);
1407  language[i + 2] = get8(pp, desc_end);
1408  language[i + 3] = ',';
1409  switch (get8(pp, desc_end)) {
1410  case 0x01: st->disposition |= AV_DISPOSITION_CLEAN_EFFECTS; break;
1411  case 0x02: st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; break;
1412  case 0x03: st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED; break;
1413  }
1414  }
1415  if (i) {
1416  language[i - 1] = 0;
1417  av_dict_set(&st->metadata, "language", language, 0);
1418  }
1419  break;
1420  case 0x05: /* registration descriptor */
1421  st->codec->codec_tag = bytestream_get_le32(pp);
1422  av_dlog(fc, "reg_desc=%.4s\n", (char*)&st->codec->codec_tag);
1423  if (st->codec->codec_id == AV_CODEC_ID_NONE)
1424  mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types);
1425  break;
1426  case 0x52: /* stream identifier descriptor */
1427  st->stream_identifier = 1 + get8(pp, desc_end);
1428  break;
1429  default:
1430  break;
1431  }
1432  *pp = desc_end;
1433  return 0;
1434 }
1435 
1436 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1437 {
1438  MpegTSContext *ts = filter->u.section_filter.opaque;
1439  SectionHeader h1, *h = &h1;
1440  PESContext *pes;
1441  AVStream *st;
1442  const uint8_t *p, *p_end, *desc_list_end;
1443  int program_info_length, pcr_pid, pid, stream_type;
1444  int desc_list_len;
1445  uint32_t prog_reg_desc = 0; /* registration descriptor */
1446 
1447  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = {{ 0 }};
1448  int mp4_descr_count = 0;
1449  int i;
1450 
1451  av_dlog(ts->stream, "PMT: len %i\n", section_len);
1452  hex_dump_debug(ts->stream, section, section_len);
1453 
1454  p_end = section + section_len - 4;
1455  p = section;
1456  if (parse_section_header(h, &p, p_end) < 0)
1457  return;
1458 
1459  av_dlog(ts->stream, "sid=0x%x sec_num=%d/%d\n",
1460  h->id, h->sec_num, h->last_sec_num);
1461 
1462  if (h->tid != PMT_TID)
1463  return;
1464 
1465  clear_program(ts, h->id);
1466  pcr_pid = get16(&p, p_end);
1467  if (pcr_pid < 0)
1468  return;
1469  pcr_pid &= 0x1fff;
1470  add_pid_to_pmt(ts, h->id, pcr_pid);
1471  set_pcr_pid(ts->stream, h->id, pcr_pid);
1472 
1473  av_dlog(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
1474 
1475  program_info_length = get16(&p, p_end);
1476  if (program_info_length < 0)
1477  return;
1478  program_info_length &= 0xfff;
1479  while(program_info_length >= 2) {
1480  uint8_t tag, len;
1481  tag = get8(&p, p_end);
1482  len = get8(&p, p_end);
1483 
1484  av_dlog(ts->stream, "program tag: 0x%02x len=%d\n", tag, len);
1485 
1486  if(len > program_info_length - 2)
1487  //something else is broken, exit the program_descriptors_loop
1488  break;
1489  program_info_length -= len + 2;
1490  if (tag == 0x1d) { // IOD descriptor
1491  get8(&p, p_end); // scope
1492  get8(&p, p_end); // label
1493  len -= 2;
1494  mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
1495  &mp4_descr_count, MAX_MP4_DESCR_COUNT);
1496  } else if (tag == 0x05 && len >= 4) { // registration descriptor
1497  prog_reg_desc = bytestream_get_le32(&p);
1498  len -= 4;
1499  }
1500  p += len;
1501  }
1502  p += program_info_length;
1503  if (p >= p_end)
1504  goto out;
1505 
1506  // stop parsing after pmt, we found header
1507  if (!ts->stream->nb_streams)
1508  ts->stop_parse = 2;
1509 
1510  for(;;) {
1511  st = 0;
1512  pes = NULL;
1513  stream_type = get8(&p, p_end);
1514  if (stream_type < 0)
1515  break;
1516  pid = get16(&p, p_end);
1517  if (pid < 0)
1518  break;
1519  pid &= 0x1fff;
1520  if (pid == ts->current_pid)
1521  break;
1522 
1523  /* now create stream */
1524  if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
1525  pes = ts->pids[pid]->u.pes_filter.opaque;
1526  if (!pes->st) {
1527  pes->st = avformat_new_stream(pes->stream, NULL);
1528  if (!pes->st)
1529  goto out;
1530  pes->st->id = pes->pid;
1531  }
1532  st = pes->st;
1533  } else if (stream_type != 0x13) {
1534  if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably
1535  pes = add_pes_stream(ts, pid, pcr_pid);
1536  if (pes) {
1537  st = avformat_new_stream(pes->stream, NULL);
1538  if (!st)
1539  goto out;
1540  st->id = pes->pid;
1541  }
1542  } else {
1543  int idx = ff_find_stream_index(ts->stream, pid);
1544  if (idx >= 0) {
1545  st = ts->stream->streams[idx];
1546  } else {
1547  st = avformat_new_stream(ts->stream, NULL);
1548  if (!st)
1549  goto out;
1550  st->id = pid;
1552  }
1553  }
1554 
1555  if (!st)
1556  goto out;
1557 
1558  if (pes && !pes->stream_type)
1559  mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
1560 
1561  add_pid_to_pmt(ts, h->id, pid);
1562 
1564 
1565  desc_list_len = get16(&p, p_end);
1566  if (desc_list_len < 0)
1567  break;
1568  desc_list_len &= 0xfff;
1569  desc_list_end = p + desc_list_len;
1570  if (desc_list_end > p_end)
1571  break;
1572  for(;;) {
1573  if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, &p, desc_list_end,
1574  mp4_descr, mp4_descr_count, pid, ts) < 0)
1575  break;
1576 
1577  if (pes && prog_reg_desc == AV_RL32("HDMV") && stream_type == 0x83 && pes->sub_st) {
1579  pes->sub_st->codec->codec_tag = st->codec->codec_tag;
1580  }
1581  }
1582  p = desc_list_end;
1583  }
1584 
1585  out:
1586  for (i = 0; i < mp4_descr_count; i++)
1587  av_free(mp4_descr[i].dec_config_descr);
1588 }
1589 
1590 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1591 {
1592  MpegTSContext *ts = filter->u.section_filter.opaque;
1593  SectionHeader h1, *h = &h1;
1594  const uint8_t *p, *p_end;
1595  int sid, pmt_pid;
1596  AVProgram *program;
1597 
1598  av_dlog(ts->stream, "PAT:\n");
1599  hex_dump_debug(ts->stream, section, section_len);
1600 
1601  p_end = section + section_len - 4;
1602  p = section;
1603  if (parse_section_header(h, &p, p_end) < 0)
1604  return;
1605  if (h->tid != PAT_TID)
1606  return;
1607 
1608  ts->stream->ts_id = h->id;
1609 
1610  clear_programs(ts);
1611  for(;;) {
1612  sid = get16(&p, p_end);
1613  if (sid < 0)
1614  break;
1615  pmt_pid = get16(&p, p_end);
1616  if (pmt_pid < 0)
1617  break;
1618  pmt_pid &= 0x1fff;
1619 
1620  if (pmt_pid == ts->current_pid)
1621  break;
1622 
1623  av_dlog(ts->stream, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
1624 
1625  if (sid == 0x0000) {
1626  /* NIT info */
1627  } else {
1628  program = av_new_program(ts->stream, sid);
1629  program->program_num = sid;
1630  program->pmt_pid = pmt_pid;
1631  if (ts->pids[pmt_pid])
1632  mpegts_close_filter(ts, ts->pids[pmt_pid]);
1633  mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
1634  add_pat_entry(ts, sid);
1635  add_pid_to_pmt(ts, sid, 0); //add pat pid to program
1636  add_pid_to_pmt(ts, sid, pmt_pid);
1637  }
1638  }
1639 
1640  if (sid < 0) {
1641  int i,j;
1642  for (j=0; j<ts->stream->nb_programs; j++) {
1643  for (i=0; i<ts->nb_prg; i++)
1644  if (ts->prg[i].id == ts->stream->programs[j]->id)
1645  break;
1646  if (i==ts->nb_prg)
1647  clear_avprogram(ts, ts->stream->programs[j]->id);
1648  }
1649  }
1650 }
1651 
1652 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1653 {
1654  MpegTSContext *ts = filter->u.section_filter.opaque;
1655  SectionHeader h1, *h = &h1;
1656  const uint8_t *p, *p_end, *desc_list_end, *desc_end;
1657  int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
1658  char *name, *provider_name;
1659 
1660  av_dlog(ts->stream, "SDT:\n");
1661  hex_dump_debug(ts->stream, section, section_len);
1662 
1663  p_end = section + section_len - 4;
1664  p = section;
1665  if (parse_section_header(h, &p, p_end) < 0)
1666  return;
1667  if (h->tid != SDT_TID)
1668  return;
1669  onid = get16(&p, p_end);
1670  if (onid < 0)
1671  return;
1672  val = get8(&p, p_end);
1673  if (val < 0)
1674  return;
1675  for(;;) {
1676  sid = get16(&p, p_end);
1677  if (sid < 0)
1678  break;
1679  val = get8(&p, p_end);
1680  if (val < 0)
1681  break;
1682  desc_list_len = get16(&p, p_end);
1683  if (desc_list_len < 0)
1684  break;
1685  desc_list_len &= 0xfff;
1686  desc_list_end = p + desc_list_len;
1687  if (desc_list_end > p_end)
1688  break;
1689  for(;;) {
1690  desc_tag = get8(&p, desc_list_end);
1691  if (desc_tag < 0)
1692  break;
1693  desc_len = get8(&p, desc_list_end);
1694  desc_end = p + desc_len;
1695  if (desc_end > desc_list_end)
1696  break;
1697 
1698  av_dlog(ts->stream, "tag: 0x%02x len=%d\n",
1699  desc_tag, desc_len);
1700 
1701  switch(desc_tag) {
1702  case 0x48:
1703  service_type = get8(&p, p_end);
1704  if (service_type < 0)
1705  break;
1706  provider_name = getstr8(&p, p_end);
1707  if (!provider_name)
1708  break;
1709  name = getstr8(&p, p_end);
1710  if (name) {
1711  AVProgram *program = av_new_program(ts->stream, sid);
1712  if(program) {
1713  av_dict_set(&program->metadata, "service_name", name, 0);
1714  av_dict_set(&program->metadata, "service_provider", provider_name, 0);
1715  }
1716  }
1717  av_free(name);
1718  av_free(provider_name);
1719  break;
1720  default:
1721  break;
1722  }
1723  p = desc_end;
1724  }
1725  p = desc_list_end;
1726  }
1727 }
1728 
1729 /* handle one TS packet */
1730 static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
1731 {
1732  AVFormatContext *s = ts->stream;
1733  MpegTSFilter *tss;
1734  int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
1735  has_adaptation, has_payload;
1736  const uint8_t *p, *p_end;
1737  int64_t pos;
1738 
1739  pid = AV_RB16(packet + 1) & 0x1fff;
1740  if(pid && discard_pid(ts, pid))
1741  return 0;
1742  is_start = packet[1] & 0x40;
1743  tss = ts->pids[pid];
1744  if (ts->auto_guess && tss == NULL && is_start) {
1745  add_pes_stream(ts, pid, -1);
1746  tss = ts->pids[pid];
1747  }
1748  if (!tss)
1749  return 0;
1750  ts->current_pid = pid;
1751 
1752  afc = (packet[3] >> 4) & 3;
1753  if (afc == 0) /* reserved value */
1754  return 0;
1755  has_adaptation = afc & 2;
1756  has_payload = afc & 1;
1757  is_discontinuity = has_adaptation
1758  && packet[4] != 0 /* with length > 0 */
1759  && (packet[5] & 0x80); /* and discontinuity indicated */
1760 
1761  /* continuity check (currently not used) */
1762  cc = (packet[3] & 0xf);
1763  expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
1764  cc_ok = pid == 0x1FFF // null packet PID
1765  || is_discontinuity
1766  || tss->last_cc < 0
1767  || expected_cc == cc;
1768 
1769  tss->last_cc = cc;
1770  if (!cc_ok) {
1771  av_log(ts->stream, AV_LOG_DEBUG,
1772  "Continuity check failed for pid %d expected %d got %d\n",
1773  pid, expected_cc, cc);
1774  if(tss->type == MPEGTS_PES) {
1775  PESContext *pc = tss->u.pes_filter.opaque;
1776  pc->flags |= AV_PKT_FLAG_CORRUPT;
1777  }
1778  }
1779 
1780  if (!has_payload)
1781  return 0;
1782  p = packet + 4;
1783  if (has_adaptation) {
1784  /* skip adaptation field */
1785  p += p[0] + 1;
1786  }
1787  /* if past the end of packet, ignore */
1788  p_end = packet + TS_PACKET_SIZE;
1789  if (p >= p_end)
1790  return 0;
1791 
1792  pos = avio_tell(ts->stream->pb);
1793  ts->pos47= pos % ts->raw_packet_size;
1794 
1795  if (tss->type == MPEGTS_SECTION) {
1796  if (is_start) {
1797  /* pointer field present */
1798  len = *p++;
1799  if (p + len > p_end)
1800  return 0;
1801  if (len && cc_ok) {
1802  /* write remaining section bytes */
1803  write_section_data(s, tss,
1804  p, len, 0);
1805  /* check whether filter has been closed */
1806  if (!ts->pids[pid])
1807  return 0;
1808  }
1809  p += len;
1810  if (p < p_end) {
1811  write_section_data(s, tss,
1812  p, p_end - p, 1);
1813  }
1814  } else {
1815  if (cc_ok) {
1816  write_section_data(s, tss,
1817  p, p_end - p, 0);
1818  }
1819  }
1820  } else {
1821  int ret;
1822  // Note: The position here points actually behind the current packet.
1823  if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
1824  pos - ts->raw_packet_size)) < 0)
1825  return ret;
1826  }
1827 
1828  return 0;
1829 }
1830 
1831 /* XXX: try to find a better synchro over several packets (use
1832  get_packet_size() ?) */
1834 {
1835  AVIOContext *pb = s->pb;
1836  int c, i;
1837 
1838  for(i = 0;i < MAX_RESYNC_SIZE; i++) {
1839  c = avio_r8(pb);
1840  if (url_feof(pb))
1841  return -1;
1842  if (c == 0x47) {
1843  avio_seek(pb, -1, SEEK_CUR);
1844  return 0;
1845  }
1846  }
1847  av_log(s, AV_LOG_ERROR, "max resync size reached, could not find sync byte\n");
1848  /* no sync found */
1849  return -1;
1850 }
1851 
1852 /* return -1 if error or EOF. Return 0 if OK. */
1853 static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size)
1854 {
1855  AVIOContext *pb = s->pb;
1856  int skip, len;
1857 
1858  for(;;) {
1859  len = avio_read(pb, buf, TS_PACKET_SIZE);
1860  if (len != TS_PACKET_SIZE)
1861  return len < 0 ? len : AVERROR_EOF;
1862  /* check packet sync byte */
1863  if (buf[0] != 0x47) {
1864  /* find a new packet start */
1865  avio_seek(pb, -TS_PACKET_SIZE, SEEK_CUR);
1866  if (mpegts_resync(s) < 0)
1867  return AVERROR(EAGAIN);
1868  else
1869  continue;
1870  } else {
1871  skip = raw_packet_size - TS_PACKET_SIZE;
1872  if (skip > 0)
1873  avio_skip(pb, skip);
1874  break;
1875  }
1876  }
1877  return 0;
1878 }
1879 
1880 static int handle_packets(MpegTSContext *ts, int nb_packets)
1881 {
1882  AVFormatContext *s = ts->stream;
1884  int packet_num, ret = 0;
1885 
1886  if (avio_tell(s->pb) != ts->last_pos) {
1887  int i;
1888  av_dlog(ts->stream, "Skipping after seek\n");
1889  /* seek detected, flush pes buffer */
1890  for (i = 0; i < NB_PID_MAX; i++) {
1891  if (ts->pids[i]) {
1892  if (ts->pids[i]->type == MPEGTS_PES) {
1893  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
1894  av_buffer_unref(&pes->buffer);
1895  pes->data_index = 0;
1896  pes->state = MPEGTS_SKIP; /* skip until pes header */
1897  }
1898  ts->pids[i]->last_cc = -1;
1899  }
1900  }
1901  }
1902 
1903  ts->stop_parse = 0;
1904  packet_num = 0;
1905  memset(packet + TS_PACKET_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1906  for(;;) {
1907  packet_num++;
1908  if (nb_packets != 0 && packet_num >= nb_packets ||
1909  ts->stop_parse > 1) {
1910  ret = AVERROR(EAGAIN);
1911  break;
1912  }
1913  if (ts->stop_parse > 0)
1914  break;
1915 
1916  ret = read_packet(s, packet, ts->raw_packet_size);
1917  if (ret != 0)
1918  break;
1919  ret = handle_packet(ts, packet);
1920  if (ret != 0)
1921  break;
1922  }
1923  ts->last_pos = avio_tell(s->pb);
1924  return ret;
1925 }
1926 
1928 {
1929  const int size= p->buf_size;
1930  int maxscore=0;
1931  int sumscore=0;
1932  int i;
1933  int check_count= size / TS_FEC_PACKET_SIZE;
1934 #define CHECK_COUNT 10
1935 #define CHECK_BLOCK 100
1936 
1937  if (check_count < CHECK_COUNT)
1938  return -1;
1939 
1940  for (i=0; i<check_count; i+=CHECK_BLOCK){
1941  int left = FFMIN(check_count - i, CHECK_BLOCK);
1942  int score = analyze(p->buf + TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , NULL);
1944  int fec_score = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , NULL);
1945  score = FFMAX3(score, dvhs_score, fec_score);
1946  sumscore += score;
1947  maxscore = FFMAX(maxscore, score);
1948  }
1949 
1950  sumscore = sumscore*CHECK_COUNT/check_count;
1951  maxscore = maxscore*CHECK_COUNT/CHECK_BLOCK;
1952 
1953  av_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
1954 
1955  if (sumscore > 6) return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
1956  else if (maxscore > 6) return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
1957  else return -1;
1958 }
1959 
1960 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
1961  (-1) if not available */
1962 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
1963  const uint8_t *packet)
1964 {
1965  int afc, len, flags;
1966  const uint8_t *p;
1967  unsigned int v;
1968 
1969  afc = (packet[3] >> 4) & 3;
1970  if (afc <= 1)
1971  return -1;
1972  p = packet + 4;
1973  len = p[0];
1974  p++;
1975  if (len == 0)
1976  return -1;
1977  flags = *p++;
1978  len--;
1979  if (!(flags & 0x10))
1980  return -1;
1981  if (len < 6)
1982  return -1;
1983  v = AV_RB32(p);
1984  *ppcr_high = ((int64_t)v << 1) | (p[4] >> 7);
1985  *ppcr_low = ((p[4] & 1) << 8) | p[5];
1986  return 0;
1987 }
1988 
1990 {
1991  MpegTSContext *ts = s->priv_data;
1992  AVIOContext *pb = s->pb;
1993  uint8_t buf[8*1024]={0};
1994  int len;
1995  int64_t pos;
1996 
1997  /* read the first 8192 bytes to get packet size */
1998  pos = avio_tell(pb);
1999  len = avio_read(pb, buf, sizeof(buf));
2000  ts->raw_packet_size = get_packet_size(buf, len);
2001  if (ts->raw_packet_size <= 0) {
2002  av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
2004  }
2005  ts->stream = s;
2006  ts->auto_guess = 0;
2007 
2008  if (s->iformat == &ff_mpegts_demuxer) {
2009  /* normal demux */
2010 
2011  /* first do a scan to get all the services */
2012  /* NOTE: We attempt to seek on non-seekable files as well, as the
2013  * probe buffer usually is big enough. Only warn if the seek failed
2014  * on files where the seek should work. */
2015  if (avio_seek(pb, pos, SEEK_SET) < 0)
2016  av_log(s, pb->seekable ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
2017 
2019 
2021 
2023  /* if could not find service, enable auto_guess */
2024 
2025  ts->auto_guess = 1;
2026 
2027  av_dlog(ts->stream, "tuning done\n");
2028 
2030  } else {
2031  AVStream *st;
2032  int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
2033  int64_t pcrs[2], pcr_h;
2034  int packet_count[2];
2035  uint8_t packet[TS_PACKET_SIZE];
2036 
2037  /* only read packets */
2038 
2039  st = avformat_new_stream(s, NULL);
2040  if (!st)
2041  goto fail;
2042  avpriv_set_pts_info(st, 60, 1, 27000000);
2045 
2046  /* we iterate until we find two PCRs to estimate the bitrate */
2047  pcr_pid = -1;
2048  nb_pcrs = 0;
2049  nb_packets = 0;
2050  for(;;) {
2051  ret = read_packet(s, packet, ts->raw_packet_size);
2052  if (ret < 0)
2053  return -1;
2054  pid = AV_RB16(packet + 1) & 0x1fff;
2055  if ((pcr_pid == -1 || pcr_pid == pid) &&
2056  parse_pcr(&pcr_h, &pcr_l, packet) == 0) {
2057  pcr_pid = pid;
2058  packet_count[nb_pcrs] = nb_packets;
2059  pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
2060  nb_pcrs++;
2061  if (nb_pcrs >= 2)
2062  break;
2063  }
2064  nb_packets++;
2065  }
2066 
2067  /* NOTE1: the bitrate is computed without the FEC */
2068  /* NOTE2: it is only the bitrate of the start of the stream */
2069  ts->pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]);
2070  ts->cur_pcr = pcrs[0] - ts->pcr_incr * packet_count[0];
2071  s->bit_rate = (TS_PACKET_SIZE * 8) * 27e6 / ts->pcr_incr;
2072  st->codec->bit_rate = s->bit_rate;
2073  st->start_time = ts->cur_pcr;
2074  av_dlog(ts->stream, "start=%0.3f pcr=%0.3f incr=%d\n",
2075  st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
2076  }
2077 
2078  avio_seek(pb, pos, SEEK_SET);
2079  return 0;
2080  fail:
2081  return -1;
2082 }
2083 
2084 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
2085 
2087  AVPacket *pkt)
2088 {
2089  MpegTSContext *ts = s->priv_data;
2090  int ret, i;
2091  int64_t pcr_h, next_pcr_h, pos;
2092  int pcr_l, next_pcr_l;
2093  uint8_t pcr_buf[12];
2094 
2095  if (av_new_packet(pkt, TS_PACKET_SIZE) < 0)
2096  return AVERROR(ENOMEM);
2097  pkt->pos= avio_tell(s->pb);
2098  ret = read_packet(s, pkt->data, ts->raw_packet_size);
2099  if (ret < 0) {
2100  av_free_packet(pkt);
2101  return ret;
2102  }
2103  if (ts->mpeg2ts_compute_pcr) {
2104  /* compute exact PCR for each packet */
2105  if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
2106  /* we read the next PCR (XXX: optimize it by using a bigger buffer */
2107  pos = avio_tell(s->pb);
2108  for(i = 0; i < MAX_PACKET_READAHEAD; i++) {
2109  avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
2110  avio_read(s->pb, pcr_buf, 12);
2111  if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
2112  /* XXX: not precise enough */
2113  ts->pcr_incr = ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
2114  (i + 1);
2115  break;
2116  }
2117  }
2118  avio_seek(s->pb, pos, SEEK_SET);
2119  /* no next PCR found: we use previous increment */
2120  ts->cur_pcr = pcr_h * 300 + pcr_l;
2121  }
2122  pkt->pts = ts->cur_pcr;
2123  pkt->duration = ts->pcr_incr;
2124  ts->cur_pcr += ts->pcr_incr;
2125  }
2126  pkt->stream_index = 0;
2127  return 0;
2128 }
2129 
2131  AVPacket *pkt)
2132 {
2133  MpegTSContext *ts = s->priv_data;
2134  int ret, i;
2135 
2136  pkt->size = -1;
2137  ts->pkt = pkt;
2138  ret = handle_packets(ts, 0);
2139  if (ret < 0) {
2140  av_free_packet(ts->pkt);
2141  /* flush pes data left */
2142  for (i = 0; i < NB_PID_MAX; i++) {
2143  if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
2144  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
2145  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
2146  new_pes_packet(pes, pkt);
2147  pes->state = MPEGTS_SKIP;
2148  ret = 0;
2149  break;
2150  }
2151  }
2152  }
2153  }
2154 
2155  if (!ret && pkt->size < 0)
2156  ret = AVERROR(EINTR);
2157  return ret;
2158 }
2159 
2160 static void mpegts_free(MpegTSContext *ts)
2161 {
2162  int i;
2163 
2164  clear_programs(ts);
2165 
2166  for(i=0;i<NB_PID_MAX;i++)
2167  if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
2168 }
2169 
2171 {
2172  MpegTSContext *ts = s->priv_data;
2173  mpegts_free(ts);
2174  return 0;
2175 }
2176 
2177 static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
2178  int64_t *ppos, int64_t pos_limit)
2179 {
2180  MpegTSContext *ts = s->priv_data;
2181  int64_t pos, timestamp;
2183  int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid;
2184  pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
2185  while(pos < pos_limit) {
2186  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
2187  return AV_NOPTS_VALUE;
2188  if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
2189  return AV_NOPTS_VALUE;
2190  if (buf[0] != 0x47) {
2191  if (mpegts_resync(s) < 0)
2192  return AV_NOPTS_VALUE;
2193  pos = avio_tell(s->pb);
2194  continue;
2195  }
2196  if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
2197  parse_pcr(&timestamp, &pcr_l, buf) == 0) {
2198  *ppos = pos;
2199  return timestamp;
2200  }
2201  pos += ts->raw_packet_size;
2202  }
2203 
2204  return AV_NOPTS_VALUE;
2205 }
2206 
2207 static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
2208  int64_t *ppos, int64_t pos_limit)
2209 {
2210  MpegTSContext *ts = s->priv_data;
2211  int64_t pos;
2212  pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
2214  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
2215  return AV_NOPTS_VALUE;
2216  while(pos < pos_limit) {
2217  int ret;
2218  AVPacket pkt;
2219  av_init_packet(&pkt);
2220  ret= av_read_frame(s, &pkt);
2221  if(ret < 0)
2222  return AV_NOPTS_VALUE;
2223  av_free_packet(&pkt);
2224  if(pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0){
2225  ff_reduce_index(s, pkt.stream_index);
2226  av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
2227  if(pkt.stream_index == stream_index){
2228  *ppos= pkt.pos;
2229  return pkt.dts;
2230  }
2231  }
2232  pos = pkt.pos;
2233  }
2234 
2235  return AV_NOPTS_VALUE;
2236 }
2237 
2238 /**************************************************************/
2239 /* parsing functions - called from other demuxers such as RTP */
2240 
2242 {
2243  MpegTSContext *ts;
2244 
2245  ts = av_mallocz(sizeof(MpegTSContext));
2246  if (!ts)
2247  return NULL;
2248  /* no stream case, currently used by RTP */
2250  ts->stream = s;
2251  ts->auto_guess = 1;
2254 
2255  return ts;
2256 }
2257 
2258 /* return the consumed length if a packet was output, or -1 if no
2259  packet is output */
2261  const uint8_t *buf, int len)
2262 {
2263  int len1;
2264 
2265  len1 = len;
2266  ts->pkt = pkt;
2267  for(;;) {
2268  ts->stop_parse = 0;
2269  if (len < TS_PACKET_SIZE)
2270  return -1;
2271  if (buf[0] != 0x47) {
2272  buf++;
2273  len--;
2274  } else {
2275  handle_packet(ts, buf);
2276  buf += TS_PACKET_SIZE;
2277  len -= TS_PACKET_SIZE;
2278  if (ts->stop_parse == 1)
2279  break;
2280  }
2281  }
2282  return len1 - len;
2283 }
2284 
2286 {
2287  mpegts_free(ts);
2288  av_free(ts);
2289 }
2290 
2291 AVInputFormat ff_mpegts_demuxer = {
2292  .name = "mpegts",
2293  .long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
2294  .priv_data_size = sizeof(MpegTSContext),
2299  .read_timestamp = mpegts_get_dts,
2301 };
2302 
2304  .name = "mpegtsraw",
2305  .long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
2306  .priv_data_size = sizeof(MpegTSContext),
2310  .read_timestamp = mpegts_get_dts,
2312  .priv_class = &mpegtsraw_class,
2313 };
const char * name
Definition: avisynth_c.h:675
static void mpegts_free(MpegTSContext *ts)
Definition: mpegts.c:2160
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
uint8_t last_sec_num
Definition: mpegts.c:468
#define SDT_PID
Definition: mpegts.h:37
struct PESContext PESContext
float v
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
int es_id
Definition: mpegts.c:78
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define PES_START_SIZE
Definition: mpegts.c:158
#define PMT_TID
Definition: mpegts.h:41
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
#define MP4ESDescrTag
Definition: isom.h:174
void av_free_packet(AVPacket *pkt)
Free a packet.
Definition: avpacket.c:242
int total_size
Definition: mpegts.c:174
static int mpegts_resync(AVFormatContext *s)
Definition: mpegts.c:1833
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
Definition: isom.c:407
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:275
AVOption.
Definition: opt.h:251
A dummy id pointing at the start of audio codecs.
int64_t cur_pcr
used to estimate the exact PCR
Definition: mpegts.c:109
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.
#define MAX_PACKET_READAHEAD
Definition: mpegts.c:2084
enum AVMediaType codec_type
Definition: mpegts.c:552
av_default_item_name
int64_t dts
Definition: mpegts.c:177
static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1095
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
Definition: mpegts.c:1730
int64_t pos
byte position in stream, -1 if unknown
static void clear_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:200
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
static void skip_bits_long(GetBitContext *s, int n)
Definition: get_bits.h:198
static int mpegts_probe(AVProbeData *p)
Definition: mpegts.c:1927
#define MP4ODescrTag
Definition: isom.h:172
int8_t crc_validity[NB_PID_MAX]
Definition: mpegts.c:127
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
int index
stream index in AVFormatContext
Definition: avformat.h:644
MpegTSPESFilter pes_filter
Definition: mpegts.c:82
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
uint8_t version
Definition: mpegts.c:466
Sinusoidal phase f
enum AVMediaType codec_type
Definition: rtp.c:36
#define AV_DISPOSITION_HEARING_IMPAIRED
stream for hearing impaired audiences
Definition: avformat.h:618
AVInputFormat ff_mpegts_demuxer
Definition: mpegts.c:2291
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1652
A dummy ID pointing at the start of various fake codecs.
void * priv_data
Definition: avformat.h:663
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
void * av_realloc(void *ptr, size_t size)
Allocate or reallocate a block of memory.
Definition: mem.c:141
#define AV_DISPOSITION_CLEAN_EFFECTS
stream without voice
Definition: avformat.h:620
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
#define M4OD_TID
Definition: mpegts.h:42
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:521
enum MpegTSFilterType type
Definition: mpegts.c:80
#define MAX_RESYNC_SIZE
Definition: mpegts.c:42
int pid
Definition: mpegts.c:163
struct Program * prg
Definition: mpegts.c:125
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:2130
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:595
int ctx_flags
Format-specific flags, see AVFMTCTX_xx.
Definition: avformat.h:980
int pcr_pid
if -1 then all packets containing PCR are considered
Definition: mpegts.c:164
int id
Definition: avformat.h:889
SLConfigDescr sl
Definition: mpegts.h:90
int packet_seq_num_len
Definition: mpegts.h:83
int es_id
Definition: mpegts.h:87
int inst_bitrate_len
Definition: mpegts.h:80
unsigned int nb_prg
structure to keep track of Program->pids mapping
Definition: mpegts.c:124
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
set threshold d
#define AVFMT_SHOW_IDS
Show format stream IDs numbers.
Definition: avformat.h:347
int last_cc
Definition: mpegts.c:79
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
Format I/O context.
Definition: avformat.h:944
unsigned int nb_stream_indexes
Definition: avformat.h:893
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:55
unsigned int pids[MAX_PIDS_PER_PROGRAM]
Definition: mpegts.c:91
Definition: mpegts.c:88
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
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...
static void write_section_data(AVFormatContext *s, 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:295
Public dictionary API.
static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
Definition: mpegts.c:742
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
Definition: mpegts.c:130
static int mpegts_read_header(AVFormatContext *s)
Definition: mpegts.c:1989
AVFormatContext * s
Definition: mpegts.c:1033
uint8_t bits
Definition: crc.c:216
uint8_t
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Definition: avformat.h:805
Opaque data information usually continuous.
Definition: avutil.h:145
enum MpegTSState state
Definition: mpegts.c:170
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:2207
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:914
AVOptions.
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:261
int au_seq_num_len
Definition: mpegts.h:82
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:610
int stop_parse
stop parsing loop
Definition: mpegts.c:114
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1109
static int discard_pid(MpegTSContext *ts, unsigned int pid)
discard_pid() decides if the pid is to be discarded according to caller&#39;s programs selection ...
Definition: mpegts.c:266
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:216
static int mpegts_push_data(MpegTSFilter *filter, const uint8_t *buf, int buf_size, int is_start, int64_t pos)
Definition: mpegts.c:809
int id
Format-specific stream ID.
Definition: avformat.h:650
enum AVStreamParseType need_parsing
Definition: avformat.h:811
int use_au_start
Definition: mpegts.h:70
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
int pmt_pid
Definition: avformat.h:897
AVStream ** streams
Definition: avformat.h:992
#define TS_PACKET_SIZE
Definition: mpegts.h:29
Mp4Descr * descr
Definition: mpegts.c:1035
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
Definition: mpegts.c:1064
uint8_t * data
AVProgram * av_new_program(AVFormatContext *s, int id)
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
MpegTSState
Definition: mpegts.c:149
uint32_t tag
Definition: movenc.c:894
#define AVERROR_EOF
End of file.
Definition: error.h:55
bitstream reader API header.
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
int pid
Definition: mpegts.c:77
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:891
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
Definition: mpegts.c:1007
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
#define PAT_TID
Definition: mpegts.h:40
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
Definition: mpegts.c:375
AVInputFormat ff_mpegtsraw_demuxer
Definition: mpegts.c:2303
static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int max_descr_count)
Definition: mpegts.c:1042
Discrete Time axis x
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:73
#define AVINDEX_KEYFRAME
Definition: avformat.h:599
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:557
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:326
enum AVCodecID codec_id
Definition: mpegts.c:553
AVBufferRef * buffer
Definition: mpegts.c:180
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
Definition: isom.c:432
AVCodecID
Identify the syntax and semantics of the bitstream.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
static const StreamType HDMV_types[]
Definition: mpegts.c:575
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:354
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:186
#define AV_RB16
static int mpegts_read_close(AVFormatContext *s)
Definition: mpegts.c:2170
unsigned int check_crc
Definition: mpegts.c:70
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:2086
union MpegTSFilter::@150 u
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int avcodec_is_open(AVCodecContext *s)
const char * r
Definition: vf_curves.c:94
unsigned int nb_programs
Definition: avformat.h:1050
preferred ID for decoding MPEG audio layer 1, 2 or 3
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
int pes_header_size
Definition: mpegts.c:175
void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
FFmpeg Automated Testing Environment ************************************Table of Contents *****************FFmpeg Automated Testing Environment Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass target exec to configure or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script tests fate sh from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at doc fate_config sh template Create a configuration that suits your based on the configuration template The slot configuration variable can be any string that is not yet used
Definition: fate.txt:34
#define TS_FEC_PACKET_SIZE
Definition: mpegts.h:27
enum AVCodecID codec_id
Definition: mov_chan.c:433
New fields can be added to the end with minor version bumps.
Definition: avformat.h:888
#define FFMAX(a, b)
Definition: common.h:56
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
Definition: mpeg.h:67
int timestamp_len
Definition: mpegts.h:77
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1127
int flags
copied to the AVPacket flags
Definition: mpegts.c:173
struct MpegTSPESFilter MpegTSPESFilter
int program_num
Definition: avformat.h:896
int size
#define MAX_SECTION_SIZE
Definition: mpegts.h:33
int pcr_incr
used to estimate the exact PCR
Definition: mpegts.c:110
int current_pid
Definition: mpegts.c:131
int flags
A combination of AV_PKT_FLAG values.
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
MpegTSContext * ff_mpegts_parse_open(AVFormatContext *s)
Definition: mpegts.c:2241
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:337
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
unsigned int nb_streams
A list of all streams in the file.
Definition: avformat.h:991
int ff_find_stream_index(AVFormatContext *s, int id)
Find stream index based on format-specific stream ID.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:117
int bit_rate
the average bitrate
int64_t ts_packet_pos
position of first TS packet of this PES packet
Definition: mpegts.c:178
SectionCallback * section_cb
Definition: mpegts.c:72
static const StreamType REGD_types[]
Definition: mpegts.c:596
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
Definition: mpegts.c:55
#define FFMIN(a, b)
Definition: common.h:58
static const StreamType MISC_types[]
Definition: mpegts.c:590
uint16_t id
Definition: mpegts.c:465
static void set_pcr_pid(AVFormatContext *s, unsigned int programid, unsigned int pid)
Definition: mpegts.c:247
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:1230
#define TS_DVHS_PACKET_SIZE
Definition: mpegts.h:28
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
AVStream * st
Definition: mpegts.c:168
#define MP4IODescrTag
Definition: isom.h:173
StreamType
Definition: ffserver.c:194
AVFormatContext * stream
Definition: mpegts.c:97
struct SectionHeader SectionHeader
int ocr_len
Definition: mpegts.h:78
static int handle_packets(MpegTSContext *ts, int nb_packets)
Definition: mpegts.c:1880
static int mpegts_set_stream_info(AVStream *st, PESContext *pes, uint32_t stream_type, uint32_t prog_reg_desc)
Definition: mpegts.c:636
#define AV_RL32
float u
AVDictionary * metadata
Definition: avformat.h:711
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
Definition: mpegts.c:1173
#define CHECK_COUNT
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1140
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
Definition: mpegts.c:107
static const AVClass mpegtsraw_class
Definition: mpegts.c:140
MpegTSSectionFilter section_filter
Definition: mpegts.c:83
#define CHECK_BLOCK
unsigned int probesize
decoding: size of data to probe; encoding: unused.
Definition: avformat.h:1039
static uint64_t get_ts64(GetBitContext *gb, int bits)
Definition: mpegts.c:735
int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
Definition: mpegts.c:2260
uint8_t sec_num
Definition: mpegts.c:467
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
int extended_stream_id
Definition: mpegts.c:176
preferred ID for MPEG-1/2 video decoding
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int stream_type
Definition: mpegts.c:165
int auto_guess
if true, all pids are analyzed to find streams
Definition: mpegts.c:104
int raw_packet_size
raw packet size, including FEC if present
Definition: mpegts.c:99
static const StreamType ISO_types[]
Definition: mpegts.c:556
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
int ts_id
Transport stream id.
Definition: avformat.h:1137
#define AV_DISPOSITION_VISUAL_IMPAIRED
stream for visual impaired audiences
Definition: avformat.h:619
Stream structure.
Definition: avformat.h:643
FAKE codec to indicate a MPEG-4 Systems stream (only used by libavformat)
for k
static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:2177
NULL
Definition: eval.c:55
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
#define TS_MAX_PACKET_SIZE
Definition: mpegts.h:30
uint8_t * dec_config_descr
Definition: mpegts.h:89
enum AVMediaType codec_type
unsigned int id
Definition: mpegts.c:89
#define MP4DecConfigDescrTag
Definition: isom.h:175
enum AVCodecID codec_id
AVBufferRef * av_buffer_alloc(int size)
Allocate an AVBuffer of the given size using av_malloc().
#define hex_dump_debug(class, buf, size)
AVIOContext * pb
I/O context.
Definition: avformat.h:977
int use_au_end
Definition: mpegts.h:71
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1073
uint8_t * data
The data buffer.
Definition: buffer.h:89
static void new_pes_packet(PESContext *pes, AVPacket *pkt)
Definition: mpegts.c:701
static int get_packet_size(const uint8_t *buf, int size)
Definition: mpegts.c:444
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> (&#39;D&#39;<<24) + (&#39;C&#39;<<16) + (&#39;B&#39;<<8) + &#39;A&#39;).
#define STREAM_TYPE_PRIVATE_DATA
Definition: mpeg.h:53
void * buf
Definition: avisynth_c.h:594
#define MAX_PES_HEADER_SIZE
Definition: mpegts.c:160
static int get8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:471
#define MAX_LEVEL
Definition: mpegts.c:1031
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:62
#define MAX_PIDS_PER_PROGRAM
Definition: mpegts.c:87
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
Definition: mpegts.c:1962
int use_timestamps
Definition: mpegts.h:74
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:265
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1436
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:282
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
AVMediaType
Definition: avutil.h:141
refcounted data buffer API
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
Definition: mpegts.c:398
static const StreamType DESC_types[]
Definition: mpegts.c:609
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
int use_idle
Definition: mpegts.h:75
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
SLConfigDescr sl
Definition: mpegts.c:181
#define type
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
int dec_config_descr_len
Definition: mpegts.h:88
uint8_t * section_buf
Definition: mpegts.c:69
uint8_t tid
Definition: mpegts.c:464
AVDictionary * metadata
Definition: avformat.h:894
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
static uint32_t state
Definition: trasher.c:27
static int flags
Definition: cpu.c:23
unsigned int end_of_section_reached
Definition: mpegts.c:71
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, const uint8_t **pp, const uint8_t *desc_list_end, Mp4Descr *mp4_descr, int mp4_descr_count, int pid, MpegTSContext *ts)
Parse an MPEG-2 descriptor.
Definition: mpegts.c:1307
static void clear_programs(MpegTSContext *ts)
Definition: mpegts.c:210
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
A reference to a data buffer.
Definition: buffer.h:81
static const AVOption options[]
Definition: mpegts.c:134
full parsing and repack
Definition: avformat.h:582
AVFormatContext * stream
Definition: mpegts.c:167
Main libavformat public API header.
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1590
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
Definition: isom.c:398
void ff_mpegts_parse_close(MpegTSContext *ts)
Definition: mpegts.c:2285
int use_rand_acc_pt
Definition: mpegts.h:72
int data_index
Definition: mpegts.c:172
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition: aviobuf.c:71
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
Definition: avformat.h:689
static double c[64]
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:700
uint8_t header[MAX_PES_HEADER_SIZE]
Definition: mpegts.c:179
first frame pointer p_end
Definition: stft_peak.m:15
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size)
Definition: mpegts.c:1853
#define MAX_PES_PAYLOAD
Definition: mpegts.c:44
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:56
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
struct AVInputFormat * iformat
Can only be iformat or oformat, not both at the same time.
Definition: avformat.h:957
PESCallback * pes_cb
Definition: mpegts.c:58
struct MpegTSContext MpegTSContext
Definition: mpegts.h:62
struct MpegTSSectionFilter MpegTSSectionFilter
static MpegTSFilter * mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, SectionCallback *section_cb, void *opaque, int check_crc)
Definition: mpegts.c:343
FAKE codec to indicate a raw MPEG-2 TS stream (only used by libavformat)
unsigned int nb_pids
Definition: mpegts.c:90
void * opaque
Definition: mpegts.c:59
static int get16(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:484
Mp4Descr * active_descr
Definition: mpegts.c:1036
AVPacket * pkt
packet containing Audio/Video data
Definition: mpegts.c:116
int len
#define PAT_PID
Definition: mpegts.h:36
void * priv_data
Format private data.
Definition: avformat.h:964
int pcr_pid
Definition: avformat.h:898
int64_t last_pos
to detect seek
Definition: mpegts.c:118
int timestamp_res
Definition: mpegts.h:76
static int analyze(const uint8_t *buf, int size, int packet_size, int *index)
Definition: mpegts.c:419
#define PES_HEADER_SIZE
Definition: mpegts.c:159
static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
Definition: mpegts.c:229
int64_t pts
Definition: mpegts.c:177
int use_padding
Definition: mpegts.h:73
void SetServiceCallback(void *opaque, int ret)
Definition: mpegts.c:64
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
int bit_rate
Decoding: total stream bitrate in bit/s, 0 if not available.
Definition: avformat.h:1016
#define AV_LOG_INFO
Definition: log.h:156
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
int degr_prior_len
Definition: mpegts.h:81
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1083
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1243
AVIOContext pb
Definition: mpegts.c:1034
MpegTSFilterType
Definition: mpegts.c:48
#define MAX_MP4_DESCR_COUNT
Definition: mpegts.c:46
#define MKTAG(a, b, c, d)
Definition: common.h:282
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:702
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
Definition: mpegts.c:618
int au_len
Definition: mpegts.h:79
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: avformat.h:834
This structure stores compressed data.
uint32_t stream_type
Definition: mpegts.c:551
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:499
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
A dummy ID pointing at the start of subtitle codecs.
#define FFMAX3(a, b, c)
Definition: common.h:57
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
#define av_unused
Definition: attributes.h:114
AVProgram ** programs
Definition: avformat.h:1051
#define MP4SLDescrTag
Definition: isom.h:177
#define NB_PID_MAX
Definition: mpegts.h:32
#define SDT_TID
Definition: mpegts.h:43
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
Definition: mpegts.c:62
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
Definition: mpegts.c:169
MpegTSContext * ts
Definition: mpegts.c:166
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:1217