Merge branch 'dev' into alang-selector
This commit is contained in:
commit
2edc223e77
59 changed files with 214 additions and 185 deletions
|
|
@ -69,7 +69,6 @@ import com.google.android.exoplayer2.ExoPlayer;
|
|||
import com.google.android.exoplayer2.PlaybackException;
|
||||
import com.google.android.exoplayer2.PlaybackParameters;
|
||||
import com.google.android.exoplayer2.Player.PositionInfo;
|
||||
import com.google.android.exoplayer2.RenderersFactory;
|
||||
import com.google.android.exoplayer2.Timeline;
|
||||
import com.google.android.exoplayer2.Tracks;
|
||||
import com.google.android.exoplayer2.source.MediaSource;
|
||||
|
|
@ -77,7 +76,6 @@ import com.google.android.exoplayer2.text.CueGroup;
|
|||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
|
||||
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import com.google.android.exoplayer2.video.VideoSize;
|
||||
import com.squareup.picasso.Picasso;
|
||||
import com.squareup.picasso.Target;
|
||||
|
|
@ -97,6 +95,7 @@ import org.schabi.newpipe.local.history.HistoryRecordManager;
|
|||
import org.schabi.newpipe.player.event.PlayerEventListener;
|
||||
import org.schabi.newpipe.player.event.PlayerServiceEventListener;
|
||||
import org.schabi.newpipe.player.helper.AudioReactor;
|
||||
import org.schabi.newpipe.player.helper.CustomRenderersFactory;
|
||||
import org.schabi.newpipe.player.helper.LoadController;
|
||||
import org.schabi.newpipe.player.helper.PlayerDataSource;
|
||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||
|
|
@ -116,7 +115,6 @@ import org.schabi.newpipe.player.ui.PlayerUiList;
|
|||
import org.schabi.newpipe.player.ui.PopupPlayerUi;
|
||||
import org.schabi.newpipe.player.ui.VideoPlayerUi;
|
||||
import org.schabi.newpipe.util.DependentPreferenceHelper;
|
||||
import org.schabi.newpipe.util.DeviceUtils;
|
||||
import org.schabi.newpipe.util.ListHelper;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.PicassoHelper;
|
||||
|
|
@ -199,7 +197,7 @@ public final class Player implements PlaybackListener, Listener {
|
|||
|
||||
@NonNull private final DefaultTrackSelector trackSelector;
|
||||
@NonNull private final LoadController loadController;
|
||||
@NonNull private final RenderersFactory renderFactory;
|
||||
@NonNull private final DefaultRenderersFactory renderFactory;
|
||||
|
||||
@NonNull private final VideoPlaybackResolver videoResolver;
|
||||
@NonNull private final AudioPlaybackResolver audioResolver;
|
||||
|
|
@ -264,7 +262,16 @@ public final class Player implements PlaybackListener, Listener {
|
|||
final PlayerDataSource dataSource = new PlayerDataSource(context,
|
||||
new DefaultBandwidthMeter.Builder(context).build());
|
||||
loadController = new LoadController();
|
||||
renderFactory = new DefaultRenderersFactory(context);
|
||||
|
||||
renderFactory = prefs.getBoolean(
|
||||
context.getString(
|
||||
R.string.always_use_exoplayer_set_output_surface_workaround_key), false)
|
||||
? new CustomRenderersFactory(context) : new DefaultRenderersFactory(context);
|
||||
|
||||
renderFactory.setEnableDecoderFallback(
|
||||
prefs.getBoolean(
|
||||
context.getString(
|
||||
R.string.use_exoplayer_decoder_fallback_key), false));
|
||||
|
||||
videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver());
|
||||
audioResolver = new AudioPlaybackResolver(context, dataSource);
|
||||
|
|
@ -521,16 +528,11 @@ public final class Player implements PlaybackListener, Listener {
|
|||
// Setup UIs
|
||||
UIs.call(PlayerUi::initPlayer);
|
||||
|
||||
// enable media tunneling
|
||||
if (DEBUG && PreferenceManager.getDefaultSharedPreferences(context)
|
||||
// Disable media tunneling if requested by the user from ExoPlayer settings
|
||||
if (!PreferenceManager.getDefaultSharedPreferences(context)
|
||||
.getBoolean(context.getString(R.string.disable_media_tunneling_key), false)) {
|
||||
Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] "
|
||||
+ "media tunneling disabled in debug preferences");
|
||||
} else if (DeviceUtils.shouldSupportMediaTunneling()) {
|
||||
trackSelector.setParameters(trackSelector.buildUponParameters()
|
||||
.setTunnelingEnabled(true));
|
||||
} else if (DEBUG) {
|
||||
Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] does not support media tunneling");
|
||||
}
|
||||
}
|
||||
//endregion
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
package org.schabi.newpipe.player.helper;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter;
|
||||
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
||||
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer;
|
||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||
|
||||
/**
|
||||
* A {@link MediaCodecVideoRenderer} which always enable the output surface workaround that
|
||||
* ExoPlayer enables on several devices which are known to implement
|
||||
* {@link android.media.MediaCodec#setOutputSurface(android.view.Surface)
|
||||
* MediaCodec.setOutputSurface(Surface)} incorrectly.
|
||||
*
|
||||
* <p>
|
||||
* See {@link MediaCodecVideoRenderer#codecNeedsSetOutputSurfaceWorkaround(String)} for more
|
||||
* details.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* This custom {@link MediaCodecVideoRenderer} may be useful in the case a device is affected by
|
||||
* this issue but is not present in ExoPlayer's list.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* This class has only effect on devices with Android 6 and higher, as the {@code setOutputSurface}
|
||||
* method is only implemented in these Android versions and the method used as a workaround is
|
||||
* always applied on older Android versions (releasing and re-instantiating video codec instances).
|
||||
* </p>
|
||||
*/
|
||||
public final class CustomMediaCodecVideoRenderer extends MediaCodecVideoRenderer {
|
||||
|
||||
@SuppressWarnings({"checkstyle:ParameterNumber", "squid:S107"})
|
||||
public CustomMediaCodecVideoRenderer(final Context context,
|
||||
final MediaCodecAdapter.Factory codecAdapterFactory,
|
||||
final MediaCodecSelector mediaCodecSelector,
|
||||
final long allowedJoiningTimeMs,
|
||||
final boolean enableDecoderFallback,
|
||||
@Nullable final Handler eventHandler,
|
||||
@Nullable final VideoRendererEventListener eventListener,
|
||||
final int maxDroppedFramesToNotify) {
|
||||
super(context, codecAdapterFactory, mediaCodecSelector, allowedJoiningTimeMs,
|
||||
enableDecoderFallback, eventHandler, eventListener, maxDroppedFramesToNotify);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean codecNeedsSetOutputSurfaceWorkaround(final String name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package org.schabi.newpipe.player.helper;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
|
||||
import com.google.android.exoplayer2.DefaultRenderersFactory;
|
||||
import com.google.android.exoplayer2.Renderer;
|
||||
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* A {@link DefaultRenderersFactory} which only uses {@link CustomMediaCodecVideoRenderer} as an
|
||||
* implementation of video codec renders.
|
||||
*
|
||||
* <p>
|
||||
* As no ExoPlayer extension is currently used, the reflection code used by ExoPlayer to try to
|
||||
* load video extension libraries is not needed in our case and has been removed. This should be
|
||||
* changed in the case an extension is shipped with the app, such as the AV1 one.
|
||||
* </p>
|
||||
*/
|
||||
public final class CustomRenderersFactory extends DefaultRenderersFactory {
|
||||
|
||||
public CustomRenderersFactory(final Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@SuppressWarnings("checkstyle:ParameterNumber")
|
||||
@Override
|
||||
protected void buildVideoRenderers(final Context context,
|
||||
@ExtensionRendererMode final int extensionRendererMode,
|
||||
final MediaCodecSelector mediaCodecSelector,
|
||||
final boolean enableDecoderFallback,
|
||||
final Handler eventHandler,
|
||||
final VideoRendererEventListener eventListener,
|
||||
final long allowedVideoJoiningTimeMs,
|
||||
final ArrayList<Renderer> out) {
|
||||
out.add(new CustomMediaCodecVideoRenderer(context, getCodecAdapterFactory(),
|
||||
mediaCodecSelector, allowedVideoJoiningTimeMs, enableDecoderFallback, eventHandler,
|
||||
eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
|
||||
}
|
||||
}
|
||||
|
|
@ -13,6 +13,7 @@ import androidx.annotation.Nullable;
|
|||
import androidx.annotation.StringRes;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
import androidx.core.app.PendingIntentCompat;
|
||||
import androidx.core.app.ServiceCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
|
|
@ -21,7 +22,6 @@ import org.schabi.newpipe.R;
|
|||
import org.schabi.newpipe.player.Player;
|
||||
import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.PendingIntentCompat;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
|
@ -134,7 +134,7 @@ public final class NotificationUtil {
|
|||
.setColorized(player.getPrefs().getBoolean(
|
||||
player.getContext().getString(R.string.notification_colorize_key), true))
|
||||
.setDeleteIntent(PendingIntentCompat.getBroadcast(player.getContext(),
|
||||
NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT));
|
||||
NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT, false));
|
||||
|
||||
// set the initial value for the video thumbnail, updatable with updateNotificationThumbnail
|
||||
setLargeIcon(builder);
|
||||
|
|
@ -152,7 +152,7 @@ public final class NotificationUtil {
|
|||
|
||||
// also update content intent, in case the user switched players
|
||||
notificationBuilder.setContentIntent(PendingIntentCompat.getActivity(player.getContext(),
|
||||
NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT));
|
||||
NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT, false));
|
||||
notificationBuilder.setContentTitle(player.getVideoTitle());
|
||||
notificationBuilder.setContentText(player.getUploaderName());
|
||||
notificationBuilder.setTicker(player.getVideoTitle());
|
||||
|
|
@ -335,7 +335,7 @@ public final class NotificationUtil {
|
|||
final String intentAction) {
|
||||
return new NotificationCompat.Action(drawable, player.getContext().getString(title),
|
||||
PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID,
|
||||
new Intent(intentAction), FLAG_UPDATE_CURRENT));
|
||||
new Intent(intentAction), FLAG_UPDATE_CURRENT, false));
|
||||
}
|
||||
|
||||
private Intent getIntentForNotification() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue