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