annotate libmpdemux/demux_ogg.c @ 34589:6327e5a74a5e

Don't unnecessarily use gstrdup(). The line has already been checked for content.
author ib
date Fri, 10 Feb 2012 13:06:43 +0000
parents 13df2e44dd58
children 57d6486ffb58
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
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
52 #include <theora/theoradec.h>
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
53 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
54
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
55 #define BLOCK_SIZE 4096
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
56
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
57 /* Theora decoder context : we won't be able to interpret granule positions
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
58 * without using th_granule_time with the th_dec_ctx of the stream.
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
59 * This is duplicated in `vd_theora.c'; put this in a common header?
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
60 */
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
61 #ifdef CONFIG_OGGTHEORA
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
62 typedef struct theora_struct_st {
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
63 th_setup_info *tsi;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
64 th_dec_ctx *tctx;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
65 th_comment tc;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
66 th_info ti;
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;
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
119 int keyframe_granule_shift;
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) {
34430
7a902ef36e45 Use double also to calculate ogg subtitle pts.
reimar
parents: 34429
diff changeset
205 double pts;
30999
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;
34430
7a902ef36e45 Use double also to calculate ogg subtitle pts.
reimar
parents: 34429
diff changeset
209 pts = (double)pack->granulepos / (double)os->samplerate;
7a902ef36e45 Use double also to calculate ogg subtitle pts.
reimar
parents: 34429
diff changeset
210 endpts = 1.0 + pts + (double)duration / 1000.0;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
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,
34428
438e8d189753 Calculate Ogg timestamps as double instead of float.
reimar
parents: 34415
diff changeset
260 double *pts, int *flags,
30999
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)
34431
13df2e44dd58 Change a few more pts-related float to double.
reimar
parents: 34430
diff changeset
287 *pts = pack->granulepos / (double)vi->rate;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
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)) {
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
302 int64_t iframemask = (1 << os->keyframe_granule_shift) - 1;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
303
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
304 if (pack->granulepos >= 0) {
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
305 os->lastpos = pack->granulepos >> os->keyframe_granule_shift;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
306 os->lastpos += pack->granulepos & iframemask;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
307 *flags = (pack->granulepos & iframemask) == 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
308 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
309 os->lastpos++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
310 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
311 pack->granulepos = os->lastpos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
312 *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
313 }
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
314 #endif /* CONFIG_OGGTHEORA */
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
315 } else if (os->flac) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
316 /* 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
317 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
318 return NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
319 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
320 if (*pack->packet & PACKET_TYPE_HEADER) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
321 os->hdr_packets++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
322 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
323 // Find data start
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
324 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
325
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
326 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
327 data = pack->packet + 1 + hdrlen;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
328 // Calculate the timestamp
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
329 if (pack->granulepos == -1)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
330 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
331 // 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
332 if (*pack->packet & PACKET_IS_SYNCPOINT)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
333 *flags = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
334 *pts = pack->granulepos / os->samplerate;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
335 // Save the packet length and timestamp
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
336 os->lastsize = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
337 while (hdrlen) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
338 os->lastsize <<= 8;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
339 os->lastsize |= pack->packet[hdrlen];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
340 hdrlen--;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
341 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
342 os->lastpos = pack->granulepos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
343 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
344 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
345 return data;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
346 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
347
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
348 // check if clang has substring from comma separated langlist
25495
5cbf0cbeef7c Add some const/static qualifiers as appropriate
reimar
parents: 25494
diff changeset
349 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
350 {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
351 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
352
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
353 if (!langlist || !*langlist)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
354 return 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
355 while ((c = strchr(langlist, ','))) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
356 if (!strncasecmp(clang, langlist, c - langlist))
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
357 return 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
358 langlist = &c[1];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
359 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
360 if (!strncasecmp(clang, langlist, strlen(langlist)))
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
361 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
362 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
363 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
364
30582
85aaf16401b5 Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents: 30580
diff changeset
365 /** \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
366
85aaf16401b5 Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents: 30580
diff changeset
367 \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
368 \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
369 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
370
85aaf16401b5 Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents: 30580
diff changeset
371 \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
372 track.
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
373 */
30583
c8b12c3fc5a5 Mark demux_ogg_sub_id() as static; it is not used outside of the file.
diego
parents: 30582
diff changeset
374 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
375 {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
376 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
377 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
378 }
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 /** \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
381 * \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
382 * \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
383 */
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
384 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
385 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
386 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
387 int i;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
388
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
389 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
390 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
391 return i;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
392 return -1;
30582
85aaf16401b5 Move up demux_ogg_sub_id, demux_ogg_sub_reverse_id; avoids forward declarations.
diego
parents: 30580
diff changeset
393 }
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
394
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
395 /// 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
396 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
397 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
398 {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
399 const char *hdr, *val;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
400 char **cmt = vc->user_comments;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
401 int index, i;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
402 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
403 static const struct table {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
404 const char *ogg;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
405 const char *mp;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
406 } table[] = {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
407 { "ENCODED_USING", "Software" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
408 { "ENCODER_URL", "Encoder URL" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
409 { "TITLE", "Title" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
410 { "ARTIST", "Artist" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
411 { "COMMENT", "Comments" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
412 { "DATE", "Creation Date" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
413 { "GENRE", "Genre" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
414 { "ALBUM", "Album" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
415 { "TRACKNUMBER", "Track" },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
416 { NULL, NULL },
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
417 };
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
418
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
419 while (*cmt) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
420 hdr = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
421 if (!strncasecmp(*cmt, "LANGUAGE=", 9)) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
422 val = *cmt + 9;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
423 if (ogg_d->subs[id].text)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
424 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
425 ogg_d->subs[id].id, val);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
426 else if (id != d->video->id)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
427 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
428 ogg_d->subs[id].id, val);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
429 if (ogg_d->subs[id].text)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
430 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
431 "[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
432 ogg_d->subs[id].id, val);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
433 // 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
434 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
435 if (index >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
436 sh_sub_t *sh;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
437
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
438 // 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
439 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
440 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
441 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
442 if (sh)
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
443 free(sh->lang);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
444 if (sh)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
445 sh->lang = strdup(val);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
446 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
447 // 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
448 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
449 d->sub->id = index;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
450 dvdsub_id = index;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
451 mp_msg(MSGT_DEMUX, MSGL_V,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
452 "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
453 id, val);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
454 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
455 else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
456 hdr = "Language";
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
457 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
458 else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
459 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
460 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
461 (*cmt)[strlen(table[i].ogg)] == '=') {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
462 hdr = table[i].mp;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
463 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
464 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
465 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
466 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
467 if (hdr)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
468 demux_info_add(d, hdr, val);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
469 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
470 cmt++;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
471 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
472 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
473
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
474 /// 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
475 // 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
476 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
477 int id, ogg_packet *pack)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
478 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
479 demuxer_t *d = ds->demuxer;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
480 demux_packet_t *dp;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
481 unsigned char *data;
34428
438e8d189753 Calculate Ogg timestamps as double instead of float.
reimar
parents: 34415
diff changeset
482 double pts = 0;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
483 int flags = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
484 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
485
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
486 // 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
487 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
488 vorbis_info vi;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
489 vorbis_comment vc;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
490
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
491 vorbis_info_init(&vi);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
492 vorbis_comment_init(&vc);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
493 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
494 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
495 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
496 vorbis_comment_clear(&vc);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
497 vorbis_info_clear(&vi);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
498 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
499 if (os->text) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
500 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
501 demux_ogg_add_sub(os, pack);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
502 return 0;
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
503 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
504 if (os->speex) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
505 // 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
506 if (os->hdr_packets < 2) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
507 os->hdr_packets++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
508 return 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
509 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
510 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
511 // 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
512 // (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
513 // 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
514 // 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
515 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
516 (ds != d->audio || ((sh_audio_t*)ds->sh)->format != FOURCC_VORBIS || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) &&
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
517 (ds != d->video || (((sh_video_t*)ds->sh)->format != FOURCC_THEORA)))
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
518 return 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
519 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
520
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
521 // For vorbis packet the packet is the data, for other codec we must jump
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
522 // the header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
523 if (ds == d->audio && ((sh_audio_t*)ds->sh)->format == FOURCC_VORBIS) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
524 samplesize = ((sh_audio_t *)ds->sh)->samplesize;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
525 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
526 data = demux_ogg_read_packet(os, pack, &pts, &flags, samplesize);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
527 if (!data)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
528 return 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
529
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
530 /// Clear subtitles if necessary (for broken files)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
531 if (sub_clear_text(&ogg_sub, pts)) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
532 vo_sub = &ogg_sub;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
533 vo_osd_changed(OSDTYPE_SUBTITLE);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
534 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
535 /// Send the packet
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
536 dp = new_demux_packet(pack->bytes - (data - pack->packet));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
537 memcpy(dp->buffer, data, pack->bytes - (data - pack->packet));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
538 dp->pts = pts;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
539 dp->flags = flags;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
540 ds_add_packet(ds, dp);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
541 mp_msg(MSGT_DEMUX, MSGL_DBG2,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
542 "New dp: %p ds=%p pts=%5.3f len=%d flag=%d \n",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
543 dp, ds, pts, dp->len, flags);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
544 return 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
545 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
546
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
547 /// if -forceidx build a table of all syncpoints to make seeking easier
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
548 /// otherwise try to get at least the final_granulepos
30570
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 29734
diff changeset
549 static void demux_ogg_scan_stream(demuxer_t *demuxer)
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 29734
diff changeset
550 {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
551 ogg_demuxer_t *ogg_d = demuxer->priv;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
552 stream_t *s = demuxer->stream;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
553 ogg_sync_state *sync = &ogg_d->sync;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
554 ogg_page *page = &ogg_d->page;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
555 ogg_stream_state *oss;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
556 ogg_stream_t *os;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
557 ogg_packet op;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
558 int np, sid, p, samplesize = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
559 off_t pos, last_pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
560
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
561 pos = last_pos = demuxer->movi_start;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
562
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
563 // Reset the stream
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
564 stream_seek(s, demuxer->movi_start);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
565 ogg_sync_reset(sync);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
566
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
567 // Get the serial number of the stream we use
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
568 if (demuxer->video->id >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
569 sid = demuxer->video->id;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
570 } else if (demuxer->audio->id >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
571 sid = demuxer->audio->id;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
572 if (((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
573 samplesize = ((sh_audio_t*)demuxer->audio->sh)->samplesize;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
574 } else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
575 return;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
576 os = &ogg_d->subs[sid];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
577 oss = &os->stream;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
578
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
579 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
580 np = ogg_sync_pageseek(sync, page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
581 if (np < 0) { // We had to skip some bytes
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
582 if (index_mode == 2)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
583 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
584 "Bad page sync while building syncpoints table (%d)\n",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
585 -np);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
586 pos += -np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
587 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
588 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
589 if (np <= 0) { // We need more data
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
590 char *buf = ogg_sync_buffer(sync, BLOCK_SIZE);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
591 int len = stream_read(s, buf, BLOCK_SIZE);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
592
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
593 if (len == 0 && s->eof)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
594 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
595 ogg_sync_wrote(sync, len);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
596 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
597 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
598 // The page is ready
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
599 //ogg_sync_pageout(sync, page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
600 if (ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
601 pos += np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
602 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
603 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
604 if (ogg_stream_pagein(oss, page) != 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
605 mp_msg(MSGT_DEMUX, MSGL_ERR, "Pagein error ????\n");
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
606 pos += np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
607 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
608 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
609 p = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
610 while (ogg_stream_packetout(oss, &op) == 1) {
34428
438e8d189753 Calculate Ogg timestamps as double instead of float.
reimar
parents: 34415
diff changeset
611 double pts;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
612 int flags;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
613
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
614 demux_ogg_read_packet(os, &op, &pts, &flags, samplesize);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
615 if (op.granulepos >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
616 ogg_d->final_granulepos = op.granulepos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
617 if (ogg_d->initial_granulepos == MP_NOPTS_VALUE && (flags & 1)) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
618 ogg_d->initial_granulepos = op.granulepos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
619 if (index_mode != 2 && ogg_d->pos < demuxer->movi_end - 2 * 270000) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
620 //the 270000 are just a wild guess
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
621 stream_seek(s, FFMAX(ogg_d->pos, demuxer->movi_end - 270000));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
622 ogg_sync_reset(sync);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
623 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
624 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
625 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
626 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
627 if (index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
628 if (ogg_d->num_syncpoint > SIZE_MAX / sizeof(ogg_syncpoint_t) - 1)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
629 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
630 ogg_d->syncpoints = realloc_struct(ogg_d->syncpoints, (ogg_d->num_syncpoint + 1), sizeof(ogg_syncpoint_t));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
631 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
632 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
633 ogg_d->num_syncpoint++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
634 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
635 p++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
636 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
637 if (p > 1 || (p == 1 && !ogg_page_continued(page)))
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
638 last_pos = pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
639 pos += np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
640 if (index_mode == 2)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
641 mp_msg(MSGT_DEMUX, MSGL_INFO, "Building syncpoint table %d%%\r",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
642 (int)(pos * 100 / s->end_pos));
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
643 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
644
31000
21516121610a Merge two redundant if checks, patch by ubitux, ubitux gmail com.
diego
parents: 30999
diff changeset
645 if (index_mode == 2) {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
646 mp_msg(MSGT_DEMUX, MSGL_INFO, "\n");
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
647 mp_msg(MSGT_DEMUX, MSGL_V,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
648 "Ogg syncpoints table builed: %d syncpoints\n",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
649 ogg_d->num_syncpoint);
31000
21516121610a Merge two redundant if checks, patch by ubitux, ubitux gmail com.
diego
parents: 30999
diff changeset
650 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
651
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
652 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg stream length (granulepos): %"PRId64"\n",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
653 ogg_d->final_granulepos);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
654
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
655 stream_reset(s);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
656 stream_seek(s, demuxer->movi_start);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
657 ogg_sync_reset(sync);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
658 for (np = 0; np < ogg_d->num_sub; np++) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
659 ogg_stream_reset(&ogg_d->subs[np].stream);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
660 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
661 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
662
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
663 // Get the first page
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
664 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
665 np = ogg_sync_pageout(sync, page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
666 if (np <= 0) { // We need more data
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
667 char *buf = ogg_sync_buffer(sync, BLOCK_SIZE);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
668 int len = stream_read(s, buf, BLOCK_SIZE);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
669
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
670 if (len == 0 && s->eof) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
671 mp_msg(MSGT_DEMUX, MSGL_ERR, "EOF while trying to get the first page !!!!\n");
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
672 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
673 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
674 ogg_sync_wrote(sync, len);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
675 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
676 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
677 demux_ogg_get_page_stream(ogg_d, &oss);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
678 ogg_stream_pagein(oss, page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
679 break;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
680 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
681 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
682
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
683 static void fixup_vorbis_wf(sh_audio_t *sh, ogg_demuxer_t *od)
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
684 {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
685 int i, offset;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
686 int ris, init_error = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
687 ogg_packet op[3];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
688 unsigned char *buf[3];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
689 unsigned char *ptr;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
690 unsigned int len;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
691 ogg_stream_t *os = &od->subs[sh->ds->id];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
692 vorbis_comment vc;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
693
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
694 vorbis_info_init(&os->vi);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
695 vorbis_comment_init(&vc);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
696 for (i = 0; i < 3; i++) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
697 op[i].bytes = ds_get_packet(sh->ds, &(op[i].packet));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
698 mp_msg(MSGT_DEMUX, MSGL_V, "fixup_vorbis_wf: i=%d, size=%ld\n", i, op[i].bytes);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
699 if (op[i].bytes < 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
700 mp_msg(MSGT_DEMUX, MSGL_ERR, "Ogg demuxer error!, fixup_vorbis_wf: bad packet n. %d\n", i);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
701 return;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
702 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
703 buf[i] = malloc(op[i].bytes);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
704 if (!buf[i])
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
705 return;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
706 memcpy(buf[i], op[i].packet, op[i].bytes);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
707
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
708 op[i].b_o_s = (i == 0);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
709 ris = vorbis_synthesis_headerin(&os->vi, &vc, &op[i]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
710 if (ris < 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
711 init_error = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
712 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DEMUX_OGG: header n. %d broken! len=%ld, code: %d\n", i, op[i].bytes, ris);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
713 }
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
714 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
715 vorbis_comment_clear(&vc);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
716 if (!init_error)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
717 os->vi_initialized = 1;
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
718
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
719 len = op[0].bytes + op[1].bytes + op[2].bytes;
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
720 sh->wf = calloc(1, sizeof(*sh->wf) + len + len / 255 + 64);
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
721 ptr = (unsigned char*)(sh->wf + 1);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
722
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
723 ptr[0] = 2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
724 offset = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
725 offset += store_ughvlc(&ptr[offset], op[0].bytes);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
726 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, offset after 1st len = %u\n", offset);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
727 offset += store_ughvlc(&ptr[offset], op[1].bytes);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
728 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, offset after 2nd len = %u\n", offset);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
729 for (i = 0; i < 3; i++) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
730 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, i=%d, bytes: %ld, offset: %u\n", i, op[i].bytes, offset);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
731 memcpy(&ptr[offset], buf[i], op[i].bytes);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
732 offset += op[i].bytes;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
733 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
734 sh->wf->cbSize = offset;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
735 mp_msg(MSGT_DEMUX, MSGL_V, "demux_ogg, extradata size: %d\n", sh->wf->cbSize);
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
736 sh->wf = realloc(sh->wf, sizeof(*sh->wf) + sh->wf->cbSize);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
737
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
738 if (op[0].bytes >= 29) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
739 unsigned int br;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
740 int nombr, minbr, maxbr;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
741
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
742 ptr = buf[0];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
743 sh->channels = ptr[11];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
744 sh->samplerate = sh->wf->nSamplesPerSec = AV_RL32(&ptr[12]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
745 maxbr = AV_RL32(&ptr[16]); //max
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
746 nombr = AV_RL32(&ptr[20]); //nominal
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
747 minbr = AV_RL32(&ptr[24]); //minimum
19694
d32f43ae7f5b in fixup_vorbis_wf() set to 0 bitrates indicated as -1 (unspecified, according to the specs); patch by Andrew Savchenko - Bircoph list ru
nicodvb
parents: 19540
diff changeset
748
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
749 if (maxbr == -1)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
750 maxbr = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
751 if (nombr == -1)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
752 nombr = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
753 if (minbr == -1)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
754 minbr = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
755
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
756 br = maxbr / 8;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
757 if (!br)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
758 br = nombr / 8;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
759 if (!br)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
760 br = minbr / 8;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
761 sh->wf->nAvgBytesPerSec = br;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
762 sh->wf->wBitsPerSample = 16;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
763 sh->samplesize = (sh->wf->wBitsPerSample + 7) / 8;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
764
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
765 mp_msg(MSGT_DEMUX, MSGL_V,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
766 "demux_ogg, vorbis stream features are: channels: %d, srate: %d, bitrate: %d, max: %u, nominal: %u, min: %u\n",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
767 sh->channels, sh->samplerate, sh->wf->nAvgBytesPerSec,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
768 maxbr, nombr, minbr);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
769 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
770 free(buf[2]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
771 free(buf[1]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
772 free(buf[0]);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
773 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
774
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
775 /// Open an ogg physical stream
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
776 // Not static because it's used also in demuxer_avi.c
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
777 int demux_ogg_open(demuxer_t *demuxer)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
778 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
779 ogg_demuxer_t *ogg_d;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
780 stream_t *s;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
781 char *buf;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
782 int np, s_no, n_audio = 0, n_video = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
783 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
784 ogg_sync_state *sync;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
785 ogg_page *page;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
786 ogg_packet pack;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
787 sh_audio_t *sh_a;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
788 sh_video_t *sh_v;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
789
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
790 #ifdef CONFIG_ICONV
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
791 subcp_open(NULL);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
792 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
793
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
794 s = demuxer->stream;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
795
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
796 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
797 sync = &ogg_d->sync;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
798 page = &ogg_d->page;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
799
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
800 ogg_sync_init(sync);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
801
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
802 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
803 /// Try to get a page
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
804 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
805 np = ogg_sync_pageseek(sync, page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
806 /// Error
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
807 if (np < 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
808 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
809 goto err_out;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
810 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
811 /// Need some more data
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
812 if (np == 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
813 int len;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
814
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
815 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
816 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
817 if (len == 0 && s->eof) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
818 goto err_out;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
819 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
820 ogg_sync_wrote(sync, len);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
821 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
822 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
823 ogg_d->last_size = np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
824 // We got one page now
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
825
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
826 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
827 // 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
828 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
829 if (id >= 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
830 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
831 else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
832 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
833 "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
834 ogg_page_serialno(page));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
835 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
836 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
837
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
838 /// 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
839 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
840 sizeof(ogg_stream_t));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
841 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
842 /// Get the stream serial number
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
843 s_no = ogg_page_serialno(page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
844 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
845 mp_msg(MSGT_DEMUX, MSGL_DBG2,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
846 "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
847 // Take the first page
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
848 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
849 // Get first packet of the page
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
850 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
851
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
852 // Reset our vars
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
853 sh_a = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
854 sh_v = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
855
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
856 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
857
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
858 // Check for Vorbis
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
859 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
860 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
861 sh_a->format = FOURCC_VORBIS;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
862 ogg_d->subs[ogg_d->num_sub].vorbis = 1;
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].id = n_audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
864 n_audio++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
865 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
866 "[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
867 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
868 } 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
869 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
870 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
871 sh_a->format = FOURCC_SPEEX;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
872 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
873 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
874 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
875 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
876 sh_a->wf->nBlockAlign = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
877 sh_a->wf->wBitsPerSample = 16;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
878 sh_a->samplesize = 2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
879 sh_a->wf->cbSize = pack.bytes;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
880 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
881
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
882 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate;
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].speex = 1;
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].id = n_audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
885 n_audio++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
886 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
887 "[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
888 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
889
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
890 // check for Theora
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
891 #ifdef CONFIG_OGGTHEORA
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
892 } 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
893 int errorCode = 0;
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
894 th_info ti;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
895 th_comment tc;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
896 th_setup_info *tsi = NULL;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
897
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
898 th_info_init (&ti);
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
899 th_comment_init (&tc);
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
900
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
901 errorCode = th_decode_headerin(&ti, &tc, &tsi, &pack);
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
902 if (errorCode < 0) {
30999
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;
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
911 sh_v->fps = ((double)ti.fps_numerator) / (double)ti.fps_denominator;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
912 sh_v->frametime = ((double)ti.fps_denominator) / (double)ti.fps_numerator;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
913 sh_v->i_bps = ti.target_bitrate / 8;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
914 sh_v->disp_w = sh_v->bih->biWidth = ti.frame_width;
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
915 sh_v->disp_h = sh_v->bih->biHeight = ti.frame_height;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
916 sh_v->bih->biBitCount = 24;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
917 sh_v->bih->biPlanes = 3;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
918 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount / 8) * sh_v->bih->biWidth * sh_v->bih->biHeight);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
919 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
920 ogg_d->subs[ogg_d->num_sub].theora = 1;
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
921 ogg_d->subs[ogg_d->num_sub].keyframe_granule_shift = ti.keyframe_granule_shift;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
922 ogg_d->subs[ogg_d->num_sub].id = n_video;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
923 n_video++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
924 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
925 "[Ogg] stream %d: video (Theora v%d.%d.%d), -vid %d\n",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
926 ogg_d->num_sub,
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
927 (int)ti.version_major,
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
928 (int)ti.version_minor,
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
929 (int)ti.version_subminor,
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
930 n_video - 1);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
931 if (mp_msg_test(MSGT_HEADER, MSGL_V))
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
932 print_video_header(sh_v->bih, MSGL_V);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
933 }
34415
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
934 th_comment_clear(&tc);
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
935 th_info_clear(&ti);
55ff5df09657 Port libtheora glue code to Theora 1.0 API.
diego
parents: 32537
diff changeset
936 th_setup_free(tsi);
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
937 #endif /* CONFIG_OGGTHEORA */
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
938 } 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
939 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
940 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
941 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
942 n_audio++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
943 ogg_d->subs[ogg_d->num_sub].flac = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
944 sh_a->wf = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
945 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
946 "[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
947 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
948 } 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
949 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
950 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
951 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
952 n_audio++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
953 ogg_d->subs[ogg_d->num_sub].flac = 2;
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
954 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
955 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
956 sh_a->wf->cbSize = 34;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
957 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
958 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
959 "[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
960 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
961
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
962 /// Check for old header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
963 } else if (pack.bytes >= 142 &&
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
964 !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
965
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
966 // Old video header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
967 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
968 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
969 sh_v->bih = calloc(1, sizeof(*sh_v->bih));
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
970 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
971 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
972 pack.packet[70], pack.packet[71]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
973 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
974 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
975 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
976 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
977 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
978 if (!sh_v->bih->biBitCount)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
979 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
980 sh_v->bih->biPlanes = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
981 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
982
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
983 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
984 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
985 n_video++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
986 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
987 "[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
988 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
989 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
990 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
991 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
992 // Old audio header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
993 } 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
994 unsigned int extra_size;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
995
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31000
diff changeset
996 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
997 extra_size = AV_RL16(pack.packet + 140);
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
998 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
999 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
1000 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
1001 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
1002 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
1003 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
1004 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
1005 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
1006 sh_a->wf->cbSize = extra_size;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1007 if (extra_size > 0)
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
1008 memcpy(sh_a->wf + 1,
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1009 pack.packet + 142, extra_size);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1010
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1011 ogg_d->subs[ogg_d->num_sub].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
1012 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
1013 n_audio++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1014 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1015 "[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
1016 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
1017 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
1018 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
1019 } else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1020 mp_msg(MSGT_DEMUX, MSGL_WARN,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1021 "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
1022 ogg_d->num_sub);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1023
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1024 // Check new header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1025 } 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
1026 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
1027 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
1028 /// New video header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1029 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
1030 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
1031 sh_v->bih = calloc(1, sizeof(*sh_v->bih));
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
1032 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
1033 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
1034 st->subtype[2], st->subtype[3]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1035 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
1036 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
1037 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
1038 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
1039 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
1040 if (!sh_v->bih->biBitCount)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1041 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
1042 sh_v->bih->biPlanes = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1043 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
1044
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1045 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1046 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
1047 n_video++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1048 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1049 "[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
1050 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
1051 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
1052 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
1053 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
1054 /// New audio header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1055 } 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
1056 char buffer[5];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1057 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
1058 unsigned int extra_offset = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1059
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1060 memcpy(buffer, st->subtype, 4);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1061 buffer[4] = '\0';
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1062
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1063 /* 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
1064 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
1065 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
1066 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
1067 just skip them here. */
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1068 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
1069 extra_size -= 4;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1070 extra_offset = 4;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1071 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1072
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31000
diff changeset
1073 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
1074 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
1075 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
1076 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
1077 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
1078 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
1079 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
1080 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
1081 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
1082 sh_a->wf->cbSize = extra_size;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1083 if (extra_size)
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
1084 memcpy(sh_a->wf+1,
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1085 ((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
1086
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1087 ogg_d->subs[ogg_d->num_sub].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
1088 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
1089 n_audio++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1090 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1091 "[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
1092 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
1093 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
1094 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
1095
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1096 /// Check for text (subtitles) header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1097 } 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
1098 mp_msg(MSGT_DEMUX, MSGL_INFO,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1099 "[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
1100 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
1101 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
1102 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
1103 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
1104 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
1105 text_id = ogg_d->num_sub;
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31000
diff changeset
1106 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
1107 ogg_d->n_text++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1108 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
1109 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
1110 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
1111 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
1112 //// Unknown header type
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1113 } else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1114 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1115 "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
1116 ogg_d->num_sub);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1117 /// Unknown (invalid ?) header
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1118 } else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1119 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1120 "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
1121 ogg_d->num_sub);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1122
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1123 if (sh_a || sh_v) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1124 demux_stream_t *ds = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1125 if (sh_a) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1126 // 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
1127 if (demuxer->audio->id == -1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1128 demuxer->audio->id = n_audio - 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1129 //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
1130 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1131 /// Is it the stream we want
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1132 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
1133 demuxer->audio->sh = sh_a;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1134 sh_a->ds = demuxer->audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1135 ds = demuxer->audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1136 audio_id = ogg_d->num_sub;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1137 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1138 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1139 if (sh_v) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1140 /// Also for video
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1141 if (demuxer->video->id == -1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1142 demuxer->video->id = n_video - 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1143 //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
1144 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1145 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
1146 demuxer->video->sh = sh_v;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1147 sh_v->ds = demuxer->video;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1148 ds = demuxer->video;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1149 video_id = ogg_d->num_sub;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1150 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1151 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1152 /// 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
1153 if (ds && !s->end_pos) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1154 /// 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
1155 do {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1156 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
1157 ogg_d->num_sub, &pack);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1158 } 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
1159 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1160 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1161 ogg_d->num_sub++;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1162 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1163
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1164 if (!n_video && !n_audio) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1165 goto err_out;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1166 }
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
1167
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1168 if (!n_video || video_id < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1169 demuxer->video->id = -2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1170 else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1171 demuxer->video->id = video_id;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1172 if (!n_audio || audio_id < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1173 demuxer->audio->id = -2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1174 else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1175 demuxer->audio->id = audio_id;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1176 /* 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
1177 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
1178 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
1179 if (!ogg_d->n_text)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1180 demuxer->sub->id = -2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1181 else if (text_id >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1182 demuxer->sub->id = text_id;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1183 mp_msg(MSGT_DEMUX, MSGL_V,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1184 "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
1185 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1186
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1187 ogg_d->final_granulepos = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1188 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
1189 if (!s->end_pos) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1190 demuxer->seekable = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1191 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1192 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
1193 demuxer->movi_end = s->end_pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1194 demuxer->seekable = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1195 demux_ogg_scan_stream(demuxer);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1196 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1197 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
1198 ogg_d->initial_granulepos = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1199 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
1200
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1201 mp_msg(MSGT_DEMUX, MSGL_V,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1202 "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
1203 n_audio, n_audio > 1 ? "s" : "",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1204 n_video, n_video > 1 ? "s" : "",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1205 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
1206
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1207 sh_a = demuxer->audio->sh;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1208 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
1209 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
1210
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1211 return DEMUXER_TYPE_OGG;
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1212
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1213 err_out:
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1214 return 0;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1215 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1216
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1217 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
1218 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1219 ogg_demuxer_t *ogg_d;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1220 stream_t *s;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1221 demux_stream_t *ds;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1222 ogg_sync_state *sync;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1223 ogg_stream_state *os;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1224 ogg_page *page;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1225 ogg_packet pack;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1226 int np = 0, id=0;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1227
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1228 s = d->stream;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1229 ogg_d = d->priv;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1230 sync = &ogg_d->sync;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1231 page = &ogg_d->page;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1232
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1233 /// 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
1234 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
1235 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
1236 return 0;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1237 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1238
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1239 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1240 np = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1241 ds = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1242 /// 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
1243 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
1244 /// 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
1245 if (np == 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1246 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1247 int pa, len;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1248 char *buf;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1249
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1250 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
1251 /// 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
1252 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
1253 /// Error : we skip some bytes
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1254 if (pa < 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1255 mp_msg(MSGT_DEMUX, MSGL_WARN,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1256 "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
1257 ogg_d->pos -= pa;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1258 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1259 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1260 /// We need more data
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1261 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
1262 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
1263 if (len == 0 && s->eof) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1264 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
1265 return 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1266 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1267 ogg_sync_wrote(sync, len);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1268 } /// Page loop
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1269 ogg_d->last_size = pa;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1270 /// Find the page's logical stream
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1271 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
1272 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1273 "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
1274 return 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1275 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1276 /// Take the page
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1277 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
1278 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1279 /// Page was invalid => retry
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1280 mp_msg(MSGT_DEMUX, MSGL_WARN,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1281 "Ogg demuxer : got invalid page !!!!!\n");
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1282 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
1283 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1284 } else /// Packet was corrupted
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1285 mp_msg(MSGT_DEMUX, MSGL_WARN,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1286 "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
1287 } /// Packet loop
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1288
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1289 /// 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
1290 if (id == d->audio->id)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1291 ds = d->audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1292 else if (id == d->video->id)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1293 ds = d->video;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1294 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
1295 ds = d->sub;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1296
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1297 if (ds) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1298 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
1299 continue; /// Unuseful packet, get another
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1300 d->filepos = ogg_d->pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1301 return 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1302 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1303 } /// while (1)
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1304 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1305
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1306 /// 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
1307 // 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
1308 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
1309 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1310 demuxer_t *od;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1311 ogg_demuxer_t *ogg_d;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1312 stream_t *s;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1313 uint32_t hdrsizes[3];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1314 demux_packet_t *dp;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1315 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
1316 int np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1317 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
1318 int i;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1319 unsigned char *p = NULL, *buf;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1320 int plen;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1321
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1322 /// 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
1323 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
1324 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1325 "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
1326 goto fallback;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1327 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1328 /// 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
1329 extradata += 22;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1330 for (i = 0; i < 3; i++) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1331 hdrsizes[i] = AV_RL32(extradata);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1332 extradata += 4;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1333 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1334 // 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
1335
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1336 /// Check the size
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1337 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
1338 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1339 "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
1340 goto fallback;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1341 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1342
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1343 // Build the ogg demuxer private datas
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1344 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
1345 ogg_d->num_sub = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1346 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
1347 ogg_d->subs[0].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1348
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1349 // Init the ogg physical stream
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1350 ogg_sync_init(&ogg_d->sync);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1351
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1352 // 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
1353 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
1354 if (np < 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1355 mp_msg(MSGT_DEMUX, MSGL_ERR,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1356 "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
1357 free(ogg_d);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1358 goto fallback;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1359 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1360 // Add some data
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1361 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
1362 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
1363 memcpy(buf, p, plen);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1364 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
1365 }
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1366 // Init the logical stream
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1367 mp_msg(MSGT_DEMUX, MSGL_DBG2,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1368 "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
1369 ogg_page_serialno(&ogg_d->page));
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1370 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
1371 // Write the page
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1372 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
1373
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1374 // 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
1375 s = new_ds_stream(demuxer->audio);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1376 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
1377
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1378 /// 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
1379 for (i = 0; i < 3; i++) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1380 dp = new_demux_packet(hdrsizes[i]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1381 memcpy(dp->buffer, extradata, hdrsizes[i]);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1382 ds_add_packet(od->audio, dp);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1383 extradata += hdrsizes[i];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1384 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1385
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1386 // Finish setting up the ogg demuxer
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1387 od->priv = ogg_d;
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31000
diff changeset
1388 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
1389 od->audio->id = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1390 od->video->id = -2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1391 od->audio->sh = sh_audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1392 sh_audio->ds = od->audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1393 sh_audio->format = FOURCC_VORBIS;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1394 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
1395
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1396 /// Return the joined demuxers
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1397 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
1398
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1399 fallback:
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1400 demuxer->audio->id = -2;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1401 return demuxer;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1402
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1403 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1404
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1405 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
1406 float audio_delay, int flags)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1407 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1408 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
1409 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
1410 ogg_page* page= &ogg_d->page;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1411 ogg_stream_state *oss;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1412 ogg_stream_t *os;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1413 demux_stream_t *ds;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1414 ogg_packet op;
34431
13df2e44dd58 Change a few more pts-related float to double.
reimar
parents: 34430
diff changeset
1415 double rate;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1416 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
1417 vorbis_info *vi = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1418 int64_t gp = 0, old_gp;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1419 off_t pos, old_pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1420 int np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1421 int is_gp_valid;
34428
438e8d189753 Calculate Ogg timestamps as double instead of float.
reimar
parents: 34415
diff changeset
1422 double pts;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1423 int is_keyframe;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1424 int samplesize = 1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1425 ogg_int64_t granulepos_orig;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1426
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1427 if (demuxer->video->id >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1428 ds = demuxer->video;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1429 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
1430 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1431 ds = demuxer->audio;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1432 os = &ogg_d->subs[ds->id];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1433 vi = &(os->vi);
34429
9becec2ec9bc Remove pointless cast.
reimar
parents: 34428
diff changeset
1434 rate = vi->rate;
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1435 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
1436 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1437
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1438 os = &ogg_d->subs[ds->id];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1439 oss = &os->stream;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1440
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1441 old_gp = os->lastpos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1442 old_pos = ogg_d->pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1443
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1444 //calculate the granulepos to seek to
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1445 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
1446 if (flags & SEEK_FACTOR) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1447 if (ogg_d->duration > 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1448 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
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 * (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
1451 } else
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1452 gp += rel_seek_secs * rate;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1453 if (gp < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1454 gp = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1455
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1456 //calculate the filepos to seek to
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1457 if (ogg_d->syncpoints) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1458 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
1459 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
1460 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1461
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1462 if (sp >= ogg_d->num_syncpoint)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1463 return;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1464 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
1465 sp--;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1466 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
1467 if (sp > 0 && 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 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
1470 sp++;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1471 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1472 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
1473 precision = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1474 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1475 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
1476 if (flags & SEEK_FACTOR)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1477 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
1478 else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1479 if (ogg_d->duration > 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1480 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
1481 } else if (os->lastpos > 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1482 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
1483 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1484 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1485 if (pos < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1486 pos = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1487 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
1488 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
1489 } // if (ogg_d->syncpoints)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1490
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1491 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1492 if (do_seek) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1493 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
1494 ogg_sync_reset(sync);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1495 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
1496 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
1497 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
1498 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1499 ogg_d->pos = pos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1500 ogg_d->last_size = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1501 /* 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
1502 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
1503 os->lastpos = gp;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1504 first = !(ogg_d->syncpoints);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1505 do_seek=0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1506 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1507 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
1508 ogg_d->last_size = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1509 np = ogg_sync_pageseek(sync, page);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1510
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1511 if (np < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1512 ogg_d->pos -= np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1513 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
1514 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
1515 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
1516
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1517 if (len == 0 && demuxer->stream->eof) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1518 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
1519 return;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1520 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1521 ogg_sync_wrote(sync, len);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1522 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1523 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1524 ogg_d->last_size = np;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1525 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
1526 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1527
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1528 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
1529 continue;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1530
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1531 while (1) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1532 np = ogg_stream_packetout(oss, &op);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1533 if (np < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1534 continue;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1535 else if (np == 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1536 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1537 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
1538 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
1539 complete or not. */
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1540 first = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1541 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1542 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1543 is_gp_valid = (op.granulepos >= 0);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1544 granulepos_orig=op.granulepos;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1545 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
1546 if (precision && is_gp_valid) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1547 precision--;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1548 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
1549 //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
1550 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
1551 if (pos < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1552 pos = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1553 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
1554 do_seek=1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1555 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1556 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1557 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1558 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1559 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
1560 && 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
1561 /* 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
1562 destroyed the backward search */
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1563 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
1564 if (pos < 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1565 pos = 0;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1566 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
1567 do_seek=1;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1568 break;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1569 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1570 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1571 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
1572 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
1573 vo_sub = &ogg_sub;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1574 vo_osd_changed(OSDTYPE_SUBTITLE);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1575 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1576 op.granulepos=granulepos_orig;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1577 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
1578 return;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1579 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1580 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1581 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1582
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1583 mp_msg(MSGT_DEMUX, MSGL_ERR, "Can't find the good packet :(\n");
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1584 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1585
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1586 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
1587 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1588 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
1589 ogg_stream_t *os = NULL;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1590 int i;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1591
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1592 if (!ogg_d)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1593 return;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1594
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
1595 #ifdef CONFIG_ICONV
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1596 subcp_close();
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1597 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1598
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1599 ogg_sync_clear(&ogg_d->sync);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1600 if (ogg_d->subs) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1601 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
1602 os = &ogg_d->subs[i];
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1603 ogg_stream_clear(&os->stream);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1604 if (os->vi_initialized)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1605 vorbis_info_clear(&os->vi);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1606 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1607 free(ogg_d->subs);
21811
ff1d5576063f Do not access ogg_d->subs after freeing it.
reimar
parents: 21531
diff changeset
1608 }
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32467
diff changeset
1609 free(ogg_d->syncpoints);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32467
diff changeset
1610 free(ogg_d->text_ids);
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1611 if (ogg_d->text_langs) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1612 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
1613 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
1614 free(ogg_d->text_langs);
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1615 }
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1616 free(ogg_d);
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1617 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1618
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1619 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
1620 {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1621 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
1622 ogg_stream_t *os;
34431
13df2e44dd58 Change a few more pts-related float to double.
reimar
parents: 34430
diff changeset
1623 double rate;
11577
alex
parents: 11576
diff changeset
1624
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1625 if (demuxer->video->id >= 0) {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1626 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
1627 rate = os->samplerate;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1628 } else {
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1629 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
1630 rate = os->vi.rate;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1631 }
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1632
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1633 switch(cmd) {
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1634 case DEMUXER_CTRL_GET_TIME_LENGTH:
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1635 if (ogg_d->duration <= 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1636 return DEMUXER_CTRL_DONTKNOW;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1637 *(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
1638 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
1639
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1640 case DEMUXER_CTRL_GET_PERCENT_POS:
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1641 if (ogg_d->duration <= 0)
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1642 return DEMUXER_CTRL_DONTKNOW;
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1643 *(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
1644 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
1645
30999
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1646 default:
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1647 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
1648 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1649 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1650
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25495
diff changeset
1651 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
1652 "Ogg demuxer",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1653 "ogg",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1654 "Ogg",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1655 "?",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1656 "",
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1657 DEMUXER_TYPE_OGG,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1658 1, // safe autodetect
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1659 demux_ogg_open,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1660 demux_ogg_fill_buffer,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1661 NULL,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1662 demux_close_ogg,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1663 demux_ogg_seek,
abb0b5990ec8 cosmetics: reindent demux_ogg.c to K&R style plus some prettyprinting
diego
parents: 30837
diff changeset
1664 demux_ogg_control
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1665 };