annotate libmpdemux/demux_mpg.c @ 15148:067f10ad6538

New section: "menc-feat-dvd-mpeg4-muxing" about how to mux a video obtained with MEncoder into different containers. Based on Rich's guide and some tips by Nico Sabi. Reviewed by The Wanderer, Dominik 'Rathann' Mierzejewski and Diego Biurrun
author gpoirier
date Wed, 13 Apr 2005 18:53:30 +0000
parents b7aa70b05d76
children 39eb8a327ea9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 // MPG/VOB file parser for DEMUXER v2.5 by A'rpi/ESP-team
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
3 #include <stdio.h>
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
4 #include <stdlib.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1338
diff changeset
5 #include <unistd.h>
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
6
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
7 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
8 #include "mp_msg.h"
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1735
diff changeset
9 #include "help_mp.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
10
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
11 #include "stream.h"
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
12 #include "demuxer.h"
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
13 #include "parse_es.h"
2338
4f3e8c8ea32f includes cleanup
arpi
parents: 2310
diff changeset
14 #include "stheader.h"
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
15 #include "mp3_hdr.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
16
524
9105fc95636c A fast'n'ugly hack to correct DVD VOB playback problems
lgb
parents: 501
diff changeset
17 //#define MAX_PS_PACKETSIZE 2048
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
18 #define MAX_PS_PACKETSIZE (224*1024)
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
19
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
20 #define UNKNOWN 0
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
21 #define VIDEO_MPEG1 0x10000001
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
22 #define VIDEO_MPEG2 0x10000002
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
23 #define VIDEO_MPEG4 0x10000004
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
24 #define VIDEO_H264 0x10000005
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
25 #define AUDIO_MP2 0x50
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
26 #define AUDIO_A52 0x2000
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
27 #define AUDIO_LPCM_BE 0x10001
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
28 #define AUDIO_AAC mmioFOURCC('M', 'P', '4', 'A')
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
29
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
30 typedef struct mpg_demuxer {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
31 float last_pts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
32 float final_pts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
33 int has_valid_timestamps;
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
34 unsigned int es_map[0x40]; //es map of stream types (associated to the pes id) from 0xb0 to 0xef
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
35 int num_a_streams;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
36 int a_stream_ids[MAX_A_STREAMS];
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
37 } mpg_demuxer_t;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
38
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
39 static int mpeg_pts_error=0;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
40
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
41 static int parse_psm(demuxer_t *demux, int len) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
42 unsigned char c, id, type;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
43 unsigned int plen, prog_len, es_map_len;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
44 mpg_demuxer_t *priv = (mpg_demuxer_t *) demux->priv;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
45
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
46 mp_dbg(MSGT_DEMUX,MSGL_V, "PARSE_PSM, len=%d\n", len);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
47 if(! len)
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
48 return 0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
49
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
50 c = stream_read_char(demux->stream);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
51 if(! (c & 0x80)) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
52 stream_skip(demux->stream, len - 1); //not yet valid, discard
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
53 return 0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
54 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
55 stream_skip(demux->stream, 1);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
56 prog_len = stream_read_word(demux->stream); //length of program descriptors
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
57 stream_skip(demux->stream, prog_len); //.. that we ignore
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
58 es_map_len = stream_read_word(demux->stream); //length of elementary streams map
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
59 es_map_len = min(es_map_len, len - prog_len - 8); //sanity check
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
60 while(es_map_len > 0) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
61 type = stream_read_char(demux->stream);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
62 id = stream_read_char(demux->stream);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
63 if(id >= 0xB0 && id <= 0xEF && priv) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
64 int idoffset = id - 0xB0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
65 switch(type) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
66 case 0x1:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
67 priv->es_map[idoffset] = VIDEO_MPEG1;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
68 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
69 case 0x2:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
70 priv->es_map[idoffset] = VIDEO_MPEG2;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
71 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
72 case 0x3:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
73 case 0x4:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
74 priv->es_map[idoffset] = AUDIO_MP2;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
75 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
76 case 0x0f:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
77 case 0x11:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
78 priv->es_map[idoffset] = AUDIO_AAC;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
79 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
80 case 0x10:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
81 priv->es_map[idoffset] = VIDEO_MPEG4;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
82 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
83 case 0x1b:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
84 priv->es_map[idoffset] = VIDEO_H264;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
85 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
86 case 0x81:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
87 priv->es_map[idoffset] = AUDIO_A52;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
88 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
89 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
90 mp_dbg(MSGT_DEMUX,MSGL_V, "PSM ES, id=0x%x, type=%x, stype: %x\n", id, type, priv->es_map[idoffset]);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
91 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
92 plen = stream_read_word(demux->stream); //length of elementary stream descriptors
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
93 plen = min(plen, es_map_len); //sanity check
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
94 stream_skip(demux->stream, plen); //skip descriptors for now
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
95 es_map_len -= 4 + plen;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
96 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
97 stream_skip(demux->stream, 4); //skip crc32
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
98 return 1;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
99 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
100
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
101 /// Open an mpg physical stream
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
102 int demux_mpg_open(demuxer_t* demuxer) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
103 stream_t *s = demuxer->stream;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
104 off_t pos = stream_tell(s);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
105 off_t end_seq_start = demuxer->movi_end-500000; // 500000 is a wild guess
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
106 float half_pts = 0.0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
107 mpg_demuxer_t* mpg_d;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
108
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
109 if (!ds_fill_buffer(demuxer->video)) return 0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
110 mpg_d = (mpg_demuxer_t*)calloc(1,sizeof(mpg_demuxer_t));
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
111 demuxer->priv = mpg_d;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
112 mpg_d->final_pts = 0.0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
113 mpg_d->has_valid_timestamps = 1;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
114 mpg_d->num_a_streams = 0;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
115 if (demuxer->seekable && stream_tell(demuxer->stream) < end_seq_start) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
116 stream_seek(s,(pos + end_seq_start / 2));
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
117 while ((!s->eof) && ds_fill_buffer(demuxer->video) && half_pts == 0.0) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
118 half_pts = mpg_d->last_pts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
119 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
120 stream_seek(s,end_seq_start);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
121 while ((!s->eof) && ds_fill_buffer(demuxer->video)) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
122 if (mpg_d->final_pts < mpg_d->last_pts) mpg_d->final_pts = mpg_d->last_pts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
123 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
124 // educated guess about validity of timestamps
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
125 if (mpg_d->final_pts > 3 * half_pts || mpg_d->final_pts < 1.5 * half_pts) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
126 mpg_d->has_valid_timestamps = 0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
127 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
128 ds_free_packs(demuxer->audio);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
129 ds_free_packs(demuxer->video);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
130 demuxer->stream->eof=0; // clear eof flag
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
131 demuxer->video->eof=0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
132 demuxer->audio->eof=0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
133
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
134 stream_seek(s,pos);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
135 ds_fill_buffer(demuxer->video);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
136 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
137 return 1;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
138 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
139
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
140 void demux_close_mpg(demuxer_t* demuxer) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
141 mpg_demuxer_t* mpg_d = demuxer->priv;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
142 if (mpg_d) free(mpg_d);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
143 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
144
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
145
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 static unsigned int read_mpeg_timestamp(stream_t *s,int c){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 int d,e;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 unsigned int pts;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 d=stream_read_word(s);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 e=stream_read_word(s);
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
151 if( ((c&1)!=1) || ((d&1)!=1) || ((e&1)!=1) ){
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
152 ++mpeg_pts_error;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
153 return 0; // invalid pts
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
154 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 pts=(((c>>1)&7)<<30)|((d>>1)<<15)|(e>>1);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
156 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"{%d}",pts);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 return pts;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
160 static void new_audio_stream(demuxer_t *demux, int aid){
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
161 if(!demux->a_streams[aid]){
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
162 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demux->priv;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
163 sh_audio_t* sh_a;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
164 new_sh_audio(demux,aid);
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
165 sh_a = (sh_audio_t*)demux->a_streams[aid];
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
166 switch(aid & 0xE0){ // 1110 0000 b (high 3 bit: type low 5: id)
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
167 case 0x00: sh_a->format=0x50;break; // mpeg
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
168 case 0xA0: sh_a->format=0x10001;break; // dvd pcm
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
169 case 0x80: if((aid & 0xF8) == 0x88) sh_a->format=0x2001;//dts
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
170 else sh_a->format=0x2000;break; // ac3
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
171 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
172 if (mpg_d) mpg_d->a_stream_ids[mpg_d->num_a_streams++] = aid;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
173 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
174 if(demux->audio->id==-1) demux->audio->id=aid;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
175 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
176
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 static int demux_mpg_read_packet(demuxer_t *demux,int id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 int d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 unsigned char c=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 unsigned int pts=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 unsigned int dts=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 demux_stream_t *ds=NULL;
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
184 mpg_demuxer_t *priv = (mpg_demuxer_t *) demux->priv;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
186 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"demux_read_packet: %X\n",id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
188 // if(id==0x1F0){
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
189 // demux->synced=0; // force resync after 0x1F0
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
190 // return -1;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
191 //}
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
192
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 // if(id==0x1BA) packet_start_pos=stream_tell(demux->stream);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
194 if(id<0x1BC || id>=0x1F0) return -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 if(id==0x1BE) return -1; // padding stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 if(id==0x1BF) return -1; // private2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 len=stream_read_word(demux->stream);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
199 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"PACKET len=%d",len);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
200 // if(len==62480){ demux->synced=0;return -1;} /* :) */
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
201 if(len==0 || len>MAX_PS_PACKETSIZE){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
202 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS packet len: %d\n",len);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
203 return -2; // invalid packet !!!!!!
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
204 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
206 mpeg_pts_error=0;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
207
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
208 if(id==0x1BC) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
209 parse_psm(demux, len);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
210 return 0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
211 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
212
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 while(len>0){ // Skip stuFFing bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 c=stream_read_char(demux->stream);--len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 if(c!=0xFF)break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 if((c>>6)==1){ // Read (skip) STD scale & size value
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 // printf(" STD_scale=%d",(c>>5)&1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 d=((c&0x1F)<<8)|stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 len-=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 // printf(" STD_size=%d",d);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 // Read System-1 stream timestamps:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 if((c>>4)==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 len-=4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 if((c>>4)==3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 if((c>>4)!=1) pts=0; //printf("{ERROR4}");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 dts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 len-=4+1+4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 if((c>>6)==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 int pts_flags;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 int hdrlen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 // System-2 (.VOB) stream:
492
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
240 if((c>>4)&3) {
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1735
diff changeset
241 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_EncryptedVOB);
492
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
242 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 c=stream_read_char(demux->stream); pts_flags=c>>6;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 c=stream_read_char(demux->stream); hdrlen=c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 len-=2;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
246 mp_dbg(MSGT_DEMUX,MSGL_DBG3," hdrlen=%d (len=%d)",hdrlen,len);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
247 if(hdrlen>len){ mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: invalid header length \n"); return -1;}
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
248 if(pts_flags==2 && hdrlen>=5){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 len-=5;hdrlen-=5;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 } else
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
253 if(pts_flags==3 && hdrlen>=10){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 dts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 len-=10;hdrlen-=10;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 len-=hdrlen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 if(hdrlen>0) stream_skip(demux->stream,hdrlen); // skip header bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 //============== DVD Audio sub-stream ======================
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 if(id==0x1BD){
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
265 int aid=stream_read_char(demux->stream);--len;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 if(len<3) return -1; // invalid audio packet
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
267
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
268 // AID:
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
269 // 0x20..0x3F subtitle
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
270 // 0x80..0x9F AC3 audio
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
271 // 0xA0..0xBF PCM audio
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
272
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
273 if((aid & 0xE0) == 0x20){
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
274 // subtitle:
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
275 aid&=0x1F;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
276
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
277 if(!demux->s_streams[aid]){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
278 mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid);
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
279 demux->s_streams[aid]=1;
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
280 }
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
281
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
282 if(demux->sub->id==aid){
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
283 ds=demux->sub;
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
284 }
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
285
3955
ceab3c2f261e hotfix for ac3 aid<0x20 (VDR)
arpi
parents: 3770
diff changeset
286 } else if((aid & 0xC0) == 0x80 || (aid & 0xE0) == 0x00) {
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
287
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
288 // aid=128+(aid&0x7F);
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
289 // aid=0x80..0xBF
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
290 new_audio_stream(demux, aid);
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
291 if(demux->audio->id==aid){
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
292 int type;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
293 ds=demux->audio;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
294 if(!ds->sh) ds->sh=demux->a_streams[aid];
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 // READ Packet: Skip additional audio header data:
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
296 c=stream_read_char(demux->stream);//num of frames
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
297 type=stream_read_char(demux->stream);//startpos hi
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
298 type=(type<<8)|stream_read_char(demux->stream);//startpos lo
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
299 // printf("\r[%02X][%04X]",c,type);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300 len-=3;
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
301 if((aid&0xE0)==0xA0 && len>=3){
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
302 unsigned char* hdr;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
303 // save audio header as codecdata!
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
304 if(!((sh_audio_t*)(ds->sh))->codecdata_len){
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
305 ((sh_audio_t*)(ds->sh))->codecdata=malloc(3);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
306 ((sh_audio_t*)(ds->sh))->codecdata_len=3;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
307 }
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
308 hdr=((sh_audio_t*)(ds->sh))->codecdata;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
309 // read LPCM header:
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
310 // emphasis[1], mute[1], rvd[1], frame number[5]:
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
311 hdr[0]=stream_read_char(demux->stream);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
312 // printf(" [%01X:%02d]",c>>5,c&31);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
313 // quantization[2],freq[2],rvd[1],channels[3]
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
314 hdr[1]=stream_read_char(demux->stream);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
315 // printf("[%01X:%01X] ",c>>4,c&15);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
316 // dynamic range control (0x80=off):
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
317 hdr[2]=stream_read_char(demux->stream);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
318 // printf("[%02X] ",c);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
319 len-=3;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
320 if(len<=0) mp_msg(MSGT_DEMUX,MSGL_V,"End of packet while searching for PCM header\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 }
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
322 // printf(" \n");
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
323 } // if(demux->audio->id==aid)
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
324
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
325 } else mp_msg(MSGT_DEMUX,MSGL_V,"Unknown 0x1BD substream: 0x%02X \n",aid);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
326
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
327 } //if(id==0x1BD)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 } else {
539
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
330 if(c!=0x0f){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
331 mp_msg(MSGT_DEMUX,MSGL_V," {ERROR5,c=%d} \n",c);
539
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
332 return -1; // invalid packet !!!!!!
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
333 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
335 if(mpeg_pts_error) mp_msg(MSGT_DEMUX,MSGL_V," {PTS_err:%d} \n",mpeg_pts_error);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
336 mp_dbg(MSGT_DEMUX,MSGL_DBG3," => len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
338 // if(len<=0 || len>MAX_PS_PACKETSIZE) return -1; // Invalid packet size
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
339 if(len<=0 || len>MAX_PS_PACKETSIZE){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
340 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS data len: %d\n",len);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
341 return -1; // invalid packet !!!!!!
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
342 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344 if(id>=0x1C0 && id<=0x1DF){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 // mpeg audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 int aid=id-0x1C0;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
347 new_audio_stream(demux, aid);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 if(demux->audio->id==aid){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 ds=demux->audio;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
350 if(!ds->sh) ds->sh=demux->a_streams[aid];
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
351 if(priv && ds->sh) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
352 sh_audio_t *sh = (sh_audio_t *)ds->sh;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
353 if(priv->es_map[id - 0x1B0])
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
354 sh->format = priv->es_map[id - 0x1B0];
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
355 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"ASSIGNED TO STREAM %d CODEC %x\n", id, priv->es_map[id - 0x1B0]);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
356 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 if(id>=0x1E0 && id<=0x1EF){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 // mpeg video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 int aid=id-0x1E0;
1289
3f490fad9bdf some code clanup (first step to libdemuxer)
arpi
parents: 1162
diff changeset
362 if(!demux->v_streams[aid]) new_sh_video(demux,aid);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363 if(demux->video->id==-1) demux->video->id=aid;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
364 if(demux->video->id==aid){
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
365 ds=demux->video;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
366 if(!ds->sh) ds->sh=demux->v_streams[aid];
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
367 if(priv && ds->sh) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
368 sh_video_t *sh = (sh_video_t *)ds->sh;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
369 if(priv->es_map[id - 0x1B0]) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
370 sh->format = priv->es_map[id - 0x1B0];
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
371 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"ASSIGNED TO STREAM %d CODEC %x\n", id, priv->es_map[id - 0x1B0]);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
372 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
373 }
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
374 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 if(ds){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
378 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Read %d data bytes from packet %04X\n",len,id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 // printf("packet start = 0x%X \n",stream_tell(demux->stream)-packet_start_pos);
1735
bdc1ec6fe668 gui seekbar position fixed
arpi
parents: 1628
diff changeset
380 ds_read_packet(ds,demux->stream,len,pts/90000.0f,demux->filepos,0);
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
381 if (demux->priv) ((mpg_demuxer_t*)demux->priv)->last_pts = pts/90000.0f;
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
382 // if(ds==demux->sub) parse_dvdsub(ds->last->buffer,ds->last->len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
384 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
385 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
386 if(len<=2356) stream_skip(demux->stream,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
387 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
389
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
390 int num_elementary_packets100=0;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
391 int num_elementary_packets101=0;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8254
diff changeset
392 int num_elementary_packets12x=0;
1162
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
393 int num_elementary_packets1B6=0;
1338
345585097137 mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents: 1331
diff changeset
394 int num_elementary_packetsPES=0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
395 int num_h264_slice=0; //combined slice
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
396 int num_h264_dpa=0; //DPA Slice
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
397 int num_h264_dpb=0; //DPB Slice
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
398 int num_h264_dpc=0; //DPC Slice
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
399 int num_h264_idr=0; //IDR Slice
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
400 int num_h264_sps=0;
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
401 int num_h264_pps=0;
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
402
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
403 int num_mp3audio_packets=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 int demux_mpg_es_fill_buffer(demuxer_t *demux){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406 // Elementary video stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407 if(demux->stream->eof) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
408 demux->filepos=stream_tell(demux->stream);
1735
bdc1ec6fe668 gui seekbar position fixed
arpi
parents: 1628
diff changeset
409 ds_read_packet(demux->video,demux->stream,STREAM_BUFFER_SIZE,0,demux->filepos,0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
410 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
411 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
412
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
413 int demux_mpg_fill_buffer(demuxer_t *demux){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
414 unsigned int head=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
415 int skipped=0;
5570
3a8d8c51355a max_packs increased for some dvd with too many audio/sub
arpi
parents: 4711
diff changeset
416 int max_packs=256; // 512kbyte
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
417 int ret=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 // System stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 do{
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 demux->filepos=stream_tell(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422 head=stream_read_dword(demux->stream);
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
423 if((head&0xFFFFFF00)!=0x100){
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
424 // sync...
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
425 demux->filepos-=skipped;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
426 while(1){
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
427 int c=stream_read_char(demux->stream);
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
428 if(c<0) break; //EOF
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
429 head<<=8;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
430 if(head!=0x100){
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
431 head|=c;
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
432 if(mp_check_mp3_header(head)) ++num_mp3audio_packets;
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
433 ++skipped; //++demux->filepos;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
434 continue;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
435 }
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
436 head|=c;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
437 break;
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
438 }
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
439 demux->filepos+=skipped;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
441 if(stream_eof(demux->stream)) break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 // sure: head=0x000001XX
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
443 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"*** head=0x%X\n",head);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
444 if(demux->synced==0){
3770
4f1a99fb9d9a mpeg VDR vs. BIN fixed?
arpi
parents: 3255
diff changeset
445 if(head==0x1BA) demux->synced=1; //else
4f1a99fb9d9a mpeg VDR vs. BIN fixed?
arpi
parents: 3255
diff changeset
446 // if(head==0x1BD || (head>=0x1C0 && head<=0x1EF)) demux->synced=3; // PES?
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 if(demux->synced==1){
929
6dedc7cb0146 accept 1BD packets for PS stream sync
arpi_esp
parents: 605
diff changeset
449 if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 demux->synced=2;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
451 mp_msg(MSGT_DEMUX,MSGL_V,"system stream synced at 0x%X (%d)!\n",demux->filepos,demux->filepos);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
452 num_elementary_packets100=0; // requires for re-sync!
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
453 num_elementary_packets101=0; // requires for re-sync!
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
454 } else demux->synced=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
455 } // else
3255
ee28577dad02 combined PS/PES sync to allow .VDR playback from stdin
arpi
parents: 2555
diff changeset
456 if(demux->synced>=2){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
457 ret=demux_mpg_read_packet(demux,head);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 if(!ret)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
459 if(--max_packs==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
460 demux->stream->eof=1;
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1735
diff changeset
461 mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_DoesntContainSelectedStream);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
462 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
463 }
3255
ee28577dad02 combined PS/PES sync to allow .VDR playback from stdin
arpi
parents: 2555
diff changeset
464 if(demux->synced==3) demux->synced=(ret==1)?2:0; // PES detect
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
465 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
466 if(head>=0x100 && head<0x1B0){
1162
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
467 if(head==0x100) ++num_elementary_packets100; else
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8254
diff changeset
468 if(head==0x101) ++num_elementary_packets101; else
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8254
diff changeset
469 if(head>=0x120 && head<=0x12F) ++num_elementary_packets12x;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
470
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
471 if((head&~0x60) == 0x101) ++num_h264_slice; else
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
472 if((head&~0x60) == 0x102) ++num_h264_dpa; else
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
473 if((head&~0x60) == 0x103) ++num_h264_dpb; else
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
474 if((head&~0x60) == 0x104) ++num_h264_dpc; else
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
475 if((head&~0x60) == 0x105 && head != 0x105) ++num_h264_idr; else
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
476 if((head&~0x60) == 0x107 && head != 0x107) ++num_h264_sps; else
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
477 if((head&~0x60) == 0x108 && head != 0x108) ++num_h264_pps;
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
478
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
479 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... elementary video packet found: %03X\n",head);
1162
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
480 } else
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
481 if((head>=0x1C0 && head<0x1F0) || head==0x1BD){
1338
345585097137 mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents: 1331
diff changeset
482 ++num_elementary_packetsPES;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
483 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... PES packet found: %03X\n",head);
1338
345585097137 mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents: 1331
diff changeset
484 } else
1162
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
485 if(head==0x1B6) ++num_elementary_packets1B6;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
486 #if 1
1338
345585097137 mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents: 1331
diff changeset
487 if( ( (num_elementary_packets100>50 && num_elementary_packets101>50) ||
345585097137 mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents: 1331
diff changeset
488 (num_elementary_packetsPES>50) ) && skipped>4000000){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
489 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be ES/PES stream...\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
490 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
491 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492 }
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
493 if(num_mp3audio_packets>100 && num_elementary_packets100<10){
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
494 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be MP3 stream...\n");
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
495 demux->stream->eof=1;
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
496 break;
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
497 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 } while(ret!=1);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
501 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"demux: %d bad bytes skipped\n",skipped);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 if(demux->stream->eof){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
503 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG Stream reached EOF\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7671
diff changeset
509 extern void resync_audio_stream(sh_audio_t *sh_audio);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7671
diff changeset
510 extern void skip_audio_frame(sh_audio_t *sh_audio);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7671
diff changeset
511
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
512 void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
513 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
514 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
515 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
516 sh_video_t *sh_video=d_video->sh;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
517 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
518 int precision = 1;
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
519 float oldpts = 0;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
520 off_t oldpos = demuxer->filepos;
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
521 float newpts = 0;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
522 off_t newpos = (flags & 1) ? demuxer->movi_start : oldpos;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
523
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
524 if(mpg_d)
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
525 oldpts = mpg_d->last_pts;
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
526 newpts = (flags & 1) ? 0.0 : oldpts;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
527 //================= seek in MPEG ==========================
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
528 //calculate the pts to seek to
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
529 if(flags & 2) {
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
530 if (mpg_d && mpg_d->final_pts > 0.0)
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
531 newpts += mpg_d->final_pts * rel_seek_secs;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
532 else
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
533 newpts += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * oldpts / oldpos;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
534 } else
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
535 newpts += rel_seek_secs;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
536 if (newpts < 0) newpts = 0;
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
537
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
538 if(flags&2){
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
539 // float seek 0..1
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
540 newpos+=(demuxer->movi_end-demuxer->movi_start)*rel_seek_secs;
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
541 } else {
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
542 // time seek (secs)
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
543 if (mpg_d && mpg_d->has_valid_timestamps) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
544 if (mpg_d->final_pts > 0.0)
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
545 newpos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / mpg_d->final_pts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
546 else if (oldpts > 0.0)
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
547 newpos += rel_seek_secs * (oldpos - demuxer->movi_start) / oldpts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
548 } else if(!sh_video || !sh_video->i_bps) // unspecified or VBR
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
549 newpos+=2324*75*rel_seek_secs; // 174.3 kbyte/sec
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
550 else
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
551 newpos+=sh_video->i_bps*rel_seek_secs;
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
552 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
553
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
554 while (1) {
4391
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
555 if(newpos<demuxer->movi_start){
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
556 if(demuxer->stream->type!=STREAMTYPE_VCD) demuxer->movi_start=0; // for VCD
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
557 if(newpos<demuxer->movi_start) newpos=demuxer->movi_start;
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
558 }
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
559
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
560 #ifdef _LARGEFILE_SOURCE
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
561 newpos&=~((long long)STREAM_BUFFER_SIZE-1); /* sector boundary */
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
562 #else
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
563 newpos&=~(STREAM_BUFFER_SIZE-1); /* sector boundary */
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
564 #endif
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
565 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
566
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
567 // re-sync video:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
568 videobuf_code_len=0; // reset ES stream buffer
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
569
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
570 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
571 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
572 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
573 resync_audio_stream(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
574 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
575
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
576 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
577 int i;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
578 if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
579 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
580 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
581 if(d_video->pts>a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
582 skip_audio_frame(sh_audio); // sync audio
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
583 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
584 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
585 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
586 i=sync_video_packet(d_video);
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
587 if(sh_video->format == 0x10000004) { //mpeg4
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
588 if(i==0x1B6) { //vop (frame) startcode
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
589 int pos = videobuf_len;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
590 if(!read_video_packet(d_video)) break; // EOF
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
591 if((videobuffer[pos+4] & 0x3F) == 0) break; //I-frame
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
592 }
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
593 } else if(sh_video->format == 0x10000005){ //h264
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
594 if((i & ~0x60) == 0x101 || (i & ~0x60) == 0x102 || (i & ~0x60) == 0x105) break;
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
595 } else { //default mpeg1/2
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
596 if(i==0x1B3 || i==0x1B8) break; // found it!
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
597 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
598 if(!i || !skip_video_packet(d_video)) break; // EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
599 }
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
600 if(!mpg_d)
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
601 break;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
602 if (!precision || abs(newpts - mpg_d->last_pts) < 0.5 || (mpg_d->last_pts == oldpts)) break;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
603 if ((newpos - oldpos) * (mpg_d->last_pts - oldpts) < 0) { // invalid timestamps
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
604 mpg_d->has_valid_timestamps = 0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
605 break;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
606 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
607 precision--;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
608 //prepare another seek because we are off by more than 0.5s
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
609 if(mpg_d) {
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
610 newpos += (newpts - mpg_d->last_pts) * (newpos - oldpos) / (mpg_d->last_pts - oldpts);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
611 ds_free_packs(d_audio);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
612 ds_free_packs(d_video);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
613 demuxer->stream->eof=0; // clear eof flag
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
614 d_video->eof=0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
615 d_audio->eof=0;
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
616 }
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
617 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
618 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
619
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
620 int demux_mpg_control(demuxer_t *demuxer,int cmd, void *arg){
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
621 demux_stream_t *d_video=demuxer->video;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
622 sh_video_t *sh_video=d_video->sh;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
623 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
624
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
625 switch(cmd) {
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
626 case DEMUXER_CTRL_GET_TIME_LENGTH:
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
627 if (mpg_d && mpg_d->has_valid_timestamps) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
628 *((unsigned long *)arg)=(long)mpg_d->final_pts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
629 return DEMUXER_CTRL_GUESS;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
630 }
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
631 return DEMUXER_CTRL_DONTKNOW;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
632
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
633 case DEMUXER_CTRL_GET_PERCENT_POS:
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
634 if (mpg_d && mpg_d->has_valid_timestamps && mpg_d->final_pts > 0.0) {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
635 *((int *)arg)=(int)(100 * mpg_d->last_pts / mpg_d->final_pts);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
636 return DEMUXER_CTRL_OK;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
637 }
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14426
diff changeset
638 return DEMUXER_CTRL_DONTKNOW;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
639
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
640 case DEMUXER_CTRL_SWITCH_AUDIO:
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
641 if (mpg_d && mpg_d->num_a_streams > 1 && demuxer->audio && demuxer->audio->sh) {
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
642 demux_stream_t *d_audio = demuxer->audio;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
643 sh_audio_t *sh_audio = d_audio->sh;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
644 sh_audio_t *sh_a;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
645 int i;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
646 for (i = 0; i < mpg_d->num_a_streams; i++) {
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
647 if (d_audio->id == mpg_d->a_stream_ids[i]) break;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
648 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
649 do {
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
650 i = (i+1) % mpg_d->num_a_streams;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
651 sh_a = (sh_audio_t*)demuxer->a_streams[mpg_d->a_stream_ids[i]];
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
652 } while (sh_a->format != sh_audio->format);
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
653 if (d_audio->id != mpg_d->a_stream_ids[i]) {
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
654 d_audio->id = mpg_d->a_stream_ids[i];
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
655 d_audio->sh = sh_a;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
656 ds_free_packs(d_audio);
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
657 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
658 *((int *)arg)=(int)d_audio->id;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
659 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
660 return DEMUXER_CTRL_OK;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
661
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
662 default:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
663 return DEMUXER_CTRL_NOTIMPL;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
664 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
665 }