27 #if CONFIG_VOBSUB_DEMUXER 
   38 #define MAX_SYNC_SIZE 100000 
   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));
 
   48     for (p += 3; p < end && *p == 0xFF; p++) ;
 
   49     if ((*p & 0xC0) == 0x40)
 
   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;
 
   64     return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
 
   71     int sys = 0, pspack = 0, priv1 = 0, vid = 0;
 
   72     int audio = 0, invalid = 0, score = 0;
 
   76         code = (code << 8) + p->
buf[i];
 
   77         if ((code & 0xffffff00) == 0x100) {
 
   78             int len  = p->
buf[i + 1] << 8 | p->
buf[i + 2];
 
   86             else if ((code & 0xf0) == 
VIDEO_ID && pes) {
 
   92             else if ((code & 0xe0) == 
AUDIO_ID &&  pes) {audio++; i+=
len;}
 
   94             else if (code == 0x1fd             &&  pes) vid++; 
 
   96             else if ((code & 0xf0) == 
VIDEO_ID && !pes) invalid++;
 
   97             else if ((code & 0xe0) == 
AUDIO_ID && !pes) invalid++;
 
  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) 
 
  133 #if CONFIG_VOBSUB_DEMUXER 
  150     if (!memcmp(
"IMKH", buffer, 4)) {
 
  152     } 
else if (!memcmp(
"Sofdec", buffer, 6)) {
 
  174     unsigned int state, v;
 
  177     state = *header_state;
 
  184         if (state == 0x000001) {
 
  185             state = ((state << 8) | v) & 0xffffff;
 
  189         state = ((state << 8) | v) & 0xffffff;
 
  194     *header_state = 
state;
 
  207     int psm_length, ps_info_length, es_map_length;
 
  218     es_map_length = psm_length - ps_info_length - 10;
 
  221     while (es_map_length >= 4) {
 
  223         unsigned char es_id     = 
avio_r8(pb);
 
  230         es_map_length -= 4 + es_info_length;
 
  233     return 2 + psm_length;
 
  240                                   int64_t *ppos, 
int *pstart_code,
 
  241                                   int64_t *ppts, int64_t *pdts)
 
  245     int pes_ext, ext2_len, id_ext, skip;
 
  282                 if (bytesread != len) {
 
  287                         p = memchr(ps2buf, 
'S', len - 5);
 
  290                         m->
sofdec = !memcmp(p+1, 
"ofdec", 5);
 
  295                         if (len == 980  && ps2buf[0] == 0) {
 
  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);
 
  303                             m->
dvd = (hours <= 23 &&
 
  306                                       (ps2buf[0x19] & 0x0f) < 10 &&
 
  307                                       (ps2buf[0x1a] & 0x0f) < 10 &&
 
  308                                       (ps2buf[0x1b] & 0x0f) < 10 &&
 
  310                         } 
else if (len == 1018 && ps2buf[0] == 1) {
 
  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);
 
  316                             m->
dvd = (hours <= 23 &&
 
  319                                       (ps2buf[0x1d] & 0x0f) < 10 &&
 
  320                                       (ps2buf[0x1e] & 0x0f) < 10 &&
 
  321                                       (ps2buf[0x1f] & 0x0f) < 10);
 
  344         } 
else if (!m->
dvd) {
 
  356     if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
 
  357           (startcode >= 0x1e0 && startcode <= 0x1ef) ||
 
  358           (startcode == 0x1bd) ||
 
  360           (startcode == 0x1fd)))
 
  380     if ((c & 0xc0) == 0x40) {
 
  386     if ((c & 0xe0) == 0x20) {
 
  394     } 
else if ((c & 0xc0) == 0x80) {
 
  399         if (header_len > len)
 
  410         if (flags & 0x3f && header_len == 0) {
 
  419             skip  = (pes_ext >> 4) & 0xb;
 
  421             if (pes_ext & 0x40 || skip > header_len) {
 
  428             if (pes_ext & 0x01) { 
 
  431                 if ((ext2_len & 0x7f) > 0) {
 
  433                     if ((id_ext & 0x80) == 0)
 
  434                         startcode = ((startcode & 0xff) << 8) | id_ext;
 
  454         if (startcode == 0x0b) {
 
  480     *pstart_code = startcode;
 
  491     int len, startcode, i, es_type, ret;
 
  492     int lpcm_header_len = -1; 
 
  493     int request_probe= 0;
 
  496     int64_t 
pts, dts, dummy_pos; 
 
  503     if (startcode >= 0x80 && startcode <= 0xcf) {
 
  512             if (startcode >= 0xb0 && startcode <= 0xbf) {
 
  523         if (st->
id == startcode)
 
  553         } 
else if (m->
imkh_cctv && es_type == 0x91) {
 
  556     } 
else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
 
  557         static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
 
  558         unsigned char buf[8];
 
  562         if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
 
  570     } 
else if (startcode >= 0x1c0 && startcode <= 0x1df) {
 
  576         } 
else if (m->
imkh_cctv && startcode == 0x1c0 && len > 80) {
 
  584     } 
else if (startcode >= 0x80 && startcode <= 0x87) {
 
  587     } 
else if ((startcode >= 0x88 && startcode <= 0x8f) ||
 
  588                (startcode >= 0x98 && startcode <= 0x9f)) {
 
  592     } 
else if (startcode >= 0xa0 && startcode <= 0xaf) {
 
  594         if (lpcm_header_len >= 6 && startcode == 0xa1) {
 
  599     } 
else if (startcode >= 0xb0 && startcode <= 0xbf) {
 
  602     } 
else if (startcode >= 0xc0 && startcode <= 0xcf) {
 
  606     } 
else if (startcode >= 0x20 && startcode <= 0x3f) {
 
  609     } 
else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
 
  637     if (startcode >= 0xa0 && startcode <= 0xaf) {
 
  649     pkt->
pos          = dummy_pos;
 
  657     return (ret < 0) ? ret : 0;
 
  661                                int64_t *ppos, int64_t pos_limit)
 
  664     int64_t pos, 
pts, dts;
 
  677         if (startcode == s->
streams[stream_index]->
id &&
 
  685             pos, dts, dts / 90000.0);
 
  701 #if CONFIG_VOBSUB_DEMUXER 
  703 #define REF_STRING "# VobSub index file," 
  704 #define MAX_LINE_SIZE 2048 
  708     if (!strncmp(p->
buf, REF_STRING, 
sizeof(REF_STRING) - 1))
 
  715     int i, ret = 0, header_parsed = 0, langidx = 0;
 
  727     if (!vobsub->sub_name) {
 
  730         if (!vobsub->sub_name) {
 
  735         fname_len = strlen(vobsub->sub_name);
 
  736         ext = vobsub->sub_name - 3 + fname_len;
 
  737         if (fname_len < 4 || *(ext - 1) != 
'.') {
 
  739                    "to guess the associated .SUB file\n");
 
  743         memcpy(ext, !strncmp(ext, 
"IDX", 3) ? 
"SUB" : 
"sub", 3);
 
  753     if (!vobsub->sub_ctx) {
 
  775         line[strcspn(line, 
"\r\n")] = 0;
 
  777         if (!strncmp(line, 
"id:", 3)) {
 
  778             if (sscanf(line, 
"id: %63[^,], index: %u", 
id, &stream_id) != 2) {
 
  780                        "assuming 'id: und, index: 0'\n", line);
 
  798         } 
else if (!strncmp(line, 
"timestamp:", 10)) {
 
  801             int64_t pos, timestamp;
 
  802             const char *p = line + 10;
 
  804             if (stream_id == -1) {
 
  810             if (!st || st->
id != stream_id) {
 
  825             if (sscanf(p, 
"%02d:%02d:%02d:%03d, filepos: %"SCNx64,
 
  826                        &hh, &mm, &ss, &ms, &pos) != 5) {
 
  828                        "abort parsing\n", line);
 
  832             timestamp = (hh*3600LL + mm*60LL + 
ss) * 1000LL + ms + delay;
 
  841             sub->
pts = timestamp;
 
  844         } 
else if (!strncmp(line, 
"alt:", 4)) {
 
  845             const char *p = line + 4;
 
  853         } 
else if (!strncmp(line, 
"delay:", 6)) {
 
  854             int sign = 1, hh = 0, mm = 0, 
ss = 0, ms = 0;
 
  855             const char *p = line + 6;
 
  859             if (*p == 
'-' || *p == 
'+') {
 
  860                 sign = *p == 
'-' ? -1 : 1;
 
  863             sscanf(p, 
"%d:%d:%d:%d", &hh, &mm, &
ss, &ms);
 
  864             delay = ((hh*3600LL + mm*60LL + 
ss) * 1000LL + ms) * sign;
 
  866         } 
else if (!strncmp(line, 
"langidx:", 8)) {
 
  867             const char *p = line + 8;
 
  869             if (sscanf(p, 
"%d", &langidx) != 1)
 
  872         } 
else if (!header_parsed) {
 
  873             if (line[0] && line[0] != 
'#')
 
  883         vobsub->q[i].keep_duplicates = 1;
 
  909     int ret, psize, total_read = 0, i;
 
  912     int64_t min_ts = INT64_MAX;
 
  935         psize = fsize < 0 ? 0xffff : fsize - idx_pkt.
pos;
 
  945         int n, to_read, startcode;
 
  947         int64_t old_pos = 
avio_tell(pb), new_pos;
 
  956         to_read = ret & 0xffff;
 
  958         pkt_size = ret + (new_pos - old_pos);
 
  961         if (total_read + pkt_size > psize)
 
  963         total_read += pkt_size;
 
  975             pkt->
size -= to_read - 
n;
 
  976     } 
while (total_read < psize);
 
  992                             int64_t min_ts, int64_t ts, int64_t max_ts, 
int flags)
 
  999     if (stream_index == -1 && s->
nb_streams != 1) {
 
 1007                                 time_base.
num * (int64_t)AV_TIME_BASE,
 
 1011                                             min_ts, ts, max_ts, flags);
 
 1018     if (stream_index == -1) 
 
 1021                                    min_ts, ts, max_ts, flags);
 
 1031     if (vobsub->sub_ctx)
 
 1041 static const AVClass vobsub_demuxer_class = {
 
 1055     .read_seek2     = vobsub_read_seek,
 
 1058     .extensions     = 
"idx",
 
 1059     .priv_class     = &vobsub_demuxer_class,
 
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. 
unsigned int avio_rb32(AVIOContext *s)
static av_cold int end(AVCodecContext *avctx)
enum AVStreamParseType need_parsing
int id
Format-specific stream ID. 
#define STREAM_TYPE_VIDEO_HEVC
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. 
#define ss(width, name, subs,...)
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 flags(name, subs,...)
#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 xf(width, name, var, range_min, range_max, subs,...)
#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)