annotate libmpdemux/demux_ogg.c @ 31368:f73663d84979

Replace common options template by a common options array. This solution works just as well, but avoids a separate template file that needs to be #included from multiple places. The end result is simpler since common options and those MPlayer and MEncoder are now in only one file.
author diego
date Wed, 16 Jun 2010 18:59:10 +0000
parents 21516121610a
children cd81fce1f010
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
24 #include <assert.h>
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
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
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
28 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
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
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
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
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
40 #define FOURCC_THEORA mmioFOURCC('t', 'h', 'e', 'o')
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
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
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
51 #include <theora/theora.h>
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27397
diff changeset
52 int _ilog (unsigned int); /* defined in many places in theora/lib/ */
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
53 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
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
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
57 /* Theora decoder context : we won't be able to interpret granule positions
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
58 * without using theora_granule_time with the theora_state of the stream.
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
59 * This is duplicated in `vd_theora.c'; put this in a common header?
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
60 */
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
61 #ifdef CONFIG_OGGTHEORA
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
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
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
66 } theora_struct_t;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
67 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
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
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
110 } ogg_syncpoint_t;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
157 #define NUM_VORBIS_HDR_PACKETS 3
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
169 //-------- subtitle support - should be moved to decoder layer, and queue
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
170 // - subtitles up in demuxer buffer...
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
171
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
172 #include "subreader.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
173 #include "libvo/sub.h"
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
174 #define OGG_SUB_MAX_LINE 128
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
175
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
176 static subtitle ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
177 //FILE* subout;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
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
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
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
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
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
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
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
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
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
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
225 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
348 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
349 return data;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
350 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
5cbf0cbeef7c Add some const/static qualifiers as appropriate
reimar
parents: 25494
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
666 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
685 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
686 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
687
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
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
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
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
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1583 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1586 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
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
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
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
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1596
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
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
ff1d5576063f Do not access ogg_d->subs after freeing it.
reimar
parents: 21531
diff changeset
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
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1621 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
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
alex
parents: 11576
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1669 };