Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
55fbe11e
Commit
55fbe11e
authored
Mar 05, 2014
by
Felix Paul Kühne
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/vda: cosmetics
parent
7a3a03a9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
108 additions
and
100 deletions
+108
-100
modules/codec/avcodec/vda.c
modules/codec/avcodec/vda.c
+108
-100
No files found.
modules/codec/avcodec/vda.c
View file @
55fbe11e
/*****************************************************************************
* vda.c: VDA helpers for the libavcodec decoder
*****************************************************************************
* Copyright
© 2012
VideoLAN
* Copyright
(C) 2012-2014 VLC authors
VideoLAN
*
* Authors: Sebastien Zwickert <dilaroga@free.fr>
* Rémi Denis-Courmont <remi # remlab : net>
* Felix Paul Kühne <fkuehne # videolan org>
* David Fuhrmann <david.fuhrmann # googlemail com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
...
...
@@ -39,8 +42,14 @@
#include <libavcodec/vda.h>
#include <VideoDecodeAcceleration/VDADecoder.h>
#pragma mark prototypes and definitions
static
int
Open
(
vlc_va_t
*
,
AVCodecContext
*
,
const
es_format_t
*
);
static
void
Close
(
vlc_va_t
*
);
static
int
Setup
(
vlc_va_t
*
,
void
**
,
vlc_fourcc_t
*
,
int
,
int
);
static
int
Get
(
vlc_va_t
*
,
void
**
,
uint8_t
**
);
static
int
Extract
(
vlc_va_t
*
,
picture_t
*
,
void
*
,
uint8_t
*
);
static
void
Release
(
void
*
,
uint8_t
*
);
static
const
int
nvda_pix_fmt_list
[]
=
{
0
,
1
};
static
const
char
*
const
nvda_pix_fmt_list_text
[]
=
...
...
@@ -79,73 +88,65 @@ static vlc_va_vda_t *vlc_va_vda_Get( vlc_va_t *p_va )
return
p_va
->
sys
;
}
/*****************************************************************************
* vda_Copy420YpCbCr8Planar: copy y420 CVPixelBuffer to picture_t
*****************************************************************************/
static
void
vda_Copy420YpCbCr8Planar
(
picture_t
*
p_pic
,
CVPixelBufferRef
buffer
,
unsigned
i_width
,
unsigned
i_height
,
copy_cache_t
*
cache
)
{
uint8_t
*
pp_plane
[
3
];
size_t
pi_pitch
[
3
];
#pragma mark - module handling
if
(
!
buffer
)
return
;
CVPixelBufferLockBaseAddress
(
buffer
,
0
);
static
int
Open
(
vlc_va_t
*
external
,
AVCodecContext
*
ctx
,
const
es_format_t
*
fmt
)
{
msg_Dbg
(
external
,
"opening VDA module"
);
if
(
ctx
->
codec_id
!=
AV_CODEC_ID_H264
)
{
msg_Warn
(
external
,
"input codec isn't H264, canceling VDA decoding"
);
return
VLC_EGENERIC
;
}
for
(
int
i
=
0
;
i
<
3
;
i
++
)
if
(
fmt
->
p_extra
==
NULL
||
fmt
->
i_extra
<
7
)
{
pp_plane
[
i
]
=
CVPixelBufferGetBaseAddressOfPlane
(
buffer
,
i
);
pi_pitch
[
i
]
=
CVPixelBufferGetBytesPerRowOfPlane
(
buffer
,
i
)
;
msg_Warn
(
external
,
"VDA requires extradata."
);
return
VLC_EGENERIC
;
}
CopyFromYv12
(
p_pic
,
pp_plane
,
pi_pitch
,
i_width
,
i_height
,
cache
);
vlc_va_vda_t
*
p_va
=
calloc
(
1
,
sizeof
(
*
p_va
)
);
if
(
!
p_va
)
return
VLC_EGENERIC
;
CVPixelBufferUnlockBaseAddress
(
buffer
,
0
);
p_va
->
p_log
=
VLC_OBJECT
(
external
);
p_va
->
p_extradata
=
fmt
->
p_extra
;
p_va
->
i_extradata
=
fmt
->
i_extra
;
external
->
sys
=
p_va
;
external
->
description
=
(
char
*
)
"VDA"
;
external
->
pix_fmt
=
PIX_FMT_VDA_VLD
;
external
->
setup
=
Setup
;
external
->
get
=
Get
;
external
->
release
=
Release
;
external
->
extract
=
Extract
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* vda_Copy422YpCbCr8: copy 2vuy CVPixelBuffer to picture_t
*****************************************************************************/
static
void
vda_Copy422YpCbCr8
(
picture_t
*
p_pic
,
CVPixelBufferRef
buffer
)
static
void
Close
(
vlc_va_t
*
external
)
{
int
i_plane
,
i_line
,
i_dst_stride
,
i_src_stride
;
uint8_t
*
p_dst
,
*
p_src
;
CVPixelBufferLockBaseAddress
(
buffer
,
0
);
vlc_va_vda_t
*
p_va
=
vlc_va_vda_Get
(
external
);
for
(
i_plane
=
0
;
i_plane
<
p_pic
->
i_planes
;
i_plane
++
)
{
p_dst
=
p_pic
->
p
[
i_plane
].
p_pixels
;
p_src
=
CVPixelBufferGetBaseAddressOfPlane
(
buffer
,
i_plane
);
i_dst_stride
=
p_pic
->
p
[
i_plane
].
i_pitch
;
i_src_stride
=
CVPixelBufferGetBytesPerRowOfPlane
(
buffer
,
i_plane
);
msg_Dbg
(
p_va
->
p_log
,
"destroying VDA decoder"
);
for
(
i_line
=
0
;
i_line
<
p_pic
->
p
[
i_plane
].
i_visible_lines
;
i_line
++
)
{
memcpy
(
p_dst
,
p_src
,
i_src_stride
);
ff_vda_destroy_decoder
(
&
p_va
->
hw_ctx
)
;
p_src
+=
i_src_stride
;
p_dst
+=
i_dst_stride
;
}
}
if
(
p_va
->
hw_ctx
.
cv_pix_fmt_type
==
kCVPixelFormatType_420YpCbCr8Planar
)
CopyCleanCache
(
&
p_va
->
image_cache
);
CVPixelBufferUnlockBaseAddress
(
buffer
,
0
);
free
(
p_va
);
}
static
int
Setup
(
vlc_va_t
*
external
,
void
**
pp_hw_ctx
,
vlc_fourcc_t
*
pi_chroma
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
)
{
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
&&
p_va
->
hw_ctx
.
decoder
)
&&
p_va
->
hw_ctx
.
height
==
i_height
&&
p_va
->
hw_ctx
.
decoder
)
{
*
pp_hw_ctx
=
&
p_va
->
hw_ctx
;
*
pi_chroma
=
p_va
->
i_chroma
;
...
...
@@ -189,8 +190,8 @@ ok:
/* create the decoder */
int
status
=
ff_vda_create_decoder
(
&
p_va
->
hw_ctx
,
p_va
->
p_extradata
,
p_va
->
i_extradata
);
p_va
->
p_extradata
,
p_va
->
i_extradata
);
if
(
status
)
{
msg_Err
(
p_va
->
p_log
,
"Failed to create decoder: %i"
,
status
);
...
...
@@ -198,10 +199,66 @@ ok:
}
else
msg_Dbg
(
p_va
->
p_log
,
"VDA decoder created"
);
return
VLC_SUCCESS
;
}
#pragma mark - actual data handling
static
void
vda_Copy420YpCbCr8Planar
(
picture_t
*
p_pic
,
CVPixelBufferRef
buffer
,
unsigned
i_width
,
unsigned
i_height
,
copy_cache_t
*
cache
)
{
uint8_t
*
pp_plane
[
3
];
size_t
pi_pitch
[
3
];
if
(
!
buffer
)
return
;
CVPixelBufferLockBaseAddress
(
buffer
,
0
);
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
pp_plane
[
i
]
=
CVPixelBufferGetBaseAddressOfPlane
(
buffer
,
i
);
pi_pitch
[
i
]
=
CVPixelBufferGetBytesPerRowOfPlane
(
buffer
,
i
);
}
CopyFromYv12
(
p_pic
,
pp_plane
,
pi_pitch
,
i_width
,
i_height
,
cache
);
CVPixelBufferUnlockBaseAddress
(
buffer
,
0
);
}
static
void
vda_Copy422YpCbCr8
(
picture_t
*
p_pic
,
CVPixelBufferRef
buffer
)
{
int
i_dst_stride
,
i_src_stride
;
uint8_t
*
p_dst
,
*
p_src
;
CVPixelBufferLockBaseAddress
(
buffer
,
0
);
for
(
int
i_plane
=
0
;
i_plane
<
p_pic
->
i_planes
;
i_plane
++
)
{
p_dst
=
p_pic
->
p
[
i_plane
].
p_pixels
;
p_src
=
CVPixelBufferGetBaseAddressOfPlane
(
buffer
,
i_plane
);
i_dst_stride
=
p_pic
->
p
[
i_plane
].
i_pitch
;
i_src_stride
=
CVPixelBufferGetBytesPerRowOfPlane
(
buffer
,
i_plane
);
for
(
int
i_line
=
0
;
i_line
<
p_pic
->
p
[
i_plane
].
i_visible_lines
;
i_line
++
)
{
memcpy
(
p_dst
,
p_src
,
i_src_stride
);
p_src
+=
i_src_stride
;
p_dst
+=
i_dst_stride
;
}
}
CVPixelBufferUnlockBaseAddress
(
buffer
,
0
);
}
static
int
Get
(
vlc_va_t
*
external
,
void
**
opaque
,
uint8_t
**
data
)
{
VLC_UNUSED
(
external
);
...
...
@@ -257,52 +314,3 @@ static void Release( void *opaque, uint8_t *data )
#endif
(
void
)
opaque
;
(
void
)
data
;
}
static
void
Close
(
vlc_va_t
*
external
)
{
vlc_va_vda_t
*
p_va
=
vlc_va_vda_Get
(
external
);
msg_Dbg
(
p_va
->
p_log
,
"destroying VDA decoder"
);
ff_vda_destroy_decoder
(
&
p_va
->
hw_ctx
)
;
if
(
p_va
->
hw_ctx
.
cv_pix_fmt_type
==
kCVPixelFormatType_420YpCbCr8Planar
)
CopyCleanCache
(
&
p_va
->
image_cache
);
free
(
p_va
);
}
static
int
Open
(
vlc_va_t
*
external
,
AVCodecContext
*
ctx
,
const
es_format_t
*
fmt
)
{
msg_Dbg
(
external
,
"opening VDA module"
);
if
(
ctx
->
codec_id
!=
AV_CODEC_ID_H264
)
{
msg_Warn
(
external
,
"input codec isn't H264, canceling VDA decoding"
);
return
VLC_EGENERIC
;
}
if
(
fmt
->
p_extra
==
NULL
||
fmt
->
i_extra
<
7
)
{
msg_Warn
(
external
,
"VDA requires extradata."
);
return
VLC_EGENERIC
;
}
vlc_va_vda_t
*
p_va
=
calloc
(
1
,
sizeof
(
*
p_va
)
);
if
(
!
p_va
)
return
VLC_EGENERIC
;
p_va
->
p_log
=
VLC_OBJECT
(
external
);
p_va
->
p_extradata
=
fmt
->
p_extra
;
p_va
->
i_extradata
=
fmt
->
i_extra
;
external
->
sys
=
p_va
;
external
->
description
=
(
char
*
)
"VDA"
;
external
->
pix_fmt
=
PIX_FMT_VDA_VLD
;
external
->
setup
=
Setup
;
external
->
get
=
Get
;
external
->
release
=
Release
;
external
->
extract
=
Extract
;
return
VLC_SUCCESS
;
}
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