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