1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.tuner.exoplayer; 18 19 import android.content.Context; 20 import android.support.annotation.Nullable; 21 22 import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilder; 23 import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilderCallback; 24 import com.android.tv.tuner.exoplayer.audio.MpegTsDefaultAudioTrackRenderer; 25 import com.android.tv.tuner.exoplayer.buffer.BufferManager; 26 import com.android.tv.tuner.exoplayer.buffer.PlaybackBufferListener; 27 28 import com.google.android.exoplayer.MediaCodecSelector; 29 import com.google.android.exoplayer.SampleSource; 30 import com.google.android.exoplayer.TrackRenderer; 31 import com.google.android.exoplayer2.upstream.DataSource; 32 import com.google.auto.factory.AutoFactory; 33 import com.google.auto.factory.Provided; 34 35 /** Builder for renderer objects for {@link MpegTsPlayer}. */ 36 public class MpegTsRendererBuilder implements RendererBuilder { 37 private final Context mContext; 38 private final BufferManager mBufferManager; 39 private final PlaybackBufferListener mBufferListener; 40 private final MpegTsSampleExtractor.Factory mMpegTsSampleExtractorFactory; 41 42 /** 43 * Factory for {@link MpegTsRendererBuilder}. 44 * 45 * <p>This wrapper class keeps other classes from needing to reference the {@link AutoFactory} 46 * generated class. 47 */ 48 public interface Factory { create( Context context, @Nullable BufferManager bufferManager, PlaybackBufferListener bufferListener)49 public MpegTsRendererBuilder create( 50 Context context, 51 @Nullable BufferManager bufferManager, 52 PlaybackBufferListener bufferListener); 53 } 54 55 @AutoFactory(implementing = Factory.class) MpegTsRendererBuilder( Context context, @Nullable BufferManager bufferManager, PlaybackBufferListener bufferListener, @Provided MpegTsSampleExtractor.Factory mpegTsSampleExtractorFactory)56 public MpegTsRendererBuilder( 57 Context context, 58 @Nullable BufferManager bufferManager, 59 PlaybackBufferListener bufferListener, 60 @Provided MpegTsSampleExtractor.Factory mpegTsSampleExtractorFactory) { 61 mContext = context; 62 mBufferManager = bufferManager; 63 mBufferListener = bufferListener; 64 mMpegTsSampleExtractorFactory = mpegTsSampleExtractorFactory; 65 } 66 67 @Override buildRenderers( MpegTsPlayer mpegTsPlayer, DataSource dataSource, RendererBuilderCallback callback)68 public void buildRenderers( 69 MpegTsPlayer mpegTsPlayer, DataSource dataSource, RendererBuilderCallback callback) { 70 // Build the video and audio renderers. 71 SampleExtractor extractor = 72 dataSource == null 73 ? mMpegTsSampleExtractorFactory.create(mBufferManager, mBufferListener) 74 : mMpegTsSampleExtractorFactory.create( 75 dataSource, mBufferManager, mBufferListener); 76 SampleSource sampleSource = new MpegTsSampleSource(extractor); 77 MpegTsVideoTrackRenderer videoRenderer = 78 new MpegTsVideoTrackRenderer( 79 mContext, sampleSource, mpegTsPlayer.getMainHandler(), mpegTsPlayer); 80 // TODO: Only using MpegTsDefaultAudioTrackRenderer for A/V sync issue. We will use 81 // {@link MpegTsMediaCodecAudioTrackRenderer} when we use ExoPlayer's extractor. 82 TrackRenderer audioRenderer = 83 new MpegTsDefaultAudioTrackRenderer( 84 sampleSource, 85 MediaCodecSelector.DEFAULT, 86 mpegTsPlayer.getMainHandler(), 87 mpegTsPlayer); 88 Cea708TextTrackRenderer textRenderer = new Cea708TextTrackRenderer(sampleSource); 89 90 TrackRenderer[] renderers = new TrackRenderer[MpegTsPlayer.RENDERER_COUNT]; 91 renderers[MpegTsPlayer.TRACK_TYPE_VIDEO] = videoRenderer; 92 renderers[MpegTsPlayer.TRACK_TYPE_AUDIO] = audioRenderer; 93 renderers[MpegTsPlayer.TRACK_TYPE_TEXT] = textRenderer; 94 callback.onRenderers(null, renderers); 95 } 96 } 97