Mercurial > mplayer.hg
annotate libmpdemux/demux_real.c @ 36815:4c44fdd14655
Fix issue with Win32 GUI default preferences.
Don't (mis)use option variables to set defaults (and then don't use
them when actually setting the defaults in the preferences dialog).
Set them directly (and correctly) instead, and use proper symbolic
constants.
author | ib |
---|---|
date | Sun, 23 Feb 2014 19:33:46 +0000 |
parents | 92dd1764392a |
children | 91b00a4407cd |
rev | line source |
---|---|
3777 | 1 /* |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
2 * Real parser & demuxer |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
3 * copyright (C) 2001 Alex Beregszaszi |
36545 | 4 * copyright (C) 2005, 2006, 2014 Roberto Togni |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
5 * based on FFmpeg's libav/rm.c |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
6 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
7 * audio codecs: (supported by RealPlayer8 for Linux) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
8 * DNET - RealAudio 3.0, really it's AC3 in swapped-byteorder |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
9 * SIPR - SiproLab's audio codec, ACELP decoder working with MPlayer, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
10 * needs fine-tuning too :) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
11 * ATRC - RealAudio 8 (ATRAC3) - www.minidisc.org/atrac3_article.pdf, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
12 * ACM decoder uploaded, needs some fine-tuning to work |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
13 * -> RealAudio 8 |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
14 * COOK/COKR - Real Cooker -> RealAudio G2 |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
15 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
16 * video codecs: (supported by RealPlayer8 for Linux) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
17 * RV10 - H.263 based, working with libavcodec's decoder |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
18 * RV20-RV40 - using RealPlayer's codec plugins |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
19 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
20 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
21 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
22 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
23 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
24 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
25 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
26 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
27 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
30 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
31 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
32 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
33 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
34 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28630
diff
changeset
|
35 */ |
3788 | 36 |
3777 | 37 #include <stdio.h> |
38 #include <stdlib.h> | |
39 #include <unistd.h> | |
23632 | 40 #include <inttypes.h> |
3777 | 41 |
42 #include "config.h" | |
43 #include "mp_msg.h" | |
44 #include "help_mp.h" | |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
45 #include "mpbswap.h" |
31465
65a4a8ddb552
Remove duplicated MKTAG macro definition, #include libavutil/common.h instead.
diego
parents:
31269
diff
changeset
|
46 #include "libavutil/common.h" |
32596
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
47 #include "libavutil/intreadwrite.h" |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22018
diff
changeset
|
48 #include "stream/stream.h" |
30589
df6c41f16b40
Add header for AVI print functions; avoids many forward declarations.
diego
parents:
30578
diff
changeset
|
49 #include "aviprint.h" |
3777 | 50 #include "demuxer.h" |
51 #include "stheader.h" | |
30573
02420b32391b
Add separate header for real_fix_timestamp(); avoids forward declarations.
diego
parents:
29288
diff
changeset
|
52 #include "demux_real.h" |
3777 | 53 |
6369 | 54 //#define mp_dbg(mod,lev, args... ) mp_msg_c((mod<<8)|lev, ## args ) |
55 | |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
56 #define MAX_STREAMS 32 |
36545 | 57 #define MAX_MLTIIDX 16 |
3777 | 58 |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
59 static unsigned char sipr_swaps[38][2]={ |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
60 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
61 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
62 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56}, |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
63 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83}, |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
64 {77,80} }; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
65 |
3777 | 66 typedef struct { |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
67 unsigned int timestamp; |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
68 int offset; |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
69 // int packetno; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
70 // int len; /* only filled by our index generator */ |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
71 // 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
|
72 } real_index_table_t; |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
73 |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
74 typedef struct { |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
75 /* for seeking */ |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
76 int index_chunk_offset; |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
77 real_index_table_t *index_table[MAX_STREAMS]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
78 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
79 // int *index_table[MAX_STREAMS]; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
80 int index_table_size[MAX_STREAMS]; |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
81 int index_malloc_size[MAX_STREAMS]; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
82 int data_chunk_offset; |
3777 | 83 int num_of_packets; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
84 int current_packet; |
36545 | 85 int streams_in_file; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
86 |
11441 | 87 // need for seek |
88 int audio_need_keyframe; | |
89 int video_after_seek; | |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
90 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
91 int current_apacket; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
92 int current_vpacket; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
93 |
6423 | 94 // timestamp correction: |
20229
cd827d62fb71
Fix timestamps for streams where kf_base gets negative
rtogni
parents:
20198
diff
changeset
|
95 int64_t kf_base;// timestamp of the prev. video keyframe |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
96 unsigned int kf_pts; // timestamp of next video keyframe |
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
97 unsigned int a_pts; // previous audio timestamp |
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
98 double v_pts; // previous video timestamp |
11441 | 99 unsigned long duration; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
100 |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
101 /* stream id table */ |
7710 | 102 // int last_a_stream; |
103 // int a_streams[MAX_STREAMS]; | |
104 // int last_v_stream; | |
105 // int v_streams[MAX_STREAMS]; | |
14402 | 106 |
107 /** | |
108 * Used to demux multirate files | |
109 */ | |
110 int is_multirate; ///< != 0 for multirate files | |
111 int str_data_offset[MAX_STREAMS]; ///< Data chunk offset for every audio/video stream | |
112 int audio_curpos; ///< Current file position for audio demuxing | |
113 int video_curpos; ///< Current file position for video demuxing | |
114 int a_num_of_packets; ///< Number of audio packets | |
115 int v_num_of_packets; ///< Number of video packets | |
116 int a_bitrate; ///< Audio bitrate | |
117 int v_bitrate; ///< Video bitrate | |
118 int stream_switch; ///< Flag used to switch audio/video demuxing | |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
119 |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
120 /** |
36545 | 121 * Used to demux MLTI files |
122 */ | |
123 int is_mlti; ///< != 0 for MLTI files | |
124 unsigned int mp2rm_streamid[MAX_STREAMS]; ///< Convert Mplayer stream_id to rm stream id | |
125 unsigned int rm2mp[MAX_STREAMS][MAX_MLTIIDX]; ///< Convert rm stream id and mlti index to Mplayer stream_id | |
126 | |
127 /** | |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
128 * Used to reorder audio data |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
129 */ |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
130 unsigned int intl_id[MAX_STREAMS]; ///< interleaver id, per stream |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
131 int sub_packet_size[MAX_STREAMS]; ///< sub packet size, per stream |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
132 int sub_packet_h[MAX_STREAMS]; ///< number of coded frames per block |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
133 int coded_framesize[MAX_STREAMS]; ///< coded frame size, per stream |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
134 int audiopk_size[MAX_STREAMS]; ///< audio packet size |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
135 unsigned char *audio_buf; ///< place to store reordered audio data |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
136 double *audio_timestamp; ///< timestamp for each audio packet |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
137 int sub_packet_cnt; ///< number of subpacket already received |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
138 int audio_filepos; ///< file position of first audio packet in block |
3777 | 139 } real_priv_t; |
140 | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
141 //! use at most 200 MB of memory for index, corresponds to around 25 million entries |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
142 #define MAX_INDEX_ENTRIES (200*1024*1024 / sizeof(real_index_table_t)) |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
143 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
144 /* originally from FFmpeg */ |
3777 | 145 static void get_str(int isbyte, demuxer_t *demuxer, char *buf, int buf_size) |
146 { | |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
147 int len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
148 |
3777 | 149 if (isbyte) |
150 len = stream_read_char(demuxer->stream); | |
151 else | |
152 len = stream_read_word(demuxer->stream); | |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
153 |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
154 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
|
155 if (len > buf_size) |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
156 stream_skip(demuxer->stream, len-buf_size); |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
157 |
11870 | 158 mp_msg(MSGT_DEMUX, MSGL_V, "read_str: %d bytes read\n", len); |
3777 | 159 } |
160 | |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
161 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
|
162 { |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
163 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
|
164 real_index_table_t *index; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
165 int i, entries; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
166 |
28550
6832bb1e1e3a
Fix a regression caused by r17933; RealMedia index tables could never be printed.
zuxy
parents:
28549
diff
changeset
|
167 if (!mp_msg_test(MSGT_DEMUX,MSGL_V)) |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
168 return; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
169 |
18106
3a34a728fa1b
always cast stream IDs to unsigned before comparing to MAX_STREAMS.
reimar
parents:
17977
diff
changeset
|
170 if ((unsigned)stream_id >= MAX_STREAMS) |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
171 return; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
172 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
173 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
|
174 entries = priv->index_table_size[stream_id]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
175 |
11870 | 176 mp_msg(MSGT_DEMUX, MSGL_V, "Index table for stream %d\n", stream_id); |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
177 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
|
178 { |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
179 #if 1 |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
180 mp_msg(MSGT_DEMUX, MSGL_V,"i: %d, pos: %d, timestamp: %u\n", i, index[i].offset, index[i].timestamp); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
181 #else |
11870 | 182 mp_msg(MSGT_DEMUX, MSGL_V,"packetno: %x pos: %x len: %x timestamp: %x flags: %x\n", |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
183 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
|
184 index[i].flags); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
185 #endif |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
186 } |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
187 } |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
188 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
189 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
|
190 { |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
191 real_priv_t *priv = demuxer->priv; |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
192 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
|
193 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
|
194 int i, entries, stream_id; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
195 |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
196 read_index: |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
197 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
|
198 |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
199 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
|
200 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
|
201 { |
11870 | 202 mp_msg(MSGT_DEMUX, MSGL_WARN,"Something went wrong, no index chunk found on given address (%d)\n", |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
203 next_header_pos); |
11441 | 204 index_mode = -1; |
205 if (i == -256) | |
206 stream_reset(demuxer->stream); | |
207 stream_seek(demuxer->stream, origpos); | |
208 return 0; | |
209 //goto end; | |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
210 } |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
211 |
11870 | 212 mp_msg(MSGT_DEMUX, MSGL_V,"Reading index table from index chunk (%d)\n", |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
213 next_header_pos); |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
214 |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
215 i = stream_read_dword(demuxer->stream); |
11870 | 216 mp_msg(MSGT_DEMUX, MSGL_V,"size: %d bytes\n", i); |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
217 |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
218 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
|
219 if (i != 0) |
11870 | 220 mp_msg(MSGT_DEMUX, MSGL_WARN,"Hmm, index table with unknown version (%d), please report it to MPlayer developers!\n", i); |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
221 |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
222 entries = stream_read_dword(demuxer->stream); |
11870 | 223 mp_msg(MSGT_DEMUX, MSGL_V,"entries: %d\n", entries); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
224 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
225 stream_id = stream_read_word(demuxer->stream); |
11870 | 226 mp_msg(MSGT_DEMUX, MSGL_V,"stream_id: %d\n", stream_id); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
227 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
228 next_header_pos = stream_read_dword(demuxer->stream); |
11870 | 229 mp_msg(MSGT_DEMUX, MSGL_V,"next_header_pos: %d\n", next_header_pos); |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
230 if (entries <= 0 || entries > MAX_INDEX_ENTRIES) |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
231 { |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
232 if (next_header_pos) |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
233 goto read_index; |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
234 i = entries; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
235 goto end; |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
236 } |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
237 |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
238 priv->index_table_size[stream_id] = entries; |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
239 priv->index_table[stream_id] = calloc(priv->index_table_size[stream_id], sizeof(real_index_table_t)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
240 |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
241 for (i = 0; i < entries; i++) |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
242 { |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
243 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
|
244 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
|
245 priv->index_table[stream_id][i].offset = stream_read_dword(demuxer->stream); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
246 stream_skip(demuxer->stream, 4); /* packetno */ |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
247 // 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
|
248 // 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
|
249 // 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
|
250 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
251 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
252 dump_index(demuxer, stream_id); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
253 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
254 if (next_header_pos > 0) |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
255 goto read_index; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
256 |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
257 end: |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
258 if (i == -256) |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
259 stream_reset(demuxer->stream); |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
260 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
|
261 if (i == -256) |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
262 return 0; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
263 else |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
264 return 1; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
265 } |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
266 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
267 #if 1 |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
268 |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
269 static void add_index_item(demuxer_t *demuxer, int stream_id, unsigned int timestamp, int offset) |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
270 { |
12665
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
271 if ((unsigned)stream_id < MAX_STREAMS) |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
272 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
273 real_priv_t *priv = demuxer->priv; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
274 real_index_table_t *index; |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
275 if (priv->index_table_size[stream_id] >= MAX_INDEX_ENTRIES) { |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
276 mp_msg(MSGT_DEMUXER, MSGL_WARN, "Index too large during building\n"); |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
277 return; |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18176
diff
changeset
|
278 } |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
279 if (priv->index_table_size[stream_id] >= priv->index_malloc_size[stream_id]) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
280 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
281 if (priv->index_malloc_size[stream_id] == 0) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
282 priv->index_malloc_size[stream_id] = 2048; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
283 else |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
284 priv->index_malloc_size[stream_id] += priv->index_malloc_size[stream_id] / 2; |
14897 | 285 // in case we have a really large chunk... |
286 if (priv->index_table_size[stream_id] >= | |
287 priv->index_malloc_size[stream_id]) | |
288 priv->index_malloc_size[stream_id] = | |
289 priv->index_table_size[stream_id] + 1; | |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
290 priv->index_table[stream_id] = realloc(priv->index_table[stream_id], priv->index_malloc_size[stream_id]*sizeof(priv->index_table[0][0])); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
291 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
292 if (priv->index_table_size[stream_id] > 0) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
293 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
294 index = &priv->index_table[stream_id][priv->index_table_size[stream_id] - 1]; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
295 if (index->timestamp >= timestamp || index->offset >= offset) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
296 return; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
297 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
298 index = &priv->index_table[stream_id][priv->index_table_size[stream_id]++]; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
299 index->timestamp = timestamp; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
300 index->offset = offset; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
301 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
302 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
303 |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
304 static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int64_t seek_timestamp) |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
305 { |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
306 int tag, len, stream_id, flags; |
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
307 unsigned int timestamp; |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
308 if (seek_timestamp != -1 && (unsigned)seek_stream_id >= MAX_STREAMS) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
309 return; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
310 while (1) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
311 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
312 demuxer->filepos = stream_tell(demuxer->stream); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
313 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
314 tag = stream_read_dword(demuxer->stream); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
315 if (tag == MKTAG('A', 'T', 'A', 'D')) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
316 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
317 stream_skip(demuxer->stream, 14); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
318 continue; /* skip to next loop */ |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
319 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
320 len = tag & 0xffff; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
321 if (tag == -256 || len < 12) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
322 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
323 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
324 stream_id = stream_read_word(demuxer->stream); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
325 timestamp = stream_read_dword(demuxer->stream); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
326 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
327 stream_skip(demuxer->stream, 1); /* reserved */ |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
328 flags = stream_read_char(demuxer->stream); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
329 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
330 if (flags == -256) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
331 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
332 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
333 if (flags & 2) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
334 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
335 add_index_item(demuxer, stream_id, timestamp, demuxer->filepos); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
336 if (stream_id == seek_stream_id && timestamp >= seek_timestamp) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
337 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
338 stream_seek(demuxer->stream, demuxer->filepos); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
339 return; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
340 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
341 } |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
342 // printf("Index: stream=%d packet=%d timestamp=%u len=%d flags=0x%x datapos=0x%x\n", stream_id, entries, timestamp, len, flags, index->offset); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
343 /* skip data */ |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
344 stream_skip(demuxer->stream, len-12); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
345 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
346 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
347 |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
348 static int generate_index(demuxer_t *demuxer) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
349 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
350 real_priv_t *priv = demuxer->priv; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
351 int origpos = stream_tell(demuxer->stream); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
352 int data_pos = priv->data_chunk_offset-10; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
353 int i; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
354 int tag; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
355 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
356 stream_seek(demuxer->stream, data_pos); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
357 tag = stream_read_dword(demuxer->stream); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
358 if (tag != MKTAG('A', 'T', 'A', 'D')) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
359 { |
11870 | 360 mp_msg(MSGT_DEMUX, MSGL_WARN,"Something went wrong, no data chunk found on given address (%d)\n", data_pos); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
361 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
362 else |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
363 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
364 stream_skip(demuxer->stream, 14); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
365 add_index_segment(demuxer, -1, -1); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
366 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
367 for (i = 0; i < MAX_STREAMS; i++) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
368 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
369 if (priv->index_table_size[i] > 0) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
370 { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
371 dump_index(demuxer, i); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
372 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
373 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
374 stream_reset(demuxer->stream); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
375 stream_seek(demuxer->stream, origpos); |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
376 return 0; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
377 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
378 |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
379 #else |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
380 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
381 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
|
382 { |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
383 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
|
384 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
|
385 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
|
386 int num_of_packets = 0; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
387 int i, entries = 0; |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
388 int len, stream_id = 0, flags; |
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
389 unsigned int timestamp; |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
390 int tab_pos = 0; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
391 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
392 read_index: |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
393 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
|
394 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
395 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
|
396 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
|
397 { |
11870 | 398 mp_msg(MSGT_DEMUX, MSGL_WARN,"Something went wrong, no data chunk found on given address (%d)\n", |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
399 data_pos); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
400 goto end; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
401 } |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
402 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
|
403 stream_skip(demuxer->stream, 2); /* version */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
404 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
405 num_of_packets = stream_read_dword(demuxer->stream); |
11870 | 406 mp_msg(MSGT_DEMUX, MSGL_V,"Generating index table from raw data (pos: 0x%x) for %d packets\n", |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
407 data_pos, num_of_packets); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
408 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
409 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
|
410 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
411 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
|
412 { |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
413 priv->index_table_size[i] = num_of_packets; |
18505
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
414 priv->index_table[i] = calloc(priv->index_table_size[i], sizeof(real_index_table_t)); |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
415 // 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
|
416 // 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
|
417 } |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
418 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
419 tab_pos = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
420 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
421 // 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
|
422 // memset(priv->index_table, 0, sizeof(real_index_table_t)*MAX_STREAMS); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
423 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
424 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
|
425 { |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
426 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
|
427 if (i == -256) |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
428 goto end; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
429 stream_skip(demuxer->stream, 1); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
430 // 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
|
431 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
432 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
|
433 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
|
434 timestamp = stream_read_dword(demuxer->stream); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
435 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
436 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
|
437 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
|
438 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
439 i = tab_pos; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
440 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
441 // 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
|
442 // 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
|
443 // 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
|
444 // else |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
445 // 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
|
446 // priv->index_table_size[stream_id] * sizeof(real_index_table_t)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
447 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
448 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
|
449 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
|
450 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
|
451 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
|
452 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
|
453 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
454 tab_pos++; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
455 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
456 /* skip data */ |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
457 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
|
458 } |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
459 dump_index(demuxer, stream_id); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
460 if (data_pos) |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
461 goto read_index; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
462 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
463 end: |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
464 if (i == -256) |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
465 stream_reset(demuxer->stream); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
466 stream_seek(demuxer->stream, origpos); |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
467 if (i == -256) |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
468 return 0; |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
469 else |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
470 return 1; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
471 } |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
472 #endif |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
473 |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
474 |
16175 | 475 static int real_check_file(demuxer_t* demuxer) |
3795 | 476 { |
3777 | 477 real_priv_t *priv; |
478 int c; | |
479 | |
480 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for REAL\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
481 |
3777 | 482 c = stream_read_dword_le(demuxer->stream); |
483 if (c == -256) | |
484 return 0; /* EOF */ | |
485 if (c != MKTAG('.', 'R', 'M', 'F')) | |
486 return 0; /* bad magic */ | |
487 | |
32108 | 488 priv = calloc(1, sizeof(real_priv_t)); |
3777 | 489 demuxer->priv = priv; |
490 | |
16175 | 491 return DEMUXER_TYPE_REAL; |
3777 | 492 } |
493 | |
9543 | 494 #define SKIP_BITS(n) buffer<<=n |
495 #define SHOW_BITS(n) ((buffer)>>(32-(n))) | |
496 | |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
497 double real_fix_timestamp(unsigned char *buf, unsigned int timestamp, unsigned int format, int64_t *kf_base, int *kf_pts, double *pts){ |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
498 double v_pts; |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
499 unsigned char *s = buf + 1 + (*buf+1)*8; |
9543 | 500 uint32_t buffer= (s[0]<<24) + (s[1]<<16) + (s[2]<<8) + s[3]; |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
501 unsigned int kf=timestamp; |
9543 | 502 int pict_type; |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
503 unsigned int orig_kf; |
9555 | 504 |
9543 | 505 if(format==mmioFOURCC('R','V','3','0') || format==mmioFOURCC('R','V','4','0')){ |
506 if(format==mmioFOURCC('R','V','3','0')){ | |
507 SKIP_BITS(3); | |
508 pict_type= SHOW_BITS(2); | |
509 SKIP_BITS(2 + 7); | |
510 }else{ | |
511 SKIP_BITS(1); | |
512 pict_type= SHOW_BITS(2); | |
9555 | 513 SKIP_BITS(2 + 7 + 3); |
9543 | 514 } |
9555 | 515 orig_kf= |
516 kf= SHOW_BITS(13); // kf= 2*SHOW_BITS(12); | |
517 // if(pict_type==0) | |
518 if(pict_type<=1){ | |
519 // I frame, sync timestamps: | |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
520 *kf_base=(int64_t)timestamp-kf; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
521 mp_msg(MSGT_DEMUX, MSGL_DBG2,"\nTS: base=%08"PRIX64"\n",*kf_base); |
9555 | 522 kf=timestamp; |
523 } else { | |
524 // P/B frame, merge timestamps: | |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
525 int64_t tmp=(int64_t)timestamp-*kf_base; |
9555 | 526 kf|=tmp&(~0x1fff); // combine with packet timestamp |
527 if(kf<tmp-4096) kf+=8192; else // workaround wrap-around problems | |
528 if(kf>tmp+4096) kf-=8192; | |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
529 kf+=*kf_base; |
9555 | 530 } |
9543 | 531 if(pict_type != 3){ // P || I frame -> swap timestamps |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
532 unsigned int tmp=kf; |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
533 kf=*kf_pts; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
534 *kf_pts=tmp; |
6423 | 535 // if(kf<=tmp) kf=0; |
536 } | |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
537 mp_msg(MSGT_DEMUX, MSGL_DBG2,"\nTS: %08X -> %08X (%04X) %d %02X %02X %02X %02X %5u\n",timestamp,kf,orig_kf,pict_type,s[0],s[1],s[2],s[3],pts?kf-(unsigned int)(*pts*1000.0):0); |
6995
8f92313a0cd5
RV20 A-V desync fixed - use timestamp hack only for RV30
arpi
parents:
6982
diff
changeset
|
538 } |
6423 | 539 v_pts=kf*0.001f; |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
540 // if(pts && (v_pts<*pts || !kf)) v_pts=*pts+frametime; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
541 if(pts) *pts=v_pts; |
6423 | 542 return v_pts; |
543 } | |
544 | |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
545 typedef struct dp_hdr_s { |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
546 uint32_t chunks; // number of chunks |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
547 uint32_t timestamp; // timestamp from packet header |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
548 uint32_t len; // length of actual data |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
549 uint32_t chunktab; // offset to chunk offset array |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
550 } dp_hdr_t; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
551 |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
552 static void queue_video_packet(real_priv_t *priv, demux_stream_t *ds, demux_packet_t *dp) |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
553 { |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
554 dp_hdr_t hdr = *(dp_hdr_t*)dp->buffer; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
555 unsigned char *tmp = malloc(8*(1+hdr.chunks)); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
556 memcpy(tmp, dp->buffer+hdr.chunktab, 8*(1+hdr.chunks)); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
557 memmove(dp->buffer+1+8*(1+hdr.chunks), dp->buffer+sizeof(dp_hdr_t), hdr.len); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
558 memcpy(dp->buffer+1, tmp, 8*(1+hdr.chunks)); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
559 *dp->buffer = (uint8_t)hdr.chunks; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
560 free(tmp); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
561 |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
562 if(priv->video_after_seek){ |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
563 priv->kf_base = 0; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
564 priv->kf_pts = hdr.timestamp; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
565 priv->video_after_seek = 0; |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
566 } |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
567 if(hdr.len >= 3) /* this check may be useless */ |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
568 dp->pts = real_fix_timestamp(dp->buffer, hdr.timestamp, |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
569 ((sh_video_t *)ds->sh)->format, |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
570 &priv->kf_base, &priv->kf_pts, |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
571 &priv->v_pts); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
572 ds_add_packet(ds, dp); |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
573 } |
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
574 |
3777 | 575 // return value: |
576 // 0 = EOF or no stream found | |
577 // 1 = successfully read a packet | |
16175 | 578 static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds) |
3777 | 579 { |
580 real_priv_t *priv = demuxer->priv; | |
581 demux_stream_t *ds = NULL; | |
582 int len; | |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
583 unsigned int timestamp; |
36545 | 584 int rm_stream_id, mp_stream_id; |
8254
772d6d27fd66
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
8123
diff
changeset
|
585 #ifdef CRACK_MATRIX |
3777 | 586 int i; |
8254
772d6d27fd66
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
8123
diff
changeset
|
587 #endif |
3795 | 588 int flags; |
6916 | 589 int version; |
36550 | 590 int pk_group; |
11886 | 591 demux_packet_t *dp; |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
592 int x, sps, cfs, sph, spc, w; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
593 int audioreorder_getnextpk = 0; |
3777 | 594 |
20499 | 595 // Don't demux video if video codec init failed |
596 if (demuxer->video->id >= 0 && !demuxer->video->sh) | |
597 demuxer->video->id = -2; | |
598 | |
19960
5928bd5c7f0b
Make fill_buffer function check for stream eof, fixes hang at eof (bug #580)
reimar
parents:
19954
diff
changeset
|
599 while(!stream_eof(demuxer->stream)){ |
7710 | 600 |
14402 | 601 /* Handle audio/video demxing switch for multirate files (non-interleaved) */ |
602 if (priv->is_multirate && priv->stream_switch) { | |
35891 | 603 demuxer->audio->eof = priv->current_apacket >= priv->index_table_size[demuxer->audio->id]; |
604 demuxer->video->eof = priv->current_vpacket >= priv->index_table_size[demuxer->video->id]; | |
14402 | 605 if (demuxer->audio->eof && demuxer->video->eof) |
606 return 0; | |
607 else if (!demuxer->audio->eof && demuxer->video->eof) | |
608 stream_seek(demuxer->stream, priv->audio_curpos); // Get audio | |
609 else if (demuxer->audio->eof && !demuxer->video->eof) | |
610 stream_seek(demuxer->stream, priv->video_curpos); // Get video | |
28549 | 611 else if (priv->index_table[demuxer->audio->id][priv->current_apacket].timestamp < |
612 priv->index_table[demuxer->video->id][priv->current_vpacket].timestamp) | |
14402 | 613 stream_seek(demuxer->stream, priv->audio_curpos); // Get audio |
614 else | |
615 stream_seek(demuxer->stream, priv->video_curpos); // Get video | |
616 priv->stream_switch = 0; | |
617 } | |
618 | |
6916 | 619 demuxer->filepos = stream_tell(demuxer->stream); |
620 version = stream_read_word(demuxer->stream); /* version */ | |
3777 | 621 len = stream_read_word(demuxer->stream); |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
622 if ((version==0x4441) && (len==0x5441)) { // new data chunk |
10342 | 623 mp_msg(MSGT_DEMUX,MSGL_INFO,"demux_real: New data chunk is coming!!!\n"); |
14402 | 624 if (priv->is_multirate) |
625 return 0; // EOF | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
626 stream_skip(demuxer->stream,14); |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
627 demuxer->filepos = stream_tell(demuxer->stream); |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
628 version = stream_read_word(demuxer->stream); /* version */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
629 len = stream_read_word(demuxer->stream); |
12076
1309695bcdf4
Stop reading the file if an INDX chunk is found instead of a data packet.
mosu
parents:
11989
diff
changeset
|
630 } else if ((version == 0x494e) && (len == 0x4458)) { |
1309695bcdf4
Stop reading the file if an INDX chunk is found instead of a data packet.
mosu
parents:
11989
diff
changeset
|
631 mp_msg(MSGT_DEMUX,MSGL_V,"demux_real: Found INDX chunk. EOF.\n"); |
14586
77e2eaf833c5
Do not read any more data at eof: if got eof in the middle of an audio
rtognimp
parents:
14585
diff
changeset
|
632 demuxer->stream->eof=1; |
12076
1309695bcdf4
Stop reading the file if an INDX chunk is found instead of a data packet.
mosu
parents:
11989
diff
changeset
|
633 return 0; |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
634 } |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
635 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
636 |
6916 | 637 if (len == -256){ /* EOF */ |
7710 | 638 // printf("len==-256!\n"); |
3777 | 639 return 0; |
6916 | 640 } |
7710 | 641 if (len < 12){ |
36545 | 642 unsigned int idx_streamid; |
11870 | 643 mp_msg(MSGT_DEMUX, MSGL_V,"%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len); |
644 mp_msg(MSGT_DEMUX, MSGL_WARN,"bad packet len (%d)\n", len); | |
28630
acadba04afaf
Be more robust against corrupted RM files that contain invalid packet length
zuxy
parents:
28550
diff
changeset
|
645 if ((unsigned)demuxer->video->id < MAX_STREAMS) { |
36545 | 646 idx_streamid = priv->is_mlti ? priv->mp2rm_streamid[demuxer->video->id] : demuxer->video->id; |
647 if (priv->current_vpacket + 1 < priv->index_table_size[idx_streamid]) { | |
648 stream_seek(demuxer->stream, priv->index_table[idx_streamid][++priv->current_vpacket].offset); | |
28630
acadba04afaf
Be more robust against corrupted RM files that contain invalid packet length
zuxy
parents:
28550
diff
changeset
|
649 } |
acadba04afaf
Be more robust against corrupted RM files that contain invalid packet length
zuxy
parents:
28550
diff
changeset
|
650 } else if ((unsigned)demuxer->audio->id < MAX_STREAMS) { |
36592
ee7c40d5c534
Fix calculation of idx_streamid for audio index in case of packet errors.
rtogni
parents:
36552
diff
changeset
|
651 idx_streamid = priv->is_mlti ? priv->mp2rm_streamid[demuxer->audio->id] : demuxer->audio->id; |
36545 | 652 if (priv->current_apacket + 1 < priv->index_table_size[idx_streamid]) { |
653 stream_seek(demuxer->stream, priv->index_table[idx_streamid][++priv->current_apacket].offset); | |
28630
acadba04afaf
Be more robust against corrupted RM files that contain invalid packet length
zuxy
parents:
28550
diff
changeset
|
654 } |
acadba04afaf
Be more robust against corrupted RM files that contain invalid packet length
zuxy
parents:
28550
diff
changeset
|
655 } |
7710 | 656 continue; //goto loop; |
3777 | 657 } |
7710 | 658 |
36545 | 659 rm_stream_id = stream_read_word(demuxer->stream); |
3777 | 660 timestamp = stream_read_dword(demuxer->stream); |
36545 | 661 pk_group = stream_read_char(demuxer->stream); |
3795 | 662 flags = stream_read_char(demuxer->stream); |
663 /* flags: */ | |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
664 /* 0x1 - reliable */ |
3795 | 665 /* 0x2 - keyframe */ |
666 | |
14402 | 667 if (version == 1) { |
668 int tmp; | |
669 tmp = stream_read_char(demuxer->stream); | |
670 mp_msg(MSGT_DEMUX, MSGL_DBG2,"Version: %d, skipped byte is %d\n", version, tmp); | |
671 len--; | |
36545 | 672 if (priv->is_mlti) |
673 mp_msg(MSGT_DEMUX, MSGL_WARN,"MLTI file with v1 DATA, expect problems! Please contact Mplayer developers.\n"); | |
14402 | 674 } |
675 | |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
676 if (flags & 2) |
36545 | 677 add_index_item(demuxer, rm_stream_id, timestamp, demuxer->filepos); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
678 |
6916 | 679 // printf("%08X: packet v%d len=%4d id=%d pts=%6d rvd=%d flags=%d \n", |
680 // (int)demuxer->filepos,(int)version,(int)len, stream_id, | |
681 // (int) timestamp, reserved, flags); | |
682 | |
36545 | 683 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "\npacket#%d: pos: 0x%0x, len: %d, rm_id: %d, pts: %u, flags: %x grp:%d\n", |
684 priv->current_packet, (int)demuxer->filepos, len, rm_stream_id, timestamp, flags, pk_group); | |
3777 | 685 |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
686 priv->current_packet++; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
687 len -= 12; |
3777 | 688 |
6344 | 689 // printf("s_id=%d aid=%d vid=%d \n",stream_id,demuxer->audio->id,demuxer->video->id); |
690 | |
36545 | 691 // Map rm stream id and packet group to MPlayer stream aid or vid if file is MLTI |
692 if (priv->is_mlti && rm_stream_id < MAX_STREAMS && (pk_group>>1) < MAX_MLTIIDX) | |
693 mp_stream_id = priv->rm2mp[rm_stream_id][(pk_group>>1)-1]; | |
694 else | |
695 mp_stream_id = rm_stream_id; | |
696 | |
7710 | 697 /* check stream_id: */ |
698 | |
36545 | 699 if(demuxer->audio->id==mp_stream_id){ |
11441 | 700 if (priv->audio_need_keyframe == 1&& flags != 0x2) |
701 goto discard; | |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
702 got_audio: |
7710 | 703 ds=demuxer->audio; |
36545 | 704 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is audio (mp_id: %d)\n", mp_stream_id); |
7710 | 705 |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
706 if (flags & 2) { |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
707 priv->sub_packet_cnt = 0; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
708 audioreorder_getnextpk = 0; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
709 } |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
710 |
7710 | 711 // parse audio chunk: |
3777 | 712 { |
7105 | 713 #ifdef CRACK_MATRIX |
714 int spos=stream_tell(demuxer->stream); | |
715 static int cnt=0; | |
716 static int cnt2=CRACK_MATRIX; | |
717 #endif | |
11877 | 718 if (((sh_audio_t *)ds->sh)->format == mmioFOURCC('M', 'P', '4', 'A')) { |
25599
a836d1288d59
Don't dynamically allocate sub_packet_lengths[] in raac demuxing.
rtogni
parents:
25027
diff
changeset
|
719 uint16_t sub_packet_lengths[16], sub_packets, i; |
25600 | 720 int totlen = 0; |
11877 | 721 /* AAC in Real: several AAC frames in one Real packet. */ |
722 /* Second byte, upper four bits: number of AAC frames */ | |
723 /* next n * 2 bytes: length of the AAC frames in bytes, BE */ | |
25600 | 724 if (len < 2) |
725 goto discard; | |
11877 | 726 sub_packets = (stream_read_word(demuxer->stream) & 0xf0) >> 4; |
25600 | 727 if (len < 2 * sub_packets) |
728 goto discard; | |
11877 | 729 for (i = 0; i < sub_packets; i++) |
25600 | 730 totlen += sub_packet_lengths[i] = stream_read_word(demuxer->stream); |
731 if (len < totlen ) | |
732 goto discard; | |
11877 | 733 for (i = 0; i < sub_packets; i++) { |
734 demux_packet_t *dp = new_demux_packet(sub_packet_lengths[i]); | |
735 stream_read(demuxer->stream, dp->buffer, sub_packet_lengths[i]); | |
20794
cc6e090f9a75
Changed code that used pts=0 in demux packets to indicate "not known".
uau
parents:
20499
diff
changeset
|
736 if (priv->a_pts != timestamp) |
20795
047887057875
Change some constants in pts arithmetic from float to double.
uau
parents:
20794
diff
changeset
|
737 dp->pts = timestamp / 1000.0; |
11877 | 738 priv->a_pts = timestamp; |
739 dp->pos = demuxer->filepos; | |
740 ds_add_packet(ds, dp); | |
741 } | |
742 return 1; | |
743 } | |
36545 | 744 if ((priv->intl_id[demuxer->audio->id] == mmioFOURCC('I', 'n', 't', '4')) || |
745 (priv->intl_id[demuxer->audio->id] == mmioFOURCC('g', 'e', 'n', 'r')) || | |
746 (priv->intl_id[demuxer->audio->id] == mmioFOURCC('s', 'i', 'p', 'r'))) { | |
747 sps = priv->sub_packet_size[demuxer->audio->id]; | |
748 sph = priv->sub_packet_h[demuxer->audio->id]; | |
749 cfs = priv->coded_framesize[demuxer->audio->id]; | |
750 w = priv->audiopk_size[demuxer->audio->id]; | |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
751 spc = priv->sub_packet_cnt; |
36545 | 752 switch (priv->intl_id[demuxer->audio->id]) { |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
753 case mmioFOURCC('I', 'n', 't', '4'): |
25600 | 754 if (len < cfs * sph/2) |
755 goto discard; | |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
756 for (x = 0; x < sph / 2; x++) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
757 stream_read(demuxer->stream, priv->audio_buf + x * 2 * w + spc * cfs, cfs); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
758 break; |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
759 case mmioFOURCC('g', 'e', 'n', 'r'): |
25600 | 760 if (len < w) |
761 goto discard; | |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
762 for (x = 0; x < w / sps; x++) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
763 stream_read(demuxer->stream, priv->audio_buf + sps * (sph * x + ((sph + 1) / 2) * (spc & 1) + |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
764 (spc >> 1)), sps); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
765 break; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
766 case mmioFOURCC('s', 'i', 'p', 'r'): |
25600 | 767 if (len < w) |
768 goto discard; | |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
769 stream_read(demuxer->stream, priv->audio_buf + spc * w, w); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
770 if (spc == sph - 1) { |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
771 int n; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
772 int bs = sph * w * 2 / 96; // nibbles per subpacket |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
773 // Perform reordering |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
774 for(n=0; n < 38; n++) { |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
775 int j; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
776 int i = bs * sipr_swaps[n][0]; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
777 int o = bs * sipr_swaps[n][1]; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
778 // swap nibbles of block 'i' with 'o' TODO: optimize |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
779 for(j = 0;j < bs; j++) { |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
780 int x = (i & 1) ? (priv->audio_buf[i >> 1] >> 4) : (priv->audio_buf[i >> 1] & 0x0F); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
781 int y = (o & 1) ? (priv->audio_buf[o >> 1] >> 4) : (priv->audio_buf[o >> 1] & 0x0F); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
782 if(o & 1) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
783 priv->audio_buf[o >> 1] = (priv->audio_buf[o >> 1] & 0x0F) | (x << 4); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
784 else |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
785 priv->audio_buf[o >> 1] = (priv->audio_buf[o >> 1] & 0xF0) | x; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
786 if(i & 1) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
787 priv->audio_buf[i >> 1] = (priv->audio_buf[i >> 1] & 0x0F) | (y << 4); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
788 else |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
789 priv->audio_buf[i >> 1] = (priv->audio_buf[i >> 1] & 0xF0) | y; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
790 ++i; ++o; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
791 } |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
792 } |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
793 } |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
794 break; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
795 } |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
796 priv->audio_need_keyframe = 0; |
26381
4617c374f752
demux_real.c: Always use MP_NOPTS_VALUE for unknown pts
uau
parents:
26069
diff
changeset
|
797 priv->audio_timestamp[priv->sub_packet_cnt] = (priv->a_pts==timestamp) ? MP_NOPTS_VALUE : (timestamp/1000.0); |
17317
69fe94dded9a
Remove assumption that all audio packets in a block have the same
rtognimp
parents:
17316
diff
changeset
|
798 priv->a_pts = timestamp; |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
799 if (priv->sub_packet_cnt == 0) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
800 priv->audio_filepos = demuxer->filepos; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
801 if (++(priv->sub_packet_cnt) < sph) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
802 audioreorder_getnextpk = 1; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
803 else { |
32110 | 804 int apk_usize = ((sh_audio_t*)ds->sh)->wf->nBlockAlign; |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
805 audioreorder_getnextpk = 0; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
806 priv->sub_packet_cnt = 0; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
807 // Release all the audio packets |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
808 for (x = 0; x < sph*w/apk_usize; x++) { |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
809 dp = new_demux_packet(apk_usize); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
810 memcpy(dp->buffer, priv->audio_buf + x * apk_usize, apk_usize); |
17317
69fe94dded9a
Remove assumption that all audio packets in a block have the same
rtognimp
parents:
17316
diff
changeset
|
811 /* Put timestamp only on packets that correspond to original audio packets in file */ |
20794
cc6e090f9a75
Changed code that used pts=0 in demux packets to indicate "not known".
uau
parents:
20499
diff
changeset
|
812 if (x * apk_usize % w == 0) |
cc6e090f9a75
Changed code that used pts=0 in demux packets to indicate "not known".
uau
parents:
20499
diff
changeset
|
813 dp->pts = priv->audio_timestamp[x * apk_usize / w]; |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
814 dp->pos = priv->audio_filepos; // all equal |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
815 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
816 ds_add_packet(ds, dp); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
817 } |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
818 } |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
819 } else { // No interleaving |
11886 | 820 dp = new_demux_packet(len); |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
821 stream_read(demuxer->stream, dp->buffer, len); |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
822 |
7105 | 823 #ifdef CRACK_MATRIX |
11870 | 824 mp_msg(MSGT_DEMUX, MSGL_V,"*** audio block len=%d\n",len); |
7105 | 825 { // HACK - used for reverse engineering the descrambling matrix |
826 FILE* f=fopen("test.rm","r+"); | |
827 fseek(f,spos,SEEK_SET); | |
828 ++cnt; | |
829 // for(i=0;i<len;i++) dp->buffer[i]=i/0x12; | |
830 // for(i=0;i<len;i++) dp->buffer[i]=i; | |
831 // for(i=0;i<len;i++) dp->buffer[i]=cnt; | |
832 // for(i=0;i<len;i++) dp->buffer[i]=cnt<<4; | |
833 for(i=0;i<len;i++) dp->buffer[i]=(i==cnt2) ? (cnt+16*(8+cnt)) : 0; | |
834 if(cnt==6){ cnt=0; ++cnt2; } | |
835 fwrite(dp->buffer, len, 1, f); | |
836 fclose(f); | |
837 if(cnt2>0x150) *((int*)NULL)=1; // sig11 :) | |
838 } | |
839 #endif | |
10118 | 840 #if 0 |
7710 | 841 if( ((sh_audio_t *)ds->sh)->format == 0x2000) { |
842 // if DNET, swap bytes, as DNET is byte-swapped AC3: | |
4235 | 843 char *ptr = dp->buffer; |
7710 | 844 int i; |
4235 | 845 for (i = 0; i < len; i += 2) |
846 { | |
847 const char tmp = ptr[0]; | |
848 ptr[0] = ptr[1]; | |
849 ptr[1] = tmp; | |
850 ptr += 2; | |
851 } | |
852 } | |
10118 | 853 #endif |
11441 | 854 if (priv->audio_need_keyframe == 1) { |
855 priv->audio_need_keyframe = 0; | |
20794
cc6e090f9a75
Changed code that used pts=0 in demux packets to indicate "not known".
uau
parents:
20499
diff
changeset
|
856 } else if(priv->a_pts != timestamp) |
cc6e090f9a75
Changed code that used pts=0 in demux packets to indicate "not known".
uau
parents:
20499
diff
changeset
|
857 dp->pts = timestamp/1000.0; |
6423 | 858 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
|
859 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
|
860 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
|
861 ds_add_packet(ds, dp); |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
862 |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
863 } // codec_id check, codec default case |
7710 | 864 } |
11441 | 865 // we will not use audio index if we use -idx and have a video |
28549 | 866 if(((!demuxer->video->sh && index_mode == 2) || priv->is_multirate) && (unsigned)demuxer->audio->id < MAX_STREAMS) { |
36545 | 867 while (priv->current_apacket + 1 < priv->index_table_size[rm_stream_id] && |
868 timestamp > priv->index_table[rm_stream_id][priv->current_apacket].timestamp) { | |
11441 | 869 priv->current_apacket += 1; |
14402 | 870 priv->stream_switch = 1; |
871 } | |
28549 | 872 if (priv->stream_switch) |
873 priv->audio_curpos = stream_tell(demuxer->stream); | |
874 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
875 |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
876 // If we're reordering audio packets and we need more data get it |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
877 if (audioreorder_getnextpk) |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
878 continue; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
879 |
7710 | 880 return 1; |
881 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
882 |
36545 | 883 if(demuxer->video->id==mp_stream_id){ |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
884 got_video: |
7710 | 885 ds=demuxer->video; |
36545 | 886 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is video (mp_id: %d)\n", mp_stream_id); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
887 |
7710 | 888 // parse video chunk: |
889 { | |
890 // we need a more complicated, 2nd level demuxing, as the video | |
891 // frames are stored fragmented in the video chunks :( | |
892 sh_video_t *sh_video = ds->sh; | |
893 demux_packet_t *dp; | |
19952
9f95bc4b361a
int->unsigned to avoid crash to sign extension, partially fixes bug #580
reimar
parents:
18505
diff
changeset
|
894 unsigned vpkg_header, vpkg_length, vpkg_offset; |
7710 | 895 int vpkg_seqnum=-1; |
896 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
|
897 |
6916 | 898 while(len>2){ |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
899 dp_hdr_t* dp_hdr; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
900 unsigned char* dp_data; |
32596
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
901 uint8_t* extra; |
6916 | 902 |
903 // 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
|
904 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
905 // read packet header |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
906 // 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
|
907 // 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
|
908 vpkg_header=stream_read_char(demuxer->stream); --len; |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
909 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "hdr: %02X (len=%d) ",vpkg_header,len); |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
910 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
911 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
|
912 // 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
|
913 // 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
|
914 int bummer; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
915 bummer=stream_read_char(demuxer->stream); --len; |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
916 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%02X",bummer); |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
917 vpkg_offset=0; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
918 vpkg_length=len; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
919 } else { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
920 |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
921 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
|
922 // 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
|
923 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
|
924 --len; |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
925 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "subseq: %02X ",vpkg_subseq); |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
926 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
|
927 } |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
928 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
929 // 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
|
930 // 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
|
931 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
|
932 len-=2; |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
933 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "l: %02X %02X ",vpkg_length>>8,vpkg_length&0xff); |
6916 | 934 if (!(vpkg_length&0xC000)) { |
935 vpkg_length<<=16; | |
19954
f3f751f50ccf
Missing part of previous patch to demux_real.c (revision 19958)
reimar
parents:
19952
diff
changeset
|
936 vpkg_length|=(uint16_t)stream_read_word(demuxer->stream); |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
937 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "l+: %02X %02X ",(vpkg_length>>8)&0xff,vpkg_length&0xff); |
6344 | 938 len-=2; |
939 } else | |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
940 vpkg_length&=0x3fff; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
941 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
942 // 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
|
943 // 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
|
944 // _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
|
945 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
|
946 len-=2; |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
947 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "o: %02X %02X ",vpkg_offset>>8,vpkg_offset&0xff); |
6916 | 948 if (!(vpkg_offset&0xC000)) { |
949 vpkg_offset<<=16; | |
19954
f3f751f50ccf
Missing part of previous patch to demux_real.c (revision 19958)
reimar
parents:
19952
diff
changeset
|
950 vpkg_offset|=(uint16_t)stream_read_word(demuxer->stream); |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
951 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "o+: %02X %02X ",(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
|
952 len-=2; |
6344 | 953 } else |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
954 vpkg_offset&=0x3fff; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
955 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
956 vpkg_seqnum=stream_read_char(demuxer->stream); --len; |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10508
diff
changeset
|
957 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "seq: %02X ",vpkg_seqnum); |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
958 } |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
959 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
|
960 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
|
961 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
|
962 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
|
963 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
964 if(ds->asf_packet){ |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
965 dp=ds->asf_packet; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
966 dp_hdr=(dp_hdr_t*)dp->buffer; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
967 dp_data=dp->buffer+sizeof(dp_hdr_t); |
32596
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
968 extra=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
|
969 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
|
970 // 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
|
971 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
|
972 // this fragment is for new packet, close the old one |
6423 | 973 mp_msg(MSGT_DEMUX,MSGL_DBG2, "closing probably incomplete packet, len: %d \n",dp->len); |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
974 queue_video_packet(priv, ds, dp); |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
975 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
|
976 } else { |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
977 // append data to it! |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
978 ++dp_hdr->chunks; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
979 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
|
980 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
|
981 // increase buffer size, this should not happen! |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
982 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
|
983 dp->len=dp_hdr->chunktab+8*(4+dp_hdr->chunks); |
27282
16beae919ff1
Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents:
27269
diff
changeset
|
984 dp->buffer=realloc(dp->buffer,dp->len+MP_INPUT_BUFFER_PADDING_SIZE); |
16beae919ff1
Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents:
27269
diff
changeset
|
985 memset(dp->buffer + dp->len, 0, MP_INPUT_BUFFER_PADDING_SIZE); |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
986 // re-calc pointers: |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
987 dp_hdr=(dp_hdr_t*)dp->buffer; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
988 dp_data=dp->buffer+sizeof(dp_hdr_t); |
32596
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
989 extra=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
|
990 } |
32596
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
991 AV_WL32(extra + 8*dp_hdr->chunks + 0, 1); |
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
992 AV_WL32(extra + 8*dp_hdr->chunks + 4, 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
|
993 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
|
994 // last fragment! |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
995 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
|
996 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); |
27643 | 997 if (vpkg_offset > dp->len - sizeof(dp_hdr_t) - dp_hdr->len) vpkg_offset = dp->len - sizeof(dp_hdr_t) - dp_hdr->len; |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
998 stream_read(demuxer->stream, dp_data+dp_hdr->len, vpkg_offset); |
9553
6886b16ac5d1
Redundant packet ignoring is RV30-only (at least frame-header flag 0x20 is)
arpi
parents:
9543
diff
changeset
|
999 if((dp_data[dp_hdr->len]&0x20) && (sh_video->format==0x30335652)) --dp_hdr->chunks; else |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1000 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
|
1001 len-=vpkg_offset; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1002 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
|
1003 // we know that this is the last fragment -> we can close the packet! |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
1004 queue_video_packet(priv, ds, dp); |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1005 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
|
1006 // continue parsing |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1007 continue; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1008 } |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1009 // non-last fragment: |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1010 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
|
1011 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); |
27643 | 1012 if (len > dp->len - sizeof(dp_hdr_t) - dp_hdr->len) len = dp->len - sizeof(dp_hdr_t) - dp_hdr->len; |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1013 stream_read(demuxer->stream, dp_data+dp_hdr->len, len); |
9553
6886b16ac5d1
Redundant packet ignoring is RV30-only (at least frame-header flag 0x20 is)
arpi
parents:
9543
diff
changeset
|
1014 if((dp_data[dp_hdr->len]&0x20) && (sh_video->format==0x30335652)) --dp_hdr->chunks; else |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1015 dp_hdr->len+=len; |
6916 | 1016 len=0; |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1017 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
|
1018 } |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1019 } |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1020 // create new packet! |
7084 | 1021 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
|
1022 // the timestamp seems to be in milliseconds |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1023 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
|
1024 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
|
1025 ds->asf_seq = vpkg_seqnum; |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1026 dp_hdr=(dp_hdr_t*)dp->buffer; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1027 dp_hdr->chunks=0; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1028 dp_hdr->timestamp=timestamp; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1029 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
|
1030 dp_data=dp->buffer+sizeof(dp_hdr_t); |
32596
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
1031 extra=dp->buffer+dp_hdr->chunktab; |
7f521af5122f
Fix some unaligned writes and avoid some (incorrect due to alignment) casts.
reimar
parents:
32537
diff
changeset
|
1032 AV_WL32(extra, 1); AV_WL32(extra + 4, 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
|
1033 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
|
1034 // first fragment: |
27643 | 1035 if (len > dp->len - sizeof(dp_hdr_t)) len = dp->len - sizeof(dp_hdr_t); |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1036 dp_hdr->len=len; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1037 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
|
1038 ds->asf_packet=dp; |
6916 | 1039 len=0; |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1040 break; |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1041 } |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1042 // whole packet (not fragmented): |
11870 | 1043 if (vpkg_length > len) { |
1044 mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** WARNING: vpkg_length=%i > len=%i ********\n", vpkg_length, len); | |
1045 /* | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1046 * To keep the video stream rolling, we need to break |
11870 | 1047 * here. We shouldn't touch len to make sure rest of the |
1048 * broken packet is skipped. | |
1049 */ | |
1050 break; | |
1051 } | |
7081
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1052 dp_hdr->len=vpkg_length; len-=vpkg_length; |
66c2e2d0504f
- changed re-muxed packet structure (see struct dp_hdr_t)
arpi
parents:
6995
diff
changeset
|
1053 stream_read(demuxer->stream, dp_data, vpkg_length); |
28468
b9da026ee222
change internal real video packetizing format to the more straight forward one
aurel
parents:
28051
diff
changeset
|
1054 queue_video_packet(priv, ds, dp); |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1055 |
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1056 } // while(len>0) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1057 |
6916 | 1058 if(len){ |
11870 | 1059 mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** !!!!!!!! BUG!! len=%d !!!!!!!!!!! ********\n",len); |
6916 | 1060 if(len>0) stream_skip(demuxer->stream, len); |
1061 } | |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1062 } |
28549 | 1063 if ((unsigned)demuxer->video->id < MAX_STREAMS) { |
36545 | 1064 while (priv->current_vpacket + 1 < priv->index_table_size[rm_stream_id] && |
1065 timestamp > priv->index_table[rm_stream_id][priv->current_vpacket + 1].timestamp) { | |
11441 | 1066 priv->current_vpacket += 1; |
14402 | 1067 priv->stream_switch = 1; |
1068 } | |
28549 | 1069 if (priv->stream_switch) |
1070 priv->video_curpos = stream_tell(demuxer->stream); | |
1071 } | |
1072 | |
7710 | 1073 return 1; |
4235 | 1074 } |
3777 | 1075 |
36545 | 1076 if((unsigned)rm_stream_id<MAX_STREAMS){ |
1077 if(demuxer->audio->id==-1 && demuxer->a_streams[mp_stream_id]){ | |
1078 sh_audio_t *sh = demuxer->a_streams[mp_stream_id]; | |
1079 demuxer->audio->id=mp_stream_id; | |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1080 demuxer->audio->sh=sh; |
18505
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1081 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
1082 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); |
36545 | 1083 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected RM audio ID = %d (rm id %d)\n",mp_stream_id, rm_stream_id); |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1084 goto got_audio; |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1085 } |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1086 |
36545 | 1087 if(demuxer->video->id==-1 && demuxer->v_streams[mp_stream_id]){ |
1088 sh_video_t *sh = demuxer->v_streams[mp_stream_id]; | |
1089 demuxer->video->id=mp_stream_id; | |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1090 demuxer->video->sh=sh; |
36545 | 1091 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected RM video ID = %d (rm id %d)\n",mp_stream_id, rm_stream_id); |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1092 goto got_video; |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1093 } |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1094 |
8927 | 1095 } |
1096 | |
36545 | 1097 mp_msg(MSGT_DEMUX,MSGL_DBG2, "unknown stream id (%d)\n", rm_stream_id); |
11441 | 1098 discard: |
7710 | 1099 stream_skip(demuxer->stream, len); |
1100 }// goto loop; | |
19960
5928bd5c7f0b
Make fill_buffer function check for stream eof, fixes hang at eof (bug #580)
reimar
parents:
19954
diff
changeset
|
1101 return 0; |
3777 | 1102 } |
1103 | |
16175 | 1104 static demuxer_t* demux_open_real(demuxer_t* demuxer) |
3777 | 1105 { |
1106 real_priv_t* priv = demuxer->priv; | |
1107 int num_of_headers; | |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1108 int a_streams=0; |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1109 int v_streams=0; |
3777 | 1110 int i; |
11797
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1111 int header_size; |
3777 | 1112 |
11797
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1113 header_size = stream_read_dword(demuxer->stream); /* header size */ |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1114 mp_msg(MSGT_DEMUX,MSGL_V, "real: Header size: %d\n", header_size); |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1115 i = stream_read_word(demuxer->stream); /* version */ |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1116 mp_msg(MSGT_DEMUX,MSGL_V, "real: Header object version: %d\n", i); |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1117 if (header_size == 0x10) |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1118 i = stream_read_word(demuxer->stream); |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1119 else /* we should test header_size here too. */ |
571295c177d2
Fix for Real files with header size == 0x10 (normally is 0x12)
rtognimp
parents:
11606
diff
changeset
|
1120 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
|
1121 mp_msg(MSGT_DEMUX,MSGL_V, "real: File version: %d\n", i); |
3777 | 1122 num_of_headers = stream_read_dword(demuxer->stream); |
1123 | |
1124 /* parse chunks */ | |
10508
e2a88f1d47f6
BBC .rm fix, based on patch by Balatoni Denes <pnis@coder.hu>
arpi
parents:
10368
diff
changeset
|
1125 for (i = 1; i <= num_of_headers; i++) |
e2a88f1d47f6
BBC .rm fix, based on patch by Balatoni Denes <pnis@coder.hu>
arpi
parents:
10368
diff
changeset
|
1126 // for (i = 1; ; i++) |
3777 | 1127 { |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1128 int chunk_id, chunk_pos, chunk_size; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1129 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1130 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
|
1131 chunk_id = stream_read_dword_le(demuxer->stream); |
3777 | 1132 chunk_size = stream_read_dword(demuxer->stream); |
1133 | |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1134 stream_skip(demuxer->stream, 2); /* version */ |
7710 | 1135 |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1136 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
|
1137 (char *)&chunk_id, chunk_id, chunk_size, chunk_pos); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1138 |
29247
fe871e69b1b3
chunk size = 0 is valid for DATA chunks (used in live streams), don't
rtogni
parents:
29238
diff
changeset
|
1139 if (chunk_id != MKTAG('D', 'A', 'T', 'A') && chunk_size < 10){ |
7710 | 1140 mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_real: invalid chunksize! (%d)\n",chunk_size); |
8569 | 1141 break; //return; |
7710 | 1142 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1143 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1144 switch(chunk_id) |
3777 | 1145 { |
1146 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
|
1147 /* Properties header */ |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1148 |
3777 | 1149 stream_skip(demuxer->stream, 4); /* max bitrate */ |
1150 stream_skip(demuxer->stream, 4); /* avg bitrate */ | |
1151 stream_skip(demuxer->stream, 4); /* max packet size */ | |
1152 stream_skip(demuxer->stream, 4); /* avg packet size */ | |
1153 stream_skip(demuxer->stream, 4); /* nb packets */ | |
11441 | 1154 priv->duration = stream_read_dword(demuxer->stream)/1000; /* duration */ |
3777 | 1155 stream_skip(demuxer->stream, 4); /* preroll */ |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1156 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
|
1157 mp_msg(MSGT_DEMUX,MSGL_V,"First index chunk offset: 0x%x\n", priv->index_chunk_offset); |
3795 | 1158 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
|
1159 mp_msg(MSGT_DEMUX,MSGL_V,"First data chunk offset: 0x%x\n", priv->data_chunk_offset); |
36545 | 1160 priv->streams_in_file = stream_read_word(demuxer->stream); |
1161 mp_msg(MSGT_DEMUX,MSGL_V,"Number of streams in file: %d\n", priv->streams_in_file); | |
3795 | 1162 #if 0 |
3777 | 1163 stream_skip(demuxer->stream, 2); /* flags */ |
3795 | 1164 #else |
1165 { | |
1166 int flags = stream_read_word(demuxer->stream); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1167 |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1168 if (flags) |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1169 { |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1170 mp_msg(MSGT_DEMUX,MSGL_V,"Flags (%x): ", flags); |
3795 | 1171 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
|
1172 mp_msg(MSGT_DEMUX,MSGL_V,"[save allowed] "); |
3795 | 1173 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
|
1174 mp_msg(MSGT_DEMUX,MSGL_V,"[perfect play (more buffers)] "); |
3795 | 1175 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
|
1176 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
|
1177 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
|
1178 } |
3795 | 1179 } |
1180 #endif | |
3777 | 1181 break; |
1182 case MKTAG('C', 'O', 'N', 'T'): | |
3788 | 1183 { |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1184 /* Content description header */ |
3788 | 1185 char *buf; |
1186 int len; | |
1187 | |
1188 len = stream_read_word(demuxer->stream); | |
1189 if (len > 0) | |
1190 { | |
1191 buf = malloc(len+1); | |
1192 stream_read(demuxer->stream, buf, len); | |
5810 | 1193 buf[len] = 0; |
29288
4a1c217a844b
In all demux_info_add calls change "name" to "title".
reimar
parents:
29263
diff
changeset
|
1194 demux_info_add(demuxer, "title", buf); |
3788 | 1195 free(buf); |
1196 } | |
1197 | |
1198 len = stream_read_word(demuxer->stream); | |
1199 if (len > 0) | |
1200 { | |
1201 buf = malloc(len+1); | |
1202 stream_read(demuxer->stream, buf, len); | |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1203 buf[len] = 0; |
3788 | 1204 demux_info_add(demuxer, "author", buf); |
1205 free(buf); | |
1206 } | |
1207 | |
1208 len = stream_read_word(demuxer->stream); | |
1209 if (len > 0) | |
1210 { | |
1211 buf = malloc(len+1); | |
1212 stream_read(demuxer->stream, buf, len); | |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1213 buf[len] = 0; |
3788 | 1214 demux_info_add(demuxer, "copyright", buf); |
1215 free(buf); | |
1216 } | |
1217 | |
1218 len = stream_read_word(demuxer->stream); | |
1219 if (len > 0) | |
1220 { | |
1221 buf = malloc(len+1); | |
1222 stream_read(demuxer->stream, buf, len); | |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1223 buf[len] = 0; |
3788 | 1224 demux_info_add(demuxer, "comment", buf); |
1225 free(buf); | |
1226 } | |
3777 | 1227 break; |
3788 | 1228 } |
3777 | 1229 case MKTAG('M', 'D', 'P', 'R'): |
1230 { | |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1231 /* Media properties header */ |
3777 | 1232 int stream_id; |
1233 int bitrate; | |
1234 int codec_data_size; | |
1235 int codec_pos; | |
3795 | 1236 int tmp; |
14402 | 1237 int len; |
17788
2fe769b4b30b
Fix potential read from an unitialized pointer (CID: 236)
rtognimp
parents:
17776
diff
changeset
|
1238 char *descr, *mimet = NULL; |
3777 | 1239 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
|
1240 mp_msg(MSGT_DEMUX,MSGL_V,"Found new stream (id: %d)\n", stream_id); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1241 |
3777 | 1242 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
|
1243 bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */ |
3777 | 1244 stream_skip(demuxer->stream, 4); /* max packet size */ |
1245 stream_skip(demuxer->stream, 4); /* avg packet size */ | |
1246 stream_skip(demuxer->stream, 4); /* start time */ | |
1247 stream_skip(demuxer->stream, 4); /* preroll */ | |
1248 stream_skip(demuxer->stream, 4); /* duration */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1249 |
14402 | 1250 if ((len = stream_read_char(demuxer->stream)) > 0) { |
1251 descr = malloc(len+1); | |
1252 stream_read(demuxer->stream, descr, len); | |
1253 descr[len] = 0; | |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
18106
diff
changeset
|
1254 mp_msg(MSGT_DEMUX, MSGL_INFO,"Stream description: %s\n", descr); |
14402 | 1255 free(descr); |
1256 } | |
1257 if ((len = stream_read_char(demuxer->stream)) > 0) { | |
1258 mimet = malloc(len+1); | |
1259 stream_read(demuxer->stream, mimet, len); | |
1260 mimet[len] = 0; | |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
18106
diff
changeset
|
1261 mp_msg(MSGT_DEMUX, MSGL_INFO,"Stream mimetype: %s\n", mimet); |
14402 | 1262 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1263 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1264 /* Type specific header */ |
3777 | 1265 codec_data_size = stream_read_dword(demuxer->stream); |
1266 codec_pos = stream_tell(demuxer->stream); | |
1267 | |
7710 | 1268 #ifdef MP_DEBUG |
6374
b2d5aeb72f95
export subpacket-size and matrix w*h to the codec (cook)
arpi
parents:
6369
diff
changeset
|
1269 #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 | 1270 #endif |
1271 | |
14402 | 1272 if (!strncmp(mimet,"audio/",6)) { |
1273 if (strstr(mimet,"x-pn-realaudio") || strstr(mimet,"x-pn-multirate-realaudio")) { | |
36545 | 1274 int num_mlti, mlti_cnt, ra_size; |
14402 | 1275 tmp = stream_read_dword(demuxer->stream); |
36545 | 1276 if (tmp == MKTAG('I', 'T', 'L', 'M')) // MLTI chunk in audio |
1277 { | |
1278 int num_streams, stream_cnt; | |
1279 mp_msg(MSGT_DEMUX,MSGL_V,"MLTI chunk in audio.\n"); | |
1280 num_streams = stream_read_word(demuxer->stream); | |
1281 for (stream_cnt = 0; stream_cnt < num_streams; stream_cnt++) | |
1282 stream_skip(demuxer->stream, 2); // MDPR index, one per stream | |
1283 num_mlti = stream_read_word(demuxer->stream); | |
1284 if (num_mlti != 1) { | |
1285 mp_msg(MSGT_DEMUX,MSGL_V,"Found MLTI in audio with %d substreams.\n", num_mlti); | |
1286 priv->is_mlti = 1; | |
1287 } else | |
36552 | 1288 mp_msg(MSGT_DEMUX,MSGL_V,"Found MLTI in audio with 1 substream. Ignoring\n"); |
36545 | 1289 if (num_mlti > MAX_MLTIIDX) { |
1290 mp_msg(MSGT_DEMUX,MSGL_ERR,"Too many (%d) MLTI audio, truncating; expect problems. Please report to Mplayer developers.\n", num_mlti); | |
1291 num_mlti = MAX_MLTIIDX - 1; // Limit to max MLTI | |
1292 } | |
1293 ra_size = stream_read_dword(demuxer->stream); // Size of the following .ra chunk | |
1294 tmp = stream_read_dword(demuxer->stream); | |
1295 } else { | |
1296 num_mlti = 1; | |
1297 ra_size = codec_data_size; | |
1298 } | |
1299 for (mlti_cnt = 0; mlti_cnt < num_mlti; mlti_cnt++) { | |
1300 if (mlti_cnt) { | |
1301 ra_size = stream_read_dword(demuxer->stream); // Size of the following .ra chunk | |
1302 tmp = stream_read_dword(demuxer->stream); | |
1303 } | |
14402 | 1304 if (tmp != MKTAG(0xfd, 'a', 'r', '.')) |
3777 | 1305 { |
14402 | 1306 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: can't find .ra in codec data\n"); |
36545 | 1307 stream_skip(demuxer->stream, ra_size - 4); |
14402 | 1308 } else { |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1309 /* audio header */ |
36545 | 1310 int aid = priv->is_mlti ? priv->streams_in_file + a_streams + v_streams : stream_id; |
1311 sh_audio_t *sh = new_sh_audio(demuxer, aid, NULL); | |
3795 | 1312 char buf[128]; /* for codec name */ |
1313 int frame_size; | |
36798
e4eaa6407e24
demux_real: initialize variables and remove unused one.
reimar
parents:
36592
diff
changeset
|
1314 int sub_packet_size = 0; |
e4eaa6407e24
demux_real: initialize variables and remove unused one.
reimar
parents:
36592
diff
changeset
|
1315 int sub_packet_h = 0; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1316 int version; |
36798
e4eaa6407e24
demux_real: initialize variables and remove unused one.
reimar
parents:
36592
diff
changeset
|
1317 int coded_frame_size = 0; |
8094 | 1318 int codecdata_length; |
11989
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1319 int i; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1320 char *buft; |
12327
fac1637c2c37
Fix for 28_8 in rm files and header length != 0x4e
rtognimp
parents:
12076
diff
changeset
|
1321 int hdr_size; |
36545 | 1322 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "real", aid); |
1323 priv->mp2rm_streamid[aid] = stream_id; | |
1324 priv->rm2mp[stream_id][mlti_cnt] = aid; | |
1325 mp_msg(MSGT_DEMUX,MSGL_V,"Mplayer aid %d is rm stream %d with MDPR index %d\n", aid, stream_id, mlti_cnt); | |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1326 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
|
1327 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
|
1328 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version); |
11989
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1329 if (version == 3) { |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1330 stream_skip(demuxer->stream, 2); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1331 stream_skip(demuxer->stream, 10); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1332 stream_skip(demuxer->stream, 4); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1333 // Name, author, (c) are also in CONT tag |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1334 if ((i = stream_read_char(demuxer->stream)) != 0) { |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1335 buft = malloc(i+1); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1336 stream_read(demuxer->stream, buft, i); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1337 buft[i] = 0; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1338 demux_info_add(demuxer, "Name", buft); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1339 free(buft); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1340 } |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1341 if ((i = stream_read_char(demuxer->stream)) != 0) { |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1342 buft = malloc(i+1); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1343 stream_read(demuxer->stream, buft, i); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1344 buft[i] = 0; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1345 demux_info_add(demuxer, "Author", buft); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1346 free(buft); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1347 } |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1348 if ((i = stream_read_char(demuxer->stream)) != 0) { |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1349 buft = malloc(i+1); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1350 stream_read(demuxer->stream, buft, i); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1351 buft[i] = 0; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1352 demux_info_add(demuxer, "Copyright", buft); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1353 free(buft); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1354 } |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1355 if ((i = stream_read_char(demuxer->stream)) != 0) |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1356 mp_msg(MSGT_DEMUX,MSGL_WARN,"Last header byte is not zero!\n"); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1357 stream_skip(demuxer->stream, 1); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1358 i = stream_read_char(demuxer->stream); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1359 sh->format = stream_read_dword_le(demuxer->stream); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1360 if (i != 4) { |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1361 mp_msg(MSGT_DEMUX,MSGL_WARN,"Audio FourCC size is not 4 (%d), please report to " |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1362 "MPlayer developers\n", i); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1363 stream_skip(demuxer->stream, i - 4); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1364 } |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1365 if (sh->format != mmioFOURCC('l','p','c','J')) { |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1366 mp_msg(MSGT_DEMUX,MSGL_WARN,"Version 3 audio with FourCC %8x, please report to " |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1367 "MPlayer developers\n", sh->format); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1368 } |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1369 sh->channels = 1; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1370 sh->samplesize = 16; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1371 sh->samplerate = 8000; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1372 frame_size = 240; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1373 strcpy(buf, "14_4"); |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1374 } else { |
6374
b2d5aeb72f95
export subpacket-size and matrix w*h to the codec (cook)
arpi
parents:
6369
diff
changeset
|
1375 stream_skip(demuxer->stream, 2); // 00 00 |
3788 | 1376 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
|
1377 stream_skip(demuxer->stream, 4); // ??? |
3788 | 1378 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ |
12327
fac1637c2c37
Fix for 28_8 in rm files and header length != 0x4e
rtognimp
parents:
12076
diff
changeset
|
1379 hdr_size = stream_read_dword(demuxer->stream); // header size |
fac1637c2c37
Fix for 28_8 in rm files and header length != 0x4e
rtognimp
parents:
12076
diff
changeset
|
1380 mp_msg(MSGT_DEMUX,MSGL_V,"header size: %d\n", hdr_size); |
36798
e4eaa6407e24
demux_real: initialize variables and remove unused one.
reimar
parents:
36592
diff
changeset
|
1381 stream_skip(demuxer->stream, 2);/* codec flavor id */ |
8094 | 1382 coded_frame_size = stream_read_dword(demuxer->stream);/* needed by codec */ |
17401
d624a0a191f3
Print some more useful data from header in verbose mode
rtognimp
parents:
17394
diff
changeset
|
1383 mp_msg(MSGT_DEMUX,MSGL_V,"coded_frame_size: %d\n", coded_frame_size); |
6369 | 1384 stream_skip(demuxer->stream, 4); // big number |
1385 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
|
1386 stream_skip(demuxer->stream, 4); // 2 || -''- |
b2d5aeb72f95
export subpacket-size and matrix w*h to the codec (cook)
arpi
parents:
6369
diff
changeset
|
1387 sub_packet_h = stream_read_word(demuxer->stream); |
17401
d624a0a191f3
Print some more useful data from header in verbose mode
rtognimp
parents:
17394
diff
changeset
|
1388 mp_msg(MSGT_DEMUX,MSGL_V,"sub_packet_h: %d\n", sub_packet_h); |
3795 | 1389 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
|
1390 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
|
1391 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
|
1392 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
|
1393 stream_skip(demuxer->stream, 2); // 0 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1394 |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1395 if (version == 5) |
6369 | 1396 stream_skip(demuxer->stream, 6); //0,srate,0 |
3777 | 1397 |
1398 sh->samplerate = stream_read_word(demuxer->stream); | |
6369 | 1399 stream_skip(demuxer->stream, 2); // 0 |
1400 sh->samplesize = stream_read_word(demuxer->stream)/8; | |
3777 | 1401 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
|
1402 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n", |
3877 | 1403 sh->samplerate, sh->channels); |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1404 |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1405 if (version == 5) |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1406 { |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
1407 stream_read(demuxer->stream, buf, 4); // interleaver id |
36545 | 1408 priv->intl_id[aid] = MKTAG(buf[0], buf[1], buf[2], buf[3]); |
6369 | 1409 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
|
1410 buf[4] = 0; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1411 } |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1412 else |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1413 { |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
1414 /* Interleaver id */ |
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
1415 get_str(1, demuxer, buf, sizeof(buf)); |
36545 | 1416 priv->intl_id[aid] = MKTAG(buf[0], buf[1], buf[2], buf[3]); |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
1417 /* Codec FourCC */ |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1418 get_str(1, demuxer, buf, sizeof(buf)); |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1419 } |
11989
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1420 } |
3777 | 1421 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1422 /* Emulate WAVEFORMATEX struct: */ |
32109 | 1423 sh->wf = calloc(1, sizeof(*sh->wf)); |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1424 sh->wf->nChannels = sh->channels; |
6369 | 1425 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
|
1426 sh->wf->nSamplesPerSec = sh->samplerate; |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1427 sh->wf->nAvgBytesPerSec = bitrate/8; |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1428 sh->wf->nBlockAlign = frame_size; |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1429 sh->wf->cbSize = 0; |
6374
b2d5aeb72f95
export subpacket-size and matrix w*h to the codec (cook)
arpi
parents:
6369
diff
changeset
|
1430 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
|
1431 |
6374
b2d5aeb72f95
export subpacket-size and matrix w*h to the codec (cook)
arpi
parents:
6369
diff
changeset
|
1432 switch (sh->format) |
3795 | 1433 { |
1434 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
|
1435 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n"); |
10118 | 1436 // sh->format = 0x2000; |
3795 | 1437 break; |
10032 | 1438 case MKTAG('1', '4', '_', '4'): |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1439 sh->wf->nBlockAlign = 0x14; |
11989
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1440 break; |
644d59147048
Support for v3 audio section (used with 14_4 codec) in real files
rtognimp
parents:
11886
diff
changeset
|
1441 |
10032 | 1442 case MKTAG('2', '8', '_', '8'): |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1443 sh->wf->nBlockAlign = coded_frame_size; |
12327
fac1637c2c37
Fix for 28_8 in rm files and header length != 0x4e
rtognimp
parents:
12076
diff
changeset
|
1444 break; |
fac1637c2c37
Fix for 28_8 in rm files and header length != 0x4e
rtognimp
parents:
12076
diff
changeset
|
1445 |
3795 | 1446 case MKTAG('s', 'i', 'p', 'r'): |
8094 | 1447 case MKTAG('a', 't', 'r', 'c'): |
3795 | 1448 case MKTAG('c', 'o', 'o', 'k'): |
8094 | 1449 // realaudio codec plugins - common: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1450 stream_skip(demuxer->stream,3); // Skip 3 unknown bytes |
8094 | 1451 if (version==5) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1452 stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte |
8094 | 1453 codecdata_length=stream_read_dword(demuxer->stream); |
18505
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1454 // Check extradata len, we can't store bigger values in cbSize anyway |
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1455 if ((unsigned)codecdata_length > 0xffff) { |
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1456 mp_msg(MSGT_DEMUX,MSGL_ERR,"Extradata too big (%d)\n", codecdata_length); |
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1457 goto skip_this_chunk; |
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1458 } |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1459 sh->wf->cbSize = codecdata_length; |
32109 | 1460 sh->wf = realloc(sh->wf, sizeof(*sh->wf)+sh->wf->cbSize); |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1461 stream_read(demuxer->stream, ((char*)(sh->wf+1)), codecdata_length); // extras |
36545 | 1462 if (priv->intl_id[aid] == MKTAG('g', 'e', 'n', 'r')) |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1463 sh->wf->nBlockAlign = sub_packet_size; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1464 else |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1465 sh->wf->nBlockAlign = coded_frame_size; |
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1466 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1467 break; |
17149
9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents:
16877
diff
changeset
|
1468 |
11877 | 1469 case MKTAG('r', 'a', 'a', 'c'): |
1470 case MKTAG('r', 'a', 'c', 'p'): | |
1471 /* This is just AAC. The two or five bytes of */ | |
1472 /* config data needed for libfaad are stored */ | |
1473 /* after the audio headers. */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1474 stream_skip(demuxer->stream,3); // Skip 3 unknown bytes |
11877 | 1475 if (version==5) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1476 stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte |
11877 | 1477 codecdata_length=stream_read_dword(demuxer->stream); |
1478 if (codecdata_length>=1) { | |
1479 sh->codecdata_len = codecdata_length - 1; | |
1480 sh->codecdata = calloc(sh->codecdata_len, 1); | |
1481 stream_skip(demuxer->stream, 1); | |
1482 stream_read(demuxer->stream, sh->codecdata, sh->codecdata_len); | |
1483 } | |
1484 sh->format = mmioFOURCC('M', 'P', '4', 'A'); | |
1485 break; | |
3795 | 1486 default: |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1487 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf); |
3777 | 1488 } |
1489 | |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
1490 // Interleaver setup |
36545 | 1491 priv->sub_packet_size[aid] = sub_packet_size; |
1492 priv->sub_packet_h[aid] = sub_packet_h; | |
1493 priv->coded_framesize[aid] = coded_frame_size; | |
1494 priv->audiopk_size[aid] = frame_size; | |
21989
c3dc45e16aa3
Use interleaver id to select the correct interleaver instead of guessing
rtogni
parents:
21421
diff
changeset
|
1495 |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1496 sh->wf->wFormatTag = sh->format; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1497 |
17388
002e4923d5ab
Print audio 4cc for every stream, print 4cc of selected audio track
rtognimp
parents:
17366
diff
changeset
|
1498 mp_msg(MSGT_DEMUX,MSGL_V,"audio fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format); |
17932 | 1499 if ( mp_msg_test(MSGT_DEMUX,MSGL_V) ) |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
1500 print_wave_header(sh->wf, MSGL_V); |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1501 |
14402 | 1502 /* Select audio stream with highest bitrate if multirate file*/ |
1503 if (priv->is_multirate && ((demuxer->audio->id == -1) || | |
1504 ((demuxer->audio->id >= 0) && priv->a_bitrate && (bitrate > priv->a_bitrate)))) { | |
1505 demuxer->audio->id = stream_id; | |
1506 priv->a_bitrate = bitrate; | |
1507 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Multirate autoselected audio id %d with bitrate %d\n", stream_id, bitrate); | |
1508 } | |
1509 | |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1510 if(demuxer->audio->id==stream_id){ |
7710 | 1511 demuxer->audio->sh=sh; |
18505
01b9f29c2fb5
Fix some potential integer overflow in memory allocation (mot of these
rtognimp
parents:
18444
diff
changeset
|
1512 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
1513 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); |
3777 | 1514 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1515 |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1516 ++a_streams; |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1517 |
7710 | 1518 #ifdef stream_skip |
6369 | 1519 #undef stream_skip |
7710 | 1520 #endif |
36545 | 1521 } // .ra |
1522 } // MLTI | |
14498 | 1523 } else if (strstr(mimet,"X-MP3-draft-00")) { |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
31465
diff
changeset
|
1524 sh_audio_t *sh = new_sh_audio(demuxer, stream_id, NULL); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
1525 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "real", stream_id); |
14402 | 1526 |
1527 /* Emulate WAVEFORMATEX struct: */ | |
32109 | 1528 sh->wf = calloc(1, sizeof(*sh->wf)); |
14402 | 1529 sh->wf->nChannels = 0;//sh->channels; |
1530 sh->wf->wBitsPerSample = 16; | |
1531 sh->wf->nSamplesPerSec = 0;//sh->samplerate; | |
1532 sh->wf->nAvgBytesPerSec = 0;//bitrate; | |
1533 sh->wf->nBlockAlign = 0;//frame_size; | |
1534 sh->wf->cbSize = 0; | |
14498 | 1535 sh->wf->wFormatTag = sh->format = mmioFOURCC('a','d','u',0x55); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1536 |
14402 | 1537 if(demuxer->audio->id==stream_id){ |
1538 demuxer->audio->sh=sh; | |
1539 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1540 |
14402 | 1541 ++a_streams; |
1542 } else if (strstr(mimet,"x-ralf-mpeg4")) { | |
34884 | 1543 sh_audio_t *sh = new_sh_audio(demuxer, stream_id, NULL); |
1544 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "real", stream_id); | |
1545 | |
1546 // Check extradata len, we can't store bigger values in cbSize anyway | |
1547 if ((unsigned)codec_data_size > 0xffff) { | |
1548 mp_msg(MSGT_DEMUX,MSGL_ERR,"Extradata too big (%d)\n", codec_data_size); | |
1549 goto skip_this_chunk; | |
1550 } | |
1551 /* Emulate WAVEFORMATEX struct: */ | |
1552 sh->wf = calloc(1, sizeof(*sh->wf)+codec_data_size); | |
1553 sh->wf->nChannels = 0; | |
1554 sh->wf->wBitsPerSample = 16; | |
1555 sh->wf->nSamplesPerSec = 0; | |
1556 sh->wf->nAvgBytesPerSec = 0; | |
1557 sh->wf->nBlockAlign = 0; | |
1558 sh->wf->wFormatTag = sh->format = mmioFOURCC('L','S','D',':'); | |
1559 sh->wf->cbSize = codec_data_size; | |
1560 stream_read(demuxer->stream, (char*)(sh->wf+1), codec_data_size); | |
1561 | |
1562 ++a_streams; | |
25027 | 1563 } else if (strstr(mimet,"x-pn-encrypted-ra")) { |
1564 mp_msg(MSGT_DEMUX,MSGL_ERR,"Encrypted audio is not supported\n"); | |
14402 | 1565 } else { |
1566 mp_msg(MSGT_DEMUX,MSGL_V,"Unknown audio stream format\n"); | |
1567 } | |
1568 } else if (!strncmp(mimet,"video/",6)) { | |
1569 if (strstr(mimet,"x-pn-realvideo") || strstr(mimet,"x-pn-multirate-realvideo")) { | |
36545 | 1570 int num_mlti, mlti_cnt, vido_size, vido_pos; |
14402 | 1571 tmp = stream_read_dword(demuxer->stream); |
36545 | 1572 if (tmp == MKTAG('I', 'T', 'L', 'M')) // MLTI chunk in video |
1573 { | |
1574 int num_streams, stream_cnt; | |
1575 mp_msg(MSGT_DEMUX,MSGL_V,"MLTI chunk in video.\n"); | |
1576 num_streams = stream_read_word(demuxer->stream); | |
1577 for (stream_cnt = 0; stream_cnt < num_streams; stream_cnt++) | |
1578 stream_skip(demuxer->stream, 2); // MDPR index, one per stream | |
1579 num_mlti = stream_read_word(demuxer->stream); | |
1580 if (num_mlti != 1) { | |
1581 mp_msg(MSGT_DEMUX,MSGL_V,"Found MLTI in video with %d substreams.\n", num_mlti); | |
1582 priv->is_mlti = 1; | |
1583 } else | |
36552 | 1584 mp_msg(MSGT_DEMUX,MSGL_V,"Found MLTI in audio with 1 substream. Ignoring\n"); |
36545 | 1585 if (num_mlti > MAX_MLTIIDX) { |
1586 mp_msg(MSGT_DEMUX,MSGL_ERR,"Too many (%d) MLTI video, truncating; expect problems. Please report to Mplayer developers.\n", num_mlti); | |
1587 num_mlti = MAX_MLTIIDX - 1; // Limit to max MLTI | |
1588 } | |
1589 vido_size = stream_read_dword(demuxer->stream); // Size of the following .vido chunk | |
1590 vido_pos = stream_tell(demuxer->stream);; | |
1591 stream_skip(demuxer->stream, 4); | |
1592 tmp = stream_read_dword(demuxer->stream); | |
1593 priv->is_mlti = 1; | |
1594 } else { | |
1595 num_mlti = 1; | |
1596 vido_size = codec_data_size; | |
1597 vido_pos = codec_pos; | |
1598 tmp = stream_read_dword(demuxer->stream); | |
1599 } | |
1600 for (mlti_cnt = 0; mlti_cnt < num_mlti; mlti_cnt++) { | |
1601 if (mlti_cnt) { | |
1602 vido_size = stream_read_dword(demuxer->stream); // Size of the following vido chunk | |
1603 mp_msg(MSGT_DEMUX,MSGL_V,"VIDO size: %x\n", vido_size); | |
1604 vido_pos = stream_tell(demuxer->stream);; | |
1605 stream_skip(demuxer->stream, 4); | |
1606 tmp = stream_read_dword(demuxer->stream); | |
1607 } | |
14402 | 1608 if(tmp != MKTAG('O', 'D', 'I', 'V')) |
3777 | 1609 { |
14402 | 1610 mp_msg(MSGT_DEMUX,MSGL_V,"Video: can't find VIDO in codec data\n"); |
36545 | 1611 stream_skip(demuxer->stream, vido_size - 4); |
14402 | 1612 } else { |
3777 | 1613 /* video header */ |
36545 | 1614 int vid = priv->is_mlti ? priv->streams_in_file + a_streams + v_streams : stream_id; |
1615 sh_video_t *sh = new_sh_video(demuxer, vid); | |
1616 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "real", vid); | |
1617 priv->mp2rm_streamid[vid] = stream_id; | |
1618 priv->rm2mp[stream_id][mlti_cnt] = vid; | |
1619 mp_msg(MSGT_DEMUX,MSGL_V,"Mplayer vid %d is rm stream %d with MDPR index %d\n", vid, stream_id, mlti_cnt); | |
3777 | 1620 |
1621 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
|
1622 mp_msg(MSGT_DEMUX,MSGL_V,"video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format); |
3777 | 1623 |
3795 | 1624 /* emulate BITMAPINFOHEADER */ |
32109 | 1625 sh->bih = calloc(1, sizeof(*sh->bih)); |
1626 sh->bih->biSize = sizeof(*sh->bih); | |
3777 | 1627 sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream); |
1628 sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream); | |
34762
c1db6548917e
RM demuxer: set aspect from container video dimensions.
reimar
parents:
33337
diff
changeset
|
1629 if (sh->disp_w > 0 && sh->disp_h > 0) |
36316
139f2b064ef9
Don't subsequently calculate original_aspect from last movie_aspect.
ib
parents:
35891
diff
changeset
|
1630 sh->original_aspect = (float)sh->disp_w / sh->disp_h; |
3777 | 1631 sh->bih->biPlanes = 1; |
1632 sh->bih->biBitCount = 24; | |
1633 sh->bih->biCompression = sh->format; | |
1634 sh->bih->biSizeImage= sh->bih->biWidth*sh->bih->biHeight*3; | |
1635 | |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1636 sh->fps = (float) stream_read_word(demuxer->stream); |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1637 if (sh->fps<=0) sh->fps=24; // we probably won't even care about fps |
3777 | 1638 sh->frametime = 1.0f/sh->fps; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1639 |
6344 | 1640 #if 1 |
6414
67c1050a8718
fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6404
diff
changeset
|
1641 stream_skip(demuxer->stream, 4); |
6344 | 1642 #else |
11870 | 1643 mp_msg(MSGT_DEMUX, MSGL_V,"unknown1: 0x%X \n",stream_read_dword(demuxer->stream)); |
1644 mp_msg(MSGT_DEMUX, MSGL_V,"unknown2: 0x%X \n",stream_read_word(demuxer->stream)); | |
1645 mp_msg(MSGT_DEMUX, MSGL_V,"unknown3: 0x%X \n",stream_read_word(demuxer->stream)); | |
6344 | 1646 #endif |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1647 // if(sh->format==0x30335652 || sh->format==0x30325652 ) |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1648 if(1) |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1649 { |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1650 int tmp=stream_read_word(demuxer->stream); |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1651 if(tmp>0){ |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1652 sh->fps=tmp; sh->frametime = 1.0f/sh->fps; |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1653 } |
6414
67c1050a8718
fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6404
diff
changeset
|
1654 } else { |
7710 | 1655 int fps=stream_read_word(demuxer->stream); |
11870 | 1656 mp_msg(MSGT_DEMUX, MSGL_WARN,"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
|
1657 } |
67c1050a8718
fix fps/frametime parsing - patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6404
diff
changeset
|
1658 stream_skip(demuxer->stream, 2); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1659 |
3777 | 1660 { |
20920 | 1661 // read and store codec extradata |
36545 | 1662 unsigned int cnt = vido_size - (stream_tell(demuxer->stream) - vido_pos); |
32109 | 1663 if (cnt > 0x7fffffff - sizeof(*sh->bih)) { |
20920 | 1664 mp_msg(MSGT_DEMUX, MSGL_ERR,"Extradata too big (%u)\n", cnt); |
14568 | 1665 } else { |
32109 | 1666 sh->bih = realloc(sh->bih, sizeof(*sh->bih) + cnt); |
20143 | 1667 sh->bih->biSize += cnt; |
20920 | 1668 stream_read(demuxer->stream, ((unsigned char*)(sh->bih+1)), cnt); |
14568 | 1669 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1670 } |
20920 | 1671 if(sh->format == 0x30315652 && ((unsigned char*)(sh->bih+1))[6] == 0x30) |
1672 sh->bih->biCompression = sh->format = mmioFOURCC('R', 'V', '1', '3'); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1673 |
14402 | 1674 /* Select video stream with highest bitrate if multirate file*/ |
1675 if (priv->is_multirate && ((demuxer->video->id == -1) || | |
1676 ((demuxer->video->id >= 0) && priv->v_bitrate && (bitrate > priv->v_bitrate)))) { | |
1677 demuxer->video->id = stream_id; | |
1678 priv->v_bitrate = bitrate; | |
1679 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Multirate autoselected video id %d with bitrate %d\n", stream_id, bitrate); | |
1680 } | |
1681 | |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1682 if(demuxer->video->id==stream_id){ |
7710 | 1683 demuxer->video->sh=sh; |
3777 | 1684 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1685 |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1686 ++v_streams; |
7710 | 1687 |
36545 | 1688 } // VIDO |
1689 } // MLTI | |
14402 | 1690 } else { |
1691 mp_msg(MSGT_DEMUX,MSGL_V,"Unknown video stream format\n"); | |
1692 } | |
1693 } else if (strstr(mimet,"logical-")) { | |
1694 if (strstr(mimet,"fileinfo")) { | |
1695 mp_msg(MSGT_DEMUX,MSGL_V,"Got a logical-fileinfo chunk\n"); | |
1696 } else if (strstr(mimet,"-audio") || strstr(mimet,"-video")) { | |
1697 int i, stream_cnt; | |
1698 int stream_list[MAX_STREAMS]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1699 |
14402 | 1700 priv->is_multirate = 1; |
1701 stream_skip(demuxer->stream, 4); // Length of codec data (repeated) | |
1702 stream_cnt = stream_read_dword(demuxer->stream); // Get number of audio or video streams | |
18106
3a34a728fa1b
always cast stream IDs to unsigned before comparing to MAX_STREAMS.
reimar
parents:
17977
diff
changeset
|
1703 if ((unsigned)stream_cnt >= MAX_STREAMS) { |
14402 | 1704 mp_msg(MSGT_DEMUX,MSGL_ERR,"Too many streams in %s. Big troubles ahead.\n", mimet); |
1705 goto skip_this_chunk; | |
1706 } | |
1707 for (i = 0; i < stream_cnt; i++) | |
1708 stream_list[i] = stream_read_word(demuxer->stream); | |
1709 for (i = 0; i < stream_cnt; i++) | |
18106
3a34a728fa1b
always cast stream IDs to unsigned before comparing to MAX_STREAMS.
reimar
parents:
17977
diff
changeset
|
1710 if ((unsigned)stream_list[i] >= MAX_STREAMS) { |
14402 | 1711 mp_msg(MSGT_DEMUX,MSGL_ERR,"Stream id out of range: %d. Ignored.\n", stream_list[i]); |
1712 stream_skip(demuxer->stream, 4); // Skip DATA offset for broken stream | |
1713 } else { | |
1714 priv->str_data_offset[stream_list[i]] = stream_read_dword(demuxer->stream); | |
1715 mp_msg(MSGT_DEMUX,MSGL_V,"Stream %d with DATA offset 0x%08x\n", stream_list[i], priv->str_data_offset[stream_list[i]]); | |
1716 } | |
1717 // Skip the rest of this chunk | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1718 } else |
14402 | 1719 mp_msg(MSGT_DEMUX,MSGL_V,"Unknown logical stream\n"); |
1720 } | |
7085
02aa64b49b70
some files has some shit before teh audio/video headers...
arpi
parents:
7084
diff
changeset
|
1721 else { |
02aa64b49b70
some files has some shit before teh audio/video headers...
arpi
parents:
7084
diff
changeset
|
1722 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
|
1723 } |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1724 // break; |
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1725 // default: |
14402 | 1726 skip_this_chunk: |
3777 | 1727 /* skip codec info */ |
3795 | 1728 tmp = stream_tell(demuxer->stream) - codec_pos; |
6344 | 1729 mp_msg(MSGT_DEMUX,MSGL_V,"### skipping %d bytes of codec info\n", codec_data_size - tmp); |
1730 #if 0 | |
1731 { int i; | |
1732 for(i=0;i<codec_data_size - tmp;i++) | |
11870 | 1733 mp_msg(MSGT_DEMUX, MSGL_V," %02X",stream_read_char(demuxer->stream)); |
1734 mp_msg(MSGT_DEMUX, MSGL_V,"\n"); | |
6344 | 1735 } |
1736 #else | |
3795 | 1737 stream_skip(demuxer->stream, codec_data_size - tmp); |
6344 | 1738 #endif |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32346
diff
changeset
|
1739 free (mimet); |
3777 | 1740 break; |
3985
701d18898835
updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents:
3882
diff
changeset
|
1741 // } |
3777 | 1742 } |
1743 case MKTAG('D', 'A', 'T', 'A'): | |
1744 goto header_end; | |
3795 | 1745 case MKTAG('I', 'N', 'D', 'X'): |
3777 | 1746 default: |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1747 mp_msg(MSGT_DEMUX,MSGL_V,"Unknown chunk: %x\n", chunk_id); |
3777 | 1748 stream_skip(demuxer->stream, chunk_size - 10); |
1749 break; | |
1750 } | |
1751 } | |
1752 | |
1753 header_end: | |
36545 | 1754 if(priv->is_multirate && priv->is_mlti) |
1755 mp_msg(MSGT_DEMUX,MSGL_ERR,"Multirate and MLTI in the same file is bad. Please contact Mplayer developers.\n"); | |
1756 | |
14402 | 1757 if(priv->is_multirate) { |
1758 mp_msg(MSGT_DEMUX,MSGL_V,"Selected video id %d audio id %d\n", demuxer->video->id, demuxer->audio->id); | |
1759 /* Perform some sanity checks to avoid checking streams id all over the code*/ | |
1760 if (demuxer->audio->id >= MAX_STREAMS) { | |
1761 mp_msg(MSGT_DEMUX,MSGL_ERR,"Invalid audio stream %d. No sound will be played.\n", demuxer->audio->id); | |
1762 demuxer->audio->id = -2; | |
1763 } else if ((demuxer->audio->id >= 0) && (priv->str_data_offset[demuxer->audio->id] == 0)) { | |
1764 mp_msg(MSGT_DEMUX,MSGL_ERR,"Audio stream %d not found. No sound will be played.\n", demuxer->audio->id); | |
1765 demuxer->audio->id = -2; | |
1766 } | |
1767 if (demuxer->video->id >= MAX_STREAMS) { | |
1768 mp_msg(MSGT_DEMUX,MSGL_ERR,"Invalid video stream %d. No video will be played.\n", demuxer->video->id); | |
1769 demuxer->video->id = -2; | |
1770 } else if ((demuxer->video->id >= 0) && (priv->str_data_offset[demuxer->video->id] == 0)) { | |
1771 mp_msg(MSGT_DEMUX,MSGL_ERR,"Video stream %d not found. No video will be played.\n", demuxer->video->id); | |
1772 demuxer->video->id = -2; | |
1773 } | |
1774 } | |
1775 | |
1776 if(priv->is_multirate && ((demuxer->video->id >= 0) || (demuxer->audio->id >=0))) { | |
1777 /* If audio or video only, seek to right place and behave like standard file */ | |
1778 if (demuxer->video->id < 0) { | |
1779 // Stream is audio only, or -novideo | |
1780 stream_seek(demuxer->stream, priv->data_chunk_offset = priv->str_data_offset[demuxer->audio->id]+10); | |
1781 priv->is_multirate = 0; | |
1782 } | |
1783 if (demuxer->audio->id < 0) { | |
1784 // Stream is video only, or -nosound | |
1785 stream_seek(demuxer->stream, priv->data_chunk_offset = priv->str_data_offset[demuxer->video->id]+10); | |
1786 priv->is_multirate = 0; | |
1787 } | |
1788 } | |
1789 | |
1790 if(!priv->is_multirate) { | |
10508
e2a88f1d47f6
BBC .rm fix, based on patch by Balatoni Denes <pnis@coder.hu>
arpi
parents:
10368
diff
changeset
|
1791 // printf("i=%d num_of_headers=%d \n",i,num_of_headers); |
3777 | 1792 priv->num_of_packets = stream_read_dword(demuxer->stream); |
1793 stream_skip(demuxer->stream, 4); /* next data header */ | |
1794 | |
6340
7f612cf06ba5
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
5918
diff
changeset
|
1795 mp_msg(MSGT_DEMUX,MSGL_V,"Packets in file: %d\n", priv->num_of_packets); |
3777 | 1796 |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1797 if (priv->num_of_packets == 0) |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1798 priv->num_of_packets = -10; |
14402 | 1799 } else { |
1800 priv->audio_curpos = priv->str_data_offset[demuxer->audio->id] + 18; | |
1801 stream_seek(demuxer->stream, priv->str_data_offset[demuxer->audio->id]+10); | |
33337 | 1802 priv->a_num_of_packets = stream_read_dword(demuxer->stream); |
14402 | 1803 priv->video_curpos = priv->str_data_offset[demuxer->video->id] + 18; |
1804 stream_seek(demuxer->stream, priv->str_data_offset[demuxer->video->id]+10); | |
1805 priv->v_num_of_packets = stream_read_dword(demuxer->stream); | |
1806 priv->stream_switch = 1; | |
1807 /* Index required for multirate playback, force building if it's not there */ | |
1808 /* but respect user request to force index regeneration */ | |
1809 if (index_mode == -1) | |
1810 index_mode = 1; | |
1811 } | |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1812 |
3777 | 1813 |
11441 | 1814 priv->audio_need_keyframe = 0; |
1815 priv->video_after_seek = 0; | |
1816 | |
12665
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1817 switch (index_mode){ |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1818 case -1: // untouched |
31269
5eec425fdee2
Disable index reading in real demuxer if stream is not seekable.
reimar
parents:
30589
diff
changeset
|
1819 if ((demuxer->stream->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK && |
5eec425fdee2
Disable index reading in real demuxer if stream is not seekable.
reimar
parents:
30589
diff
changeset
|
1820 priv->index_chunk_offset && parse_index_chunk(demuxer)) |
12665
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1821 { |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1822 demuxer->seekable = 1; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1823 } |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1824 break; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1825 case 1: // use (generate index) |
17394
d44f30816921
Always try to parse index chunk, no reason to check for movi_end
reimar
parents:
17391
diff
changeset
|
1826 if (priv->index_chunk_offset && parse_index_chunk(demuxer)) |
12665
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1827 { |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1828 demuxer->seekable = 1; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1829 } else { |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1830 generate_index(demuxer); |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1831 demuxer->seekable = 1; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1832 } |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1833 break; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1834 case 2: // force generating index |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1835 generate_index(demuxer); |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1836 demuxer->seekable = 1; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1837 break; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1838 default: // do nothing |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1839 break; |
751a27fc8895
index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
alex
parents:
12367
diff
changeset
|
1840 } |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1841 |
8109
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1842 // detect streams: |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1843 if(demuxer->video->id==-1 && v_streams>0){ |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1844 // find the valid video stream: |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1845 if(!ds_fill_buffer(demuxer->video)){ |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1846 mp_msg(MSGT_DEMUXER,MSGL_INFO,"RM: " MSGTR_MissingVideoStream); |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1847 } |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1848 } |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1849 if(demuxer->audio->id==-1 && a_streams>0){ |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1850 // find the valid audio stream: |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1851 if(!ds_fill_buffer(demuxer->audio)){ |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1852 mp_msg(MSGT_DEMUXER,MSGL_INFO,"RM: " MSGTR_MissingAudioStream); |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1853 } |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1854 } |
cb4c507c69aa
ASF-style stream auto-selection, to fix files with fake a/v streams (only
arpi
parents:
8094
diff
changeset
|
1855 |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1856 if(demuxer->video->sh){ |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1857 sh_video_t *sh=demuxer->video->sh; |
14578 | 1858 mp_msg(MSGT_DEMUX,MSGL_V,"VIDEO: %.4s [%08X,%08X] %dx%d (aspect %4.2f) %4.2f fps\n", |
17366 | 1859 (char *)&sh->format,((unsigned int*)(sh->bih+1))[1],((unsigned int*)(sh->bih+1))[0], |
9561
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1860 sh->disp_w,sh->disp_h,sh->aspect,sh->fps); |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1861 } |
05c462fd6bff
- fixed playback of files with bad WxH in header (tricky! we can always read the
arpi
parents:
9555
diff
changeset
|
1862 |
17388
002e4923d5ab
Print audio 4cc for every stream, print 4cc of selected audio track
rtognimp
parents:
17366
diff
changeset
|
1863 if(demuxer->audio->sh){ |
002e4923d5ab
Print audio 4cc for every stream, print 4cc of selected audio track
rtognimp
parents:
17366
diff
changeset
|
1864 sh_audio_t *sh=demuxer->audio->sh; |
002e4923d5ab
Print audio 4cc for every stream, print 4cc of selected audio track
rtognimp
parents:
17366
diff
changeset
|
1865 mp_msg(MSGT_DEMUX,MSGL_V,"AUDIO: %.4s [%08X]\n", |
17391 | 1866 (char *)&sh->format,sh->format); |
17388
002e4923d5ab
Print audio 4cc for every stream, print 4cc of selected audio track
rtognimp
parents:
17366
diff
changeset
|
1867 } |
002e4923d5ab
Print audio 4cc for every stream, print 4cc of selected audio track
rtognimp
parents:
17366
diff
changeset
|
1868 |
16175 | 1869 return demuxer; |
3777 | 1870 } |
1871 | |
16175 | 1872 static void demux_close_real(demuxer_t *demuxer) |
3777 | 1873 { |
13837 | 1874 int i; |
3777 | 1875 real_priv_t* priv = demuxer->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1876 |
13837 | 1877 if (priv){ |
1878 for(i=0; i<MAX_STREAMS; i++) | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32346
diff
changeset
|
1879 free(priv->index_table[i]); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32346
diff
changeset
|
1880 free(priv->audio_buf); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32346
diff
changeset
|
1881 free(priv->audio_timestamp); |
3777 | 1882 free(priv); |
13837 | 1883 } |
3777 | 1884 |
1885 return; | |
1886 } | |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1887 |
5918
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1888 /* please upload RV10 samples WITH INDEX CHUNK */ |
17636 | 1889 static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1890 { |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1891 real_priv_t *priv = demuxer->priv; |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1892 demux_stream_t *d_audio = demuxer->audio; |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1893 demux_stream_t *d_video = demuxer->video; |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1894 sh_audio_t *sh_audio = d_audio->sh; |
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1895 sh_video_t *sh_video = d_video->sh; |
6344 | 1896 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
|
1897 int next_offset = 0; |
35891 | 1898 int64_t target_timestamp = 0; |
5918
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1899 int streams = 0; |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1900 int retried = 0; |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1901 |
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1902 |
36545 | 1903 if (priv->is_mlti && (unsigned)vid < MAX_STREAMS) |
1904 vid = priv->mp2rm_streamid[d_video->id]; | |
1905 if (priv->is_mlti && (unsigned)aid < MAX_STREAMS) | |
1906 aid = priv->mp2rm_streamid[d_audio->id]; | |
1907 | |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1908 if (sh_video && (unsigned)vid < MAX_STREAMS && priv->index_table_size[vid]) |
5918
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1909 streams |= 1; |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1910 if (sh_audio && (unsigned)aid < MAX_STREAMS && priv->index_table_size[aid]) |
5918
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1911 streams |= 2; |
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1912 |
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1913 // printf("streams: %d\n", streams); |
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1914 |
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1915 if (!streams) |
17174
83a8c738be89
make demuxer seek and close functions return void, patch by Dominik Mierzejewski
wanderer
parents:
17149
diff
changeset
|
1916 return; |
5918
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1917 |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
1918 if (flags & SEEK_ABSOLUTE) |
5083
ce6952225939
added PRE-ALPHA seeking ability and index table generator (like avi's one)
alex
parents:
4328
diff
changeset
|
1919 priv->current_apacket = priv->current_vpacket = 0; |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
1920 if (flags & SEEK_FACTOR) |
20492
0b563edd9b3a
Quick hack to implement percent-based seeking, also fixes seeking with gmplayer
reimar
parents:
20229
diff
changeset
|
1921 rel_seek_secs *= priv->duration; |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1922 |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1923 if ((streams & 1) && priv->current_vpacket >= priv->index_table_size[vid]) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1924 priv->current_vpacket = priv->index_table_size[vid] - 1; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1925 if ((streams & 2) && priv->current_apacket >= priv->index_table_size[aid]) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1926 priv->current_apacket = priv->index_table_size[aid] - 1; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1927 |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1928 // if (index_mode == 1 || index_mode == 2) { |
11441 | 1929 if (streams & 1) {// use the video index if we have one |
35891 | 1930 target_timestamp = priv->index_table[vid][priv->current_vpacket].timestamp; |
1931 target_timestamp += rel_seek_secs * 1000; | |
11441 | 1932 if (rel_seek_secs > 0) |
35891 | 1933 while (priv->index_table[vid][priv->current_vpacket].timestamp < target_timestamp){ |
11441 | 1934 priv->current_vpacket += 1; |
1935 if (priv->current_vpacket >= priv->index_table_size[vid]) { | |
1936 priv->current_vpacket = priv->index_table_size[vid] - 1; | |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1937 if (!retried) { |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1938 stream_seek(demuxer->stream, priv->index_table[vid][priv->current_vpacket].offset); |
35891 | 1939 add_index_segment(demuxer, vid, target_timestamp); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1940 retried = 1; |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1941 } |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1942 else |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1943 break; |
11441 | 1944 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1945 } |
28549 | 1946 else if (rel_seek_secs < 0) { |
35891 | 1947 while (priv->index_table[vid][priv->current_vpacket].timestamp > target_timestamp){ |
11441 | 1948 priv->current_vpacket -= 1; |
1949 if (priv->current_vpacket < 0) { | |
1950 priv->current_vpacket = 0; | |
1951 break; | |
1952 } | |
1953 } | |
28549 | 1954 } |
1955 priv->video_curpos = priv->index_table[vid][priv->current_vpacket].offset; | |
1956 priv->audio_need_keyframe = !priv->is_multirate; | |
11441 | 1957 priv->video_after_seek = 1; |
35891 | 1958 } else { |
1959 target_timestamp = priv->index_table[aid][priv->current_apacket].timestamp; | |
1960 target_timestamp += rel_seek_secs * 1000; | |
11441 | 1961 } |
28549 | 1962 if (streams & 2) { |
11441 | 1963 if (rel_seek_secs > 0) |
35891 | 1964 while (priv->index_table[aid][priv->current_apacket].timestamp < target_timestamp){ |
11441 | 1965 priv->current_apacket += 1; |
1966 if (priv->current_apacket >= priv->index_table_size[aid]) { | |
1967 priv->current_apacket = priv->index_table_size[aid] - 1; | |
1968 break; | |
1969 } | |
1970 } | |
1971 else if (rel_seek_secs < 0) | |
35891 | 1972 while (priv->index_table[aid][priv->current_apacket].timestamp > target_timestamp){ |
11441 | 1973 priv->current_apacket -= 1; |
1974 if (priv->current_apacket < 0) { | |
1975 priv->current_apacket = 0; | |
1976 break; | |
1977 } | |
1978 } | |
28549 | 1979 priv->audio_curpos = priv->index_table[aid][priv->current_apacket].offset; |
11441 | 1980 } |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1981 // } |
28549 | 1982 next_offset = streams & 1 ? priv->video_curpos : priv->audio_curpos; |
5918
dca3016882cf
completed real seeking - working very well with audio only files
alex
parents:
5810
diff
changeset
|
1983 // 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
|
1984 // next_offset, priv->current_apacket, priv->current_vpacket); |
11596
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1985 if (next_offset) |
6d377637ea60
Proper runtime index generation with support for growing files. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
11441
diff
changeset
|
1986 stream_seek(demuxer->stream, next_offset); |
11441 | 1987 |
16175 | 1988 demux_real_fill_buffer(demuxer, NULL); |
3882
c5cefeb78c40
added read_index_chunk, fixed audio_header parser for version5
alex
parents:
3877
diff
changeset
|
1989 } |
11441 | 1990 |
16175 | 1991 static int demux_real_control(demuxer_t *demuxer, int cmd, void *arg) |
11441 | 1992 { |
1993 real_priv_t *priv = demuxer->priv; | |
20139
1ef90de62efa
Fix problems on live streams with huge timestamps, causing overflows and
rtogni
parents:
19960
diff
changeset
|
1994 unsigned int lastpts = priv->v_pts ? priv->v_pts : priv->a_pts; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
1995 |
11441 | 1996 switch (cmd) { |
1997 case DEMUXER_CTRL_GET_TIME_LENGTH: | |
1998 if (priv->duration == 0) | |
1999 return DEMUXER_CTRL_DONTKNOW; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
2000 |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16175
diff
changeset
|
2001 *((double *)arg) = (double)priv->duration; |
11441 | 2002 return DEMUXER_CTRL_OK; |
2003 | |
2004 case DEMUXER_CTRL_GET_PERCENT_POS: | |
2005 if (priv->duration == 0) | |
2006 return DEMUXER_CTRL_DONTKNOW; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
2007 |
11441 | 2008 *((int *)arg) = (int)(100 * lastpts / priv->duration); |
2009 return DEMUXER_CTRL_OK; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29247
diff
changeset
|
2010 |
11441 | 2011 default: |
2012 return DEMUXER_CTRL_NOTIMPL; | |
2013 } | |
2014 } | |
16175 | 2015 |
2016 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25600
diff
changeset
|
2017 const demuxer_desc_t demuxer_desc_real = { |
16175 | 2018 "Realmedia demuxer", |
2019 "real", | |
2020 "REAL", | |
2021 "Alex Beregszasi, Florian Schneider, A'rpi, Roberto Togni", | |
2022 "handles new .RMF files", | |
2023 DEMUXER_TYPE_REAL, | |
2024 1, // safe autodetect | |
2025 real_check_file, | |
2026 demux_real_fill_buffer, | |
2027 demux_open_real, | |
2028 demux_close_real, | |
2029 demux_seek_real, | |
2030 demux_real_control | |
2031 }; |