Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
c61b433a
Commit
c61b433a
authored
Sep 13, 2014
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: pass AVCodecContext to VA setup callback
parent
ee961d8f
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
49 additions
and
68 deletions
+49
-68
modules/codec/avcodec/dxva2.c
modules/codec/avcodec/dxva2.c
+8
-8
modules/codec/avcodec/va.h
modules/codec/avcodec/va.h
+5
-8
modules/codec/avcodec/vaapi.c
modules/codec/avcodec/vaapi.c
+9
-9
modules/codec/avcodec/vda.c
modules/codec/avcodec/vda.c
+14
-22
modules/codec/avcodec/video.c
modules/codec/avcodec/video.c
+3
-8
modules/hw/vdpau/avcodec.c
modules/hw/vdpau/avcodec.c
+10
-13
No files found.
modules/codec/avcodec/dxva2.c
View file @
c61b433a
...
...
@@ -309,28 +309,28 @@ static void DxCreateVideoConversion(vlc_va_sys_t *);
static
void
DxDestroyVideoConversion
(
vlc_va_sys_t
*
);
/* */
static
int
Setup
(
vlc_va_t
*
va
,
void
**
hw
,
vlc_fourcc_t
*
chroma
,
int
width
,
int
height
)
static
int
Setup
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
chroma
)
{
vlc_va_sys_t
*
sys
=
va
->
sys
;
if
(
sys
->
width
==
width
&&
sys
->
height
==
height
&&
sys
->
decoder
)
if
(
sys
->
width
==
avctx
->
coded_width
&&
sys
->
height
==
avctx
->
coded_height
&&
sys
->
decoder
!=
NULL
)
goto
ok
;
/* */
DxDestroyVideoConversion
(
sys
);
DxDestroyVideoDecoder
(
sys
);
*
hw
=
NULL
;
avctx
->
hwaccel_context
=
NULL
;
*
chroma
=
0
;
if
(
width
<=
0
||
height
<=
0
)
if
(
avctx
->
coded_width
<=
0
||
avctx
->
coded_
height
<=
0
)
return
VLC_EGENERIC
;
/* FIXME transmit a video_format_t by VaSetup directly */
video_format_t
fmt
;
memset
(
&
fmt
,
0
,
sizeof
(
fmt
));
fmt
.
i_width
=
width
;
fmt
.
i_height
=
height
;
fmt
.
i_width
=
avctx
->
coded_
width
;
fmt
.
i_height
=
avctx
->
coded_
height
;
if
(
DxCreateVideoDecoder
(
va
,
sys
->
codec_id
,
&
fmt
))
return
VLC_EGENERIC
;
...
...
@@ -345,7 +345,7 @@ static int Setup(vlc_va_t *va, void **hw, vlc_fourcc_t *chroma,
/* */
ok:
*
hw
=
&
sys
->
hw
;
avctx
->
hwaccel_context
=
&
sys
->
hw
;
const
d3d_format_t
*
output
=
D3dFindFormat
(
sys
->
output
);
*
chroma
=
output
->
codec
;
...
...
modules/codec/avcodec/va.h
View file @
c61b433a
...
...
@@ -35,8 +35,7 @@ struct vlc_va_t {
const
char
*
description
;
int
pix_fmt
;
int
(
*
setup
)(
vlc_va_t
*
,
void
**
hw
,
vlc_fourcc_t
*
output
,
int
width
,
int
height
);
int
(
*
setup
)(
vlc_va_t
*
,
AVCodecContext
*
,
vlc_fourcc_t
*
output
);
int
(
*
get
)(
vlc_va_t
*
,
void
**
opaque
,
uint8_t
**
data
);
void
(
*
release
)(
void
*
opaque
,
uint8_t
*
surface
);
int
(
*
extract
)(
vlc_va_t
*
,
picture_t
*
dst
,
void
*
opaque
,
uint8_t
*
data
);
...
...
@@ -52,16 +51,14 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *, const es_format_t *fmt
/**
* Initializes the acceleration video decoding back-end for libavcodec.
* @param
hw pointer to libavcodec hardware context pointer [OUT]
* @param
avctx libavcodec codec context
* @param output pointer to video chroma output by the back-end [OUT]
* @param width coded video width in pixels
* @param height coded video height in pixels
* @return VLC_SUCCESS on success, otherwise an error code.
*/
static
inline
int
vlc_va_Setup
(
vlc_va_t
*
va
,
void
**
hw
,
vlc_fourcc_t
*
output
,
int
width
,
int
heigh
t
)
static
inline
int
vlc_va_Setup
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
outpu
t
)
{
return
va
->
setup
(
va
,
hw
,
output
,
width
,
heigh
t
);
return
va
->
setup
(
va
,
avctx
,
outpu
t
);
}
/**
...
...
modules/codec/avcodec/vaapi.c
View file @
c61b433a
...
...
@@ -392,28 +392,28 @@ static void Release( void *opaque, uint8_t *data )
(
void
)
data
;
}
static
int
Setup
(
vlc_va_t
*
va
,
void
**
pp_hw_ctx
,
vlc_fourcc_t
*
pi_chroma
,
int
i_width
,
int
i_height
)
static
int
Setup
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
pi_chroma
)
{
vlc_va_sys_t
*
sys
=
va
->
sys
;
if
(
sys
->
i_surface_width
==
i
_width
&&
sys
->
i_surface_height
==
i
_height
)
if
(
sys
->
i_surface_width
==
avctx
->
coded
_width
&&
sys
->
i_surface_height
==
avctx
->
coded
_height
)
{
*
pp_hw_ctx
=
&
sys
->
hw_ctx
;
avctx
->
hwaccel_context
=
&
sys
->
hw_ctx
;
*
pi_chroma
=
sys
->
i_surface_chroma
;
return
VLC_SUCCESS
;
}
*
pp_hw_ctx
=
NULL
;
avctx
->
hwaccel_context
=
NULL
;
*
pi_chroma
=
0
;
if
(
sys
->
i_surface_width
||
sys
->
i_surface_height
)
DestroySurfaces
(
sys
);
if
(
i_width
>
0
&&
i_height
>
0
)
return
CreateSurfaces
(
sys
,
pp_hw_ctx
,
pi_chroma
,
i_width
,
i_height
);
if
(
avctx
->
coded_width
<=
0
&&
avctx
->
coded_height
<=
0
)
return
VLC_EGENERIC
;
return
CreateSurfaces
(
sys
,
&
avctx
->
hwaccel_context
,
pi_chroma
,
avctx
->
coded_width
,
avctx
->
coded_height
);
}
static
void
Delete
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
)
...
...
modules/codec/avcodec/vda.c
View file @
c61b433a
...
...
@@ -169,16 +169,16 @@ static void Close( vlc_va_t *external, AVCodecContext *ctx )
(
void
)
ctx
;
}
static
int
Setup
(
vlc_va_t
*
external
,
void
**
pp_hw_ctx
,
vlc_fourcc_t
*
pi_chroma
,
int
i_width
,
int
i_height
)
static
int
Setup
(
vlc_va_t
*
external
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
pi_chroma
)
{
vlc_va_vda_t
*
p_va
=
vlc_va_vda_Get
(
external
);
if
(
p_va
->
hw_ctx
.
width
==
i
_width
&&
p_va
->
hw_ctx
.
height
==
i
_height
if
(
p_va
->
hw_ctx
.
width
==
avctx
->
coded
_width
&&
p_va
->
hw_ctx
.
height
==
avctx
->
codec
_height
&&
p_va
->
hw_ctx
.
decoder
)
{
*
pp_hw_ctx
=
&
p_va
->
hw_ctx
;
avctx
->
hwaccel_context
=
&
p_va
->
hw_ctx
;
*
pi_chroma
=
p_va
->
i_chroma
;
return
VLC_SUCCESS
;
}
...
...
@@ -206,17 +206,17 @@ static int Setup( vlc_va_t *external, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
default
:
p_va
->
hw_ctx
.
cv_pix_fmt_type
=
kCVPixelFormatType_420YpCbCr8Planar
;
p_va
->
i_chroma
=
VLC_CODEC_I420
;
CopyInitCache
(
&
p_va
->
image_cache
,
i
_width
);
CopyInitCache
(
&
p_va
->
image_cache
,
avctx
->
coded
_width
);
msg_Dbg
(
p_va
->
p_log
,
"using pixel format 420YpCbCr8Planar"
);
}
ok:
/* Setup the libavcodec hardware context */
*
pp_hw_ctx
=
&
p_va
->
hw_ctx
;
avctx
->
hwaccel_context
=
&
p_va
->
hw_ctx
;
*
pi_chroma
=
p_va
->
i_chroma
;
p_va
->
hw_ctx
.
width
=
i
_width
;
p_va
->
hw_ctx
.
height
=
i
_height
;
p_va
->
hw_ctx
.
width
=
avctx
->
coded
_width
;
p_va
->
hw_ctx
.
height
=
avctx
->
coded
_height
;
/* create the decoder */
int
status
=
ff_vda_create_decoder
(
&
p_va
->
hw_ctx
,
...
...
@@ -374,22 +374,14 @@ static void Close( vlc_va_t *external, AVCodecContext *avctx )
(
void
)
external
;
}
static
int
Setup
(
vlc_va_t
*
external
,
void
**
pp_hw_ctx
,
vlc_fourcc_t
*
pi_chroma
,
int
i_width
,
int
i_height
)
static
int
Setup
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
p_chroma
)
{
VLC_UNUSED
(
pp_hw_ctx
);
vlc_va_vda_t
*
p_va
=
vlc_va_vda_Get
(
external
);
*
pi_chroma
=
VLC_CODEC_UYVY
;
av_vda_default_free
(
p_va
->
avctx
);
if
(
av_vda_default_init
(
p_va
->
avctx
)
<
0
)
return
VLC_EGENERIC
;
av_vda_default_free
(
avctx
);
(
void
)
i_width
;
(
void
)
i_height
;
(
void
)
va
;
*
p_chroma
=
VLC_CODEC_UYVY
;
return
VLC_SUCCESS
;
return
(
av_vda_default_init
(
avctx
)
<
0
)
?
VLC_EGENERIC
:
VLC_SUCCESS
;
}
// Never called
...
...
modules/codec/avcodec/video.c
View file @
c61b433a
...
...
@@ -959,8 +959,7 @@ static int lavc_va_GetFrame(struct AVCodecContext *ctx, AVFrame *frame,
decoder_sys_t
*
sys
=
dec
->
p_sys
;
vlc_va_t
*
va
=
sys
->
p_va
;
if
(
vlc_va_Setup
(
va
,
&
ctx
->
hwaccel_context
,
&
dec
->
fmt_out
.
video
.
i_chroma
,
ctx
->
coded_width
,
ctx
->
coded_height
))
if
(
vlc_va_Setup
(
va
,
ctx
,
&
dec
->
fmt_out
.
video
.
i_chroma
))
{
msg_Err
(
dec
,
"hardware acceleration setup failed"
);
return
-
1
;
...
...
@@ -1154,9 +1153,7 @@ static int ffmpeg_va_GetFrameBuf( struct AVCodecContext *p_context, AVFrame *p_f
vlc_va_t
*
p_va
=
p_sys
->
p_va
;
/* hwaccel_context is not present in old ffmpeg version */
if
(
vlc_va_Setup
(
p_va
,
&
p_context
->
hwaccel_context
,
&
p_dec
->
fmt_out
.
video
.
i_chroma
,
p_context
->
coded_width
,
p_context
->
coded_height
)
)
if
(
vlc_va_Setup
(
p_va
,
p_context
,
&
p_dec
->
fmt_out
.
video
.
i_chroma
)
)
{
msg_Err
(
p_dec
,
"vlc_va_Setup failed"
);
return
-
1
;
...
...
@@ -1362,9 +1359,7 @@ static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_context,
/* We try to call vlc_va_Setup when possible to detect errors when
* possible (later is too late) */
if
(
p_context
->
width
>
0
&&
p_context
->
height
>
0
&&
vlc_va_Setup
(
p_va
,
&
p_context
->
hwaccel_context
,
&
p_dec
->
fmt_out
.
video
.
i_chroma
,
p_context
->
width
,
p_context
->
height
)
)
&&
vlc_va_Setup
(
p_va
,
p_context
,
&
p_dec
->
fmt_out
.
video
.
i_chroma
)
)
{
msg_Err
(
p_dec
,
"acceleration setup failure"
);
break
;
...
...
modules/hw/vdpau/avcodec.c
View file @
c61b433a
...
...
@@ -108,16 +108,13 @@ static int Copy(vlc_va_t *va, picture_t *pic, void *opaque, uint8_t *data)
return
VLC_SUCCESS
;
}
static
int
Init
(
vlc_va_t
*
va
,
void
**
ctxp
,
vlc_fourcc_t
*
chromap
,
int
width
,
int
height
)
static
int
Init
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
chromap
)
{
vlc_va_sys_t
*
sys
=
va
->
sys
;
VdpStatus
err
;
width
=
(
width
+
1
)
&
~
1
;
height
=
(
height
+
3
)
&
~
3
;
sys
->
width
=
width
;
sys
->
height
=
height
;
sys
->
width
=
(
avctx
->
coded_width
+
1
)
&
~
1
;
sys
->
height
=
(
avctx
->
coded_height
+
3
)
&
~
3
;
unsigned
surfaces
=
2
;
switch
(
sys
->
profile
)
...
...
@@ -129,8 +126,8 @@ static int Init(vlc_va_t *va, void **ctxp, vlc_fourcc_t *chromap,
break
;
}
err
=
vdp_decoder_create
(
sys
->
vdp
,
sys
->
device
,
sys
->
profile
,
width
,
height
,
surfaces
,
&
sys
->
context
->
decoder
);
err
=
vdp_decoder_create
(
sys
->
vdp
,
sys
->
device
,
sys
->
profile
,
sys
->
width
,
sys
->
height
,
surfaces
,
&
sys
->
context
->
decoder
);
if
(
err
!=
VDP_STATUS_OK
)
{
msg_Err
(
va
,
"%s creation failure: %s"
,
"decoder"
,
...
...
@@ -139,7 +136,7 @@ static int Init(vlc_va_t *va, void **ctxp, vlc_fourcc_t *chromap,
return
VLC_EGENERIC
;
}
*
ctxp
=
sys
->
context
;
avctx
->
hwaccel_context
=
sys
->
context
;
/* TODO: select better chromas when appropriate */
*
chromap
=
VLC_CODEC_VDPAU_VIDEO_420
;
return
VLC_SUCCESS
;
...
...
@@ -153,20 +150,20 @@ static void Deinit(vlc_va_t *va)
vdp_decoder_destroy
(
sys
->
vdp
,
sys
->
context
->
decoder
);
}
static
int
Setup
(
vlc_va_t
*
va
,
void
**
ctxp
,
vlc_fourcc_t
*
chromap
,
int
width
,
int
height
)
static
int
Setup
(
vlc_va_t
*
va
,
AVCodecContext
*
avctx
,
vlc_fourcc_t
*
chromap
)
{
vlc_va_sys_t
*
sys
=
va
->
sys
;
if
(
sys
->
context
->
decoder
!=
VDP_INVALID_HANDLE
)
{
if
(
sys
->
width
==
width
&&
sys
->
height
==
height
)
if
(
sys
->
width
==
avctx
->
coded_width
&&
sys
->
height
==
avctx
->
coded_height
)
return
VLC_SUCCESS
;
Deinit
(
va
);
sys
->
context
->
decoder
=
VDP_INVALID_HANDLE
;
}
return
Init
(
va
,
ctxp
,
chromap
,
width
,
height
);
return
Init
(
va
,
avctx
,
chromap
);
}
static
int
Open
(
vlc_va_t
*
va
,
AVCodecContext
*
ctx
,
const
es_format_t
*
fmt
)
...
...
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