Changeset a9654857c29c01272d235c1a85a3e4df95057d6a
- Timestamp:
- 06/15/08 00:00:04 (3 months ago)
- git-parent:
- Files:
-
- modules/demux/real.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
modules/demux/real.c
r3561b9b ra965485 40 40 * Real Audio Only 41 41 * --------------- 42 * Not supported... 42 * v3 and v4/5 headers are parsed. 43 * Doesn't work yet... 43 44 */ 44 45 … … 46 47 * Preamble 47 48 *****************************************************************************/ 49 48 50 #ifdef HAVE_CONFIG_H 49 51 # include "config.h" … … 52 54 #include <vlc_common.h> 53 55 #include <vlc_plugin.h> 54 55 56 56 57 #include <vlc_demux.h> … … 96 97 int i_subpackets; 97 98 block_t **p_subpackets; 98 int64_t *p_subpackets_timecode;99 int64_t *p_subpackets_timecode; 99 100 int i_out_subpacket; 100 101 … … 116 117 int64_t i_data_offset_next; 117 118 119 bool b_is_real_audio; 120 118 121 int i_our_duration; 119 122 int i_mux_rate; … … 132 135 vlc_meta_t *p_meta; 133 136 134 int64_t i_index_offset;135 int b_seek;136 rm_index_t * p_index;137 int64_t i_index_offset; 138 int b_seek; 139 rm_index_t *p_index; 137 140 }; 138 141 … … 141 144 142 145 static int HeaderRead( demux_t *p_demux ); 146 static uint8_t * MetaRead( demux_t *p_demux, const uint8_t *p_peek ); 143 147 static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ); 144 148 … … 152 156 153 157 const uint8_t *p_peek; 158 bool b_is_real_audio = false; 154 159 155 160 if( stream_Peek( p_demux->s, &p_peek, 10 ) < 10 ) return VLC_EGENERIC; 161 162 /* Real Audio */ 156 163 if( !memcmp( p_peek, ".ra", 3 ) ) 157 164 { 158 msg_Warn( p_demux, ".ra files unsuported" ); 159 return VLC_EGENERIC; 160 } 161 if( memcmp( p_peek, ".RMF", 4 ) ) return VLC_EGENERIC; 165 msg_Err( p_demux, ".ra files unsuported" ); 166 b_is_real_audio = true; 167 } 168 /* Real Media Format */ 169 else if( memcmp( p_peek, ".RMF", 4 ) ) return VLC_EGENERIC; 162 170 163 171 /* Fill p_demux field */ … … 177 185 178 186 p_sys->b_seek = 0; 187 p_sys->b_is_real_audio = b_is_real_audio; 179 188 180 189 /* Parse the headers */ 181 if( HeaderRead( p_demux ) ) 190 /* Real Audio files */ 191 if( b_is_real_audio ) 192 { 193 ReadCodecSpecificData( p_demux, 32, 0 ); /* At least 32 */ 194 return VLC_EGENERIC; /* We don't know how to read 195 correctly the data yet */ 196 } 197 /* RMF files */ 198 else if( HeaderRead( p_demux ) ) 182 199 { 183 200 int i; … … 282 299 if( stream_Read( p_demux->s, header, 12 ) < 12 ) return 0; 283 300 301 // int i_version = GetWBE( &header[0] ); 284 302 i_size = GetWBE( &header[2] ) - 12; 285 303 i_id = GetWBE( &header[4] ); … … 1168 1186 } 1169 1187 1188 static uint8_t * MetaRead( demux_t *p_demux, const uint8_t *p_peek ) 1189 { 1190 demux_sys_t *p_sys = p_demux->p_sys; 1191 1192 int i_len; 1193 char *psz; 1194 1195 /* Title */ 1196 i_len = *p_peek ; p_peek++; 1197 if( i_len > 0 ) 1198 { 1199 psz = malloc( i_len + 1 ); 1200 memcpy( psz, p_peek, i_len ); 1201 psz[i_len] = '\0'; 1202 1203 EnsureUTF8( psz ); 1204 msg_Dbg( p_demux, " - title=`%s'", psz ); 1205 p_sys->psz_title = psz; 1206 } 1207 p_peek += i_len; 1208 1209 /* Authors */ 1210 i_len = *p_peek ; p_peek++; 1211 if( i_len > 0 ) 1212 { 1213 psz = malloc( i_len + 1 ); 1214 memcpy( psz, p_peek, i_len ); 1215 psz[i_len] = '\0'; 1216 1217 EnsureUTF8( psz ); 1218 msg_Dbg( p_demux, " - artist=`%s'", psz ); 1219 p_sys->psz_artist = psz; 1220 } 1221 p_peek += i_len; 1222 1223 /* Copyright */ 1224 i_len = *p_peek ; p_peek++; 1225 if( i_len > 0 ) 1226 { 1227 psz = malloc( i_len + 1 ); 1228 memcpy( psz, p_peek, i_len ); 1229 psz[i_len] = '\0'; 1230 1231 EnsureUTF8( psz ); 1232 msg_Dbg( p_demux, " - Copyright=`%s'", psz ); 1233 p_sys->psz_copyright = psz; 1234 } 1235 p_peek += i_len; 1236 1237 /* Comment */ 1238 i_len = *p_peek ; p_peek++; 1239 if( i_len > 0 ) 1240 { 1241 psz = malloc( i_len + 1 ); 1242 memcpy( psz, p_peek, i_len ); 1243 psz[i_len] = '\0'; 1244 1245 EnsureUTF8( psz ); 1246 msg_Dbg( p_demux, " - Comment=`%s'", psz ); 1247 p_sys->psz_description = psz; 1248 } 1249 p_peek += i_len; 1250 1251 return p_peek; 1252 } 1253 1254 1170 1255 static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) 1171 1256 { … … 1245 1330 es_format_Init( &fmt, AUDIO_ES, 0 ); 1246 1331 1247 if( i_version == 3 ) 1248 { 1249 int i_len; 1250 char *psz; 1251 1332 if( i_version == 3 ) /* RMF version 3 or .ra version 3 */ 1333 { 1252 1334 i_header_size = GetWBE( p_peek ); p_peek += 2; /* Size from now */ 1253 1335 p_peek += 10; /* Unknown */ 1254 1336 1337 msg_Dbg( p_demux, "Data Size: %i", GetDWBE( p_peek ) ); 1255 1338 p_peek += 4; /* Data Size */ 1256 1339 1257 /* Title */ 1258 i_len = *p_peek ; p_peek++; 1259 if( i_len > 0 ) 1260 { 1261 psz = malloc( i_len + 1 ); 1262 memcpy( psz, p_peek, i_len ); 1263 psz[i_len] = '\0'; 1264 1265 EnsureUTF8( psz ); 1266 msg_Dbg( p_demux, " - title=`%s'", psz ); 1267 p_sys->psz_title = psz; 1268 } 1269 p_peek += i_len; 1270 1271 /* Authors */ 1272 i_len = *p_peek ; p_peek++; 1273 if( i_len > 0 ) 1274 { 1275 psz = malloc( i_len + 1 ); 1276 memcpy( psz, p_peek, i_len ); 1277 psz[i_len] = '\0'; 1278 1279 EnsureUTF8( psz ); 1280 msg_Dbg( p_demux, " - artist=`%s'", psz ); 1281 p_sys->psz_artist = psz; 1282 } 1283 p_peek += i_len; 1284 1285 /* Copyright */ 1286 i_len = *p_peek ; p_peek++; 1287 if( i_len > 0 ) 1288 { 1289 psz = malloc( i_len + 1 ); 1290 memcpy( psz, p_peek, i_len ); 1291 psz[i_len] = '\0'; 1292 1293 EnsureUTF8( psz ); 1294 msg_Dbg( p_demux, " - Copyright=`%s'", psz ); 1295 p_sys->psz_copyright = psz; 1296 } 1297 p_peek += i_len; 1298 1299 /* Comment */ 1300 i_len = *p_peek ; p_peek++; 1301 if( i_len > 0 ) 1302 { 1303 psz = malloc( i_len + 1 ); 1304 memcpy( psz, p_peek, i_len ); 1305 psz[i_len] = '\0'; 1306 1307 EnsureUTF8( psz ); 1308 msg_Dbg( p_demux, " - Comment=`%s'", psz ); 1309 p_sys->psz_description = psz; 1310 } 1311 /* This might be unusefull */ 1312 p_peek += i_len; 1313 1314 p_peek ++; /* Unknown */ 1315 p_peek ++; /* FourCC length = 4 */ 1316 memcpy( (char *)&fmt.i_codec, p_peek, 4 ); p_peek += 4; 1317 /* Up to here :) */ 1340 /* Meta Datas */ 1341 p_peek = MetaRead( p_demux, p_peek ); 1342 1343 p_peek ++; /* Unknown */ 1344 p_peek ++; /* FourCC length = 4 */ 1345 memcpy( (char *)&fmt.i_codec, p_peek, 4 ); p_peek += 4; /* FourCC*/ 1318 1346 1319 1347 fmt.audio.i_channels = 1; /* This is always the case in rm3 */ … … 1323 1351 (char*)&fmt.i_codec, fmt.audio.i_channels, fmt.audio.i_rate ); 1324 1352 } 1325 else /* RMF version 4/5*/1326 { 1327 p_peek += 2; /* 00 00 */1328 p_peek += 4; /* .ra4 or .ra5 */1329 p_peek += 4; /* data size */1330 p_peek += 2; /* version (4 or 5) */1353 else /* RMF version 4/5 or .ra version 4 */ 1354 { 1355 p_peek += 2; /* 00 00 */ 1356 p_peek += 4; /* .ra4 or .ra5 */ 1357 p_peek += 4; /* data size */ 1358 p_peek += 2; /* version (4 or 5) */ 1331 1359 i_header_size = GetDWBE( p_peek ); p_peek += 4; /* header size */ 1332 1360 i_flavor = GetWBE( p_peek ); p_peek += 2; /* codec flavor */ … … 1338 1366 i_frame_size = GetWBE( p_peek ); p_peek += 2; /* frame size */ 1339 1367 i_subpacket_size = GetWBE( p_peek ); p_peek += 2; /* subpacket_size */ 1340 if( !i_subpacket_size || !i_frame_size || !i_coded_frame_size ) 1368 if( (!i_subpacket_size && !p_sys->b_is_real_audio ) 1369 || !i_frame_size || !i_coded_frame_size ) 1341 1370 return VLC_EGENERIC; 1342 1371 p_peek += 2; /* ?? */ … … 1344 1373 if( i_version == 5 ) p_peek += 6; /* 0, srate, 0 */ 1345 1374 1346 fmt.audio.i_rate = GetWBE( p_peek ); p_peek += 2; /* Sample Rate */1347 p_peek += 2; /* ?? */1375 fmt.audio.i_rate = GetWBE( p_peek ); p_peek += 2; /* Sample Rate */ 1376 p_peek += 2; /* ?? */ 1348 1377 fmt.audio.i_bitspersample = GetWBE( p_peek ); p_peek += 2;/* Sure?*/ 1349 1378 fmt.audio.i_channels = GetWBE( p_peek ); p_peek += 2; /* Channels */ … … 1355 1384 memcpy( (char *)&fmt.i_codec, p_peek, 4 ); p_peek += 4; 1356 1385 } 1357 else 1358 { 1359 p_peek += p_peek[0] + 1; /* descr 1*/1360 memcpy( (char *)&fmt.i_codec, p_peek + 1, 4 ); /* descr 2*/1361 p_peek += p_peek[0] + 1;1386 else /* version 4 */ 1387 { 1388 p_peek += 1 + p_peek[0]; /* Inteleaver ID string and lenth */ 1389 memcpy( (char *)&fmt.i_codec, p_peek + 1, 4 ); /* FourCC */ 1390 p_peek += 1 + p_peek[0]; 1362 1391 } 1363 1392 … … 1366 1395 1367 1396 p_peek += 3; /* ?? */ 1368 if( i_version == 5 ) p_peek++; 1369 /* Extra Data then: DWord + byte[] */ 1370 fmt.i_extra = GetDWBE( p_peek ); p_peek += 4; 1397 1398 if( p_sys->b_is_real_audio ) 1399 { 1400 p_peek = MetaRead( p_demux, p_peek ); 1401 } 1402 else 1403 { 1404 if( i_version == 5 ) p_peek++; 1405 /* Extra Data then: DWord + byte[] */ 1406 fmt.i_extra = GetDWBE( p_peek ); p_peek += 4; 1407 } 1371 1408 } 1372 1409 1373 1410 switch( fmt.i_codec ) 1374 1411 { 1412 case VLC_FOURCC('l','p','c','J'): 1413 fmt.i_codec = VLC_FOURCC( '1','4','_','4' ); 1375 1414 case VLC_FOURCC('1','4','_','4'): 1376 /* fmt.audio.i_blockalign = 0x14 */ 1377 break; 1378 case VLC_FOURCC('l','p','c','J'): 1379 /* fmt.audio.i_blockalign = 0x14 */ 1380 fmt.i_codec = VLC_FOURCC( '1','4','_','4' ); 1415 fmt.audio.i_blockalign = 0x14 ; 1381 1416 break; 1382 1417 … … 1495 1530 return VLC_SUCCESS; 1496 1531 } 1532
