Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Stefan Strogin
flac
Commits
cfdb07f5
Commit
cfdb07f5
authored
Sep 23, 2004
by
Josh Coalson
Browse files
create a new fskip_ahead() to unify all the forward seeking that is done
parent
9f3ac317
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/flac/encode.c
View file @
cfdb07f5
...
...
@@ -155,6 +155,7 @@ static FLAC__bool read_little_endian_uint32(FILE *f, FLAC__uint32 *val, FLAC__bo
static
FLAC__bool
read_big_endian_uint16
(
FILE
*
f
,
FLAC__uint16
*
val
,
FLAC__bool
eof_ok
,
const
char
*
fn
);
static
FLAC__bool
read_big_endian_uint32
(
FILE
*
f
,
FLAC__uint32
*
val
,
FLAC__bool
eof_ok
,
const
char
*
fn
);
static
FLAC__bool
read_sane_extended
(
FILE
*
f
,
FLAC__uint32
*
val
,
FLAC__bool
eof_ok
,
const
char
*
fn
);
static
FLAC__bool
fskip_ahead
(
FILE
*
f
,
FLAC__uint64
offset
);
/*
* public routines
...
...
@@ -264,14 +265,9 @@ flac__encode_aif(FILE *infile, long infilesize, const char *infilename, const ch
sample_rate
=
xx
;
/* skip any extra data in the COMM chunk */
FLAC__ASSERT
(
skip
<=
LONG_MAX
);
while
(
skip
>
0U
&&
fseek
(
infile
,
skip
,
SEEK_CUR
)
<
0
)
{
unsigned
int
need
=
min
(
skip
,
sizeof
ucbuffer_
);
if
(
fread
(
ucbuffer_
,
1U
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping extra COMM data
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
skip
-=
need
;
if
(
!
fskip_ahead
(
infile
,
skip
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping extra COMM data
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
/*
...
...
@@ -318,7 +314,9 @@ flac__encode_aif(FILE *infile, long infilesize, const char *infilename, const ch
}
block_size
=
xx
;
if
(
fseek
(
infile
,
offset
,
SEEK_CUR
))
{
/* skip any SSND offset bytes */
FLAC__ASSERT
(
offset
<=
LONG_MAX
);
if
(
!
fskip_ahead
(
infile
,
offset
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR: skipping offset in SSND chunk
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
...
...
@@ -341,25 +339,9 @@ flac__encode_aif(FILE *infile, long infilesize, const char *infilename, const ch
FLAC__ASSERT
(
!
options
.
common
.
sector_align
||
encoder_session
.
until
==
0
);
if
(
encoder_session
.
skip
>
0U
)
{
FLAC__uint64
remaining
=
encoder_session
.
skip
*
bytes_per_frame
;
/* do 1<<30 bytes at a time, since 1<<30 is a nice round number, and */
/* is guaranteed to be less than LONG_MAX */
while
(
remaining
>
0U
)
{
unsigned
long
skip
=
(
unsigned
long
)(
remaining
%
(
1U
<<
30
));
FLAC__ASSERT
(
skip
<=
LONG_MAX
);
while
(
skip
>
0
&&
fseek
(
infile
,
skip
,
SEEK_CUR
)
<
0
)
{
unsigned
int
need
=
min
(
skip
,
sizeof
ucbuffer_
);
if
(
fread
(
ucbuffer_
,
1U
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
skip
-=
need
;
}
remaining
-=
skip
;
if
(
!
fskip_ahead
(
infile
,
encoder_session
.
skip
*
bytes_per_frame
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
...
...
@@ -439,27 +421,10 @@ flac__encode_aif(FILE *infile, long infilesize, const char *infilename, const ch
}
if
(
trim
>
0
)
{
FLAC__uint64
remaining
=
(
unsigned
int
)
trim
*
bytes_per_frame
;
FLAC__ASSERT
(
!
options
.
common
.
sector_align
);
/* do 1<<30 bytes at a time, since 1<<30 is a nice round number, and */
/* is guaranteed to be less than LONG_MAX */
while
(
remaining
>
0U
)
{
unsigned
long
skip
=
(
unsigned
long
)(
remaining
%
(
1U
<<
30
));
FLAC__ASSERT
(
skip
<=
LONG_MAX
);
while
(
skip
>
0
&&
fseek
(
infile
,
skip
,
SEEK_CUR
)
<
0
)
{
unsigned
int
need
=
min
(
skip
,
sizeof
ucbuffer_
);
if
(
fread
(
ucbuffer_
,
1U
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
skip
-=
need
;
}
remaining
-=
skip
;
if
(
!
fskip_ahead
(
infile
,
trim
*
bytes_per_frame
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
...
...
@@ -530,13 +495,9 @@ flac__encode_aif(FILE *infile, long infilesize, const char *infilename, const ch
unsigned
long
skip
=
xx
+
(
xx
&
1U
);
FLAC__ASSERT
(
skip
<=
LONG_MAX
);
while
(
skip
>
0U
&&
fseek
(
infile
,
skip
,
SEEK_CUR
)
<
0
)
{
unsigned
int
need
=
min
(
skip
,
sizeof
ucbuffer_
);
if
(
fread
(
ucbuffer_
,
1U
,
need
,
infile
)
<
need
)
{
fprintf
(
stderr
,
"%s: ERROR during read while skipping unknown chunk
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
skip
-=
need
;
if
(
!
fskip_ahead
(
infile
,
skip
))
{
fprintf
(
stderr
,
"%s: ERROR during read while skipping unknown chunk
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
}
...
...
@@ -711,17 +672,9 @@ int flac__encode_wav(FILE *infile, long infilesize, const char *infilename, cons
FLAC__ASSERT
(
!
options
.
common
.
sector_align
||
encoder_session
.
until
==
0
);
if
(
encoder_session
.
skip
>
0
)
{
if
(
fseek
(
infile
,
bytes_per_wide_sample
*
(
unsigned
)
encoder_session
.
skip
,
SEEK_CUR
)
<
0
)
{
/* can't seek input, read ahead manually... */
unsigned
left
,
need
;
for
(
left
=
(
unsigned
)
encoder_session
.
skip
;
left
>
0
;
)
{
/*@@@ WATCHOUT: 4GB limit */
need
=
min
(
left
,
CHUNK_OF_SAMPLES
);
if
(
fread
(
ucbuffer_
,
bytes_per_wide_sample
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
left
-=
need
;
}
if
(
!
fskip_ahead
(
infile
,
encoder_session
.
skip
*
bytes_per_wide_sample
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
...
...
@@ -805,17 +758,10 @@ int flac__encode_wav(FILE *infile, long infilesize, const char *infilename, cons
}
if
(
trim
>
0
)
{
if
(
fseek
(
infile
,
bytes_per_wide_sample
*
(
unsigned
)
trim
,
SEEK_CUR
)
<
0
)
{
/* can't seek input, read ahead manually... */
unsigned
left
,
need
;
for
(
left
=
(
unsigned
)
trim
;
left
>
0
;
)
{
/*@@@ WATCHOUT: 4GB limit */
need
=
min
(
left
,
CHUNK_OF_SAMPLES
);
if
(
fread
(
ucbuffer_
,
bytes_per_wide_sample
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
left
-=
need
;
}
FLAC__ASSERT
(
!
options
.
common
.
sector_align
);
if
(
!
fskip_ahead
(
infile
,
trim
*
bytes_per_wide_sample
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
...
...
@@ -896,18 +842,9 @@ int flac__encode_wav(FILE *infile, long infilesize, const char *infilename, cons
unsigned
long
skip
=
xx
+
(
xx
&
1U
);
FLAC__ASSERT
(
skip
<=
LONG_MAX
);
if
(
fseek
(
infile
,
skip
,
SEEK_CUR
)
<
0
)
{
/* can't seek input, read ahead manually... */
unsigned
left
,
need
;
const
unsigned
chunk
=
sizeof
(
ucbuffer_
);
for
(
left
=
skip
;
left
>
0
;
)
{
need
=
min
(
left
,
chunk
);
if
(
fread
(
ucbuffer_
,
1
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping unsupported sub-chunk
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
left
-=
need
;
}
if
(
!
fskip_ahead
(
infile
,
skip
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping unsupported sub-chunk
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
}
...
...
@@ -999,18 +936,9 @@ int flac__encode_raw(FILE *infile, long infilesize, const char *infilename, cons
if
(
skip_bytes
>
lookahead_length
)
{
skip_bytes
-=
lookahead_length
;
lookahead_length
=
0
;
if
(
fseek
(
infile
,
(
long
)
skip_bytes
,
SEEK_CUR
)
<
0
)
{
/* can't seek input, read ahead manually... */
unsigned
left
,
need
;
const
unsigned
chunk
=
sizeof
(
ucbuffer_
);
for
(
left
=
skip_bytes
;
left
>
0
;
)
{
need
=
min
(
left
,
chunk
);
if
(
fread
(
ucbuffer_
,
1
,
need
,
infile
)
<
need
)
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
left
-=
need
;
}
if
(
!
fskip_ahead
(
infile
,
skip_bytes
))
{
flac__utils_printf
(
stderr
,
1
,
"%s: ERROR during read while skipping samples
\n
"
,
encoder_session
.
inbasefilename
);
return
EncoderSession_finish_error
(
&
encoder_session
);
}
}
else
{
...
...
@@ -2183,3 +2111,19 @@ FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, FLAC__bool eof_ok, con
return
true
;
}
FLAC__bool
fskip_ahead
(
FILE
*
f
,
FLAC__uint64
offset
)
{
static
unsigned
char
dump
[
8192
];
while
(
offset
>
0
)
{
long
need
=
(
long
)
min
(
offset
,
LONG_MAX
);
if
(
fseek
(
f
,
need
,
SEEK_CUR
)
<
0
)
{
need
=
min
(
offset
,
sizeof
(
dump
));
if
(
fread
(
dump
,
need
,
1
,
f
)
<
1
)
return
false
;
}
offset
-=
need
;
}
return
true
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment