Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
13
Issues
13
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
GSoC
GSoC2018
macOS
vlc
Commits
78b96579
Commit
78b96579
authored
Feb 22, 2017
by
François Cartegnie
🤞
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
codec: faad: avoid memcpy/mov
Most blocks contains aligned samples.
parent
6c591395
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
55 deletions
+45
-55
modules/codec/faad.c
modules/codec/faad.c
+45
-55
No files found.
modules/codec/faad.c
View file @
78b96579
...
...
@@ -74,9 +74,7 @@ struct decoder_sys_t
date_t
date
;
/* temporary buffer */
uint8_t
*
p_buffer
;
size_t
i_buffer
;
size_t
i_buffer_size
;
block_t
*
p_block
;
/* Channel positions of the current stream (for re-ordering) */
uint32_t
pi_channel_positions
[
MAX_CHANNEL_POSITIONS
];
...
...
@@ -190,8 +188,7 @@ static int Open( vlc_object_t *p_this )
NeAACDecSetConfiguration
(
p_sys
->
hfaad
,
cfg
);
/* buffer */
p_sys
->
i_buffer
=
p_sys
->
i_buffer_size
=
0
;
p_sys
->
p_buffer
=
NULL
;
p_sys
->
p_block
=
NULL
;
p_sys
->
b_sbr
=
p_sys
->
b_ps
=
false
;
...
...
@@ -215,20 +212,25 @@ static void Flush( decoder_t *p_dec )
*****************************************************************************/
static
void
FlushBuffer
(
decoder_sys_t
*
p_sys
,
size_t
i_used
)
{
if
(
i_used
>
p_sys
->
i_buffer
)
block_t
*
p_block
=
p_sys
->
p_block
;
if
(
p_block
)
{
/* Drop padding */
if
(
p_sys
->
p_buffer
[
i_used
]
==
0x00
)
i_used
++
;
if
(
i_used
<
p_block
->
i_buffer
)
{
/* Drop padding */
if
(
p_block
->
p_buffer
[
i_used
]
==
0x00
)
i_used
++
;
p_sys
->
i_buffer
-=
i_used
;
if
(
p_sys
->
i_buffer
>
0
)
p_block
->
i_buffer
-=
i_used
;
p_block
->
p_buffer
+=
i_used
;
}
else
p_block
->
i_buffer
=
0
;
if
(
p_block
->
i_buffer
==
0
)
{
memmove
(
p_sys
->
p_buffer
,
&
p_sys
->
p_buffer
[
i_used
],
p_sys
->
i_buffer
)
;
block_Release
(
p_block
);
p_sys
->
p_block
=
NULL
;
}
}
else
p_sys
->
i_buffer
=
0
;
}
/*****************************************************************************
...
...
@@ -268,30 +270,24 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
}
}
/* Append the block to the temporary buffer */
if
(
p_sys
->
i_buffer_size
<
p_sys
->
i_buffer
+
p_block
->
i_buffer
)
const
mtime_t
i_pts
=
p_block
->
i_pts
;
/* Append block as temporary buffer */
if
(
p_sys
->
p_block
==
NULL
)
{
size_t
i_buffer_size
=
p_sys
->
i_buffer
+
p_block
->
i_buffer
;
uint8_t
*
p_buffer
=
realloc
(
p_sys
->
p_buffer
,
i_buffer_size
);
if
(
p_buffer
)
{
p_sys
->
i_buffer_size
=
i_buffer_size
;
p_sys
->
p_buffer
=
p_buffer
;
}
else
{
p_block
->
i_buffer
=
0
;
}
p_sys
->
p_block
=
p_block
;
}
if
(
p_block
->
i_buffer
>
0
)
else
{
memcpy
(
&
p_sys
->
p_buffer
[
p_sys
->
i_buffer
],
p_block
->
p_buffer
,
p_block
->
i_buffer
);
p_sys
->
i_buffer
+=
p_block
->
i_buffer
;
p_block
->
i_buffer
=
0
;
p_sys
->
p_block
->
p_next
=
p_block
;
block_t
*
p_prev
=
p_sys
->
p_block
;
p_sys
->
p_block
=
block_ChainGather
(
p_sys
->
p_block
);
if
(
p_sys
->
p_block
==
NULL
)
block_ChainRelease
(
p_prev
);
}
/* !Warn: do not use p_block beyond this point */
if
(
p_dec
->
fmt_out
.
audio
.
i_rate
==
0
&&
p_dec
->
fmt_in
.
i_extra
>
0
)
{
/* We have a decoder config so init the handle */
...
...
@@ -312,17 +308,16 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
}
}
if
(
p_dec
->
fmt_out
.
audio
.
i_rate
==
0
&&
p_sys
->
i_buffer
)
if
(
p_dec
->
fmt_out
.
audio
.
i_rate
==
0
&&
p_sys
->
p_block
&&
p_sys
->
p_block
->
i_buffer
)
{
unsigned
long
i_rate
;
unsigned
char
i_channels
;
/* Init faad with the first frame */
if
(
NeAACDecInit
(
p_sys
->
hfaad
,
p_sys
->
p_b
uffer
,
p_sys
->
i_buffer
,
p_sys
->
p_b
lock
->
p_buffer
,
p_sys
->
p_block
->
i_buffer
,
&
i_rate
,
&
i_channels
)
<
0
)
{
block_Release
(
p_block
);
return
VLCDEC_SUCCESS
;
}
...
...
@@ -334,27 +329,27 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
date_Init
(
&
p_sys
->
date
,
i_rate
,
1
);
}
if
(
p_block
->
i_pts
>
VLC_TS_INVALID
&&
p_block
->
i_pts
!=
date_Get
(
&
p_sys
->
date
)
)
if
(
i_pts
>
VLC_TS_INVALID
&&
i_pts
!=
date_Get
(
&
p_sys
->
date
)
)
{
date_Set
(
&
p_sys
->
date
,
p_block
->
i_pts
);
date_Set
(
&
p_sys
->
date
,
i_pts
);
}
else
if
(
!
date_Get
(
&
p_sys
->
date
)
)
{
/* We've just started the stream, wait for the first PTS. */
block_Release
(
p_block
);
p_sys
->
i_buffer
=
0
;
FlushBuffer
(
p_sys
,
SIZE_MAX
);
return
VLCDEC_SUCCESS
;
}
/* Decode all data */
if
(
p_sys
->
i_buffer
>
1
)
if
(
p_sys
->
p_block
&&
p_sys
->
p_block
->
i_buffer
>
1
)
{
void
*
samples
;
NeAACDecFrameInfo
frame
;
block_t
*
p_out
;
samples
=
NeAACDecDecode
(
p_sys
->
hfaad
,
&
frame
,
p_sys
->
p_buffer
,
p_sys
->
i_buffer
);
p_sys
->
p_block
->
p_buffer
,
p_sys
->
p_block
->
i_buffer
);
if
(
frame
.
error
>
0
)
{
...
...
@@ -382,7 +377,9 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
cfg
->
outputFormat
=
oldcfg
->
outputFormat
;
NeAACDecSetConfiguration
(
hfaad
,
cfg
);
if
(
NeAACDecInit
(
hfaad
,
p_sys
->
p_buffer
,
p_sys
->
i_buffer
,
if
(
NeAACDecInit
(
hfaad
,
p_sys
->
p_block
->
p_buffer
,
p_sys
->
p_block
->
i_buffer
,
&
i_rate
,
&
i_channels
)
<
0
)
{
/* reinitialization failed */
...
...
@@ -403,8 +400,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
}
/* Flush the buffer */
p_sys
->
i_buffer
=
0
;
block_Release
(
p_block
);
FlushBuffer
(
p_sys
,
SIZE_MAX
);
return
VLCDEC_SUCCESS
;
}
...
...
@@ -412,7 +408,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
{
msg_Warn
(
p_dec
,
"invalid channels count: %i"
,
frame
.
channels
);
FlushBuffer
(
p_sys
,
frame
.
bytesconsumed
);
block_Release
(
p_block
);
return
VLCDEC_SUCCESS
;
}
...
...
@@ -420,7 +415,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
{
msg_Warn
(
p_dec
,
"decoded zero sample"
);
FlushBuffer
(
p_sys
,
frame
.
bytesconsumed
);
block_Release
(
p_block
);
return
VLCDEC_SUCCESS
;
}
...
...
@@ -428,9 +422,8 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
if
(
p_dec
->
fmt_out
.
audio
.
i_rate
!=
frame
.
samplerate
)
{
date_Init
(
&
p_sys
->
date
,
frame
.
samplerate
,
1
);
date_Set
(
&
p_sys
->
date
,
p_block
->
i_pts
);
date_Set
(
&
p_sys
->
date
,
i_pts
);
}
p_block
->
i_pts
=
VLC_TS_INVALID
;
/* PTS is valid only once */
p_dec
->
fmt_out
.
audio
.
i_rate
=
frame
.
samplerate
;
p_dec
->
fmt_out
.
audio
.
i_channels
=
frame
.
channels
;
...
...
@@ -497,8 +490,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
p_out
=
decoder_NewAudioBuffer
(
p_dec
,
frame
.
samples
/
nbChannels
);
if
(
p_out
==
NULL
)
{
p_sys
->
i_buffer
=
0
;
block_Release
(
p_block
);
FlushBuffer
(
p_sys
,
SIZE_MAX
);
return
VLCDEC_SUCCESS
;
}
...
...
@@ -513,17 +505,15 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
FlushBuffer
(
p_sys
,
frame
.
bytesconsumed
);
block_Release
(
p_block
);
decoder_QueueAudio
(
p_dec
,
p_out
);
return
VLCDEC_SUCCESS
;
}
else
{
/* Drop byte of padding */
p_sys
->
i_buffer
=
0
;
FlushBuffer
(
p_sys
,
0
)
;
}
block_Release
(
p_block
);
return
VLCDEC_SUCCESS
;
}
...
...
@@ -536,7 +526,7 @@ static void Close( vlc_object_t *p_this )
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
NeAACDecClose
(
p_sys
->
hfaad
);
free
(
p_sys
->
p_buffer
);
FlushBuffer
(
p_sys
,
SIZE_MAX
);
free
(
p_sys
);
}
...
...
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