1 /*
2 * MPEG-1/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
26
27 #if CONFIG_VOBSUB_DEMUXER
31 #endif
32
34
35 /*********************************************/
36 /* demux code */
37
38 #define MAX_SYNC_SIZE 100000
39
41 {
42 int pes1;
43 int pes2 = (p[3] & 0xC0) == 0x80 &&
44 (p[4] & 0xC0) != 0x40 &&
45 ((p[4] & 0xC0) == 0x00 ||
46 (p[4] & 0xC0) >> 2 == (p[6] & 0xF0));
47
48 for (p += 3; p < end && *p == 0xFF; p++) ;
49 if ((*p & 0xC0) == 0x40)
50 p += 2;
51
52 if ((*p & 0xF0) == 0x20)
53 pes1 = p[0] & p[2] & p[4] & 1;
54 else if ((*p & 0xF0) == 0x30)
55 pes1 = p[0] & p[2] & p[4] & p[5] & p[7] & p[9] & 1;
56 else
57 pes1 = *p == 0x0F;
58
59 return pes1 || pes2;
60 }
61
63 {
64 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
65 }
66
68 {
69 uint32_t code = -1;
70 int i;
71 int sys = 0, pspack = 0, priv1 = 0, vid = 0;
72 int audio = 0, invalid = 0, score = 0;
73 int endpes = 0;
74
76 code = (code << 8) + p->
buf[i];
77 if ((code & 0xffffff00) == 0x100) {
78 int len = p->
buf[i + 1] << 8 | p->
buf[i + 2];
81
83 sys++;
85 pspack++;
86 else if ((code & 0xf0) ==
VIDEO_ID && pes) {
88 vid++;
89 }
90 // skip pes payload to avoid start code emulation for private
91 // and audio streams
92 else if ((code & 0xe0) ==
AUDIO_ID && pes) {audio++; i+=
len;}
94 else if (code == 0x1fd && pes) vid++; //VC1
95
96 else if ((code & 0xf0) ==
VIDEO_ID && !pes) invalid++;
97 else if ((code & 0xe0) ==
AUDIO_ID && !pes) invalid++;
99 }
100 }
101
102 if (vid + audio > invalid + 1) /* invalid VDR files nd short PES streams */
104
105 // av_log(NULL, AV_LOG_ERROR, "vid:%d aud:%d sys:%d pspack:%d invalid:%d size:%d \n",
106 // vid, audio, sys, pspack, invalid, p->buf_size);
107
108 if (sys > invalid && sys * 9 <= pspack * 10)
111 if (pspack > invalid && (priv1 + vid + audio) * 10 >= pspack * 9)
114 if ((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys &&
115 !pspack && p->
buf_size > 2048 && vid + audio > invalid)
/* PES stream */
118
119 // 02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
120 // mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
121 // Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
122 return score;
123 }
124
133 #if CONFIG_VOBSUB_DEMUXER
136 char *sub_name;
137 #endif
139
141 {
145
148
150 if (!memcmp("IMKH", buffer, 4)) {
152 } else if (!memcmp("Sofdec", buffer, 6)) {
154 } else
156
157 /* no need to do more */
158 return 0;
159 }
160
162 {
164
167
169 }
170
173 {
174 unsigned int state, v;
176
177 state = *header_state;
178 n = *size_ptr;
179 while (n > 0) {
181 break;
183 n--;
184 if (state == 0x000001) {
185 state = ((state << 8) | v) & 0xffffff;
187 goto found;
188 }
189 state = ((state << 8) | v) & 0xffffff;
190 }
191 val = -1;
192
193 found:
194 *header_state =
state;
197 }
198
199 /**
200 * Extract stream types from a program stream map
201 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
202 *
203 * @return number of bytes occupied by PSM in the bitstream
204 */
206 {
207 int psm_length, ps_info_length, es_map_length;
208
213
214 /* skip program_stream_info */
217 /* Ignore es_map_length, trust psm_length */
218 es_map_length = psm_length - ps_info_length - 10;
219
220 /* at least one es available? */
221 while (es_map_length >= 4) {
223 unsigned char es_id =
avio_r8(pb);
225
226 /* remember mapping from stream id to stream type */
228 /* skip program_stream_info */
230 es_map_length -= 4 + es_info_length;
231 }
233 return 2 + psm_length;
234 }
235
236 /* read the next PES header. Return its position in ppos
237 * (if not NULL), and its start code, pts and dts.
238 */
240 int64_t *ppos, int *pstart_code,
241 int64_t *ppts, int64_t *pdts)
242 {
245 int pes_ext, ext2_len, id_ext, skip;
248
249 error_redo:
251 redo:
252 /* next start code (should be immediately after) */
257 if (startcode < 0) {
260 // FIXME we should remember header_state
262 }
263
265 goto redo;
267 goto redo;
270 goto redo;
271 }
274 /* Need to detect whether this from a DVD or a 'Sofdec' stream */
276 int bytesread = 0;
278
279 if (ps2buf) {
281
282 if (bytesread != len) {
284 } else {
286 if (len >= 6)
287 p = memchr(ps2buf, 'S', len - 5);
288
289 if (p)
290 m->
sofdec = !memcmp(p+1,
"ofdec", 5);
291
293
295 if (len == 980 && ps2buf[0] == 0) {
296 /* PCI structure? */
297 uint32_t startpts =
AV_RB32(ps2buf + 0x0d);
298 uint32_t endpts =
AV_RB32(ps2buf + 0x11);
299 uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
300 uint8_t mins = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
301 uint8_t secs = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);
302
303 m->
dvd = (hours <= 23 &&
304 mins <= 59 &&
305 secs <= 59 &&
306 (ps2buf[0x19] & 0x0f) < 10 &&
307 (ps2buf[0x1a] & 0x0f) < 10 &&
308 (ps2buf[0x1b] & 0x0f) < 10 &&
309 endpts >= startpts);
310 } else if (len == 1018 && ps2buf[0] == 1) {
311 /* DSI structure? */
312 uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
313 uint8_t mins = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
314 uint8_t secs = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);
315
316 m->
dvd = (hours <= 23 &&
317 mins <= 59 &&
318 secs <= 59 &&
319 (ps2buf[0x1d] & 0x0f) < 10 &&
320 (ps2buf[0x1e] & 0x0f) < 10 &&
321 (ps2buf[0x1f] & 0x0f) < 10);
322 }
323 }
324 }
325
327
328 /* If this isn't a DVD packet or no memory
329 * could be allocated, just ignore it.
330 * If we did, move back to the start of the
331 * packet (plus 'length' field) */
333 /* Skip back failed.
334 * This packet will be lost but that can't be helped
335 * if we can't skip back
336 */
337 goto redo;
338 }
339 } else {
340 /* No memory */
342 goto redo;
343 }
344 }
else if (!m->
dvd) {
347 goto redo;
348 }
349 }
352 goto redo;
353 }
354
355 /* find matching stream */
356 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
357 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
358 (startcode == 0x1bd) ||
360 (startcode == 0x1fd)))
361 goto redo;
362 if (ppos) {
364 }
366 pts =
369 {
370 /* stuffing */
371 for (;;) {
372 if (len < 1)
373 goto error_redo;
375 len--;
376 /* XXX: for MPEG-1, should test only bit 7 */
377 if (c != 0xff)
378 break;
379 }
380 if ((c & 0xc0) == 0x40) {
381 /* buffer scale & size */
384 len -= 2;
385 }
386 if ((c & 0xe0) == 0x20) {
387 dts =
389 len -= 4;
390 if (c & 0x10) {
392 len -= 5;
393 }
394 } else if ((c & 0xc0) == 0x80) {
395 /* mpeg 2 PES */
398 len -= 2;
399 if (header_len > len)
400 goto error_redo;
401 len -= header_len;
402 if (flags & 0x80) {
404 header_len -= 5;
405 if (flags & 0x40) {
407 header_len -= 5;
408 }
409 }
410 if (flags & 0x3f && header_len == 0) {
411 flags &= 0xC0;
413 }
414 if (flags & 0x01) { /* PES extension */
416 header_len--;
417 /* Skip PES private data, program packet sequence counter
418 * and P-STD buffer */
419 skip = (pes_ext >> 4) & 0xb;
420 skip += skip & 0x9;
421 if (pes_ext & 0x40 || skip > header_len) {
423 pes_ext = skip = 0;
424 }
426 header_len -= skip;
427
428 if (pes_ext & 0x01) { /* PES extension 2 */
430 header_len--;
431 if ((ext2_len & 0x7f) > 0) {
433 if ((id_ext & 0x80) == 0)
434 startcode = ((startcode & 0xff) << 8) | id_ext;
435 header_len--;
436 }
437 }
438 }
439 if (header_len < 0)
440 goto error_redo;
442 } else if (c != 0xf)
443 goto redo;
444 }
445
448
449 if (ret < 0)
450 return ret;
451
454 if (startcode == 0x0b) {
456 startcode = 0x80;
459 } else {
461 }
462 } else {
463 len--;
464 }
465 }
466 if (len < 0)
467 goto error_redo;
469 int i;
476 }
477 }
478 }
479
480 *pstart_code = startcode;
482 *pdts = dts;
484 }
485
488 {
491 int len, startcode, i, es_type, ret;
492 int lpcm_header_len = -1; //Init to suppress warning
493 int request_probe= 0;
496 int64_t
pts, dts, dummy_pos;
// dummy_pos is needed for the index building to work
497
498 redo:
500 if (len < 0)
502
503 if (startcode >= 0x80 && startcode <= 0xcf) {
504 if (len < 4)
505 goto skip;
506
508 /* audio: skip header */
511 len -= 3;
512 if (startcode >= 0xb0 && startcode <= 0xbf) {
513 /* MLP/TrueHD audio has a 4-byte header */
515 len--;
516 }
517 }
518 }
519
520 /* now find stream */
523 if (st->
id == startcode)
524 goto found;
525 }
526
550 }
else if (m->
imkh_cctv && es_type == 0x91) {
553 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
554 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
555 unsigned char buf[8];
556
559 if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
561 else
562 request_probe= 1;
567 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
571 // Auto-detect AC-3
572 request_probe = 50;
573 }
else if (m->
imkh_cctv && startcode == 0x1c0 && len > 80) {
575 request_probe = 50;
576 } else {
579 request_probe = 25;
580 }
581 } else if (startcode >= 0x80 && startcode <= 0x87) {
584 } else if ((startcode >= 0x88 && startcode <= 0x8f) ||
585 (startcode >= 0x98 && startcode <= 0x9f)) {
586 /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
589 } else if (startcode >= 0xa0 && startcode <= 0xaf) {
591 if (lpcm_header_len >= 6 && startcode == 0xa1) {
593 } else {
595 }
596 } else if (startcode >= 0xb0 && startcode <= 0xbf) {
599 } else if (startcode >= 0xc0 && startcode <= 0xcf) {
600 /* Used for both AC-3 and E-AC-3 in EVOB files */
603 } else if (startcode >= 0x20 && startcode <= 0x3f) {
606 } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
609 } else {
610 skip:
611 /* skip packet */
613 goto redo;
614 }
615 /* no stream found: add a new stream */
617 if (!st)
618 goto skip;
627 }
630
631 found:
633 goto skip;
634 if (startcode >= 0xa0 && startcode <= 0xaf) {
636 if (len < 6)
637 goto skip;
639 len -=6;
640 }
641 }
643
646 pkt->
pos = dummy_pos;
648
653
654 return (ret < 0) ? ret : 0;
655 }
656
658 int64_t *ppos, int64_t pos_limit)
659 {
661 int64_t pos,
pts, dts;
662
663 pos = *ppos;
666
667 for (;;) {
669 if (len < 0) {
673 }
674 if (startcode == s->
streams[stream_index]->
id &&
676 break;
677 }
679 }
682 pos, dts, dts / 90000.0);
683 *ppos = pos;
684 return dts;
685 }
686
696 };
697
698 #if CONFIG_VOBSUB_DEMUXER
699
700 #define REF_STRING "# VobSub index file,"
701 #define MAX_LINE_SIZE 2048
702
704 {
705 if (!strncmp(p->
buf, REF_STRING,
sizeof(REF_STRING) - 1))
707 return 0;
708 }
709
711 {
712 int i, ret = 0, header_parsed = 0, langidx = 0;
714 size_t fname_len;
715 char *header_str;
717 int64_t delay = 0;
719 int stream_id = -1;
720 char id[64] = {0};
723
724 if (!vobsub->sub_name) {
725 char *ext;
727 if (!vobsub->sub_name) {
730 }
731
732 fname_len = strlen(vobsub->sub_name);
733 ext = vobsub->sub_name - 3 + fname_len;
734 if (fname_len < 4 || *(ext - 1) != '.') {
736 "to guess the associated .SUB file\n");
739 }
740 memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
742 }
743
747 }
748
750 if (!vobsub->sub_ctx) {
753 }
754
757
759 if (ret < 0) {
762 }
763
768
769 if (!len)
770 break;
771
772 line[strcspn(line, "\r\n")] = 0;
773
774 if (!strncmp(line, "id:", 3)) {
775 if (sscanf(line, "id: %63[^,], index: %u", id, &stream_id) != 2) {
777 "assuming 'id: und, index: 0'\n", line);
778 strcpy(id, "und");
779 stream_id = 0;
780 }
781
786 }
787
788 header_parsed = 1;
789 alt[0] = '0円';
790 /* We do not create the stream immediately to avoid adding empty
791 * streams. See the following timestamp entry. */
792
794
795 } else if (!strncmp(line, "timestamp:", 10)) {
798 int64_t pos, timestamp;
799 const char *p = line + 10;
800
801 if (stream_id == -1) {
805 }
806
807 if (!st || st->
id != stream_id) {
809 if (!st) {
812 }
818 if (alt[0])
820 }
821
822 if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"SCNx64,
823 &hh, &mm, &ss, &ms, &pos) != 5) {
825 "abort parsing\n", line);
828 }
829 timestamp = (hh*3600LL + mm*60LL +
ss) * 1000LL + ms + delay;
831
833 if (!sub) {
836 }
838 sub->
pts = timestamp;
840
841 } else if (!strncmp(line, "alt:", 4)) {
842 const char *p = line + 4;
843
844 while (*p == ' ')
845 p++;
848 header_parsed = 1;
849
850 } else if (!strncmp(line, "delay:", 6)) {
851 int sign = 1, hh = 0, mm = 0,
ss = 0, ms = 0;
852 const char *p = line + 6;
853
854 while (*p == ' ')
855 p++;
856 if (*p == '-' || *p == '+') {
857 sign = *p == '-' ? -1 : 1;
858 p++;
859 }
860 sscanf(p,
"%d:%d:%d:%d", &hh, &mm, &
ss, &ms);
861 delay = ((hh*3600LL + mm*60LL +
ss) * 1000LL + ms) * sign;
862
863 } else if (!strncmp(line, "langidx:", 8)) {
864 const char *p = line + 8;
865
866 if (sscanf(p, "%d", &langidx) != 1)
868
869 } else if (!header_parsed) {
870 if (line[0] && line[0] != '#')
872 }
873 }
874
877
880 vobsub->q[i].keep_duplicates = 1;
882 }
883
888 }
894 }
896
898 return ret;
899 }
900
902 {
906 int ret, psize, total_read = 0, i;
908
909 int64_t min_ts = INT64_MAX;
910 int sid = 0;
913 int64_t ts;
916 if (ts < min_ts) {
917 min_ts = ts;
918 sid = i;
919 }
920 }
921 q = &vobsub->q[sid];
923 if (ret < 0)
924 return ret;
925
926 /* compute maximum packet size using the next packet position. This is
927 * useful when the len in the header is non-sense */
930 } else {
932 psize = fsize < 0 ? 0xffff : fsize - idx_pkt.
pos;
933 }
934
936
940
941 do {
942 int n, to_read, startcode;
944 int64_t old_pos =
avio_tell(pb), new_pos;
945 int pkt_size;
946
948 if (ret < 0) {
949 if (pkt->
size)
// raise packet even if incomplete
950 break;
952 }
953 to_read = ret & 0xffff;
955 pkt_size = ret + (new_pos - old_pos);
956
957 /* this prevents reads above the current packet */
958 if (total_read + pkt_size > psize)
959 break;
960 total_read += pkt_size;
961
962 /* the current chunk doesn't match the stream index (unlikely) */
964 break;
965
967 if (ret < 0)
969
971 if (n < to_read)
972 pkt->
size -= to_read -
n;
973 } while (total_read < psize);
974
978
980 return 0;
981
985 return ret;
986 }
987
989 int64_t min_ts, int64_t ts, int64_t max_ts,
int flags)
990 {
992
993 /* Rescale requested timestamps based on the first stream (timebase is the
994 * same for all subtitles stream within a .idx/.sub). Rescaling is done just
995 * like in avformat_seek_file(). */
996 if (stream_index == -1 && s->
nb_streams != 1) {
997 int i, ret = 0;
1004 time_base.
num * (int64_t)AV_TIME_BASE,
1008 min_ts, ts, max_ts, flags);
1009 if (r < 0)
1011 }
1012 return ret;
1013 }
1014
1015 if (stream_index == -1) // only 1 stream
1016 stream_index = 0;
1018 min_ts, ts, max_ts, flags);
1019 }
1020
1022 {
1023 int i;
1025
1028 if (vobsub->sub_ctx)
1030 return 0;
1031 }
1032
1036 };
1037
1038 static const AVClass vobsub_demuxer_class = {
1043 };
1044
1052 .read_seek2 = vobsub_read_seek,
1055 .extensions = "idx",
1056 .priv_class = &vobsub_demuxer_class,
1057 };
1058 #endif
const char const char void * val
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int64_t avio_size(AVIOContext *s)
Get the filesize.
void av_bprintf(AVBPrint *buf, const char *fmt,...)
#define STREAM_TYPE_AUDIO_MPEG2
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 AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
int64_t pos
byte position in stream, -1 if unknown
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int index
stream index in AVFormatContext
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * av_default_item_name(void *ptr)
Return the context name.
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
sort by position, then timestamps
static int mpegps_read_pes_header(AVFormatContext *s, int64_t *ppos, int *pstart_code, int64_t *ppts, int64_t *pdts)
#define STREAM_TYPE_VIDEO_MPEG1
unsigned int avio_rb16(AVIOContext *s)
int ctx_flags
Flags signalling stream properties.
static int mpegps_read_header(AVFormatContext *s)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Opaque data information usually continuous.
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
unsigned int avio_rb32(AVIOContext *s)
static av_cold int end(AVCodecContext *avctx)
enum AVStreamParseType need_parsing
int id
Format-specific stream ID.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
AVStream ** streams
A list of all streams in the file.
#define SYSTEM_HEADER_START_CODE
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
#define AVERROR_EOF
End of file.
static av_cold int read_close(AVFormatContext *ctx)
#define AV_LOG_VERBOSE
Detailed information.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static const uint8_t header[24]
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
uint64_t channel_layout
Audio only.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define STREAM_TYPE_AUDIO_AAC
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_BPRINT_SIZE_UNLIMITED
#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)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
char * url
input or output URL.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
preferred ID for decoding MPEG audio layer 1, 2 or 3
enum AVMediaType codec_type
General type of the encoded data.
simple assert() macros that are a bit more flexible than ISO C assert().
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
int extradata_size
Size of the extradata content in bytes.
int avio_r8(AVIOContext *s)
int buf_size
Size of buf except extra allocated bytes.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
#define AV_TIME_BASE
Internal time base represented as integer.
#define STREAM_TYPE_VIDEO_H264
static int find_next_start_code(AVIOContext *pb, int *size_ptr, int32_t *header_state)
static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
Extract stream types from a program stream map According to ISO/IEC 13818-1 ('MPEG-2 Systems') table ...
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
preferred ID for MPEG-1/2 video decoding
#define FF_ARRAY_ELEMS(a)
#define STREAM_TYPE_VIDEO_MPEG4
unsigned char psm_es_type[256]
static int read_header(FFV1Context *f)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
static AVInputFormat * iformat
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.
char * av_strdup(const char *s)
Duplicate a string.
int debug
Flags to enable debugging.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
AVIOContext * pb
I/O context.
static AVRational av_make_q(int num, int den)
Create an AVRational.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Describe the class of an AVClass context structure.
Rational number (pair of numerator and denominator).
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
#define PROGRAM_STREAM_MAP
#define STREAM_TYPE_AUDIO_AC3
This structure contains the data a format has to probe a file.
static int64_t get_pts(AVIOContext *pb, int c)
#define AVERROR_DEMUXER_NOT_FOUND
Demuxer not found.
static int mpegps_read_packet(AVFormatContext *s, AVPacket *pkt)
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
int sample_rate
Audio only.
const OptionDef options[]
AVPacket * subs
array of subtitles packets
int disposition
AV_DISPOSITION_* bit field.
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
int current_sub_idx
current position for the read packet callback
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
static int check_pes(const uint8_t *p, const uint8_t *end)
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
#define STREAM_TYPE_VIDEO_MPEG2
void * priv_data
Format private data.
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
int avio_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
static int64_t fsize(FILE *f)
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
#define AV_CH_LAYOUT_MONO
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
#define STREAM_TYPE_AUDIO_MPEG1
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
This structure stores compressed data.
int nb_subs
number of subtitles packets
void ff_subtitles_queue_finalize(void *log_ctx, FFDemuxSubtitlesQueue *q)
Set missing durations, sort subtitles by PTS (and then byte position), and drop duplicated events...
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.
AVInputFormat ff_mpegps_demuxer
static int mpegps_probe(AVProbeData *p)