annotate libmpdemux/demux_real.c @ 7956:2d04cdfd7186

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