annotate libmpdemux/demux_ogg.c @ 35253:48db1b241757

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