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 17package com.android.tv.tuner.exoplayer; 18 19import android.content.Context; 20 21import com.google.android.exoplayer.MediaCodecSelector; 22import com.google.android.exoplayer.SampleSource; 23import com.google.android.exoplayer.TrackRenderer; 24import com.google.android.exoplayer.upstream.DataSource; 25import com.android.tv.Features; 26import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilder; 27import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilderCallback; 28import com.android.tv.tuner.exoplayer.audio.MpegTsDefaultAudioTrackRenderer; 29import com.android.tv.tuner.exoplayer.buffer.BufferManager; 30import com.android.tv.tuner.tvinput.PlaybackBufferListener; 31 32/** 33 * Builder for renderer objects for {@link MpegTsPlayer}. 34 */ 35public class MpegTsRendererBuilder implements RendererBuilder { 36 private final Context mContext; 37 private final BufferManager mBufferManager; 38 private final PlaybackBufferListener mBufferListener; 39 40 public MpegTsRendererBuilder(Context context, BufferManager bufferManager, 41 PlaybackBufferListener bufferListener) { 42 mContext = context; 43 mBufferManager = bufferManager; 44 mBufferListener = bufferListener; 45 } 46 47 @Override 48 public void buildRenderers(MpegTsPlayer mpegTsPlayer, DataSource dataSource, 49 boolean mHasSoftwareAudioDecoder, RendererBuilderCallback callback) { 50 // Build the video and audio renderers. 51 SampleExtractor extractor = dataSource == null ? 52 new MpegTsSampleExtractor(mBufferManager, mBufferListener) : 53 new MpegTsSampleExtractor(dataSource, mBufferManager, mBufferListener); 54 SampleSource sampleSource = new MpegTsSampleSource(extractor); 55 MpegTsVideoTrackRenderer videoRenderer = new MpegTsVideoTrackRenderer(mContext, 56 sampleSource, mpegTsPlayer.getMainHandler(), mpegTsPlayer); 57 // TODO: Only using MpegTsDefaultAudioTrackRenderer for A/V sync issue. We will use 58 // {@link MpegTsMediaCodecAudioTrackRenderer} when we use ExoPlayer's extractor. 59 TrackRenderer audioRenderer = 60 new MpegTsDefaultAudioTrackRenderer( 61 sampleSource, 62 MediaCodecSelector.DEFAULT, 63 mpegTsPlayer.getMainHandler(), 64 mpegTsPlayer, 65 mHasSoftwareAudioDecoder, 66 !Features.AC3_SOFTWARE_DECODE.isEnabled(mContext)); 67 Cea708TextTrackRenderer textRenderer = new Cea708TextTrackRenderer(sampleSource); 68 69 TrackRenderer[] renderers = new TrackRenderer[MpegTsPlayer.RENDERER_COUNT]; 70 renderers[MpegTsPlayer.TRACK_TYPE_VIDEO] = videoRenderer; 71 renderers[MpegTsPlayer.TRACK_TYPE_AUDIO] = audioRenderer; 72 renderers[MpegTsPlayer.TRACK_TYPE_TEXT] = textRenderer; 73 callback.onRenderers(null, renderers); 74 } 75} 76