Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
9606e4b6
Commit
9606e4b6
authored
Aug 28, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/dsddec: add slice threading support
parent
98f5cbcb
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
40 additions
and
19 deletions
+40
-19
dsd.c
libavcodec/dsd.c
+8
-4
dsddec.c
libavcodec/dsddec.c
+32
-15
No files found.
libavcodec/dsd.c
View file @
9606e4b6
...
...
@@ -56,23 +56,26 @@ void ff_dsd2pcm_translate(DSDContext* s, size_t samples, int lsbf,
const
unsigned
char
*
src
,
ptrdiff_t
src_stride
,
float
*
dst
,
ptrdiff_t
dst_stride
)
{
unsigned
char
buf
[
FIFOSIZE
];
unsigned
pos
,
i
;
unsigned
char
*
p
;
double
sum
;
pos
=
s
->
pos
;
memcpy
(
buf
,
s
->
buf
,
sizeof
(
buf
));
while
(
samples
--
>
0
)
{
s
->
buf
[
pos
]
=
lsbf
?
ff_reverse
[
*
src
]
:
*
src
;
buf
[
pos
]
=
lsbf
?
ff_reverse
[
*
src
]
:
*
src
;
src
+=
src_stride
;
p
=
s
->
buf
+
((
pos
-
CTABLES
)
&
FIFOMASK
);
p
=
buf
+
((
pos
-
CTABLES
)
&
FIFOMASK
);
*
p
=
ff_reverse
[
*
p
];
sum
=
0
.
0
;
for
(
i
=
0
;
i
<
CTABLES
;
i
++
)
{
unsigned
char
a
=
s
->
buf
[(
pos
-
i
)
&
FIFOMASK
];
unsigned
char
b
=
s
->
buf
[(
pos
-
(
CTABLES
*
2
-
1
)
+
i
)
&
FIFOMASK
];
unsigned
char
a
=
buf
[(
pos
-
i
)
&
FIFOMASK
];
unsigned
char
b
=
buf
[(
pos
-
(
CTABLES
*
2
-
1
)
+
i
)
&
FIFOMASK
];
sum
+=
ctables
[
i
][
a
]
+
ctables
[
i
][
b
];
}
...
...
@@ -83,4 +86,5 @@ void ff_dsd2pcm_translate(DSDContext* s, size_t samples, int lsbf,
}
s
->
pos
=
pos
;
memcpy
(
s
->
buf
,
buf
,
sizeof
(
buf
));
}
libavcodec/dsddec.c
View file @
9606e4b6
...
...
@@ -61,17 +61,20 @@ static av_cold int decode_init(AVCodecContext *avctx)
return
0
;
}
static
int
decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
typedef
struct
ThreadData
{
AVFrame
*
frame
;
AVPacket
*
avpkt
;
}
ThreadData
;
static
int
dsd_channel
(
AVCodecContext
*
avctx
,
void
*
tdata
,
int
j
,
int
threadnr
)
{
DSDContext
*
s
=
avctx
->
priv_data
;
AVFrame
*
frame
=
data
;
int
ret
,
i
;
int
lsbf
=
avctx
->
codec_id
==
AV_CODEC_ID_DSD_LSBF
||
avctx
->
codec_id
==
AV_CODEC_ID_DSD_LSBF_PLANAR
;
int
src_next
;
int
src_stride
;
frame
->
nb_samples
=
avpkt
->
size
/
avctx
->
channels
;
DSDContext
*
s
=
avctx
->
priv_data
;
ThreadData
*
td
=
tdata
;
AVFrame
*
frame
=
td
->
frame
;
AVPacket
*
avpkt
=
td
->
avpkt
;
int
src_next
,
src_stride
;
float
*
dst
=
((
float
**
)
frame
->
extended_data
)[
j
];
if
(
avctx
->
codec_id
==
AV_CODEC_ID_DSD_LSBF_PLANAR
||
avctx
->
codec_id
==
AV_CODEC_ID_DSD_MSBF_PLANAR
)
{
src_next
=
frame
->
nb_samples
;
...
...
@@ -81,15 +84,28 @@ static int decode_frame(AVCodecContext *avctx, void *data,
src_stride
=
avctx
->
channels
;
}
ff_dsd2pcm_translate
(
&
s
[
j
],
frame
->
nb_samples
,
lsbf
,
avpkt
->
data
+
j
*
src_next
,
src_stride
,
dst
,
1
);
return
0
;
}
static
int
decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
ThreadData
td
;
AVFrame
*
frame
=
data
;
int
ret
;
frame
->
nb_samples
=
avpkt
->
size
/
avctx
->
channels
;
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
0
))
<
0
)
return
ret
;
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
{
float
*
dst
=
((
float
**
)
frame
->
extended_data
)[
i
];
ff_dsd2pcm_translate
(
&
s
[
i
],
frame
->
nb_samples
,
lsbf
,
avpkt
->
data
+
i
*
src_next
,
src_stride
,
dst
,
1
);
}
td
.
frame
=
frame
;
td
.
avpkt
=
avpkt
;
avctx
->
execute2
(
avctx
,
dsd_channel
,
&
td
,
NULL
,
avctx
->
channels
);
*
got_frame_ptr
=
1
;
return
frame
->
nb_samples
*
avctx
->
channels
;
...
...
@@ -103,6 +119,7 @@ AVCodec ff_##name_##_decoder = { \
.id = AV_CODEC_ID_##id_, \
.init = decode_init, \
.decode = decode_frame, \
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS, \
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, \
AV_SAMPLE_FMT_NONE }, \
};
...
...
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