annotate libmpdemux/demux_ogg.c @ 8763:19e96e60a3d0

Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
author anders
date Sat, 04 Jan 2003 06:19:25 +0000
parents f8e53f8cb8b2
children ee443da1cef3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
2 #include "config.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
3
7413
7d83ac879f51 removed dummy OGG functions - use #ifdef instead
arpi
parents: 7396
diff changeset
4 #ifdef HAVE_OGGVORBIS
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
5
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
6 #include <stdlib.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
7 #include <stdio.h>
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
8 #include <string.h>
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
9
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
10 #include "../mp_msg.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
11 #include "../help_mp.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
12 #include "stream.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
13 #include "demuxer.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
14 #include "stheader.h"
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
15
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
16 #ifdef TREMOR
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
17 #include <tremor/ogg.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
18 #include <tremor/ivorbiscodec.h>
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
19 #else
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
20 #include <ogg/ogg.h>
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
21 #include <vorbis/codec.h>
8342
86835828d5b5 Add Tremor (an integer-only Vorbis decoder) support.
rguyom
parents: 8123
diff changeset
22 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
23
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
24 #define BLOCK_SIZE 4096
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
25
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
26 /// Vorbis decoder context : we need the vorbis_info for vorbis timestamping
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
27 /// Shall we put this struct def in a common header ?
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
28 typedef struct ov_struct_st {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
29 vorbis_info vi; /* struct that stores all the static vorbis bitstream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
30 settings */
8375
22cbd7bcc6bf Really (!) sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8374
diff changeset
31 vorbis_comment vc; /* struct that stores all the bitstream user comments */
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
32 vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
33 vorbis_block vb; /* local working space for packet->PCM decode */
8374
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
34 float rg_scale; /* replaygain scale */
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
35 #ifdef TREMOR
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
36 int rg_scale_int;
99ac11458d23 Sync ov_struct_st between demux_ogg.c and ad_libvorbis.c
rguyom
parents: 8342
diff changeset
37 #endif
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
38 } ov_struct_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
39
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
40 //// OggDS headers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
41 // Header for the new header format
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
42 typedef struct stream_header_video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
43 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
44 ogg_int32_t width;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
45 ogg_int32_t height;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
46 } stream_header_video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
47
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
48 typedef struct stream_header_audio
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
49 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
50 ogg_int16_t channels;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
51 ogg_int16_t blockalign;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
52 ogg_int32_t avgbytespersec;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
53 } stream_header_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
54
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
55 typedef struct stream_header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
56 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
57 char streamtype[8];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
58 char subtype[4];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
59
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
60 ogg_int32_t size; // size of the structure
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
61
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
62 ogg_int64_t time_unit; // in reference time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
63 ogg_int64_t samples_per_unit;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
64 ogg_int32_t default_len; // in media time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
65
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
66 ogg_int32_t buffersize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
67 ogg_int16_t bits_per_sample;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
68
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
69 union
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
70 {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
71 // Video specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
72 stream_header_video video;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
73 // Audio specific
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
74 stream_header_audio audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
75 } sh;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
76 } stream_header;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
77
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
78 /// Our private datas
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
79
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
80 typedef struct ogg_syncpoint {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
81 int64_t granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
82 off_t page_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
83 } ogg_syncpoint_t;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
84
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
85 /// A logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
86 typedef struct ogg_stream {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
87 /// Timestamping stuff
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
88 float samplerate; /// granulpos 2 time
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
89 int64_t lastpos;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
90 int32_t lastsize;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
91
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
92 // Logical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
93 ogg_stream_state stream;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
94 int hdr_packets;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
95 int vorbis;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
96 } ogg_stream_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
97
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
98 typedef struct ogg_demuxer {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
99 /// Physical stream state
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
100 ogg_sync_state sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
101 /// Current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
102 ogg_page page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
103 /// Logical streams
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
104 ogg_stream_t *subs;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
105 int num_sub;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
106 ogg_syncpoint_t* syncpoints;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
107 int num_syncpoint;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
108 off_t pos, last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
109 } ogg_demuxer_t;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
110
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
111 #define NUM_VORBIS_HDR_PACKETS 3
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
112
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
113 /// Some defines from OggDS
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
114 #define PACKET_TYPE_HEADER 0x01
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
115 #define PACKET_TYPE_BITS 0x07
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
116 #define PACKET_LEN_BITS01 0xc0
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
117 #define PACKET_LEN_BITS2 0x02
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
118 #define PACKET_IS_SYNCPOINT 0x08
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
119
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
120 extern int index_mode;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
121
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
122 //-------- subtitle support - should be moved to decoder layer, and queue
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
123 // - subtitles up in demuxer buffer...
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
124
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
125 #include "../subreader.h"
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
126 #include "../libvo/sub.h"
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
127 #define OGG_SUB_MAX_LINE 128
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
128
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
129 static subtitle ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
130 extern subtitle* vo_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
131 //FILE* subout;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
132
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
133 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
134 uint16_t get_uint16 (const void *buf)
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
135 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
136 uint16_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
137 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
138
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
139 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
140
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
141 ret = tmp[1] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
142 ret = (ret << 8) + (tmp[0] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
143
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
144 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
145 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
146
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
147 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
148 uint32_t get_uint32 (const void *buf)
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
149 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
150 uint32_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
151 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
152
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
153 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
154
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
155 ret = tmp[3] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
156 ret = (ret << 8) + (tmp[2] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
157 ret = (ret << 8) + (tmp[1] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
158 ret = (ret << 8) + (tmp[0] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
159
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
160 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
161 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
162
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
163 static
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
164 uint64_t get_uint64 (const void *buf)
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
165 {
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
166 uint64_t ret;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
167 unsigned char *tmp;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
168
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
169 tmp = (unsigned char *) buf;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
170
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
171 ret = tmp[7] & 0xff;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
172 ret = (ret << 8) + (tmp[6] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
173 ret = (ret << 8) + (tmp[5] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
174 ret = (ret << 8) + (tmp[4] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
175 ret = (ret << 8) + (tmp[3] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
176 ret = (ret << 8) + (tmp[2] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
177 ret = (ret << 8) + (tmp[1] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
178 ret = (ret << 8) + (tmp[0] & 0xff);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
179
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
180 return (ret);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
181 }
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
182
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
183 void demux_ogg_init_sub () {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
184 int lcv;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
185 if(!ogg_sub.text[0]) // not yet allocated
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
186 for (lcv = 0; lcv < SUB_MAX_TEXT; lcv++) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
187 ogg_sub.text[lcv] = (char*)malloc(OGG_SUB_MAX_LINE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
188 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
189 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
190
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
191 void demux_ogg_add_sub (char* packet) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
192 int lcv;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
193 int line_pos = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
194 int ignoring = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
195
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
196 mp_msg(MSGT_DEMUX,MSGL_DBG2,"\ndemux_ogg_add_sub %02X %02X %02X '%s'\n",
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
197 (unsigned char)packet[0],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
198 (unsigned char)packet[1],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
199 (unsigned char)packet[2],
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
200 &packet[3]);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
201
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
202 ogg_sub.lines = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
203 if (((unsigned char)packet[0]) == 0x88) { // some subtitle text
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
204 lcv = 3;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
205 while (1) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
206 int c = packet[lcv++];
7115
55716603988c fixes problems when new line is just '\n' and not '\r\n' and enabled html-markup ignore. Patch by Piotr Krukowiecki <piotr@pingu.ii.uj.edu.pl>
alex
parents: 7010
diff changeset
207 if(c=='\n' || c==0 || line_pos >= OGG_SUB_MAX_LINE-1){
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
208 ogg_sub.text[ogg_sub.lines][line_pos] = 0; // close sub
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
209 if(line_pos) ogg_sub.lines++;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
210 if(!c || ogg_sub.lines>=SUB_MAX_TEXT) break; // EOL or TooMany
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
211 line_pos = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
212 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
213 switch (c) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
214 case '\r':
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
215 case '\n': // just ignore linefeeds for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
216 // their placement seems rather haphazard
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
217 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
218 case '<': // some html markup, ignore for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
219 ignoring = 1;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
220 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
221 case '>':
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
222 ignoring = 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
223 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
224 default:
7115
55716603988c fixes problems when new line is just '\n' and not '\r\n' and enabled html-markup ignore. Patch by Piotr Krukowiecki <piotr@pingu.ii.uj.edu.pl>
alex
parents: 7010
diff changeset
225 if(!ignoring)
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
226 ogg_sub.text[ogg_sub.lines][line_pos++] = c;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
227 break;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
228 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
229 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
230 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
231
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
232 mp_msg(MSGT_DEMUX,MSGL_DBG2,"ogg sub lines: %d first: '%s'\n",
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
233 ogg_sub.lines, ogg_sub.text[0]);
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
234 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
235 subcp_recode1(&ogg_sub);
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
236 #endif
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
237 vo_sub = &ogg_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
238 vo_osd_changed(OSDTYPE_SUBTITLE);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
239 }
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
240
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
241
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
242 // 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
243 // fill os if non NULL and return the stream id
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
244 static int demux_ogg_get_page_stream(ogg_demuxer_t* ogg_d,ogg_stream_state** os) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
245 int id,s_no;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
246 ogg_page* page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
247
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
248 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
249
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
250 for(id= 0; id < ogg_d->num_sub ; id++) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
251 if(s_no == ogg_d->subs[id].stream.serialno)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
252 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
253 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
254
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
255 if(id == ogg_d->num_sub)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
256 return -1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
257
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
258 if(os)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
259 *os = &ogg_d->subs[id].stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
260
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
261 return id;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
262
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
263 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
264
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
265 static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,vorbis_info* vi,float* pts,int* flags) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
266 unsigned char* data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
267
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
268 *pts = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
269 *flags = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
270
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
271 if(os->vorbis) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
272 data = pack->packet;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
273 if(*pack->packet & PACKET_TYPE_HEADER)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
274 os->hdr_packets++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
275 else if(vi) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
276 // When we dump the audio, there is no vi, but we dont care of timestamp in this case
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
277 int32_t blocksize = vorbis_packet_blocksize(vi,pack) / vi->channels;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
278 // Calculate the timestamp if the packet don't have any
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
279 if(pack->granulepos == -1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
280 pack->granulepos = os->lastpos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
281 if(os->lastsize > 0)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
282 pack->granulepos += os->lastsize;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
283 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
284 *pts = pack->granulepos / (float)vi->rate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
285 os->lastsize = blocksize;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
286 os->lastpos = pack->granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
287 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
288 } else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
289 // Find data start
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
290 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
291 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) <<1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
292 data = pack->packet + 1 + hdrlen;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
293 // Calculate the timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
294 if(pack->granulepos == -1)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
295 pack->granulepos = os->lastpos + os->lastsize;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
296 // If we alredy have a timestamp it can be a syncpoint
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
297 if(*pack->packet & PACKET_IS_SYNCPOINT)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
298 *flags = 1;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
299 *pts = pack->granulepos/os->samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
300 // Save the packet length and timestamp
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
301 os->lastsize = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
302 while(hdrlen) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
303 os->lastsize <<= 8;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
304 os->lastsize |= pack->packet[hdrlen];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
305 hdrlen--;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
306 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
307 os->lastpos = pack->granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
308 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
309 return data;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
310 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
311
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
312 /// 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
313 // return 1 if the packet was added, 0 otherwise
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
314 static int demux_ogg_add_packet(demux_stream_t* ds,ogg_stream_t* os,ogg_packet* pack) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
315 demuxer_t* d = ds->demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
316 demux_packet_t* dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
317 unsigned char* data;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
318 float pts = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
319 int flags = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
320
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
321 if (ds == d->sub) { // don't want to add subtitles to the demuxer for now
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
322 demux_ogg_add_sub(pack->packet);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
323 return 0;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
324 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
325 // If packet is an header we jump it except for vorbis
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
326 if((*pack->packet & PACKET_TYPE_HEADER) &&
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
327 (ds == d->video || (ds == d->audio && ( ((sh_audio_t*)ds->sh)->format != 0xFFFE || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) ) ))
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
328 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
329
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
330 // For vorbis packet the packet is the data, for other codec we must jump the header
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
331 if(ds == d->audio && ((sh_audio_t*)ds->sh)->format == 0xFFFE)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
332 data = demux_ogg_read_packet(os,pack,&((ov_struct_t*)((sh_audio_t*)ds->sh)->context)->vi,
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
333 &pts,&flags);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
334 else
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
335 data = demux_ogg_read_packet(os,pack,NULL,&pts,&flags);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
336
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
337
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
338 /// Send the packet
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
339 dp = new_demux_packet(pack->bytes-(data-pack->packet));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
340 memcpy(dp->buffer,data,pack->bytes-(data-pack->packet));
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
341 dp->pts = pts;
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
342 dp->flags = flags;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
343 ds_add_packet(ds,dp);
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
344 if(verbose>1)printf("New dp: %p ds=%p pts=%5.3f len=%d flag=%d \n",
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
345 dp, ds, pts, dp->len, flags);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
346 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
347 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
348
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
349 /// Build a table of all syncpoints to make seeking easier
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
350 void demux_ogg_build_syncpoints_table(demuxer_t* demuxer) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
351 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
352 stream_t *s = demuxer->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
353 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
354 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
355 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
356 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
357 ogg_packet op;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
358 int np,sid,p;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
359 vorbis_info* vi = NULL;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
360 off_t pos, last_pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
361 pos = last_pos = demuxer->movi_start;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
362
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
363 // Reset the stream
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
364 stream_seek(s,demuxer->movi_start);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
365 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
366
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
367 // Get the serial number of the stream we use
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
368 if(demuxer->video->id >= 0)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
369 sid = demuxer->video->id;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
370 else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
371 sid = demuxer->audio->id;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
372 if(((sh_audio_t*)demuxer->audio->sh)->format == 0xFFFE)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
373 vi = &((ov_struct_t*)((sh_audio_t*)demuxer->audio->sh)->context)->vi;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
374 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
375 os = &ogg_d->subs[sid];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
376 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
377
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
378 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
379 np = ogg_sync_pageseek(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
380 if(np < 0) { // We had to skip some bytes
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
381 mp_msg(MSGT_DEMUX,MSGL_ERR,"Bad page sync while building syncpoints table (%ld)\n",-np);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
382 pos += -np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
383 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
384 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
385 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
386 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
387 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
388 if(len == 0 && s->eof)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
389 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
390 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
391 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
392 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
393 // The page is ready
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
394 //ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
395 if(ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
396 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
397 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
398 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
399 if(ogg_stream_pagein(oss,page) != 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
400 mp_msg(MSGT_DEMUX,MSGL_ERR,"Pagein error ????\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
401 pos += np;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
402 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
403 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
404 p = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
405 while(ogg_stream_packetout(oss,&op) == 1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
406 float pts;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
407 int flags;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
408 demux_ogg_read_packet(os,&op,vi,&pts,&flags);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
409 if(flags || (os->vorbis && op.granulepos >= 0)) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
410 ogg_d->syncpoints = (ogg_syncpoint_t*)realloc(ogg_d->syncpoints,(ogg_d->num_syncpoint+1)*sizeof(ogg_syncpoint_t));
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
411 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
412 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
413 ogg_d->num_syncpoint++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
414 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
415 p++;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
416 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
417 if(p > 1 || (p == 1 && ! ogg_page_continued(page)))
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
418 last_pos = pos;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
419 pos += np;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
420 mp_msg(MSGT_DEMUX,MSGL_INFO,"Building syncpoint table %d%\r",pos*100/s->end_pos);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
421 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
422 mp_msg(MSGT_DEMUX,MSGL_INFO,"\n");
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
423
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
424 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg syncpoints table builed: %d syncpoints\n",ogg_d->num_syncpoint);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
425
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
426 stream_reset(s);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
427 stream_seek(s,demuxer->movi_start);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
428 ogg_sync_reset(sync);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
429 for(np = 0 ; np < ogg_d->num_sub ; np++) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
430 ogg_stream_reset(&ogg_d->subs[np].stream);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
431 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
432 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
433
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
434
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
435 // Get the first page
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
436 while(1) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
437 np = ogg_sync_pageout(sync,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
438 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
439 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
440 int len = stream_read(s,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
441 if(len == 0 && s->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
442 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to get the first page !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
443 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
444 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
445
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
446 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
447 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
448 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
449 demux_ogg_get_page_stream(ogg_d,&oss);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
450 ogg_stream_pagein(oss,page);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
451 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
452 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
453
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
454 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
455
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
456 extern void print_wave_header(WAVEFORMATEX *h);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
457 extern void print_video_header(BITMAPINFOHEADER *h);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
458
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
459 /// Open an ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
460 int demux_ogg_open(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
461 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
462 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
463 char* buf;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
464 int np,s_no, n_audio = 0, n_video = 0, n_text = 0;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
465 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
466 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
467 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
468 sh_audio_t* sh_a;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
469 sh_video_t* sh_v;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
470
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
471 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
472 subcp_open();
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
473 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
474
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
475 s = demuxer->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
476
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
477 ogg_d = (ogg_demuxer_t*)calloc(1,sizeof(ogg_demuxer_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
478 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
479 page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
480
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
481 ogg_sync_init(sync);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
482
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
483 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
484 /// Try to get a page
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
485 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
486 np = ogg_sync_pageseek(sync,page);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
487 /// Error
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
488 if(np < 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
489 mp_msg(MSGT_DEMUX,MSGL_DBG2,"OGG demuxer : Bad page sync\n");
7760
5262223af043 memleak fix
arpi
parents: 7413
diff changeset
490 free(ogg_d);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
491 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
492 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
493 /// Need some more data
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
494 if(np == 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
495 int len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
496 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
497 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
498 if(len == 0 && s->eof) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
499 free(ogg_d);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
500 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
501 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
502 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
503 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
504 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
505 ogg_d->last_size = np;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
506 // We got one page now
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
507
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
508 if( ! ogg_page_bos(page) ) { // It's not a begining page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
509 // Header parsing end here, we need to get the page otherwise it will be lost
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
510 int id = demux_ogg_get_page_stream(ogg_d,NULL);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
511 if(id >= 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
512 ogg_stream_pagein(&ogg_d->subs[id].stream,page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
513 else
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
514 mp_msg(MSGT_DEMUX,MSGL_ERR,"OGG : Warning found none bos page from unknow stream %d\n",ogg_page_serialno(page));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
515 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
516 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
517
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
518 /// Init the data structure needed for a logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
519 ogg_d->subs = (ogg_stream_t*)realloc(ogg_d->subs,(ogg_d->num_sub+1)*sizeof(ogg_stream_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
520 memset(&ogg_d->subs[ogg_d->num_sub],0,sizeof(ogg_stream_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
521 /// Get the stream serial number
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
522 s_no = ogg_page_serialno(page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
523 ogg_stream_init(&ogg_d->subs[ogg_d->num_sub].stream,s_no);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
524 mp_msg(MSGT_DEMUX,MSGL_DBG2,"OGG : Found a stream with serial=%d\n",s_no);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
525 // Take the first page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
526 ogg_stream_pagein(&ogg_d->subs[ogg_d->num_sub].stream,page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
527 // Get first packet of the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
528 ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
529
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
530 // Reset our vars
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
531 sh_a = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
532 sh_v = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
533
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
534 // Check for Vorbis
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
535 if(pack.bytes >= 7 && ! strncmp(&pack.packet[1],"vorbis", 6) ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
536 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
537 sh_a->format = 0xFFFE;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
538 ogg_d->subs[ogg_d->num_sub].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
539 n_audio++;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
540 mp_msg(MSGT_DEMUX,MSGL_V,"OGG : stream %d is vorbis\n",ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
541
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
542 /// Check for old header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
543 } else if(pack.bytes >= 142 && ! strncmp(&pack.packet[1],"Direct Show Samples embedded in Ogg",35) ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
544
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
545 // Old video header
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
546 if(get_uint32 (pack.packet+96) == 0x05589f80 && pack.bytes >= 184) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
547 sh_v = new_sh_video(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
548 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
549 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
550 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
551 sh_v->format = mmioFOURCC(pack.packet[68],pack.packet[69],
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
552 pack.packet[70],pack.packet[71]);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
553 sh_v->frametime = get_uint64(pack.packet+164)*0.0000001;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
554 sh_v->fps = 1/sh_v->frametime;
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
555 sh_v->disp_w = sh_v->bih->biWidth = get_uint32(pack.packet+176);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
556 sh_v->disp_h = sh_v->bih->biHeight = get_uint32(pack.packet+180);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
557 sh_v->bih->biBitCount = get_uint16(pack.packet+182);
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
558 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
559 sh_v->bih->biPlanes=1;
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
560 sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
561
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
562 ogg_d->subs[ogg_d->num_sub].samplerate = sh_v->fps;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
563 n_video++;
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
564 mp_msg(MSGT_DEMUX,MSGL_V,"OGG stream %d is video (old hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
565 if(verbose>0) print_video_header(sh_v->bih);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
566 // Old audio header
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
567 } else if(get_uint32(pack.packet+96) == 0x05589F81) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
568 unsigned int extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
569 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
570 extra_size = get_uint16(pack.packet+140);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
571 sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
572 sh_a->format = sh_a->wf->wFormatTag = get_uint16(pack.packet+124);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
573 sh_a->channels = sh_a->wf->nChannels = get_uint16(pack.packet+126);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
574 sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint32(pack.packet+128);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
575 sh_a->wf->nAvgBytesPerSec = get_uint32(pack.packet+132);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
576 sh_a->wf->nBlockAlign = get_uint16(pack.packet+136);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
577 sh_a->wf->wBitsPerSample = get_uint16(pack.packet+138);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
578 sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
579 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
580 if(extra_size > 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
581 memcpy(sh_a->wf+sizeof(WAVEFORMATEX),pack.packet+142,extra_size);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
582
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
583 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
584 n_audio++;
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
585 mp_msg(MSGT_DEMUX,MSGL_V,"OGG stream %d is audio (old hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
586 if(verbose>0) print_wave_header(sh_a->wf);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
587 } else
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
588 mp_msg(MSGT_DEMUX,MSGL_WARN,"OGG stream %d contain an old header but the header type is unknow\n",ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
589
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
590 // Check new header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
591 } else if ( (*pack.packet & PACKET_TYPE_BITS ) == PACKET_TYPE_HEADER &&
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
592 pack.bytes >= (int)sizeof(stream_header)+1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
593 stream_header *st = (stream_header*)(pack.packet+1);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
594 /// New video header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
595 if(strncmp(st->streamtype,"video",5) == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
596 sh_v = new_sh_video(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
597 sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
598 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER);
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
599 sh_v->bih->biCompression=
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
600 sh_v->format = mmioFOURCC(st->subtype[0],st->subtype[1],
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
601 st->subtype[2],st->subtype[3]);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
602 sh_v->frametime = get_uint64(&st->time_unit)*0.0000001;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
603 sh_v->fps = 1.0/sh_v->frametime;
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
604 sh_v->bih->biBitCount = get_uint16(&st->bits_per_sample);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
605 sh_v->disp_w = sh_v->bih->biWidth = get_uint32(&st->sh.video.width);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
606 sh_v->disp_h = sh_v->bih->biHeight = get_uint32(&st->sh.video.height);
5430
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
607 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
608 sh_v->bih->biPlanes=1;
779ebb242aec argh, some samples sue new header chunks - fixed
arpi
parents: 5429
diff changeset
609 sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
610
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
611 ogg_d->subs[ogg_d->num_sub].samplerate= sh_v->fps;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
612 n_video++;
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
613 mp_msg(MSGT_DEMUX,MSGL_V,"OGG stream %d is video (new hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
614 if(verbose>0) print_video_header(sh_v->bih);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
615 /// New audio header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
616 } else if(strncmp(st->streamtype,"audio",5) == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
617 char buffer[5];
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
618 unsigned int extra_size = get_uint32 (&st->size) - sizeof(stream_header);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
619 memcpy(buffer,st->subtype,4);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
620 buffer[4] = '\0';
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
621 sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
622 sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size);
6850
5abb9367b128 ogm audio format id is in hex, not dec
arpi
parents: 6156
diff changeset
623 sh_a->format = sh_a->wf->wFormatTag = strtol(buffer, NULL, 16);
7845
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
624 sh_a->channels = sh_a->wf->nChannels = get_uint16(&st->sh.audio.channels);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
625 sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint64(&st->samples_per_unit);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
626 sh_a->wf->nAvgBytesPerSec = get_uint32(&st->sh.audio.avgbytespersec);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
627 sh_a->wf->nBlockAlign = get_uint16(&st->sh.audio.blockalign);
86420d5d7283 endianess independency (using get int 16/32/64 func instead of typecasting pointer)
arpi
parents: 7760
diff changeset
628 sh_a->wf->wBitsPerSample = get_uint16(&st->bits_per_sample);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
629 sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
630 sh_a->wf->cbSize = extra_size;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
631 if(extra_size)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
632 memcpy(sh_a->wf+sizeof(WAVEFORMATEX),st+1,extra_size);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
633
7396
cfb1bc3925eb The granule position of pages contining Vorbis audio is in units of
arpi
parents: 7115
diff changeset
634 ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
635 n_audio++;
5429
e9e2dc1306b1 BITMAPINFOHEADER fixed to be accepted by win32 decoders (divx,divxds)
arpi
parents: 5428
diff changeset
636 mp_msg(MSGT_DEMUX,MSGL_V,"OGG stream %d is audio (new hdr)\n",ogg_d->num_sub);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7845
diff changeset
637 if(verbose>0) print_wave_header(sh_a->wf);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
638
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
639 /// Check for text (subtitles) header
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
640 } else if (strncmp(st->streamtype, "text", 4) == 0) {
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
641 mp_msg(MSGT_DEMUX, MSGL_V, "OGG stream %d is text\n", ogg_d->num_sub);
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
642 if(demuxer->sub->id==-1) demuxer->sub->id = ogg_d->num_sub;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
643 n_text++;
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
644 demux_ogg_init_sub();
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
645 //// Unknow header type
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
646 } else
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
647 mp_msg(MSGT_DEMUX,MSGL_ERR,"OGG stream %d has a header marker but is of an unknow type\n",ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
648 /// Unknow (invalid ?) header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
649 } else
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
650 mp_msg(MSGT_DEMUX,MSGL_ERR,"OGG stream %d is of an unknow type\n",ogg_d->num_sub);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
651
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
652 if(sh_a || sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
653 demux_stream_t* ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
654 if(sh_a) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
655 // If the audio stream is not defined we took the first one
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
656 if(demuxer->audio->id == -1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
657 demuxer->audio->id = ogg_d->num_sub;
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
658 // if(sh_a->wf) print_wave_header(sh_a->wf);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
659 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
660 /// Is it the stream we want
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
661 if(demuxer->audio->id == ogg_d->num_sub) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
662 demuxer->audio->sh = sh_a;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
663 sh_a->ds = demuxer->audio;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
664 ds = demuxer->audio;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
665 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
666 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
667 if(sh_v) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
668 /// Also for video
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
669 if(demuxer->video->id == -1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
670 demuxer->video->id = ogg_d->num_sub;
5428
a43b00b28081 fixed 10l bug: using ds instead of dp, and adding some debug prints
arpi
parents: 5133
diff changeset
671 // if(sh_v->bih) print_video_header(sh_v->bih);
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
672 }
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
673 if(demuxer->video->id == ogg_d->num_sub) {
6124
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
674 demuxer->video->sh = sh_v;
12b1f920c1f4 a/v stream selection - patch by alexander.werth@gmx.de
arpi
parents: 5812
diff changeset
675 sh_v->ds = demuxer->video;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
676 ds = demuxer->video;
6156
f961a25a9257 10L bugfix
albeu
parents: 6124
diff changeset
677 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
678 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
679 /// Add the header packets if the stream isn't seekable
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
680 if(ds && (!s->end_pos || index_mode != 2)) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
681 /// Finish the page, otherwise packets will be lost
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
682 do {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
683 demux_ogg_add_packet(ds,&ogg_d->subs[ogg_d->num_sub],&pack);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
684 } while(ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack) == 1);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
685 }
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
686 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
687 ogg_d->num_sub++;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
688 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
689
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
690 /// Finish to setup the demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
691 demuxer->priv = ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
692
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
693 if(!n_video)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
694 demuxer->video->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
695 if(!n_audio)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
696 demuxer->audio->id = -2;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
697 if(!n_text)
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
698 demuxer->sub->id = -2;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
699
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
700 if(!s->end_pos)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
701 demuxer->seekable = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
702 else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
703 demuxer->movi_start = 0;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
704 demuxer->movi_end = s->end_pos;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
705 demuxer->seekable = 1;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
706 if(index_mode == 2)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
707 demux_ogg_build_syncpoints_table(demuxer);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
708 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
709
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
710 mp_msg(MSGT_DEMUX,MSGL_V,"OGG demuxer : found %d audio stream%s, %d video stream%s and %d text stream%s\n",n_audio,n_audio>1?"s":"",n_video,n_video>1?"s":"",n_text,n_text>1?"s":"");
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
711
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
712 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
713 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
714
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
715
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
716 int demux_ogg_fill_buffer(demuxer_t *d) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
717 ogg_demuxer_t* ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
718 stream_t *s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
719 demux_stream_t *ds;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
720 ogg_sync_state* sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
721 ogg_stream_state* os;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
722 ogg_page* page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
723 ogg_packet pack;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
724 int np = 0, id=0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
725
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
726 s = d->stream;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
727 ogg_d = d->priv;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
728 sync = &ogg_d->sync;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
729 page = &ogg_d->page;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
730
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
731 /// Find the stream we are working on
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
732 if ( (id = demux_ogg_get_page_stream(ogg_d,&os)) < 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
733 mp_msg(MSGT_DEMUX,MSGL_ERR,"OGG demuxer : can't get current stream\n");
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
734 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
735 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
736
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
737 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
738 np = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
739 ds = NULL;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
740 /// Try to get some packet from the current page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
741 while( (np = ogg_stream_packetout(os,&pack)) != 1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
742 /// No packet we go the next page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
743 if(np == 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
744 while(1) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
745 int pa,len;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
746 char *buf;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
747 ogg_d->pos += ogg_d->last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
748 /// Get the next page from the physical stream
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
749 while( (pa = ogg_sync_pageseek(sync,page)) <= 0) {
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
750 /// Error : we skip some bytes
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
751 if(pa < 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
752 mp_msg(MSGT_DEMUX,MSGL_WARN,"OGG : Page out not synced, we skip some bytes\n");
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
753 ogg_d->pos -= pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
754 continue;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
755 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
756 /// We need more data
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
757 buf = ogg_sync_buffer(sync,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
758 len = stream_read(s,buf,BLOCK_SIZE);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
759 if(len == 0 && s->eof) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
760 mp_msg(MSGT_DEMUX,MSGL_DBG2,"OGG : Stream EOF !!!!\n");
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
761 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
762 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
763 ogg_sync_wrote(sync,len);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
764 } /// Page loop
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
765 ogg_d->last_size = pa;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
766 /// Find the page's logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
767 if( (id = demux_ogg_get_page_stream(ogg_d,&os)) < 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
768 mp_msg(MSGT_DEMUX,MSGL_ERR,"OGG demuxer error : we met an unknow stream\n");
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
769 return 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
770 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
771 /// Take the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
772 if(ogg_stream_pagein(os,page) == 0)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
773 break;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
774 /// Page was invalid => retry
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
775 mp_msg(MSGT_DEMUX,MSGL_WARN,"OGG demuxer : got invalid page !!!!!\n");
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
776 ogg_d->pos += ogg_d->last_size;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
777 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
778 } else /// Packet was corrupted
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
779 mp_msg(MSGT_DEMUX,MSGL_WARN,"OGG : bad packet in stream %d\n",id);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
780 } /// Packet loop
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
781
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
782 /// Is the actual logical stream in use ?
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
783 if(id == d->audio->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
784 ds = d->audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
785 else if(id == d->video->id)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
786 ds = d->video;
7010
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
787 else if (id == d->sub->id)
fed45d810822 ogg (.ogm) text subtitles support
arpi
parents: 6850
diff changeset
788 ds = d->sub;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
789
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
790 if(ds) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
791 if(!demux_ogg_add_packet(ds,&ogg_d->subs[id],&pack))
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
792 continue; /// Unuseful packet, get another
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
793 d->filepos = ogg_d->pos;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
794 return 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
795 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
796
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
797 } /// while(1)
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
798
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
799 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
800
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
801 /// 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
802 // stream, then we join the avi and ogg demuxer with a demuxers demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
803 demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
804 demuxer_t *od;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
805 ogg_demuxer_t *ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
806 stream_t* s;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
807 uint32_t hdrsizes[3];
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
808 demux_packet_t *dp;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
809 sh_audio_t *sh_audio = demuxer->audio->sh;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
810 int np;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
811 unsigned char *p = NULL,*buf;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
812 int plen;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
813
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
814 /// Check that the cbSize is enouth big for the following reads
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
815 if(sh_audio->wf->cbSize < 3*sizeof(uint32_t)) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
816 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI OGG : Initial audio header is too small !!!!!\n");
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
817 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
818 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
819 /// Get the size of the 3 header packet
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
820 memcpy(hdrsizes, ((unsigned char*)sh_audio->wf)+2*sizeof(WAVEFORMATEX), 3*sizeof(uint32_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
821
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
822 /// Check the size
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
823 if(sh_audio->wf->cbSize < 3*sizeof(uint32_t) + sizeof(uint32_t)+hdrsizes[0]+hdrsizes[1] + hdrsizes[2]) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
824 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI OGG : Audio header is too small !!!!!\n");
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
825 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
826 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
827
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
828 // Build the ogg demuxer private datas
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
829 ogg_d = (ogg_demuxer_t*)calloc(1,sizeof(ogg_demuxer_t));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
830 ogg_d->num_sub = 1;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
831 ogg_d->subs = (ogg_stream_t*)malloc(sizeof(ogg_stream_t));
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
832 ogg_d->subs[0].vorbis = 1;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
833
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
834 // Init the ogg physical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
835 ogg_sync_init(&ogg_d->sync);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
836
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
837 // Get the first page of the stream : we assume there only 1 logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
838 while((np = ogg_sync_pageout(&ogg_d->sync,&ogg_d->page)) <= 0 ) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
839 if(np < 0) {
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
840 mp_msg(MSGT_DEMUX,MSGL_ERR,"AVI OGG error : Can't init using first stream packets\n");
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
841 free(ogg_d);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
842 goto fallback;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
843 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
844 // Add some data
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
845 plen = ds_get_packet(demuxer->audio,&p);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
846 buf = ogg_sync_buffer(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
847 memcpy(buf,p,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
848 ogg_sync_wrote(&ogg_d->sync,plen);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
849 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
850 // Init the logical stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
851 mp_msg(MSGT_DEMUX,MSGL_DBG2,"AVI OGG found page with serial %d\n",ogg_page_serialno(&ogg_d->page));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
852 ogg_stream_init(&ogg_d->subs[0].stream,ogg_page_serialno(&ogg_d->page));
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
853 // Write the page
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
854 ogg_stream_pagein(&ogg_d->subs[0].stream,&ogg_d->page);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
855
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
856 // Create the ds_stream and the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
857 s = new_ds_stream(demuxer->audio);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
858 od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
859
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
860 /// Add the header packets in the ogg demuxer audio stream
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
861 // Initial header
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
862 dp = new_demux_packet(hdrsizes[0]);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
863 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+2*sizeof(WAVEFORMATEX)+3*sizeof(uint32_t),hdrsizes[0]);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
864 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
865 /// Comments
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
866 dp = new_demux_packet(hdrsizes[1]);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
867 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+2*sizeof(WAVEFORMATEX)+3*sizeof(uint32_t)+hdrsizes[0],hdrsizes[1]);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
868 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
869 /// Code book
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
870 dp = new_demux_packet(hdrsizes[2]);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
871 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+2*sizeof(WAVEFORMATEX)+3*sizeof(uint32_t)+hdrsizes[0]+hdrsizes[1],hdrsizes[2]);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
872 ds_add_packet(od->audio,dp);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
873
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
874 // Finish setting up the ogg demuxer
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
875 od->priv = ogg_d;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
876 sh_audio = new_sh_audio(od,0);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
877 od->audio->id = 0;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
878 od->video->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
879 od->audio->sh = sh_audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
880 sh_audio->ds = od->audio;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
881 sh_audio->format = 0xFFFE;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
882
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
883 /// Return the joined demuxers
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
884 return new_demuxers_demuxer(demuxer,od,demuxer);
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
885
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
886 fallback:
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
887 demuxer->audio->id = -2;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
888 return demuxer;
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
889
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
890 }
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
891
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
892 extern void resync_audio_stream(sh_audio_t *sh_audio);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 8027
diff changeset
893
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
894 void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
895 ogg_demuxer_t* ogg_d = demuxer->priv;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
896 ogg_sync_state* sync = &ogg_d->sync;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
897 ogg_page* page= &ogg_d->page;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
898 ogg_stream_state* oss;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
899 ogg_stream_t* os;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
900 demux_stream_t* ds;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
901 sh_audio_t* sh_audio = demuxer->audio->sh;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
902 ogg_packet op;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
903 float rate;
8655
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
904 int i,sp,first;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
905 vorbis_info* vi = NULL;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
906 int64_t gp = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
907 off_t pos;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
908
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
909 if(demuxer->video->id >= 0) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
910 ds = demuxer->video;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
911 rate = ogg_d->subs[ds->id].samplerate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
912 } else {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
913 ds = demuxer->audio;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
914 vi = &((ov_struct_t*)((sh_audio_t*)ds->sh)->context)->vi;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
915 rate = (float)vi->rate;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
916 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
917
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
918 os = &ogg_d->subs[ds->id];
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
919 oss = &os->stream;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
920
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
921 if(ogg_d->syncpoints) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
922 float time_pos = flags & 1 ? 0 : os->lastpos/ rate;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
923 if(flags & 2) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
924 if(ogg_d->syncpoints)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
925 time_pos += ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos / rate * rel_seek_secs;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
926 else
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
927 time_pos += (demuxer->movi_end - demuxer->movi_start) * rel_seek_secs;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
928 } else
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
929 time_pos += rel_seek_secs;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
930
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
931 gp = time_pos * rate;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
932
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
933 for(sp = 0; sp < ogg_d->num_syncpoint ; sp++) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
934 if(ogg_d->syncpoints[sp].granulepos >= gp)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
935 break;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
936 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
937
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
938 if(sp >= ogg_d->num_syncpoint)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
939 return;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
940 pos = ogg_d->syncpoints[sp].page_pos;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
941
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
942 } else {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
943 pos = flags & 1 ? demuxer->movi_start : ogg_d->pos;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
944 if(flags & 2)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
945 pos += (demuxer->movi_end - demuxer->movi_start) * rel_seek_secs;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
946 else
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
947 pos += rel_seek_secs * ogg_d->pos / (os->lastpos / rate);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
948
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
949 if(pos < demuxer->movi_start)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
950 pos = demuxer->movi_start;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
951 else if(pos > demuxer->movi_end)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
952 return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
953 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
954
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
955 stream_seek(demuxer->stream,pos);
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
956 ogg_sync_reset(sync);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
957 for(i = 0 ; i < ogg_d->num_sub ; i++) {
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
958 ogg_stream_reset(&ogg_d->subs[i].stream);
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
959 ogg_d->subs[i].lastpos = ogg_d->subs[i].lastsize = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
960 }
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
961 ogg_d->pos = pos;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
962 ogg_d->last_size = 0;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
963
8655
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
964 first = 1;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
965 while(1) {
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
966 int np;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
967 ogg_d->pos += ogg_d->last_size;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
968 ogg_d->last_size = 0;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
969 np = ogg_sync_pageseek(sync,page);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
970
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
971 if(np < 0)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
972 ogg_d->pos -= np;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
973 if(np <= 0) { // We need more data
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
974 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
975 int len = stream_read(demuxer->stream,buf,BLOCK_SIZE);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
976 if(len == 0 && demuxer->stream->eof) {
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
977 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to seek !!!!\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
978 break;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
979 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
980 ogg_sync_wrote(sync,len);
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
981 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
982 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
983 ogg_d->last_size = np;
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
984 if(ogg_page_serialno(page) != oss->serialno)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
985 continue;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
986
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
987 if(ogg_stream_pagein(oss,page) != 0)
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
988 continue;
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
989
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
990 while(1) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
991 np = ogg_stream_packetout(oss,&op);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
992 if(np < 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
993 continue;
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
994 else if(np == 0)
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
995 break;
8655
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
996 if (first) { /* Discard the first packet as it's probably broken,
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
997 and we don't have any other means to decide whether it is
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
998 complete or not. */
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
999 first = 0;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1000 break;
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1001 }
f8e53f8cb8b2 bunkus: Fixed Ogg/Ogm seeking by discarding the first packet after the seek which may be incomplete
mosu
parents: 8618
diff changeset
1002
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1003 if( ((*op.packet & PACKET_IS_SYNCPOINT) || os->vorbis ) &&
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1004 (!ogg_d->syncpoints || op.granulepos >= gp) ) {
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1005 demux_ogg_add_packet(ds,os,&op);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1006 if(sh_audio)
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1007 resync_audio_stream(sh_audio);
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1008 return;
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1009 }
5809
4b24942acdbb Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents: 5732
diff changeset
1010 }
5732
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1011 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1012
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1013 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n");
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1014
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1015 }
6586448b5243 Seeking implemented
albeu
parents: 5430
diff changeset
1016
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1017 void demux_close_ogg(demuxer_t* demuxer) {
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1018 ogg_demuxer_t* ogg_d = demuxer->priv;
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1019
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1020 if(!ogg_d)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1021 return;
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1022
8618
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1023 #ifdef USE_ICONV
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1024 subcp_close();
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1025 #endif
a879b231b7e3 This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents: 8375
diff changeset
1026
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1027 if(ogg_d->subs)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1028 free(ogg_d->subs);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1029 if(ogg_d->syncpoints)
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1030 free(ogg_d->syncpoints);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1031 free(ogg_d);
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1032 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5809
diff changeset
1033
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff changeset
1034 #endif