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
045ff8d3
Commit
045ff8d3
authored
Mar 04, 2017
by
Mark Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hwcontext_qsv: Support derivation from child devices
(cherry picked from commit
aa51bb3d
)
parent
7ce47090
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
84 additions
and
29 deletions
+84
-29
hwcontext_qsv.c
libavutil/hwcontext_qsv.c
+84
-29
No files found.
libavutil/hwcontext_qsv.c
View file @
045ff8d3
...
...
@@ -792,21 +792,96 @@ static mfxIMPL choose_implementation(const char *device)
return
impl
;
}
static
int
qsv_device_create
(
AVHWDeviceContext
*
ctx
,
const
char
*
device
,
AVDictionary
*
opts
,
int
flags
)
static
int
qsv_device_derive_from_child
(
AVHWDeviceContext
*
ctx
,
mfxIMPL
implementation
,
AVHWDeviceContext
*
child_device_ctx
,
int
flags
)
{
AVQSVDeviceContext
*
hwctx
=
ctx
->
hwctx
;
QSVDevicePriv
*
priv
;
enum
AVHWDeviceType
child_device_type
;
AVDictionaryEntry
*
e
;
QSVDeviceContext
*
s
=
ctx
->
internal
->
priv
;
mfxVersion
ver
=
{
{
3
,
1
}
};
mfxIMPL
impl
;
mfxHDL
handle
;
mfxHandleType
handle_type
;
mfxStatus
err
;
int
ret
;
switch
(
child_device_ctx
->
type
)
{
#if CONFIG_VAAPI
case
AV_HWDEVICE_TYPE_VAAPI
:
{
AVVAAPIDeviceContext
*
child_device_hwctx
=
child_device_ctx
->
hwctx
;
handle_type
=
MFX_HANDLE_VA_DISPLAY
;
handle
=
(
mfxHDL
)
child_device_hwctx
->
display
;
}
break
;
#endif
#if CONFIG_DXVA2
case
AV_HWDEVICE_TYPE_DXVA2
:
{
AVDXVA2DeviceContext
*
child_device_hwctx
=
child_device_ctx
->
hwctx
;
handle_type
=
MFX_HANDLE_D3D9_DEVICE_MANAGER
;
handle
=
(
mfxHDL
)
child_device_hwctx
->
devmgr
;
}
break
;
#endif
default:
ret
=
AVERROR
(
ENOSYS
);
goto
fail
;
}
err
=
MFXInit
(
implementation
,
&
ver
,
&
hwctx
->
session
);
if
(
err
!=
MFX_ERR_NONE
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error initializing an MFX session: "
"%d.
\n
"
,
err
);
ret
=
AVERROR_UNKNOWN
;
goto
fail
;
}
err
=
MFXVideoCORE_SetHandle
(
hwctx
->
session
,
handle_type
,
handle
);
if
(
err
!=
MFX_ERR_NONE
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error setting child device handle: "
"%d
\n
"
,
err
);
ret
=
AVERROR_UNKNOWN
;
goto
fail
;
}
ret
=
qsv_device_init
(
ctx
);
if
(
ret
<
0
)
goto
fail
;
if
(
s
->
handle_type
!=
handle_type
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error in child device handle setup: "
"type mismatch (%d != %d).
\n
"
,
s
->
handle_type
,
handle_type
);
err
=
AVERROR_UNKNOWN
;
goto
fail
;
}
return
0
;
fail:
if
(
hwctx
->
session
)
MFXClose
(
hwctx
->
session
);
return
ret
;
}
static
int
qsv_device_derive
(
AVHWDeviceContext
*
ctx
,
AVHWDeviceContext
*
child_device_ctx
,
int
flags
)
{
return
qsv_device_derive_from_child
(
ctx
,
MFX_IMPL_HARDWARE_ANY
,
child_device_ctx
,
flags
);
}
static
int
qsv_device_create
(
AVHWDeviceContext
*
ctx
,
const
char
*
device
,
AVDictionary
*
opts
,
int
flags
)
{
QSVDevicePriv
*
priv
;
enum
AVHWDeviceType
child_device_type
;
AVHWDeviceContext
*
child_device
;
AVDictionaryEntry
*
e
;
mfxIMPL
impl
;
int
ret
;
priv
=
av_mallocz
(
sizeof
(
*
priv
));
if
(
!
priv
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -830,32 +905,11 @@ static int qsv_device_create(AVHWDeviceContext *ctx, const char *device,
if
(
ret
<
0
)
return
ret
;
{
AVHWDeviceContext
*
child_device_ctx
=
(
AVHWDeviceContext
*
)
priv
->
child_device_ctx
->
data
;
#if CONFIG_VAAPI
AVVAAPIDeviceContext
*
child_device_hwctx
=
child_device_ctx
->
hwctx
;
handle_type
=
MFX_HANDLE_VA_DISPLAY
;
handle
=
(
mfxHDL
)
child_device_hwctx
->
display
;
#elif CONFIG_DXVA2
AVDXVA2DeviceContext
*
child_device_hwctx
=
child_device_ctx
->
hwctx
;
handle_type
=
MFX_HANDLE_D3D9_DEVICE_MANAGER
;
handle
=
(
mfxHDL
)
child_device_hwctx
->
devmgr
;
#endif
}
child_device
=
(
AVHWDeviceContext
*
)
priv
->
child_device_ctx
->
data
;
impl
=
choose_implementation
(
device
);
err
=
MFXInit
(
impl
,
&
ver
,
&
hwctx
->
session
);
if
(
err
!=
MFX_ERR_NONE
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Error initializing an MFX session
\n
"
);
return
AVERROR_UNKNOWN
;
}
err
=
MFXVideoCORE_SetHandle
(
hwctx
->
session
,
handle_type
,
handle
);
if
(
err
!=
MFX_ERR_NONE
)
return
AVERROR_UNKNOWN
;
return
0
;
return
qsv_device_derive_from_child
(
ctx
,
impl
,
child_device
,
0
);
}
const
HWContextType
ff_hwcontext_type_qsv
=
{
...
...
@@ -868,6 +922,7 @@ const HWContextType ff_hwcontext_type_qsv = {
.
frames_priv_size
=
sizeof
(
QSVFramesContext
),
.
device_create
=
qsv_device_create
,
.
device_derive
=
qsv_device_derive
,
.
device_init
=
qsv_device_init
,
.
frames_get_constraints
=
qsv_frames_get_constraints
,
.
frames_init
=
qsv_frames_init
,
...
...
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