TimedTextPlayer.cpp revision 4e1c91dd07fad96ee2387eda510c6da45e5dff0a
17a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang /* 26655174826330afe66ef766258181ae8c11f3f6cInsun Kang * Copyright (C) 2012 The Android Open Source Project 37a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * 47a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * Licensed under the Apache License, Version 2.0 (the "License"); 57a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * you may not use this file except in compliance with the License. 67a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * You may obtain a copy of the License at 77a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * 87a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * http://www.apache.org/licenses/LICENSE-2.0 97a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * 107a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * Unless required by applicable law or agreed to in writing, software 117a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * distributed under the License is distributed on an "AS IS" BASIS, 127a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * See the License for the specific language governing permissions and 147a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang * limitations under the License. 157a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang */ 167a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 177a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang//#define LOG_NDEBUG 0 187a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang#define LOG_TAG "TimedTextPlayer" 197a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang#include <utils/Log.h> 207a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 21f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 226655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/stagefright/foundation/AMessage.h> 233254b25e8b0f674ccc2226609e01dd86a600802eInsun Kang#include <media/stagefright/timedtext/TimedTextDriver.h> 247a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang#include <media/stagefright/MediaErrors.h> 256655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include <media/MediaPlayerInterface.h> 263b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang 27965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang#include "TimedTextPlayer.h" 287a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 296655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include "TimedTextSource.h" 307a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 316655174826330afe66ef766258181ae8c11f3f6cInsun Kangnamespace android { 327a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 336655174826330afe66ef766258181ae8c11f3f6cInsun Kangstatic const int64_t kAdjustmentProcessingTimeUs = 100000ll; 34bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kangstatic const int64_t kWaitTimeUsToRetryRead = 100000ll; 357a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 366655174826330afe66ef766258181ae8c11f3f6cInsun KangTimedTextPlayer::TimedTextPlayer(const wp<MediaPlayerBase> &listener) 376655174826330afe66ef766258181ae8c11f3f6cInsun Kang : mListener(listener), 386655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSource(NULL), 396655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSendSubtitleGeneration(0) { 407a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria WangTimedTextPlayer::~TimedTextPlayer() { 436655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (mSource != NULL) { 446655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSource->stop(); 456655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSource.clear(); 466655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSource = NULL; 477a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 487a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 497a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 506655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::start() { 516655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<AMessage> msg = new AMessage(kWhatSeek, id()); 526655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->setInt64("seekTimeUs", -1); 536655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->post(); 547a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 557a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 567a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangvoid TimedTextPlayer::pause() { 576655174826330afe66ef766258181ae8c11f3f6cInsun Kang (new AMessage(kWhatPause, id()))->post(); 587a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 597a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 606655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::seekToAsync(int64_t timeUs) { 616655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<AMessage> msg = new AMessage(kWhatSeek, id()); 626655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->setInt64("seekTimeUs", timeUs); 636655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->post(); 647a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 657a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 666655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::setDataSource(sp<TimedTextSource> source) { 676655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<AMessage> msg = new AMessage(kWhatSetSource, id()); 686655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->setObject("source", source); 696655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->post(); 707a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 717a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 726655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::onMessageReceived(const sp<AMessage> &msg) { 736655174826330afe66ef766258181ae8c11f3f6cInsun Kang switch (msg->what()) { 746655174826330afe66ef766258181ae8c11f3f6cInsun Kang case kWhatPause: { 756655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSendSubtitleGeneration++; 766655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 77965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 784e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang case kWhatRetryRead: { 794e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang int64_t seekTimeUs; 804e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang int seekMode; 814e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang if (msg->findInt64("seekTimeUs", &seekTimeUs) && 824e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang msg->findInt32("seekMode", &seekMode)) { 834e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang MediaSource::ReadOptions options; 844e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang options.setSeekTo( 854e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang seekTimeUs, 864e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang static_cast<MediaSource::ReadOptions::SeekMode>(seekMode)); 874e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang doRead(&options); 884e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang } else { 894e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang doRead(); 904e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang } 914e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang break; 924e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang } 936655174826330afe66ef766258181ae8c11f3f6cInsun Kang case kWhatSeek: { 946655174826330afe66ef766258181ae8c11f3f6cInsun Kang int64_t seekTimeUs = 0; 956655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->findInt64("seekTimeUs", &seekTimeUs); 966655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (seekTimeUs < 0) { 976655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<MediaPlayerBase> listener = mListener.promote(); 986655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (listener != NULL) { 996655174826330afe66ef766258181ae8c11f3f6cInsun Kang int32_t positionMs = 0; 1006655174826330afe66ef766258181ae8c11f3f6cInsun Kang listener->getCurrentPosition(&positionMs); 1016655174826330afe66ef766258181ae8c11f3f6cInsun Kang seekTimeUs = positionMs * 1000ll; 1026655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1036655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1046655174826330afe66ef766258181ae8c11f3f6cInsun Kang doSeekAndRead(seekTimeUs); 1056655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1066655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1076655174826330afe66ef766258181ae8c11f3f6cInsun Kang case kWhatSendSubtitle: { 1086655174826330afe66ef766258181ae8c11f3f6cInsun Kang int32_t generation; 1096655174826330afe66ef766258181ae8c11f3f6cInsun Kang CHECK(msg->findInt32("generation", &generation)); 1106655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (generation != mSendSubtitleGeneration) { 1116655174826330afe66ef766258181ae8c11f3f6cInsun Kang // Drop obsolete msg. 1126655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1136655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1146655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<RefBase> obj; 1156655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->findObject("subtitle", &obj); 1166655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (obj != NULL) { 1176655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<ParcelEvent> parcelEvent; 1186655174826330afe66ef766258181ae8c11f3f6cInsun Kang parcelEvent = static_cast<ParcelEvent*>(obj.get()); 119f9d660a5e0196240add5daf0199f128d471e592cInsun Kang notifyListener(&(parcelEvent->parcel)); 1206655174826330afe66ef766258181ae8c11f3f6cInsun Kang } else { 121f9d660a5e0196240add5daf0199f128d471e592cInsun Kang notifyListener(); 1226655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1236655174826330afe66ef766258181ae8c11f3f6cInsun Kang doRead(); 1246655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1256655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1266655174826330afe66ef766258181ae8c11f3f6cInsun Kang case kWhatSetSource: { 1276655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<RefBase> obj; 1286655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->findObject("source", &obj); 1296655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (obj == NULL) break; 1306655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (mSource != NULL) { 1316655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSource->stop(); 1326655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 1336655174826330afe66ef766258181ae8c11f3f6cInsun Kang mSource = static_cast<TimedTextSource*>(obj.get()); 134f9d660a5e0196240add5daf0199f128d471e592cInsun Kang status_t err = mSource->start(); 135f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (err != OK) { 136f9d660a5e0196240add5daf0199f128d471e592cInsun Kang notifyError(err); 137f9d660a5e0196240add5daf0199f128d471e592cInsun Kang break; 138f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 1396655174826330afe66ef766258181ae8c11f3f6cInsun Kang Parcel parcel; 140f9d660a5e0196240add5daf0199f128d471e592cInsun Kang err = mSource->extractGlobalDescriptions(&parcel); 141f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (err != OK) { 142f9d660a5e0196240add5daf0199f128d471e592cInsun Kang notifyError(err); 143f9d660a5e0196240add5daf0199f128d471e592cInsun Kang break; 1446655174826330afe66ef766258181ae8c11f3f6cInsun Kang } 145f9d660a5e0196240add5daf0199f128d471e592cInsun Kang notifyListener(&parcel); 1466655174826330afe66ef766258181ae8c11f3f6cInsun Kang break; 1473b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang } 1487a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 1497a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 1507a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1516655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::doSeekAndRead(int64_t seekTimeUs) { 1526655174826330afe66ef766258181ae8c11f3f6cInsun Kang MediaSource::ReadOptions options; 1536655174826330afe66ef766258181ae8c11f3f6cInsun Kang options.setSeekTo(seekTimeUs, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 1546655174826330afe66ef766258181ae8c11f3f6cInsun Kang doRead(&options); 1557a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 1567a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1576655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::doRead(MediaSource::ReadOptions* options) { 158bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang int64_t startTimeUs = 0; 159bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang int64_t endTimeUs = 0; 1606655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<ParcelEvent> parcelEvent = new ParcelEvent(); 161bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang status_t err = mSource->read(&startTimeUs, &endTimeUs, 162bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang &(parcelEvent->parcel), options); 163bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang if (err == WOULD_BLOCK) { 1644e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang sp<AMessage> msg = new AMessage(kWhatRetryRead); 1654e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang if (options != NULL) { 1664e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang int64_t seekTimeUs; 1674e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang MediaSource::ReadOptions::SeekMode seekMode; 1684e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang CHECK(options->getSeekTo(&seekTimeUs, &seekMode)); 1694e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang msg->setInt64("seekTimeUs", seekTimeUs); 1704e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang msg->setInt32("seekMode", seekMode); 1714e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang } 1724e1c91dd07fad96ee2387eda510c6da45e5dff0aInsun Kang msg->post(kWaitTimeUsToRetryRead); 173bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang return; 174bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang } else if (err != OK) { 175f9d660a5e0196240add5daf0199f128d471e592cInsun Kang notifyError(err); 176bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang return; 177bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang } 178bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang 179bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang postTextEvent(parcelEvent, startTimeUs); 180bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang if (endTimeUs > 0) { 181bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang CHECK_GE(endTimeUs, startTimeUs); 182bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang // send an empty timed text to clear the subtitle when it reaches to the 183bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang // end time. 184bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang postTextEvent(NULL, endTimeUs); 185f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 1867a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 1877a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1886655174826330afe66ef766258181ae8c11f3f6cInsun Kangvoid TimedTextPlayer::postTextEvent(const sp<ParcelEvent>& parcel, int64_t timeUs) { 1896655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<MediaPlayerBase> listener = mListener.promote(); 1906655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (listener != NULL) { 1916655174826330afe66ef766258181ae8c11f3f6cInsun Kang int64_t positionUs, delayUs; 1926655174826330afe66ef766258181ae8c11f3f6cInsun Kang int32_t positionMs = 0; 1936655174826330afe66ef766258181ae8c11f3f6cInsun Kang listener->getCurrentPosition(&positionMs); 194f9d660a5e0196240add5daf0199f128d471e592cInsun Kang positionUs = positionMs * 1000ll; 195965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang 1966655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (timeUs <= positionUs + kAdjustmentProcessingTimeUs) { 1976655174826330afe66ef766258181ae8c11f3f6cInsun Kang delayUs = 0; 198965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } else { 1996655174826330afe66ef766258181ae8c11f3f6cInsun Kang delayUs = timeUs - positionUs - kAdjustmentProcessingTimeUs; 200965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 201bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang postTextEventDelayUs(parcel, delayUs); 202bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang } 203bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang} 204bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang 205bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kangvoid TimedTextPlayer::postTextEventDelayUs(const sp<ParcelEvent>& parcel, int64_t delayUs) { 206bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang sp<MediaPlayerBase> listener = mListener.promote(); 207bae00e73c6d1d87cc5fd42b50f95d1d9572162eaInsun Kang if (listener != NULL) { 2086655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<AMessage> msg = new AMessage(kWhatSendSubtitle, id()); 2096655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->setInt32("generation", mSendSubtitleGeneration); 2106655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (parcel != NULL) { 2116655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->setObject("subtitle", parcel); 2127a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 2136655174826330afe66ef766258181ae8c11f3f6cInsun Kang msg->post(delayUs); 2147a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 2157a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 2163b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang 217f9d660a5e0196240add5daf0199f128d471e592cInsun Kangvoid TimedTextPlayer::notifyError(int error) { 218f9d660a5e0196240add5daf0199f128d471e592cInsun Kang sp<MediaPlayerBase> listener = mListener.promote(); 219f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (listener != NULL) { 220f9d660a5e0196240add5daf0199f128d471e592cInsun Kang listener->sendEvent(MEDIA_INFO, MEDIA_INFO_TIMED_TEXT_ERROR, error); 221f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 222f9d660a5e0196240add5daf0199f128d471e592cInsun Kang} 223f9d660a5e0196240add5daf0199f128d471e592cInsun Kang 224f9d660a5e0196240add5daf0199f128d471e592cInsun Kangvoid TimedTextPlayer::notifyListener(const Parcel *parcel) { 2256655174826330afe66ef766258181ae8c11f3f6cInsun Kang sp<MediaPlayerBase> listener = mListener.promote(); 2266655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (listener != NULL) { 2276655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (parcel != NULL && (parcel->dataSize() > 0)) { 228f9d660a5e0196240add5daf0199f128d471e592cInsun Kang listener->sendEvent(MEDIA_TIMED_TEXT, 0, 0, parcel); 2296655174826330afe66ef766258181ae8c11f3f6cInsun Kang } else { // send an empty timed text to clear the screen 230f9d660a5e0196240add5daf0199f128d471e592cInsun Kang listener->sendEvent(MEDIA_TIMED_TEXT); 2313b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang } 2323b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang } 2333b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang} 2343b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang 2356655174826330afe66ef766258181ae8c11f3f6cInsun Kang} // namespace android 236