Changeset a9654857c29c01272d235c1a85a3e4df95057d6a

Show
Ignore:
Timestamp:
06/15/08 00:00:04 (3 months ago)
Author:
Jean-Baptiste Kempf <jb@videolan.org>
git-committer:
Jean-Baptiste Kempf <jb@videolan.org> 1213480804 -0700
git-parent:

[cc6941a5134af40e0a41620215bf9efe8ab5ba94]

git-author:
Jean-Baptiste Kempf <jb@videolan.org> 1213480472 -0700
Message:

Parse RealAudio? headers files. Doesn't decode correctly yet .

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/demux/real.c

    r3561b9b ra965485  
    4040 * Real Audio Only 
    4141 * --------------- 
    42  * Not supported... 
     42 * v3 and v4/5 headers are parsed. 
     43 * Doesn't work yet... 
    4344 */ 
    4445 
     
    4647 * Preamble 
    4748 *****************************************************************************/ 
     49 
    4850#ifdef HAVE_CONFIG_H 
    4951# include "config.h" 
     
    5254#include <vlc_common.h> 
    5355#include <vlc_plugin.h> 
    54  
    5556 
    5657#include <vlc_demux.h> 
     
    9697    int         i_subpackets; 
    9798    block_t     **p_subpackets; 
    98     int64_t        *p_subpackets_timecode; 
     99    int64_t     *p_subpackets_timecode; 
    99100    int         i_out_subpacket; 
    100101 
     
    116117    int64_t  i_data_offset_next; 
    117118 
     119    bool     b_is_real_audio; 
     120 
    118121    int  i_our_duration; 
    119122    int  i_mux_rate; 
     
    132135    vlc_meta_t *p_meta; 
    133136 
    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; 
    137140}; 
    138141 
     
    141144 
    142145static int HeaderRead( demux_t *p_demux ); 
     146static uint8_t * MetaRead( demux_t *p_demux, const uint8_t *p_peek ); 
    143147static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ); 
    144148 
     
    152156 
    153157    const uint8_t *p_peek; 
     158    bool           b_is_real_audio = false; 
    154159 
    155160    if( stream_Peek( p_demux->s, &p_peek, 10 ) < 10 ) return VLC_EGENERIC; 
     161 
     162    /* Real Audio */ 
    156163    if( !memcmp( p_peek, ".ra", 3 ) ) 
    157164    { 
    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; 
    162170 
    163171    /* Fill p_demux field */ 
     
    177185 
    178186    p_sys->b_seek  = 0; 
     187    p_sys->b_is_real_audio = b_is_real_audio; 
    179188 
    180189    /* 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 ) ) 
    182199    { 
    183200        int i; 
     
    282299    if( stream_Read( p_demux->s, header, 12 ) < 12 ) return 0; 
    283300 
     301    //    int i_version = GetWBE( &header[0] ); 
    284302    i_size = GetWBE( &header[2] ) - 12; 
    285303    i_id   = GetWBE( &header[4] ); 
     
    11681186} 
    11691187 
     1188static 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 
    11701255static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num ) 
    11711256{ 
     
    12451330        es_format_Init( &fmt, AUDIO_ES, 0 ); 
    12461331 
    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        { 
    12521334            i_header_size = GetWBE( p_peek ); p_peek += 2;  /* Size from now */ 
    12531335            p_peek += 10;                                         /* Unknown */ 
    12541336 
     1337            msg_Dbg( p_demux, "Data Size: %i", GetDWBE( p_peek ) ); 
    12551338            p_peek += 4;                                        /* Data Size */ 
    12561339 
    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*/ 
    13181346 
    13191347            fmt.audio.i_channels = 1;      /* This is always the case in rm3 */ 
     
    13231351                 (char*)&fmt.i_codec, fmt.audio.i_channels, fmt.audio.i_rate ); 
    13241352        } 
    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) */ 
    13311359            i_header_size = GetDWBE( p_peek ); p_peek += 4;   /* header size */ 
    13321360            i_flavor = GetWBE( p_peek ); p_peek += 2;        /* codec flavor */ 
     
    13381366            i_frame_size = GetWBE( p_peek ); p_peek += 2;      /* frame size */ 
    13391367            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 ) 
    13411370                 return VLC_EGENERIC; 
    13421371            p_peek += 2;                                               /* ?? */ 
     
    13441373            if( i_version == 5 ) p_peek += 6;                 /* 0, srate, 0 */ 
    13451374 
    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;                                                /* ?? */ 
    13481377            fmt.audio.i_bitspersample = GetWBE( p_peek ); p_peek += 2;/* Sure?*/ 
    13491378            fmt.audio.i_channels = GetWBE( p_peek ); p_peek += 2; /* Channels */ 
     
    13551384                memcpy( (char *)&fmt.i_codec, p_peek, 4 ); p_peek += 4; 
    13561385            } 
    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]
    13621391            } 
    13631392 
     
    13661395 
    13671396            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            } 
    13711408        } 
    13721409 
    13731410        switch( fmt.i_codec ) 
    13741411        { 
     1412        case VLC_FOURCC('l','p','c','J'): 
     1413            fmt.i_codec = VLC_FOURCC( '1','4','_','4' ); 
    13751414        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 ; 
    13811416            break; 
    13821417 
     
    14951530    return VLC_SUCCESS; 
    14961531} 
     1532