Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
005c7a4f
Commit
005c7a4f
authored
Sep 06, 2022
by
Wenbin Chen
Committed by
Haihao Xiang
Sep 09, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libavcodec/qsvenc: Add max/min qp reset support in qsvenc
Signed-off-by:
Wenbin Chen
<
wenbin.chen@intel.com
>
parent
9155ec09
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
98 additions
and
0 deletions
+98
-0
encoders.texi
doc/encoders.texi
+11
-0
qsvenc.c
libavcodec/qsvenc.c
+78
-0
qsvenc.h
libavcodec/qsvenc.h
+9
-0
No files found.
doc/encoders.texi
View file @
005c7a4f
...
...
@@ -3345,6 +3345,17 @@ Change this value to reset qsv codec's gop configuration.
@item @var{int_ref_cycle_dist}
Supported in h264_qsv and hevc_qsv.
Change these value to reset qsv codec's Intra Refresh configuration.
@item @var{qmax}
@item @var{qmin}
@item @var{max_qp_i}
@item @var{min_qp_i}
@item @var{max_qp_p}
@item @var{min_qp_p}
@item @var{max_qp_b}
@item @var{min_qp_b}
Supported in h264_qsv.
Change these value to reset qsv codec's max/min qp configuration.
@end table
@subsection H264 options
...
...
libavcodec/qsvenc.c
View file @
005c7a4f
...
...
@@ -861,22 +861,30 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
q
->
extco2
.
MinQPI
=
avctx
->
qmin
>
51
?
51
:
avctx
->
qmin
;
q
->
extco2
.
MinQPP
=
q
->
extco2
.
MinQPB
=
q
->
extco2
.
MinQPI
;
}
q
->
old_qmin
=
avctx
->
qmin
;
if
(
avctx
->
qmax
>=
0
)
{
q
->
extco2
.
MaxQPI
=
avctx
->
qmax
>
51
?
51
:
avctx
->
qmax
;
q
->
extco2
.
MaxQPP
=
q
->
extco2
.
MaxQPB
=
q
->
extco2
.
MaxQPI
;
}
q
->
old_qmax
=
avctx
->
qmax
;
if
(
q
->
min_qp_i
>=
0
)
q
->
extco2
.
MinQPI
=
q
->
min_qp_i
>
51
?
51
:
q
->
min_qp_i
;
q
->
old_min_qp_i
=
q
->
min_qp_i
;
if
(
q
->
max_qp_i
>=
0
)
q
->
extco2
.
MaxQPI
=
q
->
max_qp_i
>
51
?
51
:
q
->
max_qp_i
;
q
->
old_max_qp_i
=
q
->
max_qp_i
;
if
(
q
->
min_qp_p
>=
0
)
q
->
extco2
.
MinQPP
=
q
->
min_qp_p
>
51
?
51
:
q
->
min_qp_p
;
q
->
old_min_qp_p
=
q
->
min_qp_p
;
if
(
q
->
max_qp_p
>=
0
)
q
->
extco2
.
MaxQPP
=
q
->
max_qp_p
>
51
?
51
:
q
->
max_qp_p
;
q
->
old_max_qp_p
=
q
->
max_qp_p
;
if
(
q
->
min_qp_b
>=
0
)
q
->
extco2
.
MinQPB
=
q
->
min_qp_b
>
51
?
51
:
q
->
min_qp_b
;
q
->
old_min_qp_b
=
q
->
min_qp_b
;
if
(
q
->
max_qp_b
>=
0
)
q
->
extco2
.
MaxQPB
=
q
->
max_qp_b
>
51
?
51
:
q
->
max_qp_b
;
q
->
old_max_qp_b
=
q
->
max_qp_b
;
if
(
q
->
mbbrc
>=
0
)
q
->
extco2
.
MBBRC
=
q
->
mbbrc
?
MFX_CODINGOPTION_ON
:
MFX_CODINGOPTION_OFF
;
...
...
@@ -1744,6 +1752,71 @@ static int update_rir(AVCodecContext *avctx, QSVEncContext *q)
return
updated
;
}
static
int
update_min_max_qp
(
AVCodecContext
*
avctx
,
QSVEncContext
*
q
)
{
int
updated
=
0
;
if
(
avctx
->
codec_id
!=
AV_CODEC_ID_H264
)
return
0
;
UPDATE_PARAM
(
q
->
old_qmax
,
avctx
->
qmin
);
UPDATE_PARAM
(
q
->
old_qmax
,
avctx
->
qmin
);
UPDATE_PARAM
(
q
->
old_min_qp_i
,
q
->
min_qp_i
);
UPDATE_PARAM
(
q
->
old_max_qp_i
,
q
->
max_qp_i
);
UPDATE_PARAM
(
q
->
old_min_qp_p
,
q
->
min_qp_p
);
UPDATE_PARAM
(
q
->
old_max_qp_p
,
q
->
max_qp_p
);
UPDATE_PARAM
(
q
->
old_min_qp_b
,
q
->
min_qp_b
);
UPDATE_PARAM
(
q
->
old_max_qp_b
,
q
->
max_qp_b
);
if
(
!
updated
)
return
0
;
if
((
avctx
->
qmin
>=
0
&&
avctx
->
qmax
>=
0
&&
avctx
->
qmin
>
avctx
->
qmax
)
||
(
q
->
max_qp_i
>=
0
&&
q
->
min_qp_i
>=
0
&&
q
->
min_qp_i
>
q
->
max_qp_i
)
||
(
q
->
max_qp_p
>=
0
&&
q
->
min_qp_p
>=
0
&&
q
->
min_qp_p
>
q
->
max_qp_p
)
||
(
q
->
max_qp_b
>=
0
&&
q
->
min_qp_b
>=
0
&&
q
->
min_qp_b
>
q
->
max_qp_b
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"qmin and or qmax are set but invalid,"
" please make sure min <= max
\n
"
);
return
AVERROR
(
EINVAL
);
}
q
->
extco2
.
MinQPI
=
0
;
q
->
extco2
.
MaxQPI
=
0
;
q
->
extco2
.
MinQPP
=
0
;
q
->
extco2
.
MaxQPP
=
0
;
q
->
extco2
.
MinQPB
=
0
;
q
->
extco2
.
MaxQPB
=
0
;
if
(
avctx
->
qmin
>=
0
)
{
q
->
extco2
.
MinQPI
=
avctx
->
qmin
>
51
?
51
:
avctx
->
qmin
;
q
->
extco2
.
MinQPB
=
q
->
extco2
.
MinQPP
=
q
->
extco2
.
MinQPI
;
}
if
(
avctx
->
qmax
>=
0
)
{
q
->
extco2
.
MaxQPI
=
avctx
->
qmax
>
51
?
51
:
avctx
->
qmax
;
q
->
extco2
.
MaxQPB
=
q
->
extco2
.
MaxQPP
=
q
->
extco2
.
MaxQPI
;
}
if
(
q
->
min_qp_i
>=
0
)
q
->
extco2
.
MinQPI
=
q
->
min_qp_i
>
51
?
51
:
q
->
min_qp_i
;
if
(
q
->
max_qp_i
>=
0
)
q
->
extco2
.
MaxQPI
=
q
->
max_qp_i
>
51
?
51
:
q
->
max_qp_i
;
if
(
q
->
min_qp_p
>=
0
)
q
->
extco2
.
MinQPP
=
q
->
min_qp_p
>
51
?
51
:
q
->
min_qp_p
;
if
(
q
->
max_qp_p
>=
0
)
q
->
extco2
.
MaxQPP
=
q
->
max_qp_p
>
51
?
51
:
q
->
max_qp_p
;
if
(
q
->
min_qp_b
>=
0
)
q
->
extco2
.
MinQPB
=
q
->
min_qp_b
>
51
?
51
:
q
->
min_qp_b
;
if
(
q
->
max_qp_b
>=
0
)
q
->
extco2
.
MaxQPB
=
q
->
max_qp_b
>
51
?
51
:
q
->
max_qp_b
;
av_log
(
avctx
,
AV_LOG_VERBOSE
,
"Reset MinQPI: %d; MaxQPI: %d; "
"MinQPP: %d; MaxQPP: %d; "
"MinQPB: %d; MaxQPB: %d
\n
"
,
q
->
extco2
.
MinQPI
,
q
->
extco2
.
MaxQPI
,
q
->
extco2
.
MinQPP
,
q
->
extco2
.
MaxQPP
,
q
->
extco2
.
MinQPB
,
q
->
extco2
.
MaxQPB
);
return
updated
;
}
static
int
update_parameters
(
AVCodecContext
*
avctx
,
QSVEncContext
*
q
,
const
AVFrame
*
frame
)
{
...
...
@@ -1756,6 +1829,11 @@ static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
needReset
|=
update_max_frame_size
(
avctx
,
q
);
needReset
|=
update_gop_size
(
avctx
,
q
);
needReset
|=
update_rir
(
avctx
,
q
);
ret
=
update_min_max_qp
(
avctx
,
q
);
if
(
ret
<
0
)
return
ret
;
needReset
|=
ret
;
if
(
!
needReset
)
return
0
;
...
...
libavcodec/qsvenc.h
View file @
005c7a4f
...
...
@@ -260,6 +260,15 @@ typedef struct QSVEncContext {
int
old_int_ref_cycle_size
;
int
old_int_ref_qp_delta
;
int
old_int_ref_cycle_dist
;
// These are used for max/min qp reset;
int
old_qmax
;
int
old_qmin
;
int
old_max_qp_i
;
int
old_min_qp_i
;
int
old_max_qp_p
;
int
old_min_qp_p
;
int
old_max_qp_b
;
int
old_min_qp_b
;
}
QSVEncContext
;
int
ff_qsv_enc_init
(
AVCodecContext
*
avctx
,
QSVEncContext
*
q
);
...
...
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