Loading cmds/stagefright/stream.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ private: MyStreamSource::MyStreamSource(int fd) : mFd(fd), mFileSize(0), mNextSeekTimeUs(ALooper::GetNowUs() + 5000000ll) { mNextSeekTimeUs(-1) { // ALooper::GetNowUs() + 5000000ll) { CHECK_GE(fd, 0); mFileSize = lseek64(fd, 0, SEEK_END); Loading media/libmediaplayerservice/MediaPlayerService.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -732,6 +732,21 @@ player_type getPlayerType(const char* url) return TEST_PLAYER; } char value[PROPERTY_VALUE_MAX]; if (property_get("media.httplive.enable-nuplayer", value, NULL) && (!strcasecmp(value, "true") || !strcmp(value, "1"))) { if (!strncasecmp("http://", url, 7)) { size_t len = strlen(url); if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { return NU_PLAYER; } if (strstr(url,"m3u8")) { return NU_PLAYER; } } } // use MidiFile for MIDI extensions int lenURL = strlen(url); for (int i = 0; i < NELEM(FILE_EXTS); ++i) { Loading media/libmediaplayerservice/nuplayer/Android.mk +3 −0 Original line number Diff line number Diff line Loading @@ -2,17 +2,20 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ HTTPLiveSource.cpp \ NuPlayer.cpp \ NuPlayerDecoder.cpp \ NuPlayerDriver.cpp \ NuPlayerRenderer.cpp \ NuPlayerStreamListener.cpp \ DecoderWrapper.cpp \ StreamingSource.cpp \ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/base/include/media/stagefright/openmax \ $(TOP)/frameworks/base/media/libstagefright/include \ $(TOP)/frameworks/base/media/libstagefright/mpeg2ts \ $(TOP)/frameworks/base/media/libstagefright/httplive \ LOCAL_MODULE:= libstagefright_nuplayer Loading media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp 0 → 100644 +132 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //#define LOG_NDEBUG 0 #define LOG_TAG "HTTPLiveSource" #include <utils/Log.h> #include "HTTPLiveSource.h" #include "ATSParser.h" #include "AnotherPacketSource.h" #include "LiveDataSource.h" #include "LiveSession.h" #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MetaData.h> namespace android { NuPlayer::HTTPLiveSource::HTTPLiveSource(const char *url) : mURL(url), mEOS(false), mOffset(0) { } NuPlayer::HTTPLiveSource::~HTTPLiveSource() { mLiveSession->disconnect(); mLiveLooper->stop(); } void NuPlayer::HTTPLiveSource::start() { mLiveLooper = new ALooper; mLiveLooper->setName("http live"); mLiveLooper->start(); mLiveSession = new LiveSession; mLiveLooper->registerHandler(mLiveSession); mLiveSession->connect(mURL.c_str()); mTSParser = new ATSParser; } sp<MetaData> NuPlayer::HTTPLiveSource::getFormat(bool audio) { ATSParser::SourceType type = audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; sp<AnotherPacketSource> source = static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); if (source == NULL) { return NULL; } return source->getFormat(); } bool NuPlayer::HTTPLiveSource::feedMoreTSData() { if (mEOS) { return false; } sp<LiveDataSource> source = static_cast<LiveDataSource *>(mLiveSession->getDataSource().get()); for (int32_t i = 0; i < 10; ++i) { char buffer[188]; ssize_t n = source->readAtNonBlocking(mOffset, buffer, sizeof(buffer)); if (n == -EWOULDBLOCK) { break; } else if (n < 0) { LOGI("input data EOS reached."); mTSParser->signalEOS(ERROR_END_OF_STREAM); mEOS = true; break; } else { if (buffer[0] == 0x00) { // XXX legacy mTSParser->signalDiscontinuity( buffer[1] == 0x00 ? ATSParser::DISCONTINUITY_SEEK : ATSParser::DISCONTINUITY_FORMATCHANGE); } else { mTSParser->feedTSPacket(buffer, sizeof(buffer)); } mOffset += n; } } return true; } status_t NuPlayer::HTTPLiveSource::dequeueAccessUnit( bool audio, sp<ABuffer> *accessUnit) { ATSParser::SourceType type = audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; sp<AnotherPacketSource> source = static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); if (source == NULL) { return -EWOULDBLOCK; } status_t finalResult; if (!source->hasBufferAvailable(&finalResult)) { return finalResult == OK ? -EWOULDBLOCK : finalResult; } return source->dequeueAccessUnit(accessUnit); } } // namespace android media/libmediaplayerservice/nuplayer/HTTPLiveSource.h 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HTTP_LIVE_SOURCE_H_ #define HTTP_LIVE_SOURCE_H_ #include "NuPlayer.h" #include "NuPlayerSource.h" namespace android { struct ATSParser; struct LiveSession; struct NuPlayer::HTTPLiveSource : public NuPlayer::Source { HTTPLiveSource(const char *url); void start(); // Returns true iff more data was available, false on EOS. bool feedMoreTSData(); sp<MetaData> getFormat(bool audio); status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); protected: virtual ~HTTPLiveSource(); private: AString mURL; bool mEOS; off64_t mOffset; sp<ALooper> mLiveLooper; sp<LiveSession> mLiveSession; sp<ATSParser> mTSParser; DISALLOW_EVIL_CONSTRUCTORS(HTTPLiveSource); }; } // namespace android #endif // HTTP_LIVE_SOURCE_H_ Loading
cmds/stagefright/stream.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ private: MyStreamSource::MyStreamSource(int fd) : mFd(fd), mFileSize(0), mNextSeekTimeUs(ALooper::GetNowUs() + 5000000ll) { mNextSeekTimeUs(-1) { // ALooper::GetNowUs() + 5000000ll) { CHECK_GE(fd, 0); mFileSize = lseek64(fd, 0, SEEK_END); Loading
media/libmediaplayerservice/MediaPlayerService.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -732,6 +732,21 @@ player_type getPlayerType(const char* url) return TEST_PLAYER; } char value[PROPERTY_VALUE_MAX]; if (property_get("media.httplive.enable-nuplayer", value, NULL) && (!strcasecmp(value, "true") || !strcmp(value, "1"))) { if (!strncasecmp("http://", url, 7)) { size_t len = strlen(url); if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { return NU_PLAYER; } if (strstr(url,"m3u8")) { return NU_PLAYER; } } } // use MidiFile for MIDI extensions int lenURL = strlen(url); for (int i = 0; i < NELEM(FILE_EXTS); ++i) { Loading
media/libmediaplayerservice/nuplayer/Android.mk +3 −0 Original line number Diff line number Diff line Loading @@ -2,17 +2,20 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ HTTPLiveSource.cpp \ NuPlayer.cpp \ NuPlayerDecoder.cpp \ NuPlayerDriver.cpp \ NuPlayerRenderer.cpp \ NuPlayerStreamListener.cpp \ DecoderWrapper.cpp \ StreamingSource.cpp \ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/base/include/media/stagefright/openmax \ $(TOP)/frameworks/base/media/libstagefright/include \ $(TOP)/frameworks/base/media/libstagefright/mpeg2ts \ $(TOP)/frameworks/base/media/libstagefright/httplive \ LOCAL_MODULE:= libstagefright_nuplayer Loading
media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp 0 → 100644 +132 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //#define LOG_NDEBUG 0 #define LOG_TAG "HTTPLiveSource" #include <utils/Log.h> #include "HTTPLiveSource.h" #include "ATSParser.h" #include "AnotherPacketSource.h" #include "LiveDataSource.h" #include "LiveSession.h" #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MetaData.h> namespace android { NuPlayer::HTTPLiveSource::HTTPLiveSource(const char *url) : mURL(url), mEOS(false), mOffset(0) { } NuPlayer::HTTPLiveSource::~HTTPLiveSource() { mLiveSession->disconnect(); mLiveLooper->stop(); } void NuPlayer::HTTPLiveSource::start() { mLiveLooper = new ALooper; mLiveLooper->setName("http live"); mLiveLooper->start(); mLiveSession = new LiveSession; mLiveLooper->registerHandler(mLiveSession); mLiveSession->connect(mURL.c_str()); mTSParser = new ATSParser; } sp<MetaData> NuPlayer::HTTPLiveSource::getFormat(bool audio) { ATSParser::SourceType type = audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; sp<AnotherPacketSource> source = static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); if (source == NULL) { return NULL; } return source->getFormat(); } bool NuPlayer::HTTPLiveSource::feedMoreTSData() { if (mEOS) { return false; } sp<LiveDataSource> source = static_cast<LiveDataSource *>(mLiveSession->getDataSource().get()); for (int32_t i = 0; i < 10; ++i) { char buffer[188]; ssize_t n = source->readAtNonBlocking(mOffset, buffer, sizeof(buffer)); if (n == -EWOULDBLOCK) { break; } else if (n < 0) { LOGI("input data EOS reached."); mTSParser->signalEOS(ERROR_END_OF_STREAM); mEOS = true; break; } else { if (buffer[0] == 0x00) { // XXX legacy mTSParser->signalDiscontinuity( buffer[1] == 0x00 ? ATSParser::DISCONTINUITY_SEEK : ATSParser::DISCONTINUITY_FORMATCHANGE); } else { mTSParser->feedTSPacket(buffer, sizeof(buffer)); } mOffset += n; } } return true; } status_t NuPlayer::HTTPLiveSource::dequeueAccessUnit( bool audio, sp<ABuffer> *accessUnit) { ATSParser::SourceType type = audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; sp<AnotherPacketSource> source = static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); if (source == NULL) { return -EWOULDBLOCK; } status_t finalResult; if (!source->hasBufferAvailable(&finalResult)) { return finalResult == OK ? -EWOULDBLOCK : finalResult; } return source->dequeueAccessUnit(accessUnit); } } // namespace android
media/libmediaplayerservice/nuplayer/HTTPLiveSource.h 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HTTP_LIVE_SOURCE_H_ #define HTTP_LIVE_SOURCE_H_ #include "NuPlayer.h" #include "NuPlayerSource.h" namespace android { struct ATSParser; struct LiveSession; struct NuPlayer::HTTPLiveSource : public NuPlayer::Source { HTTPLiveSource(const char *url); void start(); // Returns true iff more data was available, false on EOS. bool feedMoreTSData(); sp<MetaData> getFormat(bool audio); status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); protected: virtual ~HTTPLiveSource(); private: AString mURL; bool mEOS; off64_t mOffset; sp<ALooper> mLiveLooper; sp<LiveSession> mLiveSession; sp<ATSParser> mTSParser; DISALLOW_EVIL_CONSTRUCTORS(HTTPLiveSource); }; } // namespace android #endif // HTTP_LIVE_SOURCE_H_