Skip to content

Commit 6f1e408

Browse files
committed
Upgrade AndroidX media3 to 1.3.0
1 parent 92a18ec commit 6f1e408

File tree

5 files changed

+63
-13
lines changed

5 files changed

+63
-13
lines changed

‎app/jni/third_party/androidx-media/ffmpeg_jni.cc

+59-10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ extern "C" {
3434

3535
#define LOGE(...) \
3636
((void)loge(TAG_NDK, __VA_ARGS__))
37+
#define LOGD(...) \
38+
((void)logd(TAG_NDK, __VA_ARGS__))
3739

3840
#define LIBRARY_FUNC(RETURN_TYPE, NAME, ...) \
3941
extern "C" { \
@@ -66,6 +68,8 @@ static const AVSampleFormat OUTPUT_FORMAT_PCM_FLOAT = AV_SAMPLE_FMT_FLT;
6668
static const int AUDIO_DECODER_ERROR_INVALID_DATA = -1;
6769
static const int AUDIO_DECODER_ERROR_OTHER = -2;
6870

71+
static jmethodID growOutputBufferMethod;
72+
6973
/**
7074
* Returns the AVCodec with the specified name, or NULL if it is not available.
7175
*/
@@ -80,13 +84,22 @@ AVCodecContext *createContext(JNIEnv *env, const AVCodec *codec,
8084
jbyteArray extraData, jboolean outputFloat,
8185
jint rawSampleRate, jint rawChannelCount);
8286

87+
struct GrowOutputBufferCallback {
88+
uint8_t *operator()(int requiredSize) const;
89+
90+
JNIEnv *env;
91+
jobject thiz;
92+
jobject decoderOutputBuffer;
93+
};
94+
8395
/**
8496
* Decodes the packet into the output buffer, returning the number of bytes
8597
* written, or a negative AUDIO_DECODER_ERROR constant value in the case of an
8698
* error.
8799
*/
88100
int decodePacket(AVCodecContext *context, AVPacket *packet,
89-
uint8_t *outputBuffer, int outputSize);
101+
uint8_t *outputBuffer, int outputSize,
102+
GrowOutputBufferCallback growBuffer);
90103

91104
/**
92105
* Transforms ffmpeg AVERROR into a negative AUDIO_DECODER_ERROR constant value.
@@ -106,6 +119,21 @@ void releaseContext(AVCodecContext *context);
106119
/*jint JNI_OnLoad(JavaVM *vm, void *reserved) {
107120
JNIEnv *env;
108121
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
122+
LOGE("JNI_OnLoad: GetEnv failed");
123+
return -1;
124+
}
125+
jclass clazz =
126+
env->FindClass("androidx/media3/decoder/ffmpeg/FfmpegAudioDecoder");
127+
if (!clazz) {
128+
LOGE("JNI_OnLoad: FindClass failed");
129+
return -1;
130+
}
131+
growOutputBufferMethod =
132+
env->GetMethodID(clazz, "growOutputBuffer",
133+
"(Landroidx/media3/decoder/"
134+
"SimpleDecoderOutputBuffer;I)Ljava/nio/ByteBuffer;");
135+
if (!growOutputBufferMethod) {
136+
LOGE("JNI_OnLoad: GetMethodID failed");
109137
return -1;
110138
}
111139
return JNI_VERSION_1_6;
@@ -136,12 +164,13 @@ AUDIO_DECODER_FUNC(jlong, ffmpegInitialize, jstring codecName,
136164
}
137165

138166
AUDIO_DECODER_FUNC(jint, ffmpegDecode, jlong context, jobject inputData,
139-
jint inputSize, jobject outputData, jint outputSize) {
167+
jint inputSize, jobject decoderOutputBuffer,
168+
jobject outputData, jint outputSize) {
140169
if (!context) {
141170
LOGE("Context must be non-NULL.");
142171
return -1;
143172
}
144-
if (!inputData || !outputData) {
173+
if (!inputData || !decoderOutputBuffer || !outputData) {
145174
LOGE("Input and output buffers must be non-NULL.");
146175
return -1;
147176
}
@@ -163,11 +192,23 @@ AUDIO_DECODER_FUNC(jint, ffmpegDecode, jlong context, jobject inputData,
163192
packet->data = inputBuffer;
164193
packet->size = inputSize;
165194
const int ret =
166-
decodePacket((AVCodecContext *)context, packet, outputBuffer, outputSize);
195+
decodePacket((AVCodecContext *)context, packet, outputBuffer, outputSize,
196+
GrowOutputBufferCallback{env, thiz, decoderOutputBuffer});
167197
av_packet_free(&packet);
168198
return ret;
169199
}
170200

201+
uint8_t *GrowOutputBufferCallback::operator()(int requiredSize) const {
202+
jobject newOutputData = env->CallObjectMethod(
203+
thiz, growOutputBufferMethod, decoderOutputBuffer, requiredSize);
204+
if (env->ExceptionCheck()) {
205+
LOGE("growOutputBuffer() failed");
206+
env->ExceptionDescribe();
207+
return nullptr;
208+
}
209+
return static_cast<uint8_t *>(env->GetDirectBufferAddress(newOutputData));
210+
}
211+
171212
AUDIO_DECODER_FUNC(jint, ffmpegGetChannelCount, jlong context) {
172213
if (!context) {
173214
LOGE("Context must be non-NULL.");
@@ -266,7 +307,8 @@ AVCodecContext *createContext(JNIEnv *env, const AVCodec *codec,
266307
}
267308

268309
int decodePacket(AVCodecContext *context, AVPacket *packet,
269-
uint8_t *outputBuffer, int outputSize) {
310+
uint8_t *outputBuffer, int outputSize,
311+
GrowOutputBufferCallback growBuffer) {
270312
int result = 0;
271313
// Queue input data.
272314
result = avcodec_send_packet(context, packet);
@@ -326,15 +368,22 @@ int decodePacket(AVCodecContext *context, AVPacket *packet,
326368
}
327369
context->opaque = resampleContext;
328370
}
329-
int inSampleSize = av_get_bytes_per_sample(sampleFormat);
371+
330372
int outSampleSize = av_get_bytes_per_sample(context->request_sample_fmt);
331373
int outSamples = swr_get_out_samples(resampleContext, sampleCount);
332374
int bufferOutSize = outSampleSize * channelCount * outSamples;
333375
if (outSize + bufferOutSize > outputSize) {
334-
LOGE("Output buffer size (%d) too small for output data (%d).",
335-
outputSize, outSize + bufferOutSize);
336-
av_frame_free(&frame);
337-
return AUDIO_DECODER_ERROR_INVALID_DATA;
376+
LOGD(
377+
"Output buffer size (%d) too small for output data (%d), "
378+
"reallocating buffer.",
379+
outputSize, outSize + bufferOutSize);
380+
outputSize = outSize + bufferOutSize;
381+
outputBuffer = growBuffer(outputSize);
382+
if (!outputBuffer) {
383+
LOGE("Failed to reallocate output buffer.");
384+
av_frame_free(&frame);
385+
return AUDIO_DECODER_ERROR_OTHER;
386+
}
338387
}
339388
result = swr_convert(resampleContext, &outputBuffer, bufferOutSize,
340389
(const uint8_t **)frame->data, frame->nb_samples);

‎app/src/main/AndroidManifest.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
xmlns:tools="http://schemas.android.com/tools"
44
android:installLocation="auto">
55

6-
<uses-sdk tools:overrideLibrary="androidx.media3.effect, androidx.media3.transformer, androidx.camera.camera2, androidx.camera.core, androidx.camera.view, androidx.camera.lifecycle, androidx.camera.extensions, com.otaliastudios.transcoder, com.otaliastudios.opengl" />
6+
<uses-sdk tools:overrideLibrary="androidx.media3.exoplayer, androidx.media3.common, androidx.media3.transformer, androidx.media3.extractor, androidx.media3.muxer, androidx.media3.decoder, androidx.media3.container, androidx.media3.datasource, androidx.media3.database, androidx.media3.effect, androidx.camera.camera2, androidx.camera.core, androidx.camera.view, androidx.camera.lifecycle, androidx.camera.extensions, com.otaliastudios.transcoder, com.otaliastudios.opengl" />
77

88
<uses-feature
99
android:glEsVersion="0x00020000"

‎buildSrc/src/main/kotlin/Config.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ object LibraryVersions {
2626
const val DESUGAR = "2.0.4"
2727
const val ANDROIDX_CORE = "1.12.0"
2828
const val ANNOTATIONS = "1.7.1"
29-
const val ANDROIDX_MEDIA = "1.2.1"
29+
const val ANDROIDX_MEDIA = "1.3.0"
3030
}
3131

3232
class AbiVariant (val flavor: String, vararg val filters: String = arrayOf(), val displayName: String = filters[0]) {

‎scripts/private/patch-androidx-media-impl.sh

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ sed_rules=\
3333
'$!N;s/^#define LOG_TAG "[^"]+"\n//g;'\
3434
'$!N;s/^(#define A?LOGE\(\.\.\.\) (\\\n *)*\((\(void\))?)[a-zA-Z_]+\([^\\)]+(\\\n[^\\)]+)*\)/\1loge(TAG_NDK, __VA_ARGS__)/g;'\
3535
'$!N;s/^(#define A?LOGV\(\.\.\.\) (\\\n *)*\((\(void\))?)[a-zA-Z_]+\([^\\)]+(\\\n[^\\)]+)*\)/\1logv(TAG_NDK, __VA_ARGS__)/g;'\
36+
'$!N;s/^(#define A?LOGD\(\.\.\.\) (\\\n *)*\((\(void\))?)[a-zA-Z_]+\([^\\)]+(\\\n[^\\)]+)*\)/\1logd(TAG_NDK, __VA_ARGS__)/g;'\
3637
'$!N;s/^(#define LOG_ALWAYS_FATAL\(\.\.\.\) (\\\n *)*\((\(void\))?)[a-zA-Z_]+\([^\\)]+(\\\n[^\\)]+)*\)/\1loga(TAG_NDK, __VA_ARGS__)/g;'\
3738
'$!N;s/(^jint JNI_OnLoad\(JavaVM *\* *[a-zA-Z0-9_]*, void *\* *[a-zA-Z0-9_]*\) \{\n( [^\n]+\n)*\})/\/*\1*\//g;P;D'
3839

‎thirdparty/androidx-media

Submodule androidx-media updated 1009 files

0 commit comments

Comments
 (0)