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
a56d0497
Commit
a56d0497
authored
Sep 02, 2017
by
Timo Rothenpieler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/nvenc: migrate to new encode API
Signed-off-by:
Timo Rothenpieler
<
timo@rothenpieler.org
>
parent
cf42f316
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
70 additions
and
11 deletions
+70
-11
nvenc.c
libavcodec/nvenc.c
+54
-11
nvenc.h
libavcodec/nvenc.h
+6
-0
nvenc_h264.c
libavcodec/nvenc_h264.c
+6
-0
nvenc_hevc.c
libavcodec/nvenc_hevc.c
+4
-0
No files found.
libavcodec/nvenc.c
View file @
a56d0497
...
@@ -1807,8 +1807,7 @@ static int output_ready(AVCodecContext *avctx, int flush)
...
@@ -1807,8 +1807,7 @@ static int output_ready(AVCodecContext *avctx, int flush)
return
(
nb_ready
>
0
)
&&
(
nb_ready
+
nb_pending
>=
ctx
->
async_depth
);
return
(
nb_ready
>
0
)
&&
(
nb_ready
+
nb_pending
>=
ctx
->
async_depth
);
}
}
int
ff_nvenc_encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
int
ff_nvenc_send_frame
(
AVCodecContext
*
avctx
,
const
AVFrame
*
frame
)
const
AVFrame
*
frame
,
int
*
got_packet
)
{
{
NVENCSTATUS
nv_status
;
NVENCSTATUS
nv_status
;
CUresult
cu_res
;
CUresult
cu_res
;
...
@@ -1823,12 +1822,16 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -1823,12 +1822,16 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
NV_ENC_PIC_PARAMS
pic_params
=
{
0
};
NV_ENC_PIC_PARAMS
pic_params
=
{
0
};
pic_params
.
version
=
NV_ENC_PIC_PARAMS_VER
;
pic_params
.
version
=
NV_ENC_PIC_PARAMS_VER
;
if
(
!
ctx
->
cu_context
||
!
ctx
->
nvencoder
)
return
AVERROR
(
EINVAL
);
if
(
ctx
->
encoder_flushing
)
return
AVERROR_EOF
;
if
(
frame
)
{
if
(
frame
)
{
inSurf
=
get_free_frame
(
ctx
);
inSurf
=
get_free_frame
(
ctx
);
if
(
!
inSurf
)
{
if
(
!
inSurf
)
av_log
(
avctx
,
AV_LOG_ERROR
,
"No free surfaces
\n
"
);
return
AVERROR
(
EAGAIN
);
return
AVERROR_BUG
;
}
cu_res
=
dl_fn
->
cuda_dl
->
cuCtxPushCurrent
(
ctx
->
cu_context
);
cu_res
=
dl_fn
->
cuda_dl
->
cuCtxPushCurrent
(
ctx
->
cu_context
);
if
(
cu_res
!=
CUDA_SUCCESS
)
{
if
(
cu_res
!=
CUDA_SUCCESS
)
{
...
@@ -1844,9 +1847,8 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -1844,9 +1847,8 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
return
AVERROR_EXTERNAL
;
return
AVERROR_EXTERNAL
;
}
}
if
(
res
)
{
if
(
res
)
return
res
;
return
res
;
}
pic_params
.
inputBuffer
=
inSurf
->
input_surface
;
pic_params
.
inputBuffer
=
inSurf
->
input_surface
;
pic_params
.
bufferFmt
=
inSurf
->
format
;
pic_params
.
bufferFmt
=
inSurf
->
format
;
...
@@ -1876,6 +1878,7 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -1876,6 +1878,7 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
nvenc_codec_specific_pic_params
(
avctx
,
&
pic_params
);
nvenc_codec_specific_pic_params
(
avctx
,
&
pic_params
);
}
else
{
}
else
{
pic_params
.
encodePicFlags
=
NV_ENC_PIC_FLAG_EOS
;
pic_params
.
encodePicFlags
=
NV_ENC_PIC_FLAG_EOS
;
ctx
->
encoder_flushing
=
1
;
}
}
cu_res
=
dl_fn
->
cuda_dl
->
cuCtxPushCurrent
(
ctx
->
cu_context
);
cu_res
=
dl_fn
->
cuda_dl
->
cuCtxPushCurrent
(
ctx
->
cu_context
);
...
@@ -1914,7 +1917,23 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -1914,7 +1917,23 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
}
}
}
}
if
(
output_ready
(
avctx
,
!
frame
))
{
return
0
;
}
int
ff_nvenc_receive_packet
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
)
{
CUresult
cu_res
;
CUcontext
dummy
;
NvencSurface
*
tmpoutsurf
;
int
res
;
NvencContext
*
ctx
=
avctx
->
priv_data
;
NvencDynLoadFunctions
*
dl_fn
=
&
ctx
->
nvenc_dload_funcs
;
if
(
!
ctx
->
cu_context
||
!
ctx
->
nvencoder
)
return
AVERROR
(
EINVAL
);
if
(
output_ready
(
avctx
,
ctx
->
encoder_flushing
))
{
av_fifo_generic_read
(
ctx
->
output_surface_ready_queue
,
&
tmpoutsurf
,
sizeof
(
tmpoutsurf
),
NULL
);
av_fifo_generic_read
(
ctx
->
output_surface_ready_queue
,
&
tmpoutsurf
,
sizeof
(
tmpoutsurf
),
NULL
);
cu_res
=
dl_fn
->
cuda_dl
->
cuCtxPushCurrent
(
ctx
->
cu_context
);
cu_res
=
dl_fn
->
cuda_dl
->
cuCtxPushCurrent
(
ctx
->
cu_context
);
...
@@ -1935,10 +1954,34 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
...
@@ -1935,10 +1954,34 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
return
res
;
return
res
;
av_fifo_generic_write
(
ctx
->
unused_surface_queue
,
&
tmpoutsurf
,
sizeof
(
tmpoutsurf
),
NULL
);
av_fifo_generic_write
(
ctx
->
unused_surface_queue
,
&
tmpoutsurf
,
sizeof
(
tmpoutsurf
),
NULL
);
}
else
if
(
ctx
->
encoder_flushing
)
{
*
got_packet
=
1
;
return
AVERROR_EOF
;
}
else
{
}
else
{
return
AVERROR
(
EAGAIN
);
}
return
0
;
}
int
ff_nvenc_encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
const
AVFrame
*
frame
,
int
*
got_packet
)
{
NvencContext
*
ctx
=
avctx
->
priv_data
;
int
res
;
if
(
!
ctx
->
encoder_flushing
)
{
res
=
ff_nvenc_send_frame
(
avctx
,
frame
);
if
(
res
<
0
)
return
res
;
}
res
=
ff_nvenc_receive_packet
(
avctx
,
pkt
);
if
(
res
==
AVERROR
(
EAGAIN
)
||
res
==
AVERROR_EOF
)
{
*
got_packet
=
0
;
*
got_packet
=
0
;
}
else
if
(
res
<
0
)
{
return
res
;
}
else
{
*
got_packet
=
1
;
}
}
return
0
;
return
0
;
...
...
libavcodec/nvenc.h
View file @
a56d0497
...
@@ -116,6 +116,8 @@ typedef struct NvencContext
...
@@ -116,6 +116,8 @@ typedef struct NvencContext
AVFifoBuffer
*
output_surface_ready_queue
;
AVFifoBuffer
*
output_surface_ready_queue
;
AVFifoBuffer
*
timestamp_list
;
AVFifoBuffer
*
timestamp_list
;
int
encoder_flushing
;
struct
{
struct
{
CUdeviceptr
ptr
;
CUdeviceptr
ptr
;
NV_ENC_REGISTERED_PTR
regptr
;
NV_ENC_REGISTERED_PTR
regptr
;
...
@@ -169,6 +171,10 @@ int ff_nvenc_encode_init(AVCodecContext *avctx);
...
@@ -169,6 +171,10 @@ int ff_nvenc_encode_init(AVCodecContext *avctx);
int
ff_nvenc_encode_close
(
AVCodecContext
*
avctx
);
int
ff_nvenc_encode_close
(
AVCodecContext
*
avctx
);
int
ff_nvenc_send_frame
(
AVCodecContext
*
avctx
,
const
AVFrame
*
frame
);
int
ff_nvenc_receive_packet
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
);
int
ff_nvenc_encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
int
ff_nvenc_encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
const
AVFrame
*
frame
,
int
*
got_packet
);
const
AVFrame
*
frame
,
int
*
got_packet
);
...
...
libavcodec/nvenc_h264.c
View file @
a56d0497
...
@@ -164,6 +164,8 @@ AVCodec ff_nvenc_encoder = {
...
@@ -164,6 +164,8 @@ AVCodec ff_nvenc_encoder = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_H264
,
.
id
=
AV_CODEC_ID_H264
,
.
init
=
nvenc_old_init
,
.
init
=
nvenc_old_init
,
.
send_frame
=
ff_nvenc_send_frame
,
.
receive_packet
=
ff_nvenc_receive_packet
,
.
encode2
=
ff_nvenc_encode_frame
,
.
encode2
=
ff_nvenc_encode_frame
,
.
close
=
ff_nvenc_encode_close
,
.
close
=
ff_nvenc_encode_close
,
.
priv_data_size
=
sizeof
(
NvencContext
),
.
priv_data_size
=
sizeof
(
NvencContext
),
...
@@ -190,6 +192,8 @@ AVCodec ff_nvenc_h264_encoder = {
...
@@ -190,6 +192,8 @@ AVCodec ff_nvenc_h264_encoder = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_H264
,
.
id
=
AV_CODEC_ID_H264
,
.
init
=
nvenc_old_init
,
.
init
=
nvenc_old_init
,
.
send_frame
=
ff_nvenc_send_frame
,
.
receive_packet
=
ff_nvenc_receive_packet
,
.
encode2
=
ff_nvenc_encode_frame
,
.
encode2
=
ff_nvenc_encode_frame
,
.
close
=
ff_nvenc_encode_close
,
.
close
=
ff_nvenc_encode_close
,
.
priv_data_size
=
sizeof
(
NvencContext
),
.
priv_data_size
=
sizeof
(
NvencContext
),
...
@@ -216,6 +220,8 @@ AVCodec ff_h264_nvenc_encoder = {
...
@@ -216,6 +220,8 @@ AVCodec ff_h264_nvenc_encoder = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_H264
,
.
id
=
AV_CODEC_ID_H264
,
.
init
=
ff_nvenc_encode_init
,
.
init
=
ff_nvenc_encode_init
,
.
send_frame
=
ff_nvenc_send_frame
,
.
receive_packet
=
ff_nvenc_receive_packet
,
.
encode2
=
ff_nvenc_encode_frame
,
.
encode2
=
ff_nvenc_encode_frame
,
.
close
=
ff_nvenc_encode_close
,
.
close
=
ff_nvenc_encode_close
,
.
priv_data_size
=
sizeof
(
NvencContext
),
.
priv_data_size
=
sizeof
(
NvencContext
),
...
...
libavcodec/nvenc_hevc.c
View file @
a56d0497
...
@@ -153,6 +153,8 @@ AVCodec ff_nvenc_hevc_encoder = {
...
@@ -153,6 +153,8 @@ AVCodec ff_nvenc_hevc_encoder = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_HEVC
,
.
id
=
AV_CODEC_ID_HEVC
,
.
init
=
nvenc_old_init
,
.
init
=
nvenc_old_init
,
.
send_frame
=
ff_nvenc_send_frame
,
.
receive_packet
=
ff_nvenc_receive_packet
,
.
encode2
=
ff_nvenc_encode_frame
,
.
encode2
=
ff_nvenc_encode_frame
,
.
close
=
ff_nvenc_encode_close
,
.
close
=
ff_nvenc_encode_close
,
.
priv_data_size
=
sizeof
(
NvencContext
),
.
priv_data_size
=
sizeof
(
NvencContext
),
...
@@ -178,6 +180,8 @@ AVCodec ff_hevc_nvenc_encoder = {
...
@@ -178,6 +180,8 @@ AVCodec ff_hevc_nvenc_encoder = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_HEVC
,
.
id
=
AV_CODEC_ID_HEVC
,
.
init
=
ff_nvenc_encode_init
,
.
init
=
ff_nvenc_encode_init
,
.
send_frame
=
ff_nvenc_send_frame
,
.
receive_packet
=
ff_nvenc_receive_packet
,
.
encode2
=
ff_nvenc_encode_frame
,
.
encode2
=
ff_nvenc_encode_frame
,
.
close
=
ff_nvenc_encode_close
,
.
close
=
ff_nvenc_encode_close
,
.
priv_data_size
=
sizeof
(
NvencContext
),
.
priv_data_size
=
sizeof
(
NvencContext
),
...
...
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