From 50b065b68a685d85b098527eb94184f7c4568c6e Mon Sep 17 00:00:00 2001 From: Nick Chalko Date: Thu, 12 Sep 2019 08:58:20 -0700 Subject: Use AutoFactory for tuner module classes Bug: 140282849 Test: m live-tv-tuner PiperOrigin-RevId: 268695510 Change-Id: I200d102d5df061397d6c87565b000ca3f569bc2b --- tuner/build.gradle | 2 +- .../tuner/exoplayer/ExoPlayerSampleExtractor.java | 35 +++++++++++++++++---- .../tv/tuner/exoplayer/FileSampleExtractor.java | 23 ++++++++++++-- .../tv/tuner/exoplayer/MpegTsRendererBuilder.java | 30 ++++++++++++++++-- .../tv/tuner/exoplayer/MpegTsSampleExtractor.java | 35 ++++++++++++++++++--- .../exoplayer/buffer/RecordingSampleBuffer.java | 24 +++++++++++++-- .../exoplayer/buffer/SampleChunkIoHelper.java | 18 +++++++++++ .../com/android/tv/tuner/modules/TunerModule.java | 36 ++++++++++++++++++++++ .../tuner/tvinput/TunerRecordingSessionWorker.java | 10 +++--- .../tv/tuner/tvinput/TunerSessionWorker.java | 9 ++++-- .../tv/tuner/tvinput/TunerSessionWorkerExoV2.java | 9 ++++-- .../exoplayer/tests/SampleSourceExtractorTest.java | 6 ++-- .../tuner/tvinput/TunerSessionWorkerExoV2Test.java | 2 ++ .../tv/tuner/tvinput/TunerSessionWorkerTest.java | 1 + .../com/android/tv/tuner/ZappingTimeTest.java | 26 +++++++++++++--- 15 files changed, 233 insertions(+), 33 deletions(-) (limited to 'tuner') diff --git a/tuner/build.gradle b/tuner/build.gradle index c1001c8e..b00b4609 100644 --- a/tuner/build.gradle +++ b/tuner/build.gradle @@ -69,7 +69,7 @@ dependencies { implementation 'androidx.tvprovider:tvprovider:1.0.0' implementation 'com.google.android.exoplayer:exoplayer:r1.5.16' - implementation 'com.google.android.exoplayer:exoplayer-core:2.10.1' + api 'com.google.android.exoplayer:exoplayer-core:2.10.1' annotationProcessor 'com.google.auto.factory:auto-factory:1.0-beta6' implementation 'com.google.auto.factory:auto-factory:1.0-beta6' implementation 'com.google.dagger:dagger:2.23' diff --git a/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java b/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java index 124e04dc..2a22db17 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java @@ -23,6 +23,7 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.SystemClock; +import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.util.Pair; @@ -31,6 +32,7 @@ import com.android.tv.tuner.exoplayer.buffer.BufferManager; import com.android.tv.tuner.exoplayer.buffer.PlaybackBufferListener; import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer; import com.android.tv.tuner.exoplayer.buffer.SimpleSampleBuffer; + import com.google.android.exoplayer.MediaFormat; import com.google.android.exoplayer.MediaFormatHolder; import com.google.android.exoplayer.SampleHolder; @@ -47,6 +49,8 @@ import com.google.android.exoplayer2.trackselection.FixedTrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; import java.io.IOException; import java.util.ArrayList; @@ -84,12 +88,29 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { private Handler mOnCompletionListenerHandler; private IOException mError; + /** + * Factory for {@link ExoPlayerSampleExtractor}. + * + *

This wrapper class keeps other classes from needing to reference the {@link AutoFactory} + * generated class. + */ + public interface Factory { + public ExoPlayerSampleExtractor create( + Uri uri, + DataSource source, + @Nullable BufferManager bufferManager, + PlaybackBufferListener bufferListener, + boolean isRecording); + } + + @AutoFactory(implementing = Factory.class) public ExoPlayerSampleExtractor( Uri uri, DataSource source, - BufferManager bufferManager, + @Nullable BufferManager bufferManager, PlaybackBufferListener bufferListener, - boolean isRecording) { + boolean isRecording, + @Provided RecordingSampleBuffer.Factory recordingSampleBufferFactory) { this( uri, source, @@ -97,7 +118,8 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { bufferListener, isRecording, Looper.myLooper(), - new HandlerThread("SourceReaderThread")); + new HandlerThread("SourceReaderThread"), + recordingSampleBufferFactory); } @VisibleForTesting @@ -109,7 +131,8 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { PlaybackBufferListener bufferListener, boolean isRecording, Looper workerLooper, - HandlerThread sourceReaderThread) { + HandlerThread sourceReaderThread, + RecordingSampleBuffer.Factory recordingSampleBufferFactory) { // It'll be used as a timeshift file chunk name's prefix. mId = System.currentTimeMillis(); @@ -124,7 +147,7 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { /* eventListener= */ error -> mError = error)); if (isRecording) { mSampleBuffer = - new RecordingSampleBuffer( + recordingSampleBufferFactory.create( bufferManager, bufferListener, false, @@ -134,7 +157,7 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { mSampleBuffer = new SimpleSampleBuffer(bufferListener); } else { mSampleBuffer = - new RecordingSampleBuffer( + recordingSampleBufferFactory.create( bufferManager, bufferListener, true, diff --git a/tuner/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java b/tuner/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java index d6685b2f..aaca043b 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java @@ -26,6 +26,8 @@ import com.google.android.exoplayer.MediaFormat; import com.google.android.exoplayer.MediaFormatHolder; import com.google.android.exoplayer.MediaFormatUtil; import com.google.android.exoplayer.SampleHolder; +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; import java.io.IOException; import java.util.ArrayList; @@ -46,11 +48,28 @@ public class FileSampleExtractor implements SampleExtractor { private final BufferManager mBufferManager; private final PlaybackBufferListener mBufferListener; private BufferManager.SampleBuffer mSampleBuffer; + private final RecordingSampleBuffer.Factory mRecordingSampleBufferFactory; + + /** + * Factory for {@link FileSampleExtractor}}. + * + *

This wrapper class keeps other classes from needing to reference the {@link AutoFactory} + * generated class. + */ + public interface Factory { + public FileSampleExtractor create( + BufferManager bufferManager, PlaybackBufferListener bufferListener); + } - public FileSampleExtractor(BufferManager bufferManager, PlaybackBufferListener bufferListener) { + @AutoFactory(implementing = Factory.class) + public FileSampleExtractor( + BufferManager bufferManager, + PlaybackBufferListener bufferListener, + @Provided RecordingSampleBuffer.Factory recordingSampleBufferFactory) { mBufferManager = bufferManager; mBufferListener = bufferListener; mTrackCount = -1; + mRecordingSampleBufferFactory = recordingSampleBufferFactory; } @Override @@ -73,7 +92,7 @@ public class FileSampleExtractor implements SampleExtractor { mTrackFormats.add(MediaFormatUtil.createMediaFormat(trackFormat.format)); } mSampleBuffer = - new RecordingSampleBuffer( + mRecordingSampleBufferFactory.create( mBufferManager, mBufferListener, true, diff --git a/tuner/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java b/tuner/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java index a807adbb..f860631c 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java @@ -17,28 +17,51 @@ package com.android.tv.tuner.exoplayer; import android.content.Context; +import android.support.annotation.Nullable; import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilder; import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilderCallback; import com.android.tv.tuner.exoplayer.audio.MpegTsDefaultAudioTrackRenderer; import com.android.tv.tuner.exoplayer.buffer.BufferManager; import com.android.tv.tuner.exoplayer.buffer.PlaybackBufferListener; + import com.google.android.exoplayer.MediaCodecSelector; import com.google.android.exoplayer.SampleSource; import com.google.android.exoplayer.TrackRenderer; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; /** Builder for renderer objects for {@link MpegTsPlayer}. */ public class MpegTsRendererBuilder implements RendererBuilder { private final Context mContext; private final BufferManager mBufferManager; private final PlaybackBufferListener mBufferListener; + private final MpegTsSampleExtractor.Factory mMpegTsSampleExtractorFactory; + + /** + * Factory for {@link MpegTsRendererBuilder}. + * + *

This wrapper class keeps other classes from needing to reference the {@link AutoFactory} + * generated class. + */ + public interface Factory { + public MpegTsRendererBuilder create( + Context context, + @Nullable BufferManager bufferManager, + PlaybackBufferListener bufferListener); + } + @AutoFactory(implementing = Factory.class) public MpegTsRendererBuilder( - Context context, BufferManager bufferManager, PlaybackBufferListener bufferListener) { + Context context, + @Nullable BufferManager bufferManager, + PlaybackBufferListener bufferListener, + @Provided MpegTsSampleExtractor.Factory mpegTsSampleExtractorFactory) { mContext = context; mBufferManager = bufferManager; mBufferListener = bufferListener; + mMpegTsSampleExtractorFactory = mpegTsSampleExtractorFactory; } @Override @@ -47,8 +70,9 @@ public class MpegTsRendererBuilder implements RendererBuilder { // Build the video and audio renderers. SampleExtractor extractor = dataSource == null - ? new MpegTsSampleExtractor(mBufferManager, mBufferListener) - : new MpegTsSampleExtractor(dataSource, mBufferManager, mBufferListener); + ? mMpegTsSampleExtractorFactory.create(mBufferManager, mBufferListener) + : mMpegTsSampleExtractorFactory.create( + dataSource, mBufferManager, mBufferListener); SampleSource sampleSource = new MpegTsSampleSource(extractor); MpegTsVideoTrackRenderer videoRenderer = new MpegTsVideoTrackRenderer( diff --git a/tuner/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java b/tuner/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java index 0b4f980d..8d3668ef 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java @@ -18,16 +18,20 @@ package com.android.tv.tuner.exoplayer; import android.net.Uri; import android.os.Handler; +import android.support.annotation.Nullable; import com.android.tv.tuner.exoplayer.buffer.BufferManager; import com.android.tv.tuner.exoplayer.buffer.PlaybackBufferListener; import com.android.tv.tuner.exoplayer.buffer.SamplePool; + import com.google.android.exoplayer.MediaFormat; import com.google.android.exoplayer.MediaFormatHolder; import com.google.android.exoplayer.SampleHolder; import com.google.android.exoplayer.SampleSource; import com.google.android.exoplayer.util.MimeTypes; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; import java.io.IOException; import java.nio.ByteBuffer; @@ -59,6 +63,22 @@ public final class MpegTsSampleExtractor implements SampleExtractor { mCea708TextTrackSelected = false; } + /** + * Factory for {@link MpegTsSampleExtractor}. + * + *

This wrapper class keeps other classes from needing to reference the {@link AutoFactory} + * generated class. + */ + public interface Factory { + public MpegTsSampleExtractor create( + BufferManager bufferManager, PlaybackBufferListener bufferListener); + + public MpegTsSampleExtractor create( + DataSource source, + @Nullable BufferManager bufferManager, + PlaybackBufferListener bufferListener); + } + /** * Creates MpegTsSampleExtractor for a {@link DataSource}. * @@ -66,12 +86,14 @@ public final class MpegTsSampleExtractor implements SampleExtractor { * @param bufferManager the manager for reading & writing samples backed by physical storage * @param bufferListener the {@link PlaybackBufferListener} to notify buffer storage status */ + @AutoFactory(implementing = Factory.class) public MpegTsSampleExtractor( DataSource source, - BufferManager bufferManager, - PlaybackBufferListener bufferListener) { + @Nullable BufferManager bufferManager, + PlaybackBufferListener bufferListener, + @Provided ExoPlayerSampleExtractor.Factory exoPlayerSampleExtractorFactory) { mSampleExtractor = - new ExoPlayerSampleExtractor( + exoPlayerSampleExtractorFactory.create( Uri.EMPTY, source, bufferManager, bufferListener, false); init(); } @@ -83,9 +105,12 @@ public final class MpegTsSampleExtractor implements SampleExtractor { * @param bufferListener the {@link PlaybackBufferListener} to notify buffer storage status * change */ + @AutoFactory(implementing = Factory.class) public MpegTsSampleExtractor( - BufferManager bufferManager, PlaybackBufferListener bufferListener) { - mSampleExtractor = new FileSampleExtractor(bufferManager, bufferListener); + BufferManager bufferManager, + PlaybackBufferListener bufferListener, + @Provided FileSampleExtractor.Factory fileSampleExtractorFactory) { + mSampleExtractor = fileSampleExtractorFactory.create(bufferManager, bufferListener); init(); } diff --git a/tuner/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java b/tuner/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java index 00a34302..df2cd2e6 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java @@ -29,6 +29,8 @@ import com.google.android.exoplayer.MediaFormat; import com.google.android.exoplayer.SampleHolder; import com.google.android.exoplayer.SampleSource; import com.google.android.exoplayer.util.Assertions; +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; import java.io.IOException; import java.lang.annotation.Retention; @@ -71,6 +73,7 @@ public class RecordingSampleBuffer private final BufferManager mBufferManager; private final PlaybackBufferListener mBufferListener; private final @BufferReason int mBufferReason; + private final SampleChunkIoHelper.Factory mSampleChunkIoHelperFactory; private int mTrackCount; private boolean[] mTrackSelected; @@ -98,6 +101,20 @@ public class RecordingSampleBuffer } }; + /** + * Factory for {@link RecordingSampleBuffer}. + * + *

This wrapper class keeps other classes from needing to reference the {@link AutoFactory} + * generated class. + */ + public interface Factory { + public RecordingSampleBuffer create( + BufferManager bufferManager, + PlaybackBufferListener bufferListener, + boolean enableTrickplay, + @BufferReason int bufferReason); + } + /** * Creates {@link BufferManager.SampleBuffer} with cached I/O backed by physical storage (e.g. * trickplay,recording,recorded-playback). @@ -107,17 +124,20 @@ public class RecordingSampleBuffer * @param enableTrickplay {@code true} when trickplay should be enabled * @param bufferReason the reason for caching samples {@link BufferReason} */ + @AutoFactory(implementing = Factory.class) public RecordingSampleBuffer( BufferManager bufferManager, PlaybackBufferListener bufferListener, boolean enableTrickplay, - @BufferReason int bufferReason) { + @BufferReason int bufferReason, + @Provided SampleChunkIoHelper.Factory sampleChunkIoHelperFactory) { mBufferManager = bufferManager; mBufferListener = bufferListener; if (bufferListener != null) { bufferListener.onBufferStateChanged(enableTrickplay); } mBufferReason = bufferReason; + mSampleChunkIoHelperFactory = sampleChunkIoHelperFactory; } @Override @@ -130,7 +150,7 @@ public class RecordingSampleBuffer mTrackSelected = new boolean[mTrackCount]; mReadSampleQueues = new ArrayList<>(); mSampleChunkIoHelper = - new SampleChunkIoHelper( + mSampleChunkIoHelperFactory.create( ids, mediaFormats, mBufferReason, mBufferManager, mSamplePool, mIoCallback); for (int i = 0; i < mTrackCount; ++i) { mReadSampleQueues.add(i, new SampleQueue(mSamplePool)); diff --git a/tuner/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java b/tuner/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java index d16d0805..1454bdeb 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java @@ -31,6 +31,7 @@ import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer.BufferReason; import com.google.android.exoplayer.MediaFormat; import com.google.android.exoplayer.SampleHolder; import com.google.android.exoplayer.util.MimeTypes; +import com.google.auto.factory.AutoFactory; import java.io.IOException; import java.util.ArrayList; @@ -113,6 +114,22 @@ public class SampleChunkIoHelper implements Handler.Callback { } } + /** + * Factory for {@link SampleChunkIoHelper}. + * + *

This wrapper class keeps other classes from needing to reference the {@link AutoFactory} + * generated class. + */ + public interface Factory { + public SampleChunkIoHelper create( + List ids, + List mediaFormats, + @BufferReason int bufferReason, + BufferManager bufferManager, + SamplePool samplePool, + IoCallback ioCallback); + } + /** * Creates {@link SampleChunk} I/O handler. * @@ -123,6 +140,7 @@ public class SampleChunkIoHelper implements Handler.Callback { * @param samplePool allocator for a sample * @param ioCallback listeners for I/O events */ + @AutoFactory(implementing = Factory.class) public SampleChunkIoHelper( List ids, List mediaFormats, diff --git a/tuner/src/com/android/tv/tuner/modules/TunerModule.java b/tuner/src/com/android/tv/tuner/modules/TunerModule.java index bf40fbe8..ff86e09f 100644 --- a/tuner/src/com/android/tv/tuner/modules/TunerModule.java +++ b/tuner/src/com/android/tv/tuner/modules/TunerModule.java @@ -15,6 +15,18 @@ */ package com.android.tv.tuner.modules; +import com.android.tv.tuner.exoplayer.ExoPlayerSampleExtractor; +import com.android.tv.tuner.exoplayer.ExoPlayerSampleExtractorFactory; +import com.android.tv.tuner.exoplayer.FileSampleExtractor; +import com.android.tv.tuner.exoplayer.FileSampleExtractorFactory; +import com.android.tv.tuner.exoplayer.MpegTsRendererBuilder; +import com.android.tv.tuner.exoplayer.MpegTsRendererBuilderFactory; +import com.android.tv.tuner.exoplayer.MpegTsSampleExtractor; +import com.android.tv.tuner.exoplayer.MpegTsSampleExtractorFactory; +import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer; +import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBufferFactory; +import com.android.tv.tuner.exoplayer.buffer.SampleChunkIoHelper; +import com.android.tv.tuner.exoplayer.buffer.SampleChunkIoHelperFactory; import com.android.tv.tuner.source.TunerSourceModule; import com.android.tv.tuner.tvinput.TunerRecordingSessionFactoryImpl; import com.android.tv.tuner.tvinput.TunerRecordingSessionWorker; @@ -61,4 +73,28 @@ public abstract class TunerModule { @Binds abstract TunerRecordingSessionFactory tunerRecordingSessionFactory( TunerRecordingSessionFactoryImpl impl); + + @Binds + abstract MpegTsRendererBuilder.Factory mpegTsRendererBuilderFactory( + MpegTsRendererBuilderFactory mpegTsRendererBuilderFactory); + + @Binds + abstract MpegTsSampleExtractor.Factory mpegTsSampleExtractorFactory( + MpegTsSampleExtractorFactory mpegTsSampleExtractorFactory); + + @Binds + abstract FileSampleExtractor.Factory fileSampleExtractorFactory( + FileSampleExtractorFactory fileSampleExtractorFactory); + + @Binds + abstract RecordingSampleBuffer.Factory recordingSampleBufferFactory( + RecordingSampleBufferFactory recordingSampleBufferFactory); + + @Binds + abstract ExoPlayerSampleExtractor.Factory exoPlayerSampleExtractorFactory( + ExoPlayerSampleExtractorFactory exoPlayerSampleExtractorFactory); + + @Binds + abstract SampleChunkIoHelper.Factory sampleChunkIoHelperFactory( + SampleChunkIoHelperFactory sampleChunkIoHelperFactory); } diff --git a/tuner/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java b/tuner/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java index 851593a4..97cd0572 100644 --- a/tuner/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java +++ b/tuner/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java @@ -172,6 +172,7 @@ public class TunerRecordingSessionWorker private PsipData.EitItem mCurrenProgram; private List mCaptionTracks; private DvrStorageManager mDvrStorageManager; + private final ExoPlayerSampleExtractor.Factory mExoPlayerSampleExtractorFactory; /** * Factory for {@link TunerRecordingSessionWorker}}. @@ -187,13 +188,15 @@ public class TunerRecordingSessionWorker TunerRecordingSession session); } - @AutoFactory(implementing = TunerRecordingSessionWorker.Factory.class) + @AutoFactory(implementing = Factory.class) public TunerRecordingSessionWorker( Context context, String inputId, ChannelDataManager dataManager, TunerRecordingSession session, + @Provided ExoPlayerSampleExtractor.Factory exoPlayerSampleExtractorFactory, @Provided TsDataSourceManager.Factory tsDataSourceManagerFactory) { + mExoPlayerSampleExtractorFactory = exoPlayerSampleExtractorFactory; mRandom.setSeed(System.nanoTime()); mContext = context; HandlerThread handlerThread = new HandlerThread(TAG); @@ -473,7 +476,7 @@ public class TunerRecordingSessionWorker mRecordStartTime = System.currentTimeMillis(); mDvrStorageManager = new DvrStorageManager(mStorageDir, true); mRecorder = - new ExoPlayerSampleExtractor( + mExoPlayerSampleExtractorFactory.create( Uri.EMPTY, mTunerSource, new BufferManager(mDvrStorageManager), this, true); mRecorder.setOnCompletionListener(this, mHandler); mProgramUri = programUri; @@ -616,8 +619,7 @@ public class TunerRecordingSessionWorker private void updateRecordedProgramStateFinished(long endTime, long totalBytes) { ContentValues values = new ContentValues(); values.put(RecordedPrograms.COLUMN_RECORDING_DATA_BYTES, totalBytes); - values.put( - RecordedPrograms.COLUMN_RECORDING_DURATION_MILLIS, endTime - mRecordStartTime); + values.put(RecordedPrograms.COLUMN_RECORDING_DURATION_MILLIS, endTime - mRecordStartTime); values.put(RecordedPrograms.COLUMN_END_TIME_UTC_MILLIS, endTime); if (checkRecordedProgramTable(COLUMN_STATE)) { values.put(COLUMN_STATE, RecordedProgramState.FINISHED.name()); diff --git a/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java b/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java index f9bc734a..6faa11af 100644 --- a/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java +++ b/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java @@ -194,6 +194,7 @@ public class TunerSessionWorker private final File mTrickplayBufferDir; private final @TRICKPLAY_MODE int mTrickplayModeCustomization; private final LegacyFlags mLegacyFlags; + private final MpegTsRendererBuilder.Factory mMpegTsRendererBuilderFactory; private volatile Surface mSurface; private volatile float mVolume = 1.0f; private volatile boolean mCaptionEnabled; @@ -258,7 +259,7 @@ public class TunerSessionWorker TunerSessionOverlay tunerSessionOverlay); } - @AutoFactory(implementing = TunerSessionWorker.Factory.class) + @AutoFactory(implementing = Factory.class) public TunerSessionWorker( Context context, ChannelDataManager channelDataManager, @@ -266,6 +267,7 @@ public class TunerSessionWorker TunerSessionOverlay tunerSessionOverlay, @Provided ConcurrentDvrPlaybackFlags concurrentDvrPlaybackFlags, @Provided LegacyFlags legacyFlags, + @Provided MpegTsRendererBuilder.Factory mpegTsRendererBuilderFactory, @Provided TsDataSourceManager.Factory tsDataSourceManagerFactory) { this( context, @@ -275,6 +277,7 @@ public class TunerSessionWorker null, concurrentDvrPlaybackFlags, legacyFlags, + mpegTsRendererBuilderFactory, tsDataSourceManagerFactory); } @@ -287,6 +290,7 @@ public class TunerSessionWorker @Nullable Handler handler, ConcurrentDvrPlaybackFlags concurrentDvrPlaybackFlags, LegacyFlags legacyFlags, + MpegTsRendererBuilder.Factory mpegTsRendererBuilderFactory, TsDataSourceManager.Factory tsDataSourceManagerFactory) { this.mConcurrentDvrPlaybackFlags = concurrentDvrPlaybackFlags; mLegacyFlags = legacyFlags; @@ -304,6 +308,7 @@ public class TunerSessionWorker mSession = tunerSession; mTunerSessionOverlay = tunerSessionOverlay; mChannelDataManager = channelDataManager; + mMpegTsRendererBuilderFactory = mpegTsRendererBuilderFactory; mRecordingUri = null; mChannelDataManager.setListener(this); mChannelDataManager.checkDataVersion(mContext); @@ -1491,7 +1496,7 @@ public class TunerSessionWorker } MpegTsPlayer player = new MpegTsPlayer( - new MpegTsRendererBuilder(mContext, bufferManager, this), + mMpegTsRendererBuilderFactory.create(mContext, bufferManager, this), mHandler, mSourceManager, capabilities, diff --git a/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2.java b/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2.java index f8a87d89..055fa9ae 100644 --- a/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2.java +++ b/tuner/src/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2.java @@ -192,6 +192,7 @@ public class TunerSessionWorkerExoV2 private final int mMaxTrickplayBufferSizeMb; private final File mTrickplayBufferDir; private final @TRICKPLAY_MODE int mTrickplayModeCustomization; + private final MpegTsRendererBuilder.Factory mMpegTsRendererBuilderFactory; private volatile Surface mSurface; private volatile float mVolume = 1.0f; private volatile boolean mCaptionEnabled; @@ -257,7 +258,7 @@ public class TunerSessionWorkerExoV2 TunerSessionOverlay tunerSessionOverlay); } - @AutoFactory(implementing = TunerSessionWorkerExoV2.Factory.class) + @AutoFactory(implementing = Factory.class) public TunerSessionWorkerExoV2( Context context, ChannelDataManager channelDataManager, @@ -265,6 +266,7 @@ public class TunerSessionWorkerExoV2 TunerSessionOverlay tunerSessionOverlay, @Provided ConcurrentDvrPlaybackFlags concurrentDvrPlaybackFlags, @Provided LegacyFlags legacyFlags, + @Provided MpegTsRendererBuilder.Factory mpegTsRendererBuilderFactory, @Provided TsDataSourceManager.Factory tsDataSourceManagerFactory) { this( context, @@ -274,6 +276,7 @@ public class TunerSessionWorkerExoV2 null, concurrentDvrPlaybackFlags, legacyFlags, + mpegTsRendererBuilderFactory, tsDataSourceManagerFactory); } @@ -286,6 +289,7 @@ public class TunerSessionWorkerExoV2 @Nullable Handler handler, ConcurrentDvrPlaybackFlags concurrentDvrPlaybackFlags, LegacyFlags legacyFlags, + MpegTsRendererBuilder.Factory mpegTsRendererBuilderFactory, TsDataSourceManager.Factory tsDataSourceManagerFactory) { mConcurrentDvrPlaybackFlags = concurrentDvrPlaybackFlags; mLegacyFlags = legacyFlags; @@ -305,6 +309,7 @@ public class TunerSessionWorkerExoV2 mSession = tunerSession; mTunerSessionOverlay = tunerSessionOverlay; mChannelDataManager = channelDataManager; + mMpegTsRendererBuilderFactory = mpegTsRendererBuilderFactory; mRecordingUri = null; mChannelDataManager.setListener(this); mChannelDataManager.checkDataVersion(mContext); @@ -1493,7 +1498,7 @@ public class TunerSessionWorkerExoV2 } MpegTsPlayer player = new MpegTsPlayer( - new MpegTsRendererBuilder(mContext, bufferManager, this), + mMpegTsRendererBuilderFactory.create(mContext, bufferManager, this), mHandler, mSourceManager, capabilities, diff --git a/tuner/tests/robotests/javatests/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java b/tuner/tests/robotests/javatests/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java index efafc9f8..5af30b93 100644 --- a/tuner/tests/robotests/javatests/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java +++ b/tuner/tests/robotests/javatests/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java @@ -84,7 +84,8 @@ public class SampleSourceExtractorTest { listener, false, Looper.getMainLooper(), - handlerThread); + handlerThread, + (bufferManager, bufferListener, enableTrickplay, bufferReason) -> null); assertWithMessage("Trickplay should be disabled").that(listener.getLastState()).isFalse(); // Prepares the extractor. extractor.prepare(); @@ -151,7 +152,8 @@ public class SampleSourceExtractorTest { listener, false, Looper.getMainLooper(), - handlerThread); + handlerThread, + (bufferManager2, bufferListener, enableTrickplay, bufferReason) -> null); assertWithMessage("Trickplay should be enabled at the first") .that(Boolean.TRUE) diff --git a/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2Test.java b/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2Test.java index ad67bb03..ee5a33d1 100644 --- a/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2Test.java +++ b/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerExoV2Test.java @@ -97,6 +97,7 @@ public class TunerSessionWorkerExoV2Test { () -> new TunerTsStreamerManager(null); TsDataSourceManager.Factory tsDataSourceManagerFactory = new TsDataSourceManager.Factory(tsStreamerManagerProvider); + new TunerSessionExoV2( context, channelDataManager, @@ -112,6 +113,7 @@ public class TunerSessionWorkerExoV2Test { mHandler, mConcurrentDvrPlaybackFlags, mLegacyFlags, + (context2, bufferManager, bufferListener) -> null, tsDataSourceManagerFactory) { @Override protected void notifySignal(int signal) { diff --git a/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerTest.java b/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerTest.java index e3fc129c..a26baf5b 100644 --- a/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerTest.java +++ b/tuner/tests/robotests/javatests/com/android/tv/tuner/tvinput/TunerSessionWorkerTest.java @@ -112,6 +112,7 @@ public class TunerSessionWorkerTest { mHandler, mConcurrentDvrPlaybackFlags, mLegacyFlags, + (context2, bufferManager, bufferListener) -> null, tsdm) { @Override protected void notifySignal(int signal) { diff --git a/tuner/tests/unittests/javatests/com/android/tv/tuner/ZappingTimeTest.java b/tuner/tests/unittests/javatests/com/android/tv/tuner/ZappingTimeTest.java index fb9c6355..031cec51 100644 --- a/tuner/tests/unittests/javatests/com/android/tv/tuner/ZappingTimeTest.java +++ b/tuner/tests/unittests/javatests/com/android/tv/tuner/ZappingTimeTest.java @@ -21,13 +21,13 @@ import android.graphics.SurfaceTexture; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; +import android.support.annotation.Nullable; import android.test.InstrumentationTestCase; import android.util.Log; import android.view.Surface; import androidx.test.filters.LargeTest; -import com.android.tv.common.flags.impl.DefaultConcurrentDvrPlaybackFlags; import com.android.tv.tuner.data.Cea708Data; import com.android.tv.tuner.data.Channel.AudioStreamType; import com.android.tv.tuner.data.Channel.VideoStreamType; @@ -36,6 +36,7 @@ import com.android.tv.tuner.data.PsipData; import com.android.tv.tuner.data.TunerChannel; import com.android.tv.tuner.exoplayer.MpegTsPlayer; import com.android.tv.tuner.exoplayer.MpegTsRendererBuilder; +import com.android.tv.tuner.exoplayer.MpegTsSampleExtractor; import com.android.tv.tuner.exoplayer.buffer.BufferManager; import com.android.tv.tuner.exoplayer.buffer.PlaybackBufferListener; import com.android.tv.tuner.exoplayer.buffer.TrickplayStorageManager; @@ -44,6 +45,7 @@ import com.android.tv.tuner.source.TsDataSourceManager.Factory; import com.android.tv.tuner.ts.EventDetector.EventListener; import com.google.android.exoplayer.ExoPlayer; +import com.google.android.exoplayer2.upstream.DataSource; import org.junit.Ignore; @@ -95,8 +97,6 @@ public class ZappingTimeTest extends InstrumentationTestCase { private MockMpegTsPlayerListener mMpegTsPlayerListener = new MockMpegTsPlayerListener(); private MockPlaybackBufferListener mPlaybackBufferListener = new MockPlaybackBufferListener(); private MockChannelScanListener mEventListener = new MockChannelScanListener(); - private DefaultConcurrentDvrPlaybackFlags mConcurrentDvrPlaybackFlags = - new DefaultConcurrentDvrPlaybackFlags(); @Override protected void setUp() throws Exception { @@ -127,6 +127,22 @@ public class ZappingTimeTest extends InstrumentationTestCase { TsDataSourceManager.Factory tsFactory = new Factory(null); mSourceManager = tsFactory.create(false); mSourceManager.addTunerHalForTest(mTunerHal); + MpegTsSampleExtractor.Factory mpegTsSampleExtractorFactory = + new MpegTsSampleExtractor.Factory() { + @Override + public MpegTsSampleExtractor create( + BufferManager bufferManager, PlaybackBufferListener bufferListener) { + return null; + } + + @Override + public MpegTsSampleExtractor create( + DataSource source, + @Nullable BufferManager bufferManager, + PlaybackBufferListener bufferListener) { + return null; + } + }; mHandler = new Handler( handlerThread.getLooper(), @@ -158,12 +174,14 @@ public class ZappingTimeTest extends InstrumentationTestCase { } mChannel.setFrequency(frequency); mSourceManager.setKeepTuneStatus(true); + mPlayer = new MpegTsPlayer( new MpegTsRendererBuilder( mTargetContext, bufferManager, - mPlaybackBufferListener), + mPlaybackBufferListener, + mpegTsSampleExtractorFactory), mHandler, mSourceManager, null, -- cgit v1.2.3