FFmpeg
Loading...
Searching...
No Matches
libavutil
hwcontext_mediacodec.c
Go to the documentation of this file.
1
/*
2
* This file is part of FFmpeg.
3
*
4
* FFmpeg is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2.1 of the License, or (at your option) any later version.
8
*
9
* FFmpeg is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
13
*
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with FFmpeg; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
19
#include "config.h"
20
21
#include <android/native_window.h>
22
#include <dlfcn.h>
23
#include <media/NdkMediaCodec.h>
24
25
#include "
buffer.h
"
26
#include "
common.h
"
27
#include "
hwcontext.h
"
28
#include "
hwcontext_internal.h
"
29
#include "
hwcontext_mediacodec.h
"
30
31
typedef
struct
MediaCodecDeviceContext
{
32
AVMediaCodecDeviceContext
ctx
;
33
34
void
*
libmedia
;
35
media_status_t (*
create_surface
)(ANativeWindow **surface);
36
}
MediaCodecDeviceContext
;
37
38
39
static
int
mc_device_create
(
AVHWDeviceContext
*
ctx
,
const
char
*device,
40
AVDictionary
*
opts
,
int
flags
)
41
{
42
const
AVDictionaryEntry
*
entry
=
NULL
;
43
MediaCodecDeviceContext
*
s
=
ctx
->hwctx;
44
AVMediaCodecDeviceContext
*dev = &
s
->ctx;
45
46
if
(device && device[0]) {
47
av_log
(
ctx
,
AV_LOG_ERROR
,
"Device selection unsupported.\n"
);
48
return
AVERROR_UNKNOWN
;
49
}
50
51
while
((
entry
=
av_dict_iterate
(
opts
,
entry
))) {
52
if
(!strcmp(
entry
->key,
"create_window"
))
53
dev->
create_window
= atoi(
entry
->value);
54
}
55
56
av_log
(
ctx
,
AV_LOG_DEBUG
,
"%s createPersistentInputSurface\n"
,
57
dev->
create_window
?
"Enable"
:
"Disable"
);
58
59
return
0;
60
}
61
62
static
int
mc_device_init
(
AVHWDeviceContext
*
ctx
)
63
{
64
MediaCodecDeviceContext
*
s
=
ctx
->hwctx;
65
AVMediaCodecDeviceContext
*dev = (
AVMediaCodecDeviceContext
*)
s
;
66
ANativeWindow *native_window =
NULL
;
67
68
if
(dev->
surface
)
69
return
0;
70
71
if
(dev->
native_window
)
72
return
0;
73
74
// For backward compatibility, don't return error for a dummy
75
// AVHWDeviceContext without surface or native_window.
76
if
(!dev->
create_window
)
77
return
0;
78
79
s
->libmedia = dlopen(
"libmediandk.so"
, RTLD_NOW);
80
if
(!
s
->libmedia)
81
return
AVERROR_UNKNOWN
;
82
83
s
->create_surface = dlsym(
s
->libmedia,
"AMediaCodec_createPersistentInputSurface"
);
84
if
(!
s
->create_surface)
85
return
AVERROR_UNKNOWN
;
86
87
s
->create_surface(&native_window);
88
dev->
native_window
= native_window;
89
return
0;
90
}
91
92
static
void
mc_device_uninit
(
AVHWDeviceContext
*
ctx
)
93
{
94
MediaCodecDeviceContext
*
s
=
ctx
->hwctx;
95
AVMediaCodecDeviceContext
*dev =
ctx
->hwctx;
96
if
(!
s
->libmedia)
97
return
;
98
99
if
(dev->
native_window
) {
100
ANativeWindow_release(dev->
native_window
);
101
dev->
native_window
=
NULL
;
102
}
103
dlclose(
s
->libmedia);
104
s
->libmedia =
NULL
;
105
}
106
107
const
HWContextType
ff_hwcontext_type_mediacodec
= {
108
.type =
AV_HWDEVICE_TYPE_MEDIACODEC
,
109
.name =
"mediacodec"
,
110
111
.device_hwctx_size =
sizeof
(
MediaCodecDeviceContext
),
112
113
.device_create =
mc_device_create
,
114
.
device_init
=
mc_device_init
,
115
.device_uninit =
mc_device_uninit
,
116
117
.
pix_fmts
= (
const
enum
AVPixelFormat
[]){
118
AV_PIX_FMT_MEDIACODEC
,
119
AV_PIX_FMT_NONE
120
},
121
};
entry
#define entry
Definition
aom_film_grain_template.c:66
buffer.h
refcounted data buffer API
flags
#define flags(name, subs,...)
Definition
cbs_h264.c:74
s
#define s(width, name)
Definition
cbs_vp9.c:198
common.h
common internal and external API header
NULL
#define NULL
Definition
coverity.c:32
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition
dict.c:42
AVERROR_UNKNOWN
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition
error.h:73
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition
log.h:231
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition
log.h:210
hwcontext.h
AV_HWDEVICE_TYPE_MEDIACODEC
@ AV_HWDEVICE_TYPE_MEDIACODEC
Definition
hwcontext.h:38
hwcontext_internal.h
ff_hwcontext_type_mediacodec
const HWContextType ff_hwcontext_type_mediacodec
Definition
hwcontext_mediacodec.c:107
mc_device_init
static int mc_device_init(AVHWDeviceContext *ctx)
Definition
hwcontext_mediacodec.c:62
mc_device_uninit
static void mc_device_uninit(AVHWDeviceContext *ctx)
Definition
hwcontext_mediacodec.c:92
mc_device_create
static int mc_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags)
Definition
hwcontext_mediacodec.c:39
hwcontext_mediacodec.h
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition
libkvazaar.c:296
AVPixelFormat
AVPixelFormat
Pixel format.
Definition
pixfmt.h:71
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition
pixfmt.h:72
AV_PIX_FMT_MEDIACODEC
@ AV_PIX_FMT_MEDIACODEC
hardware decoding through MediaCodec
Definition
pixfmt.h:316
AVDictionaryEntry
Definition
dict.h:90
AVDictionary
Definition
dict.c:32
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition
hwcontext.h:63
AVMediaCodecDeviceContext
MediaCodec details.
Definition
hwcontext_mediacodec.h:27
AVMediaCodecDeviceContext::native_window
void * native_window
Pointer to ANativeWindow.
Definition
hwcontext_mediacodec.h:45
AVMediaCodecDeviceContext::surface
void * surface
android/view/Surface handle, to be filled by the user.
Definition
hwcontext_mediacodec.h:33
AVMediaCodecDeviceContext::create_window
int create_window
Enable createPersistentInputSurface automatically.
Definition
hwcontext_mediacodec.h:58
HWContextType
Definition
hwcontext_internal.h:29
MediaCodecDeviceContext
Definition
hwcontext_mediacodec.c:31
MediaCodecDeviceContext::ctx
AVMediaCodecDeviceContext ctx
Definition
hwcontext_mediacodec.c:32
MediaCodecDeviceContext::create_surface
media_status_t(* create_surface)(ANativeWindow **surface)
Definition
hwcontext_mediacodec.c:35
MediaCodecDeviceContext::libmedia
void * libmedia
Definition
hwcontext_mediacodec.c:34
av_log
#define av_log(a,...)
Definition
tableprint_vlc.h:27
ctx
static AVFormatContext * ctx
Definition
movenc.c:49
opts
static AVDictionary * opts
Definition
movenc.c:51
device_init
static int device_init(AVFormatContext *ctx, int *width, int *height, uint32_t pixelformat)
Definition
v4l2.c:218
Generated on Sun Aug 16 2026 20:21:03 for FFmpeg by
1.13.2