annotate libmpdemux/demux_ogg.c @ 15426:79008c38fcd9

prevent possible exploit
author nicodvb
date Fri, 13 May 2005 00:00:54 +0000
parents 148fbef7e95b
children 6b86089c2edd
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
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
18 #define FOURCC_VORBIS mmioFOURCC('v', 'r', 'b', 's')
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
19 #define FOURCC_THEORA mmioFOURCC('t', 'h', 'e', 'o')
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
20
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
21 #ifdef TREMOR
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
22 #include <tremor/ogg.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
23 #include <tremor/ivorbiscodec.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
24 #else
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
25 #include <ogg/ogg.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
26 #include <vorbis/codec.h>
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
27 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
28
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
29 #ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
30 #include <theora/theora.h>
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
31 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
32
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
33 #define BLOCK_SIZE 4096
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
34
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
35 /// 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
36 /// 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
37 typedef struct ov_struct_st {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
38 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
39 settings */
8375
22cbd7bcc6bf Really (!) sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8374
diff changeset
40 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
41 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
42 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
43 float rg_scale; /* replaygain scale */
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
44 #ifdef TREMOR
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
45 int rg_scale_int;
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
46 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
47 } ov_struct_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
48
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
49 /* 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
50 * 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
51 * 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
52 */
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
53 #ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
54 typedef struct theora_struct_st {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
55 theora_state st;
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
56 theora_comment cc;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
57 theora_info inf;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
58 } theora_struct_t;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
59 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
60
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
61 //// OggDS headers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
62 // Header for the new header format
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
63 typedef struct stream_header_video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
64 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
65 ogg_int32_t width;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
66 ogg_int32_t height;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
67 } stream_header_video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
68
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
69 typedef struct stream_header_audio
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
70 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
71 ogg_int16_t channels;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
72 ogg_int16_t blockalign;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
73 ogg_int32_t avgbytespersec;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
74 } stream_header_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
75
13881
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
76 typedef struct __attribute__((__packed__)) stream_header
5133
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 char streamtype[8];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
79 char subtype[4];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
80
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
81 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
82
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
83 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
84 ogg_int64_t samples_per_unit;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
85 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
86
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
87 ogg_int32_t buffersize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
88 ogg_int16_t bits_per_sample;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
89
13881
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
90 ogg_int16_t padding;
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
91
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
92 union
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
93 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
94 // Video specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
95 stream_header_video video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
96 // Audio specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
97 stream_header_audio audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
98 } sh;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
99 } stream_header;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
100
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
101 /// Our private datas
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
102
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
103 typedef struct ogg_syncpoint {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
104 int64_t granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
105 off_t page_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
106 } ogg_syncpoint_t;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
107
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
108 /// A logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
109 typedef struct ogg_stream {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
110 /// Timestamping stuff
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
111 float samplerate; /// granulpos 2 time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
112 int64_t lastpos;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
113 int32_t lastsize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
114
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
115 // Logical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
116 ogg_stream_state stream;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
117 int hdr_packets;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
118 int vorbis;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
119 int theora;
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
120 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
121 int text;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
122 int id;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
123 } ogg_stream_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
124
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
125 typedef struct ogg_demuxer {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
126 /// Physical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
127 ogg_sync_state sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
128 /// Current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
129 ogg_page page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
130 /// Logical streams
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
131 ogg_stream_t *subs;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
132 int num_sub;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
133 ogg_syncpoint_t* syncpoints;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
134 int num_syncpoint;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
135 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
136 int64_t final_granulepos;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
137
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
138 /* Used for subtitle switching. */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
139 int n_text;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
140 int *text_ids;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
141 char **text_langs;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
142 } ogg_demuxer_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
143
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
144 #define NUM_VORBIS_HDR_PACKETS 3
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
145
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
146 /// Some defines from OggDS
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
147 #define PACKET_TYPE_HEADER 0x01
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
148 #define PACKET_TYPE_BITS 0x07
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
149 #define PACKET_LEN_BITS01 0xc0
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
150 #define PACKET_LEN_BITS2 0x02
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
151 #define PACKET_IS_SYNCPOINT 0x08
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
152
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
153 extern int index_mode;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
154
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
155 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
156 extern int dvdsub_id;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
157 extern int demux_aid_vid_mismatch;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
158
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
159 //-------- subtitle support - should be moved to decoder layer, and queue
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
160 // - subtitles up in demuxer buffer...
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
161
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
162 #include "../subreader.h"
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
163 #include "../libvo/sub.h"
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
164 #define OGG_SUB_MAX_LINE 128
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
165
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
166 static subtitle ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
167 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
168 static float clear_sub;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
169 //FILE* subout;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
170
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
171 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
172 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
173 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
174 uint16_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
175 unsigned char *tmp;
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 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
178
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
179 ret = tmp[1] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
180 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
181
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
182 return (ret);
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
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
185 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
186 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
187 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
188 uint32_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
189 unsigned char *tmp;
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 tmp = (unsigned char *) buf;
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 ret = tmp[3] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
194 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
195 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
196 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
197
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
198 return (ret);
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
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
201 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
202 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
203 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
204 uint64_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
205 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
206
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
207 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
208
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
209 ret = tmp[7] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
210 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
211 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
212 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
213 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
214 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
215 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
216 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
217
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
218 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
219 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
220
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
221 void demux_ogg_init_sub () {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
222 int lcv;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
223 if(!ogg_sub.text[0]) // not yet allocated
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
224 for (lcv = 0; lcv < SUB_MAX_TEXT; lcv++) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
225 ogg_sub.text[lcv] = (char*)malloc(OGG_SUB_MAX_LINE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
226 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
227 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
228
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
229 void demux_ogg_add_sub (ogg_stream_t* os,ogg_packet* pack) {
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
230 int lcv;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
231 int line_pos = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
232 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
233 char *packet = pack->packet;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
234
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
235 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
236 (unsigned char)packet[0],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
237 (unsigned char)packet[1],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
238 (unsigned char)packet[2],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
239 &packet[3]);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
240
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
241 ogg_sub.lines = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
242 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
243 // 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
244 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
245 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
246 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
247 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
248 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
249 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
250 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
251 }
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
252 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
253 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
254 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
255 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
256 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
257 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
258 }
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
259 while (1) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
260 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
261 if(c=='\n' || c==0 || line_pos >= OGG_SUB_MAX_LINE-1){
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
262 ogg_sub.text[ogg_sub.lines][line_pos] = 0; // close sub
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
263 if(line_pos) ogg_sub.lines++;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
264 if(!c || ogg_sub.lines>=SUB_MAX_TEXT) break; // EOL or TooMany
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
265 line_pos = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
266 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
267 switch (c) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
268 case '\r':
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
269 case '\n': // just ignore linefeeds for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
270 // their placement seems rather haphazard
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
271 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
272 case '<': // some html markup, ignore for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
273 ignoring = 1;
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 case '>':
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
276 ignoring = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
277 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
278 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
279 if(!ignoring)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
280 ogg_sub.text[ogg_sub.lines][line_pos++] = c;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
281 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
282 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
283 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
284 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
285
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
286 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
287 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
288 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
289 subcp_recode1(&ogg_sub);
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
290 #endif
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
291 vo_sub = &ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
292 vo_osd_changed(OSDTYPE_SUBTITLE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
293 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
294
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
295
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
296 // 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
297 // 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
298 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
299 int id,s_no;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
300 ogg_page* page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
301
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
302 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
303
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
304 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
305 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
306 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
307 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
308
10363
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
309 if(id == ogg_d->num_sub) {
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
310 // 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
311 // 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
312 // 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
313 // 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
314 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
315 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
316 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
317 id = 0;
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
318 } else
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
319 return -1;
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
320 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
321
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
322 if(os)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
323 *os = &ogg_d->subs[id].stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
324
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
325 return id;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
326
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
327 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
328
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
329 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
330 unsigned char* data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
331
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
332 *pts = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
333 *flags = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
334
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
335 if(os->vorbis) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
336 data = pack->packet;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
337 if(*pack->packet & PACKET_TYPE_HEADER)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
338 os->hdr_packets++;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
339 else if (context )
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
340 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
341 vorbis_info *vi = &((ov_struct_t*)context)->vi;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
342
11000
6e35326c742f many small typo and grammar fixes
gabucino
parents: 10800
diff changeset
343 // 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
344 int32_t blocksize = vorbis_packet_blocksize(vi,pack) / samplesize;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
345 // Calculate the timestamp if the packet don't have any
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
346 if(pack->granulepos == -1) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
347 pack->granulepos = os->lastpos;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
348 if(os->lastsize > 0)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
349 pack->granulepos += os->lastsize;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
350 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
351 *pts = pack->granulepos / (float)vi->rate;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
352 os->lastsize = blocksize;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
353 os->lastpos = pack->granulepos;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
354 }
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
355 # ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
356 } else if (os->theora) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
357 /* we pass complete packets to theora, mustn't strip the header! */
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
358 data = pack->packet;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
359 os->lastsize = 1;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
360
10711
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
361 /* 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
362 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
363 decoder. */
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
364 if (context != NULL && !(*data&0x80))
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
365 {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
366 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
367 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
368 int64_t iframemask = (1 << keyframe_granule_shift) - 1;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
369
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
370 if (pack->granulepos >= 0)
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
371 {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
372 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
373 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
374 *flags = ((pack->granulepos & iframemask) == 0);
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 else
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
377 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
378 os->lastpos++;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
379 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
380 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
381 *pts = (double)os->lastpos / (double)os->samplerate;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
382 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
383 #endif /* HAVE_OGGTHEORA */
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
384 # ifdef HAVE_FLAC
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
385 } else if (os->flac) {
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
386 /* we pass complete packets to flac, mustn't strip the header! */
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
387 data = pack->packet;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
388 #endif /* HAVE_FLAC */
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
389 } else {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
390 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
391 os->hdr_packets++;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
392 else {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
393 // Find data start
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
394 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
395 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) <<1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
396 data = pack->packet + 1 + hdrlen;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
397 // Calculate the timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
398 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
399 pack->granulepos = os->lastpos + (os->lastsize ? os->lastsize : 1);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
400 // If we alredy have a timestamp it can be a syncpoint
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
401 if(*pack->packet & PACKET_IS_SYNCPOINT)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
402 *flags = 1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
403 *pts = pack->granulepos/os->samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
404 // Save the packet length and timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
405 os->lastsize = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
406 while(hdrlen) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
407 os->lastsize <<= 8;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
408 os->lastsize |= pack->packet[hdrlen];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
409 hdrlen--;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
410 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
411 os->lastpos = pack->granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
412 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
413 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
414 return data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
415 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
416
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
417 // 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
418 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
419 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
420 char *c;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
421
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
422 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
423 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
424 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
425 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
426 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
427 return 1;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
428 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
429 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
430 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
431 return 1;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
432 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
433 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
434
13803
0bd7ccf63c54 Declare a prototype for the function before it is used. Otherwise some compiler versions will "optimize" them away, and linking will fail.
mosu
parents: 13641
diff changeset
435 static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id);
0bd7ccf63c54 Declare a prototype for the function before it is used. Otherwise some compiler versions will "optimize" them away, and linking will fail.
mosu
parents: 13641
diff changeset
436
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
437 /// 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
438 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
439 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
440 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
441 char **cmt = vc->user_comments;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
442 int index;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
443 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
444
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
445 while(*cmt)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
446 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
447 hdr = NULL;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
448 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
449 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
450 hdr = "Software";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
451 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
452 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
453 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
454 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
455 val = *cmt + 9;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
456 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
457 {
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
458 if (ogg_d->subs[id].text)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
459 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_SID_%d_LANG=%s\n", ogg_d->subs[id].id, val);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
460 else if (id != d->video->id)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
461 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AID_%d_LANG=%s\n", ogg_d->subs[id].id, val);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
462 }
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
463 if (ogg_d->subs[id].text)
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
464 mp_msg(MSGT_DEMUX, MSGL_INFO, "[Ogg] Language for -sid %d is '-slang \"%s\"'\n", ogg_d->subs[id].id, val);
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
465 // copy this language name into the array
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
466 index = demux_ogg_sub_reverse_id(d, id);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
467 if (index >= 0) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
468 // 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
469 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
470 ogg_d->text_langs[index] = strdup(val);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
471 }
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
472 // 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
473 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
474 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
475 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
476 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
477 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
478 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
479 else
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
480 hdr = "Language";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
481 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
482 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
483 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
484 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
485 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
486 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
487 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
488 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
489 hdr = "Name";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
490 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
491 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
492 if (hdr)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
493 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
494 cmt++;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
495 }
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
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
498 /// 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
499 // 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
500 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
501 demuxer_t* d = ds->demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
502 demux_packet_t* dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
503 unsigned char* data;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
504 float pts = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
505 int flags = 0;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
506 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
507 int samplesize = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
508
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
509 // 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
510 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
511 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
512 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
513 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
514
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
515 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
516 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
517 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
518 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
519 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
520 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
521 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
522 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
523 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
524 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
525 demux_ogg_add_sub(os,pack);
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
526 return 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
527 }
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
528 // 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
529 // (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
530 // 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
531 // 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
532 if(!os->flac && ((*pack->packet & PACKET_TYPE_HEADER) &&
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
533 (ds != d->audio || ( ((sh_audio_t*)ds->sh)->format != FOURCC_VORBIS || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) ) &&
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
534 (ds != d->video || (((sh_video_t*)ds->sh)->format != FOURCC_THEORA))))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
535 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
536
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
537 // 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
538 // the header
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
539 if(ds == d->audio && ((sh_audio_t*)ds->sh)->format == FOURCC_VORBIS) {
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
540 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
541 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
542 }
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
543 if (ds == d->video && ((sh_audio_t*)ds->sh)->format == FOURCC_THEORA)
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
544 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
545 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
546 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
547 ((sh_audio_t*)ds->sh)->delay = pts;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
548
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
549 /// 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
550 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
551 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
552 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
553 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
554 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
555 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
556 /// Send the packet
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
557 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
558 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
559 dp->pts = pts;
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
560 dp->flags = flags;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
561 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
562 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
563 dp, ds, pts, dp->len, flags);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
564 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
565 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
566
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
567 /// 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
568 /// 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
569 void demux_ogg_scan_stream(demuxer_t* demuxer) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
570 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
571 stream_t *s = demuxer->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
572 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
573 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
574 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
575 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
576 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
577 int np,sid,p,samplesize=1;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
578 void *context = NULL;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
579 off_t pos, last_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
580 pos = last_pos = demuxer->movi_start;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
581
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
582 // 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
583 if(index_mode == 2) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
584 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
585 } else {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
586 //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
587 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
588 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
589 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
590
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
591 // Get the serial number of the stream we use
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
592 if(demuxer->video->id >= 0) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
593 sid = demuxer->video->id;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
594 /* demux_ogg_read_packet needs decoder context for Theora streams */
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
595 if (((sh_video_t*)demuxer->video->sh)->format == FOURCC_THEORA)
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
596 context = ((sh_video_t*)demuxer->video->sh)->context;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
597 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
598 else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
599 sid = demuxer->audio->id;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
600 /* demux_ogg_read_packet needs decoder context for Vorbis streams */
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
601 if(((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS) {
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
602 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
603 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
604 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
605 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
606 os = &ogg_d->subs[sid];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
607 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
608
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
609 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
610 np = ogg_sync_pageseek(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
611 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
612 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
613 pos += -np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
614 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
615 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
616 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
617 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
618 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
619 if(len == 0 && s->eof)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
620 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
621 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
622 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
623 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
624 // The page is ready
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
625 //ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
626 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
627 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
628 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
629 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
630 if(ogg_stream_pagein(oss,page) != 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
631 mp_msg(MSGT_DEMUX,MSGL_ERR,"Pagein error ????\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
632 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
633 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
634 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
635 p = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
636 while(ogg_stream_packetout(oss,&op) == 1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
637 float pts;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
638 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
639 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
640 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
641 if(index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
642 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
643 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
644 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
645 ogg_d->num_syncpoint++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
646 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
647 p++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
648 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
649 if(p > 1 || (p == 1 && ! ogg_page_continued(page)))
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
650 last_pos = pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
651 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
652 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
653 }
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
654 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"\n");
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
655
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
656 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
657 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
658
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
659 stream_reset(s);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
660 stream_seek(s,demuxer->movi_start);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
661 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
662 for(np = 0 ; np < ogg_d->num_sub ; np++) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
663 ogg_stream_reset(&ogg_d->subs[np].stream);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
664 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
665 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
666
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
667
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
668 // Get the first page
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
669 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
670 np = ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
671 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
672 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
673 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
674 if(len == 0 && s->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
675 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to get the first page !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
676 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
677 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
678
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
679 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
680 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
681 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
682 demux_ogg_get_page_stream(ogg_d,&oss);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
683 ogg_stream_pagein(oss,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
684 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
685 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
686
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
687 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
688
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
689 extern void print_wave_header(WAVEFORMATEX *h);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
690 extern void print_video_header(BITMAPINFOHEADER *h);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
691
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
692 /** \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
693
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
694 \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
695 should be returned.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
696 */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
697 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
698 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
699 return ogg_d->n_text;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
700 }
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
701
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
702 /** \brief Change the current subtitle stream and return its ID.
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
703
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
704 \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
705 \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
706 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
707
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
708 \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
709 track.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
710 */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
711 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
712 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
713 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
714 }
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
715
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
716 /** \brief Translate the ogg track number into the subtitle number.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
717 * \param demuxer The demuxer about whose subtitles we are inquiring.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
718 * \param id The ogg track number of the subtitle track.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
719 */
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
720 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
721 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
722 int i;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
723 for (i = 0; i < ogg_d->n_text; i++)
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
724 if (ogg_d->text_ids[i] == id) return i;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
725 return -1;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
726 }
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
727
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
728 /** \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
729 * \param demuxer The demuxer about whose subtitles we are inquiring.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
730 * \param index The subtitle number.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
731 */
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
732 char *demux_ogg_sub_lang(demuxer_t *demuxer, int index) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
733 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
734 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
735 }
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
736
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
737 void demux_close_ogg(demuxer_t* demuxer);
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
738
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
739 static inline unsigned int store_ughvlc(unsigned char *s, unsigned int v)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
740 {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
741 unsigned int n = 0;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
742
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
743 while(v >= 0xff)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
744 {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
745 *s++ = 0xff;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
746 v -= 0xff;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
747 n++;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
748 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
749 *s = v;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
750 n++;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
751
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
752 return n;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
753 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
754
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
755 static void fixup_vorbis_wf(sh_audio_t *sh)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
756 {
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
757 int i, offset;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
758 ogg_packet op[3];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
759 unsigned char *buf[3];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
760 unsigned char *ptr;
15426
79008c38fcd9 prevent possible exploit
nicodvb
parents: 15424
diff changeset
761 unsigned int len;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
762
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
763 for(i = 0; i < 3; i++) {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
764 op[i].bytes = ds_get_packet(sh->ds, &(op[i].packet));
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
765 mp_msg(MSGT_DEMUX,MSGL_V, "fixup_vorbis_wf: i=%d, size=%ld\n", i, op[i].bytes);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
766 if(op[i].bytes < 0) {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
767 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg demuxer error!, fixup_vorbis_wf: bad packet n. %d\n", i);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
768 return;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
769 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
770 buf[i] = malloc(op[i].bytes);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
771 if(!buf[i])
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
772 return;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
773 memcpy(buf[i], op[i].packet, op[i].bytes);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
774 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
775
15426
79008c38fcd9 prevent possible exploit
nicodvb
parents: 15424
diff changeset
776 len = op[0].bytes + op[1].bytes + op[2].bytes;
79008c38fcd9 prevent possible exploit
nicodvb
parents: 15424
diff changeset
777 sh->wf = (WAVEFORMATEX*)calloc(1, sizeof(WAVEFORMATEX) + len + len/255 + 64);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
778 ptr = (unsigned char*) (sh->wf+1);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
779
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
780 ptr[0] = 2;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
781 offset = 1;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
782 offset += store_ughvlc(&ptr[offset], op[0].bytes);
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
783 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, offset after 1st len = %u\n", offset);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
784 offset += store_ughvlc(&ptr[offset], op[1].bytes);
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
785 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, offset after 2nd len = %u\n", offset);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
786 for(i = 0; i < 3; i++) {
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
787 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, i=%d, bytes: %ld, offset: %u\n", i, op[i].bytes, offset);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
788 memcpy(&ptr[offset], buf[i], op[i].bytes);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
789 offset += op[i].bytes;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
790 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
791 sh->wf->cbSize = offset;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
792 mp_msg(MSGT_DEMUX,MSGL_V, "demux_ogg, extradata size: %d\n", sh->wf->cbSize);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
793 sh->wf = (WAVEFORMATEX*)realloc(sh->wf, sizeof(WAVEFORMATEX) + sh->wf->cbSize);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
794
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
795 if(op[0].bytes >= 29) {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
796 unsigned int br, nombr, minbr, maxbr;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
797 ptr = buf[0];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
798 sh->channels = ptr[11];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
799 sh->samplerate = sh->wf->nSamplesPerSec = get_uint32(&ptr[12]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
800 maxbr = get_uint32(&ptr[16]); //max
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
801 nombr = get_uint32(&ptr[20]); //nominal
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
802 minbr = get_uint32(&ptr[24]); //minimum
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
803 br = maxbr / 8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
804 if(!br)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
805 br = nombr / 8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
806 if(!br)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
807 br = minbr / 8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
808 sh->wf->nAvgBytesPerSec = br;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
809 sh->wf->wBitsPerSample = 16;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
810 sh->samplesize = (sh->wf->wBitsPerSample+7)/8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
811
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
812 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, vorbis stream features are: channels: %d, srate: %d, bitrate: %d, max: %u, nominal: %u, min: %u\n",
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
813 sh->channels, sh->samplerate, sh->wf->nAvgBytesPerSec, maxbr, nombr, minbr);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
814 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
815 free(buf[2]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
816 free(buf[1]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
817 free(buf[0]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
818 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
819
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
820
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
821 /// Open an ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
822 int demux_ogg_open(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
823 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
824 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
825 char* buf;
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
826 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
827 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
828 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
829 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
830 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
831 sh_audio_t* sh_a;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
832 sh_video_t* sh_v;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
833
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
834 #ifdef USE_ICONV
12909
dc8eba991005 fixes a crash and unchecked string-handling in ENCA code.
reimar
parents: 12703
diff changeset
835 subcp_open(NULL);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
836 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
837
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
838 clear_sub = -1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
839 s = demuxer->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
840
15321
1568ad46dc78 Fix the memleak fix: in case of error, demux_close_ogg should be called
reimar
parents: 15313
diff changeset
841 demuxer->priv =
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
842 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
843 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
844 page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
845
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
846 ogg_sync_init(sync);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
847
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
848 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
849 /// Try to get a page
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
850 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
851 np = ogg_sync_pageseek(sync,page);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
852 /// Error
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
853 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
854 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg demuxer : Bad page sync\n");
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
855 goto err_out;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
856 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
857 /// Need some more data
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
858 if(np == 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
859 int len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
860 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
861 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
862 if(len == 0 && s->eof) {
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
863 goto err_out;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
864 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
865 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
866 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
867 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
868 ogg_d->last_size = np;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
869 // We got one page now
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
870
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
871 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
872 // 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
873 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
874 if(id >= 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
875 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
876 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
877 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
878 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
879 }
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 /// 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
882 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
883 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
884 /// Get the stream serial number
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
885 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
886 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
887 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
888 // Take the first page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
889 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
890 // Get first packet of the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
891 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
892
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
893 // Reset our vars
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
894 sh_a = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
895 sh_v = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
896
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
897 demux_aid_vid_mismatch = 1; // don't identify in new_sh_* since ids don't match
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
898
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
899 // Check for Vorbis
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
900 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
901 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
902 sh_a->format = FOURCC_VORBIS;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
903 ogg_d->subs[ogg_d->num_sub].vorbis = 1;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
904 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
905 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", n_audio);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
906 ogg_d->subs[ogg_d->num_sub].id = n_audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
907 n_audio++;
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
908 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (Vorbis), -aid %d\n",ogg_d->num_sub,n_audio-1);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
909
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
910 // check for Theora
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
911 # ifdef HAVE_OGGTHEORA
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
912 } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
913 int errorCode = 0;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
914 theora_info inf;
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
915 theora_comment cc;
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
916
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
917 theora_info_init (&inf);
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
918 theora_comment_init (&cc);
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
919
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
920 errorCode = theora_decode_header (&inf, &cc, &pack);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
921 if (errorCode)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
922 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
923 errorCode);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
924 else
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
925 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
926 sh_v = new_sh_video(demuxer,ogg_d->num_sub);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
927
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
928 sh_v->context = NULL;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
929 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
930 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
931 sh_v->bih->biCompression= sh_v->format = FOURCC_THEORA;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
932 sh_v->fps = ((double)inf.fps_numerator)/
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
933 (double)inf.fps_denominator;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
934 sh_v->frametime = ((double)inf.fps_denominator)/
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
935 (double)inf.fps_numerator;
14763
2c4e30f37773 Theora fixes:
henry
parents: 14666
diff changeset
936 sh_v->disp_w = sh_v->bih->biWidth = inf.frame_width;
2c4e30f37773 Theora fixes:
henry
parents: 14666
diff changeset
937 sh_v->disp_h = sh_v->bih->biHeight = inf.frame_height;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
938 sh_v->bih->biBitCount = 24;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
939 sh_v->bih->biPlanes = 3;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
940 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount/8) *
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
941 sh_v->bih->biWidth*sh_v->bih->biHeight);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
942 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
943 ogg_d->subs[ogg_d->num_sub].theora = 1;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
944 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
945 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VIDEO_ID=%d\n", n_video);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
946 ogg_d->subs[ogg_d->num_sub].id = n_video;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
947 n_video++;
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
948 mp_msg(MSGT_DEMUX,MSGL_INFO,
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
949 "[Ogg] stream %d: video (Theora v%d.%d.%d), -vid %d\n",
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
950 ogg_d->num_sub,
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
951 (int)inf.version_major,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
952 (int)inf.version_minor,
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
953 (int)inf.version_subminor,
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
954 n_video - 1);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
955 if(verbose>0) print_video_header(sh_v->bih);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
956 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
957 # endif /* HAVE_OGGTHEORA */
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
958 # ifdef HAVE_FLAC
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
959 } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) {
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
960 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
961 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
962 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
963 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", n_audio);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
964 ogg_d->subs[ogg_d->num_sub].id = n_audio;
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
965 n_audio++;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
966 ogg_d->subs[ogg_d->num_sub].flac = 1;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
967 sh_a->wf = NULL;
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
968 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (FLAC), -aid %d\n",ogg_d->num_sub,n_audio-1);
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
969 # endif /* HAVE_FLAC */
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
970
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
971 /// Check for old header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
972 } 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
973
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
974 // Old video header
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
975 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
976 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
977 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
978 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
979 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
980 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
981 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
982 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
983 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
984 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
985 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
986 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
987 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
988 sh_v->bih->biPlanes=1;
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
989 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
990
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
991 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
992 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
993 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VIDEO_ID=%d\n", n_video);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
994 ogg_d->subs[ogg_d->num_sub].id = n_video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
995 n_video++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
996 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: video (FOURCC %c%c%c%c), -vid %d\n",
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
997 ogg_d->num_sub,pack.packet[68],pack.packet[69],pack.packet[70],pack.packet[71],n_video-1);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
998 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
999 // Old audio header
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
1000 } 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
1001 unsigned int extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1002 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
1003 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
1004 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
1005 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
1006 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
1007 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
1008 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
1009 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
1010 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
1011 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
1012 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1013 if(extra_size > 0)
14535
c920c525daa2 100l, completely broken pointer arithmetic causing crashes.
reimar
parents: 14046
diff changeset
1014 memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX),pack.packet+142,extra_size);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1015
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
1016 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1017 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1018 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", n_audio);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1019 ogg_d->subs[ogg_d->num_sub].id = n_audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1020 n_audio++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1021 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (format 0x%04x), -aid %d\n",ogg_d->num_sub,sh_a->format,n_audio-1);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
1022 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
1023 } 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
1024 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
1025
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1026 // Check new header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1027 } 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
1028 pack.bytes >= (int)sizeof(stream_header)+1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1029 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
1030 /// New video header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1031 if(strncmp(st->streamtype,"video",5) == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1032 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
1033 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
1034 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
1035 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1036 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
1037 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
1038 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
1039 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
1040 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
1041 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
1042 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
1043 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
1044 sh_v->bih->biPlanes=1;
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
1045 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
1046
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1047 ogg_d->subs[ogg_d->num_sub].samplerate= sh_v->fps;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1048 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1049 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VIDEO_ID=%d\n", n_video);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1050 ogg_d->subs[ogg_d->num_sub].id = n_video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1051 n_video++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1052 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: video (FOURCC %c%c%c%c), -vid %d\n",
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1053 ogg_d->num_sub,st->subtype[0],st->subtype[1],st->subtype[2],st->subtype[3],n_video-1);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
1054 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
1055 /// New audio header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1056 } 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
1057 char buffer[5];
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
1058 unsigned int extra_size = get_uint32 (&st->size) - sizeof(stream_header);
15313
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1059 unsigned int extra_offset = 0;
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1060
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1061 memcpy(buffer,st->subtype,4);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1062 buffer[4] = '\0';
15313
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1063
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1064 /* Nasty workaround. stream_header.size seems not to contain the real
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1065 size in all cases. There are four extra bytes that are unaccounted
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1066 for in front of the real codec initialization data _at least_ for
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1067 AAC. So far I've only seen those bytes being all 0, so we can
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1068 just skip them here. */
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1069 if ((strtol(buffer, NULL, 16) == 0xff) && (extra_size >= 4)) {
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1070 extra_size -= 4;
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1071 extra_offset = 4;
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1072 }
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1073
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1074 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
1075 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
1076 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
1077 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
1078 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
1079 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
1080 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
1081 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
1082 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
1083 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1084 if(extra_size)
15313
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1085 memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX),((char *)(st+1))+extra_offset,extra_size);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1086
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
1087 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1088 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1089 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", n_audio);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1090 ogg_d->subs[ogg_d->num_sub].id = n_audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1091 n_audio++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1092 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (format 0x%04x), -aid %d\n",ogg_d->num_sub,sh_a->format,n_audio-1);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
1093 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
1094
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1095 /// Check for text (subtitles) header
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1096 } else if (strncmp(st->streamtype, "text", 4) == 0) {
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1097 mp_msg(MSGT_DEMUX, MSGL_INFO, "[Ogg] stream %d: subtitles (SRT-like text subtitles), -sid %d\n", ogg_d->num_sub, ogg_d->n_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
1098 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
1099 ogg_d->subs[ogg_d->num_sub].text = 1;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1100 if (identify)
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1101 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", ogg_d->n_text);
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1102 ogg_d->subs[ogg_d->num_sub].id = ogg_d->n_text;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1103 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
1104 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
1105 ogg_d->n_text++;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1106 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
1107 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
1108 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
1109 ogg_d->text_langs[ogg_d->n_text - 1] = NULL;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1110 demux_ogg_init_sub();
10397
6180d7558f75 output typo fixes: unknow --> unknown
diego
parents: 10363
diff changeset
1111 //// Unknown header type
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1112 } 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
1113 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
1114 /// Unknown (invalid ?) header
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1115 } 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
1116 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
1117
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1118 if(sh_a || sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1119 demux_stream_t* ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1120 if(sh_a) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1121 // 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
1122 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
1123 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
1124 // 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
1125 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1126 /// 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
1127 if(demuxer->audio->id == (n_audio - 1)) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1128 demuxer->audio->sh = sh_a;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1129 sh_a->ds = demuxer->audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1130 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
1131 audio_id = ogg_d->num_sub;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
1132 }
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(sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1135 /// Also for video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1136 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
1137 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
1138 // 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
1139 }
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
1140 if(demuxer->video->id == (n_video - 1)) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1141 demuxer->video->sh = sh_v;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1142 sh_v->ds = demuxer->video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1143 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
1144 video_id = ogg_d->num_sub;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
1145 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1146 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1147 /// 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
1148 if(ds && !s->end_pos) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1149 /// Finish the page, otherwise packets will be lost
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1150 do {
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1151 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
1152 } while(ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack) == 1);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1153 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1154 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1155 ogg_d->num_sub++;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1156 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1157
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1158 if(!n_video && !n_audio) {
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1159 goto err_out;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1160 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1161
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
1162 if(!n_video || (video_id < 0))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1163 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
1164 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
1165 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
1166 if(!n_audio || (audio_id < 0))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1167 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
1168 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
1169 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
1170 /* 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
1171 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
1172 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
1173 if(!ogg_d->n_text)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1174 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
1175 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
1176 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
1177 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
1178 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1179
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1180 ogg_d->final_granulepos=0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1181 if(!s->end_pos)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1182 demuxer->seekable = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1183 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
1184 demuxer->movi_start = s->start_pos; // Needed for XCD (Ogg written in MODE2)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1185 demuxer->movi_end = s->end_pos;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1186 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
1187 demux_ogg_scan_stream(demuxer);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1188 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1189
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1190 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":"");
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
1191
15424
148fbef7e95b fixup the correct sh_a
nicodvb
parents: 15423
diff changeset
1192 sh_a = demuxer->audio->sh;
15422
9ac14c8b99b3 don't call fixup_audio if there's no audio
nicodvb
parents: 15420
diff changeset
1193 if(sh_a)
9ac14c8b99b3 don't call fixup_audio if there's no audio
nicodvb
parents: 15420
diff changeset
1194 if(sh_a->format == FOURCC_VORBIS)
9ac14c8b99b3 don't call fixup_audio if there's no audio
nicodvb
parents: 15420
diff changeset
1195 fixup_vorbis_wf(sh_a);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
1196
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1197 return 1;
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1198
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1199 err_out:
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1200 return 0;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1201 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1202
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1203
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1204 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
1205 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1206 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1207 demux_stream_t *ds;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1208 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1209 ogg_stream_state* os;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1210 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1211 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1212 int np = 0, id=0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1213
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1214 s = d->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1215 ogg_d = d->priv;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1216 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1217 page = &ogg_d->page;
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 /// Find the stream we are working on
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1220 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
1221 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
1222 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1223 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1224
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1225 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1226 np = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1227 ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1228 /// 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
1229 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
1230 /// No packet we go the next page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1231 if(np == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1232 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1233 int pa,len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1234 char *buf;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1235 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
1236 /// 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
1237 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
1238 /// Error : we skip some bytes
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1239 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
1240 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
1241 ogg_d->pos -= pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1242 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1243 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1244 /// We need more data
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1245 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1246 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1247 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
1248 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
1249 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1250 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1251 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1252 } /// Page loop
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1253 ogg_d->last_size = pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1254 /// Find the page's logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1255 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
1256 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
1257 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1258 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1259 /// Take the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1260 if(ogg_stream_pagein(os,page) == 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1261 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1262 /// 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
1263 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
1264 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
1265 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1266 } 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
1267 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
1268 } /// Packet loop
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1269
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1270 /// Is the actual logical stream in use ?
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1271 if(id == d->audio->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1272 ds = d->audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1273 else if(id == d->video->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1274 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
1275 else if (ogg_d->subs[id].text)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1276 ds = d->sub;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1277
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1278 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
1279 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
1280 continue; /// Unuseful packet, get another
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1281 d->filepos = ogg_d->pos;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1282 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1283 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1284
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1285 } /// while(1)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1286
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1287 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1288
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1289 /// 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
1290 // 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
1291 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
1292 demuxer_t *od;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1293 ogg_demuxer_t *ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1294 stream_t* s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1295 uint32_t hdrsizes[3];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1296 demux_packet_t *dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1297 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
1298 int np;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1299 unsigned char *p = NULL,*buf;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1300 int plen;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1301
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1302 /// 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
1303 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
1304 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
1305 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1306 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1307 /// Get the size of the 3 header packet
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1308 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
1309 // 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
1310
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1311 /// Check the size
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1312 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
1313 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
1314 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1315 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1316
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1317 // Build the ogg demuxer private datas
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1318 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
1319 ogg_d->num_sub = 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1320 ogg_d->subs = (ogg_stream_t*)malloc(sizeof(ogg_stream_t));
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1321 ogg_d->subs[0].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1322
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1323 // Init the ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1324 ogg_sync_init(&ogg_d->sync);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1325
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1326 // 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
1327 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
1328 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
1329 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
1330 free(ogg_d);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1331 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1332 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1333 // Add some data
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1334 plen = ds_get_packet(demuxer->audio,&p);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1335 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
1336 memcpy(buf,p,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1337 ogg_sync_wrote(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1338 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1339 // 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
1340 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
1341 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
1342 // Write the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1343 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
1344
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1345 // 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
1346 s = new_ds_stream(demuxer->audio);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1347 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
1348
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1349 /// 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
1350 // Initial header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1351 dp = new_demux_packet(hdrsizes[0]);
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1352 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
1353 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1354 /// Comments
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1355 dp = new_demux_packet(hdrsizes[1]);
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1356 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
1357 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1358 /// Code book
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1359 dp = new_demux_packet(hdrsizes[2]);
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1360 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
1361 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1362
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1363 // Finish setting up the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1364 od->priv = ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1365 sh_audio = new_sh_audio(od,0);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1366 od->audio->id = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1367 od->video->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1368 od->audio->sh = sh_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1369 sh_audio->ds = od->audio;
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
1370 sh_audio->format = FOURCC_VORBIS;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1371
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1372 /// Return the joined demuxers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1373 return new_demuxers_demuxer(demuxer,od,demuxer);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1374
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1375 fallback:
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1376 demuxer->audio->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1377 return demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1378
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1379 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1380
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
1381 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
1382
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1383 void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1384 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1385 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1386 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1387 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1388 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1389 demux_stream_t* ds;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1390 sh_audio_t* sh_audio = demuxer->audio->sh;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1391 ogg_packet op;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1392 float rate;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1393 int i,sp,first,precision=1,do_seek=1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1394 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
1395 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
1396 void *context = NULL;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1397 off_t pos, old_pos;
12265
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1398 int np;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1399 int is_gp_valid;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1400 float pts;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1401 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
1402 int samplesize=1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1403
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1404 if(demuxer->video->id >= 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1405 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
1406 /* demux_ogg_read_packet needs decoder context for Theora streams */
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
1407 if (((sh_video_t*)demuxer->video->sh)->format == FOURCC_THEORA)
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1408 context = ((sh_video_t*)demuxer->video->sh)->context;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1409 rate = ogg_d->subs[ds->id].samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1410 } else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1411 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
1412 /* demux_ogg_read_packet needs decoder context for Vorbis streams */
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
1413 if(((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS)
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1414 context = ((sh_audio_t*)demuxer->audio->sh)->context;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1415 vi = &((ov_struct_t*)((sh_audio_t*)ds->sh)->context)->vi;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1416 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
1417 samplesize = ((sh_audio_t*)ds->sh)->samplesize;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1418 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1419
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1420 os = &ogg_d->subs[ds->id];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1421 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1422
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1423 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
1424 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
1425
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1426 //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
1427 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
1428 if(flags & 2) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1429 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
1430 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
1431 else
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1432 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
1433 } 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
1434 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
1435 if (gp < 0) gp = 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1436
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1437 //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
1438 if(ogg_d->syncpoints) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1439 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
1440 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
1441 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1442
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1443 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
1444 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
1445 sp--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1446 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
1447 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
1448 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
1449 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1450 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
1451 precision = 0;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1452 } 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
1453 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
1454 if(flags & 2)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1455 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
1456 else {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1457 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
1458 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
1459 } else if (os->lastpos > 0) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1460 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
1461 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1462 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1463 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
1464 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
1465 } // if(ogg_d->syncpoints)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1466
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1467 while(1) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1468 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
1469 stream_seek(demuxer->stream,pos+demuxer->movi_start);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1470 ogg_sync_reset(sync);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1471 for(i = 0 ; i < ogg_d->num_sub ; i++) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1472 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
1473 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
1474 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1475 ogg_d->pos = pos;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1476 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
1477 /* 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
1478 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
1479 os->lastpos = gp;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1480 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
1481 do_seek=0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1482 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1483 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1484 ogg_d->last_size = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1485 np = ogg_sync_pageseek(sync,page);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1486
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1487 if(np < 0)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1488 ogg_d->pos -= np;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1489 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1490 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1491 int len = stream_read(demuxer->stream,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1492 if(len == 0 && demuxer->stream->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1493 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to seek !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1494 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1495 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1496 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1497 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1498 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1499 ogg_d->last_size = np;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1500 if(ogg_page_serialno(page) != oss->serialno)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1501 continue;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1502
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1503 if(ogg_stream_pagein(oss,page) != 0)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1504 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1505
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1506 while(1) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1507 np = ogg_stream_packetout(oss,&op);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1508 if(np < 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1509 continue;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1510 else if(np == 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1511 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
1512 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
1513 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
1514 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
1515 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
1516 break;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1517 }
12265
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1518 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
1519 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
1520 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
1521 precision--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1522 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
1523 //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
1524 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
1525 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
1526 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
1527 do_seek=1;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1528 break;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1529 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1530 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1531 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1532 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
1533 && (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
1534 /* 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
1535 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
1536 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
1537 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
1538 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
1539 do_seek=1;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1540 break;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1541 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1542 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1543 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
1544 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
1545 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
1546 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
1547 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
1548 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
1549 if(sh_audio)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1550 resync_audio_stream(sh_audio);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1551 return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1552 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1553 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1554 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1555
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1556 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1557
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1558 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1559
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1560 void demux_close_ogg(demuxer_t* demuxer) {
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1561 ogg_demuxer_t* ogg_d = demuxer->priv;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1562 int i;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1563
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1564 if(!ogg_d)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1565 return;
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1566
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1567 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1568 subcp_close();
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1569 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1570
13641
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1571 ogg_sync_clear(&ogg_d->sync);
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1572 if(ogg_d->subs)
13641
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1573 {
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1574 for (i = 0; i < ogg_d->num_sub; i++)
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1575 ogg_stream_clear(&ogg_d->subs[i].stream);
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1576 free(ogg_d->subs);
13641
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1577 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1578 if(ogg_d->syncpoints)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1579 free(ogg_d->syncpoints);
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1580 if (ogg_d->text_ids)
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1581 free(ogg_d->text_ids);
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1582 if (ogg_d->text_langs) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1583 for (i = 0; i < ogg_d->n_text; i++)
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1584 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
1585 free(ogg_d->text_langs);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1586 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1587 free(ogg_d);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1588 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1589
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1590 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
1591 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
1592 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
1593 float rate;
11577
alex
parents: 11576
diff changeset
1594
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1595 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
1596 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
1597 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
1598 } else {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1599 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
1600 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
1601 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1602
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1603
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1604 switch(cmd) {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1605 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
1606 if (ogg_d->final_granulepos<=0) return DEMUXER_CTRL_DONTKNOW;
11577
alex
parents: 11576
diff changeset
1607 *((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
1608 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
1609
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1610 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
1611 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
1612 *((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
1613 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
1614
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1615 default:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1616 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
1617 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1618 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1619
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1620 #endif