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
e6464a44
Commit
e6464a44
authored
Oct 10, 2016
by
Timo Rothenpieler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avutil/hwcontext_cuda: use dynamically loaded CUDA
parent
5c02d282
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
120 additions
and
25 deletions
+120
-25
configure
configure
+2
-0
hwcontext_cuda.c
libavutil/hwcontext_cuda.c
+75
-24
hwcontext_cuda.h
libavutil/hwcontext_cuda.h
+5
-0
hwcontext_cuda_internal.h
libavutil/hwcontext_cuda_internal.h
+37
-0
version.h
libavutil/version.h
+1
-1
No files found.
configure
View file @
e6464a44
...
...
@@ -2537,6 +2537,7 @@ audiotoolbox_extralibs="-framework CoreFoundation -framework AudioToolbox -frame
# hardware accelerators
crystalhd_deps
=
"libcrystalhd_libcrystalhd_if_h"
cuda_deps_any
=
"dlopen LoadLibrary"
cuvid_deps
=
"cuda"
d3d11va_deps
=
"d3d11_h dxva_h ID3D11VideoDecoder ID3D11VideoContext"
dxva2_deps
=
"dxva2api_h DXVA2_ConfigPictureDecode"
...
...
@@ -5414,6 +5415,7 @@ elif check_func dlopen -ldl && check_func dlsym -ldl; then
fi
avisynth_demuxer_extralibs
=
'$ldl'
cuda_extralibs
=
'$ldl'
decklink_outdev_extralibs
=
"
$decklink_outdev_extralibs
$ldl
"
decklink_indev_extralibs
=
"
$decklink_indev_extralibs
$ldl
"
frei0r_filter_extralibs
=
'$ldl'
...
...
libavutil/hwcontext_cuda.c
View file @
e6464a44
...
...
@@ -20,7 +20,7 @@
#include "common.h"
#include "hwcontext.h"
#include "hwcontext_internal.h"
#include "hwcontext_cuda.h"
#include "hwcontext_cuda
_internal
.h"
#include "mem.h"
#include "pixdesc.h"
#include "pixfmt.h"
...
...
@@ -41,44 +41,46 @@ static void cuda_buffer_free(void *opaque, uint8_t *data)
{
AVHWFramesContext
*
ctx
=
opaque
;
AVCUDADeviceContext
*
hwctx
=
ctx
->
device_ctx
->
hwctx
;
CudaFunctions
*
cu
=
hwctx
->
internal
->
cuda_dl
;
CUcontext
dummy
;
cuCtxPushCurrent
(
hwctx
->
cuda_ctx
);
cu
->
cu
CtxPushCurrent
(
hwctx
->
cuda_ctx
);
cuMemFree
((
CUdeviceptr
)
data
);
cu
->
cu
MemFree
((
CUdeviceptr
)
data
);
cuCtxPopCurrent
(
&
dummy
);
cu
->
cu
CtxPopCurrent
(
&
dummy
);
}
static
AVBufferRef
*
cuda_pool_alloc
(
void
*
opaque
,
int
size
)
{
AVHWFramesContext
*
ctx
=
opaque
;
AVCUDADeviceContext
*
hwctx
=
ctx
->
device_ctx
->
hwctx
;
CudaFunctions
*
cu
=
hwctx
->
internal
->
cuda_dl
;
AVBufferRef
*
ret
=
NULL
;
CUcontext
dummy
=
NULL
;
CUdeviceptr
data
;
CUresult
err
;
err
=
cuCtxPushCurrent
(
hwctx
->
cuda_ctx
);
err
=
cu
->
cu
CtxPushCurrent
(
hwctx
->
cuda_ctx
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error setting current CUDA context
\n
"
);
return
NULL
;
}
err
=
cuMemAlloc
(
&
data
,
size
);
err
=
cu
->
cu
MemAlloc
(
&
data
,
size
);
if
(
err
!=
CUDA_SUCCESS
)
goto
fail
;
ret
=
av_buffer_create
((
uint8_t
*
)
data
,
size
,
cuda_buffer_free
,
ctx
,
0
);
if
(
!
ret
)
{
cuMemFree
(
data
);
cu
->
cu
MemFree
(
data
);
goto
fail
;
}
fail:
cuCtxPopCurrent
(
&
dummy
);
cu
->
cu
CtxPopCurrent
(
&
dummy
);
return
ret
;
}
...
...
@@ -187,12 +189,13 @@ static int cuda_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst,
{
CUDAFramesContext
*
priv
=
ctx
->
internal
->
priv
;
AVCUDADeviceContext
*
device_hwctx
=
ctx
->
device_ctx
->
hwctx
;
CudaFunctions
*
cu
=
device_hwctx
->
internal
->
cuda_dl
;
CUcontext
dummy
;
CUresult
err
;
int
i
;
err
=
cuCtxPushCurrent
(
device_hwctx
->
cuda_ctx
);
err
=
cu
->
cu
CtxPushCurrent
(
device_hwctx
->
cuda_ctx
);
if
(
err
!=
CUDA_SUCCESS
)
return
AVERROR_UNKNOWN
;
...
...
@@ -208,14 +211,14 @@ static int cuda_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst,
.
Height
=
src
->
height
>>
(
i
?
priv
->
shift_height
:
0
),
};
err
=
cuMemcpy2D
(
&
cpy
);
err
=
cu
->
cu
Memcpy2D
(
&
cpy
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error transferring the data from the CUDA frame
\n
"
);
return
AVERROR_UNKNOWN
;
}
}
cuCtxPopCurrent
(
&
dummy
);
cu
->
cu
CtxPopCurrent
(
&
dummy
);
return
0
;
}
...
...
@@ -225,12 +228,13 @@ static int cuda_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst,
{
CUDAFramesContext
*
priv
=
ctx
->
internal
->
priv
;
AVCUDADeviceContext
*
device_hwctx
=
ctx
->
device_ctx
->
hwctx
;
CudaFunctions
*
cu
=
device_hwctx
->
internal
->
cuda_dl
;
CUcontext
dummy
;
CUresult
err
;
int
i
;
err
=
cuCtxPushCurrent
(
device_hwctx
->
cuda_ctx
);
err
=
cu
->
cu
CtxPushCurrent
(
device_hwctx
->
cuda_ctx
);
if
(
err
!=
CUDA_SUCCESS
)
return
AVERROR_UNKNOWN
;
...
...
@@ -246,28 +250,64 @@ static int cuda_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst,
.
Height
=
src
->
height
>>
(
i
?
priv
->
shift_height
:
0
),
};
err
=
cuMemcpy2D
(
&
cpy
);
err
=
cu
->
cu
Memcpy2D
(
&
cpy
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error transferring the data from the CUDA frame
\n
"
);
return
AVERROR_UNKNOWN
;
}
}
cuCtxPopCurrent
(
&
dummy
);
cu
->
cu
CtxPopCurrent
(
&
dummy
);
return
0
;
}
static
void
cuda_device_
free
(
AVHWDeviceContext
*
ctx
)
static
void
cuda_device_
uninit
(
AVHWDeviceContext
*
ctx
)
{
AVCUDADeviceContext
*
hwctx
=
ctx
->
hwctx
;
cuCtxDestroy
(
hwctx
->
cuda_ctx
);
if
(
hwctx
->
internal
)
{
if
(
hwctx
->
internal
->
is_allocated
&&
hwctx
->
cuda_ctx
)
{
hwctx
->
internal
->
cuda_dl
->
cuCtxDestroy
(
hwctx
->
cuda_ctx
);
hwctx
->
cuda_ctx
=
NULL
;
}
cuda_free_functions
(
&
hwctx
->
internal
->
cuda_dl
);
}
av_freep
(
&
hwctx
->
internal
);
}
static
int
cuda_device_init
(
AVHWDeviceContext
*
ctx
)
{
AVCUDADeviceContext
*
hwctx
=
ctx
->
hwctx
;
int
ret
;
if
(
!
hwctx
->
internal
)
{
hwctx
->
internal
=
av_mallocz
(
sizeof
(
*
hwctx
->
internal
));
if
(
!
hwctx
->
internal
)
return
AVERROR
(
ENOMEM
);
}
if
(
!
hwctx
->
internal
->
cuda_dl
)
{
ret
=
cuda_load_functions
(
&
hwctx
->
internal
->
cuda_dl
);
if
(
ret
<
0
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not dynamically load CUDA
\n
"
);
goto
error
;
}
}
return
0
;
error:
cuda_device_uninit
(
ctx
);
return
ret
;
}
static
int
cuda_device_create
(
AVHWDeviceContext
*
ctx
,
const
char
*
device
,
AVDictionary
*
opts
,
int
flags
)
{
AVCUDADeviceContext
*
hwctx
=
ctx
->
hwctx
;
CudaFunctions
*
cu
;
CUdevice
cu_device
;
CUcontext
dummy
;
CUresult
err
;
...
...
@@ -276,29 +316,38 @@ static int cuda_device_create(AVHWDeviceContext *ctx, const char *device,
if
(
device
)
device_idx
=
strtol
(
device
,
NULL
,
0
);
err
=
cuInit
(
0
);
if
(
cuda_device_init
(
ctx
)
<
0
)
goto
error
;
cu
=
hwctx
->
internal
->
cuda_dl
;
err
=
cu
->
cuInit
(
0
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not initialize the CUDA driver API
\n
"
);
return
AVERROR_UNKNOWN
;
goto
error
;
}
err
=
cuDeviceGet
(
&
cu_device
,
device_idx
);
err
=
cu
->
cu
DeviceGet
(
&
cu_device
,
device_idx
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not get the device number %d
\n
"
,
device_idx
);
return
AVERROR_UNKNOWN
;
goto
error
;
}
err
=
cuCtxCreate
(
&
hwctx
->
cuda_ctx
,
CU_CTX_SCHED_BLOCKING_SYNC
,
cu_device
);
err
=
cu
->
cu
CtxCreate
(
&
hwctx
->
cuda_ctx
,
CU_CTX_SCHED_BLOCKING_SYNC
,
cu_device
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error creating a CUDA context
\n
"
);
return
AVERROR_UNKNOWN
;
goto
error
;
}
cuCtxPopCurrent
(
&
dummy
);
cu
->
cu
CtxPopCurrent
(
&
dummy
);
ctx
->
free
=
cuda_device_free
;
hwctx
->
internal
->
is_allocated
=
1
;
return
0
;
error:
cuda_device_uninit
(
ctx
);
return
AVERROR_UNKNOWN
;
}
const
HWContextType
ff_hwcontext_type_cuda
=
{
...
...
@@ -309,6 +358,8 @@ const HWContextType ff_hwcontext_type_cuda = {
.
frames_priv_size
=
sizeof
(
CUDAFramesContext
),
.
device_create
=
cuda_device_create
,
.
device_init
=
cuda_device_init
,
.
device_uninit
=
cuda_device_uninit
,
.
frames_init
=
cuda_frames_init
,
.
frames_get_buffer
=
cuda_get_buffer
,
.
transfer_get_formats
=
cuda_transfer_get_formats
,
...
...
libavutil/hwcontext_cuda.h
View file @
e6464a44
...
...
@@ -20,7 +20,9 @@
#ifndef AVUTIL_HWCONTEXT_CUDA_H
#define AVUTIL_HWCONTEXT_CUDA_H
#ifndef CUDA_VERSION
#include <cuda.h>
#endif
#include "pixfmt.h"
...
...
@@ -32,11 +34,14 @@
* AVBufferRefs whose data pointer is a CUdeviceptr.
*/
typedef
struct
AVCUDADeviceContextInternal
AVCUDADeviceContextInternal
;
/**
* This struct is allocated as AVHWDeviceContext.hwctx
*/
typedef
struct
AVCUDADeviceContext
{
CUcontext
cuda_ctx
;
AVCUDADeviceContextInternal
*
internal
;
}
AVCUDADeviceContext
;
/**
...
...
libavutil/hwcontext_cuda_internal.h
0 → 100644
View file @
e6464a44
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVUTIL_HWCONTEXT_CUDA_INTERNAL_H
#define AVUTIL_HWCONTEXT_CUDA_INTERNAL_H
#include "compat/cuda/dynlink_loader.h"
#include "hwcontext_cuda.h"
/**
* @file
* FFmpeg internal API for CUDA.
*/
struct
AVCUDADeviceContextInternal
{
CudaFunctions
*
cuda_dl
;
int
is_allocated
;
};
#endif
/* AVUTIL_HWCONTEXT_CUDA_INTERNAL_H */
libavutil/version.h
View file @
e6464a44
...
...
@@ -80,7 +80,7 @@
#define LIBAVUTIL_VERSION_MAJOR 55
#define LIBAVUTIL_VERSION_MINOR 40
#define LIBAVUTIL_VERSION_MICRO 10
0
#define LIBAVUTIL_VERSION_MICRO 10
1
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
...
...
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