annotate libmpdemux/demux_real.c @ 8050:5f630596d004

- DR support - removed config(), the default impl. does the same (ie does nothing :)) - pass postprocess info too
author arpi
date Sat, 02 Nov 2002 17:38:15 +0000
parents b9da278e4c92
children b8a90a2af611
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1 /*
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
2 Real parser & demuxer
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
3
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
4 (C) Alex Beregszaszi <alex@naxine.org>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
5
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
6 Based on FFmpeg's libav/rm.c.
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
7
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
8 TODO: fix the whole syncing mechanism
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
9
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
10 $Log$
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7710
diff changeset
11 Revision 1.29 2002/11/01 17:46:43 arpi
b9da278e4c92 verbose can be negative
arpi
parents: 7710
diff changeset
12 verbose can be negative
b9da278e4c92 verbose can be negative
arpi
parents: 7710
diff changeset
13
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
14 Revision 1.28 2002/10/10 23:24:15 arpi
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
15 stream selection cleanup, fixed -nosound
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
16
7573
30e1c1f77737 rv10 cleanup
michael
parents: 7472
diff changeset
17 Revision 1.27 2002/10/01 20:01:04 michael
30e1c1f77737 rv10 cleanup
michael
parents: 7472
diff changeset
18 rv10 cleanup
30e1c1f77737 rv10 cleanup
michael
parents: 7472
diff changeset
19
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7105
diff changeset
20 Revision 1.26 2002/09/22 02:33:26 arpi
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7105
diff changeset
21 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7105
diff changeset
22
7105
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
23 Revision 1.25 2002/08/27 23:01:54 arpi
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
24 - added matrix cracking/debugging code - disabled
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
25 - use real codec headers for sipr
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
26
7085
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
27 Revision 1.24 2002/08/25 00:07:15 arpi
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
28 some files has some shit before teh audio/video headers...
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
29
7084
ffd4c6024cdb 10l - fixed chunktab size calculation
arpi
parents: 7081
diff changeset
30 Revision 1.23 2002/08/24 23:07:34 arpi
ffd4c6024cdb 10l - fixed chunktab size calculation
arpi
parents: 7081
diff changeset
31 10l - fixed chunktab size calculation
ffd4c6024cdb 10l - fixed chunktab size calculation
arpi
parents: 7081
diff changeset
32
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
33 Revision 1.22 2002/08/24 22:39:27 arpi
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
34 - changed re-muxed packet structure (see struct dp_hdr_t)
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
35 now the packets can be encapsulated into avi or other file formats
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
36 - skip redundant/resent fragments (bit 0x20 set of first byte of frag)
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
37
6995
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
38 Revision 1.21 2002/08/14 09:15:31 arpi
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
39 RV20 A-V desync fixed - use timestamp hack only for RV30
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
40
6982
9037a1a34c94 RV40 support
arpi
parents: 6916
diff changeset
41 Revision 1.20 2002/08/12 00:04:37 arpi
9037a1a34c94 RV40 support
arpi
parents: 6916
diff changeset
42 RV40 support
9037a1a34c94 RV40 support
arpi
parents: 6916
diff changeset
43
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
44 Revision 1.19 2002/08/05 03:13:45 arpi
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
45 fixed 'eof at 66s' bug
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
46
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
47 Revision 1.18 2002/06/14 00:49:56 arpi
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
48 fixed playback speed and a-v sync issues
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
49
6414
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
50 Revision 1.17 2002/06/13 13:31:45 arpi
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
51 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
52
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
53 Revision 1.16 2002/06/13 00:14:28 atmos4
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
54 Implement Nilmoni's and Bernd Ernesti's patches for:
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
55 Better real codec dir detection and NetBSD real support.
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
56 Fix Nilmonis code, so it's working like expected.
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
57 Move a debug printf to mp_msg and some fixes in demux_real.c.
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
58 Some cosmetics :) -> RealPlayer 8 to RealPlayer, as RealOne (aka RealPlayer 9 works, too)
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
59
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
60 Revision 1.15 2002/06/10 13:55:56 arpi
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
61 export subpacket-size and matrix w*h to the codec (cook)
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
62
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
63 Revision 1.14 2002/06/10 02:27:31 arpi
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
64 export extra data for cook codec, some debug stuff
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
65
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
66 Revision 1.13 2002/06/09 01:07:22 arpi
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
67 - multiple audio/video stream support fixed
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
68 - aid/vid autodetection (asf style - use id of first packet received)
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
69 - rv20 sub-packets support
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
70 - exporting codec id and sub-id to the codec, in bitmapinfoheader
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
71
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
72 Revision 1.12 2002/06/08 20:46:14 arpi
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
73 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
74 (little cleanup and fprintf->mp_msg by me)
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
75
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
76 Revision 1.11 2002/04/30 23:29:38 alex
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
77 completed real seeking - working very well with audio only files
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
78
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5083
diff changeset
79 Revision 1.10 2002/04/24 15:36:06 albeu
8a357300d0ec Added demuxer uninit
albeu
parents: 5083
diff changeset
80 Added demuxer uninit
8a357300d0ec Added demuxer uninit
albeu
parents: 5083
diff changeset
81
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
82 Revision 1.9 2002/03/15 15:51:37 alex
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
83 added PRE-ALPHA seeking ability and index table generator (like avi's one)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
84
4328
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
85 Revision 1.8 2002/01/23 19:41:01 alex
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
86 fixed num_of_packets and current_packet handling, bug found by Mike Melanson
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
87
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
88 Revision 1.7 2002/01/18 11:02:52 alex
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
89 fix dnet support
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
90
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
91 Revision 1.6 2002/01/04 19:32:58 alex
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
92 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
93
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
94
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
95 Audio codecs: (supported by RealPlayer8 for Linux)
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
96 DNET - RealAudio 3.0, really it's AC3 in swapped-byteorder
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
97 SIPR - SiproLab's audio codec, ACELP decoder working with MPlayer,
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
98 needs fine-tuning too :)
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
99 ATRC - RealAudio 8 (ATRAC3) - www.minidisc.org/atrac3_article.pdf,
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
100 ACM decoder uploaded, needs some fine-tuning to work
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
101 -> RealAudio 8
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
102 COOK/COKR - Real Cooker -> RealAudio G2
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
103
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
104 Video codecs: (supported by RealPlayer8 for Linux)
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
105 RV10 - H.263 based, working with libavcodec's decoder
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
106 RV20
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
107 RV30
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
108 */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
109
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
110 #include <stdio.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
111 #include <stdlib.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
112 #include <unistd.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
113
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
114 #include "config.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
115 #include "mp_msg.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
116 #include "help_mp.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
117
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
118 #include "stream.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
119 #include "demuxer.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
120 #include "stheader.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
121 #include "bswap.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
122
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
123 //#define mp_dbg(mod,lev, args... ) mp_msg_c((mod<<8)|lev, ## args )
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
124
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
125 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
126
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
127 #define MAX_STREAMS 32
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
128
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
129 typedef struct {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
130 int timestamp;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
131 int offset;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
132 int packetno;
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
133 int len; /* only filled by our index generator */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
134 int flags; /* only filled by our index generator */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
135 } real_index_table_t;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
136
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
137 typedef struct {
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
138 /* for seeking */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
139 int index_chunk_offset;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
140 real_index_table_t *index_table[MAX_STREAMS];
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
141 // int *index_table[MAX_STREAMS];
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
142 int index_table_size[MAX_STREAMS];
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
143 int data_chunk_offset;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
144 int num_of_packets;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
145 int current_packet;
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
146
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
147 int current_apacket;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
148 int current_vpacket;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
149
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
150 // timestamp correction:
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
151 int kf_pts; // timestamp of next video keyframe
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
152 int a_pts; // previous audio timestamp
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
153 float v_pts; // previous video timestamp
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
154
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
155 /* stream id table */
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
156 // int last_a_stream;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
157 // int a_streams[MAX_STREAMS];
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
158 // int last_v_stream;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
159 // int v_streams[MAX_STREAMS];
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
160 } real_priv_t;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
161
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
162 /* originally from FFmpeg */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
163 static void get_str(int isbyte, demuxer_t *demuxer, char *buf, int buf_size)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
164 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
165 int len;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
166
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
167 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
168 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
169 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
170 len = stream_read_word(demuxer->stream);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
171
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
172 stream_read(demuxer->stream, buf, (len > buf_size) ? buf_size : len);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
173 if (len > buf_size)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
174 stream_skip(demuxer->stream, len-buf_size);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
175
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
176 printf("read_str: %d bytes read\n", len);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
177 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
178
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
179 static void skip_str(int isbyte, demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
180 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
181 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
182
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
183 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
184 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
185 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
186 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
187
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
188 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
189
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
190 printf("skip_str: %d bytes skipped\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
191 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
192
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
193 static void dump_index(demuxer_t *demuxer, int stream_id)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
194 {
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
195 real_priv_t *priv = demuxer->priv;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
196 real_index_table_t *index;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
197 int i, entries;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
198
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7710
diff changeset
199 if (verbose<=0)
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
200 return;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
201
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
202 if (stream_id > MAX_STREAMS)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
203 return;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
204
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
205 index = priv->index_table[stream_id];
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
206 entries = priv->index_table_size[stream_id];
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
207
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
208 printf("Index table for stream %d\n", stream_id);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
209 for (i = 0; i < entries; i++)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
210 {
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
211 printf("packetno: %x pos: %x len: %x timestamp: %x flags: %x\n",
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
212 index[i].packetno, index[i].offset, index[i].len, index[i].timestamp,
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
213 index[i].flags);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
214 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
215 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
216
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
217 static int parse_index_chunk(demuxer_t *demuxer)
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
218 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
219 real_priv_t *priv = demuxer->priv;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
220 int origpos = stream_tell(demuxer->stream);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
221 int next_header_pos = priv->index_chunk_offset;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
222 int i, entries, stream_id;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
223
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
224 read_index:
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
225 stream_seek(demuxer->stream, next_header_pos);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
226
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
227 i = stream_read_dword_le(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
228 if ((i == -256) || (i != MKTAG('I', 'N', 'D', 'X')))
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
229 {
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
230 printf("Something went wrong, no index chunk found on given address (%d)\n",
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
231 next_header_pos);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
232 goto end;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
233 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
234
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
235 printf("Reading index table from index chunk (%d)\n",
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
236 next_header_pos);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
237
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
238 i = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
239 printf("size: %d bytes\n", i);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
240
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
241 i = stream_read_word(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
242 if (i != 0)
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
243 printf("Hmm, index table with unknown version (%d), please report it to MPlayer developers!\n", i);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
244
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
245 entries = stream_read_dword(demuxer->stream);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
246 printf("entries: %d\n", entries);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
247
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
248 stream_id = stream_read_word(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
249 printf("stream_id: %d\n", stream_id);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
250
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
251 next_header_pos = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
252 printf("next_header_pos: %d\n", next_header_pos);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
253 if (entries <= 0)
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
254 {
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
255 if (next_header_pos)
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
256 goto read_index;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
257 i = entries;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
258 goto end;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
259 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
260
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
261 priv->index_table_size[stream_id] = entries;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
262 priv->index_table[stream_id] = malloc(priv->index_table_size[stream_id] * sizeof(real_index_table_t));
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
263
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
264 for (i = 0; i < entries; i++)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
265 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
266 stream_skip(demuxer->stream, 2); /* version */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
267 priv->index_table[stream_id][i].timestamp = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
268 priv->index_table[stream_id][i].offset = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
269 priv->index_table[stream_id][i].packetno = stream_read_dword(demuxer->stream);
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
270 // printf("Index table: Stream#%d: entry: %d: pos: %d\n",
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
271 // stream_id, i, priv->index_table[stream_id][i].offset);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
272 }
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
273
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
274 dump_index(demuxer, stream_id);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
275
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
276 if (next_header_pos > 0)
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
277 goto read_index;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
278
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
279 end:
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
280 demuxer->seekable = 1; /* got index, we're able to seek */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
281 if (i == -256)
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
282 stream_reset(demuxer->stream);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
283 stream_seek(demuxer->stream, origpos);
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
284 if (i == -256)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
285 return 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
286 else
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
287 return 1;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
288 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
289
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
290 static int generate_index(demuxer_t *demuxer)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
291 {
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
292 real_priv_t *priv = demuxer->priv;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
293 int origpos = stream_tell(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
294 int data_pos = priv->data_chunk_offset-10;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
295 int num_of_packets = 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
296 int i, entries = 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
297 int len, stream_id = 0, timestamp, flags;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
298 int tab_pos = 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
299
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
300 read_index:
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
301 stream_seek(demuxer->stream, data_pos);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
302
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
303 i = stream_read_dword_le(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
304 if ((i == -256) || (i != MKTAG('D', 'A', 'T', 'A')))
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
305 {
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
306 printf("Something went wrong, no data chunk found on given address (%d)\n",
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
307 data_pos);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
308 goto end;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
309 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
310 stream_skip(demuxer->stream, 4); /* chunk size */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
311 stream_skip(demuxer->stream, 2); /* version */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
312
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
313 num_of_packets = stream_read_dword(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
314 printf("Generating index table from raw data (pos: 0x%x) for %d packets\n",
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
315 data_pos, num_of_packets);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
316
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
317 data_pos = stream_read_dword_le(demuxer->stream)-10; /* next data chunk */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
318
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
319 for (i = 0; i < MAX_STREAMS; i++)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
320 {
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
321 priv->index_table_size[i] = num_of_packets;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
322 priv->index_table[i] = malloc(priv->index_table_size[i] * sizeof(real_index_table_t));
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
323 // priv->index_table[stream_id] = realloc(priv->index_table[stream_id],
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
324 // priv->index_table_size[stream_id] * sizeof(real_index_table_t));
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
325 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
326
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
327 tab_pos = 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
328
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
329 // memset(priv->index_table_size, 0, sizeof(int)*MAX_STREAMS);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
330 // memset(priv->index_table, 0, sizeof(real_index_table_t)*MAX_STREAMS);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
331
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
332 while (tab_pos < num_of_packets)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
333 {
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
334 i = stream_read_char(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
335 if (i == -256)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
336 goto end;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
337 stream_skip(demuxer->stream, 1);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
338 // stream_skip(demuxer->stream, 2); /* version */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
339
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
340 len = stream_read_word(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
341 stream_id = stream_read_word(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
342 timestamp = stream_read_dword(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
343
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
344 stream_skip(demuxer->stream, 1); /* reserved */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
345 flags = stream_read_char(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
346
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
347 i = tab_pos;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
348
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
349 // priv->index_table_size[stream_id] = i;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
350 // if (priv->index_table[stream_id] == NULL)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
351 // priv->index_table[stream_id] = malloc(priv->index_table_size[stream_id] * sizeof(real_index_table_t));
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
352 // else
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
353 // priv->index_table[stream_id] = realloc(priv->index_table[stream_id],
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
354 // priv->index_table_size[stream_id] * sizeof(real_index_table_t));
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
355
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
356 priv->index_table[stream_id][i].timestamp = timestamp;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
357 priv->index_table[stream_id][i].offset = stream_tell(demuxer->stream)-12;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
358 priv->index_table[stream_id][i].len = len;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
359 priv->index_table[stream_id][i].packetno = entries;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
360 priv->index_table[stream_id][i].flags = flags;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
361
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
362 tab_pos++;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
363
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
364 /* skip data */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
365 stream_skip(demuxer->stream, len-12);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
366 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
367 dump_index(demuxer, stream_id);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
368 if (data_pos)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
369 goto read_index;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
370
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
371 end:
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
372 demuxer->seekable = 1; /* got index, we're able to seek */
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
373 if (i == -256)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
374 stream_reset(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
375 stream_seek(demuxer->stream, origpos);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
376 if (i == -256)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
377 return 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
378 else
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
379 return 1;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
380 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
381
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
382 int real_check_file(demuxer_t* demuxer)
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
383 {
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
384 real_priv_t *priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
385 int c;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
386
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
387 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for REAL\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
388
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
389 c = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
390 if (c == -256)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
391 return 0; /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
392 if (c != MKTAG('.', 'R', 'M', 'F'))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
393 return 0; /* bad magic */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
394
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
395 priv = malloc(sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
396 memset(priv, 0, sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
397 demuxer->priv = priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
398
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
399 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
400 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
401
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
402 void hexdump(char *, unsigned long);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
403
6995
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
404 static float real_fix_timestamp(real_priv_t* priv, unsigned char* s, int timestamp, float frametime, unsigned int format){
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
405 float v_pts;
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
406 int kf=timestamp;
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
407 if(format==0x30335652){ // RV30 timestamps:
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
408 kf=2*(((s[1]&15)<<8)+s[2]); // 12-bit timestamp from frame header
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
409 //kf=((s[1]<<8)+s[2])>>3; // 12-bit timestamp from frame header
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
410 printf("\nTS: %08X (%04X) %02X %02X %02X %02X\n",timestamp,kf,s[0],s[1],s[2],s[3]);
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
411 kf|=timestamp&(~0x1fff); // combine with packet timestamp
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
412 if(kf<timestamp-4096) kf+=8192; else // workaround wrap-around problems
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
413 if(kf>timestamp+4096) kf-=8192;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
414 if(!(s[0]&0x8) || !(s[0]&0x10)){ // P || I frame -> swap timestamps
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
415 int tmp=kf;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
416 kf=priv->kf_pts;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
417 priv->kf_pts=tmp;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
418 // if(kf<=tmp) kf=0;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
419 }
6995
8f92313a0cd5 RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents: 6982
diff changeset
420 }
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
421 v_pts=kf*0.001f;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
422 if(v_pts<priv->v_pts || !kf) v_pts=priv->v_pts+frametime;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
423 priv->v_pts=v_pts;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
424 // printf("\n#T# %5d/%5d (%5.3f) %5.3f \n",kf,timestamp,frametime,v_pts);
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
425 return v_pts;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
426 }
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
427
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
428 typedef struct dp_hdr_s {
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
429 uint32_t chunks; // number of chunks
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
430 uint32_t timestamp; // timestamp from packet header
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
431 uint32_t len; // length of actual data
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
432 uint32_t chunktab; // offset to chunk offset array
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
433 } dp_hdr_t;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
434
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
435 // return value:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
436 // 0 = EOF or no stream found
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
437 // 1 = successfully read a packet
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
438 int demux_real_fill_buffer(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
439 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
440 real_priv_t *priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
441 demux_stream_t *ds = NULL;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
442 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
443 int timestamp;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
444 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
445 int i;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
446 int flags;
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
447 int version;
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
448 int reserved;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
449
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
450 while(1){
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
451
4328
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
452 /* also don't check if no num_of_packets was defined in header */
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
453 if ((priv->current_packet > priv->num_of_packets) &&
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
454 (priv->num_of_packets != -10)){
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
455 printf("num_of_packets reached!\n");
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
456 return 0; /* EOF */
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
457 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
458
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
459 demuxer->filepos = stream_tell(demuxer->stream);
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
460 version = stream_read_word(demuxer->stream); /* version */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
461 len = stream_read_word(demuxer->stream);
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
462
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
463 if (len == -256){ /* EOF */
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
464 // printf("len==-256!\n");
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
465 return 0;
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
466 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
467 if (len < 12){
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
468 printf("%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
469 printf("bad packet len (%d)\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
470 stream_skip(demuxer->stream, len);
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
471 continue; //goto loop;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
472 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
473
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
474 stream_id = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
475 timestamp = stream_read_dword(demuxer->stream);
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
476 reserved = stream_read_char(demuxer->stream);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
477 flags = stream_read_char(demuxer->stream);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
478 /* flags: */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
479 /* 0x1 - reliable */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
480 /* 0x2 - keyframe */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
481
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
482 // printf("%08X: packet v%d len=%4d id=%d pts=%6d rvd=%d flags=%d \n",
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
483 // (int)demuxer->filepos,(int)version,(int)len, stream_id,
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
484 // (int) timestamp, reserved, flags);
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
485
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
486 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "len:%d\n", len);
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
487 mp_dbg(MSGT_DEMUX,MSGL_V, "\npacket#%d: pos: 0x%0x, len: %d, id: %d, pts: %d, flags: %x rvd:%d\n",
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
488 priv->current_packet, (int)demuxer->filepos, len, stream_id, timestamp, flags, reserved);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
489
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
490 priv->current_packet++;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
491 len -= 12;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
492
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
493 // printf("s_id=%d aid=%d vid=%d \n",stream_id,demuxer->audio->id,demuxer->video->id);
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
494
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
495 /* check stream_id: */
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
496
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
497 if(demuxer->audio->id==stream_id){
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
498 ds=demuxer->audio;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
499 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is audio (id: %d)\n", stream_id);
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
500
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
501 // parse audio chunk:
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
502 {
7105
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
503 #ifdef CRACK_MATRIX
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
504 int spos=stream_tell(demuxer->stream);
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
505 static int cnt=0;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
506 static int cnt2=CRACK_MATRIX;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
507 #endif
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
508 demux_packet_t *dp = new_demux_packet(len);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
509 stream_read(demuxer->stream, dp->buffer, len);
7105
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
510 #ifdef CRACK_MATRIX
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
511 printf("*** audio block len=%d\n",len);
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
512 { // HACK - used for reverse engineering the descrambling matrix
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
513 FILE* f=fopen("test.rm","r+");
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
514 fseek(f,spos,SEEK_SET);
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
515 ++cnt;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
516 // for(i=0;i<len;i++) dp->buffer[i]=i/0x12;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
517 // for(i=0;i<len;i++) dp->buffer[i]=i;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
518 // for(i=0;i<len;i++) dp->buffer[i]=cnt;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
519 // for(i=0;i<len;i++) dp->buffer[i]=cnt<<4;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
520 for(i=0;i<len;i++) dp->buffer[i]=(i==cnt2) ? (cnt+16*(8+cnt)) : 0;
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
521 if(cnt==6){ cnt=0; ++cnt2; }
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
522 fwrite(dp->buffer, len, 1, f);
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
523 fclose(f);
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
524 if(cnt2>0x150) *((int*)NULL)=1; // sig11 :)
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
525 }
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
526 #endif
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
527 if( ((sh_audio_t *)ds->sh)->format == 0x2000) {
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
528 // if DNET, swap bytes, as DNET is byte-swapped AC3:
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
529 char *ptr = dp->buffer;
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
530 int i;
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
531 for (i = 0; i < len; i += 2)
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
532 {
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
533 const char tmp = ptr[0];
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
534 ptr[0] = ptr[1];
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
535 ptr[1] = tmp;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
536 ptr += 2;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
537 }
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
538 }
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
539 dp->pts = (priv->a_pts==timestamp) ? 0 : (timestamp/1000.0f);
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
540 priv->a_pts=timestamp;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
541 dp->pos = demuxer->filepos;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
542 dp->flags = (flags & 0x2) ? 0x10 : 0;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
543 ds_add_packet(ds, dp);
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
544 }
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
545
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
546 return 1;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
547 }
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
548
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
549 if(demuxer->video->id==stream_id){
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
550 ds=demuxer->video;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
551 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is video (id: %d)\n", stream_id);
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
552
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
553 // parse video chunk:
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
554 {
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
555 // we need a more complicated, 2nd level demuxing, as the video
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
556 // frames are stored fragmented in the video chunks :(
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
557 sh_video_t *sh_video = ds->sh;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
558 demux_packet_t *dp;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
559 int vpkg_header, vpkg_length, vpkg_offset;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
560 int vpkg_seqnum=-1;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
561 int vpkg_subseq=0;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
562
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
563 while(len>2){
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
564 dp_hdr_t* dp_hdr;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
565 unsigned char* dp_data;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
566 uint32_t* extra;
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
567
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
568 // printf("xxx len=%d \n",len);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
569
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
570 // read packet header
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
571 // bit 7: 1=last block in block chain
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
572 // bit 6: 1=short header (only one block?)
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
573 vpkg_header=stream_read_char(demuxer->stream); --len;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
574 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "hdr: %0.2X (len=%d) ",vpkg_header,len);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
575
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
576 if (0x40==(vpkg_header&0xc0)) {
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
577 // seems to be a very short header
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
578 // 2 bytes, purpose of the second byte yet unknown
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
579 int bummer;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
580 bummer=stream_read_char(demuxer->stream); --len;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
581 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X",bummer);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
582 vpkg_offset=0;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
583 vpkg_length=len;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
584 } else {
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
585
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
586 if (0==(vpkg_header&0x40)) {
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
587 // sub-seqnum (bits 0-6: number of fragment. bit 7: ???)
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
588 vpkg_subseq=stream_read_char(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
589 --len;
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
590 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "subseq: %0.2X ",vpkg_subseq);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
591 vpkg_subseq&=0x7f;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
592 }
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
593
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
594 // size of the complete packet
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
595 // bit 14 is always one (same applies to the offset)
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
596 vpkg_length=stream_read_word(demuxer->stream);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
597 len-=2;
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
598 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "l: %0.2X %0.2X ",vpkg_length>>8,vpkg_length&0xff);
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
599 if (!(vpkg_length&0xC000)) {
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
600 vpkg_length<<=16;
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
601 vpkg_length|=stream_read_word(demuxer->stream);
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
602 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "l+: %0.2X %0.2X ",(vpkg_length>>8)&0xff,vpkg_length&0xff);
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
603 len-=2;
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
604 } else
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
605 vpkg_length&=0x3fff;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
606
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
607 // offset of the following data inside the complete packet
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
608 // Note: if (hdr&0xC0)==0x80 then offset is relative to the
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
609 // _end_ of the packet, so it's equal to fragment size!!!
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
610 vpkg_offset=stream_read_word(demuxer->stream);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
611 len-=2;
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
612 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "o: %0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
613 if (!(vpkg_offset&0xC000)) {
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
614 vpkg_offset<<=16;
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
615 vpkg_offset|=stream_read_word(demuxer->stream);
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
616 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "o+: %0.2X %0.2X ",(vpkg_offset>>8)&0xff,vpkg_offset&0xff);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
617 len-=2;
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
618 } else
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
619 vpkg_offset&=0x3fff;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
620
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
621 vpkg_seqnum=stream_read_char(demuxer->stream); --len;
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
622 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "seq: %0.2X ",vpkg_seqnum);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
623 }
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
624 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "\n");
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
625 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "blklen=%d\n", len);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
626 mp_msg(MSGT_DEMUX,MSGL_DBG2, "block: hdr=0x%0x, len=%d, offset=%d, seqnum=%d\n",
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
627 vpkg_header, vpkg_length, vpkg_offset, vpkg_seqnum);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
628
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
629 if(ds->asf_packet){
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
630 dp=ds->asf_packet;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
631 dp_hdr=(dp_hdr_t*)dp->buffer;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
632 dp_data=dp->buffer+sizeof(dp_hdr_t);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
633 extra=(uint32_t*)(dp->buffer+dp_hdr->chunktab);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
634 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "we have an incomplete packet (oldseq=%d new=%d)\n",ds->asf_seq,vpkg_seqnum);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
635 // we have an incomplete packet:
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
636 if(ds->asf_seq!=vpkg_seqnum){
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
637 // this fragment is for new packet, close the old one
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
638 mp_msg(MSGT_DEMUX,MSGL_DBG2, "closing probably incomplete packet, len: %d \n",dp->len);
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
639 dp->pts=(dp_hdr->len<3)?0:
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
640 real_fix_timestamp(priv,dp_data,dp_hdr->timestamp,sh_video->frametime,sh_video->format);
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
641 ds_add_packet(ds,dp);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
642 ds->asf_packet=NULL;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
643 } else {
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
644 // append data to it!
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
645 ++dp_hdr->chunks;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
646 mp_msg(MSGT_DEMUX,MSGL_DBG2,"[chunks=%d subseq=%d]\n",dp_hdr->chunks,vpkg_subseq);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
647 if(dp_hdr->chunktab+8*(1+dp_hdr->chunks)>dp->len){
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
648 // increase buffer size, this should not happen!
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
649 mp_msg(MSGT_DEMUX,MSGL_WARN, "chunktab buffer too small!!!!!\n");
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
650 dp->len=dp_hdr->chunktab+8*(4+dp_hdr->chunks);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
651 dp->buffer=realloc(dp->buffer,dp->len);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
652 // re-calc pointers:
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
653 dp_hdr=(dp_hdr_t*)dp->buffer;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
654 dp_data=dp->buffer+sizeof(dp_hdr_t);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
655 extra=(uint32_t*)(dp->buffer+dp_hdr->chunktab);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
656 }
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
657 extra[2*dp_hdr->chunks+0]=1;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
658 extra[2*dp_hdr->chunks+1]=dp_hdr->len;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
659 if(0x80==(vpkg_header&0xc0)){
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
660 // last fragment!
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
661 if(dp_hdr->len!=vpkg_length-vpkg_offset)
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
662 mp_msg(MSGT_DEMUX,MSGL_V,"warning! assembled.len=%d frag.len=%d total.len=%d \n",dp->len,vpkg_offset,vpkg_length-vpkg_offset);
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
663 stream_read(demuxer->stream, dp_data+dp_hdr->len, vpkg_offset);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
664 if(dp_data[dp_hdr->len]&0x20) --dp_hdr->chunks; else
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
665 dp_hdr->len+=vpkg_offset;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
666 len-=vpkg_offset;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
667 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "fragment (%d bytes) appended, %d bytes left\n",vpkg_offset,len);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
668 // we know that this is the last fragment -> we can close the packet!
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
669 dp->pts=(dp_hdr->len<3)?0:
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
670 real_fix_timestamp(priv,dp_data,dp_hdr->timestamp,sh_video->frametime,sh_video->format);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
671 ds_add_packet(ds,dp);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
672 ds->asf_packet=NULL;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
673 // continue parsing
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
674 continue;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
675 }
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
676 // non-last fragment:
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
677 if(dp_hdr->len!=vpkg_offset)
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
678 mp_msg(MSGT_DEMUX,MSGL_V,"warning! assembled.len=%d offset=%d frag.len=%d total.len=%d \n",dp->len,vpkg_offset,len,vpkg_length);
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
679 stream_read(demuxer->stream, dp_data+dp_hdr->len, len);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
680 if(dp_data[dp_hdr->len]&0x20) --dp_hdr->chunks; else
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
681 dp_hdr->len+=len;
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
682 len=0;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
683 break; // no more fragments in this chunk!
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
684 }
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
685 }
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
686 // create new packet!
7084
ffd4c6024cdb 10l - fixed chunktab size calculation
arpi
parents: 7081
diff changeset
687 dp = new_demux_packet(sizeof(dp_hdr_t)+vpkg_length+8*(1+2*(vpkg_header&0x3F)));
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
688 // the timestamp seems to be in milliseconds
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6414
diff changeset
689 dp->pts = 0; // timestamp/1000.0f; //timestamp=0;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
690 dp->pos = demuxer->filepos;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
691 dp->flags = (flags & 0x2) ? 0x10 : 0;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
692 ds->asf_seq = vpkg_seqnum;
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
693 dp_hdr=(dp_hdr_t*)dp->buffer;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
694 dp_hdr->chunks=0;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
695 dp_hdr->timestamp=timestamp;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
696 dp_hdr->chunktab=sizeof(dp_hdr_t)+vpkg_length;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
697 dp_data=dp->buffer+sizeof(dp_hdr_t);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
698 extra=(uint32_t*)(dp->buffer+dp_hdr->chunktab);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
699 extra[0]=1; extra[1]=0; // offset of the first chunk
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
700 if(0x00==(vpkg_header&0xc0)){
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
701 // first fragment:
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
702 dp_hdr->len=len;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
703 stream_read(demuxer->stream, dp_data, len);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
704 ds->asf_packet=dp;
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
705 len=0;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
706 break;
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
707 }
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
708 // whole packet (not fragmented):
7081
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
709 dp_hdr->len=vpkg_length; len-=vpkg_length;
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
710 stream_read(demuxer->stream, dp_data, vpkg_length);
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
711 dp->pts=(dp_hdr->len<3)?0:
66c2e2d0504f - changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents: 6995
diff changeset
712 real_fix_timestamp(priv,dp_data,dp_hdr->timestamp,sh_video->frametime,sh_video->format);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
713 ds_add_packet(ds,dp);
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
714
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
715 } // while(len>0)
6916
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
716
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
717 if(len){
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
718 printf("\n******** !!!!!!!! BUG!! len=%d !!!!!!!!!!! ********\n",len);
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
719 if(len>0) stream_skip(demuxer->stream, len);
2917b41c85ec fixed 'eof at 66s' bug
arpi
parents: 6423
diff changeset
720 }
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
721 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
722
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
723 return 1;
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
724 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
725
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
726 mp_msg(MSGT_DEMUX,MSGL_DBG2, "unknown stream id (%d)\n", stream_id);
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
727 stream_skip(demuxer->stream, len);
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
728 }// goto loop;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
729 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
730
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
731 void demux_open_real(demuxer_t* demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
732 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
733 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
734 int num_of_headers;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
735 int i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
736
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
737 stream_skip(demuxer->stream, 4); /* header size */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
738 stream_skip(demuxer->stream, 2); /* version */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
739 // stream_skip(demuxer->stream, 4);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
740 i = stream_read_dword(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
741 mp_msg(MSGT_DEMUX,MSGL_V, "real: File version: %d\n", i);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
742 num_of_headers = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
743 // stream_skip(demuxer->stream, 4); /* number of headers */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
744
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
745 /* parse chunks */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
746 for (i = 1; i < num_of_headers; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
747 {
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
748 int chunk_id, chunk_pos, chunk_size;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
749
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
750 chunk_pos = stream_tell(demuxer->stream);
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
751 chunk_id = stream_read_dword_le(demuxer->stream);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
752 chunk_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
753
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
754 stream_skip(demuxer->stream, 2); /* version */
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
755
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
756 mp_msg(MSGT_DEMUX,MSGL_V, "Chunk: %.4s (%x) (size: 0x%x, offset: 0x%x)\n",
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
757 (char *)&chunk_id, chunk_id, chunk_size, chunk_pos);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
758
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
759 if (chunk_size < 10){
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
760 mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_real: invalid chunksize! (%d)\n",chunk_size);
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
761 return;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
762 }
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
763
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
764 switch(chunk_id)
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
765 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
766 case MKTAG('P', 'R', 'O', 'P'):
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
767 /* Properties header */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
768
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
769 stream_skip(demuxer->stream, 4); /* max bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
770 stream_skip(demuxer->stream, 4); /* avg bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
771 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
772 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
773 stream_skip(demuxer->stream, 4); /* nb packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
774 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
775 stream_skip(demuxer->stream, 4); /* preroll */
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
776 priv->index_chunk_offset = stream_read_dword(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
777 mp_msg(MSGT_DEMUX,MSGL_V,"First index chunk offset: 0x%x\n", priv->index_chunk_offset);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
778 priv->data_chunk_offset = stream_read_dword(demuxer->stream)+10;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
779 mp_msg(MSGT_DEMUX,MSGL_V,"First data chunk offset: 0x%x\n", priv->data_chunk_offset);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
780 stream_skip(demuxer->stream, 2); /* nb streams */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
781 #if 0
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
782 stream_skip(demuxer->stream, 2); /* flags */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
783 #else
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
784 {
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
785 int flags = stream_read_word(demuxer->stream);
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
786
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
787 if (flags)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
788 {
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
789 mp_msg(MSGT_DEMUX,MSGL_V,"Flags (%x): ", flags);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
790 if (flags & 0x1)
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
791 mp_msg(MSGT_DEMUX,MSGL_V,"[save allowed] ");
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
792 if (flags & 0x2)
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
793 mp_msg(MSGT_DEMUX,MSGL_V,"[perfect play (more buffers)] ");
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
794 if (flags & 0x4)
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
795 mp_msg(MSGT_DEMUX,MSGL_V,"[live broadcast] ");
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
796 mp_msg(MSGT_DEMUX,MSGL_V,"\n");
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
797 }
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
798 }
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
799 #endif
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
800 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
801 case MKTAG('C', 'O', 'N', 'T'):
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
802 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
803 /* Content description header */
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
804 char *buf;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
805 int len;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
806
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
807 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
808 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
809 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
810 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
811 stream_read(demuxer->stream, buf, len);
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5083
diff changeset
812 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
813 demux_info_add(demuxer, "name", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
814 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
815 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
816
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
817 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
818 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
819 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
820 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
821 stream_read(demuxer->stream, buf, len);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
822 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
823 demux_info_add(demuxer, "author", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
824 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
825 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
826
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
827 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
828 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
829 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
830 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
831 stream_read(demuxer->stream, buf, len);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
832 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
833 demux_info_add(demuxer, "copyright", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
834 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
835 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
836
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
837 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
838 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
839 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
840 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
841 stream_read(demuxer->stream, buf, len);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
842 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
843 demux_info_add(demuxer, "comment", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
844 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
845 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
846 break;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
847 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
848 case MKTAG('M', 'D', 'P', 'R'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
849 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
850 /* Media properties header */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
851 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
852 int bitrate;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
853 int codec_data_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
854 int codec_pos;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
855 int tmp;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
856
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
857 stream_id = stream_read_word(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
858 mp_msg(MSGT_DEMUX,MSGL_V,"Found new stream (id: %d)\n", stream_id);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
859
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
860 stream_skip(demuxer->stream, 4); /* max bitrate */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
861 bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
862 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
863 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
864 stream_skip(demuxer->stream, 4); /* start time */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
865 stream_skip(demuxer->stream, 4); /* preroll */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
866 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
867
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
868 skip_str(1, demuxer); /* stream description (name) */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
869 skip_str(1, demuxer); /* mimetype */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
870
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
871 /* Type specific header */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
872 codec_data_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
873 codec_pos = stream_tell(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
874
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
875 tmp = stream_read_dword(demuxer->stream);
7085
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
876
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
877 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_real: type_spec: len=%d fpos=0x%X first_dword=0x%X (%.4s) \n",
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
878 (int)codec_data_size,(int)codec_pos,tmp,&tmp);
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
879
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
880 #if 1
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
881 // skip unknown shit - FIXME: find a better/cleaner way!
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
882 { int len=codec_data_size;
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
883 while(--len>=8){
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
884 if(tmp==MKTAG(0xfd, 'a', 'r', '.')) break; // audio
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
885 if(tmp==MKTAG('O', 'D', 'I', 'V')) break; // video
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
886 tmp=(tmp<<8)|stream_read_char(demuxer->stream);
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
887 }
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
888 }
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
889 #endif
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
890
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
891 #ifdef MP_DEBUG
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
892 #define stream_skip(st,siz) { int i; for(i=0;i<siz;i++) mp_msg(MSGT_DEMUX,MSGL_V," %02X",stream_read_char(st)); mp_msg(MSGT_DEMUX,MSGL_V,"\n");}
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
893 #endif
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
894
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
895 if (tmp == MKTAG(0xfd, 'a', 'r', '.'))
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
896 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
897 /* audio header */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
898 sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
899 char buf[128]; /* for codec name */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
900 int frame_size;
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
901 int sub_packet_size;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
902 int sub_packet_h;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
903 int version;
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
904 int flavor;
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
905
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
906 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n");
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
907 version = stream_read_word(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
908 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
909 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
910 stream_skip(demuxer->stream, 2); // 00 00
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
911 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
912 stream_skip(demuxer->stream, 4); // ???
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
913 stream_skip(demuxer->stream, 2); /* version (4 or 5) */
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
914 stream_skip(demuxer->stream, 4); // header size == 0x4E
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
915 flavor = stream_read_word(demuxer->stream);/* codec flavor id */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
916 stream_skip(demuxer->stream, 4); /* coded frame size */
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
917 stream_skip(demuxer->stream, 4); // big number
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
918 stream_skip(demuxer->stream, 4); // bigger number
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
919 stream_skip(demuxer->stream, 4); // 2 || -''-
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
920 // stream_skip(demuxer->stream, 2); // 0x10
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
921 sub_packet_h = stream_read_word(demuxer->stream);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
922 // stream_skip(demuxer->stream, 2); /* coded frame size */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
923 frame_size = stream_read_word(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
924 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size);
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
925 sub_packet_size = stream_read_word(demuxer->stream);
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
926 mp_msg(MSGT_DEMUX,MSGL_V,"sub_packet_size: %d\n", sub_packet_size);
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
927 stream_skip(demuxer->stream, 2); // 0
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
928
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
929 if (version == 5)
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
930 stream_skip(demuxer->stream, 6); //0,srate,0
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
931
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
932 sh->samplerate = stream_read_word(demuxer->stream);
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
933 stream_skip(demuxer->stream, 2); // 0
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
934 sh->samplesize = stream_read_word(demuxer->stream)/8;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
935 sh->channels = stream_read_word(demuxer->stream);
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
936 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n",
3877
a3c73266f81f fixed rv10 with subid=3
alex
parents: 3795
diff changeset
937 sh->samplerate, sh->channels);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
938
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
939 if (version == 5)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
940 {
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
941 stream_skip(demuxer->stream, 4); // "genr"
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
942 stream_read(demuxer->stream, buf, 4); // fourcc
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
943 buf[4] = 0;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
944 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
945 else
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
946 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
947 /* Desc #1 */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
948 skip_str(1, demuxer);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
949 /* Desc #2 */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
950 get_str(1, demuxer, buf, sizeof(buf));
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
951 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
952
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
953 /* Emulate WAVEFORMATEX struct: */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
954 sh->wf = malloc(sizeof(WAVEFORMATEX));
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
955 memset(sh->wf, 0, sizeof(WAVEFORMATEX));
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
956 sh->wf->nChannels = sh->channels;
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
957 sh->wf->wBitsPerSample = sh->samplesize*8;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
958 sh->wf->nSamplesPerSec = sh->samplerate;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
959 sh->wf->nAvgBytesPerSec = bitrate;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
960 sh->wf->nBlockAlign = frame_size;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
961 sh->wf->cbSize = 0;
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
962 sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
963
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
964 switch (sh->format)
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
965 {
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
966 case MKTAG('d', 'n', 'e', 't'):
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
967 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n");
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
968 sh->format = 0x2000;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
969 break;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
970 case MKTAG('s', 'i', 'p', 'r'):
7105
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
971 #if 0
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
972 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: SiproLab's ACELP.net\n");
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
973 sh->format = 0x130;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
974 /* for buggy directshow loader */
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
975 sh->wf->cbSize = 4;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
976 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
977 sh->wf->wBitsPerSample = 0;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
978 sh->wf->nAvgBytesPerSec = 1055;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
979 sh->wf->nBlockAlign = 19;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
980 // sh->wf->nBlockAlign = frame_size / 288;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
981 buf[0] = 30;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
982 buf[1] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
983 buf[2] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
984 buf[3] = 0;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
985 memcpy((sh->wf+18), (char *)&buf[0], 4);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
986 // sh->wf[sizeof(WAVEFORMATEX)+1] = 30;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
987 // sh->wf[sizeof(WAVEFORMATEX)+2] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
988 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
989 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
990 break;
7105
79b00f519134 - added matrix cracking/debugging code - disabled
arpi
parents: 7085
diff changeset
991 #endif
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
992 case MKTAG('c', 'o', 'o', 'k'):
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
993 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n");
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
994 sh->wf->cbSize = 4+2+24;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
995 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
996 ((short*)(sh->wf+1))[0]=sub_packet_size;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
997 ((short*)(sh->wf+1))[1]=sub_packet_h;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
998 ((short*)(sh->wf+1))[2]=flavor;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
999 stream_read(demuxer->stream, ((char*)(sh->wf+1))+6, 24); // extras
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1000 break;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1001 case MKTAG('a', 't', 'r', 'c'):
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1002 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n");
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1003 sh->format = 0x270;
6374
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
1004 /* 14 bytes extra header needed ! */
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
1005 sh->wf->cbSize = 14;
b2d5aeb72f95 export subpacket-size and matrix w*h to the codec (cook)
arpi
parents: 6369
diff changeset
1006 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
1007
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1008 sh->wf->nAvgBytesPerSec = 16537; // 8268
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1009 sh->wf->nBlockAlign = 384; // 192
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1010 sh->wf->wBitsPerSample = 0; /* from AVI created by VirtualDub */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1011 break;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1012 default:
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1013 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1014 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1015
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1016 sh->wf->wFormatTag = sh->format;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1017
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1018 print_wave_header(sh->wf);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1019
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1020 if(demuxer->audio->id==-1 || demuxer->audio->id==stream_id){
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1021 demuxer->audio->id=stream_id;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1022 sh->ds=demuxer->audio;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1023 demuxer->audio->sh=sh;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1024 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1025 #ifdef stream_skip
6369
63984a4cbbb6 export extra data for cook codec, some debug stuff
arpi
parents: 6344
diff changeset
1026 #undef stream_skip
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1027 #endif
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1028 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1029 else
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1030 // case MKTAG('V', 'I', 'D', 'O'):
7085
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
1031 if(tmp == MKTAG('O', 'D', 'I', 'V'))
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1032 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1033 /* video header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1034 sh_video_t *sh = new_sh_video(demuxer, stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1035
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1036 sh->format = stream_read_dword_le(demuxer->stream); /* fourcc */
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1037 mp_msg(MSGT_DEMUX,MSGL_V,"video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1038
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1039 /* emulate BITMAPINFOHEADER */
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1040 sh->bih = malloc(sizeof(BITMAPINFOHEADER)+8);
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1041 memset(sh->bih, 0, sizeof(BITMAPINFOHEADER)+8);
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1042 sh->bih->biSize = 48;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1043 sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1044 sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1045 sh->bih->biPlanes = 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1046 sh->bih->biBitCount = 24;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1047 sh->bih->biCompression = sh->format;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1048 sh->bih->biSizeImage= sh->bih->biWidth*sh->bih->biHeight*3;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1049
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1050 sh->fps = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1051 sh->frametime = 1.0f/sh->fps;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1052
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1053 #if 1
6414
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1054 stream_skip(demuxer->stream, 4);
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1055 #else
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1056 printf("unknown1: 0x%X \n",stream_read_dword(demuxer->stream));
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1057 printf("unknown2: 0x%X \n",stream_read_word(demuxer->stream));
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1058 printf("unknown3: 0x%X \n",stream_read_word(demuxer->stream));
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1059 #endif
6414
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1060 if (sh->format==0x30335652 ||
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1061 sh->format==0x30325652 ) {
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1062 sh->fps = stream_read_word(demuxer->stream);
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1063 sh->frametime = 1.0f/sh->fps;
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1064 } else {
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1065 int fps=stream_read_word(demuxer->stream);
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1066 printf("realvid: ignoring FPS = %d\n",fps);
6414
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1067 }
67c1050a8718 fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 6404
diff changeset
1068 stream_skip(demuxer->stream, 2);
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1069
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1070 // read codec sub-format (to make difference between low and high rate codec)
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1071 ((unsigned int*)(sh->bih+1))[0]=stream_read_dword(demuxer->stream);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1072
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1073 /* h263 hack */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1074 tmp = stream_read_dword(demuxer->stream);
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1075 ((unsigned int*)(sh->bih+1))[1]=tmp;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1076 mp_msg(MSGT_DEMUX,MSGL_V,"H.263 ID: %x\n", tmp);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1077 switch (tmp)
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1078 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1079 case 0x10000000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1080 /* sub id: 0 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1081 /* codec id: rv10 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1082 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1083 case 0x10003000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1084 case 0x10003001:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1085 /* sub id: 3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1086 /* codec id: rv10 */
3877
a3c73266f81f fixed rv10 with subid=3
alex
parents: 3795
diff changeset
1087 sh->bih->biCompression = sh->format = mmioFOURCC('R', 'V', '1', '3');
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1088 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1089 case 0x20001000:
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
1090 case 0x20100001:
7084
ffd4c6024cdb 10l - fixed chunktab size calculation
arpi
parents: 7081
diff changeset
1091 case 0x20200002:
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1092 /* codec id: rv20 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1093 break;
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1094 case 0x30202002:
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1095 /* codec id: rv30 */
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1096 break;
6982
9037a1a34c94 RV40 support
arpi
parents: 6916
diff changeset
1097 case 0x40000000:
9037a1a34c94 RV40 support
arpi
parents: 6916
diff changeset
1098 /* codec id: rv40 */
9037a1a34c94 RV40 support
arpi
parents: 6916
diff changeset
1099 break;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1100 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1101 /* codec id: none */
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1102 mp_msg(MSGT_DEMUX,MSGL_V,"unknown id: %x\n", tmp);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1103 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1104
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1105 if(demuxer->video->id==-1 || demuxer->video->id==stream_id){
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1106 demuxer->video->id=stream_id;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1107 sh->ds=demuxer->video;
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1108 demuxer->video->sh=sh;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1109 }
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1110
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1111 }
7085
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
1112 else {
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
1113 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not audio/video stream or unsupported!\n");
02aa64b49b70 some files has some shit before teh audio/video headers...
arpi
parents: 7084
diff changeset
1114 }
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1115 // break;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1116 // default:
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7105
diff changeset
1117 //skip_this_chunk:
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1118 /* skip codec info */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1119 tmp = stream_tell(demuxer->stream) - codec_pos;
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1120 mp_msg(MSGT_DEMUX,MSGL_V,"### skipping %d bytes of codec info\n", codec_data_size - tmp);
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1121 #if 0
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1122 { int i;
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1123 for(i=0;i<codec_data_size - tmp;i++)
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1124 printf(" %02X",stream_read_char(demuxer->stream));
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1125 printf("\n");
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1126 }
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1127 #else
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1128 stream_skip(demuxer->stream, codec_data_size - tmp);
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1129 #endif
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1130 break;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
1131 // }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1132 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1133 case MKTAG('D', 'A', 'T', 'A'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1134 goto header_end;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
1135 case MKTAG('I', 'N', 'D', 'X'):
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1136 default:
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1137 mp_msg(MSGT_DEMUX,MSGL_V,"Unknown chunk: %x\n", chunk_id);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1138 stream_skip(demuxer->stream, chunk_size - 10);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1139 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1140 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1141 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1142
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1143 header_end:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1144 priv->num_of_packets = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1145 // stream_skip(demuxer->stream, 4); /* number of packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1146 stream_skip(demuxer->stream, 4); /* next data header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1147
6340
7f612cf06ba5 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents: 5918
diff changeset
1148 mp_msg(MSGT_DEMUX,MSGL_V,"Packets in file: %d\n", priv->num_of_packets);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1149
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1150 if (priv->num_of_packets == 0)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1151 priv->num_of_packets = -10;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1152
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1153 /* disable seeking */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1154 demuxer->seekable = 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1155
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1156 if (index_mode == 2)
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1157 generate_index(demuxer);
7710
c97a06ff84cf stream selection cleanup, fixed -nosound
arpi
parents: 7573
diff changeset
1158 else if (priv->index_chunk_offset && (index_mode == 1))
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1159 parse_index_chunk(demuxer);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1160
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1161 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1162
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1163 void demux_close_real(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1164 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1165 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1166
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1167 if (priv)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1168 free(priv);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1169
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1170 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1171 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1172
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1173 /* please upload RV10 samples WITH INDEX CHUNK */
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1174 int demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, int flags)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1175 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1176 real_priv_t *priv = demuxer->priv;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1177 demux_stream_t *d_audio = demuxer->audio;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1178 demux_stream_t *d_video = demuxer->video;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1179 sh_audio_t *sh_audio = d_audio->sh;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1180 sh_video_t *sh_video = d_video->sh;
6344
ecb9d82d1b64 - multiple audio/video stream support fixed
arpi
parents: 6340
diff changeset
1181 int vid = d_video->id, aid = d_audio->id;
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
1182 int next_offset = 0;
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1183 int rel_seek_frames = 0;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1184 int streams = 0;
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1185
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1186 if ((index_mode != 1) && (index_mode != 2))
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1187 return 0;
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1188
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1189 if (sh_video)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1190 streams |= 1;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1191 if (sh_audio)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1192 streams |= 2;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1193
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1194 // printf("streams: %d\n", streams);
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1195
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1196 if (!streams)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1197 return 0;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1198
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1199 if (flags & 1)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1200 /* seek absolute */
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1201 priv->current_apacket = priv->current_vpacket = 0;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1202
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1203 /* flags & 2 ? */
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1204 if (streams & 1)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1205 rel_seek_frames = (int)(sh_video->fps*rel_seek_secs);
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1206 else if (streams & 2)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1207 rel_seek_frames = (int)(rel_seek_secs);
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1208
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1209 // printf("rel_seek_frames: %d\n", rel_seek_frames);
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1210
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1211 if (streams & 2)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1212 priv->current_apacket += rel_seek_frames;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1213 if (streams & 1)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1214 priv->current_vpacket += rel_seek_frames;
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1215
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1216 if (
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1217 ((streams & 2) && (priv->current_apacket > priv->index_table_size[aid])) ||
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1218 ((streams & 1) && (priv->current_vpacket > priv->index_table_size[vid])) )
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1219 return 0;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1220
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1221 /* both video and audio stream */
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1222 if (streams == 3)
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1223 {
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1224 // if (priv->current_apacket > priv->current_vpacket)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1225 // {
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1226 /* search keyframe */
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1227 while (!(priv->index_table[vid][priv->current_vpacket].flags & 0x2))
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1228 priv->current_vpacket++;
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1229 next_offset = priv->index_table[vid][priv->current_vpacket].offset;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1230 // }
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1231 // else
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1232 // {
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1233 // next_offset = priv->index_table[aid][priv->current_apacket].offset;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1234 // }
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1235 }
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1236 else
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1237 {
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1238 if (streams & 1)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1239 {
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1240 /* search keyframe */
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1241 while (!(priv->index_table[vid][priv->current_vpacket].flags & 0x2))
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1242 priv->current_vpacket++;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1243 next_offset = priv->index_table[vid][priv->current_vpacket].offset;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1244 }
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1245 else if (streams & 2)
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1246 {
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1247 next_offset = priv->index_table[aid][priv->current_apacket].offset;
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1248 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1249 }
5083
ce6952225939 added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents: 4328
diff changeset
1250
5918
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1251 // printf("seek: pos: %d, current packets: a: %d, v: %d\n",
dca3016882cf completed real seeking - working very well with audio only files
alex
parents: 5810
diff changeset
1252 // next_offset, priv->current_apacket, priv->current_vpacket);
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6374
diff changeset
1253 return stream_seek(demuxer->stream, next_offset);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
1254 }