26 #if CONFIG_VOBSUB_DEMUXER
28 # include "libavutil/bprint.h"
33 #include "libavutil/avassert.h"
38 #define MAX_SYNC_SIZE 100000
42 int pes2= (p[3] & 0xC0) == 0x80
43 && (p[4] & 0xC0) != 0x40
44 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));
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;
59 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
65 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
70 code = (code<<8) + p->
buf[i];
71 if ((code & 0xffffff00) == 0x100) {
78 else if((code & 0xf0) ==
VIDEO_ID && pes) vid++;
81 else if((code & 0xe0) ==
AUDIO_ID && pes) {audio++; i+=
len;}
83 else if(code == 0x1fd && pes) vid++;
85 else if((code & 0xf0) ==
VIDEO_ID && !pes) invalid++;
86 else if((code & 0xe0) ==
AUDIO_ID && !pes) invalid++;
91 if(vid+audio > invalid+1)
94 if(sys>invalid && sys*9 <= pspack*10)
96 if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
98 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->
buf_size>2048 && vid + audio > invalid)
114 #if CONFIG_VOBSUB_DEMUXER
130 if (!memcmp(
"IMKH", buffer, 4)) {
132 }
else if (!memcmp(
"Sofdec", buffer, 6)) {
157 state = *header_state;
164 if (state == 0x000001) {
165 state = ((state << 8) | v) & 0xffffff;
169 state = ((state << 8) | v) & 0xffffff;
173 *header_state =
state;
186 int psm_length, ps_info_length, es_map_length;
198 while (es_map_length >= 4){
200 unsigned char es_id =
avio_r8(pb);
206 es_map_length -= 4 + es_info_length;
209 return 2 + psm_length;
216 int64_t *ppos,
int *pstart_code,
217 int64_t *ppts, int64_t *pdts)
221 int pes_ext, ext2_len, id_ext, skip;
258 if (bytesread != len) {
263 p = memchr(ps2buf,
'S', len - 5);
266 m->
sofdec = !memcmp(p+1,
"ofdec", 5);
271 if (len == 980 && ps2buf[0] == 0) {
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);
279 m->
dvd = (hours <= 23 &&
282 (ps2buf[0x19] & 0x0f) < 10 &&
283 (ps2buf[0x1a] & 0x0f) < 10 &&
284 (ps2buf[0x1b] & 0x0f) < 10 &&
286 }
else if (len == 1018 && ps2buf[0] == 1) {
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);
292 m->
dvd = (hours <= 23 &&
295 (ps2buf[0x1d] & 0x0f) < 10 &&
296 (ps2buf[0x1e] & 0x0f) < 10 &&
297 (ps2buf[0x1f] & 0x0f) < 10);
320 }
else if (!m->
dvd) {
332 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
333 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
334 (startcode == 0x1bd) ||
336 (startcode == 0x1fd)))
356 if ((c & 0xc0) == 0x40) {
362 if ((c & 0xe0) == 0x20) {
369 }
else if ((c & 0xc0) == 0x80) {
374 if (header_len > len)
385 if (flags & 0x3f && header_len == 0){
393 skip = (pes_ext >> 4) & 0xb;
395 if (pes_ext & 0x40 || skip > header_len){
402 if (pes_ext & 0x01) {
405 if ((ext2_len & 0x7f) > 0) {
407 if ((id_ext & 0x80) == 0)
408 startcode = ((startcode & 0xff) << 8) | id_ext;
438 *pstart_code = startcode;
449 int len, startcode, i, es_type,
ret;
450 int lpcm_header_len = -1;
451 int request_probe= 0;
454 int64_t pts, dts, dummy_pos;
461 if (startcode >= 0x80 && startcode <= 0xcf) {
469 if (startcode >= 0xb0 && startcode <= 0xbf) {
479 if (st->
id == startcode)
506 }
else if(m->
imkh_cctv && es_type == 0x91){
509 }
else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
510 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
511 unsigned char buf[8];
514 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
522 }
else if (startcode >= 0x1c0 && startcode <= 0x1df) {
525 }
else if (startcode >= 0x80 && startcode <= 0x87) {
528 }
else if ( ( startcode >= 0x88 && startcode <= 0x8f)
529 ||( startcode >= 0x98 && startcode <= 0x9f)) {
533 }
else if (startcode >= 0xa0 && startcode <= 0xaf) {
535 if(lpcm_header_len == 6) {
540 }
else if (startcode >= 0xb0 && startcode <= 0xbf) {
543 }
else if (startcode >= 0xc0 && startcode <= 0xcf) {
547 }
else if (startcode >= 0x20 && startcode <= 0x3f) {
550 }
else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
576 if (startcode >= 0xa0 && startcode <= 0xaf) {
587 pkt->
pos = dummy_pos;
589 av_dlog(s,
"%d: pts=%0.3f dts=%0.3f size=%d\n",
593 return (ret < 0) ? ret : 0;
597 int64_t *ppos, int64_t pos_limit)
600 int64_t pos, pts, dts;
609 av_dlog(s,
"none (ret=%d)\n", len);
612 if (startcode == s->
streams[stream_index]->
id &&
618 av_dlog(s,
"pos=0x%"PRIx64
" dts=0x%"PRIx64
" %0.3f\n",
619 pos, dts, dts / 90000.0);
635 #if CONFIG_VOBSUB_DEMUXER
637 #define REF_STRING "# VobSub index file,"
641 if (!strncmp(p->
buf, REF_STRING,
sizeof(REF_STRING) - 1))
648 int i,
ret = 0, header_parsed = 0, langidx = 0;
650 char *sub_name = NULL;
652 char *ext, *header_str;
658 fname_len = strlen(sub_name);
659 ext = sub_name - 3 + fname_len;
660 if (fname_len < 4 || *(ext - 1) !=
'.') {
662 "to guess the associated .SUB file\n");
666 memcpy(ext, !strncmp(ext,
"IDX", 3) ?
"SUB" :
"sub", 3);
682 line[strcspn(line,
"\r\n")] = 0;
684 if (!strncmp(line,
"id:", 3)) {
685 int n, stream_id = 0;
688 n = sscanf(line,
"id: %63[^,], index: %u",
id, &stream_id);
691 "assuming 'id: und, index: 0'\n", line);
715 }
else if (st && !strncmp(line,
"timestamp:", 10)) {
718 int64_t pos, timestamp;
719 const char *p = line + 10;
727 if (sscanf(p,
"%02d:%02d:%02d:%03d, filepos: %"SCNx64,
728 &hh, &mm, &ss, &ms, &pos) != 5) {
730 "abort parsing\n", line);
733 timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
742 sub->pts = timestamp;
745 }
else if (st && !strncmp(line,
"alt:", 4)) {
746 const char *p = line + 4;
754 }
else if (!strncmp(line,
"delay:", 6)) {
755 int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
756 const char *p = line + 6;
760 if (*p ==
'-' || *p ==
'+') {
761 sign = *p ==
'-' ? -1 : 1;
764 sscanf(p,
"%d:%d:%d:%d", &hh, &mm, &ss, &ms);
765 delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
767 }
else if (!strncmp(line,
"langidx:", 8)) {
768 const char *p = line + 8;
770 if (sscanf(p,
"%d", &langidx) != 1)
773 }
else if (!header_parsed) {
774 if (line[0] && line[0] !=
'#')
779 if (langidx < s->nb_streams)
805 #define FAIL(r) do { ret = r; goto fail; } while (0)
812 int ret, psize, total_read = 0, i;
815 int64_t min_ts = INT64_MAX;
836 psize = fsize < 0 ? 0xffff : fsize - idx_pkt.
pos;
846 int n, to_read, startcode;
848 int64_t old_pos =
avio_tell(pb), new_pos;
857 to_read = ret & 0xffff;
859 pkt_size = ret + (new_pos - old_pos);
862 if (total_read + pkt_size > psize)
864 total_read += pkt_size;
876 pkt->
size -= to_read -
n;
877 }
while (total_read < psize);
893 int64_t min_ts, int64_t ts, int64_t max_ts,
int flags)
900 if (stream_index == -1 && s->
nb_streams != 1) {
908 time_base.
num * (int64_t)AV_TIME_BASE,
912 min_ts, ts, max_ts, flags);
919 if (stream_index == -1)
922 min_ts, ts, max_ts, flags);
944 .read_seek2 = vobsub_read_seek,
const char const char void * val
void av_free_packet(AVPacket *pkt)
Free a packet.
#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.
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const
Rescale a 64-bit integer with specified rounding.
#define AV_LOG_WARNING
Something somehow does not look correct.
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.
char * av_strdup(const char *s) av_malloc_attrib
Duplicate the string s.
AVCodecContext * codec
Codec context associated with this stream.
int index
stream index in AVFormatContext
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
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)
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
int ctx_flags
Format-specific flags, see AVFMTCTX_xx.
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, int len, int merge)
Insert a new subtitle event.
static int mpegps_read_header(AVFormatContext *s)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
if((e=av_dict_get(options,"", NULL, AV_DICT_IGNORE_SUFFIX)))
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
static av_cold int end(AVCodecContext *avctx)
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
enum AVStreamParseType need_parsing
int id
Format-specific stream ID.
#define SYSTEM_HEADER_START_CODE
static av_cold int read_close(AVFormatContext *ctx)
#define AV_LOG_VERBOSE
Detailed information.
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define STREAM_TYPE_AUDIO_AAC
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const
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.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
void * priv_data
Format private data.
char filename[1024]
input or output filename
#define AV_BPRINT_SIZE_UNLIMITED
Convenience macros for special values for av_bprint_init() size_max parameter.
#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)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
preferred ID for decoding MPEG audio layer 1, 2 or 3
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
uint64_t channel_layout
Audio channel layout.
int buf_size
Size of buf except extra allocated bytes.
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Init a print buffer.
unsigned int nb_streams
A list of all streams in the file.
#define FF_ARRAY_ELEMS(a)
Buffer to print data progressively.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
static int av_bprint_is_complete(AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Opaque data information usually continuous.
#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)
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
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 ...
void ff_subtitles_queue_finalize(FFDemuxSubtitlesQueue *q)
Set missing durations and sort subtitles by PTS, and then byte position.
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
preferred ID for MPEG-1/2 video decoding
#define STREAM_TYPE_VIDEO_MPEG4
unsigned char psm_es_type[256]
static int read_header(FFV1Context *f)
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.
enum AVMediaType codec_type
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
int sample_rate
samples per second
AVIOContext * pb
I/O context.
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
rational number numerator/denominator
#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)
static int mpegps_read_packet(AVFormatContext *s, AVPacket *pkt)
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.
void av_bprintf(AVBPrint *buf, const char *fmt,...) av_printf_format(2
Append a formatted string to a print buffer.
Flag to pass INT64_MIN/MAX through instead of rescaling, this avoids special cases for AV_NOPTS_VALUE...
#define AVERROR_INVALIDDATA
int channels
number of audio channels
#define STREAM_TYPE_VIDEO_MPEG2
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
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
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)