void MMSTUClose ( access_t * );
-static ssize_t Read( access_t *, uint8_t *, size_t );
+static block_t *Block( access_t * );
static int Seek( access_t *, int64_t );
static int Control( access_t *, int, va_list );
int i_status;
/* Set up p_access */
- p_access->pf_read = Read;
- p_access->pf_block = NULL;
+ access_InitFields( p_access );
+ p_access->pf_read = NULL;
+ p_access->pf_block = Block;
p_access->pf_control = Control;
p_access->pf_seek = Seek;
- p_access->info.i_update = 0;
- p_access->info.i_size = 0;
- p_access->info.i_pos = 0;
- p_access->info.b_eof = false;
- p_access->info.i_title = 0;
- p_access->info.i_seekpoint = 0;
+
p_access->p_sys = p_sys = calloc( 1, sizeof( access_sys_t ) );
if( !p_sys ) return VLC_ENOMEM;
/* Keep the connection alive when paused */
p_sys->p_keepalive = malloc( sizeof( mmstu_keepalive_t ) );
+ if( !p_sys->p_keepalive )
+ {
+ MMSTUClose ( p_access );
+ return VLC_ENOMEM;
+ }
p_sys->p_keepalive->p_access = p_access;
vlc_mutex_init( &p_sys->p_keepalive->lock );
vlc_cond_init( &p_sys->p_keepalive->wait );
access_sys_t *p_sys = p_access->p_sys;
bool *pb_bool;
bool b_bool;
- int *pi_int;
int64_t *pi_64;
int i_int;
- vlc_value_t val;
switch( i_query )
{
break;
/* */
- case ACCESS_GET_MTU:
- pi_int = (int*)va_arg( args, int * );
- *pi_int = 3 * p_sys->i_packet_length;
- break;
-
case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * );
- var_Get( p_access, "mms-caching", &val );
*pi_64 = (int64_t)var_GetInteger( p_access, "mms-caching" ) * INT64_C(1000);
break;
else
Seek( p_access, p_access->info.i_pos );
- vlc_mutex_lock( &p_sys->p_keepalive->lock );
- p_sys->p_keepalive->b_paused = b_bool;
- if( b_bool )
- vlc_cond_signal( &p_sys->p_keepalive->wait );
- vlc_mutex_unlock( &p_sys->p_keepalive->lock );
+ if( p_sys->p_keepalive )
+ {
+ vlc_mutex_lock( &p_sys->p_keepalive->lock );
+ p_sys->p_keepalive->b_paused = b_bool;
+ if( b_bool )
+ vlc_cond_signal( &p_sys->p_keepalive->wait );
+ vlc_mutex_unlock( &p_sys->p_keepalive->lock );
+ }
break;
case ACCESS_GET_TITLE_INFO:
i_packet = ( i_pos - p_sys->i_header ) / p_sys->i_packet_length;
i_offset = ( i_pos - p_sys->i_header ) % p_sys->i_packet_length;
}
+ if( p_sys->b_seekable && i_packet >= p_sys->i_packet_count )
+ return VLC_EGENERIC;
+
msg_Dbg( p_access, "seeking to %"PRId64 " (packet:%d)", i_pos, i_packet );
MMSStop( p_access );
}
/*****************************************************************************
- * Read:
+ * Block:
*****************************************************************************/
-static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
+static block_t *Block( access_t *p_access )
{
access_sys_t *p_sys = p_access->p_sys;
- size_t i_data;
- size_t i_copy;
if( p_access->info.b_eof )
+ return NULL;
+
+ if( p_access->info.i_pos < p_sys->i_header )
{
- return 0;
- }
+ const size_t i_copy = p_sys->i_header - p_access->info.i_pos;
- i_data = 0;
+ block_t *p_block = block_New( p_access, i_copy );
+ if( !p_block )
+ return NULL;
- /* *** now send data if needed *** */
- while( i_data < i_len )
+ memcpy( p_block->p_buffer, &p_sys->p_header[p_access->info.i_pos], i_copy );
+ p_access->info.i_pos += i_copy;
+ return p_block;
+ }
+ else if( p_sys->p_media && p_sys->i_media_used < __MAX( p_sys->i_media, p_sys->i_packet_length ) )
{
- if( p_access->info.i_pos < p_sys->i_header )
- {
- i_copy = __MIN( i_len, p_sys->i_header - p_access->info.i_pos );
- memcpy( &p_buffer[i_data], &p_sys->p_header[p_access->info.i_pos], i_copy );
- i_data += i_copy;
- p_access->info.i_pos += i_copy;
- }
- else if( p_sys->i_media_used < p_sys->i_media )
- {
- i_copy = __MIN( i_len - i_data ,
- p_sys->i_media - p_sys->i_media_used );
- memcpy( &p_buffer[i_data], &p_sys->p_media[p_sys->i_media_used], i_copy );
- i_data += i_copy;
- p_sys->i_media_used += i_copy;
- p_access->info.i_pos += i_copy;
- }
- else if( p_sys->p_media != NULL &&
- p_sys->i_media_used < p_sys->i_packet_length )
- {
- i_copy = __MIN( i_len - i_data,
- p_sys->i_packet_length - p_sys->i_media_used);
- memset( &p_buffer[i_data], 0, i_copy );
+ size_t i_copy = 0;
+ size_t i_padding = 0;
- i_data += i_copy;
- p_sys->i_media_used += i_copy;
- p_access->info.i_pos += i_copy;
- }
- else if( p_access->info.b_eof ||
- mms_HeaderMediaRead( p_access, MMS_PACKET_MEDIA ) < 0 )
- {
- break;
- }
+ if( p_sys->i_media_used < p_sys->i_media )
+ i_copy = p_sys->i_media - p_sys->i_media_used;
+ if( __MAX( p_sys->i_media, p_sys->i_media_used ) < p_sys->i_packet_length )
+ i_padding = p_sys->i_packet_length - __MAX( p_sys->i_media, p_sys->i_media_used );
+
+ block_t *p_block = block_New( p_access, i_copy + i_padding );
+ if( !p_block )
+ return NULL;
+
+ if( i_copy > 0 )
+ memcpy( &p_block->p_buffer[0], &p_sys->p_media[p_sys->i_media_used], i_copy );
+ if( i_padding > 0 )
+ memset( &p_block->p_buffer[i_copy], 0, i_padding );
+
+ p_sys->i_media_used += i_copy + i_padding;
+ p_access->info.i_pos += i_copy + i_padding;
+ return p_block;
}
- return i_data;
+ mms_HeaderMediaRead( p_access, MMS_PACKET_MEDIA );
+ return NULL;
}
/****************************************************************************
msg_Dbg( p_access,
"answer 0x06 flags:0x%8.8"PRIx32" media_length:%"PRIu32"s "
- "packet_length:%zul packet_count:%"PRId32" max_bit_rate:%d "
+ "packet_length:%u packet_count:%"PRId32" max_bit_rate:%d "
"header_size:%zu",
p_sys->i_flags_broadcast,
p_sys->i_media_length,
}
if( i_udp > 0 )
{
- ufd[nfd].fd = p_sys->i_handle_tcp;
+ ufd[nfd].fd = p_sys->i_handle_udp;
ufd[nfd].events = POLLIN;
nfd++;
}
/* We'll wait 0.5 second if nothing happens */
- timeout = 500;
+ timeout = __MIN( 500, p_sys->i_timeout );
if( i_try * timeout > p_sys->i_timeout )
{
return -1;
}
- if( !vlc_object_alive (p_access) || p_access->b_error ) return -1;
+ if( !vlc_object_alive (p_access) || p_access->b_error )
+ return -1;
//msg_Dbg( p_access, "NetFillBuffer: trying again (select)" );