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