annotate libmpdemux/demux_ogg.c @ 29464:32ee4e7438ac

Indent.
author ramiro
date Thu, 13 Aug 2009 13:18:59 +0000
parents 4a1c217a844b
children 54145563612e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
2 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
3 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
5 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
7 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
8 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
12 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
13 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
14 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
17 */
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
18
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
19 #include "config.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
20
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
21 #include <stdlib.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
22 #include <stdio.h>
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
23 #include <string.h>
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
24 #include <assert.h>
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
25 #include <math.h>
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18468
diff changeset
26 #include <inttypes.h>
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
27
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
28 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
29 #include "help_mp.h"
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 21828
diff changeset
30 #include "stream/stream.h"
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
31 #include "demuxer.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
32 #include "stheader.h"
23312
f625b826ec32 Reuse AV_RL macros in ogg demuxer instead of its own overcomplicated implementations of it.
reimar
parents: 23262
diff changeset
33 #include "libavutil/intreadwrite.h"
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
34
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
35 #define FOURCC_VORBIS mmioFOURCC('v', 'r', 'b', 's')
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
36 #define FOURCC_SPEEX mmioFOURCC('s', 'p', 'x', ' ')
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
37 #define FOURCC_THEORA mmioFOURCC('t', 'h', 'e', 'o')
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
38
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27393
diff changeset
39 #ifdef CONFIG_TREMOR
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
40 #include <tremor/ogg.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
41 #include <tremor/ivorbiscodec.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
42 #else
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
43 #include <ogg/ogg.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
44 #include <vorbis/codec.h>
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
45 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
46
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
47 #ifdef CONFIG_OGGTHEORA
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
48 #include <theora/theora.h>
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27397
diff changeset
49 int _ilog (unsigned int); /* defined in many places in theora/lib/ */
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
50 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
51
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
52 #define BLOCK_SIZE 4096
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
53
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
54 /* Theora decoder context : we won't be able to interpret granule positions
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
55 * without using theora_granule_time with the theora_state of the stream.
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
56 * 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
57 */
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
58 #ifdef CONFIG_OGGTHEORA
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
59 typedef struct theora_struct_st {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
60 theora_state st;
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
61 theora_comment cc;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
62 theora_info inf;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
63 } theora_struct_t;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
64 #endif
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
65
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
66 //// OggDS headers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
67 // Header for the new header format
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
68 typedef struct stream_header_video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
69 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
70 ogg_int32_t width;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
71 ogg_int32_t height;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
72 } stream_header_video;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
73
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
74 typedef struct stream_header_audio
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
75 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
76 ogg_int16_t channels;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
77 ogg_int16_t blockalign;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
78 ogg_int32_t avgbytespersec;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
79 } stream_header_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
80
13881
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
81 typedef struct __attribute__((__packed__)) stream_header
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
82 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
83 char streamtype[8];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
84 char subtype[4];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
85
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
86 ogg_int32_t size; // size of the structure
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
87
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
88 ogg_int64_t time_unit; // in reference time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
89 ogg_int64_t samples_per_unit;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
90 ogg_int32_t default_len; // in media time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
91
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
92 ogg_int32_t buffersize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
93 ogg_int16_t bits_per_sample;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
94
13881
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
95 ogg_int16_t padding;
e69a40dc1a19 Fix member alignment for usage on 64bit processors.
mosu
parents: 13803
diff changeset
96
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
97 union
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
98 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
99 // Video specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
100 stream_header_video video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
101 // Audio specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
102 stream_header_audio audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
103 } sh;
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 {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
109 int64_t granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
110 off_t page_pos;
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 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
115 /// Timestamping stuff
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
116 float samplerate; /// granulpos 2 time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
117 int64_t lastpos;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
118 int32_t lastsize;
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
119 int keyframe_frequency_force;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
120
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
121 // Logical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
122 ogg_stream_state stream;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
123 int hdr_packets;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
124 int vorbis;
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
125 int speex;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
126 int theora;
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
127 int flac;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
128 int text;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
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
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
131 vorbis_info vi;
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25883
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
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
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 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
138 /// Physical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
139 ogg_sync_state sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
140 /// Current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
141 ogg_page page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
142 /// Logical streams
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
143 ogg_stream_t *subs;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
144 int num_sub;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
145 ogg_syncpoint_t* syncpoints;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
146 int num_syncpoint;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
147 off_t pos, last_size;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
148 int64_t final_granulepos;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
149
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
150 /* Used for subtitle switching. */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
151 int n_text;
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
152 int *text_ids;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
153 char **text_langs;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
154 } ogg_demuxer_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
155
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
156 #define NUM_VORBIS_HDR_PACKETS 3
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
157
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
158 /// Some defines from OggDS
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
159 #define PACKET_TYPE_HEADER 0x01
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
160 #define PACKET_TYPE_BITS 0x07
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
161 #define PACKET_LEN_BITS01 0xc0
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
162 #define PACKET_LEN_BITS2 0x02
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
163 #define PACKET_IS_SYNCPOINT 0x08
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
164
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
165 extern char *dvdsub_lang, *audio_lang;
13501
a5004eb92a79 fix sub_select fiasco with global sub numbering. now multiple sub sources can be managed in essentially one list.
joey
parents: 13127
diff changeset
166 extern int dvdsub_id;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
167
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
168 //-------- subtitle support - should be moved to decoder layer, and queue
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
169 // - subtitles up in demuxer buffer...
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
170
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
171 #include "subreader.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16915
diff changeset
172 #include "libvo/sub.h"
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
173 #define OGG_SUB_MAX_LINE 128
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
174
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
175 static subtitle ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
176 //FILE* subout;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
177
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
178 void demux_ogg_add_sub (ogg_stream_t* os,ogg_packet* pack) {
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
179 int lcv;
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
180 char *packet = pack->packet;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
181
20494
30fce0f93ad1 Make sure we do not read beyond end of subtitle packet
reimar
parents: 20493
diff changeset
182 if (pack->bytes < 4)
30fce0f93ad1 Make sure we do not read beyond end of subtitle packet
reimar
parents: 20493
diff changeset
183 return;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
184 mp_msg(MSGT_DEMUX,MSGL_DBG2,"\ndemux_ogg_add_sub %02X %02X %02X '%s'\n",
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
185 (unsigned char)packet[0],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
186 (unsigned char)packet[1],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
187 (unsigned char)packet[2],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
188 &packet[3]);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
189
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
190 if (((unsigned char)packet[0]) == 0x88) { // some subtitle text
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
191 // Find data start
21828
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
192 double endpts = MP_NOPTS_VALUE;
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
193 int32_t duration = 0;
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
194 int16_t hdrlen = (*packet & PACKET_LEN_BITS01)>>6, i;
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
195 hdrlen |= (*packet & PACKET_LEN_BITS2) <<1;
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
196 lcv = 1 + hdrlen;
20494
30fce0f93ad1 Make sure we do not read beyond end of subtitle packet
reimar
parents: 20493
diff changeset
197 if (pack->bytes < lcv)
30fce0f93ad1 Make sure we do not read beyond end of subtitle packet
reimar
parents: 20493
diff changeset
198 return;
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
199 for (i = hdrlen; i > 0; i--) {
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
200 duration <<= 8;
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
201 duration |= (unsigned char)packet[i];
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
202 }
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
203 if (hdrlen > 0 && duration > 0) {
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
204 float pts;
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
205 if(pack->granulepos == -1)
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
206 pack->granulepos = os->lastpos + os->lastsize;
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
207 pts = (float)pack->granulepos/(float)os->samplerate;
21828
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
208 endpts = 1.0 + pts + (float)duration/1000.0;
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
209 }
21828
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
210 sub_clear_text(&ogg_sub, MP_NOPTS_VALUE);
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
211 sub_add_text(&ogg_sub, &packet[lcv], pack->bytes - lcv, endpts);
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
212 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
213
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
214 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg sub lines: %d first: '%s'\n",
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
215 ogg_sub.lines, ogg_sub.text[0]);
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
216 #ifdef CONFIG_ICONV
20292
4f5c3fbbbba5 redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents: 19802
diff changeset
217 subcp_recode(&ogg_sub);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
218 #endif
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
219 vo_sub = &ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
220 vo_osd_changed(OSDTYPE_SUBTITLE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
221 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
222
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
223
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
224 // 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
225 // fill os if non NULL and return the stream id
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
226 static int demux_ogg_get_page_stream(ogg_demuxer_t* ogg_d,ogg_stream_state** os) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
227 int id,s_no;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
228 ogg_page* page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
229
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
230 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
231
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
232 for(id= 0; id < ogg_d->num_sub ; id++) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
233 if(s_no == ogg_d->subs[id].stream.serialno)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
234 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
235 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
236
10363
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
237 if(id == ogg_d->num_sub) {
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
238 // If we have only one vorbis stream allow the stream id to change
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
239 // it's normal on radio stream (each song have an different id).
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
240 // But we (or the codec?) should check that the samplerate, etc
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
241 // doesn't change (for radio stream it's ok)
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
242 if(ogg_d->num_sub == 1 && ogg_d->subs[0].vorbis) {
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
243 ogg_stream_reset(&ogg_d->subs[0].stream);
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
244 ogg_stream_init(&ogg_d->subs[0].stream,s_no);
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
245 id = 0;
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
246 } else
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
247 return -1;
3c7db8070985 A little hack to be able to play ogg radio stream
albeu
parents: 10092
diff changeset
248 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
249
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
250 if(os)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
251 *os = &ogg_d->subs[id].stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
252
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
253 return id;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
254
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
255 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
256
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
257 static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,float* pts,int* flags, int samplesize) {
17785
adc0e54034f0 in demux_ogg_read_packet initialize data to whole packet, reduces code and
reimar
parents: 17636
diff changeset
258 unsigned char* data = pack->packet;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
259
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
260 *pts = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
261 *flags = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
262
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
263 if(os->vorbis) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
264 if(*pack->packet & PACKET_TYPE_HEADER)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
265 os->hdr_packets++;
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25883
diff changeset
266 else if (os->vi_initialized)
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
267 {
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
268 vorbis_info *vi;
18465
c3c68110f601 10^100l c++ declarations
rfelker
parents: 18430
diff changeset
269 int32_t blocksize;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
270
11000
6e35326c742f many small typo and grammar fixes
gabucino
parents: 10800
diff changeset
271 // When we dump the audio, there is no vi, but we don't care of timestamp in this case
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
272 vi = &(os->vi);
18465
c3c68110f601 10^100l c++ declarations
rfelker
parents: 18430
diff changeset
273 blocksize = vorbis_packet_blocksize(vi,pack) / samplesize;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
274 // Calculate the timestamp if the packet don't have any
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
275 if(pack->granulepos == -1) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
276 pack->granulepos = os->lastpos;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
277 if(os->lastsize > 0)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
278 pack->granulepos += os->lastsize;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
279 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
280 *pts = pack->granulepos / (float)vi->rate;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
281 os->lastsize = blocksize;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
282 os->lastpos = pack->granulepos;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
283 }
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
284 } else if (os->speex) {
17785
adc0e54034f0 in demux_ogg_read_packet initialize data to whole packet, reduces code and
reimar
parents: 17636
diff changeset
285 // whole packet (default)
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
286 # ifdef CONFIG_OGGTHEORA
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
287 } else if (os->theora) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
288 /* we pass complete packets to theora, mustn't strip the header! */
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
289 os->lastsize = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
290
25198
22c1f7cd553f Fix some typos in comments, grammar is still bad.
reimar
parents: 24144
diff changeset
291 /* header packets begin on 1-bit: thus check (*data&0x80). We don't
10711
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
292 have theora_state st, until all header packets were passed to the
bc1aad87439a Fix for Theora files without audio. Patch by David Kuehling <dvdkhlng@gmx.de>.
mosu
parents: 10658
diff changeset
293 decoder. */
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
294 if (!(*data&0x80))
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
295 {
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
296 int keyframe_granule_shift=_ilog(os->keyframe_frequency_force-1);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
297 int64_t iframemask = (1 << keyframe_granule_shift) - 1;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
298
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
299 if (pack->granulepos >= 0)
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
300 {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
301 os->lastpos = pack->granulepos >> keyframe_granule_shift;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
302 os->lastpos += pack->granulepos & iframemask;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
303 *flags = (pack->granulepos & iframemask) == 0;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
304 }
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
305 else
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
306 {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
307 os->lastpos++;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
308 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
309 pack->granulepos = os->lastpos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
310 *pts = (double)os->lastpos / (double)os->samplerate;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
311 }
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
312 #endif /* CONFIG_OGGTHEORA */
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
313 } else if (os->flac) {
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
314 /* we pass complete packets to flac, mustn't strip the header! */
20489
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
315 if (os->flac == 2 && pack->packet[0] != 0xff)
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
316 return NULL;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
317 } else {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
318 if(*pack->packet & PACKET_TYPE_HEADER)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
319 os->hdr_packets++;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
320 else {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
321 // Find data start
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
322 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
323 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) <<1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
324 data = pack->packet + 1 + hdrlen;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
325 // Calculate the timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
326 if(pack->granulepos == -1)
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
327 pack->granulepos = os->lastpos + (os->lastsize ? os->lastsize : 1);
23873
49a433e2e78f cosmetics: misc typo fixes
diego
parents: 23866
diff changeset
328 // If we already have a timestamp it can be a syncpoint
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
329 if(*pack->packet & PACKET_IS_SYNCPOINT)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
330 *flags = 1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
331 *pts = pack->granulepos/os->samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
332 // Save the packet length and timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
333 os->lastsize = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
334 while(hdrlen) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
335 os->lastsize <<= 8;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
336 os->lastsize |= pack->packet[hdrlen];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
337 hdrlen--;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
338 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
339 os->lastpos = pack->granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
340 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
341 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
342 return data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
343 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
344
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
345 // check if clang has substring from comma separated langlist
25495
5cbf0cbeef7c Add some const/static qualifiers as appropriate
reimar
parents: 25494
diff changeset
346 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
347 {
25495
5cbf0cbeef7c Add some const/static qualifiers as appropriate
reimar
parents: 25494
diff changeset
348 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
349
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
350 if (!langlist || !*langlist)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
351 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
352 while ((c = strchr(langlist, ',')))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
353 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
354 if (!strncasecmp(clang, langlist, c - langlist))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
355 return 1;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
356 langlist = &c[1];
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
357 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
358 if (!strncasecmp(clang, langlist, strlen(langlist)))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
359 return 1;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
360 return 0;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
361 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
362
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
363 static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id);
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
364
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
365 /// Try to print out comments and also check for LANGUAGE= tag
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
366 static void demux_ogg_check_comments(demuxer_t *d, ogg_stream_t *os, int id, vorbis_comment *vc)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
367 {
19110
08888397444e marks several strings inside structs as const when they hold just
reynaldo
parents: 19053
diff changeset
368 const char *hdr, *val;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
369 char **cmt = vc->user_comments;
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
370 int index, i;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
371 ogg_demuxer_t *ogg_d = d->priv;
25495
5cbf0cbeef7c Add some const/static qualifiers as appropriate
reimar
parents: 25494
diff changeset
372 static const struct table {
19110
08888397444e marks several strings inside structs as const when they hold just
reynaldo
parents: 19053
diff changeset
373 const char *ogg;
08888397444e marks several strings inside structs as const when they hold just
reynaldo
parents: 19053
diff changeset
374 const char *mp;
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
375 } table[] = {
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
376 { "ENCODED_USING", "Software" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
377 { "ENCODER_URL", "Encoder URL" },
29288
4a1c217a844b In all demux_info_add calls change "name" to "title".
reimar
parents: 29263
diff changeset
378 { "TITLE", "Title" },
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
379 { "ARTIST", "Artist" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
380 { "COMMENT", "Comments" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
381 { "DATE", "Creation Date" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
382 { "GENRE", "Genre" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
383 { "ALBUM", "Album" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
384 { "TRACKNUMBER", "Track" },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
385 { NULL, NULL },
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
386 };
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
387
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
388 while(*cmt)
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
389 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
390 hdr = NULL;
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
391 if (!strncasecmp(*cmt, "LANGUAGE=", 9))
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
392 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
393 val = *cmt + 9;
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 17977
diff changeset
394 if (ogg_d->subs[id].text)
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 17977
diff changeset
395 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", ogg_d->subs[id].id, val);
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 17977
diff changeset
396 else if (id != d->video->id)
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 17977
diff changeset
397 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", ogg_d->subs[id].id, val);
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
398 if (ogg_d->subs[id].text)
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
399 mp_msg(MSGT_DEMUX, MSGL_INFO, "[Ogg] Language for -sid %d is '-slang \"%s\"'\n", ogg_d->subs[id].id, val);
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
400 // copy this language name into the array
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
401 index = demux_ogg_sub_reverse_id(d, id);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
402 if (index >= 0) {
26084
ec5749eb6f5f Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents: 25962
diff changeset
403 sh_sub_t* sh;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
404 // in case of malicious files with more than one lang per track:
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
405 if (ogg_d->text_langs[index]) free(ogg_d->text_langs[index]);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
406 ogg_d->text_langs[index] = strdup(val);
26084
ec5749eb6f5f Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents: 25962
diff changeset
407 sh = d->s_streams[index];
ec5749eb6f5f Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents: 25962
diff changeset
408 if (sh && sh->lang) free(sh->lang);
ec5749eb6f5f Fill sh_sub_t.lang in lavf, mkv and ogg demuxers. Use it for printing subtitle
eugeni
parents: 25962
diff changeset
409 if (sh) sh->lang = strdup(val);
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
410 }
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
411 // check for -slang if subs are uninitialized yet
21036
cdf75ea331c9 Make -slang work again, sub->id is -2 by default, so -slang would be ignored
reimar
parents: 21035
diff changeset
412 if (os->text && d->sub->id < 0 && demux_ogg_check_lang(val, dvdsub_lang))
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
413 {
21038
bfd340cdac88 Generalize subtitle switching, demux_ogg does not need a special case
reimar
parents: 21036
diff changeset
414 d->sub->id = index;
13501
a5004eb92a79 fix sub_select fiasco with global sub numbering. now multiple sub sources can be managed in essentially one list.
joey
parents: 13127
diff changeset
415 dvdsub_id = index;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
416 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg demuxer: Displaying subtitle stream id %d which matched -slang %s\n", id, val);
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
417 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
418 else
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
419 hdr = "Language";
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
420 }
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
421 else {
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
422 for (i = 0; table[i].ogg; i++)
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
423 {
23262
a08c4d770870 Ignore comments where no '=' follows the comment name (otherwise
reimar
parents: 22605
diff changeset
424 if (!strncasecmp(*cmt, table[i].ogg, strlen(table[i].ogg)) &&
a08c4d770870 Ignore comments where no '=' follows the comment name (otherwise
reimar
parents: 22605
diff changeset
425 (*cmt)[strlen(table[i].ogg)] == '=')
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
426 {
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
427 hdr = table[i].mp;
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
428 val = *cmt + strlen(table[i].ogg) + 1;
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
429 }
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
430 }
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
431 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
432 if (hdr)
16604
28716eae82c2 Don't pass NULL pointers to demux_info_add()
rtognimp
parents: 16537
diff changeset
433 demux_info_add(d, hdr, val);
16537
13a95663a160 Disassemble comments and pass it to the demux_info interface
alex
parents: 16346
diff changeset
434 mp_dbg(MSGT_DEMUX, MSGL_DBG2, " %s: %s\n", hdr, val);
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
435 cmt++;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
436 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
437 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
438
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
439 /// 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
440 // return 1 if the packet was added, 0 otherwise
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
441 static int demux_ogg_add_packet(demux_stream_t* ds,ogg_stream_t* os,int id,ogg_packet* pack) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
442 demuxer_t* d = ds->demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
443 demux_packet_t* dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
444 unsigned char* data;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
445 float pts = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
446 int flags = 0;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
447 int samplesize = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
448
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
449 // If packet is an comment header then we try to get comments at first
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
450 if (pack->bytes >= 7 && !memcmp(pack->packet, "\003vorbis", 7))
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
451 {
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
452 vorbis_info vi;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
453 vorbis_comment vc;
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
454
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
455 vorbis_info_init(&vi);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
456 vorbis_comment_init(&vc);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
457 vi.rate = 1L; // it's checked by vorbis_synthesis_headerin()
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
458 if(vorbis_synthesis_headerin(&vi, &vc, pack) == 0) // if no errors
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
459 demux_ogg_check_comments(d, os, id, &vc);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
460 vorbis_comment_clear(&vc);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
461 vorbis_info_clear(&vi);
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
462 }
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
463 if (os->text) {
21039
493b34d15885 10l, compilation error in r21054
reimar
parents: 21038
diff changeset
464 if (id == demux_ogg_sub_id(d, d->sub->id)) // don't want to add subtitles to the demuxer for now
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
465 demux_ogg_add_sub(os,pack);
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
466 return 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
467 }
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
468 if (os->speex) {
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
469 // discard first two packets, they contain the header and comment
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
470 if (os->hdr_packets < 2) {
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
471 os->hdr_packets++;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
472 return 0;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
473 }
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
474 } else
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
475 // If packet is an header we jump it except for vorbis and theora
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
476 // (PACKET_TYPE_HEADER bit doesn't even exist for theora ?!)
11464
1efd0f9a946d For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents: 11128
diff changeset
477 // We jump nothing for FLAC. Ain't this great? Packet contents have to be
1efd0f9a946d For FLAC-in-Ogg the packets are NEVER skipped, and there's no such thing as a "packet header byte" like in Ogm streams. Basically the handling for Vorbis != Theora != FLAC != Ogm.
mosu
parents: 11128
diff changeset
478 // handled differently for each and every stream type. The joy! The joy!
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
479 if(!os->flac && (*pack->packet & PACKET_TYPE_HEADER) &&
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
480 (ds != d->audio || ((sh_audio_t*)ds->sh)->format != FOURCC_VORBIS || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) &&
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
481 (ds != d->video || (((sh_video_t*)ds->sh)->format != FOURCC_THEORA)))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
482 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
483
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
484 // For vorbis packet the packet is the data, for other codec we must jump
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
485 // the header
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
486 if(ds == d->audio && ((sh_audio_t*)ds->sh)->format == FOURCC_VORBIS) {
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
487 samplesize = ((sh_audio_t *)ds->sh)->samplesize;
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
488 }
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
489 data = demux_ogg_read_packet(os,pack,&pts,&flags,samplesize);
20489
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
490 if (!data)
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
491 return 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
492
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
493 /// Clear subtitles if necessary (for broken files)
21828
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
494 if (sub_clear_text(&ogg_sub, pts)) {
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
495 vo_sub = &ogg_sub;
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
496 vo_osd_changed(OSDTYPE_SUBTITLE);
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
497 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
498 /// Send the packet
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
499 dp = new_demux_packet(pack->bytes-(data-pack->packet));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
500 memcpy(dp->buffer,data,pack->bytes-(data-pack->packet));
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
501 dp->pts = pts;
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
502 dp->flags = flags;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
503 ds_add_packet(ds,dp);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
504 mp_msg(MSGT_DEMUX,MSGL_DBG2,"New dp: %p ds=%p pts=%5.3f len=%d flag=%d \n",
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
505 dp, ds, pts, dp->len, flags);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
506 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
507 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
508
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
509 /// 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
510 /// otherwise try to get at least the final_granulepos
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
511 void demux_ogg_scan_stream(demuxer_t* demuxer) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
512 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
513 stream_t *s = demuxer->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
514 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
515 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
516 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
517 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
518 ogg_packet op;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
519 int np,sid,p,samplesize=1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
520 off_t pos, last_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
521 pos = last_pos = demuxer->movi_start;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
522
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
523 // Reset the stream
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
524 if(index_mode == 2) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
525 stream_seek(s,demuxer->movi_start);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
526 } else {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
527 //the 270000 are just a wild guess
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21529
diff changeset
528 stream_seek(s,FFMAX(ogg_d->pos,demuxer->movi_end-270000));
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
529 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
530 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
531
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
532 // Get the serial number of the stream we use
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
533 if(demuxer->video->id >= 0) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
534 sid = demuxer->video->id;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
535 }
17218
cffd0ec5d01a fix crash with invalid -vid and no audio stream
reimar
parents: 17090
diff changeset
536 else if(demuxer->audio->id >= 0) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
537 sid = demuxer->audio->id;
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
538 if(((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS) {
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
539 samplesize = ((sh_audio_t*)demuxer->audio->sh)->samplesize;
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
540 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
541 }
17218
cffd0ec5d01a fix crash with invalid -vid and no audio stream
reimar
parents: 17090
diff changeset
542 else return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
543 os = &ogg_d->subs[sid];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
544 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
545
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
546 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
547 np = ogg_sync_pageseek(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
548 if(np < 0) { // We had to skip some bytes
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
549 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_ERR,"Bad page sync while building syncpoints table (%d)\n",-np);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
550 pos += -np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
551 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
552 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
553 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
554 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
555 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
556 if(len == 0 && s->eof)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
557 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
558 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
559 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
560 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
561 // The page is ready
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
562 //ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
563 if(ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
564 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
565 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
566 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
567 if(ogg_stream_pagein(oss,page) != 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
568 mp_msg(MSGT_DEMUX,MSGL_ERR,"Pagein error ????\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
569 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
570 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
571 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
572 p = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
573 while(ogg_stream_packetout(oss,&op) == 1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
574 float pts;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
575 int flags;
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
576 demux_ogg_read_packet(os,&op,&pts,&flags,samplesize);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
577 if(op.granulepos >= 0) ogg_d->final_granulepos = op.granulepos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
578 if(index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) {
18468
3a624063cbc9 accidentally committed this overflow fix with the declaration fix before.
rfelker
parents: 18465
diff changeset
579 if (ogg_d->num_syncpoint > SIZE_MAX / sizeof(ogg_syncpoint_t) - 1) break;
18465
c3c68110f601 10^100l c++ declarations
rfelker
parents: 18430
diff changeset
580 ogg_d->syncpoints = realloc_struct(ogg_d->syncpoints,(ogg_d->num_syncpoint+1), sizeof(ogg_syncpoint_t));
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
581 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
582 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
583 ogg_d->num_syncpoint++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
584 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
585 p++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
586 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
587 if(p > 1 || (p == 1 && ! ogg_page_continued(page)))
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
588 last_pos = pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
589 pos += np;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
590 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"Building syncpoint table %d%%\r",(int)(pos*100/s->end_pos));
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
591 }
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
592 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_INFO,"\n");
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
593
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
594 if(index_mode == 2) mp_msg(MSGT_DEMUX,MSGL_V,"Ogg syncpoints table builed: %d syncpoints\n",ogg_d->num_syncpoint);
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16604
diff changeset
595 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg stream length (granulepos): %"PRId64"\n",ogg_d->final_granulepos);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
596
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
597 stream_reset(s);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
598 stream_seek(s,demuxer->movi_start);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
599 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
600 for(np = 0 ; np < ogg_d->num_sub ; np++) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
601 ogg_stream_reset(&ogg_d->subs[np].stream);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
602 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
603 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
604
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
605
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
606 // Get the first page
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
607 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
608 np = ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
609 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
610 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
611 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
612 if(len == 0 && s->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
613 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to get the first page !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
614 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
615 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
616
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
617 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
618 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
619 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
620 demux_ogg_get_page_stream(ogg_d,&oss);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
621 ogg_stream_pagein(oss,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
622 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
623 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
624
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
625 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
626
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27397
diff changeset
627 void print_wave_header(WAVEFORMATEX *h, int verbose_level);
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27397
diff changeset
628 void print_video_header(BITMAPINFOHEADER *h, int verbose_level);
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
629
19326
f399b52a985a Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents: 19110
diff changeset
630 /* defined in demux_mov.c */
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27397
diff changeset
631 unsigned int store_ughvlc(unsigned char *s, unsigned int v);
19326
f399b52a985a Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents: 19110
diff changeset
632
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
633 /** \brief Change the current subtitle stream and return its ID.
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
634
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
635 \param demuxer The demuxer whose subtitle stream will be changed.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
636 \param new_num The number of the new subtitle track. The number must be
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
637 between 0 and ogg_d->n_text - 1.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
638
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
639 \returns The Ogg stream number ( = page serial number) of the newly selected
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
640 track.
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
641 */
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
642 int demux_ogg_sub_id(demuxer_t *demuxer, int index) {
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
643 ogg_demuxer_t *ogg_d = demuxer->priv;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
644 return (index < 0) ? index : (index >= ogg_d->n_text) ? -1 : ogg_d->text_ids[index];
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
645 }
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
646
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
647 /** \brief Translate the ogg track number into the subtitle number.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
648 * \param demuxer The demuxer about whose subtitles we are inquiring.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
649 * \param id The ogg track number of the subtitle track.
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
650 */
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
651 static int demux_ogg_sub_reverse_id(demuxer_t *demuxer, int id) {
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
652 ogg_demuxer_t *ogg_d = demuxer->priv;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
653 int i;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
654 for (i = 0; i < ogg_d->n_text; i++)
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
655 if (ogg_d->text_ids[i] == id) return i;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
656 return -1;
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
657 }
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
658
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
659 static void demux_close_ogg(demuxer_t* demuxer);
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
660
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
661 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
662 {
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
663 int i, offset;
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
664 int ris, init_error = 0;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
665 ogg_packet op[3];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
666 unsigned char *buf[3];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
667 unsigned char *ptr;
15426
79008c38fcd9 prevent possible exploit
nicodvb
parents: 15424
diff changeset
668 unsigned int len;
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
669 ogg_stream_t *os = &od->subs[sh->ds->id];
21509
18d525833180 vorbis_comment is only used locally, move it out of demuxer struct
reimar
parents: 21508
diff changeset
670 vorbis_comment vc;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
671
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
672 vorbis_info_init(&os->vi);
21509
18d525833180 vorbis_comment is only used locally, move it out of demuxer struct
reimar
parents: 21508
diff changeset
673 vorbis_comment_init(&vc);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
674 for(i = 0; i < 3; i++) {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
675 op[i].bytes = ds_get_packet(sh->ds, &(op[i].packet));
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
676 mp_msg(MSGT_DEMUX,MSGL_V, "fixup_vorbis_wf: i=%d, size=%ld\n", i, op[i].bytes);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
677 if(op[i].bytes < 0) {
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
678 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg demuxer error!, fixup_vorbis_wf: bad packet n. %d\n", i);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
679 return;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
680 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
681 buf[i] = malloc(op[i].bytes);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
682 if(!buf[i])
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
683 return;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
684 memcpy(buf[i], op[i].packet, op[i].bytes);
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
685
18637
94524d81d145 first vorbis packet before vorbis_synthesis_headeri() must have b_o_s==1
nicodvb
parents: 18558
diff changeset
686 op[i].b_o_s = (i==0);
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
687 ris = vorbis_synthesis_headerin(&os->vi,&vc,&op[i]);
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
688 if(ris < 0) {
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
689 init_error = 1;
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
690 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"DEMUX_OGG: header n. %d broken! len=%ld, code: %d\n", i, op[i].bytes, ris);
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
691 }
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
692 }
21509
18d525833180 vorbis_comment is only used locally, move it out of demuxer struct
reimar
parents: 21508
diff changeset
693 vorbis_comment_clear(&vc);
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
694 if(!init_error)
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25883
diff changeset
695 os->vi_initialized = 1;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
696
15426
79008c38fcd9 prevent possible exploit
nicodvb
parents: 15424
diff changeset
697 len = op[0].bytes + op[1].bytes + op[2].bytes;
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
698 sh->wf = calloc(1, sizeof(WAVEFORMATEX) + len + len/255 + 64);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
699 ptr = (unsigned char*) (sh->wf+1);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
700
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
701 ptr[0] = 2;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
702 offset = 1;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
703 offset += store_ughvlc(&ptr[offset], op[0].bytes);
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
704 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, offset after 1st len = %u\n", offset);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
705 offset += store_ughvlc(&ptr[offset], op[1].bytes);
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
706 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, offset after 2nd len = %u\n", offset);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
707 for(i = 0; i < 3; i++) {
15423
9a126d9d6d42 fixed too few parameters to mp_msg(); silence compilation warnings, removed unused variable
nicodvb
parents: 15422
diff changeset
708 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, i=%d, bytes: %ld, offset: %u\n", i, op[i].bytes, offset);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
709 memcpy(&ptr[offset], buf[i], op[i].bytes);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
710 offset += op[i].bytes;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
711 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
712 sh->wf->cbSize = offset;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
713 mp_msg(MSGT_DEMUX,MSGL_V, "demux_ogg, extradata size: %d\n", sh->wf->cbSize);
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
714 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX) + sh->wf->cbSize);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
715
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
716 if(op[0].bytes >= 29) {
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
717 unsigned int br;
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
718 int nombr, minbr, maxbr;
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
719 ptr = buf[0];
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
720 sh->channels = ptr[11];
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
721 sh->samplerate = sh->wf->nSamplesPerSec = AV_RL32(&ptr[12]);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
722 maxbr = AV_RL32(&ptr[16]); //max
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
723 nombr = AV_RL32(&ptr[20]); //nominal
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
724 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
725
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
726 if(maxbr == -1)
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
727 maxbr = 0;
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
728 if(nombr == -1)
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
729 nombr = 0;
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
730 if(minbr == -1)
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
731 minbr = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
732
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
733 br = maxbr / 8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
734 if(!br)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
735 br = nombr / 8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
736 if(!br)
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
737 br = minbr / 8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
738 sh->wf->nAvgBytesPerSec = br;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
739 sh->wf->wBitsPerSample = 16;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
740 sh->samplesize = (sh->wf->wBitsPerSample+7)/8;
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
741
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
742 mp_msg(MSGT_DEMUX,MSGL_V,"demux_ogg, vorbis stream features are: channels: %d, srate: %d, bitrate: %d, max: %u, nominal: %u, min: %u\n",
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
743 sh->channels, sh->samplerate, sh->wf->nAvgBytesPerSec, maxbr, nombr, minbr);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
744 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
745 free(buf[2]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
746 free(buf[1]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
747 free(buf[0]);
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
748 }
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
749
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
750
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
751 /// Open an ogg physical stream
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
752 // Not static because it's used also in demuxer_avi.c
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
753 int demux_ogg_open(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
754 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
755 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
756 char* buf;
13089
b9171604a4ac moved combined vobsub_lang into sub_select
joey
parents: 12909
diff changeset
757 int np,s_no, n_audio = 0, n_video = 0;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
758 int audio_id = -1, video_id = -1, text_id = -1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
759 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
760 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
761 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
762 sh_audio_t* sh_a;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
763 sh_video_t* sh_v;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
764
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
765 #ifdef CONFIG_ICONV
12909
dc8eba991005 fixes a crash and unchecked string-handling in ENCA code.
reimar
parents: 12703
diff changeset
766 subcp_open(NULL);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
767 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
768
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
769 s = demuxer->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
770
15321
1568ad46dc78 Fix the memleak fix: in case of error, demux_close_ogg should be called
reimar
parents: 15313
diff changeset
771 demuxer->priv =
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
772 ogg_d = calloc(1,sizeof(ogg_demuxer_t));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
773 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
774 page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
775
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
776 ogg_sync_init(sync);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
777
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
778 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
779 /// Try to get a page
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
780 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
781 np = ogg_sync_pageseek(sync,page);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
782 /// Error
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
783 if(np < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
784 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg demuxer : Bad page sync\n");
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
785 goto err_out;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
786 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
787 /// Need some more data
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
788 if(np == 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
789 int len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
790 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
791 len = stream_read(s,buf,BLOCK_SIZE);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
792 if(len == 0 && s->eof) {
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
793 goto err_out;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
794 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
795 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
796 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
797 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
798 ogg_d->last_size = np;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
799 // We got one page now
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
800
25198
22c1f7cd553f Fix some typos in comments, grammar is still bad.
reimar
parents: 24144
diff changeset
801 if( ! ogg_page_bos(page) ) { // It's not a beginning page
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
802 // Header parsing end here, we need to get the page otherwise it will be lost
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
803 int id = demux_ogg_get_page_stream(ogg_d,NULL);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
804 if(id >= 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
805 ogg_stream_pagein(&ogg_d->subs[id].stream,page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
806 else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
807 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg : Warning found none bos page from unknown stream %d\n",ogg_page_serialno(page));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
808 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
809 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
810
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
811 /// Init the data structure needed for a logical stream
25494
e88c0aa4bb96 Use realloc_struct in more places for consistency
reimar
parents: 25493
diff changeset
812 ogg_d->subs = realloc_struct(ogg_d->subs,ogg_d->num_sub+1,sizeof(ogg_stream_t));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
813 memset(&ogg_d->subs[ogg_d->num_sub],0,sizeof(ogg_stream_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
814 /// Get the stream serial number
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
815 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
816 ogg_stream_init(&ogg_d->subs[ogg_d->num_sub].stream,s_no);
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
817 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg : Found a stream with serial=%d\n",s_no);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
818 // Take the first page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
819 ogg_stream_pagein(&ogg_d->subs[ogg_d->num_sub].stream,page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
820 // Get first packet of the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
821 ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
822
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
823 // Reset our vars
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
824 sh_a = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
825 sh_v = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
826
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
827 ogg_d->subs[ogg_d->num_sub].ogg_d = ogg_d;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
828
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
829 // Check for Vorbis
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
830 if(pack.bytes >= 7 && ! strncmp(&pack.packet[1],"vorbis", 6) ) {
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
831 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio);
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
832 sh_a->format = FOURCC_VORBIS;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
833 ogg_d->subs[ogg_d->num_sub].vorbis = 1;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
834 ogg_d->subs[ogg_d->num_sub].id = n_audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
835 n_audio++;
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
836 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (Vorbis), -aid %d\n",ogg_d->num_sub,n_audio-1);
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
837 } else if (pack.bytes >= 80 && !strncmp(pack.packet,"Speex", 5)) {
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
838 sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio);
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
839 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + pack.bytes);
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
840 sh_a->format = FOURCC_SPEEX;
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
841 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL32(&pack.packet[36]);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
842 sh_a->channels = sh_a->wf->nChannels = AV_RL32(&pack.packet[48]);
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
843 sh_a->wf->wFormatTag = sh_a->format;
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
844 sh_a->wf->nAvgBytesPerSec = AV_RL32(&pack.packet[52]);
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
845 sh_a->wf->nBlockAlign = 0;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
846 sh_a->wf->wBitsPerSample = 16;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
847 sh_a->samplesize = 2;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
848 sh_a->wf->cbSize = pack.bytes;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
849 memcpy(&sh_a->wf[1], pack.packet, pack.bytes);
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
850
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
851 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
852 ogg_d->subs[ogg_d->num_sub].speex = 1;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
853 ogg_d->subs[ogg_d->num_sub].id = n_audio;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
854 n_audio++;
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
855 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (Speex), -aid %d\n",ogg_d->num_sub,n_audio-1);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
856
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
857 // check for Theora
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
858 # ifdef CONFIG_OGGTHEORA
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
859 } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) {
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
860 int errorCode = 0;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
861 theora_info inf;
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
862 theora_comment cc;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
863
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
864 theora_info_init (&inf);
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
865 theora_comment_init (&cc);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
866
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10608
diff changeset
867 errorCode = theora_decode_header (&inf, &cc, &pack);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
868 if (errorCode)
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
869 mp_msg(MSGT_DEMUX,MSGL_ERR,"Theora header parsing failed: %i \n",
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
870 errorCode);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
871 else
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
872 {
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
873 sh_v = new_sh_video_vid(demuxer,ogg_d->num_sub, n_video);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
874
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
875 sh_v->bih = calloc(1,sizeof(BITMAPINFOHEADER));
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
876 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
877 sh_v->bih->biCompression= sh_v->format = FOURCC_THEORA;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
878 sh_v->fps = ((double)inf.fps_numerator)/
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
879 (double)inf.fps_denominator;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
880 sh_v->frametime = ((double)inf.fps_denominator)/
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
881 (double)inf.fps_numerator;
14763
2c4e30f37773 Theora fixes:
henry
parents: 14666
diff changeset
882 sh_v->disp_w = sh_v->bih->biWidth = inf.frame_width;
2c4e30f37773 Theora fixes:
henry
parents: 14666
diff changeset
883 sh_v->disp_h = sh_v->bih->biHeight = inf.frame_height;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
884 sh_v->bih->biBitCount = 24;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
885 sh_v->bih->biPlanes = 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
886 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount/8) *
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
887 sh_v->bih->biWidth*sh_v->bih->biHeight);
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
888 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
889 ogg_d->subs[ogg_d->num_sub].theora = 1;
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
890 ogg_d->subs[ogg_d->num_sub].keyframe_frequency_force = inf.keyframe_frequency_force;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
891 ogg_d->subs[ogg_d->num_sub].id = n_video;
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
892 n_video++;
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
893 mp_msg(MSGT_DEMUX,MSGL_INFO,
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
894 "[Ogg] stream %d: video (Theora v%d.%d.%d), -vid %d\n",
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
895 ogg_d->num_sub,
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
896 (int)inf.version_major,
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
897 (int)inf.version_minor,
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
898 (int)inf.version_subminor,
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
899 n_video - 1);
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
900 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_v->bih,MSGL_V);
10092
d77ebd5d8990 Preliminary Theora support. Patch by David Kuehling.
mosu
parents: 9163
diff changeset
901 }
21500
e7e7f397f991 Fix memleaks caused by missing vorbis/theora_info/comment_clear calls.
reimar
parents: 21039
diff changeset
902 theora_comment_clear(&cc);
e7e7f397f991 Fix memleaks caused by missing vorbis/theora_info/comment_clear calls.
reimar
parents: 21039
diff changeset
903 theora_info_clear(&inf);
27363
40057010b1fa Change a bunch of codec-specific preprocessor directives from a HAVE_
diego
parents: 27359
diff changeset
904 # endif /* CONFIG_OGGTHEORA */
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
905 } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) {
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
906 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio);
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
907 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
908 ogg_d->subs[ogg_d->num_sub].id = n_audio;
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
909 n_audio++;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
910 ogg_d->subs[ogg_d->num_sub].flac = 1;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
911 sh_a->wf = NULL;
14574
7a3ada58992b More user-friendly stream, -xid and -slang info output even in non-verbose mode part 2.
mosu
parents: 14562
diff changeset
912 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (FLAC), -aid %d\n",ogg_d->num_sub,n_audio-1);
20489
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
913 } else if (pack.bytes >= 51 && !strncmp(&pack.packet[1], "FLAC", 4)) {
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
914 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio);
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
915 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
916 ogg_d->subs[ogg_d->num_sub].id = n_audio;
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
917 n_audio++;
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
918 ogg_d->subs[ogg_d->num_sub].flac = 2;
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
919 sh_a->wf = calloc(1, sizeof(WAVEFORMATEX) + 34);
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
920 sh_a->wf->wFormatTag = sh_a->format;
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
921 sh_a->wf->cbSize = 34;
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
922 memcpy(&sh_a->wf[1], &pack.packet[17], 34);
4419e00b54df Support new flac-in-ogg, fixes bug #229
reimar
parents: 20329
diff changeset
923 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (FLAC, try 2), -aid %d\n",ogg_d->num_sub,n_audio-1);
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 11000
diff changeset
924
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
925 /// Check for old header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
926 } else if(pack.bytes >= 142 && ! strncmp(&pack.packet[1],"Direct Show Samples embedded in Ogg",35) ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
927
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
928 // Old video header
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
929 if(AV_RL32(pack.packet+96) == 0x05589f80 && pack.bytes >= 184) {
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
930 sh_v = new_sh_video_vid(demuxer,ogg_d->num_sub, n_video);
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
931 sh_v->bih = calloc(1,sizeof(BITMAPINFOHEADER));
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
932 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
933 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
934 sh_v->format = mmioFOURCC(pack.packet[68],pack.packet[69],
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
935 pack.packet[70],pack.packet[71]);
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
936 sh_v->frametime = AV_RL64(pack.packet+164)*0.0000001;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
937 sh_v->fps = 1/sh_v->frametime;
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
938 sh_v->disp_w = sh_v->bih->biWidth = AV_RL32(pack.packet+176);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
939 sh_v->disp_h = sh_v->bih->biHeight = AV_RL32(pack.packet+180);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
940 sh_v->bih->biBitCount = AV_RL16(pack.packet+182);
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
941 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
942 sh_v->bih->biPlanes=1;
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
943 sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
944
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
945 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
946 ogg_d->subs[ogg_d->num_sub].id = n_video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
947 n_video++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
948 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: video (FOURCC %c%c%c%c), -vid %d\n",
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
949 ogg_d->num_sub,pack.packet[68],pack.packet[69],pack.packet[70],pack.packet[71],n_video-1);
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
950 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_v->bih,MSGL_V);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
951 // Old audio header
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
952 } else if(AV_RL32(pack.packet+96) == 0x05589F81) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
953 unsigned int extra_size;
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
954 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio);
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
955 extra_size = AV_RL16(pack.packet+140);
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
956 sh_a->wf = calloc(1,sizeof(WAVEFORMATEX)+extra_size);
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
957 sh_a->format = sh_a->wf->wFormatTag = AV_RL16(pack.packet+124);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
958 sh_a->channels = sh_a->wf->nChannels = AV_RL16(pack.packet+126);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
959 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL32(pack.packet+128);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
960 sh_a->wf->nAvgBytesPerSec = AV_RL32(pack.packet+132);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
961 sh_a->wf->nBlockAlign = AV_RL16(pack.packet+136);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
962 sh_a->wf->wBitsPerSample = AV_RL16(pack.packet+138);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
963 sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
964 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
965 if(extra_size > 0)
14535
c920c525daa2 100l, completely broken pointer arithmetic causing crashes.
reimar
parents: 14046
diff changeset
966 memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX),pack.packet+142,extra_size);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
967
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
968 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
969 ogg_d->subs[ogg_d->num_sub].id = n_audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
970 n_audio++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
971 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (format 0x%04x), -aid %d\n",ogg_d->num_sub,sh_a->format,n_audio-1);
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
972 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_a->wf,MSGL_V);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
973 } else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
974 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg stream %d contains an old header but the header type is unknown\n",ogg_d->num_sub);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
975
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
976 // Check new header
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
977 } else if ( (*pack.packet & PACKET_TYPE_BITS ) == PACKET_TYPE_HEADER &&
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
978 pack.bytes >= (int)sizeof(stream_header)+1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
979 stream_header *st = (stream_header*)(pack.packet+1);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
980 /// New video header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
981 if(strncmp(st->streamtype,"video",5) == 0) {
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
982 sh_v = new_sh_video_vid(demuxer,ogg_d->num_sub, n_video);
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
983 sh_v->bih = calloc(1,sizeof(BITMAPINFOHEADER));
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
984 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
985 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
986 sh_v->format = mmioFOURCC(st->subtype[0],st->subtype[1],
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
987 st->subtype[2],st->subtype[3]);
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
988 sh_v->frametime = AV_RL64(&st->time_unit)*0.0000001;
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
989 sh_v->fps = 1.0/sh_v->frametime;
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
990 sh_v->bih->biBitCount = AV_RL16(&st->bits_per_sample);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
991 sh_v->disp_w = sh_v->bih->biWidth = AV_RL32(&st->sh.video.width);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
992 sh_v->disp_h = sh_v->bih->biHeight = AV_RL32(&st->sh.video.height);
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
993 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
994 sh_v->bih->biPlanes=1;
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
995 sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
996
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
997 ogg_d->subs[ogg_d->num_sub].samplerate= sh_v->fps;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
998 ogg_d->subs[ogg_d->num_sub].id = n_video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
999 n_video++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1000 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: video (FOURCC %c%c%c%c), -vid %d\n",
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1001 ogg_d->num_sub,st->subtype[0],st->subtype[1],st->subtype[2],st->subtype[3],n_video-1);
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
1002 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_v->bih,MSGL_V);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1003 /// New audio header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1004 } else if(strncmp(st->streamtype,"audio",5) == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1005 char buffer[5];
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1006 unsigned int extra_size = AV_RL32(&st->size) - sizeof(stream_header);
15313
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1007 unsigned int extra_offset = 0;
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1008
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1009 memcpy(buffer,st->subtype,4);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1010 buffer[4] = '\0';
15313
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1011
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1012 /* Nasty workaround. stream_header.size seems not to contain the real
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1013 size in all cases. There are four extra bytes that are unaccounted
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1014 for in front of the real codec initialization data _at least_ for
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1015 AAC. So far I've only seen those bytes being all 0, so we can
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1016 just skip them here. */
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1017 if ((strtol(buffer, NULL, 16) == 0xff) && (extra_size >= 4)) {
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1018 extra_size -= 4;
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1019 extra_offset = 4;
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1020 }
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1021
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19326
diff changeset
1022 sh_a = new_sh_audio_aid(demuxer,ogg_d->num_sub, n_audio);
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
1023 sh_a->wf = calloc(1,sizeof(WAVEFORMATEX)+extra_size);
6850
5abb9367b128 ogm audio format id is in hex, not dec
arpi
parents: 6156
diff changeset
1024 sh_a->format = sh_a->wf->wFormatTag = strtol(buffer, NULL, 16);
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1025 sh_a->channels = sh_a->wf->nChannels = AV_RL16(&st->sh.audio.channels);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1026 sh_a->samplerate = sh_a->wf->nSamplesPerSec = AV_RL64(&st->samples_per_unit);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1027 sh_a->wf->nAvgBytesPerSec = AV_RL32(&st->sh.audio.avgbytespersec);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1028 sh_a->wf->nBlockAlign = AV_RL16(&st->sh.audio.blockalign);
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1029 sh_a->wf->wBitsPerSample = AV_RL16(&st->bits_per_sample);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1030 sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1031 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1032 if(extra_size)
15313
ff379596f099 Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.
mosu
parents: 14843
diff changeset
1033 memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX),((char *)(st+1))+extra_offset,extra_size);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1034
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
1035 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1036 ogg_d->subs[ogg_d->num_sub].id = n_audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1037 n_audio++;
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1038 mp_msg(MSGT_DEMUX,MSGL_INFO,"[Ogg] stream %d: audio (format 0x%04x), -aid %d\n",ogg_d->num_sub,sh_a->format,n_audio-1);
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
1039 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_a->wf,MSGL_V);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1040
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1041 /// Check for text (subtitles) header
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1042 } else if (strncmp(st->streamtype, "text", 4) == 0) {
14562
ee95cfdc1433 More user-friendly stream, -xid and -slang info output even in non-verbose mode.
mosu
parents: 14535
diff changeset
1043 mp_msg(MSGT_DEMUX, MSGL_INFO, "[Ogg] stream %d: subtitles (SRT-like text subtitles), -sid %d\n", ogg_d->num_sub, ogg_d->n_text);
25206
2d6575d7bc49 Finally replace get_uint?? by AV_RL??
reimar
parents: 25205
diff changeset
1044 ogg_d->subs[ogg_d->num_sub].samplerate= AV_RL64(&st->time_unit)/10;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1045 ogg_d->subs[ogg_d->num_sub].text = 1;
14046
4802041ab8e3 Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents: 13881
diff changeset
1046 ogg_d->subs[ogg_d->num_sub].id = ogg_d->n_text;
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1047 if (demuxer->sub->id == ogg_d->n_text)
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1048 text_id = ogg_d->num_sub;
21035
a384688bff57 Create a sh_sub_t for ogg subtitles.
reimar
parents: 20494
diff changeset
1049 new_sh_sub(demuxer, ogg_d->n_text);
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1050 ogg_d->n_text++;
25494
e88c0aa4bb96 Use realloc_struct in more places for consistency
reimar
parents: 25493
diff changeset
1051 ogg_d->text_ids = realloc_struct(ogg_d->text_ids, ogg_d->n_text, sizeof(int));
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1052 ogg_d->text_ids[ogg_d->n_text - 1] = ogg_d->num_sub;
25494
e88c0aa4bb96 Use realloc_struct in more places for consistency
reimar
parents: 25493
diff changeset
1053 ogg_d->text_langs = realloc_struct(ogg_d->text_langs, ogg_d->n_text, sizeof(char *));
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1054 ogg_d->text_langs[ogg_d->n_text - 1] = NULL;
10397
6180d7558f75 output typo fixes: unknow --> unknown
diego
parents: 10363
diff changeset
1055 //// Unknown header type
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1056 } else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1057 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg stream %d has a header marker but is of an unknown type\n",ogg_d->num_sub);
10608
2cae82f2ab02 Spelling police:
diego
parents: 10397
diff changeset
1058 /// Unknown (invalid ?) header
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1059 } else
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1060 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg stream %d is of an unknown type\n",ogg_d->num_sub);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1061
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1062 if(sh_a || sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1063 demux_stream_t* ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1064 if(sh_a) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1065 // If the audio stream is not defined we took the first one
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1066 if(demuxer->audio->id == -1) {
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1067 demuxer->audio->id = n_audio - 1;
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
1068 // if(sh_a->wf) print_wave_header(sh_a->wf,MSGL_INFO);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1069 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1070 /// Is it the stream we want
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1071 if(demuxer->audio->id == n_audio - 1) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1072 demuxer->audio->sh = sh_a;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1073 sh_a->ds = demuxer->audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1074 ds = demuxer->audio;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1075 audio_id = ogg_d->num_sub;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
1076 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1077 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1078 if(sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1079 /// Also for video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1080 if(demuxer->video->id == -1) {
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1081 demuxer->video->id = n_video - 1;
17977
f70772d02eaa Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents: 17932
diff changeset
1082 // if(sh_v->bih) print_video_header(sh_v->bih,MSGL_INFO);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1083 }
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1084 if(demuxer->video->id == n_video - 1) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1085 demuxer->video->sh = sh_v;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
1086 sh_v->ds = demuxer->video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1087 ds = demuxer->video;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1088 video_id = ogg_d->num_sub;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
1089 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1090 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1091 /// Add the header packets if the stream isn't seekable
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1092 if(ds && !s->end_pos) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1093 /// Finish the page, otherwise packets will be lost
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1094 do {
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1095 demux_ogg_add_packet(ds,&ogg_d->subs[ogg_d->num_sub],ogg_d->num_sub,&pack);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1096 } while(ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack) == 1);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1097 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1098 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1099 ogg_d->num_sub++;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1100 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1101
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1102 if(!n_video && !n_audio) {
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1103 goto err_out;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1104 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1105
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1106 if(!n_video || video_id < 0)
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1107 demuxer->video->id = -2;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1108 else
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1109 demuxer->video->id = video_id;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1110 if(!n_audio || audio_id < 0)
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1111 demuxer->audio->id = -2;
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1112 else
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1113 demuxer->audio->id = audio_id;
12351
af557de9daee Leave the subs uninitialized and not "forcefully off" if the user hasn't chosen a stream with -sid. If he used -slang then we need the comment packet which might be found after demux_ogg_open has finished.
mosu
parents: 12265
diff changeset
1114 /* Disable the subs only if there are no text streams at all.
af557de9daee Leave the subs uninitialized and not "forcefully off" if the user hasn't chosen a stream with -sid. If he used -slang then we need the comment packet which might be found after demux_ogg_open has finished.
mosu
parents: 12265
diff changeset
1115 Otherwise the stream to display might be chosen later when the comment
af557de9daee Leave the subs uninitialized and not "forcefully off" if the user hasn't chosen a stream with -sid. If he used -slang then we need the comment packet which might be found after demux_ogg_open has finished.
mosu
parents: 12265
diff changeset
1116 packet is encountered and the user used -slang instead of -sid. */
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1117 if(!ogg_d->n_text)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1118 demuxer->sub->id = -2;
12430
d82d84b94125 Be more verbose and tell the user which subtitle stream has been selected (if any).
mosu
parents: 12351
diff changeset
1119 else if (text_id >= 0) {
12135
ec3c9fe261b9 Changed -sid/-aid/-vid to be zero based and select the n'th stream of its type, e.g. -sid 1 will select the second subtitle stream.
mosu
parents: 12104
diff changeset
1120 demuxer->sub->id = text_id;
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1121 mp_msg(MSGT_DEMUX, MSGL_V, "Ogg demuxer: Displaying subtitle stream id %d\n", text_id);
12430
d82d84b94125 Be more verbose and tell the user which subtitle stream has been selected (if any).
mosu
parents: 12351
diff changeset
1122 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1123
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1124 ogg_d->final_granulepos=0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1125 if(!s->end_pos)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1126 demuxer->seekable = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1127 else {
8795
b4512aa07711 mosu: Fixed OGG/OGM seeking for XCDs in which the OGG/OGM does not start at pos 0 in the stream
mosu
parents: 8788
diff changeset
1128 demuxer->movi_start = s->start_pos; // Needed for XCD (Ogg written in MODE2)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1129 demuxer->movi_end = s->end_pos;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1130 demuxer->seekable = 1;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1131 demux_ogg_scan_stream(demuxer);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1132 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1133
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1134 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg demuxer : found %d audio stream%s, %d video stream%s and %d text stream%s\n",n_audio,n_audio>1?"s":"",n_video,n_video>1?"s":"",ogg_d->n_text,ogg_d->n_text>1?"s":"");
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
1135
15424
148fbef7e95b fixup the correct sh_a
nicodvb
parents: 15423
diff changeset
1136 sh_a = demuxer->audio->sh;
15422
9ac14c8b99b3 don't call fixup_audio if there's no audio
nicodvb
parents: 15420
diff changeset
1137 if(sh_a)
9ac14c8b99b3 don't call fixup_audio if there's no audio
nicodvb
parents: 15420
diff changeset
1138 if(sh_a->format == FOURCC_VORBIS)
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
1139 fixup_vorbis_wf(sh_a, ogg_d);
15420
f3cf481bbcda vorbis extradata is now passed from demuxer to decoder in matroska's way
nicodvb
parents: 15321
diff changeset
1140
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1141 return DEMUXER_TYPE_OGG;
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1142
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1143 err_out:
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14574
diff changeset
1144 return 0;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1145 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1146
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1147
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1148 static int demux_ogg_fill_buffer(demuxer_t *d, demux_stream_t *dsds) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1149 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1150 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1151 demux_stream_t *ds;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1152 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1153 ogg_stream_state* os;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1154 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1155 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1156 int np = 0, id=0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1157
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1158 s = d->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1159 ogg_d = d->priv;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1160 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1161 page = &ogg_d->page;
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 /// Find the stream we are working on
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1164 if ( (id = demux_ogg_get_page_stream(ogg_d,&os)) < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1165 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg demuxer : can't get current stream\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1166 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1167 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1168
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1169 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1170 np = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1171 ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1172 /// Try to get some packet from the current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1173 while( (np = ogg_stream_packetout(os,&pack)) != 1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1174 /// No packet we go the next page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1175 if(np == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1176 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1177 int pa,len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1178 char *buf;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1179 ogg_d->pos += ogg_d->last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1180 /// Get the next page from the physical stream
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1181 while( (pa = ogg_sync_pageseek(sync,page)) <= 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1182 /// Error : we skip some bytes
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1183 if(pa < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1184 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg : Page out not synced, we skip some bytes\n");
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1185 ogg_d->pos -= pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1186 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1187 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1188 /// We need more data
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1189 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1190 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1191 if(len == 0 && s->eof) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1192 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Ogg : Stream EOF !!!!\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1193 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1194 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1195 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1196 } /// Page loop
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1197 ogg_d->last_size = pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1198 /// Find the page's logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1199 if( (id = demux_ogg_get_page_stream(ogg_d,&os)) < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1200 mp_msg(MSGT_DEMUX,MSGL_ERR,"Ogg demuxer error : we met an unknown stream\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1201 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1202 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1203 /// Take the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1204 if(ogg_stream_pagein(os,page) == 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1205 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1206 /// Page was invalid => retry
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1207 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg demuxer : got invalid page !!!!!\n");
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1208 ogg_d->pos += ogg_d->last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1209 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1210 } else /// Packet was corrupted
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1211 mp_msg(MSGT_DEMUX,MSGL_WARN,"Ogg : bad packet in stream %d\n",id);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1212 } /// Packet loop
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1213
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1214 /// Is the actual logical stream in use ?
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1215 if(id == d->audio->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1216 ds = d->audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1217 else if(id == d->video->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1218 ds = d->video;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1219 else if (ogg_d->subs[id].text)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
1220 ds = d->sub;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1221
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1222 if(ds) {
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1223 if(!demux_ogg_add_packet(ds,&ogg_d->subs[id],id,&pack))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1224 continue; /// Unuseful packet, get another
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1225 d->filepos = ogg_d->pos;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1226 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1227 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1228
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1229 } /// while(1)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1230
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1231 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1232
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1233 /// 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
1234 // stream, then we join the avi and ogg demuxer with a demuxers demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1235 demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1236 demuxer_t *od;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1237 ogg_demuxer_t *ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1238 stream_t* s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1239 uint32_t hdrsizes[3];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1240 demux_packet_t *dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1241 sh_audio_t *sh_audio = demuxer->audio->sh;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1242 int np;
25202
57a3258ec1fc Use a pointer variable for extradata to simplify init_avi_with_ogg
reimar
parents: 25199
diff changeset
1243 uint8_t *extradata = sh_audio->wf + 1;
25203
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1244 int i;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1245 unsigned char *p = NULL,*buf;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1246 int plen;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1247
25198
22c1f7cd553f Fix some typos in comments, grammar is still bad.
reimar
parents: 24144
diff changeset
1248 /// Check that the cbSize is big enough for the following reads
25205
f291ec948fca Get rid of annoying, space-wasting sizeof(uint32_t)
reimar
parents: 25204
diff changeset
1249 if(sh_audio->wf->cbSize < 22+3*4) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1250 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI Ogg : Initial audio header is too small !!!!!\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1251 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1252 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1253 /// Get the size of the 3 header packet
25202
57a3258ec1fc Use a pointer variable for extradata to simplify init_avi_with_ogg
reimar
parents: 25199
diff changeset
1254 extradata += 22;
25204
dbad71c68ed6 Bigendian fix for ogg in AVI
reimar
parents: 25203
diff changeset
1255 for (i = 0; i < 3; i++) {
dbad71c68ed6 Bigendian fix for ogg in AVI
reimar
parents: 25203
diff changeset
1256 hdrsizes[i] = AV_RL32(extradata);
dbad71c68ed6 Bigendian fix for ogg in AVI
reimar
parents: 25203
diff changeset
1257 extradata += 4;
dbad71c68ed6 Bigendian fix for ogg in AVI
reimar
parents: 25203
diff changeset
1258 }
9163
62e1f7e537df 100l... ogg-in-avi (type 0xFFFE) fix
arpi
parents: 8795
diff changeset
1259 // 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
1260
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1261 /// Check the size
25205
f291ec948fca Get rid of annoying, space-wasting sizeof(uint32_t)
reimar
parents: 25204
diff changeset
1262 if(sh_audio->wf->cbSize < 22+3*4+hdrsizes[0]+hdrsizes[1] + hdrsizes[2]) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1263 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI Ogg : Audio header is too small !!!!!\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1264 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1265 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1266
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1267 // Build the ogg demuxer private datas
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
1268 ogg_d = calloc(1,sizeof(ogg_demuxer_t));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1269 ogg_d->num_sub = 1;
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18737
diff changeset
1270 ogg_d->subs = malloc(sizeof(ogg_stream_t));
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1271 ogg_d->subs[0].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1272
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1273 // Init the ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1274 ogg_sync_init(&ogg_d->sync);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1275
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1276 // Get the first page of the stream : we assume there only 1 logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1277 while((np = ogg_sync_pageout(&ogg_d->sync,&ogg_d->page)) <= 0 ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1278 if(np < 0) {
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1279 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI Ogg error : Can't init using first stream packets\n");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1280 free(ogg_d);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1281 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1282 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1283 // Add some data
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1284 plen = ds_get_packet(demuxer->audio,&p);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1285 buf = ogg_sync_buffer(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1286 memcpy(buf,p,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1287 ogg_sync_wrote(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1288 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1289 // Init the logical stream
12434
aa7216363fd4 Cosmetics. Shortened the "displaying subtitle..." message. Replaced "OGG" with "Ogg" as it is a name, not an abbreviation/acronym.
mosu
parents: 12430
diff changeset
1290 mp_msg(MSGT_DEMUX,MSGL_DBG2,"AVI Ogg found page with serial %d\n",ogg_page_serialno(&ogg_d->page));
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1291 ogg_stream_init(&ogg_d->subs[0].stream,ogg_page_serialno(&ogg_d->page));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1292 // Write the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1293 ogg_stream_pagein(&ogg_d->subs[0].stream,&ogg_d->page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1294
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1295 // Create the ds_stream and the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1296 s = new_ds_stream(demuxer->audio);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1297 od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2,NULL);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1298
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1299 /// Add the header packets in the ogg demuxer audio stream
25203
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1300 for (i = 0; i < 3; i++) {
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1301 dp = new_demux_packet(hdrsizes[i]);
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1302 memcpy(dp->buffer,extradata,hdrsizes[i]);
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1303 ds_add_packet(od->audio,dp);
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1304 extradata += hdrsizes[i];
36b9262aaa0f Use a loop instead of doing the same thing three times
reimar
parents: 25202
diff changeset
1305 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1306
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1307 // Finish setting up the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1308 od->priv = ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1309 sh_audio = new_sh_audio(od,0);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1310 od->audio->id = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1311 od->video->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1312 od->audio->sh = sh_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1313 sh_audio->ds = od->audio;
14843
bbb693d3b130 Fix the ogg fourcc nightmare!!!
rfelker
parents: 14763
diff changeset
1314 sh_audio->format = FOURCC_VORBIS;
25199
1a466dcdff1e Create correct extradata for vorbis audio when used as avi sub-demuxer
reimar
parents: 25198
diff changeset
1315 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
1316
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1317 /// Return the joined demuxers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1318 return new_demuxers_demuxer(demuxer,od,demuxer);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1319
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1320 fallback:
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1321 demuxer->audio->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1322 return demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1323
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1324 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1325
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17566
diff changeset
1326 static void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1327 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1328 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1329 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1330 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1331 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1332 demux_stream_t* ds;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1333 ogg_packet op;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1334 float rate;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1335 int i,sp,first,precision=1,do_seek=1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1336 vorbis_info* vi = NULL;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1337 int64_t gp = 0, old_gp;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1338 off_t pos, old_pos;
12265
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1339 int np;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1340 int is_gp_valid;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1341 float pts;
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1342 int is_keyframe;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
1343 int samplesize=1;
19802
f1655de446c4 Support for variable fps OGM files, blessed by Moritz.
diego
parents: 19694
diff changeset
1344 ogg_int64_t granulepos_orig;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1345
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1346 if(demuxer->video->id >= 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1347 ds = demuxer->video;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1348 rate = ogg_d->subs[ds->id].samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1349 } else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1350 ds = demuxer->audio;
18430
9300d63e235c unbind demux_ogg from ad_libvorbis; this permits to use -ac ffvorbis without crashes
nicodvb
parents: 18237
diff changeset
1351 os = &ogg_d->subs[ds->id];
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
1352 vi = &(os->vi);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1353 rate = (float)vi->rate;
12703
aff2855972e8 The granulepos does not depend on the number of channels, only on the sample size. Patch by Wolfram Gloger (wmglo at dent dot med dot uni-muenchen dot de).
mosu
parents: 12443
diff changeset
1354 samplesize = ((sh_audio_t*)ds->sh)->samplesize;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1355 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1356
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1357 os = &ogg_d->subs[ds->id];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1358 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1359
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1360 old_gp = os->lastpos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1361 old_pos = ogg_d->pos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1362
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1363 //calculate the granulepos to seek to
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
1364 gp = flags & SEEK_ABSOLUTE ? 0 : os->lastpos;
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
1365 if(flags & SEEK_FACTOR) {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1366 if (ogg_d->final_granulepos > 0)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1367 gp += ogg_d->final_granulepos * rel_seek_secs;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1368 else
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1369 gp += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * os->lastpos / ogg_d->pos;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1370 } else
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1371 gp += rel_seek_secs * rate;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1372 if (gp < 0) gp = 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1373
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1374 //calculate the filepos to seek to
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1375 if(ogg_d->syncpoints) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1376 for(sp = 0; sp < ogg_d->num_syncpoint ; sp++) {
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1377 if(ogg_d->syncpoints[sp].granulepos >= gp) break;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1378 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1379
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1380 if(sp >= ogg_d->num_syncpoint) return;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1381 if (sp > 0 && ogg_d->syncpoints[sp].granulepos - gp > gp - ogg_d->syncpoints[sp-1].granulepos)
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1382 sp--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1383 if (ogg_d->syncpoints[sp].granulepos == os->lastpos) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1384 if (sp > 0 && gp < os->lastpos) sp--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1385 if (sp < ogg_d->num_syncpoint-1 && gp > os->lastpos) sp++;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1386 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1387 pos = ogg_d->syncpoints[sp].page_pos;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1388 precision = 0;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1389 } else {
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
1390 pos = flags & SEEK_ABSOLUTE ? 0 : ogg_d->pos;
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
1391 if(flags & SEEK_FACTOR)
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1392 pos += (demuxer->movi_end - demuxer->movi_start) * rel_seek_secs;
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1393 else {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1394 if (ogg_d->final_granulepos > 0) {
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1395 pos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / (ogg_d->final_granulepos / rate);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1396 } else if (os->lastpos > 0) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1397 pos += rel_seek_secs * ogg_d->pos / (os->lastpos / rate);
11898
41efae8120b6 Cleanup and small improvement in seeking if the final_granulepos is known. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>
mosu
parents: 11756
diff changeset
1398 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1399 }
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1400 if (pos < 0) pos = 0;
16884
0168bf6042d6 Fix two (loosely) related bugs: massive A-V desync with -audiofile (bugzilla
reimar
parents: 16877
diff changeset
1401 if (pos > (demuxer->movi_end - demuxer->movi_start))
0168bf6042d6 Fix two (loosely) related bugs: massive A-V desync with -audiofile (bugzilla
reimar
parents: 16877
diff changeset
1402 pos = demuxer->movi_end - demuxer->movi_start;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1403 } // if(ogg_d->syncpoints)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1404
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1405 while(1) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1406 if (do_seek) {
8795
b4512aa07711 mosu: Fixed OGG/OGM seeking for XCDs in which the OGG/OGM does not start at pos 0 in the stream
mosu
parents: 8788
diff changeset
1407 stream_seek(demuxer->stream,pos+demuxer->movi_start);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1408 ogg_sync_reset(sync);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1409 for(i = 0 ; i < ogg_d->num_sub ; i++) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1410 ogg_stream_reset(&ogg_d->subs[i].stream);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1411 ogg_d->subs[i].lastpos = ogg_d->subs[i].lastsize = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1412 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1413 ogg_d->pos = pos;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1414 ogg_d->last_size = 0;
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1415 /* we just guess that we reached correct granulepos, in case a
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1416 subsequent search occurs before we read a valid granulepos */
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1417 os->lastpos = gp;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1418 first = !(ogg_d->syncpoints);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1419 do_seek=0;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1420 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1421 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1422 ogg_d->last_size = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1423 np = ogg_sync_pageseek(sync,page);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1424
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1425 if(np < 0)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1426 ogg_d->pos -= np;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1427 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1428 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1429 int len = stream_read(demuxer->stream,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1430 if(len == 0 && demuxer->stream->eof) {
16884
0168bf6042d6 Fix two (loosely) related bugs: massive A-V desync with -audiofile (bugzilla
reimar
parents: 16877
diff changeset
1431 mp_msg(MSGT_DEMUX,MSGL_V,"EOF while trying to seek !!!!\n");
0168bf6042d6 Fix two (loosely) related bugs: massive A-V desync with -audiofile (bugzilla
reimar
parents: 16877
diff changeset
1432 return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1433 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1434 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1435 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1436 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1437 ogg_d->last_size = np;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1438 if(ogg_page_serialno(page) != oss->serialno)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1439 continue;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1440
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1441 if(ogg_stream_pagein(oss,page) != 0)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1442 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1443
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1444 while(1) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1445 np = ogg_stream_packetout(oss,&op);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1446 if(np < 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1447 continue;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1448 else if(np == 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1449 break;
8655
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1450 if (first) { /* Discard the first packet as it's probably broken,
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1451 and we don't have any other means to decide whether it is
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1452 complete or not. */
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1453 first = 0;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1454 break;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1455 }
12265
c9e1fe032d10 1000000000000l to bunkus
rfelker
parents: 12264
diff changeset
1456 is_gp_valid = (op.granulepos >= 0);
19802
f1655de446c4 Support for variable fps OGM files, blessed by Moritz.
diego
parents: 19694
diff changeset
1457 granulepos_orig=op.granulepos;
27322
d9301dca9712 Get rid of horrible code that relies on codec-set context variable,
reimar
parents: 26084
diff changeset
1458 demux_ogg_read_packet(os,&op,&pts,&is_keyframe,samplesize);
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1459 if (precision && is_gp_valid) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1460 precision--;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1461 if (abs(gp - op.granulepos) > rate && (op.granulepos != old_gp)) {
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1462 //prepare another seek because we are off by more than 1s
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1463 pos += (gp - op.granulepos) * (pos - old_pos) / (op.granulepos - old_gp);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1464 if (pos < 0) pos = 0;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1465 if (pos < demuxer->movi_end - demuxer->movi_start) {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1466 do_seek=1;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1467 break;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1468 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1469 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1470 }
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1471 if (is_gp_valid && pos > 0 && old_gp > gp
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1472 && 2 * (old_gp - op.granulepos) < old_gp - gp) {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1473 /* prepare another seek because looking for a syncpoint
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1474 destroyed the backward search */
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1475 pos = old_pos - 1.5 * (old_pos - pos);
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1476 if (pos < 0) pos = 0;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1477 if (pos < demuxer->movi_end - demuxer->movi_start) {
12263
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1478 do_seek=1;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1479 break;
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1480 }
26be0fd618b5 Much improved seeking. Patch by Michael Behrich <behrisch at informatik adot hu-berlin anotherdot de>
mosu
parents: 12135
diff changeset
1481 }
16915
6b1d1e4adaea Speex support. Seeking and pts generation does not work.
reimar
parents: 16884
diff changeset
1482 if(!precision && (is_keyframe || os->vorbis || os->speex) ) {
21828
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
1483 if (sub_clear_text(&ogg_sub, MP_NOPTS_VALUE)) {
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
1484 vo_sub = &ogg_sub;
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
1485 vo_osd_changed(OSDTYPE_SUBTITLE);
a165910dcaf7 Simplify demux_ogg to use the sub_clear_text and sub_add_text functions.
reimar
parents: 21812
diff changeset
1486 }
19802
f1655de446c4 Support for variable fps OGM files, blessed by Moritz.
diego
parents: 19694
diff changeset
1487 op.granulepos=granulepos_orig;
12104
fdce1dd97638 Support for selecting subtitles with -slang. Patch by Andriy N Gritsenko <andrej at lucky onedot net>
mosu
parents: 11898
diff changeset
1488 demux_ogg_add_packet(ds,os,ds->id,&op);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1489 return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1490 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1491 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1492 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1493
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1494 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n");
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1495
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1496 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1497
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1498 static void demux_close_ogg(demuxer_t* demuxer) {
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1499 ogg_demuxer_t* ogg_d = demuxer->priv;
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
1500 ogg_stream_t* os = NULL;
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1501 int i;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1502
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1503 if(!ogg_d)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1504 return;
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1505
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27363
diff changeset
1506 #ifdef CONFIG_ICONV
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1507 subcp_close();
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1508 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1509
13641
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1510 ogg_sync_clear(&ogg_d->sync);
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1511 if(ogg_d->subs)
13641
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1512 {
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1513 for (i = 0; i < ogg_d->num_sub; i++)
21811
ff1d5576063f Do not access ogg_d->subs after freeing it.
reimar
parents: 21531
diff changeset
1514 {
ff1d5576063f Do not access ogg_d->subs after freeing it.
reimar
parents: 21531
diff changeset
1515 os = &ogg_d->subs[i];
21812
858481c34c3b Simplify after last demux_ogg commit
reimar
parents: 21811
diff changeset
1516 ogg_stream_clear(&os->stream);
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25883
diff changeset
1517 if(os->vi_initialized)
21811
ff1d5576063f Do not access ogg_d->subs after freeing it.
reimar
parents: 21531
diff changeset
1518 vorbis_info_clear(&os->vi);
ff1d5576063f Do not access ogg_d->subs after freeing it.
reimar
parents: 21531
diff changeset
1519 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1520 free(ogg_d->subs);
13641
a22f1b86ec0f some memory leaks fixed
reimar
parents: 13502
diff changeset
1521 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1522 if(ogg_d->syncpoints)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1523 free(ogg_d->syncpoints);
13127
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1524 if (ogg_d->text_ids)
957fc21fc10a Do not use globals. Put the variables into the appropriate demuxer struct instead.
mosu
parents: 13089
diff changeset
1525 free(ogg_d->text_ids);
13502
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1526 if (ogg_d->text_langs) {
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1527 for (i = 0; i < ogg_d->n_text; i++)
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1528 if (ogg_d->text_langs[i]) free(ogg_d->text_langs[i]);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1529 free(ogg_d->text_langs);
05f846322437 show ogg subtitle language on OSD, if available
joey
parents: 13501
diff changeset
1530 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1531 free(ogg_d);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1532 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1533
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1534 static int demux_ogg_control(demuxer_t *demuxer,int cmd, void *arg){
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1535 ogg_demuxer_t* ogg_d = demuxer->priv;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1536 ogg_stream_t* os;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1537 float rate;
11577
alex
parents: 11576
diff changeset
1538
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1539 if(demuxer->video->id >= 0) {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1540 os = &ogg_d->subs[demuxer->video->id];
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1541 rate = os->samplerate;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1542 } else {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1543 os = &ogg_d->subs[demuxer->audio->id];
21519
5924b2b9f5de made vorbis_info a member of ogg_stream rather than ogg_demuxer;
nicodvb
parents: 21509
diff changeset
1544 rate = os->vi.rate;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1545 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1546
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1547
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1548 switch(cmd) {
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1549 case DEMUXER_CTRL_GET_TIME_LENGTH:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1550 if (ogg_d->final_granulepos<=0) return DEMUXER_CTRL_DONTKNOW;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1551 *(double *)arg=(double)ogg_d->final_granulepos / rate;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1552 return DEMUXER_CTRL_GUESS;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1553
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1554 case DEMUXER_CTRL_GET_PERCENT_POS:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1555 if (ogg_d->final_granulepos<=0) return DEMUXER_CTRL_DONTKNOW;
25493
fabaf34bd545 Get rid of some of the more excessive () and casts.
reimar
parents: 25206
diff changeset
1556 *(int *)arg=(os->lastpos*100) / ogg_d->final_granulepos;
11575
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1557 return DEMUXER_CTRL_OK;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1558
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1559 default:
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1560 return DEMUXER_CTRL_NOTIMPL;
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1561 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1562 }
0ac7fe8f3af8 Get the total length for Ogg files. Patch by Michael Behrisch <behrisch@informatik.hu-berlin.de>.
mosu
parents: 11467
diff changeset
1563
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1564
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1565
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25495
diff changeset
1566 const demuxer_desc_t demuxer_desc_ogg = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1567 "Ogg demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1568 "ogg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1569 "Ogg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1570 "?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1571 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1572 DEMUXER_TYPE_OGG,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1573 1, // safe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1574 demux_ogg_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1575 demux_ogg_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1576 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1577 demux_close_ogg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1578 demux_ogg_seek,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1579 demux_ogg_control
6b86089c2edd Demuxer modularization
rtognimp
parents: 15426
diff changeset
1580 };