Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
90c228ab
Commit
90c228ab
authored
Sep 22, 2014
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DecoderBuffer: convert functions to methods
parent
505e6bec
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
85 additions
and
121 deletions
+85
-121
DecoderBuffer.cxx
src/decoder/DecoderBuffer.cxx
+12
-44
DecoderBuffer.hxx
src/decoder/DecoderBuffer.hxx
+54
-58
FaadDecoderPlugin.cxx
src/decoder/plugins/FaadDecoderPlugin.cxx
+19
-19
No files found.
src/decoder/DecoderBuffer.cxx
View file @
90c228ab
...
...
@@ -20,84 +20,52 @@
#include "config.h"
#include "DecoderBuffer.hxx"
#include "DecoderAPI.hxx"
#include "util/ConstBuffer.hxx"
#include <assert.h>
const
InputStream
&
decoder_buffer_get_stream
(
const
DecoderBuffer
*
buffer
)
{
return
buffer
->
is
;
}
void
decoder_buffer_clear
(
DecoderBuffer
*
buffer
)
{
buffer
->
buffer
.
Clear
();
}
bool
decoder_buffer_fill
(
DecoderBuffer
*
buffer
)
DecoderBuffer
::
Fill
(
)
{
auto
w
=
buffer
->
buffer
.
Write
();
auto
w
=
buffer
.
Write
();
if
(
w
.
IsEmpty
())
/* buffer is full */
return
false
;
size_t
nbytes
=
decoder_read
(
buffer
->
decoder
,
buffer
->
is
,
size_t
nbytes
=
decoder_read
(
decoder
,
is
,
w
.
data
,
w
.
size
);
if
(
nbytes
==
0
)
/* end of file, I/O error or decoder command
received */
return
false
;
buffer
->
buffer
.
Append
(
nbytes
);
buffer
.
Append
(
nbytes
);
return
true
;
}
size_t
decoder_buffer_available
(
const
DecoderBuffer
*
buffer
)
{
return
buffer
->
buffer
.
GetAvailable
();
}
ConstBuffer
<
void
>
decoder_buffer_read
(
const
DecoderBuffer
*
buffer
)
{
auto
r
=
buffer
->
buffer
.
Read
();
return
{
r
.
data
,
r
.
size
};
}
ConstBuffer
<
void
>
decoder_buffer_need
(
DecoderBuffer
*
buffer
,
size_t
min_size
)
DecoderBuffer
::
Need
(
size_t
min_size
)
{
while
(
true
)
{
const
auto
r
=
decoder_buffer_read
(
buffer
);
const
auto
r
=
Read
(
);
if
(
r
.
size
>=
min_size
)
return
r
;
if
(
!
decoder_buffer_fill
(
buffer
))
if
(
!
Fill
(
))
return
nullptr
;
}
}
void
decoder_buffer_consume
(
DecoderBuffer
*
buffer
,
size_t
nbytes
)
{
buffer
->
buffer
.
Consume
(
nbytes
);
}
bool
decoder_buffer_skip
(
DecoderBuffer
*
buffer
,
size_t
nbytes
)
DecoderBuffer
::
Skip
(
size_t
nbytes
)
{
const
auto
r
=
buffer
->
buffer
.
Read
();
const
auto
r
=
buffer
.
Read
();
if
(
r
.
size
>=
nbytes
)
{
buffer
->
buffer
.
Consume
(
nbytes
);
buffer
.
Consume
(
nbytes
);
return
true
;
}
buffer
->
buffer
.
Clear
();
buffer
.
Clear
();
nbytes
-=
r
.
size
;
return
decoder_skip
(
buffer
->
decoder
,
buffer
->
is
,
nbytes
);
return
decoder_skip
(
decoder
,
is
,
nbytes
);
}
src/decoder/DecoderBuffer.hxx
View file @
90c228ab
...
...
@@ -22,12 +22,12 @@
#include "Compiler.h"
#include "util/DynamicFifoBuffer.hxx"
#include "util/ConstBuffer.hxx"
#include <stddef.h>
struct
Decoder
;
class
InputStream
;
template
<
typename
T
>
struct
ConstBuffer
;
/**
* This objects handles buffered reads in decoder plugins easily. You
...
...
@@ -51,70 +51,66 @@ struct DecoderBuffer {
DecoderBuffer
(
Decoder
*
_decoder
,
InputStream
&
_is
,
size_t
_size
)
:
decoder
(
_decoder
),
is
(
_is
),
buffer
(
_size
)
{}
};
gcc_pure
const
InputStream
&
decoder_buffer_get_stream
(
const
DecoderBuffer
*
buffer
);
const
InputStream
&
GetStream
()
const
{
return
is
;
}
void
decoder_buffer_clear
(
DecoderBuffer
*
buffer
);
void
Clear
()
{
buffer
.
Clear
();
}
/**
* Read data from the input_stream and append it to the buffer.
*
* @return true if data was appended; false if there is no data
* available (yet), end of file, I/O error or a decoder command was
* received
*/
bool
decoder_buffer_fill
(
DecoderBuffer
*
buffer
);
/**
* Read data from the #InputStream and append it to the buffer.
*
* @return true if data was appended; false if there is no
* data available (yet), end of file, I/O error or a decoder
* command was received
*/
bool
Fill
();
/**
* How many bytes are stored in the buffer?
*/
gcc_pure
size_t
decoder_buffer_available
(
const
DecoderBuffer
*
buffer
);
/**
* How many bytes are stored in the buffer?
*/
gcc_pure
size_t
GetAvailable
()
const
{
return
buffer
.
GetAvailable
();
}
/**
* Reads data from the buffer. This data is not yet consumed, you
* have to call decoder_buffer_consume() to do that. The returned
* buffer becomes invalid after a decoder_buffer_fill() or a
* decoder_buffer_consume() call.
*
* @param buffer the decoder_buffer object
*/
gcc_pure
ConstBuffer
<
void
>
decoder_buffer_read
(
const
DecoderBuffer
*
buffer
);
/**
* Reads data from the buffer. This data is not yet consumed,
* you have to call Consume() to do that. The returned buffer
* becomes invalid after a Fill() or a Consume() call.
*/
ConstBuffer
<
void
>
Read
()
const
{
auto
r
=
buffer
.
Read
();
return
{
r
.
data
,
r
.
size
};
}
/**
* Wait until this number of bytes are available. Returns nullptr on
* error.
*/
ConstBuffer
<
void
>
decoder_buffer_need
(
DecoderBuffer
*
buffer
,
size_t
min_size
);
/**
* Wait until this number of bytes are available. Returns nullptr on
* error.
*/
ConstBuffer
<
void
>
Need
(
size_t
min_size
);
/**
* Consume (delete, invalidate) a part of the buffer. The "nbytes"
* parameter must not be larger than the length returned by
* decoder_buffer_r
ead().
*
* @param buffer the decoder_buffer object
* @param nbytes the number of bytes to consume
*/
void
decoder_buffer_consume
(
DecoderBuffer
*
buffer
,
size_t
nbytes
);
/**
* Consume (delete, invalidate) a part of the buffer. The
* "nbytes" parameter must not be larger than the length
* returned by R
ead().
*
* @param nbytes the number of bytes to consume
*/
void
Consume
(
size_t
nbytes
)
{
buffer
.
Consume
(
nbytes
);
}
/**
* Skips the specified number of bytes, discarding its data.
*
* @param buffer the decoder_buffer object
* @param nbytes the number of bytes to skip
* @return true on success, false on error
*/
bool
decoder_buffer_skip
(
DecoderBuffer
*
buffer
,
size_t
nbytes
);
/**
* Skips the specified number of bytes, discarding its data.
*
* @param nbytes the number of bytes to skip
* @return true on success, false on error
*/
bool
Skip
(
size_t
nbytes
);
};
#endif
src/decoder/plugins/FaadDecoderPlugin.cxx
View file @
90c228ab
...
...
@@ -66,7 +66,7 @@ static size_t
adts_find_frame
(
DecoderBuffer
&
buffer
)
{
while
(
true
)
{
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
decoder_buffer_need
(
&
buffer
,
8
));
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
buffer
.
Need
(
8
));
if
(
data
.
IsNull
())
/* failed */
return
0
;
...
...
@@ -76,13 +76,13 @@ adts_find_frame(DecoderBuffer &buffer)
memchr
(
data
.
data
,
0xff
,
data
.
size
);
if
(
p
==
nullptr
)
{
/* no marker - discard the buffer */
decoder_buffer_clear
(
&
buffer
);
buffer
.
Clear
(
);
continue
;
}
if
(
p
>
data
.
data
)
{
/* discard data before 0xff */
decoder_buffer_consume
(
&
buffer
,
p
-
data
.
data
);
buffer
.
Consume
(
p
-
data
.
data
);
continue
;
}
...
...
@@ -91,14 +91,14 @@ adts_find_frame(DecoderBuffer &buffer)
if
(
frame_length
==
0
)
{
/* it's just some random 0xff byte; discard it
and continue searching */
decoder_buffer_consume
(
&
buffer
,
1
);
buffer
.
Consume
(
1
);
continue
;
}
if
(
decoder_buffer_need
(
&
buffer
,
frame_length
).
IsNull
())
{
if
(
buffer
.
Need
(
frame_length
).
IsNull
())
{
/* not enough data; discard this frame to
prevent a possible buffer overflow */
decoder_buffer_clear
(
&
buffer
);
buffer
.
Clear
(
);
continue
;
}
...
...
@@ -110,7 +110,7 @@ adts_find_frame(DecoderBuffer &buffer)
static
SignedSongTime
adts_song_duration
(
DecoderBuffer
&
buffer
)
{
const
InputStream
&
is
=
decoder_buffer_get_stream
(
&
buffer
);
const
InputStream
&
is
=
buffer
.
GetStream
(
);
const
bool
estimate
=
!
is
.
CheapSeeking
();
if
(
estimate
&&
!
is
.
KnownSize
())
return
SignedSongTime
::
Negative
();
...
...
@@ -125,7 +125,7 @@ adts_song_duration(DecoderBuffer &buffer)
break
;
if
(
frames
==
0
)
{
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
decoder_buffer_read
(
&
buffer
));
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
buffer
.
Read
(
));
assert
(
!
data
.
IsEmpty
());
assert
(
frame_length
<=
data
.
size
);
...
...
@@ -134,7 +134,7 @@ adts_song_duration(DecoderBuffer &buffer)
break
;
}
decoder_buffer_consume
(
&
buffer
,
frame_length
);
buffer
.
Consume
(
frame_length
);
if
(
estimate
&&
frames
==
128
)
{
/* if this is a remote file, don't slurp the
...
...
@@ -144,7 +144,7 @@ adts_song_duration(DecoderBuffer &buffer)
have until now */
const
auto
offset
=
is
.
GetOffset
()
-
decoder_buffer_available
(
&
buffer
);
-
buffer
.
GetAvailable
(
);
if
(
offset
<=
0
)
return
SignedSongTime
::
Negative
();
...
...
@@ -164,7 +164,7 @@ adts_song_duration(DecoderBuffer &buffer)
static
SignedSongTime
faad_song_duration
(
DecoderBuffer
&
buffer
,
InputStream
&
is
)
{
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
decoder_buffer_need
(
&
buffer
,
5
));
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
buffer
.
Need
(
5
));
if
(
data
.
IsNull
())
return
SignedSongTime
::
Negative
();
...
...
@@ -177,10 +177,10 @@ faad_song_duration(DecoderBuffer &buffer, InputStream &is)
tagsize
+=
10
;
if
(
!
decoder_buffer_skip
(
&
buffer
,
tagsize
))
if
(
!
buffer
.
Skip
(
tagsize
))
return
SignedSongTime
::
Negative
();
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
decoder_buffer_need
(
&
buffer
,
5
));
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
buffer
.
Need
(
5
));
if
(
data
.
IsNull
())
return
SignedSongTime
::
Negative
();
}
...
...
@@ -195,7 +195,7 @@ faad_song_duration(DecoderBuffer &buffer, InputStream &is)
is
.
LockSeek
(
tagsize
,
IgnoreError
());
decoder_buffer_clear
(
&
buffer
);
buffer
.
Clear
(
);
return
song_length
;
}
else
if
(
data
.
size
>=
5
&&
memcmp
(
data
.
data
,
"ADIF"
,
4
)
==
0
)
{
...
...
@@ -248,7 +248,7 @@ static bool
faad_decoder_init
(
NeAACDecHandle
decoder
,
DecoderBuffer
&
buffer
,
AudioFormat
&
audio_format
,
Error
&
error
)
{
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
decoder_buffer_read
(
&
buffer
));
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
buffer
.
Read
(
));
if
(
data
.
IsEmpty
())
{
error
.
Set
(
faad_decoder_domain
,
"Empty file"
);
return
false
;
...
...
@@ -274,7 +274,7 @@ faad_decoder_init(NeAACDecHandle decoder, DecoderBuffer &buffer,
return
false
;
}
decoder_buffer_consume
(
&
buffer
,
nbytes
);
buffer
.
Consume
(
nbytes
);
return
audio_format_init_checked
(
audio_format
,
sample_rate
,
SampleFormat
::
S16
,
channels
,
error
);
...
...
@@ -288,7 +288,7 @@ static const void *
faad_decoder_decode
(
NeAACDecHandle
decoder
,
DecoderBuffer
&
buffer
,
NeAACDecFrameInfo
*
frame_info
)
{
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
decoder_buffer_read
(
&
buffer
));
auto
data
=
ConstBuffer
<
uint8_t
>::
FromVoid
(
buffer
.
Read
(
));
if
(
data
.
IsEmpty
())
return
nullptr
;
...
...
@@ -315,7 +315,7 @@ faad_get_file_time(InputStream &is)
if
(
!
recognized
)
{
NeAACDecHandle
decoder
=
faad_decoder_new
();
decoder_buffer_fill
(
&
buffer
);
buffer
.
Fill
(
);
AudioFormat
audio_format
;
if
(
faad_decoder_init
(
decoder
,
buffer
,
audio_format
,
...
...
@@ -390,7 +390,7 @@ faad_stream_decode(Decoder &mpd_decoder, InputStream &is,
break
;
}
decoder_buffer_consume
(
&
buffer
,
frame_info
.
bytesconsumed
);
buffer
.
Consume
(
frame_info
.
bytesconsumed
);
/* update bit rate and position */
...
...
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