Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
21f7cd4a
Commit
21f7cd4a
authored
Jan 15, 2016
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi: add a filter for uploading normal frames to CUDA
parent
1bf34134
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
251 additions
and
0 deletions
+251
-0
configure
configure
+1
-0
filters.texi
doc/filters.texi
+11
-0
Makefile
libavfilter/Makefile
+1
-0
allfilters.c
libavfilter/allfilters.c
+1
-0
vf_hwupload_cuda.c
libavfilter/vf_hwupload_cuda.c
+237
-0
No files found.
configure
View file @
21f7cd4a
...
...
@@ -2382,6 +2382,7 @@ frei0r_filter_extralibs='$ldl'
frei0r_src_filter_deps
=
"frei0r dlopen"
frei0r_src_filter_extralibs
=
'$ldl'
hqdn3d_filter_deps
=
"gpl"
hwupload_cuda_filter_deps
=
"cuda"
interlace_filter_deps
=
"gpl"
ocv_filter_deps
=
"libopencv"
resample_filter_deps
=
"avresample"
...
...
doc/filters.texi
View file @
21f7cd4a
...
...
@@ -1610,6 +1610,17 @@ A floating point number which specifies chroma temporal strength. It defaults to
@var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial}.
@end table
@section hwupload_cuda
Upload system memory frames to a CUDA device.
It accepts the following optional parameters:
@table @option
@item device
The number of the CUDA device to use
@end table
@section interlace
Simple interlacing filter from progressive contents. This interleaves upper (or
...
...
libavfilter/Makefile
View file @
21f7cd4a
...
...
@@ -56,6 +56,7 @@ OBJS-$(CONFIG_FREI0R_FILTER) += vf_frei0r.o
OBJS-$(CONFIG_GRADFUN_FILTER)
+=
vf_gradfun.o
OBJS-$(CONFIG_HFLIP_FILTER)
+=
vf_hflip.o
OBJS-$(CONFIG_HQDN3D_FILTER)
+=
vf_hqdn3d.o
OBJS-$(CONFIG_HWUPLOAD_CUDA_FILTER)
+=
vf_hwupload_cuda.o
OBJS-$(CONFIG_INTERLACE_FILTER)
+=
vf_interlace.o
OBJS-$(CONFIG_LUT_FILTER)
+=
vf_lut.o
OBJS-$(CONFIG_LUTRGB_FILTER)
+=
vf_lut.o
...
...
libavfilter/allfilters.c
View file @
21f7cd4a
...
...
@@ -82,6 +82,7 @@ void avfilter_register_all(void)
REGISTER_FILTER
(
GRADFUN
,
gradfun
,
vf
);
REGISTER_FILTER
(
HFLIP
,
hflip
,
vf
);
REGISTER_FILTER
(
HQDN3D
,
hqdn3d
,
vf
);
REGISTER_FILTER
(
HWUPLOAD_CUDA
,
hwupload_cuda
,
vf
);
REGISTER_FILTER
(
INTERLACE
,
interlace
,
vf
);
REGISTER_FILTER
(
LUT
,
lut
,
vf
);
REGISTER_FILTER
(
LUTRGB
,
lutrgb
,
vf
);
...
...
libavfilter/vf_hwupload_cuda.c
0 → 100644
View file @
21f7cd4a
/*
* This file is part of Libav.
*
* Libav 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.
*
* Libav 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 Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/buffer.h"
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_cuda.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "avfilter.h"
#include "formats.h"
#include "internal.h"
#include "video.h"
typedef
struct
CudaUploadContext
{
const
AVClass
*
class
;
int
device_idx
;
AVBufferRef
*
hwdevice
;
AVBufferRef
*
hwframe
;
}
CudaUploadContext
;
static
void
cudaupload_ctx_free
(
AVHWDeviceContext
*
ctx
)
{
AVCUDADeviceContext
*
hwctx
=
ctx
->
hwctx
;
cuCtxDestroy
(
hwctx
->
cuda_ctx
);
}
static
av_cold
int
cudaupload_init
(
AVFilterContext
*
ctx
)
{
CudaUploadContext
*
s
=
ctx
->
priv
;
AVHWDeviceContext
*
device_ctx
;
AVCUDADeviceContext
*
device_hwctx
;
CUdevice
device
;
CUcontext
cuda_ctx
=
NULL
,
dummy
;
CUresult
err
;
int
ret
;
err
=
cuInit
(
0
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not initialize the CUDA driver API
\n
"
);
return
AVERROR_UNKNOWN
;
}
err
=
cuDeviceGet
(
&
device
,
s
->
device_idx
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not get the device number %d
\n
"
,
s
->
device_idx
);
return
AVERROR_UNKNOWN
;
}
err
=
cuCtxCreate
(
&
cuda_ctx
,
0
,
device
);
if
(
err
!=
CUDA_SUCCESS
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error creating a CUDA context
\n
"
);
return
AVERROR_UNKNOWN
;
}
cuCtxPopCurrent
(
&
dummy
);
s
->
hwdevice
=
av_hwdevice_ctx_alloc
(
AV_HWDEVICE_TYPE_CUDA
);
if
(
!
s
->
hwdevice
)
{
cuCtxDestroy
(
cuda_ctx
);
return
AVERROR
(
ENOMEM
);
}
device_ctx
=
(
AVHWDeviceContext
*
)
s
->
hwdevice
->
data
;
device_ctx
->
free
=
cudaupload_ctx_free
;
device_hwctx
=
device_ctx
->
hwctx
;
device_hwctx
->
cuda_ctx
=
cuda_ctx
;
ret
=
av_hwdevice_ctx_init
(
s
->
hwdevice
);
if
(
ret
<
0
)
return
ret
;
return
0
;
}
static
av_cold
void
cudaupload_uninit
(
AVFilterContext
*
ctx
)
{
CudaUploadContext
*
s
=
ctx
->
priv
;
av_buffer_unref
(
&
s
->
hwframe
);
av_buffer_unref
(
&
s
->
hwdevice
);
}
static
int
cudaupload_query_formats
(
AVFilterContext
*
ctx
)
{
static
const
enum
AVPixelFormat
input_pix_fmts
[]
=
{
AV_PIX_FMT_NV12
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_NONE
,
};
static
const
enum
AVPixelFormat
output_pix_fmts
[]
=
{
AV_PIX_FMT_CUDA
,
AV_PIX_FMT_NONE
,
};
AVFilterFormats
*
in_fmts
=
ff_make_format_list
(
input_pix_fmts
);
AVFilterFormats
*
out_fmts
=
ff_make_format_list
(
output_pix_fmts
);
ff_formats_ref
(
in_fmts
,
&
ctx
->
inputs
[
0
]
->
out_formats
);
ff_formats_ref
(
out_fmts
,
&
ctx
->
outputs
[
0
]
->
in_formats
);
return
0
;
}
static
int
cudaupload_config_output
(
AVFilterLink
*
outlink
)
{
AVFilterContext
*
ctx
=
outlink
->
src
;
AVFilterLink
*
inlink
=
ctx
->
inputs
[
0
];
CudaUploadContext
*
s
=
ctx
->
priv
;
AVHWFramesContext
*
hwframe_ctx
;
int
ret
;
av_buffer_unref
(
&
s
->
hwframe
);
s
->
hwframe
=
av_hwframe_ctx_alloc
(
s
->
hwdevice
);
if
(
!
s
->
hwframe
)
return
AVERROR
(
ENOMEM
);
hwframe_ctx
=
(
AVHWFramesContext
*
)
s
->
hwframe
->
data
;
hwframe_ctx
->
format
=
AV_PIX_FMT_CUDA
;
hwframe_ctx
->
sw_format
=
inlink
->
format
;
hwframe_ctx
->
width
=
FFALIGN
(
inlink
->
w
,
16
);
hwframe_ctx
->
height
=
FFALIGN
(
inlink
->
h
,
16
);
ret
=
av_hwframe_ctx_init
(
s
->
hwframe
);
if
(
ret
<
0
)
return
ret
;
outlink
->
hw_frames_ctx
=
av_buffer_ref
(
s
->
hwframe
);
if
(
!
outlink
->
hw_frames_ctx
)
return
AVERROR
(
ENOMEM
);
return
0
;
}
static
int
cudaupload_filter_frame
(
AVFilterLink
*
link
,
AVFrame
*
in
)
{
AVFilterContext
*
ctx
=
link
->
dst
;
CudaUploadContext
*
s
=
ctx
->
priv
;
AVFrame
*
out
=
NULL
;
int
ret
;
out
=
av_frame_alloc
();
if
(
!
out
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
}
ret
=
av_hwframe_get_buffer
(
s
->
hwframe
,
out
,
0
);
if
(
ret
<
0
)
goto
fail
;
out
->
width
=
in
->
width
;
out
->
height
=
in
->
height
;
ret
=
av_hwframe_transfer_data
(
out
,
in
,
0
);
if
(
ret
<
0
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error transferring data to the GPU
\n
"
);
goto
fail
;
}
ret
=
av_frame_copy_props
(
out
,
in
);
if
(
ret
<
0
)
goto
fail
;
av_frame_free
(
&
in
);
return
ff_filter_frame
(
ctx
->
outputs
[
0
],
out
);
fail:
av_frame_free
(
&
in
);
av_frame_free
(
&
out
);
return
ret
;
}
#define OFFSET(x) offsetof(CudaUploadContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
static
const
AVOption
options
[]
=
{
{
"device"
,
"Number of the device to use"
,
OFFSET
(
device_idx
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
.
flags
=
FLAGS
},
{
NULL
},
};
static
const
AVClass
cudaupload_class
=
{
.
class_name
=
"cudaupload"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
static
const
AVFilterPad
cudaupload_inputs
[]
=
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
filter_frame
=
cudaupload_filter_frame
,
},
{
NULL
}
};
static
const
AVFilterPad
cudaupload_outputs
[]
=
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
config_props
=
cudaupload_config_output
,
},
{
NULL
}
};
AVFilter
ff_vf_hwupload_cuda
=
{
.
name
=
"hwupload_cuda"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Upload a system memory frame to a CUDA device"
),
.
init
=
cudaupload_init
,
.
uninit
=
cudaupload_uninit
,
.
query_formats
=
cudaupload_query_formats
,
.
priv_size
=
sizeof
(
CudaUploadContext
),
.
priv_class
=
&
cudaupload_class
,
.
inputs
=
cudaupload_inputs
,
.
outputs
=
cudaupload_outputs
,
};
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