35#define MAX_SYNC_SIZE 100000
37static int check_pes(
const uint8_t *p,
const uint8_t *end)
40 int pes2 = (p[3] & 0xC0) == 0x80 &&
41 (p[4] & 0xC0) != 0x40 &&
42 ((p[4] & 0xC0) == 0x00 ||
43 (p[4] & 0xC0) >> 2 == (p[6] & 0xF0));
45 for (p += 3; p < end && *p == 0xFF; p++) ;
46 if ((*p & 0xC0) == 0x40)
49 if ((*p & 0xF0) == 0x20)
50 pes1 = p[0] & p[2] & p[4] & 1;
51 else if ((*p & 0xF0) == 0x30)
52 pes1 = p[0] & p[2] & p[4] & p[5] & p[7] & p[9] & 1;
61 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
68 int sys = 0, pspack = 0, priv1 = 0, vid = 0;
69 int audio = 0, invalid = 0, score = 0;
72 for (
i = 0;
i < p->buf_size;
i++) {
74 if ((
code & 0xffffff00) == 0x100) {
75 int len = p->buf[
i + 1] << 8 | p->buf[
i + 2];
76 int pes = endpes <=
i &&
check_pes(p->buf +
i, p->buf + p->buf_size);
79 if (
len > INT_MAX -
i)
94 else if (
code == 0x1fd && pes) vid++;
102 if (vid + audio > invalid + 1)
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)
144 if (!memcmp(
"IMKH",
buffer, 4)) {
146 }
else if (!memcmp(
"Sofdec",
buffer, 6)) {
171 unsigned int state, v;
174 state = *header_state;
181 if (
state == 0x000001) {
191 *header_state =
state;
204 int psm_length, ps_info_length, es_map_length;
215 es_map_length = psm_length - ps_info_length - 10;
218 while (es_map_length >= 4) {
220 unsigned char es_id =
avio_r8(pb);
227 es_map_length -= 4 + es_info_length;
230 return 2 + psm_length;
237 int64_t *ppos,
int *pstart_code,
242 int pes_ext, ext2_len, id_ext,
skip;
279 if (bytesread !=
len) {
284 p = memchr(ps2buf,
'S',
len - 5);
287 m->
sofdec = !memcmp(p+1,
"ofdec", 5);
292 if (
len == 980 && ps2buf[0] == 0) {
294 uint32_t startpts =
AV_RB32(ps2buf + 0x0d);
295 uint32_t endpts =
AV_RB32(ps2buf + 0x11);
296 uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
297 uint8_t mins = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
298 uint8_t secs = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);
300 m->
dvd = (hours <= 23 &&
303 (ps2buf[0x19] & 0x0f) < 10 &&
304 (ps2buf[0x1a] & 0x0f) < 10 &&
305 (ps2buf[0x1b] & 0x0f) < 10 &&
307 }
else if (
len == 1018 && ps2buf[0] == 1) {
309 uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
310 uint8_t mins = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
311 uint8_t secs = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);
313 m->
dvd = (hours <= 23 &&
316 (ps2buf[0x1d] & 0x0f) < 10 &&
317 (ps2buf[0x1e] & 0x0f) < 10 &&
318 (ps2buf[0x1f] & 0x0f) < 10);
341 }
else if (!m->
dvd) {
353 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
354 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
355 (startcode == 0x1bd) ||
357 (startcode == 0x1fd)))
377 if ((
c & 0xc0) == 0x40) {
383 if ((
c & 0xe0) == 0x20) {
391 }
else if ((
c & 0xc0) == 0x80) {
396 if (header_len >
len)
407 if (
flags & 0x3f && header_len == 0) {
416 skip = (pes_ext >> 4) & 0xb;
418 if (pes_ext & 0x40 ||
skip > header_len) {
425 if (pes_ext & 0x01) {
428 if ((ext2_len & 0x7f) > 0) {
430 if ((id_ext & 0x80) == 0)
431 startcode = ((startcode & 0xff) << 8) | id_ext;
451 if (startcode == 0x0b) {
467 for (
i = 0;
i <
s->nb_streams;
i++) {
468 if (startcode ==
s->streams[
i]->id &&
477 *pstart_code = startcode;
489 int len, startcode,
i, es_type, ret;
492 int request_probe= 0;
502 if (startcode >= 0x80 && startcode <= 0xcf) {
507 if (startcode >= 0xa0 && startcode <= 0xaf) {
523 pcm_dvd =
header[5] == 0x80;
524 pcm_dvda = startcode == 0xa0 && !pcm_dvd;
529 if (startcode >= 0xb0 && startcode <= 0xbf) {
539 for (
i = 0;
i <
s->nb_streams;
i++) {
541 if (st->
id == startcode)
574 }
else if (es_type == 0x90) {
577 }
else if (m->
imkh_cctv && es_type == 0x91) {
580 }
else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
581 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
582 unsigned char buf[8];
588 if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
596 }
else if (startcode >= 0x1c0 && startcode <= 0x1df) {
602 }
else if (m->
imkh_cctv && startcode == 0x1c0 &&
len > 80) {
610 }
else if (startcode >= 0x80 && startcode <= 0x87) {
613 }
else if ((startcode >= 0x88 && startcode <= 0x8f) ||
614 (startcode >= 0x98 && startcode <= 0x9f)) {
618 }
else if (startcode >= 0xa0 && startcode <= 0xaf) {
622 }
else if (!pcm_dvd) {
627 }
else if (startcode >= 0xb0 && startcode <= 0xbf) {
630 }
else if (startcode >= 0xc0 && startcode <= 0xcf) {
634 }
else if (startcode >= 0x20 && startcode <= 0x3f) {
637 }
else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
640 }
else if (startcode == 0x69 || startcode == 0x49) {
668 if (startcode >= 0xa0 && startcode <= 0xaf && !m->raw_ac3) {
678 if (
len <= header_len)
682 }
else if (startcode >= 0xa0 && startcode <= 0xaf &&
693 pkt->pos = dummy_pos;
698 pkt->stream_index,
pkt->pts / 90000.0,
pkt->dts / 90000.0,
701 return (ret < 0) ? ret : 0;
721 if (startcode ==
s->streams[stream_index]->id &&
729 pos, dts, dts / 90000.0);
745#if CONFIG_VOBSUB_DEMUXER
752#define REF_STRING "# VobSub index file,"
753#define MAX_LINE_SIZE 2048
755typedef struct VobSubDemuxContext {
756 const AVClass *
class;
757 AVFormatContext *sub_ctx;
758 FFDemuxSubtitlesQueue q[32];
764 if (!strncmp(
p->buf, REF_STRING,
sizeof(REF_STRING) - 1))
771 VobSubDemuxContext *vobsub =
s->priv_data;
774 for (
i = 0;
i <
s->nb_streams;
i++)
782 int i, ret = 0, header_parsed = 0, langidx = 0;
783 VobSubDemuxContext *vobsub =
s->priv_data;
793 if (!vobsub->sub_name) {
796 if (!vobsub->sub_name) {
800 fname_len = strlen(vobsub->sub_name);
801 ext = vobsub->sub_name - 3 + fname_len;
802 if (fname_len < 4 || *(ext - 1) !=
'.') {
804 "to guess the associated .SUB file\n");
807 memcpy(ext, !strncmp(ext,
"IDX", 3) ?
"SUB" :
"sub", 3);
816 if (!vobsub->sub_ctx) {
840 if (!strncmp(
line,
"id:", 3)) {
841 if (sscanf(
line,
"id: %63[^,], index: %u",
id, &stream_id) != 2) {
843 "assuming 'id: und, index: 0'\n",
line);
861 }
else if (!strncmp(
line,
"timestamp:", 10)) {
865 const char *
p =
line + 10;
867 if (stream_id == -1) {
873 if (!st || st->
id != stream_id) {
875 for (
i = 0;
i <
s->nb_streams;
i++) {
876 if (
s->streams[
i]->id == stream_id) {
902 if (sscanf(p,
"%02d:%02d:%02d:%03d, filepos: %"SCNx64,
903 &hh, &mm, &
ss, &ms, &
pos) != 5) {
905 "abort parsing\n",
line);
909 timestamp = (hh*3600LL + mm*60LL +
ss) * 1000LL + ms + delay;
918 sub->
pts = timestamp;
921 }
else if (!strncmp(
line,
"alt:", 4)) {
922 const char *
p =
line + 4;
930 }
else if (!strncmp(
line,
"delay:", 6)) {
931 int sign = 1, hh = 0, mm = 0,
ss = 0, ms = 0;
932 const char *
p =
line + 6;
936 if (*p ==
'-' || *p ==
'+') {
937 sign = *
p ==
'-' ? -1 : 1;
940 sscanf(p,
"%d:%d:%d:%d", &hh, &mm, &
ss, &ms);
941 delay = ((hh*3600LL + mm*60LL +
ss) * 1000LL + ms) * sign;
943 }
else if (!strncmp(
line,
"langidx:", 8)) {
944 const char *
p =
line + 8;
946 if (sscanf(p,
"%d", &langidx) != 1)
949 }
else if (!header_parsed) {
958 for (
i = 0;
i <
s->nb_streams;
i++) {
960 vobsub->q[
i].keep_duplicates = 1;
968 for (
i = 0;
i <
s->nb_streams;
i++) {
983 VobSubDemuxContext *vobsub =
s->priv_data;
986 int ret, psize, total_read = 0,
i;
990 for (
i = 0;
i <
s->nb_streams;
i++) {
1004 q = &vobsub->q[sid];
1023 int n, to_read, startcode;
1034 to_read = ret & 0xffff;
1036 pkt_size = ret + (new_pos - old_pos);
1039 if (total_read + pkt_size > psize)
1041 total_read += pkt_size;
1044 if ((startcode & 0x1f) !=
s->streams[
pkt->stream_index]->id)
1053 pkt->size -= to_read - n;
1054 }
while (total_read < psize);
1062 VobSubDemuxContext *vobsub =
s->priv_data;
1067 if (stream_index == -1 &&
s->nb_streams != 1) {
1077 for (
i = 0;
i <
s->nb_streams;
i++) {
1079 min_ts, ts, max_ts,
flags);
1086 if (stream_index == -1)
1089 min_ts, ts, max_ts,
flags);
1097static const AVClass vobsub_demuxer_class = {
1098 .class_name =
"vobsub",
1108 .p.extensions =
"idx",
1109 .p.priv_class = &vobsub_demuxer_class,
1110 .priv_data_size =
sizeof(VobSubDemuxContext),
1115 .read_seek2 = vobsub_read_seek,
static double val(void *priv, double ch)
static int64_t fsize(FILE *f)
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
int64_t avio_size(AVIOContext *s)
Get the filesize.
unsigned int avio_rb16(AVIOContext *s)
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
unsigned int avio_rb32(AVIOContext *s)
int avio_r8(AVIOContext *s)
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
static void BS_FUNC skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
void av_bprintf(AVBPrint *buf, const char *fmt,...)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define ss(width, name, subs,...)
static int read_probe(const AVProbeData *p)
Public libavutil channel layout APIs header.
#define FF_INFMT_FLAG_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
#define FFERROR_REDO
Returned by demuxers to indicate that data was consumed but discarded (ignored streams or junk data).
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 struct @346255127015250356166251341105367306144006377143 state
static const AVInputFormat * iformat
static unsigned int nb_streams
static int read_header(FFV1Context *f, RangeCoder *c)
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
AVCodecID
Identify the syntax and semantics of the bitstream.
@ AV_CODEC_ID_DVD_SUBTITLE
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
@ AVDISCARD_ALL
discard all
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
const AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
int avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
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_CHANNEL_LAYOUT_MONO
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Init a print buffer.
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define AVERROR_DEMUXER_NOT_FOUND
Demuxer not found.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
static AVRational av_make_q(int num, int den)
Create an AVRational.
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.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
@ AV_ROUND_DOWN
Round toward -infinity.
@ AV_ROUND_PASS_MINMAX
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
@ AV_ROUND_UP
Round toward +infinity.
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
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.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE
Internal time base represented as integer.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
#define LIBAVUTIL_VERSION_INT
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static av_cold int read_close(AVFormatContext *ctx)
Memory handling functions.
static int64_t get_pts(AVIOContext *pb, int c)
static int mpegps_read_packet(AVFormatContext *s, AVPacket *pkt)
static int mpegps_read_pes_header(AVFormatContext *s, int64_t *ppos, int *pstart_code, int64_t *ppts, int64_t *pdts)
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
static int find_next_start_code(AVIOContext *pb, int *size_ptr, int32_t *header_state)
static int check_pack_header(const uint8_t *buf)
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 check_pes(const uint8_t *p, const uint8_t *end)
static int mpegps_probe(const AVProbeData *p)
static int mpegps_read_header(AVFormatContext *s)
#define STREAM_TYPE_VIDEO_MPEG4
#define STREAM_TYPE_AUDIO_MPEG2
#define STREAM_TYPE_VIDEO_HEVC
#define SYSTEM_HEADER_START_CODE
#define STREAM_TYPE_VIDEO_VVC
#define PROGRAM_STREAM_MAP
#define STREAM_TYPE_AUDIO_AC3
#define STREAM_TYPE_VIDEO_MPEG1
#define STREAM_TYPE_AUDIO_AAC
#define STREAM_TYPE_VIDEO_H264
#define STREAM_TYPE_AUDIO_MPEG1
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
#define STREAM_TYPE_VIDEO_MPEG2
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
static const uint8_t header[24]
static int64_t read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit, int64_t(*read_timestamp)(struct AVFormatContext *, int, int64_t *, int64_t))
#define FF_ARRAY_ELEMS(a)
Buffer to print data progressively.
An AVChannelLayout holds information about the channel layout of audio data.
Describe the class of an AVClass context structure.
This struct describes the properties of an encoded stream.
AVChannelLayout ch_layout
The channel layout and number of channels.
enum AVMediaType codec_type
General type of the encoded data.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int sample_rate
The number of audio samples per second.
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t pos
byte position in stream, -1 if unknown
This structure contains the data a format has to probe a file.
Rational number (pair of numerator and denominator).
AVCodecParameters * codecpar
Codec parameters associated with this stream.
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
int id
Format-specific stream ID.
int index
stream index in AVFormatContext
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int nb_subs
number of subtitles packets
AVPacket ** subs
array of subtitles packets
int current_sub_idx
current position for the read packet callback
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
enum AVStreamParseType need_parsing
unsigned char psm_es_type[256]
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.
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
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.
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
@ SUB_SORT_POS_TS
sort by position, then timestamps