You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Merge commit '5b8f0a5eac75d16376af60a6f6bb79b3e9e6dab7'
* commit '5b8f0a5eac75d16376af60a6f6bb79b3e9e6dab7': mpeg: K&R formatting cosmetics Conflicts: libavformat/mpeg.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		| @@ -37,74 +37,85 @@ | |||||||
|  |  | ||||||
| #define MAX_SYNC_SIZE 100000 | #define MAX_SYNC_SIZE 100000 | ||||||
|  |  | ||||||
| static int check_pes(const uint8_t *p, const uint8_t *end){ | static int check_pes(const uint8_t *p, const uint8_t *end) | ||||||
|  | { | ||||||
|     int pes1; |     int pes1; | ||||||
|     int pes2=      (p[3] & 0xC0) == 0x80 |     int pes2 = (p[3] & 0xC0) == 0x80 && | ||||||
|                 && (p[4] & 0xC0) != 0x40 |                (p[4] & 0xC0) != 0x40 && | ||||||
|                 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0)); |                ((p[4] & 0xC0) == 0x00 || | ||||||
|  |                 (p[4] & 0xC0) >> 2 == (p[6] & 0xF0)); | ||||||
|  |  | ||||||
|     for(p+=3; p<end && *p == 0xFF; p++); |     for (p += 3; p < end && *p == 0xFF; p++) ; | ||||||
|     if((*p&0xC0) == 0x40) p+=2; |     if ((*p & 0xC0) == 0x40) | ||||||
|     if((*p&0xF0) == 0x20){ |         p += 2; | ||||||
|         pes1= p[0]&p[2]&p[4]&1; |  | ||||||
|     }else if((*p&0xF0) == 0x30){ |     if ((*p & 0xF0) == 0x20) | ||||||
|         pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1; |         pes1 = p[0] & p[2] & p[4] & 1; | ||||||
|     }else |     else if ((*p & 0xF0) == 0x30) | ||||||
|  |         pes1 = p[0] & p[2] & p[4] & p[5] & p[7] & p[9] & 1; | ||||||
|  |     else | ||||||
|         pes1 = *p == 0x0F; |         pes1 = *p == 0x0F; | ||||||
|  |  | ||||||
|     return pes1||pes2; |     return pes1 || pes2; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int check_pack_header(const uint8_t *buf) { | static int check_pack_header(const uint8_t *buf) | ||||||
|  | { | ||||||
|     return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20; |     return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpegps_probe(AVProbeData *p) | static int mpegps_probe(AVProbeData *p) | ||||||
| { | { | ||||||
|     uint32_t code= -1; |     uint32_t code = -1; | ||||||
|     int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0; |  | ||||||
|     int i; |     int i; | ||||||
|     int score=0; |     int sys = 0, pspack = 0, priv1 = 0, vid = 0; | ||||||
|  |     int audio = 0, invalid = 0, score = 0; | ||||||
|  |  | ||||||
|     for(i=0; i<p->buf_size; i++){ |     for (i = 0; i < p->buf_size; i++) { | ||||||
|         code = (code<<8) + p->buf[i]; |         code = (code << 8) + p->buf[i]; | ||||||
|         if ((code & 0xffffff00) == 0x100) { |         if ((code & 0xffffff00) == 0x100) { | ||||||
|             int len= p->buf[i+1] << 8 | p->buf[i+2]; |             int len  = p->buf[i + 1] << 8 | p->buf[i + 2]; | ||||||
|             int pes= check_pes(p->buf+i, p->buf+p->buf_size); |             int pes  = check_pes(p->buf + i, p->buf + p->buf_size); | ||||||
|             int pack = check_pack_header(p->buf+i); |             int pack = check_pack_header(p->buf + i); | ||||||
|  |  | ||||||
|             if(code == SYSTEM_HEADER_START_CODE) sys++; |             if (code == SYSTEM_HEADER_START_CODE) | ||||||
|             else if(code == PACK_START_CODE && pack) pspack++; |                 sys++; | ||||||
|             else if((code & 0xf0) == VIDEO_ID &&  pes) vid++; |             else if (code == PACK_START_CODE && pack) | ||||||
|  |                 pspack++; | ||||||
|  |             else if ((code & 0xf0) == VIDEO_ID && pes) | ||||||
|  |                 vid++; | ||||||
|             // skip pes payload to avoid start code emulation for private |             // skip pes payload to avoid start code emulation for private | ||||||
|             // and audio streams |             // and audio streams | ||||||
|             else if((code & 0xe0) == AUDIO_ID &&  pes) {audio++; i+=len;} |             else if ((code & 0xe0) == AUDIO_ID &&  pes) {audio++; i+=len;} | ||||||
|             else if(code == PRIVATE_STREAM_1  &&  pes) {priv1++; i+=len;} |             else if (code == PRIVATE_STREAM_1  &&  pes) {priv1++; i+=len;} | ||||||
|             else if(code == 0x1fd             &&  pes) vid++; //VC1 |             else if (code == 0x1fd             &&  pes) vid++; //VC1 | ||||||
|  |  | ||||||
|             else if((code & 0xf0) == VIDEO_ID && !pes) invalid++; |             else if ((code & 0xf0) == VIDEO_ID && !pes) invalid++; | ||||||
|             else if((code & 0xe0) == AUDIO_ID && !pes) invalid++; |             else if ((code & 0xe0) == AUDIO_ID && !pes) invalid++; | ||||||
|             else if(code == PRIVATE_STREAM_1  && !pes) invalid++; |             else if (code == PRIVATE_STREAM_1  && !pes) invalid++; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if(vid+audio > invalid+1)     /* invalid VDR files nd short PES streams */ |     if (vid + audio > invalid + 1) /* invalid VDR files nd short PES streams */ | ||||||
|         score = AVPROBE_SCORE_EXTENSION / 2; |         score = AVPROBE_SCORE_EXTENSION / 2; | ||||||
|  |  | ||||||
|     if(sys>invalid && sys*9 <= pspack*10) |     if (sys > invalid && sys * 9 <= pspack * 10) | ||||||
|         return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg |         return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_EXTENSION + 2 | ||||||
|     if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9) |                                                      : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg | ||||||
|         return pspack > 2 ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg |     if (pspack > invalid && (priv1 + vid + audio) * 10 >= pspack * 9) | ||||||
|     if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */ |         return pspack > 2 ? AVPROBE_SCORE_EXTENSION + 2 | ||||||
|         return (audio > 12 || vid > 3 + 2*invalid) ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; |                           : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg | ||||||
|  |     if ((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && | ||||||
|  |         !pspack && p->buf_size > 2048 && vid + audio > invalid) /* PES stream */ | ||||||
|  |         return (audio > 12 || vid > 3 + 2 * invalid) ? AVPROBE_SCORE_EXTENSION + 2 | ||||||
|  |                                                      : AVPROBE_SCORE_EXTENSION / 2; | ||||||
|  |  | ||||||
|     //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 |     // 02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 | ||||||
|     //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6 |     // mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6 | ||||||
|     //Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618 |     // Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618 | ||||||
|     return score; |     return score; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct MpegDemuxContext { | typedef struct MpegDemuxContext { | ||||||
|     int32_t header_state; |     int32_t header_state; | ||||||
|     unsigned char psm_es_type[256]; |     unsigned char psm_es_type[256]; | ||||||
| @@ -124,7 +135,7 @@ static int mpegps_read_header(AVFormatContext *s) | |||||||
|     int64_t last_pos = avio_tell(s->pb); |     int64_t last_pos = avio_tell(s->pb); | ||||||
|  |  | ||||||
|     m->header_state = 0xff; |     m->header_state = 0xff; | ||||||
|     s->ctx_flags |= AVFMTCTX_NOHEADER; |     s->ctx_flags   |= AVFMTCTX_NOHEADER; | ||||||
|  |  | ||||||
|     avio_get_str(s->pb, 6, buffer, sizeof(buffer)); |     avio_get_str(s->pb, 6, buffer, sizeof(buffer)); | ||||||
|     if (!memcmp("IMKH", buffer, 4)) { |     if (!memcmp("IMKH", buffer, 4)) { | ||||||
| @@ -142,8 +153,8 @@ static int64_t get_pts(AVIOContext *pb, int c) | |||||||
| { | { | ||||||
|     uint8_t buf[5]; |     uint8_t buf[5]; | ||||||
|  |  | ||||||
|     buf[0] = c<0 ? avio_r8(pb) : c; |     buf[0] = c < 0 ? avio_r8(pb) : c; | ||||||
|     avio_read(pb, buf+1, 4); |     avio_read(pb, buf + 1, 4); | ||||||
|  |  | ||||||
|     return ff_parse_pes_pts(buf); |     return ff_parse_pes_pts(buf); | ||||||
| } | } | ||||||
| @@ -155,7 +166,7 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr, | |||||||
|     int val, n; |     int val, n; | ||||||
|  |  | ||||||
|     state = *header_state; |     state = *header_state; | ||||||
|     n = *size_ptr; |     n     = *size_ptr; | ||||||
|     while (n > 0) { |     while (n > 0) { | ||||||
|         if (url_feof(pb)) |         if (url_feof(pb)) | ||||||
|             break; |             break; | ||||||
| @@ -163,15 +174,16 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr, | |||||||
|         n--; |         n--; | ||||||
|         if (state == 0x000001) { |         if (state == 0x000001) { | ||||||
|             state = ((state << 8) | v) & 0xffffff; |             state = ((state << 8) | v) & 0xffffff; | ||||||
|             val = state; |             val   = state; | ||||||
|             goto found; |             goto found; | ||||||
|         } |         } | ||||||
|         state = ((state << 8) | v) & 0xffffff; |         state = ((state << 8) | v) & 0xffffff; | ||||||
|     } |     } | ||||||
|     val = -1; |     val = -1; | ||||||
|  found: |  | ||||||
|  | found: | ||||||
|     *header_state = state; |     *header_state = state; | ||||||
|     *size_ptr = n; |     *size_ptr     = n; | ||||||
|     return val; |     return val; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -197,10 +209,11 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb) | |||||||
|     es_map_length = psm_length - ps_info_length - 10; |     es_map_length = psm_length - ps_info_length - 10; | ||||||
|  |  | ||||||
|     /* at least one es available? */ |     /* at least one es available? */ | ||||||
|     while (es_map_length >= 4){ |     while (es_map_length >= 4) { | ||||||
|         unsigned char type      = avio_r8(pb); |         unsigned char type      = avio_r8(pb); | ||||||
|         unsigned char es_id     = avio_r8(pb); |         unsigned char es_id     = avio_r8(pb); | ||||||
|         uint16_t es_info_length = avio_rb16(pb); |         uint16_t es_info_length = avio_rb16(pb); | ||||||
|  |  | ||||||
|         /* remember mapping from stream id to stream type */ |         /* remember mapping from stream id to stream type */ | ||||||
|         m->psm_es_type[es_id] = type; |         m->psm_es_type[es_id] = type; | ||||||
|         /* skip program_stream_info */ |         /* skip program_stream_info */ | ||||||
| @@ -212,7 +225,7 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* read the next PES header. Return its position in ppos | /* read the next PES header. Return its position in ppos | ||||||
|    (if not NULL), and its start code, pts and dts. |  * (if not NULL), and its start code, pts and dts. | ||||||
|  */ |  */ | ||||||
| static int mpegps_read_pes_header(AVFormatContext *s, | static int mpegps_read_pes_header(AVFormatContext *s, | ||||||
|                                   int64_t *ppos, int *pstart_code, |                                   int64_t *ppos, int *pstart_code, | ||||||
| @@ -222,20 +235,20 @@ static int mpegps_read_pes_header(AVFormatContext *s, | |||||||
|     int len, size, startcode, c, flags, header_len; |     int len, size, startcode, c, flags, header_len; | ||||||
|     int pes_ext, ext2_len, id_ext, skip; |     int pes_ext, ext2_len, id_ext, skip; | ||||||
|     int64_t pts, dts; |     int64_t pts, dts; | ||||||
|     int64_t last_sync= avio_tell(s->pb); |     int64_t last_sync = avio_tell(s->pb); | ||||||
|  |  | ||||||
|  error_redo: | error_redo: | ||||||
|         avio_seek(s->pb, last_sync, SEEK_SET); |     avio_seek(s->pb, last_sync, SEEK_SET); | ||||||
|  redo: | redo: | ||||||
|         /* next start code (should be immediately after) */ |     /* next start code (should be immediately after) */ | ||||||
|         m->header_state = 0xff; |     m->header_state = 0xff; | ||||||
|         size = MAX_SYNC_SIZE; |     size      = MAX_SYNC_SIZE; | ||||||
|         startcode = find_next_start_code(s->pb, &size, &m->header_state); |     startcode = find_next_start_code(s->pb, &size, &m->header_state); | ||||||
|         last_sync = avio_tell(s->pb); |     last_sync = avio_tell(s->pb); | ||||||
|     if (startcode < 0){ |     if (startcode < 0) { | ||||||
|         if(url_feof(s->pb)) |         if (url_feof(s->pb)) | ||||||
|             return AVERROR_EOF; |             return AVERROR_EOF; | ||||||
|         //FIXME we should remember header_state |         // FIXME we should remember header_state | ||||||
|         return AVERROR(EAGAIN); |         return AVERROR(EAGAIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -346,7 +359,7 @@ static int mpegps_read_pes_header(AVFormatContext *s, | |||||||
|     if (startcode != PRIVATE_STREAM_2) |     if (startcode != PRIVATE_STREAM_2) | ||||||
|     { |     { | ||||||
|     /* stuffing */ |     /* stuffing */ | ||||||
|     for(;;) { |     for (;;) { | ||||||
|         if (len < 1) |         if (len < 1) | ||||||
|             goto error_redo; |             goto error_redo; | ||||||
|         c = avio_r8(s->pb); |         c = avio_r8(s->pb); | ||||||
| @@ -358,45 +371,47 @@ static int mpegps_read_pes_header(AVFormatContext *s, | |||||||
|     if ((c & 0xc0) == 0x40) { |     if ((c & 0xc0) == 0x40) { | ||||||
|         /* buffer scale & size */ |         /* buffer scale & size */ | ||||||
|         avio_r8(s->pb); |         avio_r8(s->pb); | ||||||
|         c = avio_r8(s->pb); |         c    = avio_r8(s->pb); | ||||||
|         len -= 2; |         len -= 2; | ||||||
|     } |     } | ||||||
|     if ((c & 0xe0) == 0x20) { |     if ((c & 0xe0) == 0x20) { | ||||||
|         dts = pts = get_pts(s->pb, c); |         dts  = | ||||||
|  |         pts  = get_pts(s->pb, c); | ||||||
|         len -= 4; |         len -= 4; | ||||||
|         if (c & 0x10){ |         if (c & 0x10) { | ||||||
|             dts = get_pts(s->pb, -1); |             dts  = get_pts(s->pb, -1); | ||||||
|             len -= 5; |             len -= 5; | ||||||
|         } |         } | ||||||
|     } else if ((c & 0xc0) == 0x80) { |     } else if ((c & 0xc0) == 0x80) { | ||||||
|         /* mpeg 2 PES */ |         /* mpeg 2 PES */ | ||||||
|         flags = avio_r8(s->pb); |         flags      = avio_r8(s->pb); | ||||||
|         header_len = avio_r8(s->pb); |         header_len = avio_r8(s->pb); | ||||||
|         len -= 2; |         len       -= 2; | ||||||
|         if (header_len > len) |         if (header_len > len) | ||||||
|             goto error_redo; |             goto error_redo; | ||||||
|         len -= header_len; |         len -= header_len; | ||||||
|         if (flags & 0x80) { |         if (flags & 0x80) { | ||||||
|             dts = pts = get_pts(s->pb, -1); |             dts         = pts = get_pts(s->pb, -1); | ||||||
|             header_len -= 5; |             header_len -= 5; | ||||||
|             if (flags & 0x40) { |             if (flags & 0x40) { | ||||||
|                 dts = get_pts(s->pb, -1); |                 dts         = get_pts(s->pb, -1); | ||||||
|                 header_len -= 5; |                 header_len -= 5; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (flags & 0x3f && header_len == 0){ |         if (flags & 0x3f && header_len == 0) { | ||||||
|             flags &= 0xC0; |             flags &= 0xC0; | ||||||
|             av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n"); |             av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n"); | ||||||
|         } |         } | ||||||
|         if (flags & 0x01) { /* PES extension */ |         if (flags & 0x01) { /* PES extension */ | ||||||
|             pes_ext = avio_r8(s->pb); |             pes_ext = avio_r8(s->pb); | ||||||
|             header_len--; |             header_len--; | ||||||
|             /* Skip PES private data, program packet sequence counter and P-STD buffer */ |             /* Skip PES private data, program packet sequence counter | ||||||
|             skip = (pes_ext >> 4) & 0xb; |              * and P-STD buffer */ | ||||||
|  |             skip  = (pes_ext >> 4) & 0xb; | ||||||
|             skip += skip & 0x9; |             skip += skip & 0x9; | ||||||
|             if (pes_ext & 0x40 || skip > header_len){ |             if (pes_ext & 0x40 || skip > header_len) { | ||||||
|                 av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext); |                 av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext); | ||||||
|                 pes_ext=skip=0; |                 pes_ext = skip = 0; | ||||||
|             } |             } | ||||||
|             avio_skip(s->pb, skip); |             avio_skip(s->pb, skip); | ||||||
|             header_len -= skip; |             header_len -= skip; | ||||||
| @@ -412,11 +427,10 @@ static int mpegps_read_pes_header(AVFormatContext *s, | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if(header_len < 0) |         if (header_len < 0) | ||||||
|             goto error_redo; |             goto error_redo; | ||||||
|         avio_skip(s->pb, header_len); |         avio_skip(s->pb, header_len); | ||||||
|     } |     } else if (c != 0xf) | ||||||
|     else if( c!= 0xf ) |  | ||||||
|         goto redo; |         goto redo; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -424,22 +438,23 @@ static int mpegps_read_pes_header(AVFormatContext *s, | |||||||
|         startcode = avio_r8(s->pb); |         startcode = avio_r8(s->pb); | ||||||
|         len--; |         len--; | ||||||
|     } |     } | ||||||
|     if(len<0) |     if (len < 0) | ||||||
|         goto error_redo; |         goto error_redo; | ||||||
|     if(dts != AV_NOPTS_VALUE && ppos){ |     if (dts != AV_NOPTS_VALUE && ppos) { | ||||||
|         int i; |         int i; | ||||||
|         for(i=0; i<s->nb_streams; i++){ |         for (i = 0; i < s->nb_streams; i++) { | ||||||
|             if(startcode == s->streams[i]->id && |             if (startcode == s->streams[i]->id && | ||||||
|                s->pb->seekable /* index useless on streams anyway */) { |                 s->pb->seekable /* index useless on streams anyway */) { | ||||||
|                 ff_reduce_index(s, i); |                 ff_reduce_index(s, i); | ||||||
|                 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); |                 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, | ||||||
|  |                                    AVINDEX_KEYFRAME /* FIXME keyframe? */); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     *pstart_code = startcode; |     *pstart_code = startcode; | ||||||
|     *ppts = pts; |     *ppts        = pts; | ||||||
|     *pdts = dts; |     *pdts        = dts; | ||||||
|     return len; |     return len; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -453,15 +468,15 @@ static int mpegps_read_packet(AVFormatContext *s, | |||||||
|     int request_probe= 0; |     int request_probe= 0; | ||||||
|     enum AVCodecID codec_id = AV_CODEC_ID_NONE; |     enum AVCodecID codec_id = AV_CODEC_ID_NONE; | ||||||
|     enum AVMediaType type; |     enum AVMediaType type; | ||||||
|     int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work |     int64_t pts, dts, dummy_pos; // dummy_pos is needed for the index building to work | ||||||
|  |  | ||||||
|  redo: | redo: | ||||||
|     len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |     len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); | ||||||
|     if (len < 0) |     if (len < 0) | ||||||
|         return len; |         return len; | ||||||
|  |  | ||||||
|     if (startcode >= 0x80 && startcode <= 0xcf) { |     if (startcode >= 0x80 && startcode <= 0xcf) { | ||||||
|         if(len < 4) |         if (len < 4) | ||||||
|             goto skip; |             goto skip; | ||||||
|  |  | ||||||
|         /* audio: skip header */ |         /* audio: skip header */ | ||||||
| @@ -476,44 +491,45 @@ static int mpegps_read_packet(AVFormatContext *s, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* now find stream */ |     /* now find stream */ | ||||||
|     for(i=0;i<s->nb_streams;i++) { |     for (i = 0; i < s->nb_streams; i++) { | ||||||
|         st = s->streams[i]; |         st = s->streams[i]; | ||||||
|         if (st->id == startcode) |         if (st->id == startcode) | ||||||
|             goto found; |             goto found; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     es_type = m->psm_es_type[startcode & 0xff]; |     es_type = m->psm_es_type[startcode & 0xff]; | ||||||
|         if(es_type == STREAM_TYPE_VIDEO_MPEG1){ |         if (es_type == STREAM_TYPE_VIDEO_MPEG1) { | ||||||
|             codec_id = AV_CODEC_ID_MPEG2VIDEO; |             codec_id = AV_CODEC_ID_MPEG2VIDEO; | ||||||
|             type = AVMEDIA_TYPE_VIDEO; |             type     = AVMEDIA_TYPE_VIDEO; | ||||||
|         } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){ |         } else if (es_type == STREAM_TYPE_VIDEO_MPEG2) { | ||||||
|             codec_id = AV_CODEC_ID_MPEG2VIDEO; |             codec_id = AV_CODEC_ID_MPEG2VIDEO; | ||||||
|             type = AVMEDIA_TYPE_VIDEO; |             type     = AVMEDIA_TYPE_VIDEO; | ||||||
|         } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 || |         } else if (es_type == STREAM_TYPE_AUDIO_MPEG1 || | ||||||
|                   es_type == STREAM_TYPE_AUDIO_MPEG2){ |                    es_type == STREAM_TYPE_AUDIO_MPEG2) { | ||||||
|             codec_id = AV_CODEC_ID_MP3; |             codec_id = AV_CODEC_ID_MP3; | ||||||
|             type = AVMEDIA_TYPE_AUDIO; |             type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         } else if(es_type == STREAM_TYPE_AUDIO_AAC){ |         } else if (es_type == STREAM_TYPE_AUDIO_AAC) { | ||||||
|             codec_id = AV_CODEC_ID_AAC; |             codec_id = AV_CODEC_ID_AAC; | ||||||
|             type = AVMEDIA_TYPE_AUDIO; |             type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ |         } else if (es_type == STREAM_TYPE_VIDEO_MPEG4) { | ||||||
|             codec_id = AV_CODEC_ID_MPEG4; |             codec_id = AV_CODEC_ID_MPEG4; | ||||||
|             type = AVMEDIA_TYPE_VIDEO; |             type     = AVMEDIA_TYPE_VIDEO; | ||||||
|         } else if(es_type == STREAM_TYPE_VIDEO_H264){ |         } else if (es_type == STREAM_TYPE_VIDEO_H264) { | ||||||
|             codec_id = AV_CODEC_ID_H264; |             codec_id = AV_CODEC_ID_H264; | ||||||
|             type = AVMEDIA_TYPE_VIDEO; |             type     = AVMEDIA_TYPE_VIDEO; | ||||||
|         } else if(es_type == STREAM_TYPE_AUDIO_AC3){ |         } else if (es_type == STREAM_TYPE_AUDIO_AC3) { | ||||||
|             codec_id = AV_CODEC_ID_AC3; |             codec_id = AV_CODEC_ID_AC3; | ||||||
|             type = AVMEDIA_TYPE_AUDIO; |             type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         } else if(m->imkh_cctv && es_type == 0x91){ |         } else if (m->imkh_cctv && es_type == 0x91) { | ||||||
|             codec_id = AV_CODEC_ID_PCM_MULAW; |             codec_id = AV_CODEC_ID_PCM_MULAW; | ||||||
|             type = AVMEDIA_TYPE_AUDIO; |             type     = AVMEDIA_TYPE_AUDIO; | ||||||
|     } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { |     } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { | ||||||
|         static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; |         static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; | ||||||
|         unsigned char buf[8]; |         unsigned char buf[8]; | ||||||
|  |  | ||||||
|         avio_read(s->pb, buf, 8); |         avio_read(s->pb, buf, 8); | ||||||
|         avio_seek(s->pb, -8, SEEK_CUR); |         avio_seek(s->pb, -8, SEEK_CUR); | ||||||
|         if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) |         if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) | ||||||
|             codec_id = AV_CODEC_ID_CAVS; |             codec_id = AV_CODEC_ID_CAVS; | ||||||
|         else |         else | ||||||
|             request_probe= 1; |             request_probe= 1; | ||||||
| @@ -522,7 +538,7 @@ static int mpegps_read_packet(AVFormatContext *s, | |||||||
|         type = AVMEDIA_TYPE_DATA; |         type = AVMEDIA_TYPE_DATA; | ||||||
|         codec_id = AV_CODEC_ID_DVD_NAV; |         codec_id = AV_CODEC_ID_DVD_NAV; | ||||||
|     } else if (startcode >= 0x1c0 && startcode <= 0x1df) { |     } else if (startcode >= 0x1c0 && startcode <= 0x1df) { | ||||||
|         type = AVMEDIA_TYPE_AUDIO; |         type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         if (m->sofdec > 0) { |         if (m->sofdec > 0) { | ||||||
|             codec_id = AV_CODEC_ID_ADPCM_ADX; |             codec_id = AV_CODEC_ID_ADPCM_ADX; | ||||||
|             // Auto-detect AC-3 |             // Auto-detect AC-3 | ||||||
| @@ -531,35 +547,35 @@ static int mpegps_read_packet(AVFormatContext *s, | |||||||
|             codec_id = AV_CODEC_ID_MP2; |             codec_id = AV_CODEC_ID_MP2; | ||||||
|         } |         } | ||||||
|     } else if (startcode >= 0x80 && startcode <= 0x87) { |     } else if (startcode >= 0x80 && startcode <= 0x87) { | ||||||
|         type = AVMEDIA_TYPE_AUDIO; |         type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         codec_id = AV_CODEC_ID_AC3; |         codec_id = AV_CODEC_ID_AC3; | ||||||
|     } else if (  ( startcode >= 0x88 && startcode <= 0x8f) |     } else if ((startcode >= 0x88 && startcode <= 0x8f) || | ||||||
|                ||( startcode >= 0x98 && startcode <= 0x9f)) { |                (startcode >= 0x98 && startcode <= 0x9f)) { | ||||||
|         /* 0x90 - 0x97 is reserved for SDDS in DVD specs */ |         /* 0x90 - 0x97 is reserved for SDDS in DVD specs */ | ||||||
|         type = AVMEDIA_TYPE_AUDIO; |         type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         codec_id = AV_CODEC_ID_DTS; |         codec_id = AV_CODEC_ID_DTS; | ||||||
|     } else if (startcode >= 0xa0 && startcode <= 0xaf) { |     } else if (startcode >= 0xa0 && startcode <= 0xaf) { | ||||||
|         type = AVMEDIA_TYPE_AUDIO; |         type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         if(lpcm_header_len == 6) { |         if (lpcm_header_len == 6) { | ||||||
|             codec_id = AV_CODEC_ID_MLP; |             codec_id = AV_CODEC_ID_MLP; | ||||||
|         } else { |         } else { | ||||||
|             codec_id = AV_CODEC_ID_PCM_DVD; |             codec_id = AV_CODEC_ID_PCM_DVD; | ||||||
|         } |         } | ||||||
|     } else if (startcode >= 0xb0 && startcode <= 0xbf) { |     } else if (startcode >= 0xb0 && startcode <= 0xbf) { | ||||||
|         type = AVMEDIA_TYPE_AUDIO; |         type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         codec_id = AV_CODEC_ID_TRUEHD; |         codec_id = AV_CODEC_ID_TRUEHD; | ||||||
|     } else if (startcode >= 0xc0 && startcode <= 0xcf) { |     } else if (startcode >= 0xc0 && startcode <= 0xcf) { | ||||||
|         /* Used for both AC-3 and E-AC-3 in EVOB files */ |         /* Used for both AC-3 and E-AC-3 in EVOB files */ | ||||||
|         type = AVMEDIA_TYPE_AUDIO; |         type     = AVMEDIA_TYPE_AUDIO; | ||||||
|         codec_id = AV_CODEC_ID_AC3; |         codec_id = AV_CODEC_ID_AC3; | ||||||
|     } else if (startcode >= 0x20 && startcode <= 0x3f) { |     } else if (startcode >= 0x20 && startcode <= 0x3f) { | ||||||
|         type = AVMEDIA_TYPE_SUBTITLE; |         type     = AVMEDIA_TYPE_SUBTITLE; | ||||||
|         codec_id = AV_CODEC_ID_DVD_SUBTITLE; |         codec_id = AV_CODEC_ID_DVD_SUBTITLE; | ||||||
|     } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) { |     } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) { | ||||||
|         type = AVMEDIA_TYPE_VIDEO; |         type     = AVMEDIA_TYPE_VIDEO; | ||||||
|         codec_id = AV_CODEC_ID_VC1; |         codec_id = AV_CODEC_ID_VC1; | ||||||
|     } else { |     } else { | ||||||
|     skip: | skip: | ||||||
|         /* skip packet */ |         /* skip packet */ | ||||||
|         avio_skip(s->pb, len); |         avio_skip(s->pb, len); | ||||||
|         goto redo; |         goto redo; | ||||||
| @@ -568,18 +584,19 @@ static int mpegps_read_packet(AVFormatContext *s, | |||||||
|     st = avformat_new_stream(s, NULL); |     st = avformat_new_stream(s, NULL); | ||||||
|     if (!st) |     if (!st) | ||||||
|         goto skip; |         goto skip; | ||||||
|     st->id = startcode; |     st->id                = startcode; | ||||||
|     st->codec->codec_type = type; |     st->codec->codec_type = type; | ||||||
|     st->codec->codec_id = codec_id; |     st->codec->codec_id   = codec_id; | ||||||
|     if (st->codec->codec_id == AV_CODEC_ID_PCM_MULAW) { |     if (st->codec->codec_id == AV_CODEC_ID_PCM_MULAW) { | ||||||
|         st->codec->channels = 1; |         st->codec->channels = 1; | ||||||
|         st->codec->channel_layout = AV_CH_LAYOUT_MONO; |         st->codec->channel_layout = AV_CH_LAYOUT_MONO; | ||||||
|         st->codec->sample_rate = 8000; |         st->codec->sample_rate = 8000; | ||||||
|     } |     } | ||||||
|     st->request_probe     = request_probe; |     st->request_probe     = request_probe; | ||||||
|     st->need_parsing = AVSTREAM_PARSE_FULL; |     st->need_parsing      = AVSTREAM_PARSE_FULL; | ||||||
|  found: |  | ||||||
|     if(st->discard >= AVDISCARD_ALL) | found: | ||||||
|  |     if (st->discard >= AVDISCARD_ALL) | ||||||
|         goto skip; |         goto skip; | ||||||
|     if (startcode >= 0xa0 && startcode <= 0xaf) { |     if (startcode >= 0xa0 && startcode <= 0xaf) { | ||||||
|       if (lpcm_header_len == 6 && st->codec->codec_id == AV_CODEC_ID_MLP) { |       if (lpcm_header_len == 6 && st->codec->codec_id == AV_CODEC_ID_MLP) { | ||||||
| @@ -590,9 +607,10 @@ static int mpegps_read_packet(AVFormatContext *s, | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     ret = av_get_packet(s->pb, pkt, len); |     ret = av_get_packet(s->pb, pkt, len); | ||||||
|     pkt->pts = pts; |  | ||||||
|     pkt->dts = dts; |     pkt->pts          = pts; | ||||||
|     pkt->pos = dummy_pos; |     pkt->dts          = dts; | ||||||
|  |     pkt->pos          = dummy_pos; | ||||||
|     pkt->stream_index = st->index; |     pkt->stream_index = st->index; | ||||||
|     av_dlog(s, "%d: pts=%0.3f dts=%0.3f size=%d\n", |     av_dlog(s, "%d: pts=%0.3f dts=%0.3f size=%d\n", | ||||||
|             pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, |             pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, | ||||||
| @@ -611,7 +629,7 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, | |||||||
|     if (avio_seek(s->pb, pos, SEEK_SET) < 0) |     if (avio_seek(s->pb, pos, SEEK_SET) < 0) | ||||||
|         return AV_NOPTS_VALUE; |         return AV_NOPTS_VALUE; | ||||||
|  |  | ||||||
|     for(;;) { |     for (;;) { | ||||||
|         len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |         len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); | ||||||
|         if (len < 0) { |         if (len < 0) { | ||||||
|             av_dlog(s, "none (ret=%d)\n", len); |             av_dlog(s, "none (ret=%d)\n", len); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user