Mercurial > mplayer.hg
annotate libmpdemux/demux_ogg.c @ 30935:59f25d383d12
rename eatgv -> ffeatgv, lpcm -> fflpcm
for consitently naming all ffmpeg codecs
requested by compn
author | attila |
---|---|
date | Wed, 31 Mar 2010 06:33:08 +0000 |
parents | 6f68476cced7 |
children | abb0b5990ec8 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
2 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
3 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
7 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
8 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
12 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
13 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28051
diff
changeset
|
17 */ |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
18 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
19 #include "config.h" |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
20 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
21 #include <stdlib.h> |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
22 #include <stdio.h> |
7845
86420d5d7283
endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents:
7760
diff
changeset
|
23 #include <string.h> |
10092 | 24 #include <assert.h> |
25 #include <math.h> | |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18468
diff
changeset
|
26 #include <inttypes.h> |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
27 |
17012 | 28 #include "mp_msg.h" |
29 #include "help_mp.h" | |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21828
diff
changeset
|
30 #include "stream/stream.h" |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
31 #include "demuxer.h" |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
32 #include "stheader.h" |
23312
f625b826ec32
Reuse AV_RL macros in ogg demuxer instead of its own overcomplicated implementations of it.
reimar
parents:
23262
diff
changeset
|
33 #include "libavutil/intreadwrite.h" |
30589
df6c41f16b40
Add header for AVI print functions; avoids many forward declarations.
diego
parents:
30585
diff
changeset
|
34 #include "aviprint.h" |
30580
a25d16882312
Add header file for store_ughvlc(); avoids forward declarations.
diego
parents:
30570
diff
changeset
|
35 #include "demux_mov.h" |
30585
2ed1972eb23b
Add header for demux_ogg_open, init_avi_with_ogg; avoids forward declarations.
diego
parents:
30583
diff
changeset
|
36 #include "demux_ogg.h" |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
37 |
14843 | 38 #define FOURCC_VORBIS mmioFOURCC('v', 'r', 'b', 's') |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
39 #define FOURCC_SPEEX mmioFOURCC('s', 'p', 'x', ' ') |
14843 | 40 #define FOURCC_THEORA mmioFOURCC('t', 'h', 'e', 'o') |
41 | |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27393
diff
changeset
|
42 #ifdef CONFIG_TREMOR |
8342
86835828d5b5
Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents:
8123
diff
changeset
|
43 #include <tremor/ogg.h> |
86835828d5b5
Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents:
8123
diff
changeset
|
44 #include <tremor/ivorbiscodec.h> |
86835828d5b5
Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents:
8123
diff
changeset
|
45 #else |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
46 #include <ogg/ogg.h> |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
47 #include <vorbis/codec.h> |
8342
86835828d5b5
Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents:
8123
diff
changeset
|
48 #endif |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
49 |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
50 #ifdef CONFIG_OGGTHEORA |
10092 | 51 #include <theora/theora.h> |
28051 | 52 int _ilog (unsigned int); /* defined in many places in theora/lib/ */ |
10092 | 53 #endif |
54 | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
55 #define BLOCK_SIZE 4096 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
56 |
10092 | 57 /* Theora decoder context : we won't be able to interpret granule positions |
58 * without using theora_granule_time with the theora_state of the stream. | |
59 * This is duplicated in `vd_theora.c'; put this in a common header? | |
60 */ | |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
61 #ifdef CONFIG_OGGTHEORA |
10092 | 62 typedef struct theora_struct_st { |
63 theora_state st; | |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10608
diff
changeset
|
64 theora_comment cc; |
10092 | 65 theora_info inf; |
66 } theora_struct_t; | |
67 #endif | |
68 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
69 //// OggDS headers |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
70 // Header for the new header format |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
71 typedef struct stream_header_video |
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_int32_t width; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
74 ogg_int32_t height; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
75 } stream_header_video; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
76 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
77 typedef struct stream_header_audio |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
78 { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
79 ogg_int16_t channels; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
80 ogg_int16_t blockalign; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
81 ogg_int32_t avgbytespersec; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
82 } stream_header_audio; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
83 |
13881 | 84 typedef struct __attribute__((__packed__)) stream_header |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
85 { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
86 char streamtype[8]; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
87 char subtype[4]; |
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 size; // size of the structure |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
90 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
91 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
|
92 ogg_int64_t samples_per_unit; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
93 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
|
94 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
95 ogg_int32_t buffersize; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
96 ogg_int16_t bits_per_sample; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
97 |
13881 | 98 ogg_int16_t padding; |
99 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
100 union |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
101 { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
102 // Video specific |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
103 stream_header_video video; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
104 // Audio specific |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
105 stream_header_audio audio; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
106 } sh; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
107 } stream_header; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
108 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
109 /// Our private datas |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
110 |
5732 | 111 typedef struct ogg_syncpoint { |
112 int64_t granulepos; | |
113 off_t page_pos; | |
114 } ogg_syncpoint_t; | |
115 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
116 /// A logical stream |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
117 typedef struct ogg_stream { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
118 /// Timestamping stuff |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
119 float samplerate; /// granulpos 2 time |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
120 int64_t lastpos; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
121 int32_t lastsize; |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
122 int keyframe_frequency_force; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
123 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
124 // Logical stream state |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
125 ogg_stream_state stream; |
5732 | 126 int hdr_packets; |
127 int vorbis; | |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
128 int speex; |
10092 | 129 int theora; |
11004 | 130 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
|
131 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
|
132 int id; |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
133 |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
134 vorbis_info vi; |
25962 | 135 int vi_initialized; |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
136 |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
137 void *ogg_d; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
138 } ogg_stream_t; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
139 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
140 typedef struct ogg_demuxer { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
141 /// Physical stream state |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
142 ogg_sync_state sync; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
143 /// Current page |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
144 ogg_page page; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
145 /// Logical streams |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
146 ogg_stream_t *subs; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
147 int num_sub; |
5732 | 148 ogg_syncpoint_t* syncpoints; |
149 int num_syncpoint; | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
150 off_t pos, last_size; |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
151 int64_t initial_granulepos; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
152 int64_t final_granulepos; |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
153 int64_t duration; |
13127
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
154 |
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
155 /* Used for subtitle switching. */ |
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
156 int n_text; |
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
157 int *text_ids; |
13502 | 158 char **text_langs; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
159 } ogg_demuxer_t; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
160 |
5732 | 161 #define NUM_VORBIS_HDR_PACKETS 3 |
162 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
163 /// Some defines from OggDS |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
164 #define PACKET_TYPE_HEADER 0x01 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
165 #define PACKET_TYPE_BITS 0x07 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
166 #define PACKET_LEN_BITS01 0xc0 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
167 #define PACKET_LEN_BITS2 0x02 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
168 #define PACKET_IS_SYNCPOINT 0x08 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
169 |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
170 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
|
171 extern int dvdsub_id; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
172 |
7010 | 173 //-------- subtitle support - should be moved to decoder layer, and queue |
174 // - subtitles up in demuxer buffer... | |
175 | |
17012 | 176 #include "subreader.h" |
177 #include "libvo/sub.h" | |
7010 | 178 #define OGG_SUB_MAX_LINE 128 |
179 | |
180 static subtitle ogg_sub; | |
181 //FILE* subout; | |
182 | |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29734
diff
changeset
|
183 static void demux_ogg_add_sub(ogg_stream_t *os, ogg_packet *pack) |
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29734
diff
changeset
|
184 { |
7010 | 185 int lcv; |
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
|
186 char *packet = pack->packet; |
7010 | 187 |
20494
30fce0f93ad1
Make sure we do not read beyond end of subtitle packet
reimar
parents:
20493
diff
changeset
|
188 if (pack->bytes < 4) |
30fce0f93ad1
Make sure we do not read beyond end of subtitle packet
reimar
parents:
20493
diff
changeset
|
189 return; |
7010 | 190 mp_msg(MSGT_DEMUX,MSGL_DBG2,"\ndemux_ogg_add_sub %02X %02X %02X '%s'\n", |
191 (unsigned char)packet[0], | |
192 (unsigned char)packet[1], | |
193 (unsigned char)packet[2], | |
194 &packet[3]); | |
195 | |
196 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
|
197 // Find data start |
21828
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
198 double endpts = MP_NOPTS_VALUE; |
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
|
199 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
|
200 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
|
201 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
|
202 lcv = 1 + hdrlen; |
20494
30fce0f93ad1
Make sure we do not read beyond end of subtitle packet
reimar
parents:
20493
diff
changeset
|
203 if (pack->bytes < lcv) |
30fce0f93ad1
Make sure we do not read beyond end of subtitle packet
reimar
parents:
20493
diff
changeset
|
204 return; |
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
|
205 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
|
206 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
|
207 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
|
208 } |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
209 if (hdrlen > 0 && duration > 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
|
210 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
|
211 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
|
212 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
|
213 pts = (float)pack->granulepos/(float)os->samplerate; |
21828
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
214 endpts = 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
|
215 } |
21828
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
216 sub_clear_text(&ogg_sub, MP_NOPTS_VALUE); |
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
217 sub_add_text(&ogg_sub, &packet[lcv], pack->bytes - lcv, endpts); |
7010 | 218 } |
219 | |
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
|
220 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg sub lines: %d first: '%s'\n", |
7010 | 221 ogg_sub.lines, ogg_sub.text[0]); |
27393 | 222 #ifdef CONFIG_ICONV |
20292
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19802
diff
changeset
|
223 subcp_recode(&ogg_sub); |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
224 #endif |
7010 | 225 vo_sub = &ogg_sub; |
226 vo_osd_changed(OSDTYPE_SUBTITLE); | |
227 } | |
228 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
229 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
230 // 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
|
231 // 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
|
232 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
|
233 int id,s_no; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
234 ogg_page* page = &ogg_d->page; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
235 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
236 s_no = ogg_page_serialno(page); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
237 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
238 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
|
239 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
|
240 break; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
241 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
242 |
10363 | 243 if(id == ogg_d->num_sub) { |
244 // If we have only one vorbis stream allow the stream id to change | |
245 // it's normal on radio stream (each song have an different id). | |
246 // But we (or the codec?) should check that the samplerate, etc | |
247 // doesn't change (for radio stream it's ok) | |
248 if(ogg_d->num_sub == 1 && ogg_d->subs[0].vorbis) { | |
249 ogg_stream_reset(&ogg_d->subs[0].stream); | |
250 ogg_stream_init(&ogg_d->subs[0].stream,s_no); | |
251 id = 0; | |
252 } else | |
253 return -1; | |
254 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
255 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
256 if(os) |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
257 *os = &ogg_d->subs[id].stream; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
258 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
259 return id; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
260 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
261 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
262 |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
263 static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,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
|
264 unsigned char* data = pack->packet; |
30836 | 265 int size = pack->bytes; |
5732 | 266 |
30837
6f68476cced7
Return MP_NOPTS_VALUE if we can't figure out the pts, not 0.
reimar
parents:
30836
diff
changeset
|
267 *pts = MP_NOPTS_VALUE; |
5732 | 268 *flags = 0; |
269 | |
270 if(os->vorbis) { | |
271 if(*pack->packet & PACKET_TYPE_HEADER) | |
272 os->hdr_packets++; | |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
273 else |
10092 | 274 { |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
275 vorbis_info *vi; |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
276 int32_t blocksize = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
277 |
11000 | 278 // When we dump the audio, there is no vi, but we don't care of timestamp in this case |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
279 vi = os->vi_initialized ? &os->vi : NULL; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
280 if (vi) |
18465 | 281 blocksize = vorbis_packet_blocksize(vi,pack) / samplesize; |
10092 | 282 // Calculate the timestamp if the packet don't have any |
283 if(pack->granulepos == -1) { | |
284 pack->granulepos = os->lastpos; | |
285 if(os->lastsize > 0) | |
286 pack->granulepos += os->lastsize; | |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
287 } else |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
288 *flags = 1; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
289 if (vi) |
10092 | 290 *pts = pack->granulepos / (float)vi->rate; |
291 os->lastsize = blocksize; | |
292 os->lastpos = pack->granulepos; | |
5732 | 293 } |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
294 } else if (os->speex) { |
17785
adc0e54034f0
in demux_ogg_read_packet initialize data to whole packet, reduces code and
reimar
parents:
17636
diff
changeset
|
295 // whole packet (default) |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
296 # ifdef CONFIG_OGGTHEORA |
10092 | 297 } else if (os->theora) { |
298 /* we pass complete packets to theora, mustn't strip the header! */ | |
299 os->lastsize = 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
300 |
25198 | 301 /* header packets begin on 1-bit: thus check (*data&0x80). We don't |
10711
bc1aad87439a
Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents:
10658
diff
changeset
|
302 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
|
303 decoder. */ |
30836 | 304 if (!size || !(*data&0x80)) |
10092 | 305 { |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
306 int keyframe_granule_shift=_ilog(os->keyframe_frequency_force-1); |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
307 int64_t iframemask = (1 << keyframe_granule_shift) - 1; |
10092 | 308 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
309 if (pack->granulepos >= 0) |
10092 | 310 { |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
311 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
|
312 os->lastpos += pack->granulepos & iframemask; |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
313 *flags = (pack->granulepos & iframemask) == 0; |
10092 | 314 } |
315 else | |
316 { | |
317 os->lastpos++; | |
318 } | |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
319 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
|
320 *pts = (double)os->lastpos / (double)os->samplerate; |
10092 | 321 } |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
322 #endif /* CONFIG_OGGTHEORA */ |
11004 | 323 } else if (os->flac) { |
324 /* we pass complete packets to flac, mustn't strip the header! */ | |
20489 | 325 if (os->flac == 2 && pack->packet[0] != 0xff) |
326 return NULL; | |
5732 | 327 } else { |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
328 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
|
329 os->hdr_packets++; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
330 else { |
5732 | 331 // Find data start |
332 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6; | |
333 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) <<1; | |
334 data = pack->packet + 1 + hdrlen; | |
335 // Calculate the timestamp | |
336 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
|
337 pack->granulepos = os->lastpos + (os->lastsize ? os->lastsize : 1); |
23873 | 338 // If we already have a timestamp it can be a syncpoint |
5732 | 339 if(*pack->packet & PACKET_IS_SYNCPOINT) |
340 *flags = 1; | |
341 *pts = pack->granulepos/os->samplerate; | |
342 // Save the packet length and timestamp | |
343 os->lastsize = 0; | |
344 while(hdrlen) { | |
345 os->lastsize <<= 8; | |
346 os->lastsize |= pack->packet[hdrlen]; | |
347 hdrlen--; | |
348 } | |
349 os->lastpos = pack->granulepos; | |
350 } | |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
351 } |
5732 | 352 return data; |
353 } | |
354 | |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
355 // check if clang has substring from comma separated langlist |
25495 | 356 static int demux_ogg_check_lang(const char *clang, const char *langlist) |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
357 { |
25495 | 358 const char *c; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
359 |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
360 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
|
361 return 0; |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
362 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
|
363 { |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
364 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
|
365 return 1; |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
366 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
|
367 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
368 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
|
369 return 1; |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
370 return 0; |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
371 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
372 |
30582
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
373 /** \brief Change the current subtitle stream and return its ID. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
374 |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
375 \param demuxer The demuxer whose subtitle stream will be changed. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
376 \param new_num The number of the new subtitle track. The number must be |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
377 between 0 and ogg_d->n_text - 1. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
378 |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
379 \returns The Ogg stream number ( = page serial number) of the newly selected |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
380 track. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
381 */ |
30583
c8b12c3fc5a5
Mark demux_ogg_sub_id() as static; it is not used outside of the file.
diego
parents:
30582
diff
changeset
|
382 static int demux_ogg_sub_id(demuxer_t *demuxer, int index) |
c8b12c3fc5a5
Mark demux_ogg_sub_id() as static; it is not used outside of the file.
diego
parents:
30582
diff
changeset
|
383 { |
30582
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
384 ogg_demuxer_t *ogg_d = demuxer->priv; |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
385 return (index < 0) ? index : (index >= ogg_d->n_text) ? -1 : ogg_d->text_ids[index]; |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
386 } |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
387 |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
388 /** \brief Translate the ogg track number into the subtitle number. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
389 * \param demuxer The demuxer about whose subtitles we are inquiring. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
390 * \param id The ogg track number of the subtitle track. |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
391 */ |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
392 static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id) { |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
393 ogg_demuxer_t *ogg_d = demuxer->priv; |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
394 int i; |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
395 for (i = 0; i < ogg_d->n_text; i++) |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
396 if (ogg_d->text_ids[i] == id) return i; |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
397 return -1; |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
398 } |
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
|
399 |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
400 /// 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
|
401 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
|
402 { |
19110
08888397444e
marks several strings inside structs as const when they hold just
reynaldo
parents:
19053
diff
changeset
|
403 const char *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
|
404 char **cmt = vc->user_comments; |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
405 int index, i; |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
406 ogg_demuxer_t *ogg_d = d->priv; |
25495 | 407 static const struct table { |
19110
08888397444e
marks several strings inside structs as const when they hold just
reynaldo
parents:
19053
diff
changeset
|
408 const char *ogg; |
08888397444e
marks several strings inside structs as const when they hold just
reynaldo
parents:
19053
diff
changeset
|
409 const char *mp; |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
410 } table[] = { |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
411 { "ENCODED_USING", "Software" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
412 { "ENCODER_URL", "Encoder URL" }, |
29288
4a1c217a844b
In all demux_info_add calls change "name" to "title".
reimar
parents:
29263
diff
changeset
|
413 { "TITLE", "Title" }, |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
414 { "ARTIST", "Artist" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
415 { "COMMENT", "Comments" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
416 { "DATE", "Creation Date" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
417 { "GENRE", "Genre" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
418 { "ALBUM", "Album" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
419 { "TRACKNUMBER", "Track" }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
420 { NULL, NULL }, |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
421 }; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
422 |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
423 while(*cmt) |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
424 { |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
425 hdr = NULL; |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
426 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
|
427 { |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
428 val = *cmt + 9; |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
17977
diff
changeset
|
429 if (ogg_d->subs[id].text) |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
17977
diff
changeset
|
430 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", ogg_d->subs[id].id, val); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
17977
diff
changeset
|
431 else if (id != d->video->id) |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
17977
diff
changeset
|
432 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", ogg_d->subs[id].id, val); |
14562
ee95cfdc1433
More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents:
14535
diff
changeset
|
433 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
|
434 mp_msg(MSGT_DEMUX, MSGL_INFO, "[Ogg] Language for -sid %d is '-slang \"%s\"'\n", ogg_d->subs[id].id, val); |
13502 | 435 // copy this language name into the array |
436 index = demux_ogg_sub_reverse_id(d, id); | |
437 if (index >= 0) { | |
26084
ec5749eb6f5f
Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents:
25962
diff
changeset
|
438 sh_sub_t* sh; |
13502 | 439 // in case of malicious files with more than one lang per track: |
440 if (ogg_d->text_langs[index]) free(ogg_d->text_langs[index]); | |
441 ogg_d->text_langs[index] = strdup(val); | |
26084
ec5749eb6f5f
Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents:
25962
diff
changeset
|
442 sh = d->s_streams[index]; |
ec5749eb6f5f
Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents:
25962
diff
changeset
|
443 if (sh && sh->lang) free(sh->lang); |
ec5749eb6f5f
Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents:
25962
diff
changeset
|
444 if (sh) sh->lang = strdup(val); |
13502 | 445 } |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
446 // check for -slang if subs are uninitialized yet |
21036
cdf75ea331c9
Make -slang work again, sub->id is -2 by default, so -slang would be ignored
reimar
parents:
21035
diff
changeset
|
447 if (os->text && d->sub->id < 0 && demux_ogg_check_lang(val, dvdsub_lang)) |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
448 { |
21038
bfd340cdac88
Generalize subtitle switching, demux_ogg does not need a special case
reimar
parents:
21036
diff
changeset
|
449 d->sub->id = index; |
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
|
450 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
|
451 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
|
452 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
453 else |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
454 hdr = "Language"; |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
455 } |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
456 else { |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
457 for (i = 0; table[i].ogg; i++) |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
458 { |
23262
a08c4d770870
Ignore comments where no '=' follows the comment name (otherwise
reimar
parents:
22605
diff
changeset
|
459 if (!strncasecmp(*cmt, table[i].ogg, strlen(table[i].ogg)) && |
a08c4d770870
Ignore comments where no '=' follows the comment name (otherwise
reimar
parents:
22605
diff
changeset
|
460 (*cmt)[strlen(table[i].ogg)] == '=') |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
461 { |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
462 hdr = table[i].mp; |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
463 val = *cmt + strlen(table[i].ogg) + 1; |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
464 } |
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
465 } |
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 if (hdr) |
16604 | 468 demux_info_add(d, hdr, val); |
16537
13a95663a160
Disassemble comments and pass it to the demux_info interface
alex
parents:
16346
diff
changeset
|
469 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
|
470 cmt++; |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
471 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
472 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
473 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
474 /// 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
|
475 // 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
|
476 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
|
477 demuxer_t* d = ds->demuxer; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
478 demux_packet_t* dp; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
479 unsigned char* data; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
480 float pts = 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
481 int flags = 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
|
482 int samplesize = 1; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
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 // 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
|
485 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
|
486 { |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
487 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
|
488 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
|
489 |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
490 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
|
491 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
|
492 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
|
493 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
|
494 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
|
495 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
|
496 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
|
497 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
498 if (os->text) { |
21039 | 499 if (id == demux_ogg_sub_id(d, d->sub->id)) // don't want to add subtitles to the demuxer for now |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
500 demux_ogg_add_sub(os,pack); |
7010 | 501 return 0; |
502 } | |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
503 if (os->speex) { |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
504 // 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
|
505 if (os->hdr_packets < 2) { |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
506 os->hdr_packets++; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
507 return 0; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
508 } |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
509 } else |
10092 | 510 // If packet is an header we jump it except for vorbis and theora |
511 // (PACKET_TYPE_HEADER bit doesn't even exist for theora ?!) | |
11464
1efd0f9a946d
For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents:
11128
diff
changeset
|
512 // We jump nothing for FLAC. Ain't this great? Packet contents have to be |
1efd0f9a946d
For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents:
11128
diff
changeset
|
513 // handled differently for each and every stream type. The joy! The joy! |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
514 if(!os->flac && (*pack->packet & PACKET_TYPE_HEADER) && |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
515 (ds != d->audio || ((sh_audio_t*)ds->sh)->format != FOURCC_VORBIS || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) && |
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
516 (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
|
517 return 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
518 |
10092 | 519 // For vorbis packet the packet is the data, for other codec we must jump |
520 // the header | |
14843 | 521 if(ds == d->audio && ((sh_audio_t*)ds->sh)->format == FOURCC_VORBIS) { |
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
|
522 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
|
523 } |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
524 data = demux_ogg_read_packet(os,pack,&pts,&flags,samplesize); |
20489 | 525 if (!data) |
526 return 0; | |
5732 | 527 |
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
|
528 /// Clear subtitles if necessary (for broken files) |
21828
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
529 if (sub_clear_text(&ogg_sub, pts)) { |
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
|
530 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
|
531 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
|
532 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
533 /// Send the packet |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
534 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
|
535 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
|
536 dp->pts = pts; |
a43b00b28081
fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents:
5133
diff
changeset
|
537 dp->flags = flags; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
538 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
|
539 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
|
540 dp, ds, pts, dp->len, flags); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
541 return 1; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
542 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
543 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
544 /// 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
|
545 /// otherwise try to get at least the final_granulepos |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29734
diff
changeset
|
546 static void demux_ogg_scan_stream(demuxer_t *demuxer) |
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29734
diff
changeset
|
547 { |
5732 | 548 ogg_demuxer_t* ogg_d = demuxer->priv; |
549 stream_t *s = demuxer->stream; | |
550 ogg_sync_state* sync = &ogg_d->sync; | |
551 ogg_page* page= &ogg_d->page; | |
552 ogg_stream_state* oss; | |
553 ogg_stream_t* os; | |
554 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
|
555 int np,sid,p,samplesize=1; |
5732 | 556 off_t pos, last_pos; |
557 pos = last_pos = demuxer->movi_start; | |
558 | |
559 // Reset the stream | |
560 stream_seek(s,demuxer->movi_start); | |
561 ogg_sync_reset(sync); | |
562 | |
563 // Get the serial number of the stream we use | |
10092 | 564 if(demuxer->video->id >= 0) { |
5732 | 565 sid = demuxer->video->id; |
10092 | 566 } |
17218 | 567 else if(demuxer->audio->id >= 0) { |
5732 | 568 sid = demuxer->audio->id; |
14843 | 569 if(((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS) { |
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
|
570 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
|
571 } |
5732 | 572 } |
17218 | 573 else return; |
5732 | 574 os = &ogg_d->subs[sid]; |
575 oss = &os->stream; | |
576 | |
577 while(1) { | |
578 np = ogg_sync_pageseek(sync,page); | |
579 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
|
580 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_ERR,"Bad page sync while building syncpoints table (%d)\n",-np); |
5732 | 581 pos += -np; |
582 continue; | |
583 } | |
584 if(np <= 0) { // We need more data | |
585 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE); | |
586 int len = stream_read(s,buf,BLOCK_SIZE); | |
587 if(len == 0 && s->eof) | |
588 break; | |
589 ogg_sync_wrote(sync,len); | |
590 continue; | |
591 } | |
592 // The page is ready | |
593 //ogg_sync_pageout(sync,page); | |
594 if(ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want | |
595 pos += np; | |
596 continue; | |
597 } | |
598 if(ogg_stream_pagein(oss,page) != 0) { | |
599 mp_msg(MSGT_DEMUX,MSGL_ERR,"Pagein error ????\n"); | |
600 pos += np; | |
601 continue; | |
602 } | |
603 p = 0; | |
604 while(ogg_stream_packetout(oss,&op) == 1) { | |
605 float pts; | |
606 int flags; | |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
607 demux_ogg_read_packet(os,&op,&pts,&flags,samplesize); |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
608 if(op.granulepos >= 0) { |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
609 ogg_d->final_granulepos = op.granulepos; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
610 if(ogg_d->initial_granulepos == MP_NOPTS_VALUE && (flags & 1)) { |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
611 ogg_d->initial_granulepos = op.granulepos; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
612 if (index_mode != 2 && ogg_d->pos < demuxer->movi_end-2*270000) { |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
613 //the 270000 are just a wild guess |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
614 stream_seek(s,FFMAX(ogg_d->pos,demuxer->movi_end-270000)); |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
615 ogg_sync_reset(sync); |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
616 continue; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
617 } |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
618 } |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
619 } |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
620 if(index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) { |
18468
3a624063cbc9
accidentally committed this overflow fix with the declaration fix before.
rfelker
parents:
18465
diff
changeset
|
621 if (ogg_d->num_syncpoint > SIZE_MAX / sizeof(ogg_syncpoint_t) - 1) break; |
18465 | 622 ogg_d->syncpoints = realloc_struct(ogg_d->syncpoints,(ogg_d->num_syncpoint+1), sizeof(ogg_syncpoint_t)); |
5732 | 623 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos; |
624 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos; | |
625 ogg_d->num_syncpoint++; | |
626 } | |
627 p++; | |
628 } | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
629 if(p > 1 || (p == 1 && ! ogg_page_continued(page))) |
5732 | 630 last_pos = pos; |
631 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
|
632 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"Building syncpoint table %d%%\r",(int)(pos*100/s->end_pos)); |
5732 | 633 } |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
634 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"\n"); |
5732 | 635 |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
636 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_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
|
637 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream length (granulepos): %"PRId64"\n",ogg_d->final_granulepos); |
5732 | 638 |
639 stream_reset(s); | |
640 stream_seek(s,demuxer->movi_start); | |
641 ogg_sync_reset(sync); | |
642 for(np = 0 ; np < ogg_d->num_sub ; np++) { | |
643 ogg_stream_reset(&ogg_d->subs[np].stream); | |
644 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0; | |
645 } | |
646 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
647 |
5732 | 648 // Get the first page |
649 while(1) { | |
650 np = ogg_sync_pageout(sync,page); | |
651 if(np <= 0) { // We need more data | |
652 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE); | |
653 int len = stream_read(s,buf,BLOCK_SIZE); | |
654 if(len == 0 && s->eof) { | |
655 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to get the first page !!!!\n"); | |
656 break; | |
657 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
658 |
5732 | 659 ogg_sync_wrote(sync,len); |
660 continue; | |
661 } | |
662 demux_ogg_get_page_stream(ogg_d,&oss); | |
663 ogg_stream_pagein(oss,page); | |
664 break; | |
665 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
666 |
5732 | 667 } |
668 | |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
669 static void fixup_vorbis_wf(sh_audio_t *sh, ogg_demuxer_t *od) |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
670 { |
15423
9a126d9d6d42
fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents:
15422
diff
changeset
|
671 int i, offset; |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
672 int ris, init_error = 0; |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
673 ogg_packet op[3]; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
674 unsigned char *buf[3]; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
675 unsigned char *ptr; |
15426 | 676 unsigned int len; |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
677 ogg_stream_t *os = &od->subs[sh->ds->id]; |
21509
18d525833180
vorbis_comment is only used locally, move it out of demuxer struct
reimar
parents:
21508
diff
changeset
|
678 vorbis_comment vc; |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
679 |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
680 vorbis_info_init(&os->vi); |
21509
18d525833180
vorbis_comment is only used locally, move it out of demuxer struct
reimar
parents:
21508
diff
changeset
|
681 vorbis_comment_init(&vc); |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
682 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
|
683 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
|
684 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
|
685 if(op[i].bytes < 0) { |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
686 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
|
687 return; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
688 } |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
689 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
|
690 if(!buf[i]) |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
691 return; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
692 memcpy(buf[i], op[i].packet, op[i].bytes); |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
693 |
18637
94524d81d145
first vorbis packet before vorbis_synthesis_headeri() must have b_o_s==1
nicodvb
parents:
18558
diff
changeset
|
694 op[i].b_o_s = (i==0); |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
695 ris = vorbis_synthesis_headerin(&os->vi,&vc,&op[i]); |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
696 if(ris < 0) { |
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
697 init_error = 1; |
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
698 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"DEMUX_OGG: header n. %d broken! len=%ld, code: %d\n", i, op[i].bytes, ris); |
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
699 } |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
700 } |
21509
18d525833180
vorbis_comment is only used locally, move it out of demuxer struct
reimar
parents:
21508
diff
changeset
|
701 vorbis_comment_clear(&vc); |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
702 if(!init_error) |
25962 | 703 os->vi_initialized = 1; |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
704 |
15426 | 705 len = op[0].bytes + op[1].bytes + op[2].bytes; |
18885 | 706 sh->wf = 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
|
707 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
|
708 |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
709 ptr[0] = 2; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
710 offset = 1; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
711 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
|
712 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
|
713 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
|
714 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
|
715 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
|
716 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
|
717 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
|
718 offset += op[i].bytes; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
719 } |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
720 sh->wf->cbSize = offset; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
721 mp_msg(MSGT_DEMUX,MSGL_V, "demux_ogg, extradata size: %d\n", sh->wf->cbSize); |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
722 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX) + sh->wf->cbSize); |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
723 |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
724 if(op[0].bytes >= 29) { |
19694
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
725 unsigned int br; |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
726 int nombr, minbr, maxbr; |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
727 ptr = buf[0]; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
728 sh->channels = ptr[11]; |
25206 | 729 sh->samplerate = sh->wf->nSamplesPerSec = AV_RL32(&ptr[12]); |
730 maxbr = AV_RL32(&ptr[16]); //max | |
731 nombr = AV_RL32(&ptr[20]); //nominal | |
732 minbr = AV_RL32(&ptr[24]); //minimum | |
19694
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
733 |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
734 if(maxbr == -1) |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
735 maxbr = 0; |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
736 if(nombr == -1) |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
737 nombr = 0; |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
738 if(minbr == -1) |
d32f43ae7f5b
in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents:
19540
diff
changeset
|
739 minbr = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
740 |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
741 br = maxbr / 8; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
742 if(!br) |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
743 br = nombr / 8; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
744 if(!br) |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
745 br = minbr / 8; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
746 sh->wf->nAvgBytesPerSec = br; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
747 sh->wf->wBitsPerSample = 16; |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
748 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
|
749 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
750 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", |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
751 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
|
752 } |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
753 free(buf[2]); |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
754 free(buf[1]); |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
755 free(buf[0]); |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
756 } |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
757 |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
758 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
759 /// Open an ogg physical stream |
16175 | 760 // 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
|
761 int demux_ogg_open(demuxer_t* demuxer) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
762 ogg_demuxer_t* ogg_d; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
763 stream_t *s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
764 char* buf; |
13089 | 765 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
|
766 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
|
767 ogg_sync_state* sync; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
768 ogg_page* page; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
769 ogg_packet pack; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
770 sh_audio_t* sh_a; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
771 sh_video_t* sh_v; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
772 |
27393 | 773 #ifdef CONFIG_ICONV |
12909
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12703
diff
changeset
|
774 subcp_open(NULL); |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
775 #endif |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
776 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
777 s = demuxer->stream; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
778 |
15321
1568ad46dc78
Fix the memleak fix: in case of error, demux_close_ogg should be called
reimar
parents:
15313
diff
changeset
|
779 demuxer->priv = |
18885 | 780 ogg_d = calloc(1,sizeof(ogg_demuxer_t)); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
781 sync = &ogg_d->sync; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
782 page = &ogg_d->page; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
783 |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
784 ogg_sync_init(sync); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
785 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
786 while(1) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
787 /// Try to get a page |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
788 ogg_d->pos += ogg_d->last_size; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
789 np = ogg_sync_pageseek(sync,page); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
790 /// Error |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
791 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
|
792 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
|
793 goto err_out; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
794 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
795 /// Need some more data |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
796 if(np == 0) { |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
797 int len; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
798 buf = ogg_sync_buffer(sync,BLOCK_SIZE); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
799 len = stream_read(s,buf,BLOCK_SIZE); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
800 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
|
801 goto err_out; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
802 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
803 ogg_sync_wrote(sync,len); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
804 continue; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
805 } |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
806 ogg_d->last_size = np; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
807 // We got one page now |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
808 |
25198 | 809 if( ! ogg_page_bos(page) ) { // It's not a beginning page |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
810 // 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
|
811 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
|
812 if(id >= 0) |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
813 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
|
814 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
|
815 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
|
816 break; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
817 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
818 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
819 /// Init the data structure needed for a logical stream |
25494 | 820 ogg_d->subs = realloc_struct(ogg_d->subs,ogg_d->num_sub+1,sizeof(ogg_stream_t)); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
821 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
|
822 /// Get the stream serial number |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
823 s_no = ogg_page_serialno(page); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
824 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
|
825 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
|
826 // Take the first page |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
827 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
|
828 // Get first packet of the page |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
829 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
|
830 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
831 // Reset our vars |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
832 sh_a = NULL; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
833 sh_v = NULL; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
834 |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
835 ogg_d->subs[ogg_d->num_sub].ogg_d = ogg_d; |
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
|
836 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
837 // Check for Vorbis |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
838 if(pack.bytes >= 7 && ! strncmp(&pack.packet[1],"vorbis", 6) ) { |
19540 | 839 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio); |
14843 | 840 sh_a->format = FOURCC_VORBIS; |
5732 | 841 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
|
842 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
|
843 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
|
844 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
|
845 } else if (pack.bytes >= 80 && !strncmp(pack.packet,"Speex", 5)) { |
19540 | 846 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
18885 | 847 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + pack.bytes); |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
848 sh_a->format = FOURCC_SPEEX; |
25206 | 849 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL32(&pack.packet[36]); |
850 sh_a->channels = sh_a->wf->nChannels = AV_RL32(&pack.packet[48]); | |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
851 sh_a->wf->wFormatTag = sh_a->format; |
25206 | 852 sh_a->wf->nAvgBytesPerSec = AV_RL32(&pack.packet[52]); |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
853 sh_a->wf->nBlockAlign = 0; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
854 sh_a->wf->wBitsPerSample = 16; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
855 sh_a->samplesize = 2; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
856 sh_a->wf->cbSize = pack.bytes; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
857 memcpy(&sh_a->wf[1], pack.packet, pack.bytes); |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
858 |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
859 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
|
860 ogg_d->subs[ogg_d->num_sub].speex = 1; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
861 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
|
862 n_audio++; |
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
863 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
|
864 |
10092 | 865 // check for Theora |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
866 # ifdef CONFIG_OGGTHEORA |
10092 | 867 } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) { |
868 int errorCode = 0; | |
869 theora_info inf; | |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10608
diff
changeset
|
870 theora_comment cc; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
871 |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10608
diff
changeset
|
872 theora_info_init (&inf); |
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10608
diff
changeset
|
873 theora_comment_init (&cc); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
874 |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10608
diff
changeset
|
875 errorCode = theora_decode_header (&inf, &cc, &pack); |
10092 | 876 if (errorCode) |
877 mp_msg(MSGT_DEMUX,MSGL_ERR,"Theora header parsing failed: %i \n", | |
878 errorCode); | |
879 else | |
880 { | |
19540 | 881 sh_v = new_sh_video_vid(demuxer,ogg_d->num_sub, n_video); |
10092 | 882 |
18885 | 883 sh_v->bih = calloc(1,sizeof(BITMAPINFOHEADER)); |
10092 | 884 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER); |
14843 | 885 sh_v->bih->biCompression= sh_v->format = FOURCC_THEORA; |
10092 | 886 sh_v->fps = ((double)inf.fps_numerator)/ |
887 (double)inf.fps_denominator; | |
888 sh_v->frametime = ((double)inf.fps_denominator)/ | |
889 (double)inf.fps_numerator; | |
14763 | 890 sh_v->disp_w = sh_v->bih->biWidth = inf.frame_width; |
891 sh_v->disp_h = sh_v->bih->biHeight = inf.frame_height; | |
10092 | 892 sh_v->bih->biBitCount = 24; |
893 sh_v->bih->biPlanes = 3; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
894 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount/8) * |
10092 | 895 sh_v->bih->biWidth*sh_v->bih->biHeight); |
896 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps; | |
897 ogg_d->subs[ogg_d->num_sub].theora = 1; | |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
898 ogg_d->subs[ogg_d->num_sub].keyframe_frequency_force = inf.keyframe_frequency_force; |
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
|
899 ogg_d->subs[ogg_d->num_sub].id = n_video; |
10092 | 900 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
|
901 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
|
902 "[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
|
903 ogg_d->num_sub, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
904 (int)inf.version_major, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
905 (int)inf.version_minor, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
906 (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
|
907 n_video - 1); |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
908 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_v->bih,MSGL_V); |
10092 | 909 } |
21500
e7e7f397f991
Fix memleaks caused by missing vorbis/theora_info/comment_clear calls.
reimar
parents:
21039
diff
changeset
|
910 theora_comment_clear(&cc); |
e7e7f397f991
Fix memleaks caused by missing vorbis/theora_info/comment_clear calls.
reimar
parents:
21039
diff
changeset
|
911 theora_info_clear(&inf); |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
912 # endif /* CONFIG_OGGTHEORA */ |
11004 | 913 } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) { |
19540 | 914 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio); |
11004 | 915 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
|
916 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
11004 | 917 n_audio++; |
918 ogg_d->subs[ogg_d->num_sub].flac = 1; | |
919 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
|
920 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (FLAC), -aid %d\n",ogg_d->num_sub,n_audio-1); |
20489 | 921 } else if (pack.bytes >= 51 && !strncmp(&pack.packet[1], "FLAC", 4)) { |
922 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio); | |
923 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C'); | |
924 ogg_d->subs[ogg_d->num_sub].id = n_audio; | |
925 n_audio++; | |
926 ogg_d->subs[ogg_d->num_sub].flac = 2; | |
927 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + 34); | |
928 sh_a->wf->wFormatTag = sh_a->format; | |
929 sh_a->wf->cbSize = 34; | |
930 memcpy(&sh_a->wf[1], &pack.packet[17], 34); | |
931 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (FLAC, try 2), -aid %d\n",ogg_d->num_sub,n_audio-1); | |
11004 | 932 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
933 /// Check for old header |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
934 } 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
|
935 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
936 // Old video header |
25206 | 937 if(AV_RL32(pack.packet+96) == 0x05589f80 && pack.bytes >= 184) { |
19540 | 938 sh_v = new_sh_video_vid(demuxer,ogg_d->num_sub, n_video); |
18885 | 939 sh_v->bih = calloc(1,sizeof(BITMAPINFOHEADER)); |
5429
e9e2dc1306b1
BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents:
5428
diff
changeset
|
940 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER); |
e9e2dc1306b1
BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents:
5428
diff
changeset
|
941 sh_v->bih->biCompression= |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
942 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
|
943 pack.packet[70],pack.packet[71]); |
25206 | 944 sh_v->frametime = AV_RL64(pack.packet+164)*0.0000001; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
945 sh_v->fps = 1/sh_v->frametime; |
25206 | 946 sh_v->disp_w = sh_v->bih->biWidth = AV_RL32(pack.packet+176); |
947 sh_v->disp_h = sh_v->bih->biHeight = AV_RL32(pack.packet+180); | |
948 sh_v->bih->biBitCount = AV_RL16(pack.packet+182); | |
5429
e9e2dc1306b1
BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents:
5428
diff
changeset
|
949 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
|
950 sh_v->bih->biPlanes=1; |
e9e2dc1306b1
BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents:
5428
diff
changeset
|
951 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
|
952 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
953 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
|
954 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
|
955 n_video++; |
14562
ee95cfdc1433
More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents:
14535
diff
changeset
|
956 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
|
957 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
|
958 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
|
959 // Old audio header |
25206 | 960 } else if(AV_RL32(pack.packet+96) == 0x05589F81) { |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
961 unsigned int extra_size; |
19540 | 962 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio); |
25206 | 963 extra_size = AV_RL16(pack.packet+140); |
18885 | 964 sh_a->wf = calloc(1,sizeof(WAVEFORMATEX)+extra_size); |
25206 | 965 sh_a->format = sh_a->wf->wFormatTag = AV_RL16(pack.packet+124); |
966 sh_a->channels = sh_a->wf->nChannels = AV_RL16(pack.packet+126); | |
967 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL32(pack.packet+128); | |
968 sh_a->wf->nAvgBytesPerSec = AV_RL32(pack.packet+132); | |
969 sh_a->wf->nBlockAlign = AV_RL16(pack.packet+136); | |
970 sh_a->wf->wBitsPerSample = AV_RL16(pack.packet+138); | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
971 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
|
972 sh_a->wf->cbSize = extra_size; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
973 if(extra_size > 0) |
14535
c920c525daa2
100l, completely broken pointer arithmetic causing crashes.
reimar
parents:
14046
diff
changeset
|
974 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
|
975 |
7396
cfb1bc3925eb
The granule position of pages contining Vorbis audio is in units of
arpi
parents:
7115
diff
changeset
|
976 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
|
977 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
|
978 n_audio++; |
14562
ee95cfdc1433
More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents:
14535
diff
changeset
|
979 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
|
980 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
|
981 } 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
|
982 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
|
983 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
984 // Check new header |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
985 } else if ( (*pack.packet & PACKET_TYPE_BITS ) == PACKET_TYPE_HEADER && |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
986 pack.bytes >= (int)sizeof(stream_header)+1) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
987 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
|
988 /// New video header |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
989 if(strncmp(st->streamtype,"video",5) == 0) { |
19540 | 990 sh_v = new_sh_video_vid(demuxer,ogg_d->num_sub, n_video); |
18885 | 991 sh_v->bih = calloc(1,sizeof(BITMAPINFOHEADER)); |
5430 | 992 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER); |
993 sh_v->bih->biCompression= | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
994 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
|
995 st->subtype[2],st->subtype[3]); |
25206 | 996 sh_v->frametime = AV_RL64(&st->time_unit)*0.0000001; |
7845
86420d5d7283
endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents:
7760
diff
changeset
|
997 sh_v->fps = 1.0/sh_v->frametime; |
25206 | 998 sh_v->bih->biBitCount = AV_RL16(&st->bits_per_sample); |
999 sh_v->disp_w = sh_v->bih->biWidth = AV_RL32(&st->sh.video.width); | |
1000 sh_v->disp_h = sh_v->bih->biHeight = AV_RL32(&st->sh.video.height); | |
5430 | 1001 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME |
1002 sh_v->bih->biPlanes=1; | |
1003 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
|
1004 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1005 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
|
1006 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
|
1007 n_video++; |
14562
ee95cfdc1433
More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents:
14535
diff
changeset
|
1008 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
|
1009 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
|
1010 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
|
1011 /// New audio header |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1012 } 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
|
1013 char buffer[5]; |
25206 | 1014 unsigned int extra_size = AV_RL32(&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
|
1015 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
|
1016 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1017 memcpy(buffer,st->subtype,4); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1018 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
|
1019 |
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
|
1020 /* 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
|
1021 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
|
1022 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
|
1023 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
|
1024 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
|
1025 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
|
1026 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
|
1027 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
|
1028 } |
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
|
1029 |
19540 | 1030 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio); |
18885 | 1031 sh_a->wf = calloc(1,sizeof(WAVEFORMATEX)+extra_size); |
6850 | 1032 sh_a->format = sh_a->wf->wFormatTag = strtol(buffer, NULL, 16); |
25206 | 1033 sh_a->channels = sh_a->wf->nChannels = AV_RL16(&st->sh.audio.channels); |
1034 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL64(&st->samples_per_unit); | |
1035 sh_a->wf->nAvgBytesPerSec = AV_RL32(&st->sh.audio.avgbytespersec); | |
1036 sh_a->wf->nBlockAlign = AV_RL16(&st->sh.audio.blockalign); | |
1037 sh_a->wf->wBitsPerSample = AV_RL16(&st->bits_per_sample); | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1038 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
|
1039 sh_a->wf->cbSize = extra_size; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1040 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
|
1041 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
|
1042 |
7396
cfb1bc3925eb
The granule position of pages contining Vorbis audio is in units of
arpi
parents:
7115
diff
changeset
|
1043 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
|
1044 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
|
1045 n_audio++; |
14562
ee95cfdc1433
More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents:
14535
diff
changeset
|
1046 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
|
1047 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
|
1048 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1049 /// Check for text (subtitles) header |
7010 | 1050 } 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
|
1051 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); |
25206 | 1052 ogg_d->subs[ogg_d->num_sub].samplerate= AV_RL64(&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
|
1053 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
|
1054 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
|
1055 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
|
1056 text_id = ogg_d->num_sub; |
21035 | 1057 new_sh_sub(demuxer, ogg_d->n_text); |
13127
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
1058 ogg_d->n_text++; |
25494 | 1059 ogg_d->text_ids = realloc_struct(ogg_d->text_ids, ogg_d->n_text, sizeof(int)); |
13127
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
1060 ogg_d->text_ids[ogg_d->n_text - 1] = ogg_d->num_sub; |
25494 | 1061 ogg_d->text_langs = realloc_struct(ogg_d->text_langs, ogg_d->n_text, sizeof(char *)); |
13502 | 1062 ogg_d->text_langs[ogg_d->n_text - 1] = NULL; |
10397 | 1063 //// Unknown header type |
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_ERR,"Ogg stream %d has a header marker but is of an unknown type\n",ogg_d->num_sub); |
10608 | 1066 /// Unknown (invalid ?) header |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1067 } 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
|
1068 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
|
1069 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1070 if(sh_a || sh_v) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1071 demux_stream_t* ds = NULL; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1072 if(sh_a) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1073 // 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
|
1074 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
|
1075 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
|
1076 // 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
|
1077 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1078 /// Is it the stream we want |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1079 if(demuxer->audio->id == n_audio - 1) { |
6124
12b1f920c1f4
a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents:
5812
diff
changeset
|
1080 demuxer->audio->sh = sh_a; |
12b1f920c1f4
a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents:
5812
diff
changeset
|
1081 sh_a->ds = demuxer->audio; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1082 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
|
1083 audio_id = ogg_d->num_sub; |
6156 | 1084 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1085 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1086 if(sh_v) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1087 /// Also for video |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1088 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
|
1089 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
|
1090 // 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
|
1091 } |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1092 if(demuxer->video->id == n_video - 1) { |
6124
12b1f920c1f4
a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents:
5812
diff
changeset
|
1093 demuxer->video->sh = sh_v; |
12b1f920c1f4
a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents:
5812
diff
changeset
|
1094 sh_v->ds = demuxer->video; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1095 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
|
1096 video_id = ogg_d->num_sub; |
6156 | 1097 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1098 } |
5732 | 1099 /// 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
|
1100 if(ds && !s->end_pos) { |
5732 | 1101 /// Finish the page, otherwise packets will be lost |
1102 do { | |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
1103 demux_ogg_add_packet(ds,&ogg_d->subs[ogg_d->num_sub],ogg_d->num_sub,&pack); |
5732 | 1104 } while(ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack) == 1); |
1105 } | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1106 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1107 ogg_d->num_sub++; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1108 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1109 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1110 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
|
1111 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
|
1112 } |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1113 |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1114 if(!n_video || video_id < 0) |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1115 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
|
1116 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
|
1117 demuxer->video->id = video_id; |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1118 if(!n_audio || audio_id < 0) |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1119 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
|
1120 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
|
1121 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
|
1122 /* 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
|
1123 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
|
1124 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
|
1125 if(!ogg_d->n_text) |
7010 | 1126 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
|
1127 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
|
1128 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
|
1129 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
|
1130 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1131 |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1132 ogg_d->final_granulepos=0; |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1133 ogg_d->initial_granulepos = MP_NOPTS_VALUE; |
5732 | 1134 if(!s->end_pos) |
1135 demuxer->seekable = 0; | |
1136 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
|
1137 demuxer->movi_start = s->start_pos; // Needed for XCD (Ogg written in MODE2) |
5732 | 1138 demuxer->movi_end = s->end_pos; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1139 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
|
1140 demux_ogg_scan_stream(demuxer); |
5732 | 1141 } |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1142 if (ogg_d->initial_granulepos == MP_NOPTS_VALUE) |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1143 ogg_d->initial_granulepos = 0; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1144 ogg_d->duration = ogg_d->final_granulepos - ogg_d->initial_granulepos; |
5732 | 1145 |
13127
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
1146 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 | 1147 |
15424 | 1148 sh_a = demuxer->audio->sh; |
15422 | 1149 if(sh_a) |
1150 if(sh_a->format == FOURCC_VORBIS) | |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
1151 fixup_vorbis_wf(sh_a, ogg_d); |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
1152 |
16175 | 1153 return DEMUXER_TYPE_OGG; |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14574
diff
changeset
|
1154 |
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14574
diff
changeset
|
1155 err_out: |
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14574
diff
changeset
|
1156 return 0; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1157 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1158 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1159 |
16175 | 1160 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
|
1161 ogg_demuxer_t* ogg_d; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1162 stream_t *s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1163 demux_stream_t *ds; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1164 ogg_sync_state* sync; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1165 ogg_stream_state* os; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1166 ogg_page* page; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1167 ogg_packet pack; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1168 int np = 0, id=0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1169 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1170 s = d->stream; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1171 ogg_d = d->priv; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1172 sync = &ogg_d->sync; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1173 page = &ogg_d->page; |
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 /// Find the stream we are working on |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1176 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
|
1177 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
|
1178 return 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1179 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1180 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1181 while(1) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1182 np = 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1183 ds = NULL; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1184 /// 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
|
1185 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
|
1186 /// No packet we go the next page |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1187 if(np == 0) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1188 while(1) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1189 int pa,len; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1190 char *buf; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1191 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
|
1192 /// 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
|
1193 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
|
1194 /// Error : we skip some bytes |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1195 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
|
1196 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
|
1197 ogg_d->pos -= pa; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1198 continue; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1199 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1200 /// We need more data |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1201 buf = ogg_sync_buffer(sync,BLOCK_SIZE); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1202 len = stream_read(s,buf,BLOCK_SIZE); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1203 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
|
1204 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
|
1205 return 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1206 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1207 ogg_sync_wrote(sync,len); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1208 } /// Page loop |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1209 ogg_d->last_size = pa; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1210 /// Find the page's logical stream |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1211 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
|
1212 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
|
1213 return 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1214 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1215 /// Take the page |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1216 if(ogg_stream_pagein(os,page) == 0) |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1217 break; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1218 /// 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
|
1219 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
|
1220 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
|
1221 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1222 } 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
|
1223 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
|
1224 } /// Packet loop |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1225 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1226 /// Is the actual logical stream in use ? |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1227 if(id == d->audio->id) |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1228 ds = d->audio; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1229 else if(id == d->video->id) |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1230 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
|
1231 else if (ogg_d->subs[id].text) |
7010 | 1232 ds = d->sub; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1233 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1234 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
|
1235 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
|
1236 continue; /// Unuseful packet, get another |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1237 d->filepos = ogg_d->pos; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1238 return 1; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1239 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1240 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1241 } /// while(1) |
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 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1245 /// 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
|
1246 // 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
|
1247 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
|
1248 demuxer_t *od; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1249 ogg_demuxer_t *ogg_d; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1250 stream_t* s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1251 uint32_t hdrsizes[3]; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1252 demux_packet_t *dp; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1253 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
|
1254 int np; |
30696 | 1255 uint8_t *extradata = (uint8_t *)(sh_audio->wf + 1); |
25203
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1256 int i; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1257 unsigned char *p = NULL,*buf; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1258 int plen; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1259 |
25198 | 1260 /// Check that the cbSize is big enough for the following reads |
25205
f291ec948fca
Get rid of annoying, space-wasting sizeof(uint32_t)
reimar
parents:
25204
diff
changeset
|
1261 if(sh_audio->wf->cbSize < 22+3*4) { |
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,"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
|
1263 goto fallback; |
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 /// Get the size of the 3 header packet |
25202
57a3258ec1fc
Use a pointer variable for extradata to simplify init_avi_with_ogg
reimar
parents:
25199
diff
changeset
|
1266 extradata += 22; |
25204 | 1267 for (i = 0; i < 3; i++) { |
1268 hdrsizes[i] = AV_RL32(extradata); | |
1269 extradata += 4; | |
1270 } | |
9163 | 1271 // 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
|
1272 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1273 /// Check the size |
25205
f291ec948fca
Get rid of annoying, space-wasting sizeof(uint32_t)
reimar
parents:
25204
diff
changeset
|
1274 if(sh_audio->wf->cbSize < 22+3*4+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
|
1275 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
|
1276 goto fallback; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1277 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1278 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1279 // Build the ogg demuxer private datas |
18885 | 1280 ogg_d = calloc(1,sizeof(ogg_demuxer_t)); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1281 ogg_d->num_sub = 1; |
18885 | 1282 ogg_d->subs = malloc(sizeof(ogg_stream_t)); |
5812 | 1283 ogg_d->subs[0].vorbis = 1; |
5133
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 // Init the ogg physical stream |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1286 ogg_sync_init(&ogg_d->sync); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1287 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1288 // 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
|
1289 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
|
1290 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
|
1291 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
|
1292 free(ogg_d); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1293 goto fallback; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1294 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1295 // Add some data |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1296 plen = ds_get_packet(demuxer->audio,&p); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1297 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
|
1298 memcpy(buf,p,plen); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1299 ogg_sync_wrote(&ogg_d->sync,plen); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1300 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1301 // 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
|
1302 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
|
1303 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
|
1304 // Write the page |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1305 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
|
1306 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1307 // 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
|
1308 s = new_ds_stream(demuxer->audio); |
16175 | 1309 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
|
1310 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1311 /// Add the header packets in the ogg demuxer audio stream |
25203
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1312 for (i = 0; i < 3; i++) { |
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1313 dp = new_demux_packet(hdrsizes[i]); |
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1314 memcpy(dp->buffer,extradata,hdrsizes[i]); |
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1315 ds_add_packet(od->audio,dp); |
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1316 extradata += hdrsizes[i]; |
36b9262aaa0f
Use a loop instead of doing the same thing three times
reimar
parents:
25202
diff
changeset
|
1317 } |
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 // Finish setting up the ogg demuxer |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1320 od->priv = ogg_d; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1321 sh_audio = new_sh_audio(od,0); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1322 od->audio->id = 0; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1323 od->video->id = -2; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1324 od->audio->sh = sh_audio; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1325 sh_audio->ds = od->audio; |
14843 | 1326 sh_audio->format = FOURCC_VORBIS; |
25199
1a466dcdff1e
Create correct extradata for vorbis audio when used as avi sub-demuxer
reimar
parents:
25198
diff
changeset
|
1327 fixup_vorbis_wf(sh_audio, ogg_d); |
5133
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 /// Return the joined demuxers |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1330 return new_demuxers_demuxer(demuxer,od,demuxer); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1331 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1332 fallback: |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1333 demuxer->audio->id = -2; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1334 return demuxer; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1335 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1336 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1337 |
17636 | 1338 static void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) { |
5732 | 1339 ogg_demuxer_t* ogg_d = demuxer->priv; |
1340 ogg_sync_state* sync = &ogg_d->sync; | |
1341 ogg_page* page= &ogg_d->page; | |
1342 ogg_stream_state* oss; | |
1343 ogg_stream_t* os; | |
1344 demux_stream_t* ds; | |
1345 ogg_packet op; | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1346 float rate; |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1347 int i,sp,first,precision=1,do_seek=1; |
5732 | 1348 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
|
1349 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
|
1350 off_t pos, old_pos; |
12265 | 1351 int np; |
1352 int is_gp_valid; | |
1353 float pts; | |
1354 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
|
1355 int samplesize=1; |
19802
f1655de446c4
Support for variable fps OGM files, blessed by Moritz.
diego
parents:
19694
diff
changeset
|
1356 ogg_int64_t granulepos_orig; |
5732 | 1357 |
1358 if(demuxer->video->id >= 0) { | |
1359 ds = demuxer->video; | |
1360 rate = ogg_d->subs[ds->id].samplerate; | |
1361 } else { | |
1362 ds = demuxer->audio; | |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
1363 os = &ogg_d->subs[ds->id]; |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
1364 vi = &(os->vi); |
5732 | 1365 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
|
1366 samplesize = ((sh_audio_t*)ds->sh)->samplesize; |
5732 | 1367 } |
1368 | |
1369 os = &ogg_d->subs[ds->id]; | |
1370 oss = &os->stream; | |
1371 | |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1372 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
|
1373 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
|
1374 |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1375 //calculate the granulepos to seek to |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1376 gp = flags & SEEK_ABSOLUTE ? ogg_d->initial_granulepos : os->lastpos; |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
1377 if(flags & SEEK_FACTOR) { |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1378 if (ogg_d->duration > 0) |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1379 gp += ogg_d->duration * rel_seek_secs; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1380 else |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1381 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
|
1382 } 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
|
1383 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
|
1384 if (gp < 0) gp = 0; |
5732 | 1385 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1386 //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
|
1387 if(ogg_d->syncpoints) { |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1388 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
|
1389 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
|
1390 } |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1391 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1392 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
|
1393 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
|
1394 sp--; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1395 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
|
1396 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
|
1397 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
|
1398 } |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1399 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
|
1400 precision = 0; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1401 } else { |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
1402 pos = flags & SEEK_ABSOLUTE ? 0 : ogg_d->pos; |
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
1403 if(flags & SEEK_FACTOR) |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1404 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
|
1405 else { |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1406 if (ogg_d->duration > 0) { |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1407 pos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / (ogg_d->duration / rate); |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1408 } else if (os->lastpos > 0) { |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1409 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
|
1410 } |
5732 | 1411 } |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1412 if (pos < 0) pos = 0; |
16884
0168bf6042d6
Fix two (loosely) related bugs: massive A-V desync with -audiofile (bugzilla
reimar
parents:
16877
diff
changeset
|
1413 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
|
1414 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
|
1415 } // if(ogg_d->syncpoints) |
5732 | 1416 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1417 while(1) { |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1418 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
|
1419 stream_seek(demuxer->stream,pos+demuxer->movi_start); |
5732 | 1420 ogg_sync_reset(sync); |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1421 for(i = 0 ; i < ogg_d->num_sub ; i++) { |
5732 | 1422 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
|
1423 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
|
1424 } |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1425 ogg_d->pos = pos; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1426 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
|
1427 /* 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
|
1428 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
|
1429 os->lastpos = gp; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1430 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
|
1431 do_seek=0; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1432 } |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1433 ogg_d->pos += ogg_d->last_size; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1434 ogg_d->last_size = 0; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1435 np = ogg_sync_pageseek(sync,page); |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1436 |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1437 if(np < 0) |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1438 ogg_d->pos -= np; |
5732 | 1439 if(np <= 0) { // We need more data |
1440 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE); | |
1441 int len = stream_read(demuxer->stream,buf,BLOCK_SIZE); | |
1442 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
|
1443 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
|
1444 return; |
5732 | 1445 } |
1446 ogg_sync_wrote(sync,len); | |
1447 continue; | |
1448 } | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1449 ogg_d->last_size = np; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1450 if(ogg_page_serialno(page) != oss->serialno) |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1451 continue; |
5732 | 1452 |
1453 if(ogg_stream_pagein(oss,page) != 0) | |
1454 continue; | |
1455 | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1456 while(1) { |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1457 np = ogg_stream_packetout(oss,&op); |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1458 if(np < 0) |
5732 | 1459 continue; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1460 else if(np == 0) |
5732 | 1461 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
|
1462 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
|
1463 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
|
1464 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
|
1465 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
|
1466 break; |
f8e53f8cb8b2
bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents:
8618
diff
changeset
|
1467 } |
12265 | 1468 is_gp_valid = (op.granulepos >= 0); |
19802
f1655de446c4
Support for variable fps OGM files, blessed by Moritz.
diego
parents:
19694
diff
changeset
|
1469 granulepos_orig=op.granulepos; |
27322
d9301dca9712
Get rid of horrible code that relies on codec-set context variable,
reimar
parents:
26084
diff
changeset
|
1470 demux_ogg_read_packet(os,&op,&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
|
1471 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
|
1472 precision--; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1473 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
|
1474 //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
|
1475 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
|
1476 if (pos < 0) pos = 0; |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1477 if (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
|
1478 do_seek=1; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1479 break; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1480 } |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1481 } |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1482 } |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1483 if (is_gp_valid && pos > 0 && old_gp > gp |
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1484 && 2 * (old_gp - op.granulepos) < old_gp - gp) { |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1485 /* 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
|
1486 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
|
1487 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
|
1488 if (pos < 0) pos = 0; |
25493
fabaf34bd545
Get rid of some of the more excessive () and casts.
reimar
parents:
25206
diff
changeset
|
1489 if (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
|
1490 do_seek=1; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1491 break; |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1492 } |
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
1493 } |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
1494 if(!precision && (is_keyframe || os->vorbis || os->speex) ) { |
21828
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
1495 if (sub_clear_text(&ogg_sub, MP_NOPTS_VALUE)) { |
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
1496 vo_sub = &ogg_sub; |
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
1497 vo_osd_changed(OSDTYPE_SUBTITLE); |
a165910dcaf7
Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents:
21812
diff
changeset
|
1498 } |
19802
f1655de446c4
Support for variable fps OGM files, blessed by Moritz.
diego
parents:
19694
diff
changeset
|
1499 op.granulepos=granulepos_orig; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
1500 demux_ogg_add_packet(ds,os,ds->id,&op); |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1501 return; |
5732 | 1502 } |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1503 } |
5732 | 1504 } |
1505 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1506 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n"); |
5732 | 1507 |
1508 } | |
1509 | |
16175 | 1510 static void demux_close_ogg(demuxer_t* demuxer) { |
5812 | 1511 ogg_demuxer_t* ogg_d = demuxer->priv; |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
1512 ogg_stream_t* os = NULL; |
13502 | 1513 int i; |
5812 | 1514 |
1515 if(!ogg_d) | |
1516 return; | |
1517 | |
27393 | 1518 #ifdef CONFIG_ICONV |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1519 subcp_close(); |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1520 #endif |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1521 |
13641 | 1522 ogg_sync_clear(&ogg_d->sync); |
5812 | 1523 if(ogg_d->subs) |
13641 | 1524 { |
1525 for (i = 0; i < ogg_d->num_sub; i++) | |
21811 | 1526 { |
1527 os = &ogg_d->subs[i]; | |
21812 | 1528 ogg_stream_clear(&os->stream); |
25962 | 1529 if(os->vi_initialized) |
21811 | 1530 vorbis_info_clear(&os->vi); |
1531 } | |
5812 | 1532 free(ogg_d->subs); |
13641 | 1533 } |
5812 | 1534 if(ogg_d->syncpoints) |
1535 free(ogg_d->syncpoints); | |
13127
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
1536 if (ogg_d->text_ids) |
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
1537 free(ogg_d->text_ids); |
13502 | 1538 if (ogg_d->text_langs) { |
1539 for (i = 0; i < ogg_d->n_text; i++) | |
1540 if (ogg_d->text_langs[i]) free(ogg_d->text_langs[i]); | |
1541 free(ogg_d->text_langs); | |
1542 } | |
5812 | 1543 free(ogg_d); |
1544 } | |
1545 | |
16175 | 1546 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
|
1547 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
|
1548 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
|
1549 float rate; |
11577 | 1550 |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1551 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
|
1552 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
|
1553 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
|
1554 } else { |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1555 os = &ogg_d->subs[demuxer->audio->id]; |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
1556 rate = os->vi.rate; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1557 } |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1558 |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1559 |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1560 switch(cmd) { |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1561 case DEMUXER_CTRL_GET_TIME_LENGTH: |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1562 if (ogg_d->duration<=0) return DEMUXER_CTRL_DONTKNOW; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1563 *(double *)arg=(double)(ogg_d->duration) / rate; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1564 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
|
1565 |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1566 case DEMUXER_CTRL_GET_PERCENT_POS: |
29734
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1567 if (ogg_d->duration<=0) return DEMUXER_CTRL_DONTKNOW; |
54145563612e
Find and take into account stream start time for ogg files.
reimar
parents:
29288
diff
changeset
|
1568 *(int *)arg=((os->lastpos - ogg_d->initial_granulepos)*100) / ogg_d->duration; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1569 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
|
1570 |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1571 default: |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1572 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
|
1573 } |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1574 } |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1575 |
16175 | 1576 |
1577 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25495
diff
changeset
|
1578 const demuxer_desc_t demuxer_desc_ogg = { |
16175 | 1579 "Ogg demuxer", |
1580 "ogg", | |
1581 "Ogg", | |
1582 "?", | |
1583 "", | |
1584 DEMUXER_TYPE_OGG, | |
1585 1, // safe autodetect | |
1586 demux_ogg_open, | |
1587 demux_ogg_fill_buffer, | |
1588 NULL, | |
1589 demux_close_ogg, | |
1590 demux_ogg_seek, | |
1591 demux_ogg_control | |
1592 }; |