real.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:48k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * real.c: Real demuxer.
  3.  *****************************************************************************
  4.  * Copyright (C) 2004, 2006-2007 the VideoLAN team
  5.  * $Id: c58d9ae71536b9b81a8315b850b36fbe0ebb7ff1 $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /**
  24.  * Status of this demuxer:
  25.  * Real Media format
  26.  * -----------------
  27.  *
  28.  * version v3 w/ 14_4/lpcJ is ok.
  29.  * version v4/5: - atrac3 is ok.
  30.  *               - cook is ok.
  31.  *               - raac, racp are ok.
  32.  *               - dnet is twisted "The byte order of the data is reversed
  33.  *                                  from standard AC3" but ok
  34.  *               - 28_8 is ok.
  35.  *               - sipr should be fine, but our decoder suxx :)
  36.  *               - ralf is unsupported, but hardly any sample exist.
  37.  *               - mp3 is unsupported, one sample exists...
  38.  *
  39.  * Real Audio Only
  40.  * ---------------
  41.  * v3 and v4/5 headers are parsed.
  42.  * Doesn't work yet...
  43.  */
  44. /*****************************************************************************
  45.  * Preamble
  46.  *****************************************************************************/
  47. #ifdef HAVE_CONFIG_H
  48. # include "config.h"
  49. #endif
  50. #include <vlc_common.h>
  51. #include <vlc_plugin.h>
  52. #include <vlc_demux.h>
  53. #include <vlc_charset.h>
  54. #include <vlc_meta.h>
  55. #include <assert.h>
  56. /*****************************************************************************
  57.  * Module descriptor
  58.  *****************************************************************************/
  59. static int  Open    ( vlc_object_t * );
  60. static void Close  ( vlc_object_t * );
  61. vlc_module_begin ()
  62.     set_description( N_("Real demuxer" ) )
  63.     set_capability( "demux", 50 )
  64.     set_category( CAT_INPUT )
  65.     set_subcategory( SUBCAT_INPUT_DEMUX )
  66.     set_callbacks( Open, Close )
  67.     add_shortcut( "real" )
  68.     add_shortcut( "rm" )
  69. vlc_module_end ()
  70. /*****************************************************************************
  71.  * Local prototypes
  72.  *****************************************************************************/
  73. typedef struct
  74. {
  75.     int         i_id;
  76.     es_format_t fmt;
  77.     es_out_id_t *p_es;
  78.     int         i_frame_size;
  79.     int         i_frame_num;
  80.     int         i_frame_pos;
  81.     int         i_frame_slice;
  82.     int         i_frame_slice_count;
  83.     block_t     *p_frame;
  84.     int         i_subpacket_h;
  85.     int         i_subpacket_size;
  86.     int         i_coded_frame_size;
  87.     int         i_subpacket;
  88.     int         i_subpackets;
  89.     block_t     **p_subpackets;
  90.     mtime_t     *p_subpackets_timecode;
  91.     int         i_out_subpacket;
  92.     mtime_t     i_last_dts;
  93. } real_track_t;
  94. typedef struct
  95. {
  96.     uint32_t i_file_offset;
  97.     uint32_t i_time_offset;
  98.     uint32_t i_frame_index;
  99. } real_index_t;
  100. struct demux_sys_t
  101. {
  102.     int64_t  i_data_offset;
  103.     int64_t  i_data_size;
  104.     uint32_t i_data_packets_count;
  105.     uint32_t i_data_packets;
  106.     int64_t  i_data_offset_next;
  107.     bool     b_real_audio;
  108.     int64_t i_our_duration;
  109.     char* psz_title;
  110.     char* psz_artist;
  111.     char* psz_copyright;
  112.     char* psz_description;
  113.     int          i_track;
  114.     real_track_t **track;
  115.     int     i_buffer;
  116.     uint8_t buffer[65536];
  117.     int64_t     i_pcr;
  118.     int64_t     i_index_offset;
  119.     bool        b_seek;
  120.     real_index_t *p_index;
  121. };
  122. static int Demux( demux_t * );
  123. static int Control( demux_t *, int i_query, va_list args );
  124. static void DemuxVideo( demux_t *, real_track_t *tk, mtime_t i_dts, unsigned i_flags );
  125. static void DemuxAudio( demux_t *, real_track_t *tk, mtime_t i_pts, unsigned i_flags );
  126. static int ControlSeekByte( demux_t *, int64_t i_bytes );
  127. static int ControlSeekTime( demux_t *, mtime_t i_time );
  128. static int HeaderRead( demux_t *p_demux );
  129. static int CodecParse( demux_t *p_demux, int i_len, int i_num );
  130. static void     RVoid( const uint8_t **pp_data, int *pi_data, int i_size );
  131. static int      RLength( const uint8_t **pp_data, int *pi_data );
  132. static uint8_t  R8( const uint8_t **pp_data, int *pi_data );
  133. static uint16_t R16( const uint8_t **pp_data, int *pi_data );
  134. static uint32_t R32( const uint8_t **pp_data, int *pi_data );
  135. /*****************************************************************************
  136.  * Open
  137.  *****************************************************************************/
  138. static int Open( vlc_object_t *p_this )
  139. {
  140.     demux_t     *p_demux = (demux_t*)p_this;
  141.     demux_sys_t *p_sys;
  142.     const uint8_t *p_peek;
  143.     bool           b_real_audio = false;
  144.     if( stream_Peek( p_demux->s, &p_peek, 10 ) < 10 )
  145.         return VLC_EGENERIC;
  146.     /* Real Audio */
  147.     if( !memcmp( p_peek, ".ra", 3 ) )
  148.     {
  149.         msg_Err( p_demux, ".ra files unsuported" );
  150.         b_real_audio = true;
  151.     }
  152.     /* Real Media Format */
  153.     else if( memcmp( p_peek, ".RMF", 4 ) )
  154.     {
  155.         return VLC_EGENERIC;
  156.     }
  157.     /* Fill p_demux field */
  158.     p_demux->pf_demux = Demux;
  159.     p_demux->pf_control = Control;
  160.     p_demux->p_sys = p_sys = calloc( 1, sizeof( *p_sys ) );
  161.     if( !p_sys )
  162.         return VLC_ENOMEM;
  163.     p_sys->i_data_offset = 0;
  164.     p_sys->i_track = 0;
  165.     p_sys->track   = NULL;
  166.     p_sys->i_pcr   = 0;
  167.     p_sys->b_seek  = false;
  168.     p_sys->b_real_audio = b_real_audio;
  169.     /* Parse the headers */
  170.     /* Real Audio files */
  171.     if( b_real_audio )
  172.     {
  173.         CodecParse( p_demux, 32, 0 ); /* At least 32 */
  174.         return VLC_EGENERIC;                     /* We don't know how to read
  175.                                                     correctly the data yet */
  176.     }
  177.     /* RMF files */
  178.     else if( HeaderRead( p_demux ) )
  179.     {
  180.         msg_Err( p_demux, "invalid header" );
  181.         Close( p_this );
  182.         return VLC_EGENERIC;
  183.     }
  184.     return VLC_SUCCESS;
  185. }
  186. /*****************************************************************************
  187.  * Close
  188.  *****************************************************************************/
  189. static void Close( vlc_object_t *p_this )
  190. {
  191.     demux_t *p_demux = (demux_t*)p_this;
  192.     demux_sys_t *p_sys = p_demux->p_sys;
  193.     for( int i = 0; i < p_sys->i_track; i++ )
  194.     {
  195.         real_track_t *tk = p_sys->track[i];
  196.         es_format_Clean( &tk->fmt );
  197.         if( tk->p_frame )
  198.             block_Release( tk->p_frame );
  199.         for( int j = 0; j < tk->i_subpackets; j++ )
  200.         {
  201.             if( tk->p_subpackets[ j ] )
  202.                 block_Release( tk->p_subpackets[ j ] );
  203.         }
  204.         if( tk->i_subpackets )
  205.         {
  206.             free( tk->p_subpackets );
  207.             free( tk->p_subpackets_timecode );
  208.         }
  209.         free( tk );
  210.     }
  211.     if( p_sys->i_track > 0 )
  212.         free( p_sys->track );
  213.     free( p_sys->psz_title );
  214.     free( p_sys->psz_artist );
  215.     free( p_sys->psz_copyright );
  216.     free( p_sys->psz_description );
  217.     free( p_sys->p_index );
  218.     free( p_sys );
  219. }
  220. /*****************************************************************************
  221.  * Demux:
  222.  *****************************************************************************/
  223. static int Demux( demux_t *p_demux )
  224. {
  225.     demux_sys_t *p_sys = p_demux->p_sys;
  226.     uint8_t     header[18];
  227.     if( p_sys->i_data_packets >= p_sys->i_data_packets_count &&
  228.         p_sys->i_data_packets_count )
  229.     {
  230.         if( stream_Read( p_demux->s, header, 18 ) < 18 )
  231.             return 0;
  232.         if( memcmp( header, "DATA", 4 ) )
  233.             return 0;
  234.         p_sys->i_data_offset = stream_Tell( p_demux->s ) - 18;
  235.         p_sys->i_data_size   = GetDWBE( &header[4] );
  236.         p_sys->i_data_packets_count = GetDWBE( &header[10] );
  237.         p_sys->i_data_packets = 0;
  238.         p_sys->i_data_offset_next = GetDWBE( &header[14] );
  239.         msg_Dbg( p_demux, "entering new DATA packets=%d next=%u",
  240.                  p_sys->i_data_packets_count,
  241.                  (unsigned int)p_sys->i_data_offset_next );
  242.     }
  243.     /* Read Packet Header */
  244.     if( stream_Read( p_demux->s, header, 12 ) < 12 )
  245.         return 0;
  246.     //const int i_version = GetWBE( &header[0] );
  247.     const int     i_size = GetWBE( &header[2] ) - 12;
  248.     const int     i_id   = GetWBE( &header[4] );
  249.     const int64_t i_pts  = 1 + 1000 * GetDWBE( &header[6] );
  250.     const int     i_flags= header[11]; /* flags 0x02 -> keyframe */
  251.     p_sys->i_data_packets++;
  252.     if( i_size <= 0 )
  253.     {
  254.         msg_Err( p_demux, "Got a NUKK size to read. (Invalid format?)" );
  255.         return 1;
  256.     }
  257.     assert( i_size <= sizeof(p_sys->buffer) );
  258.     p_sys->i_buffer = stream_Read( p_demux->s, p_sys->buffer, i_size );
  259.     if( p_sys->i_buffer < i_size )
  260.         return 0;
  261.     real_track_t *tk = NULL;
  262.     for( int i = 0; i < p_sys->i_track; i++ )
  263.     {
  264.         if( p_sys->track[i]->i_id == i_id )
  265.             tk = p_sys->track[i];
  266.     }
  267.     if( !tk )
  268.     {
  269.         msg_Warn( p_demux, "unknown track id(0x%x)", i_id );
  270.         return 1;
  271.     }
  272.     if( tk->fmt.i_cat == VIDEO_ES )
  273.     {
  274.         DemuxVideo( p_demux, tk, i_pts, i_flags );
  275.     }
  276.     else
  277.     {
  278.         assert( tk->fmt.i_cat == AUDIO_ES );
  279.         DemuxAudio( p_demux, tk, i_pts, i_flags );
  280.     }
  281.     /* Update PCR */
  282.     mtime_t i_pcr = 0;
  283.     for( int i = 0; i < p_sys->i_track; i++ )
  284.     {
  285.         real_track_t *tk = p_sys->track[i];
  286.         if( i_pcr <= 0 || ( tk->i_last_dts > 0 && tk->i_last_dts < i_pcr ) )
  287.             i_pcr = tk->i_last_dts;
  288.     }
  289.     if( i_pcr > 0 && i_pcr != p_sys->i_pcr )
  290.     {
  291.         p_sys->i_pcr = i_pcr;
  292.         es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_pcr );
  293.     }
  294.     return 1;
  295. }
  296. /*****************************************************************************
  297.  * Control:
  298.  *****************************************************************************/
  299. static int Control( demux_t *p_demux, int i_query, va_list args )
  300. {
  301.     demux_sys_t *p_sys = p_demux->p_sys;
  302.     double f, *pf;
  303.     int64_t i64;
  304.     int64_t *pi64;
  305.     switch( i_query )
  306.     {
  307.         case DEMUX_GET_POSITION:
  308.             pf = (double*) va_arg( args, double* );
  309.             /* read stream size maybe failed in rtsp streaming, 
  310.                so use duration to determin the position at first  */
  311.             if( p_sys->i_our_duration > 0 )
  312.             {
  313.                 *pf = (double)p_sys->i_pcr / 1000.0 / p_sys->i_our_duration;
  314.                 return VLC_SUCCESS;
  315.             }
  316.             i64 = stream_Size( p_demux->s );
  317.             if( i64 > 0 )
  318.                 *pf = (double)1.0*stream_Tell( p_demux->s ) / (double)i64;
  319.             else
  320.                 *pf = 0.0;
  321.             return VLC_SUCCESS;
  322.         case DEMUX_GET_TIME:
  323.             pi64 = (int64_t*)va_arg( args, int64_t * );
  324.             if( p_sys->i_our_duration > 0 )
  325.             {
  326.                 *pi64 = p_sys->i_pcr;
  327.                 return VLC_SUCCESS;
  328.             }
  329.             /* same as GET_POSTION */
  330.             i64 = stream_Size( p_demux->s );
  331.             if( p_sys->i_our_duration > 0 && i64 > 0 )
  332.             {
  333.                 *pi64 = (int64_t)( 1000.0 * p_sys->i_our_duration * stream_Tell( p_demux->s ) / i64 );
  334.                 return VLC_SUCCESS;
  335.             }
  336.             *pi64 = 0;
  337.             return VLC_EGENERIC;
  338.         case DEMUX_SET_POSITION:
  339.             f = (double) va_arg( args, double );
  340.             i64 = (int64_t) ( stream_Size( p_demux->s ) * f );
  341.             if( !p_sys->p_index && i64 != 0 )
  342.             {
  343.                 /* TODO seek */
  344.                 msg_Err( p_demux,"Seek No Index Real File failed!" );
  345.                 return VLC_EGENERIC; // no index!
  346.             }
  347.             else if( i64 == 0 )
  348.             {
  349.                 /* it is a rtsp stream , it is specials in access/rtsp/... */
  350.                 msg_Dbg(p_demux, "Seek in real rtsp stream!");
  351.                 p_sys->i_pcr = INT64_C(1000) * ( p_sys->i_our_duration * f  );
  352.                 p_sys->b_seek = true;
  353.                 return stream_Seek( p_demux->s, p_sys->i_pcr );
  354.             }
  355.             return ControlSeekByte( p_demux, i64 );
  356.         case DEMUX_SET_TIME:
  357.             if( !p_sys->p_index )
  358.                 return VLC_EGENERIC;
  359.             i64 = (int64_t) va_arg( args, int64_t );
  360.             return ControlSeekTime( p_demux, i64 );
  361.         case DEMUX_GET_LENGTH:
  362.             pi64 = (int64_t*)va_arg( args, int64_t * );
  363.  
  364.             if( p_sys->i_our_duration <= 0 )
  365.             {
  366.                 *pi64 = 0;
  367.                 return VLC_EGENERIC;
  368.             }
  369.             /* our stored duration is in ms, so... */
  370.             *pi64 = INT64_C(1000) * p_sys->i_our_duration;
  371.             return VLC_SUCCESS;
  372.         case DEMUX_GET_META:
  373.         {
  374.             vlc_meta_t *p_meta = (vlc_meta_t*)va_arg( args, vlc_meta_t* );
  375.             /* the core will crash if we provide NULL strings, so check
  376.              * every string first */
  377.             if( p_sys->psz_title )
  378.                 vlc_meta_SetTitle( p_meta, p_sys->psz_title );
  379.             if( p_sys->psz_artist )
  380.                 vlc_meta_SetArtist( p_meta, p_sys->psz_artist );
  381.             if( p_sys->psz_copyright )
  382.                 vlc_meta_SetCopyright( p_meta, p_sys->psz_copyright );
  383.             if( p_sys->psz_description )
  384.                 vlc_meta_SetDescription( p_meta, p_sys->psz_description );
  385.             return VLC_SUCCESS;
  386.         }
  387.         case DEMUX_GET_FPS:
  388.         default:
  389.             return VLC_EGENERIC;
  390.     }
  391.     return VLC_EGENERIC;
  392. }
  393. /*****************************************************************************
  394.  * Helpers: demux
  395.  *****************************************************************************/
  396. static void CheckPcr( demux_t *p_demux, real_track_t *tk, mtime_t i_dts )
  397. {
  398.     demux_sys_t *p_sys = p_demux->p_sys;
  399.     if( i_dts > 0 )
  400.         tk->i_last_dts = i_dts;
  401.     if( p_sys->i_pcr > 0 || i_dts <= 0 )
  402.         return;
  403.     p_sys->i_pcr = i_dts;
  404.     es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_pcr );
  405. }
  406. static void DemuxVideo( demux_t *p_demux, real_track_t *tk, mtime_t i_dts, unsigned i_flags )
  407. {
  408.     demux_sys_t *p_sys = p_demux->p_sys;
  409.     const uint8_t *p_data = p_sys->buffer;
  410.     int     i_data = p_sys->i_buffer;
  411.     while( i_data > 1 )
  412.     {
  413.         uint8_t i_hdr = R8( &p_data, &i_data );
  414.         uint8_t i_type = i_hdr >> 6;
  415.         uint8_t i_seq;
  416.         int i_len;
  417.         int i_pos;
  418.         int i_frame_num;
  419.         if( i_type == 1 )
  420.         {
  421.             R8( &p_data, &i_data );
  422.             i_len = i_data;
  423.             i_pos = 0;
  424.             i_frame_num = -1;
  425.             i_seq = 1;
  426.             i_hdr &= ~0x3f;
  427.         }
  428.         else if( i_type == 3 )
  429.         {
  430.             i_len = RLength( &p_data, &i_data );
  431.             i_pos = RLength( &p_data, &i_data );
  432.             i_frame_num = R8( &p_data, &i_data );
  433.             i_seq = 1;
  434.             i_hdr &= ~0x3f;
  435.         }
  436.         else
  437.         {
  438.             assert( i_type == 0 || i_type == 2 );
  439.             i_seq = R8( &p_data, &i_data );
  440.             i_len = RLength( &p_data, &i_data );
  441.             i_pos = RLength( &p_data, &i_data );
  442.             i_frame_num = R8( &p_data, &i_data );
  443.         }
  444.         if( (i_seq & 0x7f) == 1 || tk->i_frame_num != i_frame_num )
  445.         {
  446.             tk->i_frame_slice = 0;
  447.             tk->i_frame_slice_count = 2 * (i_hdr & 0x3f) + 1;
  448.             tk->i_frame_pos = 2*4 * tk->i_frame_slice_count + 1;
  449.             tk->i_frame_size = i_len + 2*4 * tk->i_frame_slice_count + 1;
  450.             tk->i_frame_num = i_frame_num;
  451.             if( tk->p_frame )
  452.                 block_Release( tk->p_frame );
  453.             tk->p_frame = block_New( p_demux, tk->i_frame_size );
  454.             if( !tk->p_frame )
  455.             {
  456.                 tk->i_frame_size = 0;
  457.                 return;
  458.             }
  459.             tk->p_frame->i_dts = i_dts;
  460.             tk->p_frame->i_pts = 0;
  461.             if( i_flags & 0x02 )
  462.                 tk->p_frame->i_flags |= BLOCK_FLAG_TYPE_I;
  463.             i_dts = 0;
  464.         }
  465.         int i_frame_data;
  466.         if( i_type == 3 )
  467.         {
  468.             i_frame_data = i_len;
  469.         }
  470.         else
  471.         {
  472.             i_frame_data = i_data;
  473.             if( i_type == 2 && i_frame_data > i_pos )
  474.                 i_frame_data = i_pos;
  475.         }
  476.         if( i_frame_data > i_data )
  477.             break;
  478.         /* */
  479.         tk->i_frame_slice++;
  480.         if( tk->i_frame_slice > tk->i_frame_slice_count || !tk->p_frame )
  481.             break;
  482.         /* */
  483.         SetDWLE( &tk->p_frame->p_buffer[2*4*(tk->i_frame_slice-1) + 1 + 0], 1 );
  484.         SetDWLE( &tk->p_frame->p_buffer[2*4*(tk->i_frame_slice-1) + 1 + 4], tk->i_frame_pos - (2*4 * tk->i_frame_slice_count + 1) );
  485.         if( tk->i_frame_pos + i_frame_data > tk->i_frame_size )
  486.             break;
  487.         memcpy( &tk->p_frame->p_buffer[tk->i_frame_pos], p_data, i_frame_data );
  488.         RVoid( &p_data, &i_data, i_frame_data );
  489.         tk->i_frame_pos += i_frame_data;
  490.         if( i_type != 0 || tk->i_frame_pos >= tk->i_frame_size )
  491.         {
  492.             /* Fix the buffer once the real number of slice is known */
  493.             tk->p_frame->p_buffer[0] = tk->i_frame_slice - 1;
  494.             tk->p_frame->i_buffer = tk->i_frame_pos - 2*4*( tk->i_frame_slice_count - tk->i_frame_slice );
  495.             memmove( &tk->p_frame->p_buffer[1+2*4*tk->i_frame_slice      ],
  496.                      &tk->p_frame->p_buffer[1+2*4*tk->i_frame_slice_count],
  497.                      tk->i_frame_pos - (2*4*tk->i_frame_slice_count + 1) );
  498.             /* Send it */
  499.             CheckPcr( p_demux, tk, tk->p_frame->i_dts );
  500.             es_out_Send( p_demux->out, tk->p_es, tk->p_frame );
  501.             tk->i_frame_size = 0;
  502.             tk->p_frame = NULL;
  503.         }
  504.     }
  505. }
  506. static void DemuxAudioMethod1( demux_t *p_demux, real_track_t *tk, mtime_t i_pts, unsigned int i_flags )
  507. {
  508.     demux_sys_t *p_sys = p_demux->p_sys;
  509.     uint8_t *p_buf = p_sys->buffer;
  510.     /* Sanity check */
  511.     if( (i_flags & 2) || p_sys->b_seek )
  512.     {
  513.         tk->i_subpacket = 0;
  514.         tk->i_out_subpacket = 0;
  515.         p_sys->b_seek = false;
  516.     }
  517.     if( tk->fmt.i_codec == VLC_FOURCC( 'c', 'o', 'o', 'k' ) ||
  518.         tk->fmt.i_codec == VLC_FOURCC( 'a', 't', 'r', 'c' ) ||
  519.         tk->fmt.i_codec == VLC_FOURCC( 's', 'i', 'p', 'r' ) )
  520.     {
  521.         const int i_num = tk->i_frame_size / tk->i_subpacket_size;
  522.         const int y = tk->i_subpacket / ( tk->i_frame_size / tk->i_subpacket_size );
  523.         for( int i = 0; i < i_num; i++ )
  524.         {
  525.             block_t *p_block = block_New( p_demux, tk->i_subpacket_size );
  526.             if( !p_block )
  527.                 return;
  528.             if( &p_buf[tk->i_subpacket_size] > &p_sys->buffer[p_sys->i_buffer] )
  529.                 return;
  530.             memcpy( p_block->p_buffer, p_buf, tk->i_subpacket_size );
  531.             p_block->i_dts =
  532.             p_block->i_pts = 0;
  533.             p_buf += tk->i_subpacket_size;
  534.             int i_index = tk->i_subpacket_h * i +
  535.                           ((tk->i_subpacket_h + 1) / 2) * (y&1) + (y>>1);
  536.             if( tk->p_subpackets[i_index] != NULL )
  537.             {
  538.                 msg_Dbg(p_demux, "p_subpackets[ %d ] not null!",  i_index );
  539.                 block_Release( tk->p_subpackets[i_index] );
  540.             }
  541.             tk->p_subpackets[i_index] = p_block;
  542.             if( tk->i_subpacket == 0 )
  543.                 tk->p_subpackets_timecode[0] = i_pts;
  544.             tk->i_subpacket++;
  545.         }
  546.     }
  547.     else
  548.     {
  549.         const int y = tk->i_subpacket / (tk->i_subpacket_h / 2);
  550.         assert( tk->fmt.i_codec == VLC_FOURCC( '2', '8', '_', '8' ) );
  551.         for( int i = 0; i < tk->i_subpacket_h / 2; i++ )
  552.         {
  553.             block_t *p_block = block_New( p_demux, tk->i_coded_frame_size);
  554.             if( !p_block )
  555.                 return;
  556.             if( &p_buf[tk->i_coded_frame_size] > &p_sys->buffer[p_sys->i_buffer] )
  557.                 return;
  558.             int i_index = (i * 2 * tk->i_frame_size / tk->i_coded_frame_size) + y;
  559.             memcpy( p_block->p_buffer, p_buf, tk->i_coded_frame_size );
  560.             p_block->i_dts =
  561.             p_block->i_pts = i_index == 0 ? i_pts : 0;
  562.             p_buf += tk->i_coded_frame_size;
  563.             if( tk->p_subpackets[i_index] != NULL )
  564.             {
  565.                 msg_Dbg(p_demux, "p_subpackets[ %d ] not null!",  i_index );
  566.                 block_Release( tk->p_subpackets[i_index] );
  567.             }
  568.             tk->p_subpackets[i_index] = p_block;
  569.             tk->i_subpacket++;
  570.         }
  571.     }
  572.     while( tk->i_out_subpacket != tk->i_subpackets &&
  573.            tk->p_subpackets[tk->i_out_subpacket] )
  574.     {
  575.         block_t *p_block = tk->p_subpackets[tk->i_out_subpacket];
  576.         tk->p_subpackets[tk->i_out_subpacket] = NULL;
  577.         if( tk->p_subpackets_timecode[tk->i_out_subpacket] )
  578.         {
  579.             p_block->i_dts =
  580.             p_block->i_pts = tk->p_subpackets_timecode[tk->i_out_subpacket];
  581.             tk->p_subpackets_timecode[tk->i_out_subpacket] = 0;
  582.         }
  583.         tk->i_out_subpacket++;
  584.         CheckPcr( p_demux, tk, p_block->i_pts );
  585.         es_out_Send( p_demux->out, tk->p_es, p_block );
  586.     }
  587.     if( tk->i_subpacket == tk->i_subpackets &&
  588.         tk->i_out_subpacket != tk->i_subpackets )
  589.     {
  590.         msg_Warn( p_demux, "i_subpacket != i_out_subpacket, "
  591.                   "this shouldn't happen" );
  592.     }
  593.     if( tk->i_subpacket == tk->i_subpackets )
  594.     {
  595.         tk->i_subpacket = 0;
  596.         tk->i_out_subpacket = 0;
  597.     }
  598. }
  599. static void DemuxAudioMethod2( demux_t *p_demux, real_track_t *tk, mtime_t i_pts )
  600. {
  601.     demux_sys_t *p_sys = p_demux->p_sys;
  602.     if( p_sys->i_buffer < 2 )
  603.         return;
  604.     int i_sub = (p_sys->buffer[1] >> 4)&0x0f;
  605.     if( p_sys->i_buffer < 2+2*i_sub )
  606.         return;
  607.     uint8_t *p_sub = &p_sys->buffer[2+2*i_sub];
  608.     for( int i = 0; i < i_sub; i++ )
  609.     {
  610.         const int i_sub_size = GetWBE( &p_sys->buffer[2+i*2] );
  611.         block_t *p_block = block_New( p_demux, i_sub_size );
  612.         if( !p_block )
  613.             break;
  614.         if( &p_sub[i_sub_size] > &p_sys->buffer[p_sys->i_buffer] )
  615.             break;
  616.         memcpy( p_block->p_buffer, p_sub, i_sub_size );
  617.         p_sub += i_sub_size;
  618.         p_block->i_dts =
  619.         p_block->i_pts = ( i == 0 ? i_pts : 0 );
  620.         CheckPcr( p_demux, tk, p_block->i_pts );
  621.         es_out_Send( p_demux->out, tk->p_es, p_block );
  622.     }
  623. }
  624. static void DemuxAudioMethod3( demux_t *p_demux, real_track_t *tk, mtime_t i_pts )
  625. {
  626.     demux_sys_t *p_sys = p_demux->p_sys;
  627.     if( p_sys->i_buffer <= 0 )
  628.         return;
  629.     block_t *p_block = block_New( p_demux, p_sys->i_buffer );
  630.     if( !p_block )
  631.         return;
  632.     if( tk->fmt.i_codec == VLC_FOURCC( 'a', '5', '2', ' ' ) )
  633.     {
  634.         uint8_t *p_src = p_sys->buffer;
  635.         uint8_t *p_dst = p_block->p_buffer;
  636.         /* byte swap data */
  637.         while( p_dst < &p_block->p_buffer[p_sys->i_buffer - 1])
  638.         {
  639.             *p_dst++ = p_src[1];
  640.             *p_dst++ = p_src[0];
  641.             p_src += 2;
  642.         }
  643.     }
  644.     else
  645.     {
  646.         memcpy( p_block->p_buffer, p_sys->buffer, p_sys->i_buffer );
  647.     }
  648.     p_block->i_dts =
  649.     p_block->i_pts = i_pts;
  650.     CheckPcr( p_demux, tk, p_block->i_pts );
  651.     es_out_Send( p_demux->out, tk->p_es, p_block );
  652. }
  653. static void DemuxAudio( demux_t *p_demux, real_track_t *tk, mtime_t i_pts, unsigned i_flags )
  654. {
  655.     switch( tk->fmt.i_codec )
  656.     {
  657.     case VLC_FOURCC( 'c', 'o', 'o', 'k' ):
  658.     case VLC_FOURCC( 'a', 't', 'r', 'c' ):
  659.     case VLC_FOURCC( 's', 'i', 'p', 'r' ):
  660.     case VLC_FOURCC( '2', '8', '_', '8' ):
  661.         DemuxAudioMethod1( p_demux, tk, i_pts, i_flags );
  662.         break;
  663.     case VLC_FOURCC( 'm','p','4','a' ):
  664.         DemuxAudioMethod2( p_demux, tk, i_pts );
  665.         break;
  666.     default:
  667.         DemuxAudioMethod3( p_demux, tk, i_pts );
  668.         break;
  669.     }
  670. }
  671. /*****************************************************************************
  672.  * Helpers: seek/control
  673.  *****************************************************************************/
  674. static int ControlGoToIndex( demux_t *p_demux, real_index_t *p_index )
  675. {
  676.     demux_sys_t *p_sys = p_demux->p_sys;
  677.     p_sys->b_seek = true;
  678.     p_sys->i_pcr = INT64_C(1000) * p_index->i_time_offset;
  679.     for( int i = 0; i < p_sys->i_track; i++ )
  680.         p_sys->track[i]->i_last_dts = 0;
  681.     return stream_Seek( p_demux->s, p_index->i_file_offset );
  682. }
  683. static int ControlSeekTime( demux_t *p_demux, mtime_t i_time )
  684. {
  685.     demux_sys_t *p_sys = p_demux->p_sys;
  686.     real_index_t *p_index = p_sys->p_index;
  687.     while( p_index->i_file_offset != 0 )
  688.     {
  689.         if( p_index->i_time_offset * INT64_C(1000) > i_time )
  690.         {
  691.             if( p_index != p_sys->p_index )
  692.                 p_index--;
  693.             break;
  694.         }
  695.         p_index++;
  696.     }
  697.     if( p_index->i_file_offset == 0 )
  698.         return VLC_EGENERIC;
  699.     return ControlGoToIndex( p_demux, p_index );
  700. }
  701. static int ControlSeekByte( demux_t *p_demux, int64_t i_bytes )
  702. {
  703.     demux_sys_t *p_sys = p_demux->p_sys;
  704.     real_index_t *p_index = p_sys->p_index;
  705.     while( p_index->i_file_offset != 0 )
  706.     {
  707.         if( p_index->i_file_offset > i_bytes )
  708.         {
  709.             if( p_index != p_sys->p_index )
  710.                 p_index--;
  711.             break;
  712.         }
  713.         p_index++;
  714.     }
  715.     if( p_index->i_file_offset == 0 )
  716.         return VLC_EGENERIC;
  717.     return ControlGoToIndex( p_demux, p_index );
  718. }
  719. /*****************************************************************************
  720.  * Helpers: header reading
  721.  *****************************************************************************/
  722. /**
  723.  * This function will read a pascal string with size stored in 2 bytes from
  724.  * a stream_t.
  725.  *
  726.  * FIXME what is the right charset ?
  727.  */
  728. static char *StreamReadString2( stream_t *s )
  729. {
  730.     uint8_t p_tmp[2];
  731.     if( stream_Read( s, p_tmp, 2 ) < 2 )
  732.         return NULL;
  733.     const int i_length = GetWBE( p_tmp );
  734.     if( i_length <= 0 )
  735.         return NULL;
  736.     char *psz_string = calloc( 1, i_length + 1 );
  737.     stream_Read( s, psz_string, i_length ); /* Valid even if !psz_string */
  738.     if( psz_string )
  739.         EnsureUTF8( psz_string );
  740.     return psz_string;
  741. }
  742. /**
  743.  * This function will read a pascal string with size stored in 1 byte from a
  744.  * memory buffer.
  745.  *
  746.  * FIXME what is the right charset ?
  747.  */
  748. static char *MemoryReadString1( const uint8_t **pp_data, int *pi_data )
  749. {
  750.     const uint8_t *p_data = *pp_data;
  751.     int           i_data = *pi_data;
  752.     char *psz_string = NULL;
  753.     if( i_data < 1 )
  754.         goto exit;
  755.     int i_length = *p_data++; i_data--;
  756.     if( i_length > i_data )
  757.         i_length = i_data;
  758.     if( i_length > 0 )
  759.     {
  760.         psz_string = strndup( (const char*)p_data, i_length );
  761.         if( psz_string )
  762.             EnsureUTF8( psz_string );
  763.         p_data += i_length;
  764.         i_data -= i_length;
  765.     }
  766. exit:
  767.     *pp_data = p_data;
  768.     *pi_data = i_data;
  769.     return psz_string;
  770. }
  771. /**
  772.  * This function parses(skip) the .RMF identification chunk.
  773.  */
  774. static int HeaderRMF( demux_t *p_demux )
  775. {
  776.     uint8_t p_buffer[8];
  777.     if( stream_Read( p_demux->s, p_buffer, 8 ) < 8 )
  778.         return VLC_EGENERIC;
  779.     msg_Dbg( p_demux, "    - file version=0x%x num headers=%d",
  780.              GetDWBE( &p_buffer[0] ), GetDWBE( &p_buffer[4] ) );
  781.     return VLC_SUCCESS;
  782. }
  783. /**
  784.  * This function parses the PROP properties chunk.
  785.  */
  786. static int HeaderPROP( demux_t *p_demux )
  787. {
  788.     demux_sys_t *p_sys = p_demux->p_sys;
  789.     uint8_t p_buffer[40];
  790.     int i_flags;
  791.     if( stream_Read( p_demux->s, p_buffer, 40 ) < 40 )
  792.         return VLC_EGENERIC;
  793.     msg_Dbg( p_demux, "    - max bitrate=%d avg bitrate=%d",
  794.              GetDWBE(&p_buffer[0]), GetDWBE(&p_buffer[4]) );
  795.     msg_Dbg( p_demux, "    - max packet size=%d avg bitrate=%d",
  796.              GetDWBE(&p_buffer[8]), GetDWBE(&p_buffer[12]) );
  797.     msg_Dbg( p_demux, "    - packets count=%d", GetDWBE(&p_buffer[16]) );
  798.     msg_Dbg( p_demux, "    - duration=%d ms", GetDWBE(&p_buffer[20]) );
  799.     msg_Dbg( p_demux, "    - preroll=%d ms", GetDWBE(&p_buffer[24]) );
  800.     msg_Dbg( p_demux, "    - index offset=%d", GetDWBE(&p_buffer[28]) );
  801.     msg_Dbg( p_demux, "    - data offset=%d", GetDWBE(&p_buffer[32]) );
  802.     msg_Dbg( p_demux, "    - num streams=%d", GetWBE(&p_buffer[36]) );
  803.     /* set the duration for export in control */
  804.     p_sys->i_our_duration = GetDWBE(&p_buffer[20]);
  805.     p_sys->i_index_offset = GetDWBE(&p_buffer[28]);
  806.     i_flags = GetWBE(&p_buffer[38]);
  807.     msg_Dbg( p_demux, "    - flags=0x%x %s%s%s",
  808.              i_flags,
  809.              i_flags&0x0001 ? "PN_SAVE_ENABLED " : "",
  810.              i_flags&0x0002 ? "PN_PERFECT_PLAY_ENABLED " : "",
  811.              i_flags&0x0004 ? "PN_LIVE_BROADCAST" : "" );
  812.     return VLC_SUCCESS;
  813. }
  814. /**
  815.  * This functions parses the CONT commentairs chunk.
  816.  */
  817. static int HeaderCONT( demux_t *p_demux )
  818. {
  819.     demux_sys_t *p_sys = p_demux->p_sys;
  820.     /* */
  821.     p_sys->psz_title = StreamReadString2( p_demux->s );
  822.     if( p_sys->psz_title )
  823.         msg_Dbg( p_demux, "    - title=`%s'", p_sys->psz_title );
  824.     /* */
  825.     p_sys->psz_artist = StreamReadString2( p_demux->s );
  826.     if( p_sys->psz_artist )
  827.         msg_Dbg( p_demux, "    - artist=`%s'", p_sys->psz_artist );
  828.     /* */
  829.     p_sys->psz_copyright = StreamReadString2( p_demux->s );
  830.     if( p_sys->psz_copyright )
  831.         msg_Dbg( p_demux, "    - copyright=`%s'", p_sys->psz_copyright );
  832.     /* */
  833.     p_sys->psz_description = StreamReadString2( p_demux->s );
  834.     if( p_sys->psz_description )
  835.         msg_Dbg( p_demux, "    - comment=`%s'", p_sys->psz_description );
  836.     return VLC_SUCCESS;
  837. }
  838. /**
  839.  * This function parses the MDPR (Media properties) chunk.
  840.  */
  841. static int HeaderMDPR( demux_t *p_demux )
  842. {
  843.     uint8_t p_buffer[30];
  844.     if( stream_Read( p_demux->s, p_buffer, 30 ) < 30 )
  845.         return VLC_EGENERIC;
  846.     const int i_num = GetWBE( &p_buffer[0] );
  847.     msg_Dbg( p_demux, "    - id=0x%x", i_num );
  848.     msg_Dbg( p_demux, "    - max bitrate=%d avg bitrate=%d",
  849.              GetDWBE(&p_buffer[2]), GetDWBE(&p_buffer[6]) );
  850.     msg_Dbg( p_demux, "    - max packet size=%d avg packet size=%d",
  851.              GetDWBE(&p_buffer[10]), GetDWBE(&p_buffer[14]) );
  852.     msg_Dbg( p_demux, "    - start time=%d", GetDWBE(&p_buffer[18]) );
  853.     msg_Dbg( p_demux, "    - preroll=%d", GetDWBE(&p_buffer[22]) );
  854.     msg_Dbg( p_demux, "    - duration=%d", GetDWBE(&p_buffer[26]) );
  855.     /* */
  856.     const uint8_t *p_peek;
  857.     int i_peek_org = stream_Peek( p_demux->s, &p_peek, 2 * 256 );
  858.     int i_peek = i_peek_org;
  859.     if( i_peek <= 0 )
  860.         return VLC_EGENERIC;
  861.     char *psz_name = MemoryReadString1( &p_peek, &i_peek );
  862.     if( psz_name )
  863.     {
  864.         msg_Dbg( p_demux, "    - name=`%s'", psz_name );
  865.         free( psz_name );
  866.     }
  867.     char *psz_mime = MemoryReadString1( &p_peek, &i_peek );
  868.     if( psz_mime )
  869.     {
  870.         msg_Dbg( p_demux, "    - mime=`%s'", psz_mime );
  871.         free( psz_mime );
  872.     }
  873.     const int i_skip = i_peek_org - i_peek;
  874.     if( i_skip > 0 && stream_Read( p_demux->s, NULL, i_skip ) < i_skip )
  875.         return VLC_EGENERIC;
  876.     /* */
  877.     if( stream_Read( p_demux->s, p_buffer, 4 ) < 4 )
  878.         return VLC_EGENERIC;
  879.     const uint32_t i_size = GetDWBE( p_buffer );
  880.     if( i_size > 0 )
  881.     {
  882.         CodecParse( p_demux, i_size, i_num );
  883.         if( stream_Read( p_demux->s, NULL, i_size ) < i_size )
  884.             return VLC_EGENERIC;
  885.     }
  886.     return VLC_SUCCESS;
  887. }
  888. /**
  889.  * This function parses DATA chunk (it contains the actual movie data).
  890.  */
  891. static int HeaderDATA( demux_t *p_demux, uint32_t i_size )
  892. {
  893.     demux_sys_t *p_sys = p_demux->p_sys;
  894.     uint8_t p_buffer[8];
  895.     if( stream_Read( p_demux->s, p_buffer, 8 ) < 8 )
  896.         return VLC_EGENERIC;
  897.     p_sys->i_data_offset    = stream_Tell( p_demux->s ) - 10;
  898.     p_sys->i_data_size      = i_size;
  899.     p_sys->i_data_packets_count = GetDWBE( p_buffer );
  900.     p_sys->i_data_packets   = 0;
  901.     p_sys->i_data_offset_next = GetDWBE( &p_buffer[4] );
  902.     msg_Dbg( p_demux, "    - packets count=%d next=%u",
  903.              p_sys->i_data_packets_count,
  904.              (unsigned int)p_sys->i_data_offset_next );
  905.     return VLC_SUCCESS;
  906. }
  907. /**
  908.  * This function parses the INDX (movie index chunk).
  909.  * It is optional but seeking without it is ... hard.
  910.  */
  911. static void HeaderINDX( demux_t *p_demux )
  912. {
  913.     demux_sys_t *p_sys = p_demux->p_sys;
  914.     uint8_t       buffer[20];
  915.     uint32_t      i_index_count;
  916.     if( p_sys->i_index_offset == 0 )
  917.         return;
  918.     stream_Seek( p_demux->s, p_sys->i_index_offset );
  919.     if( stream_Read( p_demux->s, buffer, 20 ) < 20 )
  920.         return ;
  921.     const uint32_t i_id = VLC_FOURCC( buffer[0], buffer[1], buffer[2], buffer[3] );
  922.     const uint32_t i_size      = GetDWBE( &buffer[4] );
  923.     int i_version   = GetWBE( &buffer[8] );
  924.     msg_Dbg( p_demux, "Real index %4.4s size=%d version=%d",
  925.                  (char*)&i_id, i_size, i_version );
  926.     if( (i_size < 20) && (i_id != VLC_FOURCC('I','N','D','X')) )
  927.         return;
  928.     i_index_count = GetDWBE( &buffer[10] );
  929.     msg_Dbg( p_demux, "Real Index : num : %d ", i_index_count );
  930.     if( i_index_count >= ( 0xffffffff / sizeof(*p_sys->p_index) ) )
  931.         return;
  932.     if( GetDWBE( &buffer[16] ) > 0 )
  933.         msg_Dbg( p_demux, "Real Index: Does next index exist? %d ",
  934.                         GetDWBE( &buffer[16] )  );
  935.     /* One extra entry is allocated (that MUST be set to 0) to identify the
  936.      * end of the index.
  937.      * TODO add a clean entry count (easier to build index on the fly) */
  938.     p_sys->p_index = calloc( i_index_count + 1, sizeof(*p_sys->p_index) );
  939.     if( !p_sys->p_index )
  940.         return;
  941.     for( unsigned int i = 0; i < i_index_count; i++ )
  942.     {
  943.         uint8_t p_entry[14];
  944.         if( stream_Read( p_demux->s, p_entry, 14 ) < 14 )
  945.             return ;
  946.         if( GetWBE( &p_entry[0] ) != 0 )
  947.         {
  948.             msg_Dbg( p_demux, "Real Index: invaild version of index entry %d ",
  949.                               GetWBE( &p_entry[0] ) );
  950.             return;
  951.         }
  952.         real_index_t *p_idx = &p_sys->p_index[i];
  953.         
  954.         p_idx->i_time_offset = GetDWBE( &p_entry[2] );
  955.         p_idx->i_file_offset = GetDWBE( &p_entry[6] );
  956.         p_idx->i_frame_index = GetDWBE( &p_entry[10] );
  957. #if 0
  958.         msg_Dbg( p_demux,
  959.                  "Real Index: time %"PRIu32" file %"PRIu32" frame %"PRIu32,
  960.                  p_idx->i_time_offset,
  961.                  p_idx->i_file_offset,
  962.                  p_idx->i_frame_index );
  963. #endif
  964.     }
  965. }
  966. /**
  967.  * This function parses the complete RM headers and move the
  968.  * stream pointer to the data to be read.
  969.  */
  970. static int HeaderRead( demux_t *p_demux )
  971. {
  972.     demux_sys_t *p_sys = p_demux->p_sys;
  973.     for( ;; )
  974.     {
  975.         const int64_t i_stream_position = stream_Tell( p_demux->s );
  976.         uint8_t header[100];    /* FIXME */
  977.         /* Read the header */
  978.         if( stream_Read( p_demux->s, header, 10 ) < 10 )
  979.             return VLC_EGENERIC;
  980.         const uint32_t i_id = VLC_FOURCC( header[0], header[1],
  981.                                           header[2], header[3] );
  982.         const uint32_t i_size = GetDWBE( &header[4] );
  983.         const int i_version = GetWBE( &header[8] );
  984.         msg_Dbg( p_demux, "object %4.4s size=%d version=%d",
  985.                  (char*)&i_id, i_size, i_version );
  986.         /* */
  987.         if( i_size < 10 && i_id != VLC_FOURCC('D','A','T','A') )
  988.         {
  989.             msg_Dbg( p_demux, "invalid size for object %4.4s", (char*)&i_id );
  990.             return VLC_EGENERIC;
  991.         }
  992.         int i_ret;
  993.         switch( i_id )
  994.         {
  995.         case VLC_FOURCC('.','R','M','F'):
  996.             i_ret = HeaderRMF( p_demux );
  997.             break;
  998.         case VLC_FOURCC('P','R','O','P'):
  999.             i_ret = HeaderPROP( p_demux );
  1000.             break;
  1001.         case VLC_FOURCC('C','O','N','T'):
  1002.             i_ret = HeaderCONT( p_demux );
  1003.             break;
  1004.         case VLC_FOURCC('M','D','P','R'):
  1005.             i_ret = HeaderMDPR( p_demux );
  1006.             break;
  1007.         case VLC_FOURCC('D','A','T','A'):
  1008.             i_ret = HeaderDATA( p_demux, i_size );
  1009.             break;
  1010.         default:
  1011.             /* unknow header */
  1012.             msg_Dbg( p_demux, "unknown chunk" );
  1013.             i_ret = VLC_SUCCESS;
  1014.             break;
  1015.         }
  1016.         if( i_ret )
  1017.             return i_ret;
  1018.         if( i_id == VLC_FOURCC('D','A','T','A') ) /* In this case, parsing is finished */
  1019.             break;
  1020.         /* Skip unread data */
  1021.         const int64_t i_stream_current = stream_Tell( p_demux->s );
  1022.         const int64_t i_stream_skip = (i_stream_position + i_size) - i_stream_current;
  1023.         if( i_stream_skip > 0 )
  1024.         {
  1025.             if( stream_Read( p_demux->s, NULL, i_stream_skip ) != i_stream_skip )
  1026.                 return VLC_EGENERIC;
  1027.         }
  1028.         else if( i_stream_skip < 0 )
  1029.         {
  1030.             return VLC_EGENERIC;
  1031.         }
  1032.     }
  1033.     /* read index if possible */
  1034.     if( p_sys->i_index_offset > 0 )
  1035.     {
  1036.         const int64_t i_position = stream_Tell( p_demux->s );
  1037.         HeaderINDX( p_demux );
  1038.         if( stream_Seek( p_demux->s, i_position ) )
  1039.             return VLC_EGENERIC;
  1040.     }
  1041.     return VLC_SUCCESS;
  1042. }
  1043. static void CodecMetaRead( demux_t *p_demux, const uint8_t **pp_data, int *pi_data )
  1044. {
  1045.     demux_sys_t *p_sys = p_demux->p_sys;
  1046.     /* Title */
  1047.     p_sys->psz_title = MemoryReadString1( pp_data, pi_data );
  1048.     if( p_sys->psz_title )
  1049.         msg_Dbg( p_demux, "    - title=`%s'", p_sys->psz_title );
  1050.     /* Authors */
  1051.     p_sys->psz_artist = MemoryReadString1( pp_data, pi_data );
  1052.     if( p_sys->psz_artist )
  1053.         msg_Dbg( p_demux, "    - artist=`%s'", p_sys->psz_artist );
  1054.     /* Copyright */
  1055.     p_sys->psz_copyright = MemoryReadString1( pp_data, pi_data );
  1056.     if( p_sys->psz_copyright )
  1057.         msg_Dbg( p_demux, "    - copyright=`%s'", p_sys->psz_copyright );
  1058.     /* Comment */
  1059.     p_sys->psz_description = MemoryReadString1( pp_data, pi_data );
  1060.     if( p_sys->psz_description )
  1061.         msg_Dbg( p_demux, "    - Comment=`%s'", p_sys->psz_description );
  1062. }
  1063. static int CodecVideoParse( demux_t *p_demux, int i_tk_id, const uint8_t *p_data, int i_data )
  1064. {
  1065.     demux_sys_t *p_sys = p_demux->p_sys;
  1066.     if( i_data < 34 )
  1067.         return VLC_EGENERIC;
  1068.     /* */
  1069.     es_format_t fmt;
  1070.     es_format_Init( &fmt, VIDEO_ES,
  1071.                     VLC_FOURCC( p_data[8], p_data[9], p_data[10], p_data[11] ) );
  1072.     fmt.video.i_width = GetWBE( &p_data[12] );
  1073.     fmt.video.i_height= GetWBE( &p_data[14] );
  1074.     fmt.video.i_frame_rate = (GetWBE( &p_data[22] ) << 16) | GetWBE( &p_data[24] );
  1075.     fmt.video.i_frame_rate_base = 1 << 16;
  1076.     fmt.i_extra = 8;
  1077.     fmt.p_extra = malloc( 8 );
  1078.     if( !fmt.p_extra )
  1079.         return VLC_ENOMEM;
  1080.     memcpy( fmt.p_extra, &p_data[26], 8 );
  1081.     //msg_Dbg( p_demux, "    - video 0x%08x 0x%08x", dw0, dw1 );
  1082.     /* */
  1083.     switch( GetDWBE( &p_data[30] ) )
  1084.     {
  1085.     case 0x10003000:
  1086.     case 0x10003001:
  1087.         fmt.i_codec = VLC_FOURCC( 'R','V','1','3' );
  1088.         break;
  1089.     case 0x20001000:
  1090.     case 0x20100001:
  1091.     case 0x20200002:
  1092.     case 0x20201002:
  1093.         fmt.i_codec = VLC_FOURCC( 'R','V','2','0' );
  1094.         break;
  1095.     case 0x30202002:
  1096.         fmt.i_codec = VLC_FOURCC( 'R','V','3','0' );
  1097.         break;
  1098.     case 0x40000000:
  1099.         fmt.i_codec = VLC_FOURCC( 'R','V','4','0' );
  1100.         break;
  1101.     }
  1102.     msg_Dbg( p_demux, "    - video %4.4s %dx%d - %8.8x",
  1103.              (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height, GetDWBE( &p_data[30] ) );
  1104.     real_track_t *tk = malloc( sizeof( *tk ) );
  1105.     if( !tk )
  1106.     {
  1107.         es_format_Clean( &fmt );
  1108.         return VLC_ENOMEM;
  1109.     }
  1110.     tk->i_out_subpacket = 0;
  1111.     tk->i_subpacket = 0;
  1112.     tk->i_subpackets = 0;
  1113.     tk->p_subpackets = NULL;
  1114.     tk->p_subpackets_timecode = NULL;
  1115.     tk->i_id = i_tk_id;
  1116.     tk->fmt = fmt;
  1117.     tk->i_frame_num = -1;
  1118.     tk->i_frame_size = 0;
  1119.     tk->p_frame = NULL;
  1120.     tk->i_last_dts = 0;
  1121.     tk->p_es = es_out_Add( p_demux->out, &fmt );
  1122.     TAB_APPEND( p_sys->i_track, p_sys->track, tk );
  1123.     return VLC_SUCCESS;
  1124. }
  1125. static int CodecAudioParse( demux_t *p_demux, int i_tk_id, const uint8_t *p_data, int i_data )
  1126. {
  1127.     demux_sys_t *p_sys = p_demux->p_sys;
  1128.     es_format_t fmt;
  1129.     if( i_data < 6 )
  1130.         return VLC_EGENERIC;
  1131.     
  1132.     int i_flavor = 0;
  1133.     int i_coded_frame_size = 0;
  1134.     int i_subpacket_h = 0;
  1135.     int i_frame_size = 0;
  1136.     int i_subpacket_size = 0;
  1137.     char p_genr[4];
  1138.     int i_version = GetWBE( &p_data[4] );
  1139.     int i_extra_codec = 0;
  1140.     msg_Dbg( p_demux, "    - audio version=%d", i_version );
  1141.     es_format_Init( &fmt, AUDIO_ES, 0 );
  1142.     RVoid( &p_data, &i_data, 6 );                         /* 4 + version */
  1143.     if( i_version == 3 ) /* RMF version 3 or .ra version 3 */
  1144.     {
  1145.         RVoid( &p_data, &i_data, 2 + 10 + 4 );
  1146.         /* Meta Datas */
  1147.         CodecMetaRead( p_demux, &p_data, &i_data );
  1148.         RVoid( &p_data, &i_data, 1 + 1 );
  1149.         if( i_data >= 4 )
  1150.             memcpy( &fmt.i_codec, p_data, 4 );
  1151.         RVoid( &p_data, &i_data, 4 );
  1152.         fmt.audio.i_channels = 1;      /* This is always the case in rm3 */
  1153.         fmt.audio.i_rate = 8000;
  1154.         msg_Dbg( p_demux, "    - audio codec=%4.4s channels=%d rate=%dHz",
  1155.              (char*)&fmt.i_codec, fmt.audio.i_channels, fmt.audio.i_rate );
  1156.     }
  1157.     else  /* RMF version 4/5 or .ra version 4 */
  1158.     {
  1159.         RVoid( &p_data, &i_data, 2 + 4 + 4 + 2 + 4 );
  1160.         i_flavor = R16( &p_data, &i_data );
  1161.         i_coded_frame_size = R32( &p_data, &i_data );
  1162.         RVoid( &p_data, &i_data, 4 + 4 + 4 );
  1163.         i_subpacket_h = R16( &p_data, &i_data );
  1164.         i_frame_size = R16( &p_data, &i_data );
  1165.         i_subpacket_size = R16( &p_data, &i_data );
  1166.         if( !i_frame_size || !i_coded_frame_size )
  1167.             return VLC_EGENERIC;
  1168.         RVoid( &p_data, &i_data, 2 + (i_version == 5 ? 6 : 0 ) );
  1169.         fmt.audio.i_rate = R16( &p_data, &i_data );
  1170.         RVoid( &p_data, &i_data, 2 );
  1171.         fmt.audio.i_bitspersample = R16( &p_data, &i_data );
  1172.         fmt.audio.i_channels = R16( &p_data, &i_data );
  1173.         fmt.audio.i_blockalign = i_frame_size;
  1174.         if( i_version == 5 )
  1175.         {
  1176.             if( i_data >= 8 )
  1177.             {
  1178.                 memcpy( p_genr,       &p_data[0], 4 );
  1179.                 memcpy( &fmt.i_codec, &p_data[4], 4 );
  1180.             }
  1181.             RVoid( &p_data, &i_data, 8 );
  1182.         }
  1183.         else /* version 4 */
  1184.         {
  1185.             if( i_data > 0 )
  1186.                 RVoid( &p_data, &i_data, 1 + *p_data );
  1187.             if( i_data >= 1 + 4 )
  1188.                 memcpy( &fmt.i_codec, &p_data[1], 4 );
  1189.             if( i_data > 0 )
  1190.                 RVoid( &p_data, &i_data, 1 + *p_data );
  1191.         }
  1192.         msg_Dbg( p_demux, "    - audio codec=%4.4s channels=%d rate=%dHz",
  1193.              (char*)&fmt.i_codec, fmt.audio.i_channels, fmt.audio.i_rate );
  1194.         RVoid( &p_data, &i_data, 3 );
  1195.         if( p_sys->b_real_audio )
  1196.         {
  1197.             CodecMetaRead( p_demux, &p_data, &i_data );
  1198.         }
  1199.         else
  1200.         {
  1201.             if( i_version == 5 )
  1202.                 RVoid( &p_data, &i_data, 1 );
  1203.             i_extra_codec = R32( &p_data, &i_data );
  1204.         }
  1205.     }
  1206.     switch( fmt.i_codec )
  1207.     {
  1208.     case VLC_FOURCC('l','p','c','J'):
  1209.         fmt.i_codec = VLC_FOURCC( '1','4','_','4' );
  1210.     case VLC_FOURCC('1','4','_','4'):
  1211.         fmt.audio.i_blockalign = 0x14 ;
  1212.         break;
  1213.     case VLC_FOURCC('2','8','_','8'):
  1214.         fmt.audio.i_blockalign = i_coded_frame_size;
  1215.         break;
  1216.     case VLC_FOURCC( 'd','n','e','t' ):
  1217.         fmt.i_codec = VLC_FOURCC( 'a','5','2',' ' );
  1218.         break;
  1219.     case VLC_FOURCC( 'r','a','a','c' ):
  1220.     case VLC_FOURCC( 'r','a','c','p' ):
  1221.         fmt.i_codec = VLC_FOURCC( 'm','p','4','a' );
  1222.         if( i_extra_codec > 0 )
  1223.         {
  1224.             i_extra_codec--;
  1225.             RVoid( &p_data, &i_data, 1 );
  1226.         }
  1227.         if( i_extra_codec > 0 )
  1228.         {
  1229.             fmt.p_extra = malloc( i_extra_codec );
  1230.             if( !fmt.p_extra || i_extra_codec > i_data )
  1231.                 return VLC_ENOMEM;
  1232.             fmt.i_extra = i_extra_codec;
  1233.             memcpy( fmt.p_extra, p_data, fmt.i_extra );
  1234.         }
  1235.         break;
  1236.     case VLC_FOURCC('s','i','p','r'):
  1237.         fmt.audio.i_flavor = i_flavor;
  1238.     case VLC_FOURCC('c','o','o','k'):
  1239.     case VLC_FOURCC('a','t','r','c'):
  1240.         if( i_subpacket_size <= 0 ||
  1241.             i_frame_size / i_subpacket_size <= 0 )
  1242.         {
  1243.             es_format_Clean( &fmt );
  1244.             return VLC_EGENERIC;
  1245.         }
  1246.         if( !memcmp( p_genr, "genr", 4 ) )
  1247.             fmt.audio.i_blockalign = i_subpacket_size;
  1248.         else
  1249.             fmt.audio.i_blockalign = i_coded_frame_size;
  1250.         if( i_extra_codec > 0 )
  1251.         {
  1252.             fmt.p_extra = malloc( i_extra_codec );
  1253.             if( !fmt.p_extra || i_extra_codec > i_data )
  1254.                 return VLC_ENOMEM;
  1255.             fmt.i_extra = i_extra_codec;
  1256.             memcpy( fmt.p_extra, p_data, fmt.i_extra );
  1257.         }
  1258.         break;
  1259.     case VLC_FOURCC('r','a','l','f'):
  1260.         msg_Dbg( p_demux, "    - audio codec not supported=%4.4s",
  1261.                  (char*)&fmt.i_codec );
  1262.         break;
  1263.     default:
  1264.         msg_Dbg( p_demux, "    - unknown audio codec=%4.4s",
  1265.                  (char*)&fmt.i_codec );
  1266.         break;
  1267.     }
  1268.     msg_Dbg( p_demux, "        - extra data=%d", fmt.i_extra );
  1269.     /* */
  1270.     real_track_t *tk = malloc( sizeof( *tk ) );
  1271.     if( !tk )
  1272.     {
  1273.         es_format_Clean( &fmt );
  1274.         return VLC_ENOMEM;
  1275.     }
  1276.     tk->i_id = i_tk_id;
  1277.     tk->fmt = fmt;
  1278.     tk->i_frame_size = 0;
  1279.     tk->p_frame = NULL;
  1280.     tk->i_subpacket_h = i_subpacket_h;
  1281.     tk->i_subpacket_size = i_subpacket_size;
  1282.     tk->i_coded_frame_size = i_coded_frame_size;
  1283.     tk->i_frame_size = i_frame_size;
  1284.     tk->i_out_subpacket = 0;
  1285.     tk->i_subpacket = 0;
  1286.     tk->i_subpackets = 0;
  1287.     tk->p_subpackets = NULL;
  1288.     tk->p_subpackets_timecode = NULL;
  1289.     if( fmt.i_codec == VLC_FOURCC('c','o','o','k') ||
  1290.         fmt.i_codec == VLC_FOURCC('a','t','r','c') ||
  1291.         fmt.i_codec == VLC_FOURCC('s','i','p','r') )
  1292.     {
  1293.         tk->i_subpackets =
  1294.             i_subpacket_h * i_frame_size / tk->i_subpacket_size;
  1295.         tk->p_subpackets =
  1296.             calloc( tk->i_subpackets, sizeof(block_t *) );
  1297.         tk->p_subpackets_timecode =
  1298.             calloc( tk->i_subpackets , sizeof( int64_t ) );
  1299.     }
  1300.     else if( fmt.i_codec == VLC_FOURCC('2','8','_','8') )
  1301.     {
  1302.         tk->i_subpackets =
  1303.             i_subpacket_h * i_frame_size / tk->i_coded_frame_size;
  1304.         tk->p_subpackets =
  1305.             calloc( tk->i_subpackets, sizeof(block_t *) );
  1306.         tk->p_subpackets_timecode =
  1307.             calloc( tk->i_subpackets , sizeof( int64_t ) );
  1308.     }
  1309.     /* Check if the calloc went correctly */
  1310.     if( tk->i_subpacket > 0 && ( !tk->p_subpackets || !tk->p_subpackets_timecode ) )
  1311.     {
  1312.         free( tk->p_subpackets_timecode );
  1313.         free( tk->p_subpackets );
  1314.         free( tk );
  1315.         msg_Err( p_demux, "Can't alloc subpacket" );
  1316.         return VLC_EGENERIC;
  1317.     }
  1318.     tk->i_last_dts = 0;
  1319.     tk->p_es = es_out_Add( p_demux->out, &fmt );
  1320.     TAB_APPEND( p_sys->i_track, p_sys->track, tk );
  1321.     return VLC_SUCCESS;
  1322. }
  1323. static int CodecParse( demux_t *p_demux, int i_len, int i_num )
  1324. {
  1325.     const uint8_t *p_peek;
  1326.     msg_Dbg( p_demux, "    - specific data len=%d", i_len );
  1327.     if( stream_Peek( p_demux->s, &p_peek, i_len ) < i_len )
  1328.         return VLC_EGENERIC;
  1329.     if( i_len >= 8 && !memcmp( &p_peek[4], "VIDO", 4 ) )
  1330.     {
  1331.         return CodecVideoParse( p_demux, i_num, p_peek, i_len );
  1332.     }
  1333.     else if( i_len >= 4 && !memcmp( &p_peek[0], ".raxfd", 4 ) )
  1334.     {
  1335.         return CodecAudioParse( p_demux, i_num, p_peek, i_len );
  1336.     }
  1337.     return VLC_SUCCESS;
  1338. }
  1339. /*****************************************************************************
  1340.  * Helpers: memory buffer fct.
  1341.  *****************************************************************************/
  1342. static void RVoid( const uint8_t **pp_data, int *pi_data, int i_size )
  1343. {
  1344.     if( i_size > *pi_data )
  1345.         i_size = *pi_data;
  1346.     *pp_data += i_size;
  1347.     *pi_data -= i_size;
  1348. }
  1349. #define RX(name, type, size, code ) 
  1350. static type name( const uint8_t **pp_data, int *pi_data ) { 
  1351.     if( *pi_data < (size) )          
  1352.         return 0;                    
  1353.     type v = code;                   
  1354.     RVoid( pp_data, pi_data, size ); 
  1355.     return v;                        
  1356. }
  1357. RX(R8,  uint8_t, 1, **pp_data )
  1358. RX(R16, uint16_t, 2, GetWBE( *pp_data ) )
  1359. RX(R32, uint32_t, 4, GetDWBE( *pp_data ) )
  1360. static int RLength( const uint8_t **pp_data, int *pi_data )
  1361. {
  1362.     const int v0 = R16( pp_data, pi_data ) & 0x7FFF;
  1363.     if( v0 >= 0x4000 )
  1364.         return v0 - 0x4000;
  1365.     return (v0 << 16) | R16( pp_data, pi_data );
  1366. }