22#include "config_components.h"
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,...)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
#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).
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)
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