Commit 2fb0cee8 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

flac: use custom type for internal seekpoints state

parent da1ce99b
...@@ -63,6 +63,12 @@ static int Control( demux_t *, int, va_list ); ...@@ -63,6 +63,12 @@ static int Control( demux_t *, int, va_list );
static int ReadMeta( demux_t *, uint8_t **pp_streaminfo, int *pi_streaminfo ); static int ReadMeta( demux_t *, uint8_t **pp_streaminfo, int *pi_streaminfo );
typedef struct
{
mtime_t i_time_offset;
uint64_t i_byte_offset;
} flac_seekpoint_t;
struct demux_sys_t struct demux_sys_t
{ {
bool b_start; bool b_start;
...@@ -80,7 +86,7 @@ struct demux_sys_t ...@@ -80,7 +86,7 @@ struct demux_sys_t
/* */ /* */
int i_seekpoint; int i_seekpoint;
seekpoint_t **seekpoint; flac_seekpoint_t **seekpoint;
/* */ /* */
int i_attachments; int i_attachments;
...@@ -183,7 +189,7 @@ static void Close( vlc_object_t * p_this ) ...@@ -183,7 +189,7 @@ static void Close( vlc_object_t * p_this )
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
for( int i = 0; i < p_sys->i_seekpoint; i++ ) for( int i = 0; i < p_sys->i_seekpoint; i++ )
vlc_seekpoint_Delete(p_sys->seekpoint[i]); free(p_sys->seekpoint[i]);
TAB_CLEAN( p_sys->i_seekpoint, p_sys->seekpoint ); TAB_CLEAN( p_sys->i_seekpoint, p_sys->seekpoint );
for( int i = 0; i < p_sys->i_attachments; i++ ) for( int i = 0; i < p_sys->i_attachments; i++ )
...@@ -250,20 +256,20 @@ static int Demux( demux_t *p_demux ) ...@@ -250,20 +256,20 @@ static int Demux( demux_t *p_demux )
static int64_t ControlGetLength( demux_t *p_demux ) static int64_t ControlGetLength( demux_t *p_demux )
{ {
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
const int64_t i_size = stream_Size(p_demux->s) - p_sys->i_data_pos; const uint64_t i_size = stream_Size(p_demux->s) - p_sys->i_data_pos;
int64_t i_length = p_sys->i_length; int64_t i_length = p_sys->i_length;
int i; int i;
/* Try to fix length using seekpoint and current size for truncated file */ /* Try to fix length using seekpoint and current size for truncated file */
for( i = p_sys->i_seekpoint-1; i >= 0; i-- ) for( i = p_sys->i_seekpoint-1; i >= 0; i-- )
{ {
seekpoint_t *s = p_sys->seekpoint[i]; flac_seekpoint_t *s = p_sys->seekpoint[i];
if( s->i_byte_offset <= i_size ) if( s->i_byte_offset <= i_size )
{ {
if( i+1 < p_sys->i_seekpoint ) if( i+1 < p_sys->i_seekpoint )
{ {
/* Broken file */ /* Broken file */
seekpoint_t *n = p_sys->seekpoint[i+1]; flac_seekpoint_t *n = p_sys->seekpoint[i+1];
assert( n->i_byte_offset != s->i_byte_offset); /* Should be ensured by ParseSeekTable */ assert( n->i_byte_offset != s->i_byte_offset); /* Should be ensured by ParseSeekTable */
i_length = s->i_time_offset + (n->i_time_offset-s->i_time_offset) * (i_size-s->i_byte_offset) / (n->i_byte_offset-s->i_byte_offset); i_length = s->i_time_offset + (n->i_time_offset-s->i_time_offset) * (i_size-s->i_byte_offset) / (n->i_byte_offset-s->i_byte_offset);
} }
...@@ -312,7 +318,7 @@ static int ControlSetTime( demux_t *p_demux, int64_t i_time ) ...@@ -312,7 +318,7 @@ static int ControlSetTime( demux_t *p_demux, int64_t i_time )
{ {
int64_t i_delta_offset; int64_t i_delta_offset;
int64_t i_next_time; int64_t i_next_time;
int64_t i_next_offset; uint64_t i_next_offset;
uint32_t i_time_align = 1; uint32_t i_time_align = 1;
if( i+1 < p_sys->i_seekpoint ) if( i+1 < p_sys->i_seekpoint )
...@@ -328,7 +334,7 @@ static int ControlSetTime( demux_t *p_demux, int64_t i_time ) ...@@ -328,7 +334,7 @@ static int ControlSetTime( demux_t *p_demux, int64_t i_time )
i_delta_offset = 0; i_delta_offset = 0;
if ( INT64_MAX / i_delta_time < (i_next_offset - p_sys->seekpoint[i]->i_byte_offset) ) if ( INT64_MAX / i_delta_time < (int64_t)(i_next_offset - p_sys->seekpoint[i]->i_byte_offset) )
i_time_align = CLOCK_FREQ; i_time_align = CLOCK_FREQ;
if( i_next_time-p_sys->seekpoint[i]->i_time_offset > 0 ) if( i_next_time-p_sys->seekpoint[i]->i_time_offset > 0 )
...@@ -445,7 +451,7 @@ static int ReadMeta( demux_t *p_demux, uint8_t **pp_streaminfo, int *pi_streami ...@@ -445,7 +451,7 @@ static int ReadMeta( demux_t *p_demux, uint8_t **pp_streaminfo, int *pi_streami
*pp_streaminfo = NULL; *pp_streaminfo = NULL;
/* Be sure we have seekpoint 0 */ /* Be sure we have seekpoint 0 */
seekpoint_t *s = vlc_seekpoint_New(); flac_seekpoint_t *s = xmalloc( sizeof (*s) );
s->i_time_offset = 0; s->i_time_offset = 0;
s->i_byte_offset = 0; s->i_byte_offset = 0;
TAB_APPEND( p_sys->i_seekpoint, p_sys->seekpoint, s ); TAB_APPEND( p_sys->i_seekpoint, p_sys->seekpoint, s );
...@@ -541,7 +547,7 @@ static void ParseSeekTable( demux_t *p_demux, const uint8_t *p_data, int i_data, ...@@ -541,7 +547,7 @@ static void ParseSeekTable( demux_t *p_demux, const uint8_t *p_data, int i_data,
int i_sample_rate ) int i_sample_rate )
{ {
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
seekpoint_t *s; flac_seekpoint_t *s;
int i; int i;
if( i_sample_rate <= 0 ) if( i_sample_rate <= 0 )
...@@ -556,7 +562,7 @@ static void ParseSeekTable( demux_t *p_demux, const uint8_t *p_data, int i_data, ...@@ -556,7 +562,7 @@ static void ParseSeekTable( demux_t *p_demux, const uint8_t *p_data, int i_data,
if( i_sample < 0 || i_sample >= INT64_MAX ) if( i_sample < 0 || i_sample >= INT64_MAX )
continue; continue;
s = vlc_seekpoint_New(); s = xmalloc( sizeof (*s) );
s->i_time_offset = i_sample * CLOCK_FREQ / i_sample_rate; s->i_time_offset = i_sample * CLOCK_FREQ / i_sample_rate;
s->i_byte_offset = GetQWBE( &p_data[4+18*i+8] ); s->i_byte_offset = GetQWBE( &p_data[4+18*i+8] );
...@@ -566,7 +572,7 @@ static void ParseSeekTable( demux_t *p_demux, const uint8_t *p_data, int i_data, ...@@ -566,7 +572,7 @@ static void ParseSeekTable( demux_t *p_demux, const uint8_t *p_data, int i_data,
if( p_sys->seekpoint[j]->i_time_offset == s->i_time_offset || if( p_sys->seekpoint[j]->i_time_offset == s->i_time_offset ||
p_sys->seekpoint[j]->i_byte_offset == s->i_byte_offset ) p_sys->seekpoint[j]->i_byte_offset == s->i_byte_offset )
{ {
vlc_seekpoint_Delete( s ); free( s );
s = NULL; s = NULL;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment