Remove FfmpegVideoRenderer from 2.18.0 release
This commit is contained in:
parent
9d460023a2
commit
a626bcdb7c
@ -50,7 +50,7 @@ public final class FfmpegLibrary {
|
|||||||
/**
|
/**
|
||||||
* Override the names of the FFmpeg native libraries. If an application wishes to call this
|
* Override the names of the FFmpeg native libraries. If an application wishes to call this
|
||||||
* method, it must do so before calling any other method defined by this class, and before
|
* method, it must do so before calling any other method defined by this class, and before
|
||||||
* instantiating a {@link FfmpegAudioRenderer} or {@link FfmpegVideoRenderer} instance.
|
* instantiating a {@link FfmpegAudioRenderer} instance.
|
||||||
*
|
*
|
||||||
* @param libraries The names of the FFmpeg native libraries.
|
* @param libraries The names of the FFmpeg native libraries.
|
||||||
*/
|
*/
|
||||||
@ -148,10 +148,6 @@ public final class FfmpegLibrary {
|
|||||||
return "pcm_mulaw";
|
return "pcm_mulaw";
|
||||||
case MimeTypes.AUDIO_ALAW:
|
case MimeTypes.AUDIO_ALAW:
|
||||||
return "pcm_alaw";
|
return "pcm_alaw";
|
||||||
case MimeTypes.VIDEO_H264:
|
|
||||||
return "h264";
|
|
||||||
case MimeTypes.VIDEO_H265:
|
|
||||||
return "hevc";
|
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1,136 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2020 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package androidx.media3.decoder.ffmpeg;
|
|
||||||
|
|
||||||
import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_MIME_TYPE_CHANGED;
|
|
||||||
import static androidx.media3.exoplayer.DecoderReuseEvaluation.REUSE_RESULT_NO;
|
|
||||||
import static androidx.media3.exoplayer.DecoderReuseEvaluation.REUSE_RESULT_YES_WITHOUT_RECONFIGURATION;
|
|
||||||
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.view.Surface;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.media3.common.C;
|
|
||||||
import androidx.media3.common.Format;
|
|
||||||
import androidx.media3.common.util.TraceUtil;
|
|
||||||
import androidx.media3.common.util.UnstableApi;
|
|
||||||
import androidx.media3.common.util.Util;
|
|
||||||
import androidx.media3.decoder.CryptoConfig;
|
|
||||||
import androidx.media3.decoder.Decoder;
|
|
||||||
import androidx.media3.decoder.DecoderInputBuffer;
|
|
||||||
import androidx.media3.decoder.VideoDecoderOutputBuffer;
|
|
||||||
import androidx.media3.exoplayer.DecoderReuseEvaluation;
|
|
||||||
import androidx.media3.exoplayer.RendererCapabilities;
|
|
||||||
import androidx.media3.exoplayer.video.DecoderVideoRenderer;
|
|
||||||
import androidx.media3.exoplayer.video.VideoRendererEventListener;
|
|
||||||
|
|
||||||
// TODO: Remove the NOTE below.
|
|
||||||
/**
|
|
||||||
* <b>NOTE: This class if under development and is not yet functional.</b>
|
|
||||||
*
|
|
||||||
* <p>Decodes and renders video using FFmpeg.
|
|
||||||
*/
|
|
||||||
@UnstableApi
|
|
||||||
public final class FfmpegVideoRenderer extends DecoderVideoRenderer {
|
|
||||||
|
|
||||||
private static final String TAG = "FfmpegVideoRenderer";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new instance.
|
|
||||||
*
|
|
||||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
|
||||||
* can attempt to seamlessly join an ongoing playback.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
|
||||||
*/
|
|
||||||
public FfmpegVideoRenderer(
|
|
||||||
long allowedJoiningTimeMs,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
|
||||||
int maxDroppedFramesToNotify) {
|
|
||||||
super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
|
|
||||||
// TODO: Implement.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final @RendererCapabilities.Capabilities int supportsFormat(Format format) {
|
|
||||||
// TODO: Remove this line and uncomment the implementation below.
|
|
||||||
return C.FORMAT_UNSUPPORTED_TYPE;
|
|
||||||
/*
|
|
||||||
String mimeType = Assertions.checkNotNull(format.sampleMimeType);
|
|
||||||
if (!FfmpegLibrary.isAvailable() || !MimeTypes.isVideo(mimeType)) {
|
|
||||||
return FORMAT_UNSUPPORTED_TYPE;
|
|
||||||
} else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType)) {
|
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
|
||||||
} else if (format.exoMediaCryptoType != null) {
|
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
|
||||||
} else {
|
|
||||||
return RendererCapabilities.create(
|
|
||||||
FORMAT_HANDLED,
|
|
||||||
ADAPTIVE_SEAMLESS,
|
|
||||||
TUNNELING_NOT_SUPPORTED);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("nullness:return")
|
|
||||||
@Override
|
|
||||||
protected Decoder<DecoderInputBuffer, VideoDecoderOutputBuffer, FfmpegDecoderException>
|
|
||||||
createDecoder(Format format, @Nullable CryptoConfig cryptoConfig)
|
|
||||||
throws FfmpegDecoderException {
|
|
||||||
TraceUtil.beginSection("createFfmpegVideoDecoder");
|
|
||||||
// TODO: Implement, remove the SuppressWarnings annotation, and update the return type to use
|
|
||||||
// the concrete type of the decoder (probably FfmepgVideoDecoder).
|
|
||||||
TraceUtil.endSection();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void renderOutputBufferToSurface(VideoDecoderOutputBuffer outputBuffer, Surface surface)
|
|
||||||
throws FfmpegDecoderException {
|
|
||||||
// TODO: Implement.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setDecoderOutputMode(@C.VideoOutputMode int outputMode) {
|
|
||||||
// TODO: Uncomment the implementation below.
|
|
||||||
/*
|
|
||||||
if (decoder != null) {
|
|
||||||
decoder.setOutputMode(outputMode);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected DecoderReuseEvaluation canReuseDecoder(
|
|
||||||
String decoderName, Format oldFormat, Format newFormat) {
|
|
||||||
boolean sameMimeType = Util.areEqual(oldFormat.sampleMimeType, newFormat.sampleMimeType);
|
|
||||||
// TODO: Ability to reuse the decoder may be MIME type dependent.
|
|
||||||
return new DecoderReuseEvaluation(
|
|
||||||
decoderName,
|
|
||||||
oldFormat,
|
|
||||||
newFormat,
|
|
||||||
sameMimeType ? REUSE_RESULT_YES_WITHOUT_RECONFIGURATION : REUSE_RESULT_NO,
|
|
||||||
sameMimeType ? 0 : DISCARD_REASON_MIME_TYPE_CHANGED);
|
|
||||||
}
|
|
||||||
}
|
|
@ -21,10 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
/**
|
/** Unit test for {@link DefaultRenderersFactoryTest} with {@link FfmpegAudioRenderer}. */
|
||||||
* Unit test for {@link DefaultRenderersFactoryTest} with {@link FfmpegAudioRenderer} and {@link
|
|
||||||
* FfmpegVideoRenderer}.
|
|
||||||
*/
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class DefaultRenderersFactoryTest {
|
public final class DefaultRenderersFactoryTest {
|
||||||
|
|
||||||
@ -33,10 +30,4 @@ public final class DefaultRenderersFactoryTest {
|
|||||||
DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
|
DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
|
||||||
FfmpegAudioRenderer.class, C.TRACK_TYPE_AUDIO);
|
FfmpegAudioRenderer.class, C.TRACK_TYPE_AUDIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void createRenderers_instantiatesFfmpegVideoRenderer() {
|
|
||||||
DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
|
|
||||||
FfmpegVideoRenderer.class, C.TRACK_TYPE_VIDEO);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -9,10 +9,6 @@
|
|||||||
-keepclassmembers class androidx.media3.decoder.av1.Libgav1VideoRenderer {
|
-keepclassmembers class androidx.media3.decoder.av1.Libgav1VideoRenderer {
|
||||||
<init>(long, android.os.Handler, androidx.media3.exoplayer.video.VideoRendererEventListener, int);
|
<init>(long, android.os.Handler, androidx.media3.exoplayer.video.VideoRendererEventListener, int);
|
||||||
}
|
}
|
||||||
-dontnote androidx.media3.decoder.ffmpeg.FfmpegVideoRenderer
|
|
||||||
-keepclassmembers class androidx.media3.decoder.ffmpeg.FfmpegVideoRenderer {
|
|
||||||
<init>(long, android.os.Handler, androidx.media3.exoplayer.video.VideoRendererEventListener, int);
|
|
||||||
}
|
|
||||||
-dontnote androidx.media3.decoder.opus.LibopusAudioRenderer
|
-dontnote androidx.media3.decoder.opus.LibopusAudioRenderer
|
||||||
-keepclassmembers class androidx.media3.decoder.opus.LibopusAudioRenderer {
|
-keepclassmembers class androidx.media3.decoder.opus.LibopusAudioRenderer {
|
||||||
<init>(android.os.Handler, androidx.media3.exoplayer.audio.AudioRendererEventListener, androidx.media3.exoplayer.audio.AudioSink);
|
<init>(android.os.Handler, androidx.media3.exoplayer.audio.AudioRendererEventListener, androidx.media3.exoplayer.audio.AudioSink);
|
||||||
|
@ -415,31 +415,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
// The extension is present, but instantiation failed.
|
// The extension is present, but instantiation failed.
|
||||||
throw new RuntimeException("Error instantiating AV1 extension", e);
|
throw new RuntimeException("Error instantiating AV1 extension", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
// Full class names used for constructor args so the LINT rule triggers if any of them move.
|
|
||||||
Class<?> clazz = Class.forName("androidx.media3.decoder.ffmpeg.FfmpegVideoRenderer");
|
|
||||||
Constructor<?> constructor =
|
|
||||||
clazz.getConstructor(
|
|
||||||
long.class,
|
|
||||||
android.os.Handler.class,
|
|
||||||
androidx.media3.exoplayer.video.VideoRendererEventListener.class,
|
|
||||||
int.class);
|
|
||||||
Renderer renderer =
|
|
||||||
(Renderer)
|
|
||||||
constructor.newInstance(
|
|
||||||
allowedVideoJoiningTimeMs,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY);
|
|
||||||
out.add(extensionRendererIndex++, renderer);
|
|
||||||
Log.i(TAG, "Loaded FfmpegVideoRenderer.");
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
// Expected if the app was built without the extension.
|
|
||||||
} catch (Exception e) {
|
|
||||||
// The extension is present, but instantiation failed.
|
|
||||||
throw new RuntimeException("Error instantiating FFmpeg extension", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user