26 #if CONFIG_VOBSUB_DEMUXER 
   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,