annotate libmpdemux/demux_ogg.c @ 33456:e80ada93a3c5

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