annotate libmpdemux/demux_ogg.c @ 13502:05f846322437

show ogg subtitle language on OSD, if available
author joey
date Tue, 28 Sep 2004 14:00:49 +0000
parents a5004eb92a79
children a22f1b86ec0f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
2 #include "config.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
3
7413
7d83ac879f51 removed dummy OGG functions - use #ifdef instead
arpi
parents: 7396
diff changeset
4 #ifdef HAVE_OGGVORBIS
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
5
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
6 #include <stdlib.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
7 #include <stdio.h>
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
8 #include <string.h>
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
9 #include <assert.h>
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
10 #include <math.h>
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
11
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
12 #include "../mp_msg.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
13 #include "../help_mp.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
14 #include "stream.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
15 #include "demuxer.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
16 #include "stheader.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
17
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
18 #ifdef TREMOR
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
19 #include <tremor/ogg.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
20 #include <tremor/ivorbiscodec.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
21 #else
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
22 #include <ogg/ogg.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
23 #include <vorbis/codec.h>
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
24 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
25
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
26 #ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
27 #include <theora/theora.h>
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
28 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
29
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
30 #define BLOCK_SIZE 4096
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
31
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
32 /// Vorbis decoder context : we need the vorbis_info for vorbis timestamping
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
33 /// Shall we put this struct def in a common header ?
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
34 typedef struct ov_struct_st {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
35 vorbis_info vi; /* struct that stores all the static vorbis bitstream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
36 settings */
8375
22cbd7bcc6bf Really (!) sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8374
diff changeset
37 vorbis_comment vc; /* struct that stores all the bitstream user comments */
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
38 vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
39 vorbis_block vb; /* local working space for packet->PCM decode */
8374
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
40 float rg_scale; /* replaygain scale */
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
41 #ifdef TREMOR
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
42 int rg_scale_int;
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
43 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
44 } ov_struct_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
45
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
46 /* Theora decoder context : we won't be able to interpret granule positions
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
47 * without using theora_granule_time with the theora_state of the stream.
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
48 * This is duplicated in `vd_theora.c'; put this in a common header?
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
49 */
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
50 #ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
51 typedef struct theora_struct_st {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
52 theora_state st;
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
53 theora_comment cc;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
54 theora_info inf;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
55 } theora_struct_t;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
56 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
57
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
58 //// OggDS headers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
59 // Header for the new header format
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
60 typedef struct stream_header_video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
61 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
62 ogg_int32_t width;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
63 ogg_int32_t height;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
64 } stream_header_video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
65
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
66 typedef struct stream_header_audio
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
67 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
68 ogg_int16_t channels;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
69 ogg_int16_t blockalign;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
70 ogg_int32_t avgbytespersec;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
71 } stream_header_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
72
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
73 typedef struct stream_header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
74 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
75 char streamtype[8];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
76 char subtype[4];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
77
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
78 ogg_int32_t size; // size of the structure
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
79
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
80 ogg_int64_t time_unit; // in reference time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
81 ogg_int64_t samples_per_unit;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
82 ogg_int32_t default_len; // in media time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
83
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
84 ogg_int32_t buffersize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
85 ogg_int16_t bits_per_sample;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
86
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
87 union
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
88 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
89 // Video specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
90 stream_header_video video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
91 // Audio specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
92 stream_header_audio audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
93 } sh;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
94 } stream_header;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
95
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
96 /// Our private datas
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
97
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
98 typedef struct ogg_syncpoint {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
99 int64_t granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
100 off_t page_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
101 } ogg_syncpoint_t;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
102
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
103 /// A logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
104 typedef struct ogg_stream {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
105 /// Timestamping stuff
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
106 float samplerate; /// granulpos 2 time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
107 int64_t lastpos;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
108 int32_t lastsize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
109
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
110 // Logical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
111 ogg_stream_state stream;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
112 int hdr_packets;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
113 int vorbis;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
114 int theora;
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
115 int flac;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
116 int text;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
117 } ogg_stream_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
118
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
119 typedef struct ogg_demuxer {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
120 /// Physical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
121 ogg_sync_state sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
122 /// Current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
123 ogg_page page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
124 /// Logical streams
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
125 ogg_stream_t *subs;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
126 int num_sub;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
127 ogg_syncpoint_t* syncpoints;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
128 int num_syncpoint;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
129 off_t pos, last_size;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
130 int64_t final_granulepos;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
131
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
132 /* Used for subtitle switching. */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
133 int n_text;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
134 int *text_ids;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
135 char **text_langs;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
136 } ogg_demuxer_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
137
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
138 #define NUM_VORBIS_HDR_PACKETS 3
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
139
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
140 /// Some defines from OggDS
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
141 #define PACKET_TYPE_HEADER 0x01
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
142 #define PACKET_TYPE_BITS 0x07
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
143 #define PACKET_LEN_BITS01 0xc0
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
144 #define PACKET_LEN_BITS2 0x02
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
145 #define PACKET_IS_SYNCPOINT 0x08
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
146
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
147 extern int index_mode;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
148
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
149 extern char *dvdsub_lang, *audio_lang;
13501
a5004eb92a79 fix sub_select fiasco with global sub numbering. now multiple sub sources can be managed in essentially one list.
joey
parents: 13127
diff changeset
150 extern int dvdsub_id;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
151
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
152 //-------- subtitle support - should be moved to decoder layer, and queue
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
153 // - subtitles up in demuxer buffer...
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
154
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
155 #include "../subreader.h"
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
156 #include "../libvo/sub.h"
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
157 #define OGG_SUB_MAX_LINE 128
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
158
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
159 static subtitle ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
160 extern subtitle* vo_sub;
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
161 static float clear_sub;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
162 //FILE* subout;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
163
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
164 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
165 uint16_t get_uint16 (const void *buf)
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
166 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
167 uint16_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
168 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
169
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
170 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
171
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
172 ret = tmp[1] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
173 ret = (ret << 8) + (tmp[0] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
174
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
175 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
176 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
177
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
178 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
179 uint32_t get_uint32 (const void *buf)
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
180 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
181 uint32_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
182 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
183
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
184 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
185
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
186 ret = tmp[3] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
187 ret = (ret << 8) + (tmp[2] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
188 ret = (ret << 8) + (tmp[1] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
189 ret = (ret << 8) + (tmp[0] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
190
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
191 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
192 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
193
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
194 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
195 uint64_t get_uint64 (const void *buf)
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
196 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
197 uint64_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
198 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
199
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
200 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
201
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
202 ret = tmp[7] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
203 ret = (ret << 8) + (tmp[6] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
204 ret = (ret << 8) + (tmp[5] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
205 ret = (ret << 8) + (tmp[4] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
206 ret = (ret << 8) + (tmp[3] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
207 ret = (ret << 8) + (tmp[2] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
208 ret = (ret << 8) + (tmp[1] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
209 ret = (ret << 8) + (tmp[0] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
210
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
211 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
212 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
213
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
214 void demux_ogg_init_sub () {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
215 int lcv;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
216 if(!ogg_sub.text[0]) // not yet allocated
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
217 for (lcv = 0; lcv < SUB_MAX_TEXT; lcv++) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
218 ogg_sub.text[lcv] = (char*)malloc(OGG_SUB_MAX_LINE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
219 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
220 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
221
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
222 void demux_ogg_add_sub (ogg_stream_t* os,ogg_packet* pack) {
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
223 int lcv;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
224 int line_pos = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
225 int ignoring = 0;
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
226 char *packet = pack->packet;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
227
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
228 mp_msg(MSGT_DEMUX,MSGL_DBG2,"\ndemux_ogg_add_sub %02X %02X %02X '%s'\n",
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
229 (unsigned char)packet[0],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
230 (unsigned char)packet[1],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
231 (unsigned char)packet[2],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
232 &packet[3]);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
233
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
234 ogg_sub.lines = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
235 if (((unsigned char)packet[0]) == 0x88) { // some subtitle text
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
236 // Find data start
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
237 int32_t duration = 0;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
238 int16_t hdrlen = (*packet & PACKET_LEN_BITS01)>>6, i;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
239 hdrlen |= (*packet & PACKET_LEN_BITS2) <<1;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
240 lcv = 1 + hdrlen;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
241 for (i = hdrlen; i > 0; i--) {
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
242 duration <<= 8;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
243 duration |= (unsigned char)packet[i];
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
244 }
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
245 if ((hdrlen > 0) && (duration > 0)) {
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
246 float pts;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
247 if(pack->granulepos == -1)
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
248 pack->granulepos = os->lastpos + os->lastsize;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
249 pts = (float)pack->granulepos/(float)os->samplerate;
12264
070cc45bef28 Clear subs in broken OGM files (those without empty subtitle packets) a bit later in order to avoid flickering if there are more subs following immediately. Patch by Michael Reinsch <mr at uue adot org>
mosu
parents: 12263
diff changeset
250 clear_sub = 1.0 + pts + (float)duration/1000.0;
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
251 }
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
252 while (1) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
253 int c = packet[lcv++];
7115
55716603988c fixes problems when new line is just '\n' and not '\r\n' and enabled html-markup ignore. Patch by Piotr Krukowiecki <piotr@pingu.ii.uj.edu.pl>
alex
parents: 7010
diff changeset
254 if(c=='\n' || c==0 || line_pos >= OGG_SUB_MAX_LINE-1){
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
255 ogg_sub.text[ogg_sub.lines][line_pos] = 0; // close sub
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
256 if(line_pos) ogg_sub.lines++;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
257 if(!c || ogg_sub.lines>=SUB_MAX_TEXT) break; // EOL or TooMany
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
258 line_pos = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
259 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
260 switch (c) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
261 case '\r':
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
262 case '\n': // just ignore linefeeds for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
263 // their placement seems rather haphazard
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
264 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
265 case '<': // some html markup, ignore for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
266 ignoring = 1;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
267 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
268 case '>':
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
269 ignoring = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
270 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
271 default:
7115
55716603988c fixes problems when new line is just '\n' and not '\r\n' and enabled html-markup ignore. Patch by Piotr Krukowiecki <piotr@pingu.ii.uj.edu.pl>
alex
parents: 7010
diff changeset
272 if(!ignoring)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
273 ogg_sub.text[ogg_sub.lines][line_pos++] = c;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
274 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
275 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
276 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
277 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
278
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
279 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg sub lines: %d first: '%s'\n",
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
280 ogg_sub.lines, ogg_sub.text[0]);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
281 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
282 subcp_recode1(&ogg_sub);
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
283 #endif
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
284 vo_sub = &ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
285 vo_osd_changed(OSDTYPE_SUBTITLE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
286 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
287
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
288
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
289 // get the logical stream of the current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
290 // fill os if non NULL and return the stream id
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
291 static int demux_ogg_get_page_stream(ogg_demuxer_t* ogg_d,ogg_stream_state** os) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
292 int id,s_no;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
293 ogg_page* page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
294
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
295 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
296
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
297 for(id= 0; id < ogg_d->num_sub ; id++) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
298 if(s_no == ogg_d->subs[id].stream.serialno)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
299 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
300 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
301
10363
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
302 if(id == ogg_d->num_sub) {
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
303 // If we have only one vorbis stream allow the stream id to change
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
304 // it's normal on radio stream (each song have an different id).
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
305 // But we (or the codec?) should check that the samplerate, etc
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
306 // doesn't change (for radio stream it's ok)
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
307 if(ogg_d->num_sub == 1 && ogg_d->subs[0].vorbis) {
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
308 ogg_stream_reset(&ogg_d->subs[0].stream);
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
309 ogg_stream_init(&ogg_d->subs[0].stream,s_no);
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
310 id = 0;
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
311 } else
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
312 return -1;
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
313 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
314
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
315 if(os)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
316 *os = &ogg_d->subs[id].stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
317
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
318 return id;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
319
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
320 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
321
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
322 static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,void *context,float* pts,int* flags, int samplesize) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
323 unsigned char* data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
324
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
325 *pts = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
326 *flags = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
327
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
328 if(os->vorbis) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
329 data = pack->packet;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
330 if(*pack->packet & PACKET_TYPE_HEADER)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
331 os->hdr_packets++;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
332 else if (context )
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
333 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
334 vorbis_info *vi = &((ov_struct_t*)context)->vi;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
335
11000
6e35326c742f many small typo and grammar fixes
gabucino
parents: 10800
diff changeset
336 // When we dump the audio, there is no vi, but we don't care of timestamp in this case
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
337 int32_t blocksize = vorbis_packet_blocksize(vi,pack) / samplesize;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
338 // Calculate the timestamp if the packet don't have any
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
339 if(pack->granulepos == -1) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
340 pack->granulepos = os->lastpos;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
341 if(os->lastsize > 0)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
342 pack->granulepos += os->lastsize;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
343 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
344 *pts = pack->granulepos / (float)vi->rate;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
345 os->lastsize = blocksize;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
346 os->lastpos = pack->granulepos;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
347 }
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
348 # ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
349 } else if (os->theora) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
350 /* we pass complete packets to theora, mustn't strip the header! */
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
351 data = pack->packet;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
352 os->lastsize = 1;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
353
10711
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
354 /* header packets beginn on 1-bit: thus check (*data&0x80). We don't
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
355 have theora_state st, until all header packets were passed to the
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
356 decoder. */
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
357 if (context != NULL && !(*data&0x80))
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
358 {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
359 theora_info *thi = ((theora_struct_t*)context)->st.i;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
360 int keyframe_granule_shift=_ilog(thi->keyframe_frequency_force-1);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
361 int64_t iframemask = (1 << keyframe_granule_shift) - 1;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
362
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
363 if (pack->granulepos >= 0)
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
364 {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
365 os->lastpos = pack->granulepos >> keyframe_granule_shift;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
366 os->lastpos += pack->granulepos & iframemask;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
367 *flags = ((pack->granulepos & iframemask) == 0);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
368 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
369 else
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
370 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
371 os->lastpos++;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
372 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
373 pack->granulepos = os->lastpos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
374 *pts = (double)os->lastpos / (double)os->samplerate;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
375 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
376 #endif /* HAVE_OGGTHEORA */
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
377 # ifdef HAVE_FLAC
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
378 } else if (os->flac) {
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
379 /* we pass complete packets to flac, mustn't strip the header! */
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
380 data = pack->packet;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
381 #endif /* HAVE_FLAC */
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
382 } else {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
383 if(*pack->packet & PACKET_TYPE_HEADER)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
384 os->hdr_packets++;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
385 else {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
386 // Find data start
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
387 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
388 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) <<1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
389 data = pack->packet + 1 + hdrlen;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
390 // Calculate the timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
391 if(pack->granulepos == -1)
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
392 pack->granulepos = os->lastpos + (os->lastsize ? os->lastsize : 1);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
393 // If we alredy have a timestamp it can be a syncpoint
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
394 if(*pack->packet & PACKET_IS_SYNCPOINT)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
395 *flags = 1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
396 *pts = pack->granulepos/os->samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
397 // Save the packet length and timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
398 os->lastsize = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
399 while(hdrlen) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
400 os->lastsize <<= 8;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
401 os->lastsize |= pack->packet[hdrlen];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
402 hdrlen--;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
403 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
404 os->lastpos = pack->granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
405 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
406 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
407 return data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
408 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
409
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
410 // check if clang has substring from comma separated langlist
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
411 static int demux_ogg_check_lang(char *clang, char *langlist)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
412 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
413 char *c;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
414
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
415 if (!langlist || !*langlist)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
416 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
417 while ((c = strchr(langlist, ',')))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
418 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
419 if (!strncasecmp(clang, langlist, c - langlist))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
420 return 1;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
421 langlist = &c[1];
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
422 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
423 if (!strncasecmp(clang, langlist, strlen(langlist)))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
424 return 1;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
425 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
426 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
427
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
428 /// Try to print out comments and also check for LANGUAGE= tag
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
429 static void demux_ogg_check_comments(demuxer_t *d, ogg_stream_t *os, int id, vorbis_comment *vc)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
430 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
431 char *hdr, *val;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
432 char **cmt = vc->user_comments;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
433 int index;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
434 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)d->priv;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
435
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
436 while(*cmt)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
437 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
438 hdr = NULL;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
439 if (!strncasecmp(*cmt, "ENCODED_USING=", 14))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
440 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
441 hdr = "Software";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
442 val = *cmt + 14;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
443 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
444 else if (!strncasecmp(*cmt, "LANGUAGE=", 9))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
445 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
446 val = *cmt + 9;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
447 // copy this language name into the array
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
448 index = demux_ogg_sub_reverse_id(d, id);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
449 if (index >= 0) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
450 // in case of malicious files with more than one lang per track:
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
451 if (ogg_d->text_langs[index]) free(ogg_d->text_langs[index]);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
452 ogg_d->text_langs[index] = strdup(val);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
453 }
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
454 // check for -slang if subs are uninitialized yet
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
455 if (os->text && d->sub->id == -1 && demux_ogg_check_lang(val, dvdsub_lang))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
456 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
457 d->sub->id = id;
13501
a5004eb92a79 fix sub_select fiasco with global sub numbering. now multiple sub sources can be managed in essentially one list.
joey
parents: 13127
diff changeset
458 dvdsub_id = index;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
459 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg demuxer: Displaying subtitle stream id %d which matched -slang %s\n", id, val);
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
460 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
461 else
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
462 hdr = "Language";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
463 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
464 else if (!strncasecmp(*cmt, "ENCODER_URL=", 12))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
465 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
466 hdr = "Encoder URL";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
467 val = *cmt + 12;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
468 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
469 else if (!strncasecmp(*cmt, "TITLE=", 6))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
470 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
471 hdr = "Name";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
472 val = *cmt + 6;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
473 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
474 if (hdr)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
475 mp_msg(MSGT_DEMUX, MSGL_V, " %s: %s\n", hdr, val);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
476 cmt++;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
477 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
478 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
479
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
480 /// Calculate the timestamp and add the packet to the demux stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
481 // return 1 if the packet was added, 0 otherwise
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
482 static int demux_ogg_add_packet(demux_stream_t* ds,ogg_stream_t* os,int id,ogg_packet* pack) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
483 demuxer_t* d = ds->demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
484 demux_packet_t* dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
485 unsigned char* data;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
486 float pts = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
487 int flags = 0;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
488 void *context = NULL;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
489 int samplesize = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
490
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
491 // If packet is an comment header then we try to get comments at first
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
492 if (pack->bytes >= 7 && !memcmp(pack->packet, "\003vorbis", 7))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
493 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
494 vorbis_info vi;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
495 vorbis_comment vc;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
496
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
497 vorbis_info_init(&vi);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
498 vorbis_comment_init(&vc);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
499 vi.rate = 1L; // it's checked by vorbis_synthesis_headerin()
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
500 if(vorbis_synthesis_headerin(&vi, &vc, pack) == 0) // if no errors
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
501 demux_ogg_check_comments(d, os, id, &vc);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
502 vorbis_comment_clear(&vc);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
503 vorbis_info_clear(&vi);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
504 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
505 if (os->text) {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
506 if (id == d->sub->id) // don't want to add subtitles to the demuxer for now
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
507 demux_ogg_add_sub(os,pack);
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
508 return 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
509 }
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
510 // If packet is an header we jump it except for vorbis and theora
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
511 // (PACKET_TYPE_HEADER bit doesn't even exist for theora ?!)
11464
1efd0f9a946d For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents: 11128
diff changeset
512 // We jump nothing for FLAC. Ain't this great? Packet contents have to be
1efd0f9a946d For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents: 11128
diff changeset
513 // handled differently for each and every stream type. The joy! The joy!
1efd0f9a946d For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents: 11128
diff changeset
514 if(!os->flac && ((*pack->packet & PACKET_TYPE_HEADER) &&
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
515 (ds != d->audio || ( ((sh_audio_t*)ds->sh)->format != 0xFFFE || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) ) &&
11464
1efd0f9a946d For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents: 11128
diff changeset
516 (ds != d->video || (((sh_video_t*)ds->sh)->format != 0xFFFC))))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
517 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
518
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
519 // For vorbis packet the packet is the data, for other codec we must jump
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
520 // the header
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
521 if(ds == d->audio && ((sh_audio_t*)ds->sh)->format == 0xFFFE) {
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
522 context = ((sh_audio_t *)ds->sh)->context;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
523 samplesize = ((sh_audio_t *)ds->sh)->samplesize;
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
524 }
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
525 if (ds == d->video && ((sh_audio_t*)ds->sh)->format == 0xFFFC)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
526 context = ((sh_video_t *)ds->sh)->context;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
527 data = demux_ogg_read_packet(os,pack,context,&pts,&flags,samplesize);
11756
5c55de920ac0 Properly set the file duration for audio-only Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11577
diff changeset
528 if(d->video->id < 0)
5c55de920ac0 Properly set the file duration for audio-only Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11577
diff changeset
529 ((sh_audio_t*)ds->sh)->delay = pts;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
530
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
531 /// Clear subtitles if necessary (for broken files)
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
532 if ((clear_sub > 0) && (pts >= clear_sub)) {
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
533 ogg_sub.lines = 0;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
534 vo_sub = &ogg_sub;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
535 vo_osd_changed(OSDTYPE_SUBTITLE);
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
536 clear_sub = -1;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
537 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
538 /// Send the packet
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
539 dp = new_demux_packet(pack->bytes-(data-pack->packet));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
540 memcpy(dp->buffer,data,pack->bytes-(data-pack->packet));
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
541 dp->pts = pts;
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
542 dp->flags = flags;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
543 ds_add_packet(ds,dp);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
544 mp_msg(MSGT_DEMUX,MSGL_DBG2,"New dp: %p ds=%p pts=%5.3f len=%d flag=%d \n",
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
545 dp, ds, pts, dp->len, flags);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
546 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
547 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
548
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
549 /// if -forceidx build a table of all syncpoints to make seeking easier
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
550 /// otherwise try to get at least the final_granulepos
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
551 void demux_ogg_scan_stream(demuxer_t* demuxer) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
552 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
553 stream_t *s = demuxer->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
554 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
555 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
556 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
557 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
558 ogg_packet op;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
559 int np,sid,p,samplesize=1;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
560 void *context = NULL;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
561 off_t pos, last_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
562 pos = last_pos = demuxer->movi_start;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
563
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
564 // Reset the stream
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
565 if(index_mode == 2) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
566 stream_seek(s,demuxer->movi_start);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
567 } else {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
568 //the 270000 are just a wild guess
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
569 stream_seek(s,max(ogg_d->pos,demuxer->movi_end-270000));
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
570 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
571 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
572
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
573 // Get the serial number of the stream we use
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
574 if(demuxer->video->id >= 0) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
575 sid = demuxer->video->id;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
576 /* demux_ogg_read_packet needs decoder context for Theora streams */
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
577 if (((sh_video_t*)demuxer->video->sh)->format == 0xFFFC)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
578 context = ((sh_video_t*)demuxer->video->sh)->context;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
579 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
580 else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
581 sid = demuxer->audio->id;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
582 /* demux_ogg_read_packet needs decoder context for Vorbis streams */
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
583 if(((sh_audio_t*)demuxer->audio->sh)->format == 0xFFFE) {
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
584 context = ((sh_audio_t*)demuxer->audio->sh)->context;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
585 samplesize = ((sh_audio_t*)demuxer->audio->sh)->samplesize;
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
586 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
587 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
588 os = &ogg_d->subs[sid];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
589 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
590
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
591 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
592 np = ogg_sync_pageseek(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
593 if(np < 0) { // We had to skip some bytes
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
594 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_ERR,"Bad page sync while building syncpoints table (%d)\n",-np);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
595 pos += -np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
596 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
597 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
598 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
599 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
600 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
601 if(len == 0 && s->eof)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
602 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
603 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
604 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
605 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
606 // The page is ready
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
607 //ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
608 if(ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
609 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
610 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
611 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
612 if(ogg_stream_pagein(oss,page) != 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
613 mp_msg(MSGT_DEMUX,MSGL_ERR,"Pagein error ????\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
614 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
615 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
616 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
617 p = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
618 while(ogg_stream_packetout(oss,&op) == 1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
619 float pts;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
620 int flags;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
621 demux_ogg_read_packet(os,&op,context,&pts,&flags,samplesize);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
622 if(op.granulepos >= 0) ogg_d->final_granulepos = op.granulepos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
623 if(index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
624 ogg_d->syncpoints = (ogg_syncpoint_t*)realloc(ogg_d->syncpoints,(ogg_d->num_syncpoint+1)*sizeof(ogg_syncpoint_t));
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
625 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
626 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
627 ogg_d->num_syncpoint++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
628 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
629 p++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
630 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
631 if(p > 1 || (p == 1 && ! ogg_page_continued(page)))
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
632 last_pos = pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
633 pos += np;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
634 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"Building syncpoint table %d%%\r",(int)(pos*100/s->end_pos));
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
635 }
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
636 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"\n");
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
637
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
638 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_V,"Ogg syncpoints table builed: %d syncpoints\n",ogg_d->num_syncpoint);
11576
2c9e2da67647 Fixes for a couple of warnings.
mosu
parents: 11575
diff changeset
639 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream length (granulepos): %lld\n",ogg_d->final_granulepos);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
640
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
641 stream_reset(s);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
642 stream_seek(s,demuxer->movi_start);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
643 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
644 for(np = 0 ; np < ogg_d->num_sub ; np++) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
645 ogg_stream_reset(&ogg_d->subs[np].stream);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
646 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
647 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
648
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
649
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
650 // Get the first page
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
651 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
652 np = ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
653 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
654 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
655 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
656 if(len == 0 && s->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
657 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to get the first page !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
658 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
659 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
660
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
661 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
662 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
663 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
664 demux_ogg_get_page_stream(ogg_d,&oss);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
665 ogg_stream_pagein(oss,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
666 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
667 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
668
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
669 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
670
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
671 extern void print_wave_header(WAVEFORMATEX *h);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
672 extern void print_video_header(BITMAPINFOHEADER *h);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
673
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
674 /** \brief Return the number of subtitle tracks in the file.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
675
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
676 \param demuxer The demuxer for which the number of subtitle tracks
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
677 should be returned.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
678 */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
679 int demux_ogg_num_subs(demuxer_t *demuxer) {
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
680 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
681 return ogg_d->n_text;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
682 }
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
683
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
684 /** \brief Change the current subtitle stream and return its ID.
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
685
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
686 \param demuxer The demuxer whose subtitle stream will be changed.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
687 \param new_num The number of the new subtitle track. The number must be
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
688 between 0 and ogg_d->n_text - 1.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
689
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
690 \returns The Ogg stream number ( = page serial number) of the newly selected
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
691 track.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
692 */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
693 int demux_ogg_sub_id(demuxer_t *demuxer, int index) {
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
694 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
695 return (index < 0) ? index : (index >= ogg_d->n_text) ? -1 : ogg_d->text_ids[index];
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
696 }
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
697
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
698 /** \brief Translate the ogg track number into the subtitle number.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
699 * \param demuxer The demuxer about whose subtitles we are inquiring.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
700 * \param id The ogg track number of the subtitle track.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
701 */
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
702 static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
703 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
704 int i;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
705 for (i = 0; i < ogg_d->n_text; i++)
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
706 if (ogg_d->text_ids[i] == id) return i;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
707 return -1;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
708 }
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
709
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
710 /** \brief Lookup the subtitle language by the subtitle number. Returns NULL on out-of-bounds input.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
711 * \param demuxer The demuxer about whose subtitles we are inquiring.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
712 * \param index The subtitle number.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
713 */
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
714 char *demux_ogg_sub_lang(demuxer_t *demuxer, int index) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
715 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
716 return (index < 0) ? NULL : (index >= ogg_d->n_text) ? NULL : ogg_d->text_langs[index];
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
717 }
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
718
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
719 /// Open an ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
720 int demux_ogg_open(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
721 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
722 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
723 char* buf;
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
724 int np,s_no, n_audio = 0, n_video = 0;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
725 int audio_id = -1, video_id = -1, text_id = -1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
726 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
727 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
728 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
729 sh_audio_t* sh_a;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
730 sh_video_t* sh_v;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
731
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
732 #ifdef USE_ICONV
12909
dc8eba991005 fixes a crash and unchecked string-handling in ENCA code.
reimar
parents: 12703
diff changeset
733 subcp_open(NULL);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
734 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
735
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
736 clear_sub = -1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
737 s = demuxer->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
738
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
739 ogg_d = (ogg_demuxer_t*)calloc(1,sizeof(ogg_demuxer_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
740 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
741 page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
742
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
743 ogg_sync_init(sync);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
744
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
745 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
746 /// Try to get a page
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
747 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
748 np = ogg_sync_pageseek(sync,page);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
749 /// Error
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
750 if(np < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
751 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg demuxer : Bad page sync\n");
7760
5262223af043 memleak fix
arpi
parents: 7413
diff changeset
752 free(ogg_d);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
753 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
754 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
755 /// Need some more data
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
756 if(np == 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
757 int len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
758 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
759 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
760 if(len == 0 && s->eof) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
761 free(ogg_d);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
762 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
763 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
764 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
765 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
766 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
767 ogg_d->last_size = np;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
768 // We got one page now
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
769
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
770 if( ! ogg_page_bos(page) ) { // It's not a begining page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
771 // Header parsing end here, we need to get the page otherwise it will be lost
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
772 int id = demux_ogg_get_page_stream(ogg_d,NULL);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
773 if(id >= 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
774 ogg_stream_pagein(&ogg_d->subs[id].stream,page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
775 else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
776 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg : Warning found none bos page from unknown stream %d\n",ogg_page_serialno(page));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
777 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
778 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
779
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
780 /// Init the data structure needed for a logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
781 ogg_d->subs = (ogg_stream_t*)realloc(ogg_d->subs,(ogg_d->num_sub+1)*sizeof(ogg_stream_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
782 memset(&ogg_d->subs[ogg_d->num_sub],0,sizeof(ogg_stream_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
783 /// Get the stream serial number
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
784 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
785 ogg_stream_init(&ogg_d->subs[ogg_d->num_sub].stream,s_no);
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
786 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg : Found a stream with serial=%d\n",s_no);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
787 // Take the first page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
788 ogg_stream_pagein(&ogg_d->subs[ogg_d->num_sub].stream,page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
789 // Get first packet of the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
790 ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
791
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
792 // Reset our vars
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
793 sh_a = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
794 sh_v = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
795
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
796 // Check for Vorbis
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
797 if(pack.bytes >= 7 && ! strncmp(&pack.packet[1],"vorbis", 6) ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
798 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
799 sh_a->format = 0xFFFE;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
800 ogg_d->subs[ogg_d->num_sub].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
801 n_audio++;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
802 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg : stream %d is vorbis\n",ogg_d->num_sub);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
803
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
804 // check for Theora
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
805 # ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
806 } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
807 int errorCode = 0;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
808 theora_info inf;
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
809 theora_comment cc;
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
810
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
811 theora_info_init (&inf);
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
812 theora_comment_init (&cc);
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
813
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
814 errorCode = theora_decode_header (&inf, &cc, &pack);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
815 if (errorCode)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
816 mp_msg(MSGT_DEMUX,MSGL_ERR,"Theora header parsing failed: %i \n",
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
817 errorCode);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
818 else
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
819 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
820 sh_v = new_sh_video(demuxer,ogg_d->num_sub);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
821
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
822 sh_v->context = NULL;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
823 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
824 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
825 sh_v->bih->biCompression= sh_v->format = 0xFFFC;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
826 sh_v->fps = ((double)inf.fps_numerator)/
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
827 (double)inf.fps_denominator;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
828 sh_v->frametime = ((double)inf.fps_denominator)/
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
829 (double)inf.fps_numerator;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
830 sh_v->disp_w = sh_v->bih->biWidth = inf.width;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
831 sh_v->disp_h = sh_v->bih->biHeight = inf.height;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
832 sh_v->bih->biBitCount = 24;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
833 sh_v->bih->biPlanes = 3;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
834 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount/8) *
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
835 sh_v->bih->biWidth*sh_v->bih->biHeight);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
836 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
837 ogg_d->subs[ogg_d->num_sub].theora = 1;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
838 n_video++;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
839 mp_msg(MSGT_DEMUX,MSGL_V,
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
840 "Ogg : stream %d is theora v%i.%i.%i %i:%i, %.3f FPS,"
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
841 " aspect %i:%i\n", ogg_d->num_sub,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
842 (int)inf.version_major,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
843 (int)inf.version_minor,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
844 (int)inf.version_subminor,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
845 inf.width, inf.height,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
846 sh_v->fps,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
847 inf.aspect_numerator, inf.aspect_denominator);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
848 if(verbose>0) print_video_header(sh_v->bih);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
849 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
850 # endif /* HAVE_OGGTHEORA */
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
851 # ifdef HAVE_FLAC
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
852 } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) {
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
853 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
854 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
855 n_audio++;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
856 ogg_d->subs[ogg_d->num_sub].flac = 1;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
857 sh_a->wf = NULL;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
858 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg : stream %d is FLAC\n",ogg_d->num_sub);
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
859 # endif /* HAVE_FLAC */
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
860
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
861 /// Check for old header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
862 } else if(pack.bytes >= 142 && ! strncmp(&pack.packet[1],"Direct Show Samples embedded in Ogg",35) ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
863
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
864 // Old video header
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
865 if(get_uint32 (pack.packet+96) == 0x05589f80 && pack.bytes >= 184) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
866 sh_v = new_sh_video(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
867 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
868 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
869 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
870 sh_v->format = mmioFOURCC(pack.packet[68],pack.packet[69],
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
871 pack.packet[70],pack.packet[71]);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
872 sh_v->frametime = get_uint64(pack.packet+164)*0.0000001;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
873 sh_v->fps = 1/sh_v->frametime;
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
874 sh_v->disp_w = sh_v->bih->biWidth = get_uint32(pack.packet+176);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
875 sh_v->disp_h = sh_v->bih->biHeight = get_uint32(pack.packet+180);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
876 sh_v->bih->biBitCount = get_uint16(pack.packet+182);
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
877 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
878 sh_v->bih->biPlanes=1;
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
879 sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
880
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
881 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
882 n_video++;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
883 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream %d is video (old hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
884 if(verbose>0) print_video_header(sh_v->bih);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
885 // Old audio header
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
886 } else if(get_uint32(pack.packet+96) == 0x05589F81) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
887 unsigned int extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
888 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
889 extra_size = get_uint16(pack.packet+140);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
890 sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
891 sh_a->format = sh_a->wf->wFormatTag = get_uint16(pack.packet+124);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
892 sh_a->channels = sh_a->wf->nChannels = get_uint16(pack.packet+126);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
893 sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint32(pack.packet+128);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
894 sh_a->wf->nAvgBytesPerSec = get_uint32(pack.packet+132);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
895 sh_a->wf->nBlockAlign = get_uint16(pack.packet+136);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
896 sh_a->wf->wBitsPerSample = get_uint16(pack.packet+138);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
897 sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
898 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
899 if(extra_size > 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
900 memcpy(sh_a->wf+sizeof(WAVEFORMATEX),pack.packet+142,extra_size);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
901
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
902 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
903 n_audio++;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
904 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream %d is audio (old hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
905 if(verbose>0) print_wave_header(sh_a->wf);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
906 } else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
907 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg stream %d contains an old header but the header type is unknown\n",ogg_d->num_sub);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
908
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
909 // Check new header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
910 } else if ( (*pack.packet & PACKET_TYPE_BITS ) == PACKET_TYPE_HEADER &&
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
911 pack.bytes >= (int)sizeof(stream_header)+1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
912 stream_header *st = (stream_header*)(pack.packet+1);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
913 /// New video header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
914 if(strncmp(st->streamtype,"video",5) == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
915 sh_v = new_sh_video(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
916 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
917 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
918 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
919 sh_v->format = mmioFOURCC(st->subtype[0],st->subtype[1],
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
920 st->subtype[2],st->subtype[3]);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
921 sh_v->frametime = get_uint64(&st->time_unit)*0.0000001;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
922 sh_v->fps = 1.0/sh_v->frametime;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
923 sh_v->bih->biBitCount = get_uint16(&st->bits_per_sample);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
924 sh_v->disp_w = sh_v->bih->biWidth = get_uint32(&st->sh.video.width);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
925 sh_v->disp_h = sh_v->bih->biHeight = get_uint32(&st->sh.video.height);
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
926 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
927 sh_v->bih->biPlanes=1;
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
928 sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
929
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
930 ogg_d->subs[ogg_d->num_sub].samplerate= sh_v->fps;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
931 n_video++;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
932 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream %d is video (new hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
933 if(verbose>0) print_video_header(sh_v->bih);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
934 /// New audio header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
935 } else if(strncmp(st->streamtype,"audio",5) == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
936 char buffer[5];
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
937 unsigned int extra_size = get_uint32 (&st->size) - sizeof(stream_header);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
938 memcpy(buffer,st->subtype,4);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
939 buffer[4] = '\0';
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
940 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
941 sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size);
6850
5abb9367b128 ogm audio format id is in hex, not dec
arpi
parents: 6156
diff changeset
942 sh_a->format = sh_a->wf->wFormatTag = strtol(buffer, NULL, 16);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
943 sh_a->channels = sh_a->wf->nChannels = get_uint16(&st->sh.audio.channels);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
944 sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint64(&st->samples_per_unit);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
945 sh_a->wf->nAvgBytesPerSec = get_uint32(&st->sh.audio.avgbytespersec);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
946 sh_a->wf->nBlockAlign = get_uint16(&st->sh.audio.blockalign);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
947 sh_a->wf->wBitsPerSample = get_uint16(&st->bits_per_sample);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
948 sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
949 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
950 if(extra_size)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
951 memcpy(sh_a->wf+sizeof(WAVEFORMATEX),st+1,extra_size);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
952
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
953 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
954 n_audio++;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
955 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream %d is audio (new hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
956 if(verbose>0) print_wave_header(sh_a->wf);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
957
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
958 /// Check for text (subtitles) header
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
959 } else if (strncmp(st->streamtype, "text", 4) == 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
960 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg stream %d is text\n", ogg_d->num_sub);
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
961 ogg_d->subs[ogg_d->num_sub].samplerate= get_uint64(&st->time_unit)/10;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
962 ogg_d->subs[ogg_d->num_sub].text = 1;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
963 if (demuxer->sub->id == ogg_d->n_text)
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
964 text_id = ogg_d->num_sub;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
965 ogg_d->n_text++;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
966 ogg_d->text_ids = (int *)realloc(ogg_d->text_ids, sizeof(int) * ogg_d->n_text);
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
967 ogg_d->text_ids[ogg_d->n_text - 1] = ogg_d->num_sub;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
968 ogg_d->text_langs = (char **)realloc(ogg_d->text_langs, sizeof(char *) * ogg_d->n_text);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
969 ogg_d->text_langs[ogg_d->n_text - 1] = NULL;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
970 demux_ogg_init_sub();
10397
6180d7558f75 output typo fixes: unknow --> unknown
diego
parents: 10363
diff changeset
971 //// Unknown header type
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
972 } else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
973 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg stream %d has a header marker but is of an unknown type\n",ogg_d->num_sub);
10608
2cae82f2ab02 Spelling police:
diego
parents: 10397
diff changeset
974 /// Unknown (invalid ?) header
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
975 } else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
976 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg stream %d is of an unknown type\n",ogg_d->num_sub);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
977
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
978 if(sh_a || sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
979 demux_stream_t* ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
980 if(sh_a) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
981 // If the audio stream is not defined we took the first one
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
982 if(demuxer->audio->id == -1) {
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
983 demuxer->audio->id = n_audio - 1;
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
984 // if(sh_a->wf) print_wave_header(sh_a->wf);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
985 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
986 /// Is it the stream we want
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
987 if(demuxer->audio->id == (n_audio - 1)) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
988 demuxer->audio->sh = sh_a;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
989 sh_a->ds = demuxer->audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
990 ds = demuxer->audio;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
991 audio_id = ogg_d->num_sub;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
992 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
993 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
994 if(sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
995 /// Also for video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
996 if(demuxer->video->id == -1) {
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
997 demuxer->video->id = n_video - 1;
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
998 // if(sh_v->bih) print_video_header(sh_v->bih);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
999 }
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1000 if(demuxer->video->id == (n_video - 1)) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1001 demuxer->video->sh = sh_v;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1002 sh_v->ds = demuxer->video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1003 ds = demuxer->video;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1004 video_id = ogg_d->num_sub;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
1005 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1006 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1007 /// Add the header packets if the stream isn't seekable
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1008 if(ds && !s->end_pos) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1009 /// Finish the page, otherwise packets will be lost
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1010 do {
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1011 demux_ogg_add_packet(ds,&ogg_d->subs[ogg_d->num_sub],ogg_d->num_sub,&pack);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1012 } while(ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack) == 1);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1013 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1014 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1015 ogg_d->num_sub++;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1016 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1017
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1018 if(!n_video && !n_audio) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1019 free(ogg_d);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1020 return 0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1021 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1022
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1023 /// Finish to setup the demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1024 demuxer->priv = ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1025
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1026 if(!n_video || (video_id < 0))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1027 demuxer->video->id = -2;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1028 else
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1029 demuxer->video->id = video_id;
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1030 if(!n_audio || (audio_id < 0))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1031 demuxer->audio->id = -2;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1032 else
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1033 demuxer->audio->id = audio_id;
12351
af557de9daee Leave the subs uninitialized and not "forcefully off" if the user hasn't chosen a stream with -sid. If he used -slang then we need the comment packet which might be found after demux_ogg_open has finished.
mosu
parents: 12265
diff changeset
1034 /* Disable the subs only if there are no text streams at all.
af557de9daee Leave the subs uninitialized and not "forcefully off" if the user hasn't chosen a stream with -sid. If he used -slang then we need the comment packet which might be found after demux_ogg_open has finished.
mosu
parents: 12265
diff changeset
1035 Otherwise the stream to display might be chosen later when the comment
af557de9daee Leave the subs uninitialized and not "forcefully off" if the user hasn't chosen a stream with -sid. If he used -slang then we need the comment packet which might be found after demux_ogg_open has finished.
mosu
parents: 12265
diff changeset
1036 packet is encountered and the user used -slang instead of -sid. */
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1037 if(!ogg_d->n_text)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1038 demuxer->sub->id = -2;
12430
d82d84b94125 Be more verbose and tell the user which subtitle stream has been selected (if any).
mosu
parents: 12351
diff changeset
1039 else if (text_id >= 0) {
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1040 demuxer->sub->id = text_id;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1041 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg demuxer: Displaying subtitle stream id %d\n", text_id);
12430
d82d84b94125 Be more verbose and tell the user which subtitle stream has been selected (if any).
mosu
parents: 12351
diff changeset
1042 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1043
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1044 ogg_d->final_granulepos=0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1045 if(!s->end_pos)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1046 demuxer->seekable = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1047 else {
8795
b4512aa07711 mosu: Fixed OGG/OGM seeking for XCDs in which the OGG/OGM does not start at pos 0 in the stream
mosu
parents: 8788
diff changeset
1048 demuxer->movi_start = s->start_pos; // Needed for XCD (Ogg written in MODE2)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1049 demuxer->movi_end = s->end_pos;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1050 demuxer->seekable = 1;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1051 demux_ogg_scan_stream(demuxer);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1052 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1053
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1054 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg demuxer : found %d audio stream%s, %d video stream%s and %d text stream%s\n",n_audio,n_audio>1?"s":"",n_video,n_video>1?"s":"",ogg_d->n_text,ogg_d->n_text>1?"s":"");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1055
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1056 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1057 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1058
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1059
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1060 int demux_ogg_fill_buffer(demuxer_t *d) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1061 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1062 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1063 demux_stream_t *ds;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1064 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1065 ogg_stream_state* os;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1066 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1067 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1068 int np = 0, id=0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1069
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1070 s = d->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1071 ogg_d = d->priv;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1072 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1073 page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1074
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1075 /// Find the stream we are working on
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1076 if ( (id = demux_ogg_get_page_stream(ogg_d,&os)) < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1077 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg demuxer : can't get current stream\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1078 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1079 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1080
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1081 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1082 np = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1083 ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1084 /// Try to get some packet from the current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1085 while( (np = ogg_stream_packetout(os,&pack)) != 1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1086 /// No packet we go the next page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1087 if(np == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1088 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1089 int pa,len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1090 char *buf;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1091 ogg_d->pos += ogg_d->last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1092 /// Get the next page from the physical stream
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1093 while( (pa = ogg_sync_pageseek(sync,page)) <= 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1094 /// Error : we skip some bytes
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1095 if(pa < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1096 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg : Page out not synced, we skip some bytes\n");
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1097 ogg_d->pos -= pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1098 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1099 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1100 /// We need more data
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1101 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1102 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1103 if(len == 0 && s->eof) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1104 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg : Stream EOF !!!!\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1105 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1106 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1107 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1108 } /// Page loop
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1109 ogg_d->last_size = pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1110 /// Find the page's logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1111 if( (id = demux_ogg_get_page_stream(ogg_d,&os)) < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1112 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg demuxer error : we met an unknown stream\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1113 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1114 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1115 /// Take the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1116 if(ogg_stream_pagein(os,page) == 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1117 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1118 /// Page was invalid => retry
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1119 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg demuxer : got invalid page !!!!!\n");
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1120 ogg_d->pos += ogg_d->last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1121 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1122 } else /// Packet was corrupted
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1123 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg : bad packet in stream %d\n",id);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1124 } /// Packet loop
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1125
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1126 /// Is the actual logical stream in use ?
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1127 if(id == d->audio->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1128 ds = d->audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1129 else if(id == d->video->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1130 ds = d->video;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1131 else if (ogg_d->subs[id].text)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1132 ds = d->sub;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1134 if(ds) {
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1135 if(!demux_ogg_add_packet(ds,&ogg_d->subs[id],id,&pack))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1136 continue; /// Unuseful packet, get another
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1137 d->filepos = ogg_d->pos;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1138 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1139 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1140
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1141 } /// while(1)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1142
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1143 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1144
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1145 /// For avi with Ogg audio stream we have to create an ogg demuxer for this
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1146 // stream, then we join the avi and ogg demuxer with a demuxers demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1147 demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1148 demuxer_t *od;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1149 ogg_demuxer_t *ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1150 stream_t* s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1151 uint32_t hdrsizes[3];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1152 demux_packet_t *dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1153 sh_audio_t *sh_audio = demuxer->audio->sh;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1154 int np;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1155 unsigned char *p = NULL,*buf;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1156 int plen;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1157
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1158 /// Check that the cbSize is enouth big for the following reads
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1159 if(sh_audio->wf->cbSize < 22+3*sizeof(uint32_t)) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1160 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI Ogg : Initial audio header is too small !!!!!\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1161 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1162 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1163 /// Get the size of the 3 header packet
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1164 memcpy(hdrsizes, ((unsigned char*)sh_audio->wf)+22+sizeof(WAVEFORMATEX), 3*sizeof(uint32_t));
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1165 // printf("\n!!!!!! hdr sizes: %d %d %d \n",hdrsizes[0],hdrsizes[1],hdrsizes[2]);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1166
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1167 /// Check the size
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1168 if(sh_audio->wf->cbSize < 22+3*sizeof(uint32_t)+hdrsizes[0]+hdrsizes[1] + hdrsizes[2]) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1169 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI Ogg : Audio header is too small !!!!!\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1170 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1171 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1172
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1173 // Build the ogg demuxer private datas
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1174 ogg_d = (ogg_demuxer_t*)calloc(1,sizeof(ogg_demuxer_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1175 ogg_d->num_sub = 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1176 ogg_d->subs = (ogg_stream_t*)malloc(sizeof(ogg_stream_t));
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1177 ogg_d->subs[0].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1178
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1179 // Init the ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1180 ogg_sync_init(&ogg_d->sync);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1181
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1182 // Get the first page of the stream : we assume there only 1 logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1183 while((np = ogg_sync_pageout(&ogg_d->sync,&ogg_d->page)) <= 0 ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1184 if(np < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1185 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI Ogg error : Can't init using first stream packets\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1186 free(ogg_d);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1187 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1188 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1189 // Add some data
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1190 plen = ds_get_packet(demuxer->audio,&p);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1191 buf = ogg_sync_buffer(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1192 memcpy(buf,p,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1193 ogg_sync_wrote(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1194 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1195 // Init the logical stream
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1196 mp_msg(MSGT_DEMUX,MSGL_DBG2,"AVI Ogg found page with serial %d\n",ogg_page_serialno(&ogg_d->page));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1197 ogg_stream_init(&ogg_d->subs[0].stream,ogg_page_serialno(&ogg_d->page));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1198 // Write the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1199 ogg_stream_pagein(&ogg_d->subs[0].stream,&ogg_d->page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1200
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1201 // Create the ds_stream and the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1202 s = new_ds_stream(demuxer->audio);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1203 od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1204
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1205 /// Add the header packets in the ogg demuxer audio stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1206 // Initial header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1207 dp = new_demux_packet(hdrsizes[0]);
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1208 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+22+sizeof(WAVEFORMATEX)+3*sizeof(uint32_t),hdrsizes[0]);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1209 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1210 /// Comments
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1211 dp = new_demux_packet(hdrsizes[1]);
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1212 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+22+sizeof(WAVEFORMATEX)+3*sizeof(uint32_t)+hdrsizes[0],hdrsizes[1]);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1213 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1214 /// Code book
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1215 dp = new_demux_packet(hdrsizes[2]);
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1216 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+22+sizeof(WAVEFORMATEX)+3*sizeof(uint32_t)+hdrsizes[0]+hdrsizes[1],hdrsizes[2]);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1217 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1218
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1219 // Finish setting up the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1220 od->priv = ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1221 sh_audio = new_sh_audio(od,0);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1222 od->audio->id = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1223 od->video->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1224 od->audio->sh = sh_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1225 sh_audio->ds = od->audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1226 sh_audio->format = 0xFFFE;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1227
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1228 /// Return the joined demuxers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1229 return new_demuxers_demuxer(demuxer,od,demuxer);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1230
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1231 fallback:
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1232 demuxer->audio->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1233 return demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1234
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1235 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1236
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
1237 extern void resync_audio_stream(sh_audio_t *sh_audio);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
1238
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1239 void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1240 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1241 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1242 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1243 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1244 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1245 demux_stream_t* ds;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1246 sh_audio_t* sh_audio = demuxer->audio->sh;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1247 ogg_packet op;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1248 float rate;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1249 int i,sp,first,precision=1,do_seek=1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1250 vorbis_info* vi = NULL;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1251 int64_t gp = 0, old_gp;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1252 void *context = NULL;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1253 off_t pos, old_pos;
12265
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1254 int np;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1255 int is_gp_valid;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1256 float pts;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1257 int is_keyframe;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
1258 int samplesize=1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1259
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1260 if(demuxer->video->id >= 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1261 ds = demuxer->video;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1262 /* demux_ogg_read_packet needs decoder context for Theora streams */
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1263 if (((sh_video_t*)demuxer->video->sh)->format == 0xFFFC)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1264 context = ((sh_video_t*)demuxer->video->sh)->context;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1265 rate = ogg_d->subs[ds->id].samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1266 } else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1267 ds = demuxer->audio;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1268 /* demux_ogg_read_packet needs decoder context for Vorbis streams */
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1269 if(((sh_audio_t*)demuxer->audio->sh)->format == 0xFFFE)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1270 context = ((sh_audio_t*)demuxer->audio->sh)->context;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1271 vi = &((ov_struct_t*)((sh_audio_t*)ds->sh)->context)->vi;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1272 rate = (float)vi->rate;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
1273 samplesize = ((sh_audio_t*)ds->sh)->samplesize;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1274 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1275
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1276 os = &ogg_d->subs[ds->id];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1277 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1278
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1279 old_gp = os->lastpos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1280 old_pos = ogg_d->pos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1281
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1282 //calculate the granulepos to seek to
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1283 gp = flags & 1 ? 0 : os->lastpos;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1284 if(flags & 2) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1285 if (ogg_d->final_granulepos > 0)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1286 gp += ogg_d->final_granulepos * rel_seek_secs;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1287 else
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1288 gp += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * os->lastpos / ogg_d->pos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1289 } else
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1290 gp += rel_seek_secs * rate;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1291 if (gp < 0) gp = 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1292
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1293 //calculate the filepos to seek to
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1294 if(ogg_d->syncpoints) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1295 for(sp = 0; sp < ogg_d->num_syncpoint ; sp++) {
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1296 if(ogg_d->syncpoints[sp].granulepos >= gp) break;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1297 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1298
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1299 if(sp >= ogg_d->num_syncpoint) return;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1300 if (sp > 0 && ogg_d->syncpoints[sp].granulepos - gp > gp - ogg_d->syncpoints[sp-1].granulepos)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1301 sp--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1302 if (ogg_d->syncpoints[sp].granulepos == os->lastpos) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1303 if (sp > 0 && gp < os->lastpos) sp--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1304 if (sp < ogg_d->num_syncpoint-1 && gp > os->lastpos) sp++;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1305 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1306 pos = ogg_d->syncpoints[sp].page_pos;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1307 precision = 0;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1308 } else {
8795
b4512aa07711 mosu: Fixed OGG/OGM seeking for XCDs in which the OGG/OGM does not start at pos 0 in the stream
mosu
parents: 8788
diff changeset
1309 pos = flags & 1 ? 0 : ogg_d->pos;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1310 if(flags & 2)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1311 pos += (demuxer->movi_end - demuxer->movi_start) * rel_seek_secs;
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1312 else {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1313 if (ogg_d->final_granulepos > 0) {
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1314 pos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / (ogg_d->final_granulepos / rate);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1315 } else if (os->lastpos > 0) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1316 pos += rel_seek_secs * ogg_d->pos / (os->lastpos / rate);
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1317 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1318 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1319 if (pos < 0) pos = 0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1320 if (pos > (demuxer->movi_end - demuxer->movi_start)) return;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1321 } // if(ogg_d->syncpoints)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1322
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1323 while(1) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1324 if (do_seek) {
8795
b4512aa07711 mosu: Fixed OGG/OGM seeking for XCDs in which the OGG/OGM does not start at pos 0 in the stream
mosu
parents: 8788
diff changeset
1325 stream_seek(demuxer->stream,pos+demuxer->movi_start);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1326 ogg_sync_reset(sync);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1327 for(i = 0 ; i < ogg_d->num_sub ; i++) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1328 ogg_stream_reset(&ogg_d->subs[i].stream);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1329 ogg_d->subs[i].lastpos = ogg_d->subs[i].lastsize = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1330 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1331 ogg_d->pos = pos;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1332 ogg_d->last_size = 0;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1333 /* we just guess that we reached correct granulepos, in case a
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1334 subsequent search occurs before we read a valid granulepos */
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1335 os->lastpos = gp;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1336 first = !(ogg_d->syncpoints);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1337 do_seek=0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1338 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1339 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1340 ogg_d->last_size = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1341 np = ogg_sync_pageseek(sync,page);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1342
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1343 if(np < 0)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1344 ogg_d->pos -= np;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1345 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1346 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1347 int len = stream_read(demuxer->stream,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1348 if(len == 0 && demuxer->stream->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1349 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to seek !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1350 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1351 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1352 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1353 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1354 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1355 ogg_d->last_size = np;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1356 if(ogg_page_serialno(page) != oss->serialno)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1357 continue;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1358
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1359 if(ogg_stream_pagein(oss,page) != 0)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1360 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1361
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1362 while(1) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1363 np = ogg_stream_packetout(oss,&op);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1364 if(np < 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1365 continue;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1366 else if(np == 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1367 break;
8655
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1368 if (first) { /* Discard the first packet as it's probably broken,
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1369 and we don't have any other means to decide whether it is
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1370 complete or not. */
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1371 first = 0;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1372 break;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1373 }
12265
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1374 is_gp_valid = (op.granulepos >= 0);
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
1375 demux_ogg_read_packet(os,&op,context,&pts,&is_keyframe,samplesize);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1376 if (precision && is_gp_valid) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1377 precision--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1378 if (abs(gp - op.granulepos) > rate && (op.granulepos != old_gp)) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1379 //prepare another seek because we are off by more than 1s
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1380 pos += (gp - op.granulepos) * (pos - old_pos) / (op.granulepos - old_gp);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1381 if (pos < 0) pos = 0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1382 if (pos < (demuxer->movi_end - demuxer->movi_start)) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1383 do_seek=1;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1384 break;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1385 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1386 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1387 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1388 if (is_gp_valid && (pos > 0) && (old_gp > gp)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1389 && (2 * (old_gp - op.granulepos) < old_gp - gp)) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1390 /* prepare another seek because looking for a syncpoint
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1391 destroyed the backward search */
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1392 pos = old_pos - 1.5 * (old_pos - pos);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1393 if (pos < 0) pos = 0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1394 if (pos < (demuxer->movi_end - demuxer->movi_start)) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1395 do_seek=1;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1396 break;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1397 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1398 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1399 if(!precision && (is_keyframe || os->vorbis) ) {
8788
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
1400 ogg_sub.lines = 0;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
1401 vo_sub = &ogg_sub;
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
1402 vo_osd_changed(OSDTYPE_SUBTITLE);
ee443da1cef3 mosu: subtitles will be cleared after their life time as given in the packet's header has expired and after seeking
mosu
parents: 8655
diff changeset
1403 clear_sub = -1;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1404 demux_ogg_add_packet(ds,os,ds->id,&op);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1405 if(sh_audio)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1406 resync_audio_stream(sh_audio);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1407 return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1408 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1409 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1410 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1411
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1412 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1413
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1414 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1415
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1416 void demux_close_ogg(demuxer_t* demuxer) {
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1417 ogg_demuxer_t* ogg_d = demuxer->priv;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1418 int i;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1419
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1420 if(!ogg_d)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1421 return;
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1422
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1423 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1424 subcp_close();
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1425 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1426
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1427 if(ogg_d->subs)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1428 free(ogg_d->subs);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1429 if(ogg_d->syncpoints)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1430 free(ogg_d->syncpoints);
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1431 if (ogg_d->text_ids)
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1432 free(ogg_d->text_ids);
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1433 if (ogg_d->text_langs) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1434 for (i = 0; i < ogg_d->n_text; i++)
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1435 if (ogg_d->text_langs[i]) free(ogg_d->text_langs[i]);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1436 free(ogg_d->text_langs);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1437 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1438 free(ogg_d);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1439 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1440
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1441 int demux_ogg_control(demuxer_t *demuxer,int cmd, void *arg){
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1442 ogg_demuxer_t* ogg_d = demuxer->priv;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1443 ogg_stream_t* os;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1444 float rate;
11577
alex
parents: 11576
diff changeset
1445
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1446 if(demuxer->video->id >= 0) {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1447 os = &ogg_d->subs[demuxer->video->id];
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1448 rate = os->samplerate;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1449 } else {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1450 os = &ogg_d->subs[demuxer->audio->id];
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1451 rate = (float)((ov_struct_t*)((sh_audio_t*)demuxer->audio->sh)->context)->vi.rate;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1452 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1453
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1454
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1455 switch(cmd) {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1456 case DEMUXER_CTRL_GET_TIME_LENGTH:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1457 if (ogg_d->final_granulepos<=0) return DEMUXER_CTRL_DONTKNOW;
11577
alex
parents: 11576
diff changeset
1458 *((unsigned long *)arg)=ogg_d->final_granulepos / rate;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1459 return DEMUXER_CTRL_GUESS;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1460
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1461 case DEMUXER_CTRL_GET_PERCENT_POS:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1462 if (ogg_d->final_granulepos<=0) return DEMUXER_CTRL_DONTKNOW;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1463 *((int *)arg)=(int)( (os->lastpos*100) / ogg_d->final_granulepos);
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1464 return DEMUXER_CTRL_OK;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1465
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1466 default:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1467 return DEMUXER_CTRL_NOTIMPL;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1468 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1469 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1470
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1471 #endif