AwesomePlayer.cpp revision 650773d00356129ffd661cdaef3fb3095c343707
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/* 2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License. 6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at 7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and 14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License. 15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */ 16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0 18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer" 19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h> 20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 21bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 23bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 25bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 27bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 28bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaDebug.h> 29bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 30bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 32bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 34bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 35bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(AwesomePlayer *player, int32_t code) 37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mCode(code) { 39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mPlayer->onEvent(mCode); 46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 48bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 49bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 50bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t mCode; 51bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 52bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 53bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 54bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 55bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 56bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 57bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mTimeSource(NULL), 58bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 59bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer(NULL), 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer(NULL) { 61bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK_EQ(mClient.connect(), OK); 62bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 64bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 65bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEvent = new AwesomeEvent(this, 0); 66bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, 1); 68bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 69bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 70bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.start(); 71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.stop(); 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::cancelPlayerEvents() { 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setListener(const sp<MediaPlayerBase> &listener) { 91bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 93bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 94bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 95bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(const char *uri) { 96bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 97bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 98bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 99bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::CreateFromURI(uri); 101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 105bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 106bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 107bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 108bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 109bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 110bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 111bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 112bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 113bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 114bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 115bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<DataSource> source = new FileSource(fd, offset, length); 116bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = source->initCheck(); 118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(source); 124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 126bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 127bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 128bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 129bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 130bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 131bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 132bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 133bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 134bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 135bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 136bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 137bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 139bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 144bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (setVideoSource(extractor->getTrack(i)) == OK) { 145bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber haveVideo = true; 146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 147bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 148bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (setAudioSource(extractor->getTrack(i)) == OK) { 149bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber haveAudio = true; 150bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 151bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 152bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 153bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (haveAudio && haveVideo) { 154bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 155bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 156bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 157bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 158bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return !haveAudio && !haveVideo ? UNKNOWN_ERROR : OK; 159bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 160bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 161bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 162bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 163bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 164bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 165bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 166bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 167bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 168bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 169bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mLastVideoBuffer) { 170bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer->release(); 171bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = NULL; 172bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 173bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 174bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 175bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 176bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 177bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 179bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 180bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource->stop(); 181bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource.clear(); 182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 183bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSource.clear(); 185bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 186bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource != mAudioPlayer) { 187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber delete mTimeSource; 188bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSource = NULL; 190bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber delete mAudioPlayer; 192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer = NULL; 193bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoRenderer.clear(); 195bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoWidth = mVideoHeight = -1; 199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = false; 203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber// static 207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::AudioNotify(void *_me, int what) { 208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *me = (AwesomePlayer *)_me; 209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(me->mLock); 211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber switch (what) { 213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber case AudioPlayer::REACHED_EOS: 214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber me->postStreamDoneEvent_l(); 215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber case AudioPlayer::SEEK_COMPLETE: 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber { 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (me->mListener != NULL) { 220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber me->mListener->sendEvent(MEDIA_SEEK_COMPLETE); 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber default: 227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(!"should not be here."); 228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & LOOPING) { 239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoRenderer != NULL) { 242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mListener != NULL) { 246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener->sendEvent(MEDIA_PLAYBACK_COMPLETE); 247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber pause_l(); 250bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 251bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 252bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 253bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 254bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 256bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 257bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 263bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer = new AudioPlayer(mAudioSink); 267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 268bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setListenerCallback( 269bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber &AwesomePlayer::AudioNotify, this); 270bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 271bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 272bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->start(); 273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 274bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber delete mTimeSource; 275bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSource = mAudioPlayer; 276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // If there was a seek request while we were paused 278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // and we're just starting up again, honor the request now. 279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->resume(); 283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSource = new SystemTimeSource; 288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 290bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoRenderer == NULL) { 292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber initRenderer_l(); 293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 294bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 295bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoRenderer != NULL) { 296bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Kick off video playback 297bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mISurface != NULL) { 306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t format; 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *component; 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t decodedWidth, decodedHeight; 311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoRenderer = 317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.interface()->createRenderer( 318bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mISurface, component, 319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber (OMX_COLOR_FORMATTYPE)format, 320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber decodedWidth, decodedHeight, 321bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoWidth, mVideoHeight); 322bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 323bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 324bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 325bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 326bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 327bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause_l() { 331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer != NULL) { 338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->pause(); 339bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mFlags & PLAYING; 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setISurface(const sp<ISurface> &isurface) { 353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mISurface = isurface; 356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 357bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 360bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 364bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 365bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 366bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 367bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 371bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 373bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 374bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 375bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 376bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 377bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 378bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 379bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 391bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoRenderer != NULL) { 393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 394bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 395bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 396bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 404bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return seekTo_l(timeUs); 406bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 407bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 408bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 409bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = true; 410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 411bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 412bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 413bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 414bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 415bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 416bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 417bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 418bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking && mVideoRenderer == NULL && mAudioPlayer != NULL) { 419bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 420bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 421bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = false; 422bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 423bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 424bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 425bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getVideoDimensions( 426bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int32_t *width, int32_t *height) const { 427bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 428bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 429bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoWidth < 0 || mVideoHeight < 0) { 430bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 431bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 432bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 433bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *width = mVideoWidth; 434bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *height = mVideoHeight; 435bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 436bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 437bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 438bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 439bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setAudioSource(const sp<MediaSource> &source) { 440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (source == NULL) { 441bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 442bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSource = OMXCodec::Create( 445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.interface(), source->getFormat(), 446bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 447bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber source); 448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 450bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 451bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (source->getFormat()->findInt64(kKeyDuration, &durationUs)) { 452bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 453bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 454bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 456bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 457bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 458bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 459bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 460bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 461bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setVideoSource(const sp<MediaSource> &source) { 462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (source == NULL) { 463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 466bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.interface(), source->getFormat(), 468bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber source); 470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 471bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 473bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (source->getFormat()->findInt64(kKeyDuration, &durationUs)) { 474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 476bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 478bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 479bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(source->getFormat()->findInt32(kKeyWidth, &mVideoWidth)); 480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(source->getFormat()->findInt32(kKeyHeight, &mVideoHeight)); 481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource->start(); 483bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 488bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onEvent(int32_t code) { 489bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (code == 1) { 490bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber onStreamDone(); 491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 492bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 494bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 495bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking) { 498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mLastVideoBuffer) { 499bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer->release(); 500bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = NULL; 501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 504bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 507bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 508bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 510bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 511bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking) { 512bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 513bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber options.setSeekTo(mSeekTimeUs); 515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 516bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 517bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 518bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 519bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 520bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK_EQ(mVideoBuffer, NULL); 521bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 522bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 523bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 524bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 525bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber initRenderer_l(); 526bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 527bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 528bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 529bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postStreamDoneEvent_l(); 530bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 531bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 532bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 533bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 534bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 535bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 536bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 537bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 538bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 539bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 540bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = timeUs; 541bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 542bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mSeeking) { 543bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer != NULL) { 544bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking audio to %lld us (%.2f secs).", timeUs, timeUs / 1E6); 545bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 546bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(timeUs); 547bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 548bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // If we're playing video only, report seek complete now, 549bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // otherwise audio player will notify us later. 550bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mListener != NULL) { 551bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener->sendEvent(MEDIA_SEEK_COMPLETE); 552bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 553bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 554bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 555bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 556bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeeking = false; 557bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 558bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 559bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 560bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 561bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 562bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = mTimeSource->getRealTimeUs() - timeUs; 563bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 564bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 565bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 566bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer != NULL 567bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 568bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 569bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 570bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 571bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t nowUs = mTimeSource->getRealTimeUs() - mTimeSourceDeltaUs; 572bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 573bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t latenessUs = nowUs - timeUs; 574bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 575650773d00356129ffd661cdaef3fb3095c343707Andreas Huber if (latenessUs > 40000) { 576650773d00356129ffd661cdaef3fb3095c343707Andreas Huber // We're more than 40ms late. 577650773d00356129ffd661cdaef3fb3095c343707Andreas Huber LOGI("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6); 578bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 579bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 581bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 582bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 583bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 584bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 585bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 586bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (latenessUs < -10000) { 587bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // We're more than 10ms early. 588bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 589bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(10000); 590bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 591bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 592bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 593bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber void *id; 594bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer->meta_data()->findPointer(kKeyBufferID, &id)) { 595bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoRenderer->render((IOMX::buffer_id)id); 596bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 597bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 598bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mLastVideoBuffer) { 599bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer->release(); 600bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = NULL; 601bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 602bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mLastVideoBuffer = mVideoBuffer; 603bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 605bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 606bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 607bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 608bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 609bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 610bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 611bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 612bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 613bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 614bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 615bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 616bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 617bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postStreamDoneEvent_l() { 618bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 619bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 620bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 622bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 623bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 624bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 625bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 626bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 627