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
3d4f8b91
Commit
3d4f8b91
authored
Sep 26, 2017
by
Aman Gupta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/videotoolbox: add hevc support
Signed-off-by:
Aman Gupta
<
aman@tmm1.net
>
parent
c32077c0
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
219 additions
and
2 deletions
+219
-2
configure
configure
+6
-1
allcodecs.c
libavcodec/allcodecs.c
+1
-0
hevc_refs.c
libavcodec/hevc_refs.c
+3
-0
hevcdec.c
libavcodec/hevcdec.c
+11
-1
vda_vt_internal.h
libavcodec/vda_vt_internal.h
+1
-0
videotoolbox.c
libavcodec/videotoolbox.c
+197
-0
No files found.
configure
View file @
3d4f8b91
...
@@ -2081,6 +2081,7 @@ TOOLCHAIN_FEATURES="
...
@@ -2081,6 +2081,7 @@ TOOLCHAIN_FEATURES="
TYPES_LIST
=
"
TYPES_LIST
=
"
CONDITION_VARIABLE_Ptr
CONDITION_VARIABLE_Ptr
kCMVideoCodecType_HEVC
socklen_t
socklen_t
struct_addrinfo
struct_addrinfo
struct_group_source_req
struct_group_source_req
...
@@ -2696,6 +2697,8 @@ hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC"
...
@@ -2696,6 +2697,8 @@ hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC"
hevc_vaapi_hwaccel_select
=
"hevc_decoder"
hevc_vaapi_hwaccel_select
=
"hevc_decoder"
hevc_vdpau_hwaccel_deps
=
"vdpau VdpPictureInfoHEVC"
hevc_vdpau_hwaccel_deps
=
"vdpau VdpPictureInfoHEVC"
hevc_vdpau_hwaccel_select
=
"hevc_decoder"
hevc_vdpau_hwaccel_select
=
"hevc_decoder"
hevc_videotoolbox_hwaccel_deps
=
"videotoolbox"
hevc_videotoolbox_hwaccel_select
=
"hevc_decoder"
mjpeg_cuvid_hwaccel_deps
=
"cuda cuvid"
mjpeg_cuvid_hwaccel_deps
=
"cuda cuvid"
mjpeg_cuvid_hwaccel_select
=
"mjpeg_cuvid_decoder"
mjpeg_cuvid_hwaccel_select
=
"mjpeg_cuvid_decoder"
mpeg_xvmc_hwaccel_deps
=
"xvmc"
mpeg_xvmc_hwaccel_deps
=
"xvmc"
...
@@ -5814,8 +5817,10 @@ enabled avfoundation && {
...
@@ -5814,8 +5817,10 @@ enabled avfoundation && {
check_lib avfoundation CoreGraphics/CoreGraphics.h CGGetActiveDisplayList
"-framework CoreGraphics"
||
check_lib avfoundation CoreGraphics/CoreGraphics.h CGGetActiveDisplayList
"-framework CoreGraphics"
||
check_lib avfoundation ApplicationServices/ApplicationServices.h CGGetActiveDisplayList
"-framework ApplicationServices"
;
}
check_lib avfoundation ApplicationServices/ApplicationServices.h CGGetActiveDisplayList
"-framework ApplicationServices"
;
}
enabled videotoolbox
&&
enabled videotoolbox
&&
{
check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString
"-framework CoreServices"
check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString
"-framework CoreServices"
check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC
"-framework CoreMedia"
}
check_struct
"sys/time.h sys/resource.h"
"struct rusage"
ru_maxrss
check_struct
"sys/time.h sys/resource.h"
"struct rusage"
ru_maxrss
...
...
libavcodec/allcodecs.c
View file @
3d4f8b91
...
@@ -84,6 +84,7 @@ static void register_all(void)
...
@@ -84,6 +84,7 @@ static void register_all(void)
REGISTER_HWACCEL
(
HEVC_QSV
,
hevc_qsv
);
REGISTER_HWACCEL
(
HEVC_QSV
,
hevc_qsv
);
REGISTER_HWACCEL
(
HEVC_VAAPI
,
hevc_vaapi
);
REGISTER_HWACCEL
(
HEVC_VAAPI
,
hevc_vaapi
);
REGISTER_HWACCEL
(
HEVC_VDPAU
,
hevc_vdpau
);
REGISTER_HWACCEL
(
HEVC_VDPAU
,
hevc_vdpau
);
REGISTER_HWACCEL
(
HEVC_VIDEOTOOLBOX
,
hevc_videotoolbox
);
REGISTER_HWACCEL
(
MJPEG_CUVID
,
mjpeg_cuvid
);
REGISTER_HWACCEL
(
MJPEG_CUVID
,
mjpeg_cuvid
);
REGISTER_HWACCEL
(
MPEG1_CUVID
,
mpeg1_cuvid
);
REGISTER_HWACCEL
(
MPEG1_CUVID
,
mpeg1_cuvid
);
REGISTER_HWACCEL
(
MPEG1_XVMC
,
mpeg1_xvmc
);
REGISTER_HWACCEL
(
MPEG1_XVMC
,
mpeg1_xvmc
);
...
...
libavcodec/hevc_refs.c
View file @
3d4f8b91
...
@@ -208,6 +208,9 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
...
@@ -208,6 +208,9 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
if
(
nb_output
)
{
if
(
nb_output
)
{
HEVCFrame
*
frame
=
&
s
->
DPB
[
min_idx
];
HEVCFrame
*
frame
=
&
s
->
DPB
[
min_idx
];
if
(
frame
->
frame
->
format
==
AV_PIX_FMT_VIDEOTOOLBOX
&&
frame
->
frame
->
buf
[
0
]
->
size
==
1
)
return
0
;
ret
=
av_frame_ref
(
out
,
frame
->
frame
);
ret
=
av_frame_ref
(
out
,
frame
->
frame
);
if
(
frame
->
flags
&
HEVC_FRAME_FLAG_BUMPING
)
if
(
frame
->
flags
&
HEVC_FRAME_FLAG_BUMPING
)
ff_hevc_unref_frame
(
s
,
frame
,
HEVC_FRAME_FLAG_OUTPUT
|
HEVC_FRAME_FLAG_BUMPING
);
ff_hevc_unref_frame
(
s
,
frame
,
HEVC_FRAME_FLAG_OUTPUT
|
HEVC_FRAME_FLAG_BUMPING
);
...
...
libavcodec/hevcdec.c
View file @
3d4f8b91
...
@@ -352,7 +352,11 @@ static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
...
@@ -352,7 +352,11 @@ static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
static
enum
AVPixelFormat
get_format
(
HEVCContext
*
s
,
const
HEVCSPS
*
sps
)
static
enum
AVPixelFormat
get_format
(
HEVCContext
*
s
,
const
HEVCSPS
*
sps
)
{
{
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + CONFIG_HEVC_D3D11VA_HWACCEL * 2 + CONFIG_HEVC_VAAPI_HWACCEL + CONFIG_HEVC_VDPAU_HWACCEL)
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
CONFIG_HEVC_VAAPI_HWACCEL + \
CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
CONFIG_HEVC_VDPAU_HWACCEL)
enum
AVPixelFormat
pix_fmts
[
HWACCEL_MAX
+
2
],
*
fmt
=
pix_fmts
;
enum
AVPixelFormat
pix_fmts
[
HWACCEL_MAX
+
2
],
*
fmt
=
pix_fmts
;
switch
(
sps
->
pix_fmt
)
{
switch
(
sps
->
pix_fmt
)
{
...
@@ -370,6 +374,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
...
@@ -370,6 +374,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
#endif
#endif
#if CONFIG_HEVC_VDPAU_HWACCEL
#if CONFIG_HEVC_VDPAU_HWACCEL
*
fmt
++
=
AV_PIX_FMT_VDPAU
;
*
fmt
++
=
AV_PIX_FMT_VDPAU
;
#endif
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
*
fmt
++
=
AV_PIX_FMT_VIDEOTOOLBOX
;
#endif
#endif
break
;
break
;
case
AV_PIX_FMT_YUV420P10
:
case
AV_PIX_FMT_YUV420P10
:
...
@@ -382,6 +389,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
...
@@ -382,6 +389,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
#endif
#endif
#if CONFIG_HEVC_VAAPI_HWACCEL
#if CONFIG_HEVC_VAAPI_HWACCEL
*
fmt
++
=
AV_PIX_FMT_VAAPI
;
*
fmt
++
=
AV_PIX_FMT_VAAPI
;
#endif
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
*
fmt
++
=
AV_PIX_FMT_VIDEOTOOLBOX
;
#endif
#endif
break
;
break
;
}
}
...
...
libavcodec/vda_vt_internal.h
View file @
3d4f8b91
...
@@ -59,4 +59,5 @@ int ff_videotoolbox_h264_decode_slice(AVCodecContext *avctx,
...
@@ -59,4 +59,5 @@ int ff_videotoolbox_h264_decode_slice(AVCodecContext *avctx,
const
uint8_t
*
buffer
,
const
uint8_t
*
buffer
,
uint32_t
size
);
uint32_t
size
);
CFDataRef
ff_videotoolbox_avcc_extradata_create
(
AVCodecContext
*
avctx
);
CFDataRef
ff_videotoolbox_avcc_extradata_create
(
AVCodecContext
*
avctx
);
CFDataRef
ff_videotoolbox_hvcc_extradata_create
(
AVCodecContext
*
avctx
);
#endif
/* AVCODEC_VDA_VT_INTERNAL_H */
#endif
/* AVCODEC_VDA_VT_INTERNAL_H */
libavcodec/videotoolbox.c
View file @
3d4f8b91
...
@@ -32,6 +32,7 @@
...
@@ -32,6 +32,7 @@
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext.h"
#include "bytestream.h"
#include "bytestream.h"
#include "h264dec.h"
#include "h264dec.h"
#include "hevcdec.h"
#include "mpegvideo.h"
#include "mpegvideo.h"
#include <TargetConditionals.h>
#include <TargetConditionals.h>
...
@@ -39,6 +40,10 @@
...
@@ -39,6 +40,10 @@
# define kVTVideoDecoderSpecification_RequireHardwareAcceleratedVideoDecoder CFSTR("RequireHardwareAcceleratedVideoDecoder")
# define kVTVideoDecoderSpecification_RequireHardwareAcceleratedVideoDecoder CFSTR("RequireHardwareAcceleratedVideoDecoder")
#endif
#endif
#if !HAVE_KCMVIDEOCODECTYPE_HEVC
enum
{
kCMVideoCodecType_HEVC
=
'
hvc1
'
};
#endif
#define VIDEOTOOLBOX_ESDS_EXTRADATA_PADDING 12
#define VIDEOTOOLBOX_ESDS_EXTRADATA_PADDING 12
static
void
videotoolbox_buffer_release
(
void
*
opaque
,
uint8_t
*
data
)
static
void
videotoolbox_buffer_release
(
void
*
opaque
,
uint8_t
*
data
)
...
@@ -115,6 +120,164 @@ CFDataRef ff_videotoolbox_avcc_extradata_create(AVCodecContext *avctx)
...
@@ -115,6 +120,164 @@ CFDataRef ff_videotoolbox_avcc_extradata_create(AVCodecContext *avctx)
return
data
;
return
data
;
}
}
CFDataRef
ff_videotoolbox_hvcc_extradata_create
(
AVCodecContext
*
avctx
)
{
HEVCContext
*
h
=
avctx
->
priv_data
;
const
HEVCVPS
*
vps
=
(
const
HEVCVPS
*
)
h
->
ps
.
vps_list
[
0
]
->
data
;
const
HEVCSPS
*
sps
=
(
const
HEVCSPS
*
)
h
->
ps
.
sps_list
[
0
]
->
data
;
int
i
,
num_pps
=
0
;
const
HEVCPPS
*
pps
=
h
->
ps
.
pps
;
PTLCommon
ptlc
=
vps
->
ptl
.
general_ptl
;
VUI
vui
=
sps
->
vui
;
uint8_t
parallelismType
;
CFDataRef
data
=
NULL
;
uint8_t
*
p
;
int
vt_extradata_size
=
23
+
5
+
vps
->
data_size
+
5
+
sps
->
data_size
+
3
;
uint8_t
*
vt_extradata
;
for
(
i
=
0
;
i
<
MAX_PPS_COUNT
;
i
++
)
{
if
(
h
->
ps
.
pps_list
[
i
])
{
const
HEVCPPS
*
pps
=
(
const
HEVCPPS
*
)
h
->
ps
.
pps_list
[
i
]
->
data
;
vt_extradata_size
+=
2
+
pps
->
data_size
;
num_pps
++
;
}
}
vt_extradata
=
av_malloc
(
vt_extradata_size
);
if
(
!
vt_extradata
)
return
NULL
;
p
=
vt_extradata
;
/* unsigned int(8) configurationVersion = 1; */
AV_W8
(
p
+
0
,
1
);
/*
* unsigned int(2) general_profile_space;
* unsigned int(1) general_tier_flag;
* unsigned int(5) general_profile_idc;
*/
AV_W8
(
p
+
1
,
ptlc
.
profile_space
<<
6
|
ptlc
.
tier_flag
<<
5
|
ptlc
.
profile_idc
);
/* unsigned int(32) general_profile_compatibility_flags; */
memcpy
(
p
+
2
,
ptlc
.
profile_compatibility_flag
,
4
);
/* unsigned int(48) general_constraint_indicator_flags; */
AV_W8
(
p
+
6
,
ptlc
.
progressive_source_flag
<<
7
|
ptlc
.
interlaced_source_flag
<<
6
|
ptlc
.
non_packed_constraint_flag
<<
5
|
ptlc
.
frame_only_constraint_flag
<<
4
);
AV_W8
(
p
+
7
,
0
);
AV_WN32
(
p
+
8
,
0
);
/* unsigned int(8) general_level_idc; */
AV_W8
(
p
+
12
,
ptlc
.
level_idc
);
/*
* bit(4) reserved = ‘1111’b;
* unsigned int(12) min_spatial_segmentation_idc;
*/
AV_W8
(
p
+
13
,
0xf0
|
(
vui
.
min_spatial_segmentation_idc
>>
4
));
AV_W8
(
p
+
14
,
vui
.
min_spatial_segmentation_idc
&
0xff
);
/*
* bit(6) reserved = ‘111111’b;
* unsigned int(2) parallelismType;
*/
if
(
!
vui
.
min_spatial_segmentation_idc
)
parallelismType
=
0
;
else
if
(
pps
->
entropy_coding_sync_enabled_flag
&&
pps
->
tiles_enabled_flag
)
parallelismType
=
0
;
else
if
(
pps
->
entropy_coding_sync_enabled_flag
)
parallelismType
=
3
;
else
if
(
pps
->
tiles_enabled_flag
)
parallelismType
=
2
;
else
parallelismType
=
1
;
AV_W8
(
p
+
15
,
0xfc
|
parallelismType
);
/*
* bit(6) reserved = ‘111111’b;
* unsigned int(2) chromaFormat;
*/
AV_W8
(
p
+
16
,
sps
->
chroma_format_idc
|
0xfc
);
/*
* bit(5) reserved = ‘11111’b;
* unsigned int(3) bitDepthLumaMinus8;
*/
AV_W8
(
p
+
17
,
(
sps
->
bit_depth
-
8
)
|
0xfc
);
/*
* bit(5) reserved = ‘11111’b;
* unsigned int(3) bitDepthChromaMinus8;
*/
AV_W8
(
p
+
18
,
(
sps
->
bit_depth_chroma
-
8
)
|
0xfc
);
/* bit(16) avgFrameRate; */
AV_WB16
(
p
+
19
,
0
);
/*
* bit(2) constantFrameRate;
* bit(3) numTemporalLayers;
* bit(1) temporalIdNested;
* unsigned int(2) lengthSizeMinusOne;
*/
AV_W8
(
p
+
21
,
0
<<
6
|
sps
->
max_sub_layers
<<
3
|
sps
->
temporal_id_nesting_flag
<<
2
|
3
);
/* unsigned int(8) numOfArrays; */
AV_W8
(
p
+
22
,
3
);
p
+=
23
;
/* vps */
/*
* bit(1) array_completeness;
* unsigned int(1) reserved = 0;
* unsigned int(6) NAL_unit_type;
*/
AV_W8
(
p
,
1
<<
7
|
HEVC_NAL_VPS
&
0x3f
);
/* unsigned int(16) numNalus; */
AV_WB16
(
p
+
1
,
1
);
/* unsigned int(16) nalUnitLength; */
AV_WB16
(
p
+
3
,
vps
->
data_size
);
/* bit(8*nalUnitLength) nalUnit; */
memcpy
(
p
+
5
,
vps
->
data
,
vps
->
data_size
);
p
+=
5
+
vps
->
data_size
;
/* sps */
AV_W8
(
p
,
1
<<
7
|
HEVC_NAL_SPS
&
0x3f
);
AV_WB16
(
p
+
1
,
1
);
AV_WB16
(
p
+
3
,
sps
->
data_size
);
memcpy
(
p
+
5
,
sps
->
data
,
sps
->
data_size
);
p
+=
5
+
sps
->
data_size
;
/* pps */
AV_W8
(
p
,
1
<<
7
|
HEVC_NAL_PPS
&
0x3f
);
AV_WB16
(
p
+
1
,
num_pps
);
p
+=
3
;
for
(
i
=
0
;
i
<
MAX_PPS_COUNT
;
i
++
)
{
if
(
h
->
ps
.
pps_list
[
i
])
{
const
HEVCPPS
*
pps
=
(
const
HEVCPPS
*
)
h
->
ps
.
pps_list
[
i
]
->
data
;
AV_WB16
(
p
,
pps
->
data_size
);
memcpy
(
p
+
2
,
pps
->
data
,
pps
->
data_size
);
p
+=
2
+
pps
->
data_size
;
}
}
av_assert0
(
p
-
vt_extradata
==
vt_extradata_size
);
data
=
CFDataCreate
(
kCFAllocatorDefault
,
vt_extradata
,
vt_extradata_size
);
av_free
(
vt_extradata
);
return
data
;
}
int
ff_videotoolbox_buffer_create
(
VTContext
*
vtctx
,
AVFrame
*
frame
)
int
ff_videotoolbox_buffer_create
(
VTContext
*
vtctx
,
AVFrame
*
frame
)
{
{
av_buffer_unref
(
&
frame
->
buf
[
0
]);
av_buffer_unref
(
&
frame
->
buf
[
0
]);
...
@@ -445,6 +608,18 @@ static int videotoolbox_h264_end_frame(AVCodecContext *avctx)
...
@@ -445,6 +608,18 @@ static int videotoolbox_h264_end_frame(AVCodecContext *avctx)
return
videotoolbox_common_end_frame
(
avctx
,
frame
);
return
videotoolbox_common_end_frame
(
avctx
,
frame
);
}
}
static
int
videotoolbox_hevc_end_frame
(
AVCodecContext
*
avctx
)
{
HEVCContext
*
h
=
avctx
->
priv_data
;
AVFrame
*
frame
=
h
->
ref
->
frame
;
VTContext
*
vtctx
=
avctx
->
internal
->
hwaccel_priv_data
;
int
ret
;
ret
=
videotoolbox_common_end_frame
(
avctx
,
frame
);
vtctx
->
bitstream_size
=
0
;
return
ret
;
}
static
int
videotoolbox_mpeg_start_frame
(
AVCodecContext
*
avctx
,
static
int
videotoolbox_mpeg_start_frame
(
AVCodecContext
*
avctx
,
const
uint8_t
*
buffer
,
const
uint8_t
*
buffer
,
uint32_t
size
)
uint32_t
size
)
...
@@ -501,6 +676,11 @@ static CFDictionaryRef videotoolbox_decoder_config_create(CMVideoCodecType codec
...
@@ -501,6 +676,11 @@ static CFDictionaryRef videotoolbox_decoder_config_create(CMVideoCodecType codec
if
(
data
)
if
(
data
)
CFDictionarySetValue
(
avc_info
,
CFSTR
(
"avcC"
),
data
);
CFDictionarySetValue
(
avc_info
,
CFSTR
(
"avcC"
),
data
);
break
;
break
;
case
kCMVideoCodecType_HEVC
:
data
=
ff_videotoolbox_hvcc_extradata_create
(
avctx
);
if
(
data
)
CFDictionarySetValue
(
avc_info
,
CFSTR
(
"hvcC"
),
data
);
break
;
default:
default:
break
;
break
;
}
}
...
@@ -600,6 +780,9 @@ static int videotoolbox_default_init(AVCodecContext *avctx)
...
@@ -600,6 +780,9 @@ static int videotoolbox_default_init(AVCodecContext *avctx)
case
AV_CODEC_ID_H264
:
case
AV_CODEC_ID_H264
:
videotoolbox
->
cm_codec_type
=
kCMVideoCodecType_H264
;
videotoolbox
->
cm_codec_type
=
kCMVideoCodecType_H264
;
break
;
break
;
case
AV_CODEC_ID_HEVC
:
videotoolbox
->
cm_codec_type
=
kCMVideoCodecType_HEVC
;
break
;
case
AV_CODEC_ID_MPEG1VIDEO
:
case
AV_CODEC_ID_MPEG1VIDEO
:
videotoolbox
->
cm_codec_type
=
kCMVideoCodecType_MPEG1Video
;
videotoolbox
->
cm_codec_type
=
kCMVideoCodecType_MPEG1Video
;
break
;
break
;
...
@@ -782,6 +965,20 @@ AVHWAccel ff_h263_videotoolbox_hwaccel = {
...
@@ -782,6 +965,20 @@ AVHWAccel ff_h263_videotoolbox_hwaccel = {
.
priv_data_size
=
sizeof
(
VTContext
),
.
priv_data_size
=
sizeof
(
VTContext
),
};
};
AVHWAccel
ff_hevc_videotoolbox_hwaccel
=
{
.
name
=
"hevc_videotoolbox"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_HEVC
,
.
pix_fmt
=
AV_PIX_FMT_VIDEOTOOLBOX
,
.
alloc_frame
=
ff_videotoolbox_alloc_frame
,
.
start_frame
=
ff_videotoolbox_h264_start_frame
,
.
decode_slice
=
ff_videotoolbox_h264_decode_slice
,
.
end_frame
=
videotoolbox_hevc_end_frame
,
.
init
=
videotoolbox_common_init
,
.
uninit
=
ff_videotoolbox_uninit
,
.
priv_data_size
=
sizeof
(
VTContext
),
};
AVHWAccel
ff_h264_videotoolbox_hwaccel
=
{
AVHWAccel
ff_h264_videotoolbox_hwaccel
=
{
.
name
=
"h264_videotoolbox"
,
.
name
=
"h264_videotoolbox"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
...
...
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