Felix Paul Kühne pushed to branch master at VideoLAN / VLC
Commits:
bae5c5e7 by Steve Lhomme at 2026-01-17T16:14:44+01:00
mediacodec: remove write-only set_output_surface callback
We don't call it anymore even in VLC 3.
- - - - -
c721c121 by Steve Lhomme at 2026-01-17T16:14:44+01:00
mediacodec: remove stray undef
Each OFF define is matched with an undef
- - - - -
11417299 by Steve Lhomme at 2026-01-17T16:14:44+01:00
mediacodec: call all AMediaFormat_xxx() API' directly
They are all available in API 21, which is our minimum.
- https://developer.android.com/ndk/reference/group/media#amediaformat_new
- https://developer.android.com/ndk/reference/group/media#amediaformat_delete
- https://developer.android.com/ndk/reference/group/media#amediaformat_setstring
- https://developer.android.com/ndk/reference/group/media#amediaformat_setint32
- https://developer.android.com/ndk/reference/group/media#amediaformat_getint32
- - - - -
ef7f67ad by Steve Lhomme at 2026-01-17T16:14:44+01:00
mediacodec: call all AMediaCodec_xxx() API's directly
They are all available in API 21, which is our minimum.
-
https://developer.android.com/ndk/reference/group/media#amediacodec_createcodecbyname
- https://developer.android.com/ndk/reference/group/media#amediacodec_configure
- https://developer.android.com/ndk/reference/group/media#amediacodec_start
- https://developer.android.com/ndk/reference/group/media#amediacodec_stop
- https://developer.android.com/ndk/reference/group/media#amediacodec_flush
- https://developer.android.com/ndk/reference/group/media#amediacodec_delete
-
https://developer.android.com/ndk/reference/group/media#amediacodec_getoutputformat
-
https://developer.android.com/ndk/reference/group/media#amediacodec_dequeueinputbuffer
-
https://developer.android.com/ndk/reference/group/media#amediacodec_getinputbuffer
-
https://developer.android.com/ndk/reference/group/media#amediacodec_queueinputbuffer
-
https://developer.android.com/ndk/reference/group/media#amediacodec_dequeueoutputbuffer
-
https://developer.android.com/ndk/reference/group/media#amediacodec_getoutputbuffer
-
https://developer.android.com/ndk/reference/group/media#amediacodec_releaseoutputbuffer
-
https://developer.android.com/ndk/reference/group/media#amediacodec_releaseoutputbufferattime
- - - - -
5dd32a7e by Steve Lhomme at 2026-01-17T16:14:44+01:00
mediacodec: remove empty symbol loading
All the NDK API we use can be called directly from since API 21.
- - - - -
2 changed files:
- modules/codec/omxil/mediacodec.h
- modules/codec/omxil/mediacodec_ndk.c
Changes:
=====================================
modules/codec/omxil/mediacodec.h
=====================================
@@ -185,10 +185,6 @@ struct mc_api
/* render a buffer at a specified ts */
int (*release_out_ts)(mc_api *, int i_index, int64_t i_ts_ns);
-
- /* Dynamically sets the output surface
- * Returns 0 on success, or MC_API_ERROR */
- int (*set_output_surface)(mc_api*, void *p_surface);
};
#endif
=====================================
modules/codec/omxil/mediacodec_ndk.c
=====================================
@@ -55,181 +55,6 @@ char* MediaCodec_GetName(vlc_object_t *p_obj, vlc_fourcc_t
codec,
* buffers and not via "csd-*" buffers from AMediaFormat */
#define AMEDIACODEC_FLAG_CODEC_CONFIG 2
-/*****************************************************************************
- * NdkMediaCodec.h
- *****************************************************************************/
-
-/* cf. https://github.com/android-ndk/ndk/issues/459 */
-#if defined(__USE_FILE_OFFSET64) && !defined(__LP64__)
-#define off_t_compat int32_t
-#else
-#define off_t_compat off_t
-#endif
-
-/*****************************************************************************
- * Ndk symbols
- *****************************************************************************/
-
-typedef AMediaCodec* (*pf_AMediaCodec_createCodecByName)(const char *name);
-
-typedef media_status_t (*pf_AMediaCodec_configure)(AMediaCodec*,
- const AMediaFormat* format,
- ANativeWindow* surface,
- AMediaCrypto *crypto,
- uint32_t flags);
-
-typedef media_status_t (*pf_AMediaCodec_start)(AMediaCodec*);
-
-typedef media_status_t (*pf_AMediaCodec_stop)(AMediaCodec*);
-
-typedef media_status_t (*pf_AMediaCodec_flush)(AMediaCodec*);
-
-typedef media_status_t (*pf_AMediaCodec_delete)(AMediaCodec*);
-
-typedef AMediaFormat* (*pf_AMediaCodec_getOutputFormat)(AMediaCodec*);
-
-typedef ssize_t (*pf_AMediaCodec_dequeueInputBuffer)(AMediaCodec*,
- int64_t timeoutUs);
-
-typedef uint8_t* (*pf_AMediaCodec_getInputBuffer)(AMediaCodec*,
- size_t idx, size_t *out_size);
-
-typedef media_status_t (*pf_AMediaCodec_queueInputBuffer)(AMediaCodec*,
- size_t idx, off_t_compat offset, size_t size, uint64_t time, uint32_t
flags);
-
-typedef ssize_t (*pf_AMediaCodec_dequeueOutputBuffer)(AMediaCodec*,
- AMediaCodecBufferInfo *info, int64_t timeoutUs);
-
-typedef uint8_t* (*pf_AMediaCodec_getOutputBuffer)(AMediaCodec*,
- size_t idx, size_t *out_size);
-
-typedef media_status_t (*pf_AMediaCodec_releaseOutputBuffer)(AMediaCodec*,
- size_t idx, bool render);
-
-typedef media_status_t
(*pf_AMediaCodec_releaseOutputBufferAtTime)(AMediaCodec*,
- size_t idx, int64_t timestampNs);
-
-typedef media_status_t (*pf_AMediaCodec_setOutputSurface)(AMediaCodec*,
- ANativeWindow *surface);
-
-typedef AMediaFormat *(*pf_AMediaFormat_new)();
-typedef media_status_t (*pf_AMediaFormat_delete)(AMediaFormat*);
-
-typedef void (*pf_AMediaFormat_setString)(AMediaFormat*,
- const char* name, const char* value);
-
-typedef void (*pf_AMediaFormat_setInt32)(AMediaFormat*,
- const char* name, int32_t value);
-
-typedef bool (*pf_AMediaFormat_getInt32)(AMediaFormat*,
- const char *name, int32_t *out);
-
-struct syms
-{
- struct {
- pf_AMediaCodec_createCodecByName createCodecByName;
- pf_AMediaCodec_configure configure;
- pf_AMediaCodec_start start;
- pf_AMediaCodec_stop stop;
- pf_AMediaCodec_flush flush;
- pf_AMediaCodec_delete delete;
- pf_AMediaCodec_getOutputFormat getOutputFormat;
- pf_AMediaCodec_dequeueInputBuffer dequeueInputBuffer;
- pf_AMediaCodec_getInputBuffer getInputBuffer;
- pf_AMediaCodec_queueInputBuffer queueInputBuffer;
- pf_AMediaCodec_dequeueOutputBuffer dequeueOutputBuffer;
- pf_AMediaCodec_getOutputBuffer getOutputBuffer;
- pf_AMediaCodec_releaseOutputBuffer releaseOutputBuffer;
- pf_AMediaCodec_releaseOutputBufferAtTime releaseOutputBufferAtTime;
- pf_AMediaCodec_setOutputSurface setOutputSurface;
- } AMediaCodec;
- struct {
- pf_AMediaFormat_new new;
- pf_AMediaFormat_delete delete;
- pf_AMediaFormat_setString setString;
- pf_AMediaFormat_setInt32 setInt32;
- pf_AMediaFormat_getInt32 getInt32;
- } AMediaFormat;
-};
-static struct syms syms;
-
-struct members
-{
- const char *name;
- int offset;
- bool critical;
-};
-static struct members members[] =
-{
-#define OFF(x) offsetof(struct syms, AMediaCodec.x)
- { "AMediaCodec_createCodecByName", OFF(createCodecByName), true },
- { "AMediaCodec_configure", OFF(configure), true },
- { "AMediaCodec_start", OFF(start), true },
- { "AMediaCodec_stop", OFF(stop), true },
- { "AMediaCodec_flush", OFF(flush), true },
- { "AMediaCodec_delete", OFF(delete), true },
- { "AMediaCodec_getOutputFormat", OFF(getOutputFormat), true },
- { "AMediaCodec_dequeueInputBuffer", OFF(dequeueInputBuffer), true },
- { "AMediaCodec_getInputBuffer", OFF(getInputBuffer), true },
- { "AMediaCodec_queueInputBuffer", OFF(queueInputBuffer), true },
- { "AMediaCodec_dequeueOutputBuffer", OFF(dequeueOutputBuffer), true },
- { "AMediaCodec_getOutputBuffer", OFF(getOutputBuffer), true },
- { "AMediaCodec_releaseOutputBuffer", OFF(releaseOutputBuffer), true },
- { "AMediaCodec_releaseOutputBufferAtTime", OFF(releaseOutputBufferAtTime),
true },
- { "AMediaCodec_setOutputSurface", OFF(setOutputSurface), false },
-#undef OFF
-#define OFF(x) offsetof(struct syms, AMediaFormat.x)
- { "AMediaFormat_new", OFF(new), true },
- { "AMediaFormat_delete", OFF(delete), true },
- { "AMediaFormat_setString", OFF(setString), true },
- { "AMediaFormat_setInt32", OFF(setInt32), true },
- { "AMediaFormat_getInt32", OFF(getInt32), true },
-#undef OFF
- { NULL, 0, false }
-};
-#undef OFF
-
-/* Initialize all symbols.
- * Done only one time during the first initialisation */
-static bool
-InitSymbols(mc_api *api)
-{
- static vlc_mutex_t lock = VLC_STATIC_MUTEX;
- static int i_init_state = -1;
- bool ret;
-
- vlc_mutex_lock(&lock);
-
- if (i_init_state != -1)
- goto end;
-
- i_init_state = 0;
-
- void *ndk_handle = dlopen("libmediandk.so", RTLD_NOW);
- if (!ndk_handle)
- goto end;
-
- for (int i = 0; members[i].name; i++)
- {
- void *sym = dlsym(ndk_handle, members[i].name);
- if (!sym && members[i].critical)
- {
- dlclose(ndk_handle);
- goto end;
- }
- *(void **)((uint8_t*)&syms + members[i].offset) = sym;
- }
-
- i_init_state = 1;
-end:
- ret = i_init_state == 1;
- if (!ret)
- msg_Err(api->p_obj, "MediaCodec NDK init failed");
-
- vlc_mutex_unlock(&lock);
- return ret;
-}
-
/****************************************************************************
* Local prototypes
****************************************************************************/
@@ -251,7 +76,7 @@ static int ConfigureDecoder(mc_api *api, union mc_api_args
*p_args)
assert(api->psz_mime && api->psz_name);
- p_sys->p_codec = syms.AMediaCodec.createCodecByName(api->psz_name);
+ p_sys->p_codec = AMediaCodec_createCodecByName(api->psz_name);
if (!p_sys->p_codec)
{
msg_Err(api->p_obj, "AMediaCodec.createCodecByName for %s failed",
@@ -259,7 +84,7 @@ static int ConfigureDecoder(mc_api *api, union mc_api_args
*p_args)
return MC_API_ERROR;
}
- p_sys->p_format = syms.AMediaFormat.new();
+ p_sys->p_format = AMediaFormat_new();
if (!p_sys->p_format)
{
msg_Err(api->p_obj, "AMediaFormat.new failed");
@@ -267,39 +92,39 @@ static int ConfigureDecoder(mc_api *api, union mc_api_args
*p_args)
}
if (p_args->video.b_low_latency)
- syms.AMediaFormat.setInt32(p_sys->p_format, "low-latency", 1);
- syms.AMediaFormat.setInt32(p_sys->p_format, "encoder", 0);
- syms.AMediaFormat.setString(p_sys->p_format, "mime", api->psz_mime);
+ AMediaFormat_setInt32(p_sys->p_format, "low-latency", 1);
+ AMediaFormat_setInt32(p_sys->p_format, "encoder", 0);
+ AMediaFormat_setString(p_sys->p_format, "mime", api->psz_mime);
/* No limits for input size */
- syms.AMediaFormat.setInt32(p_sys->p_format, "max-input-size", 0);
+ AMediaFormat_setInt32(p_sys->p_format, "max-input-size", 0);
if (api->i_cat == VIDEO_ES)
{
- syms.AMediaFormat.setInt32(p_sys->p_format, "width",
p_args->video.i_width);
- syms.AMediaFormat.setInt32(p_sys->p_format, "height",
p_args->video.i_height);
- syms.AMediaFormat.setInt32(p_sys->p_format, "rotation-degrees",
p_args->video.i_angle);
+ AMediaFormat_setInt32(p_sys->p_format, "width", p_args->video.i_width);
+ AMediaFormat_setInt32(p_sys->p_format, "height",
p_args->video.i_height);
+ AMediaFormat_setInt32(p_sys->p_format, "rotation-degrees",
p_args->video.i_angle);
- syms.AMediaFormat.setInt32(p_sys->p_format, "color-range",
p_args->video.color_range);
- syms.AMediaFormat.setInt32(p_sys->p_format, "color-standard",
p_args->video.color_standard);
- syms.AMediaFormat.setInt32(p_sys->p_format, "color-transfer",
p_args->video.color_transfer);
+ AMediaFormat_setInt32(p_sys->p_format, "color-range",
p_args->video.color_range);
+ AMediaFormat_setInt32(p_sys->p_format, "color-standard",
p_args->video.color_standard);
+ AMediaFormat_setInt32(p_sys->p_format, "color-transfer",
p_args->video.color_transfer);
if (p_args->video.p_surface)
{
p_anw = p_args->video.p_surface;
if (p_args->video.b_tunneled_playback)
- syms.AMediaFormat.setInt32(p_sys->p_format,
+ AMediaFormat_setInt32(p_sys->p_format,
"feature-tunneled-playback", 1);
if (p_args->video.b_adaptive_playback)
- syms.AMediaFormat.setInt32(p_sys->p_format,
+ AMediaFormat_setInt32(p_sys->p_format,
"feature-adaptive-playback", 1);
}
}
else
{
- syms.AMediaFormat.setInt32(p_sys->p_format, "sample-rate",
p_args->audio.i_sample_rate);
- syms.AMediaFormat.setInt32(p_sys->p_format, "channel-count",
p_args->audio.i_channel_count);
+ AMediaFormat_setInt32(p_sys->p_format, "sample-rate",
p_args->audio.i_sample_rate);
+ AMediaFormat_setInt32(p_sys->p_format, "channel-count",
p_args->audio.i_channel_count);
}
- if (syms.AMediaCodec.configure(p_sys->p_codec, p_sys->p_format,
+ if (AMediaCodec_configure(p_sys->p_codec, p_sys->p_format,
p_anw, NULL, 0) != AMEDIA_OK)
{
msg_Err(api->p_obj, "AMediaCodec.configure failed");
@@ -324,15 +149,15 @@ static int Stop(mc_api *api)
{
if (api->b_started)
{
- syms.AMediaCodec.stop(p_sys->p_codec);
+ AMediaCodec_stop(p_sys->p_codec);
api->b_started = false;
}
- syms.AMediaCodec.delete(p_sys->p_codec);
+ AMediaCodec_delete(p_sys->p_codec);
p_sys->p_codec = NULL;
}
if (p_sys->p_format)
{
- syms.AMediaFormat.delete(p_sys->p_format);
+ AMediaFormat_delete(p_sys->p_format);
p_sys->p_format = NULL;
}
@@ -348,7 +173,7 @@ static int Start(mc_api *api)
mc_api_sys *p_sys = api->p_sys;
int i_ret = MC_API_ERROR;
- if (syms.AMediaCodec.start(p_sys->p_codec) != AMEDIA_OK)
+ if (AMediaCodec_start(p_sys->p_codec) != AMEDIA_OK)
{
msg_Err(api->p_obj, "AMediaCodec.start failed");
goto error;
@@ -371,7 +196,7 @@ static int Flush(mc_api *api)
{
mc_api_sys *p_sys = api->p_sys;
- if (syms.AMediaCodec.flush(p_sys->p_codec) == AMEDIA_OK)
+ if (AMediaCodec_flush(p_sys->p_codec) == AMEDIA_OK)
return 0;
else
return MC_API_ERROR;
@@ -385,7 +210,7 @@ static int DequeueInput(mc_api *api, vlc_tick_t i_timeout)
mc_api_sys *p_sys = api->p_sys;
ssize_t i_index;
- i_index = syms.AMediaCodec.dequeueInputBuffer(p_sys->p_codec, i_timeout);
+ i_index = AMediaCodec_dequeueInputBuffer(p_sys->p_codec, i_timeout);
if (i_index >= 0)
return i_index;
else if (i_index == AMEDIACODEC_INFO_TRY_AGAIN_LATER)
@@ -411,7 +236,7 @@ static int QueueInput(mc_api *api, int i_index, const void
*p_buf,
assert(i_index >= 0);
- p_mc_buf = syms.AMediaCodec.getInputBuffer(p_sys->p_codec,
+ p_mc_buf = AMediaCodec_getInputBuffer(p_sys->p_codec,
i_index, &i_mc_size);
if (!p_mc_buf)
return MC_API_ERROR;
@@ -420,7 +245,7 @@ static int QueueInput(mc_api *api, int i_index, const void
*p_buf,
i_mc_size = i_size;
memcpy(p_mc_buf, p_buf, i_mc_size);
- if (syms.AMediaCodec.queueInputBuffer(p_sys->p_codec, i_index, 0,
i_mc_size,
+ if (AMediaCodec_queueInputBuffer(p_sys->p_codec, i_index, 0, i_mc_size,
i_ts, i_flags) == AMEDIA_OK)
return 0;
else
@@ -433,7 +258,7 @@ static int QueueInput(mc_api *api, int i_index, const void
*p_buf,
static int32_t GetFormatInteger(AMediaFormat *p_format, const char *psz_name)
{
int32_t i_out = 0;
- syms.AMediaFormat.getInt32(p_format, psz_name, &i_out);
+ AMediaFormat_getInt32(p_format, psz_name, &i_out);
return i_out;
}
@@ -445,7 +270,7 @@ static int DequeueOutput(mc_api *api, vlc_tick_t i_timeout)
mc_api_sys *p_sys = api->p_sys;
ssize_t i_index;
- i_index = syms.AMediaCodec.dequeueOutputBuffer(p_sys->p_codec,
&p_sys->info,
+ i_index = AMediaCodec_dequeueOutputBuffer(p_sys->p_codec, &p_sys->info,
i_timeout);
if (i_index >= 0)
@@ -483,7 +308,7 @@ static int GetOutput(mc_api *api, int i_index, mc_api_out
*p_out)
else
{
size_t i_mc_size;
- uint8_t *p_mc_buf =
syms.AMediaCodec.getOutputBuffer(p_sys->p_codec,
+ uint8_t *p_mc_buf = AMediaCodec_getOutputBuffer(p_sys->p_codec,
i_index,
&i_mc_size);
/* p_mc_buf can be NULL in case of EOS */
@@ -499,7 +324,7 @@ static int GetOutput(mc_api *api, int i_index, mc_api_out
*p_out)
}
else if (i_index == MC_API_INFO_OUTPUT_FORMAT_CHANGED)
{
- AMediaFormat *format =
syms.AMediaCodec.getOutputFormat(p_sys->p_codec);
+ AMediaFormat *format = AMediaCodec_getOutputFormat(p_sys->p_codec);
if (unlikely(format == NULL))
return MC_API_ERROR;
@@ -523,7 +348,7 @@ static int GetOutput(mc_api *api, int i_index, mc_api_out
*p_out)
p_out->conf.audio.channel_mask = GetFormatInteger(format,
"channel-mask");
p_out->conf.audio.sample_rate = GetFormatInteger(format,
"sample-rate");
}
- syms.AMediaFormat.delete(format);
+ AMediaFormat_delete(format);
return 1;
}
return 0;
@@ -537,7 +362,7 @@ static int ReleaseOutput(mc_api *api, int i_index, bool
b_render)
mc_api_sys *p_sys = api->p_sys;
assert(i_index >= 0);
- if (syms.AMediaCodec.releaseOutputBuffer(p_sys->p_codec, i_index, b_render)
+ if (AMediaCodec_releaseOutputBuffer(p_sys->p_codec, i_index, b_render)
== AMEDIA_OK)
return 0;
else
@@ -552,26 +377,13 @@ static int ReleaseOutputAtTime(mc_api *api, int i_index,
int64_t i_ts_ns)
mc_api_sys *p_sys = api->p_sys;
assert(i_index >= 0);
- if (syms.AMediaCodec.releaseOutputBufferAtTime(p_sys->p_codec, i_index,
i_ts_ns)
+ if (AMediaCodec_releaseOutputBufferAtTime(p_sys->p_codec, i_index, i_ts_ns)
== AMEDIA_OK)
return 0;
else
return MC_API_ERROR;
}
-/*****************************************************************************
- * SetOutputSurface
- *****************************************************************************/
-static int SetOutputSurface(mc_api *api, void *p_surface)
-{
- assert(p_surface != NULL);
- mc_api_sys *p_sys = api->p_sys;
-
- return syms.AMediaCodec.setOutputSurface != NULL
- && syms.AMediaCodec.setOutputSurface(p_sys->p_codec, p_surface)
- == AMEDIA_OK ? 0 : MC_API_ERROR;
-}
-
/*****************************************************************************
* Clean
*****************************************************************************/
@@ -605,9 +417,6 @@ static int Prepare(mc_api * api, int i_profile)
*****************************************************************************/
int MediaCodecNdk_Init(mc_api *api)
{
- if (!InitSymbols(api))
- return MC_API_ERROR;
-
api->p_sys = calloc(1, sizeof(mc_api_sys));
if (!api->p_sys)
return MC_API_ERROR;
@@ -624,7 +433,6 @@ int MediaCodecNdk_Init(mc_api *api)
api->get_out = GetOutput;
api->release_out = ReleaseOutput;
api->release_out_ts = ReleaseOutputAtTime;
- api->set_output_surface = SetOutputSurface;
api->b_support_rotation = true;
return 0;
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/4aab736bff7322c2bfafe457846a0b34821b199e...5dd32a7e17e91eb3afc494b820d4bfb0c7668dcc
--
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/4aab736bff7322c2bfafe457846a0b34821b199e...5dd32a7e17e91eb3afc494b820d4bfb0c7668dcc
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits