mpeg.c
Go to the documentation of this file.
1 /*
2  * MPEG1/2 demuxer
3  * Copyright (c) 2000, 2001, 2002 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 "avformat.h"
23 #include "internal.h"
24 #include "mpeg.h"
25 
26 #if CONFIG_VOBSUB_DEMUXER
27 # include "subtitles.h"
28 # include "libavutil/bprint.h"
29 #endif
30 
31 #undef NDEBUG
32 #include <assert.h>
33 #include "libavutil/avassert.h"
34 
35 /*********************************************/
36 /* demux code */
37 
38 #define MAX_SYNC_SIZE 100000
39 
40 static int check_pes(const uint8_t *p, const uint8_t *end){
41  int pes1;
42  int pes2= (p[3] & 0xC0) == 0x80
43  && (p[4] & 0xC0) != 0x40
44  &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));
45 
46  for(p+=3; p<end && *p == 0xFF; p++);
47  if((*p&0xC0) == 0x40) p+=2;
48  if((*p&0xF0) == 0x20){
49  pes1= p[0]&p[2]&p[4]&1;
50  }else if((*p&0xF0) == 0x30){
51  pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1;
52  }else
53  pes1 = *p == 0x0F;
54 
55  return pes1||pes2;
56 }
57 
58 static int check_pack_header(const uint8_t *buf) {
59  return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
60 }
61 
62 static int mpegps_probe(AVProbeData *p)
63 {
64  uint32_t code= -1;
65  int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
66  int i;
67  int score=0;
68 
69  for(i=0; i<p->buf_size; i++){
70  code = (code<<8) + p->buf[i];
71  if ((code & 0xffffff00) == 0x100) {
72  int len= p->buf[i+1] << 8 | p->buf[i+2];
73  int pes= check_pes(p->buf+i, p->buf+p->buf_size);
74  int pack = check_pack_header(p->buf+i);
75 
76  if(code == SYSTEM_HEADER_START_CODE) sys++;
77  else if(code == PACK_START_CODE && pack) pspack++;
78  else if((code & 0xf0) == VIDEO_ID && pes) vid++;
79  // skip pes payload to avoid start code emulation for private
80  // and audio streams
81  else if((code & 0xe0) == AUDIO_ID && pes) {audio++; i+=len;}
82  else if(code == PRIVATE_STREAM_1 && pes) {priv1++; i+=len;}
83  else if(code == 0x1fd && pes) vid++; //VC1
84 
85  else if((code & 0xf0) == VIDEO_ID && !pes) invalid++;
86  else if((code & 0xe0) == AUDIO_ID && !pes) invalid++;
87  else if(code == PRIVATE_STREAM_1 && !pes) invalid++;
88  }
89  }
90 
91  if(vid+audio > invalid+1) /* invalid VDR files nd short PES streams */
92  score= AVPROBE_SCORE_MAX/4;
93 
94  if(sys>invalid && sys*9 <= pspack*10)
95  return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
96  if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
97  return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
98  if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */
99  return (audio > 12 || vid > 3 + 2*invalid) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4;
100 
101  //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
102  //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
103  //Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
104  return score;
105 }
106 
107 
108 typedef struct MpegDemuxContext {
110  unsigned char psm_es_type[256];
111  int sofdec;
112  int dvd;
114 #if CONFIG_VOBSUB_DEMUXER
115  AVFormatContext *sub_ctx;
117 #endif
119 
121 {
123  char buffer[7];
124  int64_t last_pos = avio_tell(s->pb);
125 
126  m->header_state = 0xff;
128 
129  avio_get_str(s->pb, 6, buffer, sizeof(buffer));
130  if (!memcmp("IMKH", buffer, 4)) {
131  m->imkh_cctv = 1;
132  } else if (!memcmp("Sofdec", buffer, 6)) {
133  m->sofdec = 1;
134  } else
135  avio_seek(s->pb, last_pos, SEEK_SET);
136 
137  /* no need to do more */
138  return 0;
139 }
140 
141 static int64_t get_pts(AVIOContext *pb, int c)
142 {
143  uint8_t buf[5];
144 
145  buf[0] = c<0 ? avio_r8(pb) : c;
146  avio_read(pb, buf+1, 4);
147 
148  return ff_parse_pes_pts(buf);
149 }
150 
151 static int find_next_start_code(AVIOContext *pb, int *size_ptr,
153 {
154  unsigned int state, v;
155  int val, n;
156 
157  state = *header_state;
158  n = *size_ptr;
159  while (n > 0) {
160  if (url_feof(pb))
161  break;
162  v = avio_r8(pb);
163  n--;
164  if (state == 0x000001) {
165  state = ((state << 8) | v) & 0xffffff;
166  val = state;
167  goto found;
168  }
169  state = ((state << 8) | v) & 0xffffff;
170  }
171  val = -1;
172  found:
173  *header_state = state;
174  *size_ptr = n;
175  return val;
176 }
177 
178 /**
179  * Extract stream types from a program stream map
180  * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
181  *
182  * @return number of bytes occupied by PSM in the bitstream
183  */
185 {
186  int psm_length, ps_info_length, es_map_length;
187 
188  psm_length = avio_rb16(pb);
189  avio_r8(pb);
190  avio_r8(pb);
191  ps_info_length = avio_rb16(pb);
192 
193  /* skip program_stream_info */
194  avio_skip(pb, ps_info_length);
195  es_map_length = avio_rb16(pb);
196 
197  /* at least one es available? */
198  while (es_map_length >= 4){
199  unsigned char type = avio_r8(pb);
200  unsigned char es_id = avio_r8(pb);
201  uint16_t es_info_length = avio_rb16(pb);
202  /* remember mapping from stream id to stream type */
203  m->psm_es_type[es_id] = type;
204  /* skip program_stream_info */
205  avio_skip(pb, es_info_length);
206  es_map_length -= 4 + es_info_length;
207  }
208  avio_rb32(pb); /* crc32 */
209  return 2 + psm_length;
210 }
211 
212 /* read the next PES header. Return its position in ppos
213  (if not NULL), and its start code, pts and dts.
214  */
216  int64_t *ppos, int *pstart_code,
217  int64_t *ppts, int64_t *pdts)
218 {
220  int len, size, startcode, c, flags, header_len;
221  int pes_ext, ext2_len, id_ext, skip;
222  int64_t pts, dts;
223  int64_t last_sync= avio_tell(s->pb);
224 
225  error_redo:
226  avio_seek(s->pb, last_sync, SEEK_SET);
227  redo:
228  /* next start code (should be immediately after) */
229  m->header_state = 0xff;
230  size = MAX_SYNC_SIZE;
231  startcode = find_next_start_code(s->pb, &size, &m->header_state);
232  last_sync = avio_tell(s->pb);
233  if (startcode < 0){
234  if(url_feof(s->pb))
235  return AVERROR_EOF;
236  //FIXME we should remember header_state
237  return AVERROR(EAGAIN);
238  }
239 
240  if (startcode == PACK_START_CODE)
241  goto redo;
242  if (startcode == SYSTEM_HEADER_START_CODE)
243  goto redo;
244  if (startcode == PADDING_STREAM) {
245  avio_skip(s->pb, avio_rb16(s->pb));
246  goto redo;
247  }
248  if (startcode == PRIVATE_STREAM_2) {
249  if (!m->sofdec) {
250  /* Need to detect whether this from a DVD or a 'Sofdec' stream */
251  int len = avio_rb16(s->pb);
252  int bytesread = 0;
253  uint8_t *ps2buf = av_malloc(len);
254 
255  if (ps2buf) {
256  bytesread = avio_read(s->pb, ps2buf, len);
257 
258  if (bytesread != len) {
259  avio_skip(s->pb, len - bytesread);
260  } else {
261  uint8_t *p = 0;
262  if (len >= 6)
263  p = memchr(ps2buf, 'S', len - 5);
264 
265  if (p)
266  m->sofdec = !memcmp(p+1, "ofdec", 5);
267 
268  m->sofdec -= !m->sofdec;
269 
270  if (m->sofdec < 0) {
271  if (len == 980 && ps2buf[0] == 0) {
272  /* PCI structure? */
273  uint32_t startpts = AV_RB32(ps2buf + 0x0d);
274  uint32_t endpts = AV_RB32(ps2buf + 0x11);
275  uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
276  uint8_t mins = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
277  uint8_t secs = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);
278 
279  m->dvd = (hours <= 23 &&
280  mins <= 59 &&
281  secs <= 59 &&
282  (ps2buf[0x19] & 0x0f) < 10 &&
283  (ps2buf[0x1a] & 0x0f) < 10 &&
284  (ps2buf[0x1b] & 0x0f) < 10 &&
285  endpts >= startpts);
286  } else if (len == 1018 && ps2buf[0] == 1) {
287  /* DSI structure? */
288  uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
289  uint8_t mins = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
290  uint8_t secs = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);
291 
292  m->dvd = (hours <= 23 &&
293  mins <= 59 &&
294  secs <= 59 &&
295  (ps2buf[0x1d] & 0x0f) < 10 &&
296  (ps2buf[0x1e] & 0x0f) < 10 &&
297  (ps2buf[0x1f] & 0x0f) < 10);
298  }
299  }
300  }
301 
302  av_free(ps2buf);
303 
304  /* If this isn't a DVD packet or no memory
305  * could be allocated, just ignore it.
306  * If we did, move back to the start of the
307  * packet (plus 'length' field) */
308  if (!m->dvd || avio_skip(s->pb, -(len + 2)) < 0) {
309  /* Skip back failed.
310  * This packet will be lost but that can't be helped
311  * if we can't skip back
312  */
313  goto redo;
314  }
315  } else {
316  /* No memory */
317  avio_skip(s->pb, len);
318  goto redo;
319  }
320  } else if (!m->dvd) {
321  int len = avio_rb16(s->pb);
322  avio_skip(s->pb, len);
323  goto redo;
324  }
325  }
326  if (startcode == PROGRAM_STREAM_MAP) {
327  mpegps_psm_parse(m, s->pb);
328  goto redo;
329  }
330 
331  /* find matching stream */
332  if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
333  (startcode >= 0x1e0 && startcode <= 0x1ef) ||
334  (startcode == 0x1bd) ||
335  (startcode == PRIVATE_STREAM_2) ||
336  (startcode == 0x1fd)))
337  goto redo;
338  if (ppos) {
339  *ppos = avio_tell(s->pb) - 4;
340  }
341  len = avio_rb16(s->pb);
342  pts =
343  dts = AV_NOPTS_VALUE;
344  if (startcode != PRIVATE_STREAM_2)
345  {
346  /* stuffing */
347  for(;;) {
348  if (len < 1)
349  goto error_redo;
350  c = avio_r8(s->pb);
351  len--;
352  /* XXX: for mpeg1, should test only bit 7 */
353  if (c != 0xff)
354  break;
355  }
356  if ((c & 0xc0) == 0x40) {
357  /* buffer scale & size */
358  avio_r8(s->pb);
359  c = avio_r8(s->pb);
360  len -= 2;
361  }
362  if ((c & 0xe0) == 0x20) {
363  dts = pts = get_pts(s->pb, c);
364  len -= 4;
365  if (c & 0x10){
366  dts = get_pts(s->pb, -1);
367  len -= 5;
368  }
369  } else if ((c & 0xc0) == 0x80) {
370  /* mpeg 2 PES */
371  flags = avio_r8(s->pb);
372  header_len = avio_r8(s->pb);
373  len -= 2;
374  if (header_len > len)
375  goto error_redo;
376  len -= header_len;
377  if (flags & 0x80) {
378  dts = pts = get_pts(s->pb, -1);
379  header_len -= 5;
380  if (flags & 0x40) {
381  dts = get_pts(s->pb, -1);
382  header_len -= 5;
383  }
384  }
385  if (flags & 0x3f && header_len == 0){
386  flags &= 0xC0;
387  av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n");
388  }
389  if (flags & 0x01) { /* PES extension */
390  pes_ext = avio_r8(s->pb);
391  header_len--;
392  /* Skip PES private data, program packet sequence counter and P-STD buffer */
393  skip = (pes_ext >> 4) & 0xb;
394  skip += skip & 0x9;
395  if (pes_ext & 0x40 || skip > header_len){
396  av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext);
397  pes_ext=skip=0;
398  }
399  avio_skip(s->pb, skip);
400  header_len -= skip;
401 
402  if (pes_ext & 0x01) { /* PES extension 2 */
403  ext2_len = avio_r8(s->pb);
404  header_len--;
405  if ((ext2_len & 0x7f) > 0) {
406  id_ext = avio_r8(s->pb);
407  if ((id_ext & 0x80) == 0)
408  startcode = ((startcode & 0xff) << 8) | id_ext;
409  header_len--;
410  }
411  }
412  }
413  if(header_len < 0)
414  goto error_redo;
415  avio_skip(s->pb, header_len);
416  }
417  else if( c!= 0xf )
418  goto redo;
419  }
420 
421  if (startcode == PRIVATE_STREAM_1) {
422  startcode = avio_r8(s->pb);
423  len--;
424  }
425  if(len<0)
426  goto error_redo;
427  if(dts != AV_NOPTS_VALUE && ppos){
428  int i;
429  for(i=0; i<s->nb_streams; i++){
430  if(startcode == s->streams[i]->id &&
431  s->pb->seekable /* index useless on streams anyway */) {
432  ff_reduce_index(s, i);
433  av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
434  }
435  }
436  }
437 
438  *pstart_code = startcode;
439  *ppts = pts;
440  *pdts = dts;
441  return len;
442 }
443 
445  AVPacket *pkt)
446 {
448  AVStream *st;
449  int len, startcode, i, es_type, ret;
450  int lpcm_header_len = -1; //Init to supress warning
451  int request_probe= 0;
453  enum AVMediaType type;
454  int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
455 
456  redo:
457  len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
458  if (len < 0)
459  return len;
460 
461  if (startcode >= 0x80 && startcode <= 0xcf) {
462  if(len < 4)
463  goto skip;
464 
465  /* audio: skip header */
466  avio_r8(s->pb);
467  lpcm_header_len = avio_rb16(s->pb);
468  len -= 3;
469  if (startcode >= 0xb0 && startcode <= 0xbf) {
470  /* MLP/TrueHD audio has a 4-byte header */
471  avio_r8(s->pb);
472  len--;
473  }
474  }
475 
476  /* now find stream */
477  for(i=0;i<s->nb_streams;i++) {
478  st = s->streams[i];
479  if (st->id == startcode)
480  goto found;
481  }
482 
483  es_type = m->psm_es_type[startcode & 0xff];
484  if(es_type == STREAM_TYPE_VIDEO_MPEG1){
485  codec_id = AV_CODEC_ID_MPEG2VIDEO;
486  type = AVMEDIA_TYPE_VIDEO;
487  } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
488  codec_id = AV_CODEC_ID_MPEG2VIDEO;
489  type = AVMEDIA_TYPE_VIDEO;
490  } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
491  es_type == STREAM_TYPE_AUDIO_MPEG2){
492  codec_id = AV_CODEC_ID_MP3;
493  type = AVMEDIA_TYPE_AUDIO;
494  } else if(es_type == STREAM_TYPE_AUDIO_AAC){
495  codec_id = AV_CODEC_ID_AAC;
496  type = AVMEDIA_TYPE_AUDIO;
497  } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
498  codec_id = AV_CODEC_ID_MPEG4;
499  type = AVMEDIA_TYPE_VIDEO;
500  } else if(es_type == STREAM_TYPE_VIDEO_H264){
501  codec_id = AV_CODEC_ID_H264;
502  type = AVMEDIA_TYPE_VIDEO;
503  } else if(es_type == STREAM_TYPE_AUDIO_AC3){
504  codec_id = AV_CODEC_ID_AC3;
505  type = AVMEDIA_TYPE_AUDIO;
506  } else if(m->imkh_cctv && es_type == 0x91){
507  codec_id = AV_CODEC_ID_PCM_MULAW;
508  type = AVMEDIA_TYPE_AUDIO;
509  } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
510  static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
511  unsigned char buf[8];
512  avio_read(s->pb, buf, 8);
513  avio_seek(s->pb, -8, SEEK_CUR);
514  if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
515  codec_id = AV_CODEC_ID_CAVS;
516  else
517  request_probe= 1;
518  type = AVMEDIA_TYPE_VIDEO;
519  } else if (startcode == PRIVATE_STREAM_2) {
520  type = AVMEDIA_TYPE_DATA;
521  codec_id = AV_CODEC_ID_DVD_NAV;
522  } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
523  type = AVMEDIA_TYPE_AUDIO;
524  codec_id = m->sofdec > 0 ? AV_CODEC_ID_ADPCM_ADX : AV_CODEC_ID_MP2;
525  } else if (startcode >= 0x80 && startcode <= 0x87) {
526  type = AVMEDIA_TYPE_AUDIO;
527  codec_id = AV_CODEC_ID_AC3;
528  } else if ( ( startcode >= 0x88 && startcode <= 0x8f)
529  ||( startcode >= 0x98 && startcode <= 0x9f)) {
530  /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
531  type = AVMEDIA_TYPE_AUDIO;
532  codec_id = AV_CODEC_ID_DTS;
533  } else if (startcode >= 0xa0 && startcode <= 0xaf) {
534  type = AVMEDIA_TYPE_AUDIO;
535  if(lpcm_header_len == 6) {
536  codec_id = AV_CODEC_ID_MLP;
537  } else {
538  /* 16 bit form will be handled as AV_CODEC_ID_PCM_S16BE */
539  codec_id = AV_CODEC_ID_PCM_DVD;
540  }
541  } else if (startcode >= 0xb0 && startcode <= 0xbf) {
542  type = AVMEDIA_TYPE_AUDIO;
543  codec_id = AV_CODEC_ID_TRUEHD;
544  } else if (startcode >= 0xc0 && startcode <= 0xcf) {
545  /* Used for both AC-3 and E-AC-3 in EVOB files */
546  type = AVMEDIA_TYPE_AUDIO;
547  codec_id = AV_CODEC_ID_AC3;
548  } else if (startcode >= 0x20 && startcode <= 0x3f) {
549  type = AVMEDIA_TYPE_SUBTITLE;
550  codec_id = AV_CODEC_ID_DVD_SUBTITLE;
551  } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
552  type = AVMEDIA_TYPE_VIDEO;
553  codec_id = AV_CODEC_ID_VC1;
554  } else {
555  skip:
556  /* skip packet */
557  avio_skip(s->pb, len);
558  goto redo;
559  }
560  /* no stream found: add a new stream */
561  st = avformat_new_stream(s, NULL);
562  if (!st)
563  goto skip;
564  st->id = startcode;
565  st->codec->codec_type = type;
566  st->codec->codec_id = codec_id;
567  if (st->codec->codec_id == AV_CODEC_ID_PCM_MULAW) {
568  st->codec->channels = 1;
570  st->codec->sample_rate = 8000;
571  }
572  st->request_probe = request_probe;
573  if (codec_id != AV_CODEC_ID_PCM_S16BE)
575  found:
576  if(st->discard >= AVDISCARD_ALL)
577  goto skip;
578  if (startcode >= 0xa0 && startcode <= 0xaf) {
579  if (lpcm_header_len == 6 && st->codec->codec_id == AV_CODEC_ID_MLP) {
580  if (len < 6)
581  goto skip;
582  avio_skip(s->pb, 6);
583  len -=6;
584  } else {
585  int b1, freq;
586 
587  /* for LPCM, we just skip the header and consider it is raw
588  audio data */
589  if (len <= 3)
590  goto skip;
591  avio_r8(s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
592  b1 = avio_r8(s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
593  avio_r8(s->pb); /* dynamic range control (0x80 = off) */
594  len -= 3;
595  freq = (b1 >> 4) & 3;
596  st->codec->sample_rate = lpcm_freq_tab[freq];
597  st->codec->channels = 1 + (b1 & 7);
598  st->codec->bits_per_coded_sample = 16 + ((b1 >> 6) & 3) * 4;
599  st->codec->bit_rate = st->codec->channels *
600  st->codec->sample_rate *
602  if (st->codec->bits_per_coded_sample == 16)
604  else if (st->codec->bits_per_coded_sample == 28)
605  return AVERROR(EINVAL);
606  }
607  }
608  ret = av_get_packet(s->pb, pkt, len);
609  pkt->pts = pts;
610  pkt->dts = dts;
611  pkt->pos = dummy_pos;
612  pkt->stream_index = st->index;
613  av_dlog(s, "%d: pts=%0.3f dts=%0.3f size=%d\n",
614  pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0,
615  pkt->size);
616 
617  return (ret < 0) ? ret : 0;
618 }
619 
620 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
621  int64_t *ppos, int64_t pos_limit)
622 {
623  int len, startcode;
624  int64_t pos, pts, dts;
625 
626  pos = *ppos;
627  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
628  return AV_NOPTS_VALUE;
629 
630  for(;;) {
631  len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
632  if (len < 0) {
633  av_dlog(s, "none (ret=%d)\n", len);
634  return AV_NOPTS_VALUE;
635  }
636  if (startcode == s->streams[stream_index]->id &&
637  dts != AV_NOPTS_VALUE) {
638  break;
639  }
640  avio_skip(s->pb, len);
641  }
642  av_dlog(s, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n",
643  pos, dts, dts / 90000.0);
644  *ppos = pos;
645  return dts;
646 }
647 
649  .name = "mpeg",
650  .long_name = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
651  .priv_data_size = sizeof(MpegDemuxContext),
655  .read_timestamp = mpegps_read_dts,
657 };
658 
659 #if CONFIG_VOBSUB_DEMUXER
660 
661 #define REF_STRING "# VobSub index file,"
662 
663 static int vobsub_probe(AVProbeData *p)
664 {
665  if (!strncmp(p->buf, REF_STRING, sizeof(REF_STRING) - 1))
666  return AVPROBE_SCORE_MAX;
667  return 0;
668 }
669 
670 static int vobsub_read_header(AVFormatContext *s)
671 {
672  int i, ret = 0, header_parsed = 0, langidx = 0;
673  MpegDemuxContext *vobsub = s->priv_data;
674  char *sub_name = NULL;
675  size_t fname_len;
676  char *ext, *header_str;
677  AVBPrint header;
678  int64_t delay = 0;
679  AVStream *st = NULL;
680 
681  sub_name = av_strdup(s->filename);
682  fname_len = strlen(sub_name);
683  ext = sub_name - 3 + fname_len;
684  if (fname_len < 4 || *(ext - 1) != '.') {
685  av_log(s, AV_LOG_ERROR, "The input index filename is too short "
686  "to guess the associated .SUB file\n");
687  ret = AVERROR_INVALIDDATA;
688  goto end;
689  }
690  memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
691  av_log(s, AV_LOG_VERBOSE, "IDX/SUB: %s -> %s\n", s->filename, sub_name);
692  ret = avformat_open_input(&vobsub->sub_ctx, sub_name, &ff_mpegps_demuxer, NULL);
693  if (ret < 0) {
694  av_log(s, AV_LOG_ERROR, "Unable to open %s as MPEG subtitles\n", sub_name);
695  goto end;
696  }
697 
699  while (!url_feof(s->pb)) {
700  char line[2048];
701  int len = ff_get_line(s->pb, line, sizeof(line));
702 
703  if (!len)
704  break;
705 
706  line[strcspn(line, "\r\n")] = 0;
707 
708  if (!strncmp(line, "id:", 3)) {
709  int n, stream_id = 0;
710  char id[64] = {0};
711 
712  n = sscanf(line, "id: %63[^,], index: %u", id, &stream_id);
713  if (n != 2) {
714  av_log(s, AV_LOG_WARNING, "Unable to parse index line '%s', "
715  "assuming 'id: und, index: 0'\n", line);
716  strcpy(id, "und");
717  stream_id = 0;
718  }
719 
720  st = avformat_new_stream(s, NULL);
721  if (!st) {
722  ret = AVERROR(ENOMEM);
723  goto end;
724  }
725  st->id = stream_id;
728  av_dict_set(&st->metadata, "language", id, 0);
729  av_log(s, AV_LOG_DEBUG, "IDX stream[%d] id=%s\n", stream_id, id);
730  header_parsed = 1;
731 
732  } else if (st && !strncmp(line, "timestamp:", 10)) {
733  AVPacket *sub;
734  int hh, mm, ss, ms;
735  int64_t pos, timestamp;
736  const char *p = line + 10;
737 
738  if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"SCNx64,
739  &hh, &mm, &ss, &ms, &pos) != 5) {
740  av_log(s, AV_LOG_ERROR, "Unable to parse timestamp line '%s', "
741  "abort parsing\n", line);
742  break;
743  }
744  timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
745  timestamp = av_rescale_q(timestamp, (AVRational){1,1000}, st->time_base);
746 
747  sub = ff_subtitles_queue_insert(&vobsub->q, "", 0, 0);
748  if (!sub) {
749  ret = AVERROR(ENOMEM);
750  goto end;
751  }
752  sub->pos = pos;
753  sub->pts = timestamp;
754  sub->stream_index = s->nb_streams - 1;
755 
756  } else if (st && !strncmp(line, "alt:", 4)) {
757  const char *p = line + 4;
758 
759  while (*p == ' ')
760  p++;
761  av_dict_set(&st->metadata, "title", p, 0);
762  av_log(s, AV_LOG_DEBUG, "IDX stream[%d] name=%s\n", st->id, p);
763  header_parsed = 1;
764 
765  } else if (!strncmp(line, "delay:", 6)) {
766  int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
767  const char *p = line + 6;
768 
769  while (*p == ' ')
770  p++;
771  if (*p == '-' || *p == '+') {
772  sign = *p == '-' ? -1 : 1;
773  p++;
774  }
775  sscanf(p, "%d:%d:%d:%d", &hh, &mm, &ss, &ms);
776  delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
777 
778  } else if (!strncmp(line, "langidx:", 8)) {
779  const char *p = line + 8;
780 
781  if (sscanf(p, "%d", &langidx) != 1)
782  av_log(s, AV_LOG_ERROR, "Invalid langidx specified\n");
783 
784  } else if (!header_parsed) {
785  if (line[0] && line[0] != '#')
786  av_bprintf(&header, "%s\n", line);
787  }
788  }
789 
790  if (langidx < s->nb_streams)
792 
793  ff_subtitles_queue_finalize(&vobsub->q);
794 
795  if (!av_bprint_is_complete(&header)) {
796  av_bprint_finalize(&header, NULL);
797  ret = AVERROR(ENOMEM);
798  goto end;
799  }
800  av_bprint_finalize(&header, &header_str);
801  for (i = 0; i < s->nb_streams; i++) {
802  AVStream *sub_st = s->streams[i];
803  sub_st->codec->extradata = av_strdup(header_str);
804  sub_st->codec->extradata_size = header.len;
805  }
806  av_free(header_str);
807 
808 end:
809  av_free(sub_name);
810  return ret;
811 }
812 
813 #define FAIL(r) do { ret = r; goto fail; } while (0)
814 
815 static int vobsub_read_packet(AVFormatContext *s, AVPacket *pkt)
816 {
817  MpegDemuxContext *vobsub = s->priv_data;
818  FFDemuxSubtitlesQueue *q = &vobsub->q;
819  AVIOContext *pb = vobsub->sub_ctx->pb;
820  int ret, psize, len16 = -1;
821  AVPacket idx_pkt;
822 
823  ret = ff_subtitles_queue_read_packet(q, &idx_pkt);
824  if (ret < 0)
825  return ret;
826 
827  /* compute maximum packet size using the next packet position. This is
828  * useful when the len in the header is non-sense */
829  if (q->current_sub_idx < q->nb_subs) {
830  psize = q->subs[q->current_sub_idx].pos - idx_pkt.pos;
831  } else {
832  int64_t fsize = avio_size(pb);
833  psize = fsize < 0 ? 0xffff : fsize - idx_pkt.pos;
834  }
835 
836  avio_seek(pb, idx_pkt.pos, SEEK_SET);
837 
838  av_init_packet(pkt);
839  pkt->size = 0;
840  pkt->data = NULL;
841 
842  do {
843  int n, to_read, startcode;
844  int64_t pts, dts;
845 
846  ret = mpegps_read_pes_header(vobsub->sub_ctx, NULL, &startcode, &pts, &dts);
847  if (ret < 0)
848  FAIL(ret);
849  to_read = ret & 0xffff;
850 
851  /* this prevents reads above the current packet */
852  if (pkt->size + to_read > psize)
853  break;
854 
855  /* if the len is computed, we check for overread */
856  if (len16 != -1 && pkt->size + to_read > len16)
857  break;
858 
859  /* the current chunk doesn't match the stream index (unlikely) */
860  if ((startcode & 0x1f) != idx_pkt.stream_index)
861  break;
862 
863  ret = av_grow_packet(pkt, to_read);
864  if (ret < 0)
865  FAIL(ret);
866 
867  n = avio_read(pb, pkt->data + (pkt->size - to_read), to_read);
868  if (n < to_read)
869  pkt->size -= to_read - n;
870 
871  /* first chunk contains the total len of the packet to raise */
872  if (len16 == -1 && n > 2)
873  len16 = AV_RB16(pkt->data);
874  } while (len16 != -1 && pkt->size != len16);
875 
876  pkt->pts = pkt->dts = idx_pkt.pts;
877  pkt->pos = idx_pkt.pos;
878  pkt->stream_index = idx_pkt.stream_index;
879 
880  av_free_packet(&idx_pkt);
881  return 0;
882 
883 fail:
884  av_free_packet(&idx_pkt);
885  return ret;
886 }
887 
888 static int vobsub_read_seek(AVFormatContext *s, int stream_index,
889  int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
890 {
891  MpegDemuxContext *vobsub = s->priv_data;
892  return ff_subtitles_queue_seek(&vobsub->q, s, stream_index,
893  min_ts, ts, max_ts, flags);
894 }
895 
896 static int vobsub_read_close(AVFormatContext *s)
897 {
898  MpegDemuxContext *vobsub = s->priv_data;
899  ff_subtitles_queue_clean(&vobsub->q);
900  if (vobsub->sub_ctx)
901  avformat_close_input(&vobsub->sub_ctx);
902  return 0;
903 }
904 
905 AVInputFormat ff_vobsub_demuxer = {
906  .name = "vobsub",
907  .long_name = NULL_IF_CONFIG_SMALL("VobSub subtitle format"),
908  .priv_data_size = sizeof(MpegDemuxContext),
909  .read_probe = vobsub_probe,
910  .read_header = vobsub_read_header,
911  .read_packet = vobsub_read_packet,
912  .read_seek2 = vobsub_read_seek,
913  .read_close = vobsub_read_close,
915  .extensions = "idx",
916 };
917 #endif
float v
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:261
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:93
void av_free_packet(AVPacket *pkt)
Free a packet.
Definition: avpacket.c:242
#define STREAM_TYPE_AUDIO_MPEG2
Definition: mpeg.h:51
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.
int64_t pos
byte position in stream, -1 if unknown
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
#define VIDEO_ID
Definition: mpeg.h:42
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
#define MAX_SYNC_SIZE
Definition: mpeg.c:38
static const int lpcm_freq_tab[4]
Definition: mpeg.h:62
int index
stream index in AVFormatContext
Definition: avformat.h:644
#define PACK_START_CODE
Definition: mpeg.h:28
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
Definition: subtitles.c:134
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
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)
static int mpegps_read_pes_header(AVFormatContext *s, int64_t *ppos, int *pstart_code, int64_t *ppts, int64_t *pdts)
Definition: mpeg.c:215
#define STREAM_TYPE_VIDEO_MPEG1
Definition: mpeg.h:48
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:595
int ctx_flags
Format-specific flags, see AVFMTCTX_xx.
Definition: avformat.h:980
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, int len, int merge)
Insert a new subtitle event.
Definition: subtitles.c:26
static int mpegps_read_header(AVFormatContext *s)
Definition: mpeg.c:120
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:193
#define AVFMT_SHOW_IDS
Show format stream IDs numbers.
Definition: avformat.h:347
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
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...
uint8_t
Opaque data information usually continuous.
Definition: avutil.h:145
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:914
window constants for m
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
Definition: subtitles.c:82
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:610
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
enum AVStreamParseType need_parsing
Definition: avformat.h:811
int id
Format-specific stream ID.
Definition: avformat.h:650
end end
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.
AVStream ** streams
Definition: avformat.h:992
#define SYSTEM_HEADER_START_CODE
Definition: mpeg.h:29
uint8_t * data
#define AVERROR_EOF
End of file.
Definition: error.h:55
#define PRIVATE_STREAM_1
Definition: mpeg.h:37
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpeg.c:620
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
#define STREAM_TYPE_AUDIO_AAC
Definition: mpeg.h:54
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:130
#define AVINDEX_KEYFRAME
Definition: avformat.h:599
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
#define PRIVATE_STREAM_2
Definition: mpeg.h:39
#define AV_BPRINT_SIZE_UNLIMITED
Convenience macros for special values for av_bprint_init() size_max parameter.
Definition: bprint.h:89
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:354
#define AV_RB16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int check_pack_header(const uint8_t *buf)
Definition: mpeg.c:58
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Init a print buffer.
Definition: bprint.c:68
static int av_bprint_is_complete(AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:166
preferred ID for decoding MPEG audio layer 1, 2 or 3
#define PADDING_STREAM
Definition: mpeg.h:38
Definition: graph2dot.c:48
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
enum AVCodecID codec_id
Definition: mov_chan.c:433
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
Definition: mpeg.h:67
int size
uint64_t channel_layout
Audio channel layout.
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
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
unsigned int nb_streams
A list of all streams in the file.
Definition: avformat.h:991
#define AV_LOG_VERBOSE
Definition: log.h:157
Buffer to print data progressively.
Definition: bprint.h:75
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
char filename[1024]
input or output filename
Definition: avformat.h:994
#define STREAM_TYPE_VIDEO_H264
Definition: mpeg.h:56
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
static int find_next_start_code(AVIOContext *pb, int *size_ptr, int32_t *header_state)
Definition: mpeg.c:151
static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
Extract stream types from a program stream map According to ISO/IEC 13818-1 (&#39;MPEG-2 Systems&#39;) table ...
Definition: mpeg.c:184
int32_t
void ff_subtitles_queue_finalize(FFDemuxSubtitlesQueue *q)
Set missing durations and sort subtitles by PTS, and then byte position.
Definition: subtitles.c:72
#define AUDIO_ID
Definition: mpeg.h:41
AVDictionary * metadata
Definition: avformat.h:711
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
Definition: aviobuf.c:618
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
preferred ID for MPEG-1/2 video decoding
#define STREAM_TYPE_VIDEO_MPEG4
Definition: mpeg.h:55
unsigned char psm_es_type[256]
Definition: mpeg.c:110
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
int imkh_cctv
Definition: mpeg.c:113
int32_t header_state
Definition: mpeg.c:109
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 AV_DISPOSITION_DEFAULT
Definition: avformat.h:605
int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Update current_sub_idx to emulate a seek.
Definition: subtitles.c:95
enum AVMediaType codec_type
enum AVCodecID codec_id
char * av_strdup(const char *s)
Duplicate the string s.
Definition: mem.c:220
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
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
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
synthesis window for stochastic i
rational number numerator/denominator
Definition: rational.h:43
#define PROGRAM_STREAM_MAP
Definition: mpeg.h:36
AVMediaType
Definition: avutil.h:141
#define STREAM_TYPE_AUDIO_AC3
Definition: mpeg.h:59
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
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
#define type
#define FAIL(ERR)
static int64_t get_pts(AVIOContext *pb, int c)
Definition: mpeg.c:141
static uint32_t state
Definition: trasher.c:27
static int flags
Definition: cpu.c:23
static int mpegps_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpeg.c:444
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
full parsing and repack
Definition: avformat.h:582
Main libavformat public API header.
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip please avoid problems through this extra level of scrutiny For cosmetics only commits you should e g by running git config global user name My Name git config global user email my email invalid(--global to set the global configuration for all your git checkouts).Git will select the changes to the files for commit.Optionally you can use the interactive or the patch mode to select hunk by hunk what should be added to the commit.git commit Git will commit the selected changes to your current local branch.You will be prompted for a log message in an editor
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
static double c[64]
AVPacket * subs
array of subtitles packets
Definition: subtitles.h:29
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:700
struct MpegDemuxContext MpegDemuxContext
the buffer and buffer reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
Definition: avpacket.c:105
int current_sub_idx
current position for the read packet callback
Definition: subtitles.h:32
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:56
static int check_pes(const uint8_t *p, const uint8_t *end)
Definition: mpeg.c:40
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
int len
int channels
number of audio channels
#define STREAM_TYPE_VIDEO_MPEG2
Definition: mpeg.h:49
void * priv_data
Format private data.
Definition: avformat.h:964
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
Definition: aviobuf.c:633
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avformat.h:679
#define AV_CH_LAYOUT_MONO
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:702
#define STREAM_TYPE_AUDIO_MPEG1
Definition: mpeg.h:50
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.
int nb_subs
number of subtitles packets
Definition: subtitles.h:30
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
AVInputFormat ff_mpegps_demuxer
Definition: mpeg.c:648
static int mpegps_probe(AVProbeData *p)
Definition: mpeg.c:62