26 #if CONFIG_VOBSUB_DEMUXER
37 #define MAX_SYNC_SIZE 100000
41 int pes2= (p[3] & 0xC0) == 0x80
42 && (p[4] & 0xC0) != 0x40
43 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));
45 for(p+=3; p<end && *p == 0xFF; p++);
46 if((*p&0xC0) == 0x40) p+=2;
47 if((*p&0xF0) == 0x20){
48 pes1= p[0]&p[2]&p[4]&1;
49 }
else if((*p&0xF0) == 0x30){
50 pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1;
58 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
64 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
69 code = (code<<8) + p->
buf[i];
70 if ((code & 0xffffff00) == 0x100) {
77 else if((code & 0xf0) ==
VIDEO_ID && pes) vid++;
80 else if((code & 0xe0) ==
AUDIO_ID && pes) {audio++; i+=
len;}
82 else if(code == 0x1fd && pes) vid++;
84 else if((code & 0xf0) ==
VIDEO_ID && !pes) invalid++;
85 else if((code & 0xe0) ==
AUDIO_ID && !pes) invalid++;
90 if(vid+audio > invalid+1)
93 if(sys>invalid && sys*9 <= pspack*10)
95 if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
97 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->
buf_size>2048 && vid + audio > invalid)
111 #if CONFIG_VOBSUB_DEMUXER
120 const char *sofdec =
"Sofdec";
131 }
while (v == sofdec[i] && i++ < 6);
158 state = *header_state;
165 if (state == 0x000001) {
166 state = ((state << 8) | v) & 0xffffff;
170 state = ((state << 8) | v) & 0xffffff;
174 *header_state =
state;
187 int psm_length, ps_info_length, es_map_length;
199 while (es_map_length >= 4){
200 unsigned char type =
avio_r8(pb);
201 unsigned char es_id =
avio_r8(pb);
207 es_map_length -= 4 + es_info_length;
210 return 2 + psm_length;
217 int64_t *ppos,
int *pstart_code,
218 int64_t *ppts, int64_t *pdts)
222 int pes_ext, ext2_len, id_ext, skip;
256 m->
sofdec = !memcmp(buf,
"ofdec", 5);
272 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
273 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
274 (startcode == 0x1bd) || (startcode == 0x1fd)))
292 if ((c & 0xc0) == 0x40) {
298 if ((c & 0xe0) == 0x20) {
305 }
else if ((c & 0xc0) == 0x80) {
310 if (header_len > len)
321 if (flags & 0x3f && header_len == 0){
329 skip = (pes_ext >> 4) & 0xb;
331 if (pes_ext & 0x40 || skip > header_len){
338 if (pes_ext & 0x01) {
341 if ((ext2_len & 0x7f) > 0) {
343 if ((id_ext & 0x80) == 0)
344 startcode = ((startcode & 0xff) << 8) | id_ext;
373 *pstart_code = startcode;
384 int len, startcode, i, es_type, ret;
385 int lpcm_header_len = -1;
386 int request_probe= 0;
389 int64_t pts, dts, dummy_pos;
396 if (startcode >= 0x80 && startcode <= 0xcf) {
404 if (startcode >= 0xb0 && startcode <= 0xbf) {
414 if (st->
id == startcode)
441 }
else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
442 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
443 unsigned char buf[8];
446 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
451 }
else if (startcode >= 0x1c0 && startcode <= 0x1df) {
454 }
else if (startcode >= 0x80 && startcode <= 0x87) {
457 }
else if ( ( startcode >= 0x88 && startcode <= 0x8f)
458 ||( startcode >= 0x98 && startcode <= 0x9f)) {
462 }
else if (startcode >= 0xa0 && startcode <= 0xaf) {
464 if(lpcm_header_len == 6) {
470 }
else if (startcode >= 0xb0 && startcode <= 0xbf) {
473 }
else if (startcode >= 0xc0 && startcode <= 0xcf) {
477 }
else if (startcode >= 0x20 && startcode <= 0x3f) {
480 }
else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
502 if (startcode >= 0xa0 && startcode <= 0xaf) {
519 freq = (b1 >> 4) & 3;
535 pkt->
pos = dummy_pos;
537 av_dlog(s,
"%d: pts=%0.3f dts=%0.3f size=%d\n",
541 return (ret < 0) ? ret : 0;
545 int64_t *ppos, int64_t pos_limit)
548 int64_t pos, pts, dts;
557 av_dlog(s,
"none (ret=%d)\n", len);
560 if (startcode == s->
streams[stream_index]->
id &&
566 av_dlog(s,
"pos=0x%"PRIx64
" dts=0x%"PRIx64
" %0.3f\n",
567 pos, dts, dts / 90000.0);
583 #if CONFIG_VOBSUB_DEMUXER
585 #define REF_STRING "# VobSub index file,"
589 if (!strncmp(p->
buf, REF_STRING,
sizeof(REF_STRING) - 1))
596 int i, ret = 0, header_parsed = 0, langidx = 0;
598 char *sub_name =
NULL;
600 char *ext, *header_str;
606 fname_len = strlen(sub_name);
607 ext = sub_name - 3 + fname_len;
608 if (fname_len < 4 || *(ext - 1) !=
'.') {
610 "to guess the associated .SUB file\n");
614 memcpy(ext, !strncmp(ext,
"IDX", 3) ?
"SUB" :
"sub", 3);
630 line[strcspn(line,
"\r\n")] = 0;
632 if (!strncmp(line,
"id:", 3)) {
633 int n, stream_id = 0;
636 n = sscanf(line,
"id: %63[^,], index: %u",
id, &stream_id);
639 "assuming 'id: und, index: 0'\n", line);
656 }
else if (st && !strncmp(line,
"timestamp:", 10)) {
659 int64_t pos, timestamp;
660 const char *p = line + 10;
662 if (sscanf(p,
"%02d:%02d:%02d:%03d, filepos: %"PRIx64,
663 &hh, &mm, &ss, &ms, &pos) != 5) {
665 "abort parsing\n", line);
668 timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
677 sub->pts = timestamp;
680 }
else if (st && !strncmp(line,
"alt:", 4)) {
681 const char *p = line + 4;
689 }
else if (!strncmp(line,
"delay:", 6)) {
690 int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
691 const char *p = line + 6;
695 if (*p ==
'-' || *p ==
'+') {
696 sign = *p ==
'-' ? -1 : 1;
699 sscanf(p,
"%d:%d:%d:%d", &hh, &mm, &ss, &ms);
700 delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
702 }
else if (!strncmp(line,
"langidx:", 8)) {
703 const char *p = line + 8;
705 if (sscanf(p,
"%d", &langidx) != 1)
708 }
else if (!header_parsed) {
709 if (line[0] && line[0] !=
'#')
714 if (langidx < s->nb_streams)
742 int ret, psize, len16 = -1;
755 psize = fsize < 0 ? 0xffff : fsize - idx_pkt.
pos;
765 int n, to_read, startcode;
771 to_read = ret & 0xffff;
774 if (pkt->
size + to_read > psize)
778 if (len16 != -1 && pkt->
size + to_read > len16)
791 pkt->
size -= to_read - n;
794 if (len16 == -1 && n > 2)
796 }
while (len16 != -1 && pkt->
size != len16);
806 int64_t min_ts, int64_t ts, int64_t max_ts,
int flags)
810 min_ts, ts, max_ts, flags);
829 .read_seek2 = vobsub_read_seek,