typedef GUID guid_t;
#define MAX_ASF_TRACKS 128
+#define ASF_DATA_PACKET_SIZE 4096
/*****************************************************************************
* Module descriptor
p_sys->b_write_header = VLC_TRUE;
p_sys->i_track = 0;
- p_sys->i_packet_size = 4096;
+ p_sys->i_packet_size = ASF_DATA_PACKET_SIZE;
p_sys->i_packet_count= 0;
/* Generate a random fid */
case VLC_FOURCC( 'a', '5', '2', ' ' ):
tk->i_tag = WAVE_FORMAT_A52;
tk->psz_name = "A/52";
+ i_bitspersample = 0;
break;
case VLC_FOURCC( 'm', 'p', 'g', 'a' ):
#if 1
tk->psz_name = "MPEG Audio Layer 3";
tk->i_tag = WAVE_FORMAT_MPEGLAYER3;
+ i_bitspersample = 0;
i_blockalign = 1;
i_extra = 12;
break;
#else
tk->psz_name = "MPEG Audio Layer 1/2";
tk->i_tag = WAVE_FORMAT_MPEG;
+ i_bitspersample = 0;
i_blockalign = 1;
i_extra = 22;
break;
i_ci_size += 8 + 2 * strlen( p_sys->track[i].psz_name );
if( p_sys->track[i].i_cat == AUDIO_ES ) i_ci_size += 4;
else if( p_sys->track[i].i_cat == VIDEO_ES ) i_ci_size += 6;
+
+ /* Error correction data field */
+ if( p_sys->track[i].b_audio_correction ) i_size += 8;
}
/* size of the content description object */
/* size of the metadata object */
for( i = 0; i < p_sys->i_track; i++ )
{
- /* Error correction data field */
- if( p_sys->track[i].b_audio_correction ) i_size += 8;
-
if( p_sys->track[i].i_cat == VIDEO_ES )
{
i_cm_size = 26 + 2 * (16 + 2 * sizeof("AspectRatio?"));
tk = &p_sys->track[i];
bo_add_guid ( &bo, &asf_object_stream_properties_guid );
-
- if( tk->b_audio_correction ) /* Error correction data field */
- bo_addle_u64( &bo, 78 + tk->i_extra + 8 );
- else
- bo_addle_u64( &bo, 78 + tk->i_extra );
+ bo_addle_u64( &bo, 78 + tk->i_extra + (tk->b_audio_correction ? 8:0) );
if( tk->i_cat == AUDIO_ES )
{
/* add payload (header size = 17) */
i_payload = __MIN( i_data - i_pos,
p_sys->i_packet_size - p_sys->i_pk_used - 17 );
+
+ if( tk->b_audio_correction && p_sys->i_pk_frame && i_payload < i_data )
+ {
+ /* Don't know why yet but WMP doesn't like splitted WMA packets */
+ *last = asf_packet_flush( p_mux );
+ last = &(*last)->p_next;
+ continue;
+ }
+
bo_add_u8 ( &bo, !(data->i_flags & BLOCK_FLAG_TYPE_P ||
data->i_flags & BLOCK_FLAG_TYPE_B) ?
0x80 | tk->i_id : tk->i_id );