annotate libmpdemux/demux_ogg.c @ 32130:1aa005842273

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