Mercurial > mplayer.hg
annotate libmpdemux/demux_ogg.c @ 31081:09b714720a80
Fix compilation with old libschroedinger-dev installed.
author | cehoyos |
---|---|
date | Thu, 06 May 2010 10:10:34 +0000 |
parents | 21516121610a |
children | cd81fce1f010 |
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 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
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; |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
65 theora_info inf; |
10092 | 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 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
71 typedef struct stream_header_video { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
72 ogg_int32_t width; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
73 ogg_int32_t height; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
74 } stream_header_video; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
75 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
76 typedef struct stream_header_audio { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
77 ogg_int16_t channels; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
78 ogg_int16_t blockalign; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
79 ogg_int32_t avgbytespersec; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
80 } stream_header_audio; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
81 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
82 typedef struct __attribute__((__packed__)) stream_header { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
83 char streamtype[8]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
84 char subtype[4]; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
85 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
86 ogg_int32_t size; // size of the structure |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
87 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
88 ogg_int64_t time_unit; // in reference time |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
89 ogg_int64_t samples_per_unit; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
90 ogg_int32_t default_len; // in media time |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
91 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
92 ogg_int32_t buffersize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
93 ogg_int16_t bits_per_sample; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
94 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
95 ogg_int16_t padding; |
13881 | 96 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
97 union { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
98 // Video specific |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
99 stream_header_video video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
100 // Audio specific |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
101 stream_header_audio audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
102 } sh; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
103 } stream_header; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
104 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
105 /// Our private datas |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
106 |
5732 | 107 typedef struct ogg_syncpoint { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
108 int64_t granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
109 off_t page_pos; |
5732 | 110 } ogg_syncpoint_t; |
111 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
112 /// A logical stream |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
113 typedef struct ogg_stream { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
114 /// Timestamping stuff |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
115 float samplerate; /// granulpos 2 time |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
116 int64_t lastpos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
117 int32_t lastsize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
118 int keyframe_frequency_force; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
119 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
120 // Logical stream state |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
121 ogg_stream_state stream; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
122 int hdr_packets; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
123 int vorbis; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
124 int speex; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
125 int theora; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
126 int flac; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
127 int text; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
128 int id; |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
129 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
130 vorbis_info vi; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
131 int vi_initialized; |
21519
5924b2b9f5de
made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents:
21509
diff
changeset
|
132 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
133 void *ogg_d; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
134 } ogg_stream_t; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
135 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
136 typedef struct ogg_demuxer { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
137 /// Physical stream state |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
138 ogg_sync_state sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
139 /// Current page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
140 ogg_page page; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
141 /// Logical streams |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
142 ogg_stream_t *subs; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
143 int num_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
144 ogg_syncpoint_t *syncpoints; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
145 int num_syncpoint; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
146 off_t pos, last_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
147 int64_t initial_granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
148 int64_t final_granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
149 int64_t duration; |
13127
957fc21fc10a
Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents:
13089
diff
changeset
|
150 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
151 /* Used for subtitle switching. */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
152 int n_text; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
153 int *text_ids; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
154 char **text_langs; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
155 } ogg_demuxer_t; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
156 |
5732 | 157 #define NUM_VORBIS_HDR_PACKETS 3 |
158 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
159 /// Some defines from OggDS |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
160 #define PACKET_TYPE_HEADER 0x01 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
161 #define PACKET_TYPE_BITS 0x07 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
162 #define PACKET_LEN_BITS01 0xc0 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
163 #define PACKET_LEN_BITS2 0x02 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
164 #define PACKET_IS_SYNCPOINT 0x08 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
165 |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
166 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
|
167 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
|
168 |
7010 | 169 //-------- subtitle support - should be moved to decoder layer, and queue |
170 // - subtitles up in demuxer buffer... | |
171 | |
17012 | 172 #include "subreader.h" |
173 #include "libvo/sub.h" | |
7010 | 174 #define OGG_SUB_MAX_LINE 128 |
175 | |
176 static subtitle ogg_sub; | |
177 //FILE* subout; | |
178 | |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29734
diff
changeset
|
179 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
|
180 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
181 int lcv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
182 char *packet = pack->packet; |
7010 | 183 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
184 if (pack->bytes < 4) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
185 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
186 mp_msg(MSGT_DEMUX, MSGL_DBG2, "\ndemux_ogg_add_sub %02X %02X %02X '%s'\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
187 (unsigned char)packet[0], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
188 (unsigned char)packet[1], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
189 (unsigned char)packet[2], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
190 &packet[3]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
191 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
192 if (((unsigned char)packet[0]) == 0x88) { // some subtitle text |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
193 // Find data start |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
194 double endpts = MP_NOPTS_VALUE; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
195 int32_t duration = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
196 int16_t hdrlen = (*packet & PACKET_LEN_BITS01) >> 6, i; |
7010 | 197 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
198 hdrlen |= (*packet & PACKET_LEN_BITS2) << 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
199 lcv = 1 + hdrlen; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
200 if (pack->bytes < lcv) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
201 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
202 for (i = hdrlen; i > 0; i--) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
203 duration <<= 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
204 duration |= (unsigned char)packet[i]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
205 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
206 if (hdrlen > 0 && duration > 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
207 float pts; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
208 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
209 if (pack->granulepos == -1) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
210 pack->granulepos = os->lastpos + os->lastsize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
211 pts = (float)pack->granulepos / (float)os->samplerate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
212 endpts = 1.0 + pts + (float)duration / 1000.0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
213 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
214 sub_clear_text(&ogg_sub, MP_NOPTS_VALUE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
215 sub_add_text(&ogg_sub, &packet[lcv], pack->bytes - lcv, endpts); |
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
|
216 } |
7010 | 217 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
218 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Ogg sub lines: %d first: '%s'\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
219 ogg_sub.lines, ogg_sub.text[0]); |
27393 | 220 #ifdef CONFIG_ICONV |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
221 subcp_recode(&ogg_sub); |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
222 #endif |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
223 vo_sub = &ogg_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
224 vo_osd_changed(OSDTYPE_SUBTITLE); |
7010 | 225 } |
226 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
227 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
228 // 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
|
229 // fill os if non NULL and return the stream id |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
230 static int demux_ogg_get_page_stream(ogg_demuxer_t *ogg_d, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
231 ogg_stream_state **os) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
232 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
233 int id, s_no; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
234 ogg_page *page = &ogg_d->page; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
235 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
236 s_no = ogg_page_serialno(page); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
237 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
238 for (id = 0; id < ogg_d->num_sub; id++) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
239 if (s_no == ogg_d->subs[id].stream.serialno) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
240 break; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
241 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
242 if (id == ogg_d->num_sub) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
243 // If we have only one vorbis stream allow the stream id to change |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
244 // it's normal on radio stream (each song have an different id). |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
245 // But we (or the codec?) should check that the samplerate, etc |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
246 // doesn't change (for radio stream it's ok) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
247 if (ogg_d->num_sub == 1 && ogg_d->subs[0].vorbis) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
248 ogg_stream_reset(&ogg_d->subs[0].stream); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
249 ogg_stream_init(&ogg_d->subs[0].stream, s_no); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
250 id = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
251 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
252 return -1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
253 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
254 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
255 if (os) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
256 *os = &ogg_d->subs[id].stream; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
257 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
258 return id; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
259 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
260 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
261 static unsigned char *demux_ogg_read_packet(ogg_stream_t *os, ogg_packet *pack, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
262 float *pts, int *flags, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
263 int samplesize) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
264 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
265 unsigned char *data = pack->packet; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
266 int size = pack->bytes; |
5732 | 267 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
268 *pts = MP_NOPTS_VALUE; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
269 *flags = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
270 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
271 if (os->vorbis) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
272 if (*pack->packet & PACKET_TYPE_HEADER) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
273 os->hdr_packets++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
274 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
275 vorbis_info *vi; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
276 int32_t blocksize = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
277 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
278 // When we dump the audio, there is no vi, but we don't care of timestamp in this case |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
279 vi = os->vi_initialized ? &os->vi : NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
280 if (vi) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
281 blocksize = vorbis_packet_blocksize(vi, pack) / samplesize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
282 // Calculate the timestamp if the packet don't have any |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
283 if (pack->granulepos == -1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
284 pack->granulepos = os->lastpos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
285 if (os->lastsize > 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
286 pack->granulepos += os->lastsize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
287 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
288 *flags = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
289 if (vi) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
290 *pts = pack->granulepos / (float)vi->rate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
291 os->lastsize = blocksize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
292 os->lastpos = pack->granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
293 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
294 } else if (os->speex) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
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 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
297 } else if (os->theora) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
298 /* we pass complete packets to theora, mustn't strip the header! */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
299 os->lastsize = 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
300 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
301 /* header packets begin on 1-bit: thus check (*data&0x80). We don't |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
302 have theora_state st, until all header packets were passed to the |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
303 decoder. */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
304 if (!size || !(*data&0x80)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
305 int keyframe_granule_shift = _ilog(os->keyframe_frequency_force - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
306 int64_t iframemask = (1 << keyframe_granule_shift) - 1; |
10092 | 307 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
308 if (pack->granulepos >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
309 os->lastpos = pack->granulepos >> keyframe_granule_shift; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
310 os->lastpos += pack->granulepos & iframemask; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
311 *flags = (pack->granulepos & iframemask) == 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
312 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
313 os->lastpos++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
314 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
315 pack->granulepos = os->lastpos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
316 *pts = (double)os->lastpos / (double)os->samplerate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
317 } |
27363
40057010b1fa
Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents:
27359
diff
changeset
|
318 #endif /* CONFIG_OGGTHEORA */ |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
319 } else if (os->flac) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
320 /* we pass complete packets to flac, mustn't strip the header! */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
321 if (os->flac == 2 && pack->packet[0] != 0xff) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
322 return NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
323 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
324 if (*pack->packet & PACKET_TYPE_HEADER) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
325 os->hdr_packets++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
326 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
327 // Find data start |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
328 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01) >> 6; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
329 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
330 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) << 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
331 data = pack->packet + 1 + hdrlen; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
332 // Calculate the timestamp |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
333 if (pack->granulepos == -1) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
334 pack->granulepos = os->lastpos + (os->lastsize ? os->lastsize : 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
335 // If we already have a timestamp it can be a syncpoint |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
336 if (*pack->packet & PACKET_IS_SYNCPOINT) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
337 *flags = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
338 *pts = pack->granulepos / os->samplerate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
339 // Save the packet length and timestamp |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
340 os->lastsize = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
341 while (hdrlen) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
342 os->lastsize <<= 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
343 os->lastsize |= pack->packet[hdrlen]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
344 hdrlen--; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
345 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
346 os->lastpos = pack->granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
347 } |
5732 | 348 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
349 return data; |
5732 | 350 } |
351 | |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
352 // check if clang has substring from comma separated langlist |
25495 | 353 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
|
354 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
355 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
|
356 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
357 if (!langlist || !*langlist) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
358 return 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
359 while ((c = strchr(langlist, ','))) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
360 if (!strncasecmp(clang, langlist, c - langlist)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
361 return 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
362 langlist = &c[1]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
363 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
364 if (!strncasecmp(clang, langlist, strlen(langlist))) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
365 return 1; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
366 return 0; |
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 |
30582
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
369 /** \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
|
370 |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
371 \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
|
372 \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
|
373 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
|
374 |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
375 \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
|
376 track. |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
377 */ |
30583
c8b12c3fc5a5
Mark demux_ogg_sub_id() as static; it is not used outside of the file.
diego
parents:
30582
diff
changeset
|
378 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
|
379 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
380 ogg_demuxer_t *ogg_d = demuxer->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
381 return (index < 0) ? index : (index >= ogg_d->n_text) ? -1 : ogg_d->text_ids[index]; |
30582
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
382 } |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
383 |
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
384 /** \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
|
385 * \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
|
386 * \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
|
387 */ |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
388 static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
389 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
390 ogg_demuxer_t *ogg_d = demuxer->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
391 int i; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
392 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
393 for (i = 0; i < ogg_d->n_text; i++) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
394 if (ogg_d->text_ids[i] == id) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
395 return i; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
396 return -1; |
30582
85aaf16401b5
Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents:
30580
diff
changeset
|
397 } |
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
|
398 |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
399 /// Try to print out comments and also check for LANGUAGE= tag |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
400 static void demux_ogg_check_comments(demuxer_t *d, ogg_stream_t *os, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
401 int id, vorbis_comment *vc) |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
402 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
403 const char *hdr, *val; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
404 char **cmt = vc->user_comments; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
405 int index, i; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
406 ogg_demuxer_t *ogg_d = d->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
407 static const struct table { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
408 const char *ogg; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
409 const char *mp; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
410 } table[] = { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
411 { "ENCODED_USING", "Software" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
412 { "ENCODER_URL", "Encoder URL" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
413 { "TITLE", "Title" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
414 { "ARTIST", "Artist" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
415 { "COMMENT", "Comments" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
416 { "DATE", "Creation Date" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
417 { "GENRE", "Genre" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
418 { "ALBUM", "Album" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
419 { "TRACKNUMBER", "Track" }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
420 { NULL, NULL }, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
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 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
423 while (*cmt) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
424 hdr = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
425 if (!strncasecmp(*cmt, "LANGUAGE=", 9)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
426 val = *cmt + 9; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
427 if (ogg_d->subs[id].text) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
428 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
429 ogg_d->subs[id].id, val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
430 else if (id != d->video->id) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
431 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
432 ogg_d->subs[id].id, val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
433 if (ogg_d->subs[id].text) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
434 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
435 "[Ogg] Language for -sid %d is '-slang \"%s\"'\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
436 ogg_d->subs[id].id, val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
437 // copy this language name into the array |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
438 index = demux_ogg_sub_reverse_id(d, id); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
439 if (index >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
440 sh_sub_t *sh; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
441 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
442 // in case of malicious files with more than one lang per track: |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
443 if (ogg_d->text_langs[index]) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
444 free(ogg_d->text_langs[index]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
445 ogg_d->text_langs[index] = strdup(val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
446 sh = d->s_streams[index]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
447 if (sh && sh->lang) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
448 free(sh->lang); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
449 if (sh) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
450 sh->lang = strdup(val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
451 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
452 // check for -slang if subs are uninitialized yet |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
453 if (os->text && d->sub->id < 0 && demux_ogg_check_lang(val, dvdsub_lang)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
454 d->sub->id = index; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
455 dvdsub_id = index; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
456 mp_msg(MSGT_DEMUX, MSGL_V, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
457 "Ogg demuxer: Displaying subtitle stream id %d which matched -slang %s\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
458 id, val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
459 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
460 else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
461 hdr = "Language"; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
462 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
463 else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
464 for (i = 0; table[i].ogg; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
465 if (!strncasecmp(*cmt, table[i].ogg, strlen(table[i].ogg)) && |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
466 (*cmt)[strlen(table[i].ogg)] == '=') { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
467 hdr = table[i].mp; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
468 val = *cmt + strlen(table[i].ogg) + 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
469 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
470 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
471 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
472 if (hdr) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
473 demux_info_add(d, hdr, val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
474 mp_dbg(MSGT_DEMUX, MSGL_DBG2, " %s: %s\n", hdr, val); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
475 cmt++; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
476 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
477 } |
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
478 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
479 /// 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
|
480 // return 1 if the packet was added, 0 otherwise |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
481 static int demux_ogg_add_packet(demux_stream_t *ds, ogg_stream_t *os, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
482 int id, ogg_packet *pack) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
483 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
484 demuxer_t *d = ds->demuxer; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
485 demux_packet_t *dp; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
486 unsigned char *data; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
487 float pts = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
488 int flags = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
489 int samplesize = 1; |
12104
fdce1dd97638
Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents:
11898
diff
changeset
|
490 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
491 // If packet is an comment header then we try to get comments at first |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
492 if (pack->bytes >= 7 && !memcmp(pack->packet, "\003vorbis", 7)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
493 vorbis_info vi; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
494 vorbis_comment vc; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
495 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
496 vorbis_info_init(&vi); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
497 vorbis_comment_init(&vc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
498 vi.rate = 1L; // it's checked by vorbis_synthesis_headerin() |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
499 if (vorbis_synthesis_headerin(&vi, &vc, pack) == 0) // if no errors |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
500 demux_ogg_check_comments(d, os, id, &vc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
501 vorbis_comment_clear(&vc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
502 vorbis_info_clear(&vi); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
503 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
504 if (os->text) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
505 if (id == demux_ogg_sub_id(d, d->sub->id)) // don't want to add subtitles to the demuxer for now |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
506 demux_ogg_add_sub(os, pack); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
507 return 0; |
16915
6b1d1e4adaea
Speex support. Seeking and pts generation does not work.
reimar
parents:
16884
diff
changeset
|
508 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
509 if (os->speex) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
510 // discard first two packets, they contain the header and comment |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
511 if (os->hdr_packets < 2) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
512 os->hdr_packets++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
513 return 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
514 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
515 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
516 // If packet is an header we jump it except for vorbis and theora |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
517 // (PACKET_TYPE_HEADER bit doesn't even exist for theora ?!) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
518 // We jump nothing for FLAC. Ain't this great? Packet contents have to be |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
519 // handled differently for each and every stream type. The joy! The joy! |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
520 if (!os->flac && (*pack->packet & PACKET_TYPE_HEADER) && |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
521 (ds != d->audio || ((sh_audio_t*)ds->sh)->format != FOURCC_VORBIS || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) && |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
522 (ds != d->video || (((sh_video_t*)ds->sh)->format != FOURCC_THEORA))) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
523 return 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
524 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
525 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
526 // For vorbis packet the packet is the data, for other codec we must jump |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
527 // the header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
528 if (ds == d->audio && ((sh_audio_t*)ds->sh)->format == FOURCC_VORBIS) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
529 samplesize = ((sh_audio_t *)ds->sh)->samplesize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
530 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
531 data = demux_ogg_read_packet(os, pack, &pts, &flags, samplesize); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
532 if (!data) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
533 return 0; |
5732 | 534 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
535 /// Clear subtitles if necessary (for broken files) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
536 if (sub_clear_text(&ogg_sub, pts)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
537 vo_sub = &ogg_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
538 vo_osd_changed(OSDTYPE_SUBTITLE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
539 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
540 /// Send the packet |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
541 dp = new_demux_packet(pack->bytes - (data - pack->packet)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
542 memcpy(dp->buffer, data, pack->bytes - (data - pack->packet)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
543 dp->pts = pts; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
544 dp->flags = flags; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
545 ds_add_packet(ds, dp); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
546 mp_msg(MSGT_DEMUX, MSGL_DBG2, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
547 "New dp: %p ds=%p pts=%5.3f len=%d flag=%d \n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
548 dp, ds, pts, dp->len, flags); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
549 return 1; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
550 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
551 |
12263
26be0fd618b5
Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents:
12135
diff
changeset
|
552 /// 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
|
553 /// 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
|
554 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
|
555 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
556 ogg_demuxer_t *ogg_d = demuxer->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
557 stream_t *s = demuxer->stream; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
558 ogg_sync_state *sync = &ogg_d->sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
559 ogg_page *page = &ogg_d->page; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
560 ogg_stream_state *oss; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
561 ogg_stream_t *os; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
562 ogg_packet op; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
563 int np, sid, p, samplesize = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
564 off_t pos, last_pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
565 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
566 pos = last_pos = demuxer->movi_start; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
567 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
568 // Reset the stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
569 stream_seek(s, demuxer->movi_start); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
570 ogg_sync_reset(sync); |
5732 | 571 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
572 // Get the serial number of the stream we use |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
573 if (demuxer->video->id >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
574 sid = demuxer->video->id; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
575 } else if (demuxer->audio->id >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
576 sid = demuxer->audio->id; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
577 if (((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
578 samplesize = ((sh_audio_t*)demuxer->audio->sh)->samplesize; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
579 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
580 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
581 os = &ogg_d->subs[sid]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
582 oss = &os->stream; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
583 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
584 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
585 np = ogg_sync_pageseek(sync, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
586 if (np < 0) { // We had to skip some bytes |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
587 if (index_mode == 2) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
588 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
589 "Bad page sync while building syncpoints table (%d)\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
590 -np); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
591 pos += -np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
592 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
593 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
594 if (np <= 0) { // We need more data |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
595 char *buf = ogg_sync_buffer(sync, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
596 int len = stream_read(s, buf, BLOCK_SIZE); |
5732 | 597 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
598 if (len == 0 && s->eof) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
599 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
600 ogg_sync_wrote(sync, len); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
601 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
602 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
603 // The page is ready |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
604 //ogg_sync_pageout(sync, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
605 if (ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
606 pos += np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
607 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
608 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
609 if (ogg_stream_pagein(oss, page) != 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
610 mp_msg(MSGT_DEMUX, MSGL_ERR, "Pagein error ????\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
611 pos += np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
612 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
613 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
614 p = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
615 while (ogg_stream_packetout(oss, &op) == 1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
616 float pts; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
617 int flags; |
5732 | 618 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
619 demux_ogg_read_packet(os, &op, &pts, &flags, samplesize); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
620 if (op.granulepos >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
621 ogg_d->final_granulepos = op.granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
622 if (ogg_d->initial_granulepos == MP_NOPTS_VALUE && (flags & 1)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
623 ogg_d->initial_granulepos = op.granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
624 if (index_mode != 2 && ogg_d->pos < demuxer->movi_end - 2 * 270000) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
625 //the 270000 are just a wild guess |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
626 stream_seek(s, FFMAX(ogg_d->pos, demuxer->movi_end - 270000)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
627 ogg_sync_reset(sync); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
628 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
629 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
630 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
631 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
632 if (index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
633 if (ogg_d->num_syncpoint > SIZE_MAX / sizeof(ogg_syncpoint_t) - 1) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
634 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
635 ogg_d->syncpoints = realloc_struct(ogg_d->syncpoints, (ogg_d->num_syncpoint + 1), sizeof(ogg_syncpoint_t)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
636 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
637 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
638 ogg_d->num_syncpoint++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
639 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
640 p++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
641 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
642 if (p > 1 || (p == 1 && !ogg_page_continued(page))) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
643 last_pos = pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
644 pos += np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
645 if (index_mode == 2) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
646 mp_msg(MSGT_DEMUX, MSGL_INFO, "Building syncpoint table %d%%\r", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
647 (int)(pos * 100 / s->end_pos)); |
5732 | 648 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
649 |
31000
21516121610a
Merge two redundant if checks, patch by ubitux, ubitux gmail com.
diego
parents:
30999
diff
changeset
|
650 if (index_mode == 2) { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
651 mp_msg(MSGT_DEMUX, MSGL_INFO, "\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
652 mp_msg(MSGT_DEMUX, MSGL_V, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
653 "Ogg syncpoints table builed: %d syncpoints\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
654 ogg_d->num_syncpoint); |
31000
21516121610a
Merge two redundant if checks, patch by ubitux, ubitux gmail com.
diego
parents:
30999
diff
changeset
|
655 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
656 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
657 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg stream length (granulepos): %"PRId64"\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
658 ogg_d->final_granulepos); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
659 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
660 stream_reset(s); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
661 stream_seek(s, demuxer->movi_start); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
662 ogg_sync_reset(sync); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
663 for (np = 0; np < ogg_d->num_sub; np++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
664 ogg_stream_reset(&ogg_d->subs[np].stream); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
665 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0; |
5732 | 666 } |
667 | |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
668 // Get the first page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
669 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
670 np = ogg_sync_pageout(sync, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
671 if (np <= 0) { // We need more data |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
672 char *buf = ogg_sync_buffer(sync, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
673 int len = stream_read(s, buf, BLOCK_SIZE); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
674 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
675 if (len == 0 && s->eof) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
676 mp_msg(MSGT_DEMUX, MSGL_ERR, "EOF while trying to get the first page !!!!\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
677 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
678 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
679 ogg_sync_wrote(sync, len); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
680 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
681 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
682 demux_ogg_get_page_stream(ogg_d, &oss); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
683 ogg_stream_pagein(oss, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
684 break; |
5732 | 685 } |
686 } | |
687 | |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
688 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
|
689 { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
690 int i, offset; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
691 int ris, init_error = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
692 ogg_packet op[3]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
693 unsigned char *buf[3]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
694 unsigned char *ptr; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
695 unsigned int len; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
696 ogg_stream_t *os = &od->subs[sh->ds->id]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
697 vorbis_comment vc; |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
698 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
699 vorbis_info_init(&os->vi); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
700 vorbis_comment_init(&vc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
701 for (i = 0; i < 3; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
702 op[i].bytes = ds_get_packet(sh->ds, &(op[i].packet)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
703 mp_msg(MSGT_DEMUX, MSGL_V, "fixup_vorbis_wf: i=%d, size=%ld\n", i, op[i].bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
704 if (op[i].bytes < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
705 mp_msg(MSGT_DEMUX, MSGL_ERR, "Ogg demuxer error!, fixup_vorbis_wf: bad packet n. %d\n", i); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
706 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
707 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
708 buf[i] = malloc(op[i].bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
709 if (!buf[i]) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
710 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
711 memcpy(buf[i], op[i].packet, op[i].bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
712 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
713 op[i].b_o_s = (i == 0); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
714 ris = vorbis_synthesis_headerin(&os->vi, &vc, &op[i]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
715 if (ris < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
716 init_error = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
717 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DEMUX_OGG: header n. %d broken! len=%ld, code: %d\n", i, op[i].bytes, ris); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
718 } |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
719 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
720 vorbis_comment_clear(&vc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
721 if (!init_error) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
722 os->vi_initialized = 1; |
18430
9300d63e235c
unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents:
18237
diff
changeset
|
723 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
724 len = op[0].bytes + op[1].bytes + op[2].bytes; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
725 sh->wf = calloc(1, sizeof(WAVEFORMATEX) + len + len / 255 + 64); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
726 ptr = (unsigned char*)(sh->wf + 1); |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
727 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
728 ptr[0] = 2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
729 offset = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
730 offset += store_ughvlc(&ptr[offset], op[0].bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
731 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, offset after 1st len = %u\n", offset); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
732 offset += store_ughvlc(&ptr[offset], op[1].bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
733 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, offset after 2nd len = %u\n", offset); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
734 for (i = 0; i < 3; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
735 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, i=%d, bytes: %ld, offset: %u\n", i, op[i].bytes, offset); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
736 memcpy(&ptr[offset], buf[i], op[i].bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
737 offset += op[i].bytes; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
738 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
739 sh->wf->cbSize = offset; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
740 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, extradata size: %d\n", sh->wf->cbSize); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
741 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
|
742 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
743 if (op[0].bytes >= 29) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
744 unsigned int br; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
745 int nombr, minbr, maxbr; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
746 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
747 ptr = buf[0]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
748 sh->channels = ptr[11]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
749 sh->samplerate = sh->wf->nSamplesPerSec = AV_RL32(&ptr[12]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
750 maxbr = AV_RL32(&ptr[16]); //max |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
751 nombr = AV_RL32(&ptr[20]); //nominal |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
752 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
|
753 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
754 if (maxbr == -1) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
755 maxbr = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
756 if (nombr == -1) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
757 nombr = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
758 if (minbr == -1) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
759 minbr = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
760 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
761 br = maxbr / 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
762 if (!br) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
763 br = nombr / 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
764 if (!br) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
765 br = minbr / 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
766 sh->wf->nAvgBytesPerSec = br; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
767 sh->wf->wBitsPerSample = 16; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
768 sh->samplesize = (sh->wf->wBitsPerSample + 7) / 8; |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
769 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
770 mp_msg(MSGT_DEMUX, MSGL_V, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
771 "demux_ogg, vorbis stream features are: channels: %d, srate: %d, bitrate: %d, max: %u, nominal: %u, min: %u\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
772 sh->channels, sh->samplerate, sh->wf->nAvgBytesPerSec, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
773 maxbr, nombr, minbr); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
774 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
775 free(buf[2]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
776 free(buf[1]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
777 free(buf[0]); |
15420
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
778 } |
f3cf481bbcda
vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents:
15321
diff
changeset
|
779 |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
780 /// Open an ogg physical stream |
16175 | 781 // Not static because it's used also in demuxer_avi.c |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
782 int demux_ogg_open(demuxer_t *demuxer) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
783 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
784 ogg_demuxer_t *ogg_d; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
785 stream_t *s; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
786 char *buf; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
787 int np, s_no, n_audio = 0, n_video = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
788 int audio_id = -1, video_id = -1, text_id = -1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
789 ogg_sync_state *sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
790 ogg_page *page; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
791 ogg_packet pack; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
792 sh_audio_t *sh_a; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
793 sh_video_t *sh_v; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
794 |
27393 | 795 #ifdef CONFIG_ICONV |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
796 subcp_open(NULL); |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
797 #endif |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
798 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
799 s = demuxer->stream; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
800 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
801 demuxer->priv = ogg_d = calloc(1, sizeof(*ogg_d)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
802 sync = &ogg_d->sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
803 page = &ogg_d->page; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
804 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
805 ogg_sync_init(sync); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
806 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
807 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
808 /// Try to get a page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
809 ogg_d->pos += ogg_d->last_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
810 np = ogg_sync_pageseek(sync, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
811 /// Error |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
812 if (np < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
813 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Ogg demuxer : Bad page sync\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
814 goto err_out; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
815 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
816 /// Need some more data |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
817 if (np == 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
818 int len; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
819 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
820 buf = ogg_sync_buffer(sync, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
821 len = stream_read(s, buf, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
822 if (len == 0 && s->eof) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
823 goto err_out; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
824 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
825 ogg_sync_wrote(sync, len); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
826 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
827 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
828 ogg_d->last_size = np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
829 // We got one page now |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
830 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
831 if (!ogg_page_bos(page)) { // It's not a beginning page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
832 // Header parsing end here, we need to get the page otherwise it will be lost |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
833 int id = demux_ogg_get_page_stream(ogg_d, NULL); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
834 if (id >= 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
835 ogg_stream_pagein(&ogg_d->subs[id].stream, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
836 else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
837 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
838 "Ogg : Warning found none bos page from unknown stream %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
839 ogg_page_serialno(page)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
840 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
841 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
842 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
843 /// Init the data structure needed for a logical stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
844 ogg_d->subs = realloc_struct(ogg_d->subs, ogg_d->num_sub+1, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
845 sizeof(ogg_stream_t)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
846 memset(&ogg_d->subs[ogg_d->num_sub], 0, sizeof(ogg_stream_t)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
847 /// Get the stream serial number |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
848 s_no = ogg_page_serialno(page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
849 ogg_stream_init(&ogg_d->subs[ogg_d->num_sub].stream, s_no); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
850 mp_msg(MSGT_DEMUX, MSGL_DBG2, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
851 "Ogg : Found a stream with serial=%d\n", s_no); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
852 // Take the first page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
853 ogg_stream_pagein(&ogg_d->subs[ogg_d->num_sub].stream, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
854 // Get first packet of the page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
855 ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream, &pack); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
856 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
857 // Reset our vars |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
858 sh_a = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
859 sh_v = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
860 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
861 ogg_d->subs[ogg_d->num_sub].ogg_d = ogg_d; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
862 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
863 // Check for Vorbis |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
864 if (pack.bytes >= 7 && !strncmp(&pack.packet[1], "vorbis", 6)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
865 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
866 sh_a->format = FOURCC_VORBIS; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
867 ogg_d->subs[ogg_d->num_sub].vorbis = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
868 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
869 n_audio++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
870 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
871 "[Ogg] stream %d: audio (Vorbis), -aid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
872 ogg_d->num_sub, n_audio - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
873 } else if (pack.bytes >= 80 && !strncmp(pack.packet, "Speex", 5)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
874 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
875 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + pack.bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
876 sh_a->format = FOURCC_SPEEX; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
877 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL32(&pack.packet[36]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
878 sh_a->channels = sh_a->wf->nChannels = AV_RL32(&pack.packet[48]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
879 sh_a->wf->wFormatTag = sh_a->format; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
880 sh_a->wf->nAvgBytesPerSec = AV_RL32(&pack.packet[52]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
881 sh_a->wf->nBlockAlign = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
882 sh_a->wf->wBitsPerSample = 16; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
883 sh_a->samplesize = 2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
884 sh_a->wf->cbSize = pack.bytes; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
885 memcpy(&sh_a->wf[1], pack.packet, pack.bytes); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
886 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
887 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
888 ogg_d->subs[ogg_d->num_sub].speex = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
889 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
890 n_audio++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
891 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
892 "[Ogg] stream %d: audio (Speex), -aid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
893 ogg_d->num_sub, n_audio - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
894 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
895 // check for Theora |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
896 #ifdef CONFIG_OGGTHEORA |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
897 } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
898 int errorCode = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
899 theora_info inf; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
900 theora_comment cc; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
901 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
902 theora_info_init (&inf); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
903 theora_comment_init (&cc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
904 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
905 errorCode = theora_decode_header (&inf, &cc, &pack); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
906 if (errorCode) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
907 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
908 "Theora header parsing failed: %i \n", errorCode); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
909 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
910 sh_v = new_sh_video_vid(demuxer, ogg_d->num_sub, n_video); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
911 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
912 sh_v->bih = calloc(1, sizeof(BITMAPINFOHEADER)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
913 sh_v->bih->biSize = sizeof(BITMAPINFOHEADER); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
914 sh_v->bih->biCompression = sh_v->format = FOURCC_THEORA; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
915 sh_v->fps = ((double)inf.fps_numerator) / (double)inf.fps_denominator; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
916 sh_v->frametime = ((double)inf.fps_denominator) / (double)inf.fps_numerator; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
917 sh_v->disp_w = sh_v->bih->biWidth = inf.frame_width; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
918 sh_v->disp_h = sh_v->bih->biHeight = inf.frame_height; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
919 sh_v->bih->biBitCount = 24; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
920 sh_v->bih->biPlanes = 3; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
921 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount / 8) * sh_v->bih->biWidth * sh_v->bih->biHeight); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
922 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
923 ogg_d->subs[ogg_d->num_sub].theora = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
924 ogg_d->subs[ogg_d->num_sub].keyframe_frequency_force = inf.keyframe_frequency_force; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
925 ogg_d->subs[ogg_d->num_sub].id = n_video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
926 n_video++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
927 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
928 "[Ogg] stream %d: video (Theora v%d.%d.%d), -vid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
929 ogg_d->num_sub, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
930 (int)inf.version_major, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
931 (int)inf.version_minor, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
932 (int)inf.version_subminor, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
933 n_video - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
934 if (mp_msg_test(MSGT_HEADER, MSGL_V)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
935 print_video_header(sh_v->bih, MSGL_V); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
936 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
937 theora_comment_clear(&cc); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
938 theora_info_clear(&inf); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
939 #endif /* CONFIG_OGGTHEORA */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
940 } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
941 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
942 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C'); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
943 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
944 n_audio++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
945 ogg_d->subs[ogg_d->num_sub].flac = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
946 sh_a->wf = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
947 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
948 "[Ogg] stream %d: audio (FLAC), -aid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
949 ogg_d->num_sub, n_audio - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
950 } else if (pack.bytes >= 51 && !strncmp(&pack.packet[1], "FLAC", 4)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
951 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
952 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C'); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
953 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
954 n_audio++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
955 ogg_d->subs[ogg_d->num_sub].flac = 2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
956 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + 34); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
957 sh_a->wf->wFormatTag = sh_a->format; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
958 sh_a->wf->cbSize = 34; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
959 memcpy(&sh_a->wf[1], &pack.packet[17], 34); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
960 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
961 "[Ogg] stream %d: audio (FLAC, try 2), -aid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
962 ogg_d->num_sub, n_audio - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
963 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
964 /// Check for old header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
965 } else if (pack.bytes >= 142 && |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
966 !strncmp(&pack.packet[1], "Direct Show Samples embedded in Ogg", 35)) { |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
967 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
968 // Old video header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
969 if (AV_RL32(pack.packet + 96) == 0x05589f80 && pack.bytes >= 184) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
970 sh_v = new_sh_video_vid(demuxer, ogg_d->num_sub, n_video); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
971 sh_v->bih = calloc(1, sizeof(BITMAPINFOHEADER)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
972 sh_v->bih->biSize = sizeof(BITMAPINFOHEADER); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
973 sh_v->bih->biCompression = sh_v->format = mmioFOURCC(pack.packet[68], pack.packet[69], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
974 pack.packet[70], pack.packet[71]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
975 sh_v->frametime = AV_RL64(pack.packet + 164) * 0.0000001; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
976 sh_v->fps = 1 / sh_v->frametime; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
977 sh_v->disp_w = sh_v->bih->biWidth = AV_RL32(pack.packet + 176); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
978 sh_v->disp_h = sh_v->bih->biHeight = AV_RL32(pack.packet + 180); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
979 sh_v->bih->biBitCount = AV_RL16(pack.packet + 182); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
980 if (!sh_v->bih->biBitCount) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
981 sh_v->bih->biBitCount = 24; // hack, FIXME |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
982 sh_v->bih->biPlanes = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
983 sh_v->bih->biSizeImage = (sh_v->bih->biBitCount >> 3) * sh_v->bih->biWidth * sh_v->bih->biHeight; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
984 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
985 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
986 ogg_d->subs[ogg_d->num_sub].id = n_video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
987 n_video++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
988 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
989 "[Ogg] stream %d: video (FOURCC %c%c%c%c), -vid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
990 ogg_d->num_sub, pack.packet[68], pack.packet[69], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
991 pack.packet[70], pack.packet[71], n_video - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
992 if (mp_msg_test(MSGT_HEADER, MSGL_V)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
993 print_video_header(sh_v->bih, MSGL_V); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
994 // Old audio header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
995 } else if (AV_RL32(pack.packet + 96) == 0x05589F81) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
996 unsigned int extra_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
997 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
998 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
999 extra_size = AV_RL16(pack.packet + 140); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1000 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + extra_size); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1001 sh_a->format = sh_a->wf->wFormatTag = AV_RL16(pack.packet + 124); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1002 sh_a->channels = sh_a->wf->nChannels = AV_RL16(pack.packet + 126); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1003 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL32(pack.packet + 128); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1004 sh_a->wf->nAvgBytesPerSec = AV_RL32(pack.packet + 132); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1005 sh_a->wf->nBlockAlign = AV_RL16(pack.packet + 136); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1006 sh_a->wf->wBitsPerSample = AV_RL16(pack.packet + 138); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1007 sh_a->samplesize = (sh_a->wf->wBitsPerSample + 7) / 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1008 sh_a->wf->cbSize = extra_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1009 if (extra_size > 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1010 memcpy(((char *)sh_a->wf) + sizeof(WAVEFORMATEX), |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1011 pack.packet + 142, extra_size); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1012 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1013 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1014 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1015 n_audio++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1016 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1017 "[Ogg] stream %d: audio (format 0x%04x), -aid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1018 ogg_d->num_sub, sh_a->format, n_audio - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1019 if (mp_msg_test(MSGT_HEADER, MSGL_V)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1020 print_wave_header(sh_a->wf, MSGL_V); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1021 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1022 mp_msg(MSGT_DEMUX, MSGL_WARN, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1023 "Ogg stream %d contains an old header but the header type is unknown\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1024 ogg_d->num_sub); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1025 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1026 // Check new header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1027 } else if ((*pack.packet & PACKET_TYPE_BITS ) == PACKET_TYPE_HEADER && |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1028 pack.bytes >= (int)sizeof(stream_header) + 1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1029 stream_header *st = (stream_header*)(pack.packet + 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1030 /// New video header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1031 if (strncmp(st->streamtype, "video", 5) == 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1032 sh_v = new_sh_video_vid(demuxer, ogg_d->num_sub, n_video); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1033 sh_v->bih = calloc(1, sizeof(BITMAPINFOHEADER)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1034 sh_v->bih->biSize = sizeof(BITMAPINFOHEADER); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1035 sh_v->bih->biCompression = sh_v->format = mmioFOURCC(st->subtype[0], st->subtype[1], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1036 st->subtype[2], st->subtype[3]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1037 sh_v->frametime = AV_RL64(&st->time_unit) * 0.0000001; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1038 sh_v->fps = 1.0 / sh_v->frametime; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1039 sh_v->bih->biBitCount = AV_RL16(&st->bits_per_sample); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1040 sh_v->disp_w = sh_v->bih->biWidth = AV_RL32(&st->sh.video.width); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1041 sh_v->disp_h = sh_v->bih->biHeight = AV_RL32(&st->sh.video.height); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1042 if (!sh_v->bih->biBitCount) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1043 sh_v->bih->biBitCount = 24; // hack, FIXME |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1044 sh_v->bih->biPlanes = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1045 sh_v->bih->biSizeImage = (sh_v->bih->biBitCount >> 3) * sh_v->bih->biWidth * sh_v->bih->biHeight; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1046 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1047 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1048 ogg_d->subs[ogg_d->num_sub].id = n_video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1049 n_video++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1050 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1051 "[Ogg] stream %d: video (FOURCC %c%c%c%c), -vid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1052 ogg_d->num_sub, st->subtype[0], st->subtype[1], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1053 st->subtype[2], st->subtype[3], n_video - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1054 if (mp_msg_test(MSGT_HEADER, MSGL_V)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1055 print_video_header(sh_v->bih, MSGL_V); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1056 /// New audio header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1057 } else if (strncmp(st->streamtype, "audio", 5) == 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1058 char buffer[5]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1059 unsigned int extra_size = AV_RL32(&st->size) - sizeof(stream_header); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1060 unsigned int extra_offset = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1061 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1062 memcpy(buffer, st->subtype, 4); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1063 buffer[4] = '\0'; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1064 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1065 /* Nasty workaround. stream_header.size seems not to contain the real |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1066 size in all cases. There are four extra bytes that are unaccounted |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1067 for in front of the real codec initialization data _at least_ for |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1068 AAC. So far I've only seen those bytes being all 0, so we can |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1069 just skip them here. */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1070 if ((strtol(buffer, NULL, 16) == 0xff) && (extra_size >= 4)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1071 extra_size -= 4; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1072 extra_offset = 4; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1073 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1074 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1075 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1076 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + extra_size); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1077 sh_a->format = sh_a->wf->wFormatTag = strtol(buffer, NULL, 16); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1078 sh_a->channels = sh_a->wf->nChannels = AV_RL16(&st->sh.audio.channels); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1079 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL64(&st->samples_per_unit); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1080 sh_a->wf->nAvgBytesPerSec = AV_RL32(&st->sh.audio.avgbytespersec); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1081 sh_a->wf->nBlockAlign = AV_RL16(&st->sh.audio.blockalign); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1082 sh_a->wf->wBitsPerSample = AV_RL16(&st->bits_per_sample); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1083 sh_a->samplesize = (sh_a->wf->wBitsPerSample + 7) / 8; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1084 sh_a->wf->cbSize = extra_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1085 if (extra_size) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1086 memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX), |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1087 ((char *)(st+1))+extra_offset, extra_size); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1088 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1089 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1090 ogg_d->subs[ogg_d->num_sub].id = n_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1091 n_audio++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1092 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1093 "[Ogg] stream %d: audio (format 0x%04x), -aid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1094 ogg_d->num_sub, sh_a->format, n_audio - 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1095 if (mp_msg_test(MSGT_HEADER, MSGL_V)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1096 print_wave_header(sh_a->wf, MSGL_V); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1097 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1098 /// Check for text (subtitles) header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1099 } else if (strncmp(st->streamtype, "text", 4) == 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1100 mp_msg(MSGT_DEMUX, MSGL_INFO, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1101 "[Ogg] stream %d: subtitles (SRT-like text subtitles), -sid %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1102 ogg_d->num_sub, ogg_d->n_text); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1103 ogg_d->subs[ogg_d->num_sub].samplerate = AV_RL64(&st->time_unit) / 10; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1104 ogg_d->subs[ogg_d->num_sub].text = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1105 ogg_d->subs[ogg_d->num_sub].id = ogg_d->n_text; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1106 if (demuxer->sub->id == ogg_d->n_text) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1107 text_id = ogg_d->num_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1108 new_sh_sub(demuxer, ogg_d->n_text); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1109 ogg_d->n_text++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1110 ogg_d->text_ids = realloc_struct(ogg_d->text_ids, ogg_d->n_text, sizeof(*ogg_d->text_ids)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1111 ogg_d->text_ids[ogg_d->n_text - 1] = ogg_d->num_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1112 ogg_d->text_langs = realloc_struct(ogg_d->text_langs, ogg_d->n_text, sizeof(*ogg_d->text_langs)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1113 ogg_d->text_langs[ogg_d->n_text - 1] = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1114 //// Unknown header type |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1115 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1116 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1117 "Ogg stream %d has a header marker but is of an unknown type\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1118 ogg_d->num_sub); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1119 /// Unknown (invalid ?) header |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1120 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1121 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1122 "Ogg stream %d is of an unknown type\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1123 ogg_d->num_sub); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1124 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1125 if (sh_a || sh_v) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1126 demux_stream_t *ds = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1127 if (sh_a) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1128 // If the audio stream is not defined we took the first one |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1129 if (demuxer->audio->id == -1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1130 demuxer->audio->id = n_audio - 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1131 //if (sh_a->wf) print_wave_header(sh_a->wf, MSGL_INFO); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1132 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1133 /// Is it the stream we want |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1134 if (demuxer->audio->id == n_audio - 1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1135 demuxer->audio->sh = sh_a; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1136 sh_a->ds = demuxer->audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1137 ds = demuxer->audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1138 audio_id = ogg_d->num_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1139 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1140 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1141 if (sh_v) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1142 /// Also for video |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1143 if (demuxer->video->id == -1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1144 demuxer->video->id = n_video - 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1145 //if (sh_v->bih) print_video_header(sh_v->bih, MSGL_INFO); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1146 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1147 if (demuxer->video->id == n_video - 1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1148 demuxer->video->sh = sh_v; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1149 sh_v->ds = demuxer->video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1150 ds = demuxer->video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1151 video_id = ogg_d->num_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1152 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1153 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1154 /// Add the header packets if the stream isn't seekable |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1155 if (ds && !s->end_pos) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1156 /// Finish the page, otherwise packets will be lost |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1157 do { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1158 demux_ogg_add_packet(ds, &ogg_d->subs[ogg_d->num_sub], |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1159 ogg_d->num_sub, &pack); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1160 } while (ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream, &pack) == 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1161 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1162 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1163 ogg_d->num_sub++; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1164 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1165 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1166 if (!n_video && !n_audio) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1167 goto err_out; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1168 } |
10092 | 1169 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1170 if (!n_video || video_id < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1171 demuxer->video->id = -2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1172 else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1173 demuxer->video->id = video_id; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1174 if (!n_audio || audio_id < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1175 demuxer->audio->id = -2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1176 else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1177 demuxer->audio->id = audio_id; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1178 /* Disable the subs only if there are no text streams at all. |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1179 Otherwise the stream to display might be chosen later when the comment |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1180 packet is encountered and the user used -slang instead of -sid. */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1181 if (!ogg_d->n_text) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1182 demuxer->sub->id = -2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1183 else if (text_id >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1184 demuxer->sub->id = text_id; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1185 mp_msg(MSGT_DEMUX, MSGL_V, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1186 "Ogg demuxer: Displaying subtitle stream id %d\n", text_id); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1187 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1188 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1189 ogg_d->final_granulepos = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1190 ogg_d->initial_granulepos = MP_NOPTS_VALUE; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1191 if (!s->end_pos) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1192 demuxer->seekable = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1193 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1194 demuxer->movi_start = s->start_pos; // Needed for XCD (Ogg written in MODE2) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1195 demuxer->movi_end = s->end_pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1196 demuxer->seekable = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1197 demux_ogg_scan_stream(demuxer); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1198 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1199 if (ogg_d->initial_granulepos == MP_NOPTS_VALUE) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1200 ogg_d->initial_granulepos = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1201 ogg_d->duration = ogg_d->final_granulepos - ogg_d->initial_granulepos; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1202 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1203 mp_msg(MSGT_DEMUX, MSGL_V, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1204 "Ogg demuxer : found %d audio stream%s, %d video stream%s and %d text stream%s\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1205 n_audio, n_audio > 1 ? "s" : "", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1206 n_video, n_video > 1 ? "s" : "", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1207 ogg_d->n_text, ogg_d->n_text > 1 ? "s" : ""); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1208 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1209 sh_a = demuxer->audio->sh; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1210 if (sh_a && sh_a->format == FOURCC_VORBIS) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1211 fixup_vorbis_wf(sh_a, ogg_d); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1212 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1213 return DEMUXER_TYPE_OGG; |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14574
diff
changeset
|
1214 |
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14574
diff
changeset
|
1215 err_out: |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1216 return 0; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1217 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1218 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1219 static int demux_ogg_fill_buffer(demuxer_t *d, demux_stream_t *dsds) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1220 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1221 ogg_demuxer_t *ogg_d; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1222 stream_t *s; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1223 demux_stream_t *ds; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1224 ogg_sync_state *sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1225 ogg_stream_state *os; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1226 ogg_page *page; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1227 ogg_packet pack; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1228 int np = 0, id=0; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1229 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1230 s = d->stream; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1231 ogg_d = d->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1232 sync = &ogg_d->sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1233 page = &ogg_d->page; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1234 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1235 /// Find the stream we are working on |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1236 if ((id = demux_ogg_get_page_stream(ogg_d, &os)) < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1237 mp_msg(MSGT_DEMUX, MSGL_ERR, "Ogg demuxer : can't get current stream\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1238 return 0; |
5133
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 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1241 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1242 np = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1243 ds = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1244 /// Try to get some packet from the current page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1245 while ((np = ogg_stream_packetout(os, &pack)) != 1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1246 /// No packet we go the next page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1247 if (np == 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1248 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1249 int pa, len; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1250 char *buf; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1251 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1252 ogg_d->pos += ogg_d->last_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1253 /// Get the next page from the physical stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1254 while ((pa = ogg_sync_pageseek(sync, page)) <= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1255 /// Error : we skip some bytes |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1256 if (pa < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1257 mp_msg(MSGT_DEMUX, MSGL_WARN, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1258 "Ogg : Page out not synced, we skip some bytes\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1259 ogg_d->pos -= pa; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1260 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1261 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1262 /// We need more data |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1263 buf = ogg_sync_buffer(sync, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1264 len = stream_read(s, buf, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1265 if (len == 0 && s->eof) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1266 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Ogg : Stream EOF !!!!\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1267 return 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1268 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1269 ogg_sync_wrote(sync, len); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1270 } /// Page loop |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1271 ogg_d->last_size = pa; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1272 /// Find the page's logical stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1273 if ((id = demux_ogg_get_page_stream(ogg_d, &os)) < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1274 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1275 "Ogg demuxer error : we met an unknown stream\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1276 return 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1277 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1278 /// Take the page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1279 if (ogg_stream_pagein(os, page) == 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1280 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1281 /// Page was invalid => retry |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1282 mp_msg(MSGT_DEMUX, MSGL_WARN, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1283 "Ogg demuxer : got invalid page !!!!!\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1284 ogg_d->pos += ogg_d->last_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1285 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1286 } else /// Packet was corrupted |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1287 mp_msg(MSGT_DEMUX, MSGL_WARN, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1288 "Ogg : bad packet in stream %d\n", id); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1289 } /// Packet loop |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1290 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1291 /// Is the actual logical stream in use ? |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1292 if (id == d->audio->id) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1293 ds = d->audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1294 else if (id == d->video->id) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1295 ds = d->video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1296 else if (ogg_d->subs[id].text) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1297 ds = d->sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1298 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1299 if (ds) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1300 if (!demux_ogg_add_packet(ds, &ogg_d->subs[id], id, &pack)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1301 continue; /// Unuseful packet, get another |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1302 d->filepos = ogg_d->pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1303 return 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1304 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1305 } /// while (1) |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1306 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1307 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1308 /// 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
|
1309 // stream, then we join the avi and ogg demuxer with a demuxers demuxer |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1310 demuxer_t *init_avi_with_ogg(demuxer_t *demuxer) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1311 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1312 demuxer_t *od; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1313 ogg_demuxer_t *ogg_d; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1314 stream_t *s; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1315 uint32_t hdrsizes[3]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1316 demux_packet_t *dp; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1317 sh_audio_t *sh_audio = demuxer->audio->sh; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1318 int np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1319 uint8_t *extradata = (uint8_t *)(sh_audio->wf + 1); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1320 int i; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1321 unsigned char *p = NULL, *buf; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1322 int plen; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1323 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1324 /// Check that the cbSize is big enough for the following reads |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1325 if (sh_audio->wf->cbSize < 22 + 3 * 4) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1326 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1327 "AVI Ogg : Initial audio header is too small !!!!!\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1328 goto fallback; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1329 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1330 /// Get the size of the 3 header packet |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1331 extradata += 22; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1332 for (i = 0; i < 3; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1333 hdrsizes[i] = AV_RL32(extradata); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1334 extradata += 4; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1335 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1336 // 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
|
1337 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1338 /// Check the size |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1339 if (sh_audio->wf->cbSize < 22 + 3 * 4 + hdrsizes[0] + hdrsizes[1] + hdrsizes[2]) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1340 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1341 "AVI Ogg : Audio header is too small !!!!!\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1342 goto fallback; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1343 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1344 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1345 // Build the ogg demuxer private datas |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1346 ogg_d = calloc(1, sizeof(*ogg_d)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1347 ogg_d->num_sub = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1348 ogg_d->subs = malloc(sizeof(*ogg_d->subs)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1349 ogg_d->subs[0].vorbis = 1; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1350 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1351 // Init the ogg physical stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1352 ogg_sync_init(&ogg_d->sync); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1353 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1354 // Get the first page of the stream : we assume there only 1 logical stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1355 while ((np = ogg_sync_pageout(&ogg_d->sync, &ogg_d->page)) <= 0 ) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1356 if (np < 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1357 mp_msg(MSGT_DEMUX, MSGL_ERR, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1358 "AVI Ogg error : Can't init using first stream packets\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1359 free(ogg_d); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1360 goto fallback; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1361 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1362 // Add some data |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1363 plen = ds_get_packet(demuxer->audio, &p); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1364 buf = ogg_sync_buffer(&ogg_d->sync, plen); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1365 memcpy(buf, p, plen); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1366 ogg_sync_wrote(&ogg_d->sync, plen); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1367 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1368 // Init the logical stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1369 mp_msg(MSGT_DEMUX, MSGL_DBG2, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1370 "AVI Ogg found page with serial %d\n", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1371 ogg_page_serialno(&ogg_d->page)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1372 ogg_stream_init(&ogg_d->subs[0].stream, ogg_page_serialno(&ogg_d->page)); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1373 // Write the page |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1374 ogg_stream_pagein(&ogg_d->subs[0].stream, &ogg_d->page); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1375 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1376 // Create the ds_stream and the ogg demuxer |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1377 s = new_ds_stream(demuxer->audio); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1378 od = new_demuxer(s, DEMUXER_TYPE_OGG, 0, -2, -2, NULL); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1379 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1380 /// Add the header packets in the ogg demuxer audio stream |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1381 for (i = 0; i < 3; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1382 dp = new_demux_packet(hdrsizes[i]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1383 memcpy(dp->buffer, extradata, hdrsizes[i]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1384 ds_add_packet(od->audio, dp); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1385 extradata += hdrsizes[i]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1386 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1387 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1388 // Finish setting up the ogg demuxer |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1389 od->priv = ogg_d; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1390 sh_audio = new_sh_audio(od, 0); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1391 od->audio->id = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1392 od->video->id = -2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1393 od->audio->sh = sh_audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1394 sh_audio->ds = od->audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1395 sh_audio->format = FOURCC_VORBIS; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1396 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
|
1397 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1398 /// Return the joined demuxers |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1399 return new_demuxers_demuxer(demuxer, od, demuxer); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1400 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1401 fallback: |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1402 demuxer->audio->id = -2; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1403 return demuxer; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1404 |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1405 } |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1406 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1407 static void demux_ogg_seek(demuxer_t *demuxer, float rel_seek_secs, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1408 float audio_delay, int flags) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1409 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1410 ogg_demuxer_t *ogg_d = demuxer->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1411 ogg_sync_state *sync = &ogg_d->sync; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1412 ogg_page* page= &ogg_d->page; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1413 ogg_stream_state *oss; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1414 ogg_stream_t *os; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1415 demux_stream_t *ds; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1416 ogg_packet op; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1417 float rate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1418 int i, sp, first, precision = 1, do_seek = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1419 vorbis_info *vi = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1420 int64_t gp = 0, old_gp; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1421 off_t pos, old_pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1422 int np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1423 int is_gp_valid; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1424 float pts; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1425 int is_keyframe; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1426 int samplesize = 1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1427 ogg_int64_t granulepos_orig; |
5732 | 1428 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1429 if (demuxer->video->id >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1430 ds = demuxer->video; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1431 rate = ogg_d->subs[ds->id].samplerate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1432 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1433 ds = demuxer->audio; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1434 os = &ogg_d->subs[ds->id]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1435 vi = &(os->vi); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1436 rate = (float)vi->rate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1437 samplesize = ((sh_audio_t*)ds->sh)->samplesize; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1438 } |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1439 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1440 os = &ogg_d->subs[ds->id]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1441 oss = &os->stream; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1442 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1443 old_gp = os->lastpos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1444 old_pos = ogg_d->pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1445 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1446 //calculate the granulepos to seek to |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1447 gp = flags & SEEK_ABSOLUTE ? ogg_d->initial_granulepos : os->lastpos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1448 if (flags & SEEK_FACTOR) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1449 if (ogg_d->duration > 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1450 gp += ogg_d->duration * rel_seek_secs; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1451 else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1452 gp += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * os->lastpos / ogg_d->pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1453 } else |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1454 gp += rel_seek_secs * rate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1455 if (gp < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1456 gp = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1457 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1458 //calculate the filepos to seek to |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1459 if (ogg_d->syncpoints) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1460 for (sp = 0; sp < ogg_d->num_syncpoint; sp++) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1461 if (ogg_d->syncpoints[sp].granulepos >= gp) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1462 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1463 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1464 if (sp >= ogg_d->num_syncpoint) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1465 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1466 if (sp > 0 && ogg_d->syncpoints[sp].granulepos - gp > gp - ogg_d->syncpoints[sp - 1].granulepos) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1467 sp--; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1468 if (ogg_d->syncpoints[sp].granulepos == os->lastpos) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1469 if (sp > 0 && gp < os->lastpos) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1470 sp--; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1471 if (sp < ogg_d->num_syncpoint - 1 && gp > os->lastpos) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1472 sp++; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1473 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1474 pos = ogg_d->syncpoints[sp].page_pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1475 precision = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1476 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1477 pos = flags & SEEK_ABSOLUTE ? 0 : ogg_d->pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1478 if (flags & SEEK_FACTOR) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1479 pos += (demuxer->movi_end - demuxer->movi_start) * rel_seek_secs; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1480 else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1481 if (ogg_d->duration > 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1482 pos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / (ogg_d->duration / rate); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1483 } else if (os->lastpos > 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1484 pos += rel_seek_secs * ogg_d->pos / (os->lastpos / rate); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1485 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1486 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1487 if (pos < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1488 pos = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1489 if (pos > (demuxer->movi_end - demuxer->movi_start)) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1490 pos = demuxer->movi_end - demuxer->movi_start; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1491 } // if (ogg_d->syncpoints) |
5732 | 1492 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1493 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1494 if (do_seek) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1495 stream_seek(demuxer->stream, pos+demuxer->movi_start); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1496 ogg_sync_reset(sync); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1497 for (i = 0; i < ogg_d->num_sub; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1498 ogg_stream_reset(&ogg_d->subs[i].stream); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1499 ogg_d->subs[i].lastpos = ogg_d->subs[i].lastsize = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1500 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1501 ogg_d->pos = pos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1502 ogg_d->last_size = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1503 /* we just guess that we reached correct granulepos, in case a |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1504 subsequent search occurs before we read a valid granulepos */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1505 os->lastpos = gp; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1506 first = !(ogg_d->syncpoints); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1507 do_seek=0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1508 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1509 ogg_d->pos += ogg_d->last_size; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1510 ogg_d->last_size = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1511 np = ogg_sync_pageseek(sync, page); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1512 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1513 if (np < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1514 ogg_d->pos -= np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1515 if (np <= 0) { // We need more data |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1516 char *buf = ogg_sync_buffer(sync, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1517 int len = stream_read(demuxer->stream, buf, BLOCK_SIZE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1518 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1519 if (len == 0 && demuxer->stream->eof) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1520 mp_msg(MSGT_DEMUX, MSGL_V, "EOF while trying to seek !!!!\n"); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1521 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1522 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1523 ogg_sync_wrote(sync, len); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1524 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1525 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1526 ogg_d->last_size = np; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1527 if (ogg_page_serialno(page) != oss->serialno) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1528 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1529 |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1530 if (ogg_stream_pagein(oss, page) != 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1531 continue; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1532 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1533 while (1) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1534 np = ogg_stream_packetout(oss, &op); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1535 if (np < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1536 continue; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1537 else if (np == 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1538 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1539 if (first) { /* Discard the first packet as it's probably broken, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1540 and we don't have any other means to decide whether it is |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1541 complete or not. */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1542 first = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1543 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1544 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1545 is_gp_valid = (op.granulepos >= 0); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1546 granulepos_orig=op.granulepos; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1547 demux_ogg_read_packet(os, &op, &pts, &is_keyframe, samplesize); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1548 if (precision && is_gp_valid) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1549 precision--; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1550 if (abs(gp - op.granulepos) > rate && (op.granulepos != old_gp)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1551 //prepare another seek because we are off by more than 1s |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1552 pos += (gp - op.granulepos) * (pos - old_pos) / (op.granulepos - old_gp); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1553 if (pos < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1554 pos = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1555 if (pos < demuxer->movi_end - demuxer->movi_start) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1556 do_seek=1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1557 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1558 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1559 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1560 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1561 if (is_gp_valid && pos > 0 && old_gp > gp |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1562 && 2 * (old_gp - op.granulepos) < old_gp - gp) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1563 /* prepare another seek because looking for a syncpoint |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1564 destroyed the backward search */ |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1565 pos = old_pos - 1.5 * (old_pos - pos); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1566 if (pos < 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1567 pos = 0; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1568 if (pos < demuxer->movi_end - demuxer->movi_start) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1569 do_seek=1; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1570 break; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1571 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1572 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1573 if (!precision && (is_keyframe || os->vorbis || os->speex)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1574 if (sub_clear_text(&ogg_sub, MP_NOPTS_VALUE)) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1575 vo_sub = &ogg_sub; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1576 vo_osd_changed(OSDTYPE_SUBTITLE); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1577 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1578 op.granulepos=granulepos_orig; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1579 demux_ogg_add_packet(ds, os, ds->id, &op); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1580 return; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1581 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1582 } |
5732 | 1583 } |
1584 | |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1585 mp_msg(MSGT_DEMUX, MSGL_ERR, "Can't find the good packet :(\n"); |
5732 | 1586 } |
1587 | |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1588 static void demux_close_ogg(demuxer_t *demuxer) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1589 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1590 ogg_demuxer_t *ogg_d = demuxer->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1591 ogg_stream_t *os = NULL; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1592 int i; |
5812 | 1593 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1594 if (!ogg_d) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1595 return; |
5812 | 1596 |
27393 | 1597 #ifdef CONFIG_ICONV |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1598 subcp_close(); |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1599 #endif |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1600 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1601 ogg_sync_clear(&ogg_d->sync); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1602 if (ogg_d->subs) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1603 for (i = 0; i < ogg_d->num_sub; i++) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1604 os = &ogg_d->subs[i]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1605 ogg_stream_clear(&os->stream); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1606 if (os->vi_initialized) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1607 vorbis_info_clear(&os->vi); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1608 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1609 free(ogg_d->subs); |
21811 | 1610 } |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1611 if (ogg_d->syncpoints) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1612 free(ogg_d->syncpoints); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1613 if (ogg_d->text_ids) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1614 free(ogg_d->text_ids); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1615 if (ogg_d->text_langs) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1616 for (i = 0; i < ogg_d->n_text; i++) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1617 if (ogg_d->text_langs[i]) free(ogg_d->text_langs[i]); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1618 free(ogg_d->text_langs); |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1619 } |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1620 free(ogg_d); |
5812 | 1621 } |
1622 | |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1623 static int demux_ogg_control(demuxer_t *demuxer, int cmd, void *arg) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1624 { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1625 ogg_demuxer_t *ogg_d = demuxer->priv; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1626 ogg_stream_t *os; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1627 float rate; |
11577 | 1628 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1629 if (demuxer->video->id >= 0) { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1630 os = &ogg_d->subs[demuxer->video->id]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1631 rate = os->samplerate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1632 } else { |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1633 os = &ogg_d->subs[demuxer->audio->id]; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1634 rate = os->vi.rate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1635 } |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1636 |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1637 switch(cmd) { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1638 case DEMUXER_CTRL_GET_TIME_LENGTH: |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1639 if (ogg_d->duration <= 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1640 return DEMUXER_CTRL_DONTKNOW; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1641 *(double *)arg = (double)(ogg_d->duration) / rate; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1642 return DEMUXER_CTRL_GUESS; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1643 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1644 case DEMUXER_CTRL_GET_PERCENT_POS: |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1645 if (ogg_d->duration <= 0) |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1646 return DEMUXER_CTRL_DONTKNOW; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1647 *(int *)arg = ((os->lastpos - ogg_d->initial_granulepos) * 100) / ogg_d->duration; |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1648 return DEMUXER_CTRL_OK; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1649 |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1650 default: |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1651 return DEMUXER_CTRL_NOTIMPL; |
11575
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1652 } |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1653 } |
0ac7fe8f3af8
Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents:
11467
diff
changeset
|
1654 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25495
diff
changeset
|
1655 const demuxer_desc_t demuxer_desc_ogg = { |
30999
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1656 "Ogg demuxer", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1657 "ogg", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1658 "Ogg", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1659 "?", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1660 "", |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1661 DEMUXER_TYPE_OGG, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1662 1, // safe autodetect |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1663 demux_ogg_open, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1664 demux_ogg_fill_buffer, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1665 NULL, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1666 demux_close_ogg, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1667 demux_ogg_seek, |
abb0b5990ec8
cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents:
30837
diff
changeset
|
1668 demux_ogg_control |
16175 | 1669 }; |