Mercurial > mplayer.hg
annotate libmpdemux/demux_ogg.c @ 8653:5af3d90a8f6b
NetWM fs. switching cleanup
patch by Filip Kalinski <filon@pld.org.pl>
author | arpi |
---|---|
date | Mon, 30 Dec 2002 00:47:43 +0000 |
parents | a879b231b7e3 |
children | f8e53f8cb8b2 |
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 | 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 | 80 typedef struct ogg_syncpoint { |
81 int64_t granulepos; | |
82 off_t page_pos; | |
83 } ogg_syncpoint_t; | |
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 | 94 int hdr_packets; |
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 | 106 ogg_syncpoint_t* syncpoints; |
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 | 111 #define NUM_VORBIS_HDR_PACKETS 3 |
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 | 122 //-------- subtitle support - should be moved to decoder layer, and queue |
123 // - subtitles up in demuxer buffer... | |
124 | |
125 #include "../subreader.h" | |
126 #include "../libvo/sub.h" | |
127 #define OGG_SUB_MAX_LINE 128 | |
128 | |
129 static subtitle ogg_sub; | |
130 extern subtitle* vo_sub; | |
131 //FILE* subout; | |
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 | 183 void demux_ogg_init_sub () { |
184 int lcv; | |
185 if(!ogg_sub.text[0]) // not yet allocated | |
186 for (lcv = 0; lcv < SUB_MAX_TEXT; lcv++) { | |
187 ogg_sub.text[lcv] = (char*)malloc(OGG_SUB_MAX_LINE); | |
188 } | |
189 } | |
190 | |
191 void demux_ogg_add_sub (char* packet) { | |
192 int lcv; | |
193 int line_pos = 0; | |
194 int ignoring = 0; | |
195 | |
196 mp_msg(MSGT_DEMUX,MSGL_DBG2,"\ndemux_ogg_add_sub %02X %02X %02X '%s'\n", | |
197 (unsigned char)packet[0], | |
198 (unsigned char)packet[1], | |
199 (unsigned char)packet[2], | |
200 &packet[3]); | |
201 | |
202 ogg_sub.lines = 0; | |
203 if (((unsigned char)packet[0]) == 0x88) { // some subtitle text | |
204 lcv = 3; | |
205 while (1) { | |
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 | 208 ogg_sub.text[ogg_sub.lines][line_pos] = 0; // close sub |
209 if(line_pos) ogg_sub.lines++; | |
210 if(!c || ogg_sub.lines>=SUB_MAX_TEXT) break; // EOL or TooMany | |
211 line_pos = 0; | |
212 } | |
213 switch (c) { | |
214 case '\r': | |
215 case '\n': // just ignore linefeeds for now | |
216 // their placement seems rather haphazard | |
217 break; | |
218 case '<': // some html markup, ignore for now | |
219 ignoring = 1; | |
220 break; | |
221 case '>': | |
222 ignoring = 0; | |
223 break; | |
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 | 226 ogg_sub.text[ogg_sub.lines][line_pos++] = c; |
227 break; | |
228 } | |
229 } | |
230 } | |
231 | |
232 mp_msg(MSGT_DEMUX,MSGL_DBG2,"ogg sub lines: %d first: '%s'\n", | |
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 | 237 vo_sub = &ogg_sub; |
238 vo_osd_changed(OSDTYPE_SUBTITLE); | |
239 } | |
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 | 265 static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,vorbis_info* vi,float* pts,int* flags) { |
266 unsigned char* data; | |
267 | |
268 *pts = 0; | |
269 *flags = 0; | |
270 | |
271 if(os->vorbis) { | |
272 data = pack->packet; | |
273 if(*pack->packet & PACKET_TYPE_HEADER) | |
274 os->hdr_packets++; | |
275 else if(vi) { | |
276 // When we dump the audio, there is no vi, but we dont care of timestamp in this case | |
277 int32_t blocksize = vorbis_packet_blocksize(vi,pack) / vi->channels; | |
278 // Calculate the timestamp if the packet don't have any | |
279 if(pack->granulepos == -1) { | |
280 pack->granulepos = os->lastpos; | |
281 if(os->lastsize > 0) | |
282 pack->granulepos += os->lastsize; | |
283 } | |
284 *pts = pack->granulepos / (float)vi->rate; | |
285 os->lastsize = blocksize; | |
286 os->lastpos = pack->granulepos; | |
287 } | |
288 } else { | |
289 // Find data start | |
290 int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6; | |
291 hdrlen |= (*pack->packet & PACKET_LEN_BITS2) <<1; | |
292 data = pack->packet + 1 + hdrlen; | |
293 // Calculate the timestamp | |
294 if(pack->granulepos == -1) | |
295 pack->granulepos = os->lastpos + os->lastsize; | |
296 // If we alredy have a timestamp it can be a syncpoint | |
297 if(*pack->packet & PACKET_IS_SYNCPOINT) | |
298 *flags = 1; | |
299 *pts = pack->granulepos/os->samplerate; | |
300 // Save the packet length and timestamp | |
301 os->lastsize = 0; | |
302 while(hdrlen) { | |
303 os->lastsize <<= 8; | |
304 os->lastsize |= pack->packet[hdrlen]; | |
305 hdrlen--; | |
306 } | |
307 os->lastpos = pack->granulepos; | |
308 } | |
309 return data; | |
310 } | |
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 | 321 if (ds == d->sub) { // don't want to add subtitles to the demuxer for now |
322 demux_ogg_add_sub(pack->packet); | |
323 return 0; | |
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 | 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 | 331 if(ds == d->audio && ((sh_audio_t*)ds->sh)->format == 0xFFFE) |
332 data = demux_ogg_read_packet(os,pack,&((ov_struct_t*)((sh_audio_t*)ds->sh)->context)->vi, | |
333 &pts,&flags); | |
334 else | |
335 data = demux_ogg_read_packet(os,pack,NULL,&pts,&flags); | |
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 | 349 /// Build a table of all syncpoints to make seeking easier |
350 void demux_ogg_build_syncpoints_table(demuxer_t* demuxer) { | |
351 ogg_demuxer_t* ogg_d = demuxer->priv; | |
352 stream_t *s = demuxer->stream; | |
353 ogg_sync_state* sync = &ogg_d->sync; | |
354 ogg_page* page= &ogg_d->page; | |
355 ogg_stream_state* oss; | |
356 ogg_stream_t* os; | |
357 ogg_packet op; | |
358 int np,sid,p; | |
359 vorbis_info* vi = NULL; | |
360 off_t pos, last_pos; | |
361 pos = last_pos = demuxer->movi_start; | |
362 | |
363 // Reset the stream | |
364 stream_seek(s,demuxer->movi_start); | |
365 ogg_sync_reset(sync); | |
366 | |
367 // Get the serial number of the stream we use | |
368 if(demuxer->video->id >= 0) | |
369 sid = demuxer->video->id; | |
370 else { | |
371 sid = demuxer->audio->id; | |
372 if(((sh_audio_t*)demuxer->audio->sh)->format == 0xFFFE) | |
373 vi = &((ov_struct_t*)((sh_audio_t*)demuxer->audio->sh)->context)->vi; | |
374 } | |
375 os = &ogg_d->subs[sid]; | |
376 oss = &os->stream; | |
377 | |
378 while(1) { | |
379 np = ogg_sync_pageseek(sync,page); | |
380 if(np < 0) { // We had to skip some bytes | |
381 mp_msg(MSGT_DEMUX,MSGL_ERR,"Bad page sync while building syncpoints table (%ld)\n",-np); | |
382 pos += -np; | |
383 continue; | |
384 } | |
385 if(np <= 0) { // We need more data | |
386 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE); | |
387 int len = stream_read(s,buf,BLOCK_SIZE); | |
388 if(len == 0 && s->eof) | |
389 break; | |
390 ogg_sync_wrote(sync,len); | |
391 continue; | |
392 } | |
393 // The page is ready | |
394 //ogg_sync_pageout(sync,page); | |
395 if(ogg_page_serialno(page) != os->stream.serialno) { // It isn't a page from the stream we want | |
396 pos += np; | |
397 continue; | |
398 } | |
399 if(ogg_stream_pagein(oss,page) != 0) { | |
400 mp_msg(MSGT_DEMUX,MSGL_ERR,"Pagein error ????\n"); | |
401 pos += np; | |
402 continue; | |
403 } | |
404 p = 0; | |
405 while(ogg_stream_packetout(oss,&op) == 1) { | |
406 float pts; | |
407 int flags; | |
408 demux_ogg_read_packet(os,&op,vi,&pts,&flags); | |
409 if(flags || (os->vorbis && op.granulepos >= 0)) { | |
410 ogg_d->syncpoints = (ogg_syncpoint_t*)realloc(ogg_d->syncpoints,(ogg_d->num_syncpoint+1)*sizeof(ogg_syncpoint_t)); | |
411 ogg_d->syncpoints[ogg_d->num_syncpoint].granulepos = op.granulepos; | |
412 ogg_d->syncpoints[ogg_d->num_syncpoint].page_pos = (ogg_page_continued(page) && p == 0) ? last_pos : pos; | |
413 ogg_d->num_syncpoint++; | |
414 } | |
415 p++; | |
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 | 418 last_pos = pos; |
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 | 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 | 423 |
424 mp_msg(MSGT_DEMUX,MSGL_V,"Ogg syncpoints table builed: %d syncpoints\n",ogg_d->num_syncpoint); | |
425 | |
426 stream_reset(s); | |
427 stream_seek(s,demuxer->movi_start); | |
428 ogg_sync_reset(sync); | |
429 for(np = 0 ; np < ogg_d->num_sub ; np++) { | |
430 ogg_stream_reset(&ogg_d->subs[np].stream); | |
431 ogg_d->subs[np].lastpos = ogg_d->subs[np].lastsize = ogg_d->subs[np].hdr_packets = 0; | |
432 } | |
433 | |
434 | |
435 // Get the first page | |
436 while(1) { | |
437 np = ogg_sync_pageout(sync,page); | |
438 if(np <= 0) { // We need more data | |
439 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE); | |
440 int len = stream_read(s,buf,BLOCK_SIZE); | |
441 if(len == 0 && s->eof) { | |
442 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to get the first page !!!!\n"); | |
443 break; | |
444 } | |
445 | |
446 ogg_sync_wrote(sync,len); | |
447 continue; | |
448 } | |
449 demux_ogg_get_page_stream(ogg_d,&oss); | |
450 ogg_stream_pagein(oss,page); | |
451 break; | |
452 } | |
453 | |
454 } | |
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 | 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 | 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 | 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 | 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 | 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 | 598 sh_v->bih->biSize=sizeof(BITMAPINFOHEADER); |
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 | 607 if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME |
608 sh_v->bih->biPlanes=1; | |
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 | 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 | 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 | 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 | 640 } else if (strncmp(st->streamtype, "text", 4) == 0) { |
641 mp_msg(MSGT_DEMUX, MSGL_V, "OGG stream %d is text\n", ogg_d->num_sub); | |
642 if(demuxer->sub->id==-1) demuxer->sub->id = ogg_d->num_sub; | |
643 n_text++; | |
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 | 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 | 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 | 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 | 677 } |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
678 } |
5732 | 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 | 681 /// Finish the page, otherwise packets will be lost |
682 do { | |
683 demux_ogg_add_packet(ds,&ogg_d->subs[ogg_d->num_sub],&pack); | |
684 } while(ogg_stream_packetout(&ogg_d->subs[ogg_d->num_sub].stream,&pack) == 1); | |
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 | 697 if(!n_text) |
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 | 700 if(!s->end_pos) |
701 demuxer->seekable = 0; | |
702 else { | |
703 demuxer->movi_start = 0; | |
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 | 708 } |
709 | |
7010 | 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 | 787 else if (id == d->sub->id) |
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 | 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 | 894 void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { |
895 ogg_demuxer_t* ogg_d = demuxer->priv; | |
896 ogg_sync_state* sync = &ogg_d->sync; | |
897 ogg_page* page= &ogg_d->page; | |
898 ogg_stream_state* oss; | |
899 ogg_stream_t* os; | |
900 demux_stream_t* ds; | |
901 sh_audio_t* sh_audio = demuxer->audio->sh; | |
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; |
5732 | 904 int i,sp; |
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 | 908 |
909 if(demuxer->video->id >= 0) { | |
910 ds = demuxer->video; | |
911 rate = ogg_d->subs[ds->id].samplerate; | |
912 } else { | |
913 ds = demuxer->audio; | |
914 vi = &((ov_struct_t*)((sh_audio_t*)ds->sh)->context)->vi; | |
915 rate = (float)vi->rate; | |
916 } | |
917 | |
918 os = &ogg_d->subs[ds->id]; | |
919 oss = &os->stream; | |
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 | 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 | 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 | 953 } |
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 | 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 | 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 | 963 |
964 while(1) { | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
965 int np; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
966 ogg_d->pos += ogg_d->last_size; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
967 ogg_d->last_size = 0; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
968 np = ogg_sync_pageseek(sync,page); |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
969 |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
970 if(np < 0) |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
971 ogg_d->pos -= np; |
5732 | 972 if(np <= 0) { // We need more data |
973 char* buf = ogg_sync_buffer(sync,BLOCK_SIZE); | |
974 int len = stream_read(demuxer->stream,buf,BLOCK_SIZE); | |
975 if(len == 0 && demuxer->stream->eof) { | |
976 mp_msg(MSGT_DEMUX,MSGL_ERR,"EOF while trying to seek !!!!\n"); | |
977 break; | |
978 } | |
979 ogg_sync_wrote(sync,len); | |
980 continue; | |
981 } | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
982 ogg_d->last_size = np; |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
983 if(ogg_page_serialno(page) != oss->serialno) |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
984 continue; |
5732 | 985 |
986 if(ogg_stream_pagein(oss,page) != 0) | |
987 continue; | |
988 | |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
989 while(1) { |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
990 np = ogg_stream_packetout(oss,&op); |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
991 if(np < 0) |
5732 | 992 continue; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
993 else if(np == 0) |
5732 | 994 break; |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
995 |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
996 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
|
997 (!ogg_d->syncpoints || op.granulepos >= gp) ) { |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
998 demux_ogg_add_packet(ds,os,&op); |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
999 if(sh_audio) |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1000 resync_audio_stream(sh_audio); |
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1001 return; |
5732 | 1002 } |
5809
4b24942acdbb
Add seeking without index (still not perfect). Use -forceidx for the
albeu
parents:
5732
diff
changeset
|
1003 } |
5732 | 1004 } |
1005 | |
1006 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n"); | |
1007 | |
1008 } | |
1009 | |
5812 | 1010 void demux_close_ogg(demuxer_t* demuxer) { |
1011 ogg_demuxer_t* ogg_d = demuxer->priv; | |
1012 | |
1013 if(!ogg_d) | |
1014 return; | |
1015 | |
8618
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1016 #ifdef USE_ICONV |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1017 subcp_close(); |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1018 #endif |
a879b231b7e3
This patch adds a call to subcp_recode1(), so this subtitles too are
arpi
parents:
8375
diff
changeset
|
1019 |
5812 | 1020 if(ogg_d->subs) |
1021 free(ogg_d->subs); | |
1022 if(ogg_d->syncpoints) | |
1023 free(ogg_d->syncpoints); | |
1024 free(ogg_d); | |
1025 } | |
1026 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
diff
changeset
|
1027 #endif |