Skip to content

Commit 7be99a9

Browse files
authored
Fix build fail for Android due to incorrect AMediaCodec detection (#4624)
1 parent a4b0b7b commit 7be99a9

File tree

5 files changed

+58
-16
lines changed

5 files changed

+58
-16
lines changed

aconfigure

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@ openssl_h_present
678678
ac_ssl_backend
679679
ac_ssl_has_aes_gcm
680680
ac_no_ssl
681+
ac_mediacodec_cflags
681682
ac_no_mediacodec
682683
ac_vpx_ldflags
683684
ac_vpx_cflags
@@ -9581,6 +9582,7 @@ fi
95819582

95829583

95839584

9585+
95849586
# Check whether --enable-android-mediacodec was given.
95859587
if test ${enable_android_mediacodec+y}
95869588
then :
@@ -9650,11 +9652,15 @@ fi
96509652
printf "%s\n" "Checking if Android AMediaCodec library is available... yes" >&6; }
96519653
printf "%s\n" "#define PJMEDIA_HAS_ANDROID_MEDIACODEC 1" >>confdefs.h
96529654

9655+
ac_mediacodec_cflags="-DPJMEDIA_HAS_ANDROID_MEDIACODEC=1 -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ -Werror=unguarded-availability"
96539656
else
96549657
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Checking if Android AMediaCodec library is available... no" >&5
96559658
printf "%s\n" "Checking if Android AMediaCodec library is available... no" >&6; }
96569659
fi
96579660
;;
9661+
*)
9662+
ac_no_mediacodec=1
9663+
;;
96589664
esac
96599665

96609666
;;

aconfigure.ac

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2058,6 +2058,7 @@ fi
20582058

20592059
dnl # Include Android MediaCodec
20602060
AC_SUBST(ac_no_mediacodec)
2061+
AC_SUBST(ac_mediacodec_cflags)
20612062

20622063
AC_ARG_ENABLE(android-mediacodec,
20632064
AS_HELP_STRING([--disable-android-mediacodec], [Exclude Android MediaCodec (default: autodetect)]),
@@ -2076,10 +2077,14 @@ AC_ARG_ENABLE(android-mediacodec,
20762077
if test "x$ac_pjmedia_has_amediacodec" = "x1"; then
20772078
AC_MSG_RESULT([Checking if Android AMediaCodec library is available... yes])
20782079
AC_DEFINE(PJMEDIA_HAS_ANDROID_MEDIACODEC, 1)
2080+
ac_mediacodec_cflags="-DPJMEDIA_HAS_ANDROID_MEDIACODEC=1 -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ -Werror=unguarded-availability"
20792081
else
20802082
AC_MSG_RESULT([Checking if Android AMediaCodec library is available... no])
20812083
fi
20822084
;;
2085+
*)
2086+
[ac_no_mediacodec=1]
2087+
;;
20832088
esac
20842089
]
20852090
)

pjmedia/build/os-auto.mak.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@ OPENH264_LDFLAGS = @ac_openh264_ldflags@
4242
VPX_CFLAGS = @ac_vpx_cflags@
4343
VPX_LDFLAGS = @ac_vpx_ldflags@
4444

45+
# Android MediaCodec
46+
AMEDIACODEC_CFLAGS = @ac_mediacodec_cflags@
47+
4548

4649
# PJMEDIA features exclusion
4750
export CFLAGS += @ac_no_small_filter@ @ac_no_large_filter@ @ac_no_speex_aec@ \
4851
$(SDL_CFLAGS) $(FFMPEG_CFLAGS) $(V4L2_CFLAGS) $(DSHOW_CFLAGS) $(QT_CFLAGS) \
4952
$(DARWIN_CFLAGS) $(ANDROID_CFLAGS) \
50-
$(OPENH264_CFLAGS) $(VPX_CFLAGS) $(OBOE_CFLAGS)
53+
$(OPENH264_CFLAGS) $(VPX_CFLAGS) $(OBOE_CFLAGS) $(AMEDIACODEC_CFLAGS)
5154
export LDFLAGS += $(SDL_LDFLAGS) $(FFMPEG_LDFLAGS) $(V4L2_LDFLAGS) $(DSHOW_LDFLAGS) \
5255
$(OPENH264_LDFLAGS) $(VPX_LDFLAGS) $(OBOE_LDFLAGS)
5356

pjmedia/src/pjmedia-codec/and_aud_mediacodec.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
#define AND_MEDIA_KEY_MIME "mime"
5151

5252
#define BUFFER_MAX_ITEM 16
53-
53+
#define API_AT_LEAST(x) __builtin_available(android x, *)
5454
typedef struct and_med_buf_info {
5555
pj_int32_t index;
5656
pj_int32_t size;
@@ -493,6 +493,15 @@ PJ_DEF(pj_status_t) pjmedia_codec_and_media_aud_init( pjmedia_endpt *endpt )
493493
pjmedia_codec_mgr *codec_mgr;
494494
pj_str_t codec_name;
495495
pj_status_t status;
496+
int api_level = android_get_device_api_level();
497+
498+
if (api_level < 28) {
499+
PJ_LOG(4,(THIS_FILE, "Minimum API level 28,"
500+
"Android MediaCodec cannot work with API level %d",
501+
api_level));
502+
503+
return PJ_SUCCESS;
504+
}
496505

497506
if (and_media_factory.pool != NULL) {
498507
/* Already initialized. */
@@ -987,10 +996,6 @@ static pj_status_t and_media_codec_open(pjmedia_codec *codec,
987996
codec_data->vad_enabled = (attr->setting.vad != 0);
988997
codec_data->plc_enabled = (attr->setting.plc != 0);
989998
and_media_data->clock_rate = attr->info.clock_rate;
990-
AMediaCodecOnAsyncNotifyCallback async_cb = {&and_med_on_input_avail,
991-
&and_med_on_output_avail,
992-
&and_med_on_format_changed,
993-
&and_med_on_error};
994999

9951000
#if PJMEDIA_HAS_AND_MEDIA_AMRNB
9961001
if (and_media_data->codec_id == AND_AUD_CODEC_AMRNB ||
@@ -1093,8 +1098,18 @@ static pj_status_t and_media_codec_open(pjmedia_codec *codec,
10931098
s->dec_setting.octet_aligned, s->dec_setting.reorder));
10941099
}
10951100
#endif
1096-
AMediaCodec_setAsyncNotifyCallback(codec_data->enc, async_cb, codec_data);
1097-
AMediaCodec_setAsyncNotifyCallback(codec_data->dec, async_cb, codec_data);
1101+
1102+
if (API_AT_LEAST(28)) {
1103+
AMediaCodecOnAsyncNotifyCallback async_cb = {&and_med_on_input_avail,
1104+
&and_med_on_output_avail,
1105+
&and_med_on_format_changed,
1106+
&and_med_on_error};
1107+
1108+
AMediaCodec_setAsyncNotifyCallback(codec_data->enc, async_cb,
1109+
codec_data);
1110+
AMediaCodec_setAsyncNotifyCallback(codec_data->dec, async_cb,
1111+
codec_data);
1112+
}
10981113

10991114
status = configure_codec(codec_data, PJ_TRUE);
11001115
if (status != PJ_SUCCESS) {

pjmedia/src/pjmedia-codec/and_vid_mediacodec.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#define AND_MED_VP9_PT PJMEDIA_RTP_PT_VP9_RSV1
7878

7979
#define BUFFER_MAX_ITEM 16
80+
#define API_AT_LEAST(x) __builtin_available(android x, *)
8081

8182
typedef struct and_med_buf_info {
8283
pj_int32_t index;
@@ -566,6 +567,15 @@ PJ_DEF(pj_status_t) pjmedia_codec_and_media_vid_init(
566567
{
567568
const pj_str_t h264_name = { (char*)"H264", 4};
568569
pj_status_t status;
570+
int api_level = android_get_device_api_level();
571+
572+
if (api_level < 28) {
573+
PJ_LOG(4,(THIS_FILE, "Minimum API level 28,"
574+
"Android MediaCodec cannot work with API level %d",
575+
api_level));
576+
577+
return PJ_SUCCESS;
578+
}
569579

570580
if (and_media_factory.pool != NULL) {
571581
/* Already initialized. */
@@ -1048,10 +1058,6 @@ static pj_status_t and_media_codec_open(pjmedia_vid_codec *codec,
10481058
pjmedia_vid_codec_param *param;
10491059
pj_status_t status = PJ_SUCCESS;
10501060

1051-
AMediaCodecOnAsyncNotifyCallback async_cb = {&and_med_on_input_avail,
1052-
&and_med_on_output_avail,
1053-
&and_med_on_format_changed,
1054-
&and_med_on_error};
10551061
and_media_data = (and_media_codec_data*) codec->codec_data;
10561062
and_media_data->prm = pjmedia_vid_codec_param_clone( and_media_data->pool,
10571063
codec_param);
@@ -1062,11 +1068,18 @@ static pj_status_t and_media_codec_open(pjmedia_vid_codec *codec,
10621068
if (status != PJ_SUCCESS)
10631069
return status;
10641070
}
1065-
AMediaCodec_setAsyncNotifyCallback(and_media_data->enc, async_cb,
1066-
and_media_data);
1067-
AMediaCodec_setAsyncNotifyCallback(and_media_data->dec, async_cb,
1068-
and_media_data);
10691071

1072+
if (API_AT_LEAST(28)) {
1073+
AMediaCodecOnAsyncNotifyCallback async_cb = {&and_med_on_input_avail,
1074+
&and_med_on_output_avail,
1075+
&and_med_on_format_changed,
1076+
&and_med_on_error};
1077+
1078+
AMediaCodec_setAsyncNotifyCallback(and_media_data->enc, async_cb,
1079+
and_media_data);
1080+
AMediaCodec_setAsyncNotifyCallback(and_media_data->dec, async_cb,
1081+
and_media_data);
1082+
}
10701083
and_media_data->whole = (param->packing == PJMEDIA_VID_PACKING_WHOLE);
10711084
status = configure_encoder(and_media_data);
10721085
if (status != PJ_SUCCESS) {

0 commit comments

Comments
 (0)