Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
f3cffd12
Commit
f3cffd12
authored
Dec 13, 2017
by
Matthieu Bouron
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc/mediacodec_wrapper: factorize MediaCodec creation functions
parent
8bf4e6d3
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
29 additions
and
133 deletions
+29
-133
mediacodec_wrapper.c
libavcodec/mediacodec_wrapper.c
+29
-133
No files found.
libavcodec/mediacodec_wrapper.c
View file @
f3cffd12
...
@@ -1132,13 +1132,18 @@ fail:
...
@@ -1132,13 +1132,18 @@ fail:
return
ret
;
return
ret
;
}
}
FFAMediaCodec
*
ff_AMediaCodec_createCodecByName
(
const
char
*
name
)
#define CREATE_CODEC_BY_NAME 0
#define CREATE_DECODER_BY_TYPE 1
#define CREATE_ENCODER_BY_TYPE 2
static
inline
FFAMediaCodec
*
codec_create
(
int
method
,
const
char
*
arg
)
{
{
int
ret
=
-
1
;
int
ret
=
-
1
;
JNIEnv
*
env
=
NULL
;
JNIEnv
*
env
=
NULL
;
FFAMediaCodec
*
codec
=
NULL
;
FFAMediaCodec
*
codec
=
NULL
;
jstring
codec_name
=
NULL
;
jstring
jarg
=
NULL
;
jobject
object
=
NULL
;
jobject
object
=
NULL
;
jmethodID
create_id
=
NULL
;
codec
=
av_mallocz
(
sizeof
(
FFAMediaCodec
));
codec
=
av_mallocz
(
sizeof
(
FFAMediaCodec
));
if
(
!
codec
)
{
if
(
!
codec
)
{
...
@@ -1156,77 +1161,23 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name)
...
@@ -1156,77 +1161,23 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name)
goto
fail
;
goto
fail
;
}
}
codec_name
=
ff_jni_utf_chars_to_jstring
(
env
,
name
,
codec
);
jarg
=
ff_jni_utf_chars_to_jstring
(
env
,
arg
,
codec
);
if
(
!
codec_name
)
{
if
(
!
jarg
)
{
goto
fail
;
}
object
=
(
*
env
)
->
CallStaticObjectMethod
(
env
,
codec
->
jfields
.
mediacodec_class
,
codec
->
jfields
.
create_by_codec_name_id
,
codec_name
);
if
(
ff_jni_exception_check
(
env
,
1
,
codec
)
<
0
)
{
goto
fail
;
}
codec
->
object
=
(
*
env
)
->
NewGlobalRef
(
env
,
object
);
if
(
!
codec
->
object
)
{
goto
fail
;
}
if
(
codec_init_static_fields
(
codec
)
<
0
)
{
goto
fail
;
}
if
(
codec
->
jfields
.
get_input_buffer_id
&&
codec
->
jfields
.
get_output_buffer_id
)
{
codec
->
has_get_i_o_buffer
=
1
;
}
ret
=
0
;
fail:
if
(
codec_name
)
{
(
*
env
)
->
DeleteLocalRef
(
env
,
codec_name
);
}
if
(
object
)
{
(
*
env
)
->
DeleteLocalRef
(
env
,
object
);
}
if
(
ret
<
0
)
{
ff_jni_reset_jfields
(
env
,
&
codec
->
jfields
,
jni_amediacodec_mapping
,
1
,
codec
);
av_freep
(
&
codec
);
}
return
codec
;
}
FFAMediaCodec
*
ff_AMediaCodec_createDecoderByType
(
const
char
*
mime
)
{
int
ret
=
-
1
;
JNIEnv
*
env
=
NULL
;
FFAMediaCodec
*
codec
=
NULL
;
jstring
mime_type
=
NULL
;
jobject
object
=
NULL
;
codec
=
av_mallocz
(
sizeof
(
FFAMediaCodec
));
if
(
!
codec
)
{
return
NULL
;
}
codec
->
class
=
&
amediacodec_class
;
env
=
ff_jni_get_env
(
codec
);
if
(
!
env
)
{
av_freep
(
&
codec
);
return
NULL
;
}
if
(
ff_jni_init_jfields
(
env
,
&
codec
->
jfields
,
jni_amediacodec_mapping
,
1
,
codec
)
<
0
)
{
goto
fail
;
goto
fail
;
}
}
mime_type
=
ff_jni_utf_chars_to_jstring
(
env
,
mime
,
codec
);
switch
(
method
)
{
if
(
!
mime_type
)
{
case
CREATE_CODEC_BY_NAME
:
create_id
=
codec
->
jfields
.
create_by_codec_name_id
;
break
;
goto
fail
;
case
CREATE_DECODER_BY_TYPE
:
create_id
=
codec
->
jfields
.
create_decoder_by_type_id
;
break
;
case
CREATE_ENCODER_BY_TYPE
:
create_id
=
codec
->
jfields
.
create_encoder_by_type_id
;
break
;
default:
av_assert0
(
0
);
}
}
object
=
(
*
env
)
->
CallStaticObjectMethod
(
env
,
codec
->
jfields
.
mediacodec_class
,
codec
->
jfields
.
create_decoder_by_type_id
,
mime_type
);
object
=
(
*
env
)
->
CallStaticObjectMethod
(
env
,
codec
->
jfields
.
mediacodec_class
,
create_id
,
jarg
);
if
(
ff_jni_exception_check
(
env
,
1
,
codec
)
<
0
)
{
if
(
ff_jni_exception_check
(
env
,
1
,
codec
)
<
0
)
{
goto
fail
;
goto
fail
;
}
}
...
@@ -1246,8 +1197,8 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime)
...
@@ -1246,8 +1197,8 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime)
ret
=
0
;
ret
=
0
;
fail:
fail:
if
(
mime_type
)
{
if
(
jarg
)
{
(
*
env
)
->
DeleteLocalRef
(
env
,
mime_type
);
(
*
env
)
->
DeleteLocalRef
(
env
,
jarg
);
}
}
if
(
object
)
{
if
(
object
)
{
...
@@ -1262,70 +1213,15 @@ fail:
...
@@ -1262,70 +1213,15 @@ fail:
return
codec
;
return
codec
;
}
}
FFAMediaCodec
*
ff_AMediaCodec_createEncoderByType
(
const
char
*
mime
)
#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method) \
{
FFAMediaCodec *ff_AMediaCodec_##name(const char *arg) \
int
ret
=
-
1
;
{ \
JNIEnv
*
env
=
NULL
;
return codec_create(method, arg); \
FFAMediaCodec
*
codec
=
NULL
;
} \
jstring
mime_type
=
NULL
;
jobject
object
=
NULL
;
codec
=
av_mallocz
(
sizeof
(
FFAMediaCodec
));
DECLARE_FF_AMEDIACODEC_CREATE_FUNC
(
createCodecByName
,
CREATE_CODEC_BY_NAME
)
if
(
!
codec
)
{
DECLARE_FF_AMEDIACODEC_CREATE_FUNC
(
createDecoderByType
,
CREATE_DECODER_BY_TYPE
)
return
NULL
;
DECLARE_FF_AMEDIACODEC_CREATE_FUNC
(
createEncoderByType
,
CREATE_ENCODER_BY_TYPE
)
}
codec
->
class
=
&
amediacodec_class
;
env
=
ff_jni_get_env
(
codec
);
if
(
!
env
)
{
av_freep
(
&
codec
);
return
NULL
;
}
if
(
ff_jni_init_jfields
(
env
,
&
codec
->
jfields
,
jni_amediacodec_mapping
,
1
,
codec
)
<
0
)
{
goto
fail
;
}
mime_type
=
ff_jni_utf_chars_to_jstring
(
env
,
mime
,
codec
);
if
(
!
mime_type
)
{
goto
fail
;
}
object
=
(
*
env
)
->
CallStaticObjectMethod
(
env
,
codec
->
jfields
.
mediacodec_class
,
codec
->
jfields
.
create_encoder_by_type_id
,
mime_type
);
if
(
ff_jni_exception_check
(
env
,
1
,
codec
)
<
0
)
{
goto
fail
;
}
codec
->
object
=
(
*
env
)
->
NewGlobalRef
(
env
,
object
);
if
(
!
codec
->
object
)
{
goto
fail
;
}
if
(
codec_init_static_fields
(
codec
)
<
0
)
{
goto
fail
;
}
if
(
codec
->
jfields
.
get_input_buffer_id
&&
codec
->
jfields
.
get_output_buffer_id
)
{
codec
->
has_get_i_o_buffer
=
1
;
}
ret
=
0
;
fail:
if
(
mime_type
)
{
(
*
env
)
->
DeleteLocalRef
(
env
,
mime_type
);
}
if
(
object
)
{
(
*
env
)
->
DeleteLocalRef
(
env
,
object
);
}
if
(
ret
<
0
)
{
ff_jni_reset_jfields
(
env
,
&
codec
->
jfields
,
jni_amediacodec_mapping
,
1
,
codec
);
av_freep
(
&
codec
);
}
return
codec
;
}
int
ff_AMediaCodec_delete
(
FFAMediaCodec
*
codec
)
int
ff_AMediaCodec_delete
(
FFAMediaCodec
*
codec
)
{
{
...
...
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