TimedTextDriver.cpp revision 23580bb8d6cafbc2b65dd0a4ce1acb52562d1b05
16655174826330afe66ef766258181ae8c11f3f6cInsun Kang /* 26655174826330afe66ef766258181ae8c11f3f6cInsun Kang * Copyright (C) 2012 The Android Open Source Project 36655174826330afe66ef766258181ae8c11f3f6cInsun Kang * 46655174826330afe66ef766258181ae8c11f3f6cInsun Kang * Licensed under the Apache License, Version 2.0 (the "License"); 56655174826330afe66ef766258181ae8c11f3f6cInsun Kang * you may not use this file except in compliance with the License. 66655174826330afe66ef766258181ae8c11f3f6cInsun Kang * You may obtain a copy of the License at 76655174826330afe66ef766258181ae8c11f3f6cInsun Kang * 86655174826330afe66ef766258181ae8c11f3f6cInsun Kang * http://www.apache.org/licenses/LICENSE-2.0 96655174826330afe66ef766258181ae8c11f3f6cInsun Kang * 106655174826330afe66ef766258181ae8c11f3f6cInsun Kang * Unless required by applicable law or agreed to in writing, software 116655174826330afe66ef766258181ae8c11f3f6cInsun Kang * distributed under the License is distributed on an "AS IS" BASIS, 126655174826330afe66ef766258181ae8c11f3f6cInsun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136655174826330afe66ef766258181ae8c11f3f6cInsun Kang * See the License for the specific language governing permissions and 146655174826330afe66ef766258181ae8c11f3f6cInsun Kang * limitations under the License. 156655174826330afe66ef766258181ae8c11f3f6cInsun Kang */ 166655174826330afe66ef766258181ae8c11f3f6cInsun Kang 176655174826330afe66ef766258181ae8c11f3f6cInsun Kang//#define LOG_NDEBUG 0 186655174826330afe66ef766258181ae8c11f3f6cInsun Kang#define LOG_TAG "TimedTextDriver" 196655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <utils/Log.h> 206655174826330afe66ef766258181ae8c11f3f6cInsun Kang 216655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <binder/IPCThreadState.h> 226655174826330afe66ef766258181ae8c11f3f6cInsun Kang 23f9d660a5e0196240add5daf0199f128d471e592cInsun Kang#include <media/mediaplayer.h> 246655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/MediaPlayerInterface.h> 25f9d660a5e0196240add5daf0199f128d471e592cInsun Kang#include <media/stagefright/DataSource.h> 26613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong#include <media/stagefright/FileSource.h> 27f9d660a5e0196240add5daf0199f128d471e592cInsun Kang#include <media/stagefright/MediaDefs.h> 286655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/stagefright/MediaErrors.h> 296655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/stagefright/MediaSource.h> 30f9d660a5e0196240add5daf0199f128d471e592cInsun Kang#include <media/stagefright/MetaData.h> 316655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/stagefright/Utils.h> 326655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/stagefright/foundation/ADebug.h> 336655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/stagefright/foundation/ALooper.h> 343254b25e8b0f674ccc2226609e01dd86a600802eInsun Kang#include <media/stagefright/timedtext/TimedTextDriver.h> 356655174826330afe66ef766258181ae8c11f3f6cInsun Kang 366655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include "TextDescriptions.h" 376655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include "TimedTextPlayer.h" 386655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include "TimedTextSource.h" 396655174826330afe66ef766258181ae8c11f3f6cInsun Kang 406655174826330afe66ef766258181ae8c11f3f6cInsun Kangnamespace android { 416655174826330afe66ef766258181ae8c11f3f6cInsun Kang 426655174826330afe66ef766258181ae8c11f3f6cInsun KangTimedTextDriver::TimedTextDriver( 436655174826330afe66ef766258181ae8c11f3f6cInsun Kang const wp<MediaPlayerBase> &listener) 446655174826330afe66ef766258181ae8c11f3f6cInsun Kang : mLooper(new ALooper), 456655174826330afe66ef766258181ae8c11f3f6cInsun Kang mListener(listener), 4623580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang mState(UNINITIALIZED), 4723580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang mCurrentTrackIndex(UINT_MAX) { 486655174826330afe66ef766258181ae8c11f3f6cInsun Kang mLooper->setName("TimedTextDriver"); 496655174826330afe66ef766258181ae8c11f3f6cInsun Kang mLooper->start(); 506655174826330afe66ef766258181ae8c11f3f6cInsun Kang mPlayer = new TimedTextPlayer(listener); 516655174826330afe66ef766258181ae8c11f3f6cInsun Kang mLooper->registerHandler(mPlayer); 526655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 536655174826330afe66ef766258181ae8c11f3f6cInsun Kang 546655174826330afe66ef766258181ae8c11f3f6cInsun KangTimedTextDriver::~TimedTextDriver() { 55f9d660a5e0196240add5daf0199f128d471e592cInsun Kang mTextSourceVector.clear(); 56eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mTextSourceTypeVector.clear(); 576655174826330afe66ef766258181ae8c11f3f6cInsun Kang mLooper->stop(); 586655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 596655174826330afe66ef766258181ae8c11f3f6cInsun Kang 60eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t TimedTextDriver::selectTrack_l(size_t index) { 6123580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang if (mCurrentTrackIndex == index) { 6223580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang return OK; 6323580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang } 646655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<TimedTextSource> source; 65eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong source = mTextSourceVector.valueFor(index); 666655174826330afe66ef766258181ae8c11f3f6cInsun Kang mPlayer->setDataSource(source); 67f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (mState == UNINITIALIZED) { 68c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mState = PREPARED; 69f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 70f9d660a5e0196240add5daf0199f128d471e592cInsun Kang mCurrentTrackIndex = index; 716655174826330afe66ef766258181ae8c11f3f6cInsun Kang return OK; 726655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 736655174826330afe66ef766258181ae8c11f3f6cInsun Kang 746655174826330afe66ef766258181ae8c11f3f6cInsun Kangstatus_t TimedTextDriver::start() { 756655174826330afe66ef766258181ae8c11f3f6cInsun Kang Mutex::Autolock autoLock(mLock); 766655174826330afe66ef766258181ae8c11f3f6cInsun Kang switch (mState) { 776655174826330afe66ef766258181ae8c11f3f6cInsun Kang case UNINITIALIZED: 786655174826330afe66ef766258181ae8c11f3f6cInsun Kang return INVALID_OPERATION; 796655174826330afe66ef766258181ae8c11f3f6cInsun Kang case PLAYING: 806655174826330afe66ef766258181ae8c11f3f6cInsun Kang return OK; 81c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang case PREPARED: 82f9d660a5e0196240add5daf0199f128d471e592cInsun Kang mPlayer->start(); 83bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang mState = PLAYING; 84bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang return OK; 85c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang case PAUSED: 86c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mPlayer->resume(); 87c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mState = PLAYING; 88c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang return OK; 896655174826330afe66ef766258181ae8c11f3f6cInsun Kang default: 906655174826330afe66ef766258181ae8c11f3f6cInsun Kang TRESPASS(); 916655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 92bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang return UNKNOWN_ERROR; 936655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 946655174826330afe66ef766258181ae8c11f3f6cInsun Kang 956655174826330afe66ef766258181ae8c11f3f6cInsun Kangstatus_t TimedTextDriver::pause() { 966655174826330afe66ef766258181ae8c11f3f6cInsun Kang Mutex::Autolock autoLock(mLock); 97c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang ALOGV("%s() is called", __FUNCTION__); 986655174826330afe66ef766258181ae8c11f3f6cInsun Kang switch (mState) { 996655174826330afe66ef766258181ae8c11f3f6cInsun Kang case UNINITIALIZED: 1006655174826330afe66ef766258181ae8c11f3f6cInsun Kang return INVALID_OPERATION; 1016655174826330afe66ef766258181ae8c11f3f6cInsun Kang case PLAYING: 1026655174826330afe66ef766258181ae8c11f3f6cInsun Kang mPlayer->pause(); 103bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang mState = PAUSED; 104bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang return OK; 105c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang case PREPARED: 106bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang return INVALID_OPERATION; 107bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang case PAUSED: 108bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang return OK; 109bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang default: 110bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang TRESPASS(); 111bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang } 112bb6bc8491fe819f96e1902e56694715cb110ce94Insun Kang return UNKNOWN_ERROR; 1136655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 1146655174826330afe66ef766258181ae8c11f3f6cInsun Kang 115eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t TimedTextDriver::selectTrack(size_t index) { 1166655174826330afe66ef766258181ae8c11f3f6cInsun Kang status_t ret = OK; 1176655174826330afe66ef766258181ae8c11f3f6cInsun Kang Mutex::Autolock autoLock(mLock); 118c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang ALOGV("%s() is called", __FUNCTION__); 1196655174826330afe66ef766258181ae8c11f3f6cInsun Kang switch (mState) { 1206655174826330afe66ef766258181ae8c11f3f6cInsun Kang case UNINITIALIZED: 121c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang case PREPARED: 1226655174826330afe66ef766258181ae8c11f3f6cInsun Kang case PAUSED: 123f9d660a5e0196240add5daf0199f128d471e592cInsun Kang ret = selectTrack_l(index); 1246655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1256655174826330afe66ef766258181ae8c11f3f6cInsun Kang case PLAYING: 1266655174826330afe66ef766258181ae8c11f3f6cInsun Kang mPlayer->pause(); 127f9d660a5e0196240add5daf0199f128d471e592cInsun Kang ret = selectTrack_l(index); 1286655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (ret != OK) { 1296655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1306655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1316655174826330afe66ef766258181ae8c11f3f6cInsun Kang mPlayer->start(); 1326655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1336655174826330afe66ef766258181ae8c11f3f6cInsun Kang defaut: 1346655174826330afe66ef766258181ae8c11f3f6cInsun Kang TRESPASS(); 1356655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1366655174826330afe66ef766258181ae8c11f3f6cInsun Kang return ret; 1376655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 1386655174826330afe66ef766258181ae8c11f3f6cInsun Kang 139eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t TimedTextDriver::unselectTrack(size_t index) { 1406472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang Mutex::Autolock autoLock(mLock); 141c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang ALOGV("%s() is called", __FUNCTION__); 142f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (mCurrentTrackIndex != index) { 143f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return INVALID_OPERATION; 144f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 14523580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang mCurrentTrackIndex = UINT_MAX; 1466472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang switch (mState) { 1476472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang case UNINITIALIZED: 1486472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return INVALID_OPERATION; 1496472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang case PLAYING: 15023580bb8d6cafbc2b65dd0a4ce1acb52562d1b05Insun Kang mPlayer->setDataSource(NULL); 1516472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang mState = UNINITIALIZED; 1526472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return OK; 153c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang case PREPARED: 1546472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang case PAUSED: 1556472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang mState = UNINITIALIZED; 1566472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return OK; 1576472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang default: 1586472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang TRESPASS(); 159f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 1606472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return UNKNOWN_ERROR; 161f9d660a5e0196240add5daf0199f128d471e592cInsun Kang} 162f9d660a5e0196240add5daf0199f128d471e592cInsun Kang 163f9d660a5e0196240add5daf0199f128d471e592cInsun Kangstatus_t TimedTextDriver::seekToAsync(int64_t timeUs) { 1646472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang Mutex::Autolock autoLock(mLock); 165c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang ALOGV("%s() is called", __FUNCTION__); 1666472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang switch (mState) { 1676472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang case UNINITIALIZED: 1686472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return INVALID_OPERATION; 169c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang case PREPARED: 170c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mPlayer->seekToAsync(timeUs); 171c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mPlayer->pause(); 172c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mState = PAUSED; 173c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang return OK; 1746472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang case PAUSED: 1756472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang mPlayer->seekToAsync(timeUs); 176c9729ca1cb1760da836e293e3ed7a82f769f3e07Insun Kang mPlayer->pause(); 1776472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return OK; 1786472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang case PLAYING: 1796472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang mPlayer->seekToAsync(timeUs); 1806472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return OK; 1816472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang defaut: 1826472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang TRESPASS(); 1836472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang } 1846472badc497a9e748411f8c8c9ed5d83ef335a85Insun Kang return UNKNOWN_ERROR; 185f9d660a5e0196240add5daf0199f128d471e592cInsun Kang} 186f9d660a5e0196240add5daf0199f128d471e592cInsun Kang 1876655174826330afe66ef766258181ae8c11f3f6cInsun Kangstatus_t TimedTextDriver::addInBandTextSource( 188eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t trackIndex, const sp<MediaSource>& mediaSource) { 1896655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<TimedTextSource> source = 1906655174826330afe66ef766258181ae8c11f3f6cInsun Kang TimedTextSource::CreateTimedTextSource(mediaSource); 1916655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (source == NULL) { 1926655174826330afe66ef766258181ae8c11f3f6cInsun Kang return ERROR_UNSUPPORTED; 1936655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1946655174826330afe66ef766258181ae8c11f3f6cInsun Kang Mutex::Autolock autoLock(mLock); 195eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mTextSourceVector.add(trackIndex, source); 196692ac36c4b6a09fed5113a4f45f00a041665a769James Dong mTextSourceTypeVector.add(TEXT_SOURCE_TYPE_IN_BAND); 1976655174826330afe66ef766258181ae8c11f3f6cInsun Kang return OK; 1986655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 1996655174826330afe66ef766258181ae8c11f3f6cInsun Kang 2006655174826330afe66ef766258181ae8c11f3f6cInsun Kangstatus_t TimedTextDriver::addOutOfBandTextSource( 201eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t trackIndex, const char *uri, const char *mimeType) { 202eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2036655174826330afe66ef766258181ae8c11f3f6cInsun Kang // To support local subtitle file only for now 204f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (strncasecmp("file://", uri, 7)) { 205613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong ALOGE("uri('%s') is not a file", uri); 2066655174826330afe66ef766258181ae8c11f3f6cInsun Kang return ERROR_UNSUPPORTED; 2076655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 208613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong 2096655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<DataSource> dataSource = 2106655174826330afe66ef766258181ae8c11f3f6cInsun Kang DataSource::CreateFromURI(uri); 211eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return createOutOfBandTextSource(trackIndex, mimeType, dataSource); 212613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong} 213613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong 214613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dongstatus_t TimedTextDriver::addOutOfBandTextSource( 215eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t trackIndex, int fd, off64_t offset, off64_t length, const char *mimeType) { 216613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong 217613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong if (fd < 0) { 218613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong ALOGE("Invalid file descriptor: %d", fd); 219613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong return ERROR_UNSUPPORTED; 220613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong } 221613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong 222613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong sp<DataSource> dataSource = new FileSource(dup(fd), offset, length); 223eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return createOutOfBandTextSource(trackIndex, mimeType, dataSource); 224613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong} 225613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong 226613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dongstatus_t TimedTextDriver::createOutOfBandTextSource( 227eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t trackIndex, 228eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong const char *mimeType, 229eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong const sp<DataSource>& dataSource) { 230613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong 2316655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (dataSource == NULL) { 2326655174826330afe66ef766258181ae8c11f3f6cInsun Kang return ERROR_UNSUPPORTED; 2336655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 2346655174826330afe66ef766258181ae8c11f3f6cInsun Kang 2356655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<TimedTextSource> source; 2367c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang if (strcasecmp(mimeType, MEDIA_MIMETYPE_TEXT_SUBRIP) == 0) { 2376655174826330afe66ef766258181ae8c11f3f6cInsun Kang source = TimedTextSource::CreateTimedTextSource( 2386655174826330afe66ef766258181ae8c11f3f6cInsun Kang dataSource, TimedTextSource::OUT_OF_BAND_FILE_SRT); 2396655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 2406655174826330afe66ef766258181ae8c11f3f6cInsun Kang 2416655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (source == NULL) { 242eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong ALOGE("Failed to create timed text source"); 2436655174826330afe66ef766258181ae8c11f3f6cInsun Kang return ERROR_UNSUPPORTED; 2446655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 2456655174826330afe66ef766258181ae8c11f3f6cInsun Kang 2466655174826330afe66ef766258181ae8c11f3f6cInsun Kang Mutex::Autolock autoLock(mLock); 247eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mTextSourceVector.add(trackIndex, source); 248692ac36c4b6a09fed5113a4f45f00a041665a769James Dong mTextSourceTypeVector.add(TEXT_SOURCE_TYPE_OUT_OF_BAND); 249f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return OK; 250f9d660a5e0196240add5daf0199f128d471e592cInsun Kang} 2516655174826330afe66ef766258181ae8c11f3f6cInsun Kang 252eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongsize_t TimedTextDriver::countExternalTracks() const { 253eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t nTracks = 0; 254eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong for (size_t i = 0, n = mTextSourceTypeVector.size(); i < n; ++i) { 255692ac36c4b6a09fed5113a4f45f00a041665a769James Dong if (mTextSourceTypeVector[i] == TEXT_SOURCE_TYPE_OUT_OF_BAND) { 256eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong ++nTracks; 257eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 258eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 259eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return nTracks; 260eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong} 261eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 262eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongvoid TimedTextDriver::getExternalTrackInfo(Parcel *parcel) { 263f9d660a5e0196240add5daf0199f128d471e592cInsun Kang Mutex::Autolock autoLock(mLock); 264eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong for (size_t i = 0, n = mTextSourceTypeVector.size(); i < n; ++i) { 265692ac36c4b6a09fed5113a4f45f00a041665a769James Dong if (mTextSourceTypeVector[i] == TEXT_SOURCE_TYPE_IN_BAND) { 266eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong continue; 267eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 268eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 269eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong sp<MetaData> meta = mTextSourceVector.valueAt(i)->getFormat(); 270f9d660a5e0196240add5daf0199f128d471e592cInsun Kang 27125736fd247ba757feefe15d3071f7e747c64fea4Insun Kang // There are two fields. 27225736fd247ba757feefe15d3071f7e747c64fea4Insun Kang parcel->writeInt32(2); 27325736fd247ba757feefe15d3071f7e747c64fea4Insun Kang 27425736fd247ba757feefe15d3071f7e747c64fea4Insun Kang // track type. 27525736fd247ba757feefe15d3071f7e747c64fea4Insun Kang parcel->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT); 27625736fd247ba757feefe15d3071f7e747c64fea4Insun Kang const char *lang = "und"; 27725736fd247ba757feefe15d3071f7e747c64fea4Insun Kang if (meta != NULL) { 278f9d660a5e0196240add5daf0199f128d471e592cInsun Kang meta->findCString(kKeyMediaLanguage, &lang); 279f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 28025736fd247ba757feefe15d3071f7e747c64fea4Insun Kang parcel->writeString16(String16(lang)); 2816655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 2826655174826330afe66ef766258181ae8c11f3f6cInsun Kang} 2836655174826330afe66ef766258181ae8c11f3f6cInsun Kang 2846655174826330afe66ef766258181ae8c11f3f6cInsun Kang} // namespace android 285