diff options
author | Li Sun <sunli@codeaurora.org> | 2015-07-13 13:37:07 +0800 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2015-10-06 03:24:40 -0600 |
commit | 45dccc785efbcc470bd4a48a1e16879ff798c5c7 (patch) | |
tree | 9dde855d54dc7f2cae0b89c32104157d606267b5 | |
parent | cded9aa430953af01098ac2312794ebf5e4f7927 (diff) | |
download | frameworks_av-45dccc785efbcc470bd4a48a1e16879ff798c5c7.zip frameworks_av-45dccc785efbcc470bd4a48a1e16879ff798c5c7.tar.gz frameworks_av-45dccc785efbcc470bd4a48a1e16879ff798c5c7.tar.bz2 |
RTSP: add RTSP extensions for customization support
Add extensions for customization support in rtsp stack.
Provide default implementations in AVMediaServiceUtils.
Change-Id: I67adeb54b35d1f01911625bb9bad27e94ad0caf0
7 files changed, 67 insertions, 6 deletions
diff --git a/media/libavextensions/mediaplayerservice/AVMediaServiceExtensions.h b/media/libavextensions/mediaplayerservice/AVMediaServiceExtensions.h index d84344e..f2c789e 100644 --- a/media/libavextensions/mediaplayerservice/AVMediaServiceExtensions.h +++ b/media/libavextensions/mediaplayerservice/AVMediaServiceExtensions.h @@ -31,9 +31,13 @@ #include <common/AVExtensionsCommon.h> #include <MediaPlayerFactory.h> + +#include <utils/List.h> #include <utils/RefBase.h> #include <utils/String16.h> +#include <media/Metadata.h> + namespace android { struct StagefrightRecorder; @@ -41,6 +45,7 @@ struct ARTSPConnection; struct ARTPConnection; struct AString; struct MyHandler; +struct ABuffer; /* * Factory to create objects of base-classes in libmediaplayerservice @@ -67,6 +72,16 @@ struct AVMediaServiceUtils { virtual void makePortPair(int *rtpSocket, int *rtcpSocket, unsigned *rtpPort, bool isIPV6); virtual const char* parseURL(AString *host); + // RTSP customization utils + virtual bool parseTrackURL(AString url, AString val); + virtual void appendRange(AString *request); + virtual void setServerTimeoutUs(int64_t timeout); + virtual void appendMeta(media::Metadata *meta); + virtual bool checkNPTMapping(uint32_t *rtpInfoTime, int64_t *playTimeUs, + bool *nptValid, uint32_t rtpTime); + virtual void addH263AdvancedPacket(const sp<ABuffer> &buffer, + List<sp<ABuffer>> *packets, uint32_t rtpTime); + virtual bool parseNTPRange(const char *s, float *npt1, float *npt2); // ----- NO TRESSPASSING BEYOND THIS LINE ------ DECLARE_LOADABLE_SINGLETON(AVMediaServiceUtils); diff --git a/media/libavextensions/mediaplayerservice/AVMediaServiceUtils.cpp b/media/libavextensions/mediaplayerservice/AVMediaServiceUtils.cpp index 705ce8a..0e42367 100644 --- a/media/libavextensions/mediaplayerservice/AVMediaServiceUtils.cpp +++ b/media/libavextensions/mediaplayerservice/AVMediaServiceUtils.cpp @@ -32,6 +32,7 @@ #include <media/stagefright/foundation/ADebug.h> #include "ARTPConnection.h" +#include "ASessionDescription.h" #include "MyHandler.h" #include "common/ExtensionsLoader.hpp" @@ -57,6 +58,36 @@ const char* AVMediaServiceUtils::parseURL(AString *host) { return strchr(host->c_str(), ':'); } +bool AVMediaServiceUtils::parseTrackURL(AString /*url*/, AString /*val*/) { + return false; +} + +void AVMediaServiceUtils::appendRange(AString * /*request*/) { + return; +} + +void AVMediaServiceUtils::setServerTimeoutUs(int64_t /*timeout*/) { + return; +} + +void AVMediaServiceUtils::addH263AdvancedPacket(const sp<ABuffer> &/*buffer*/, + List<sp<ABuffer>> * /*packets*/, uint32_t /*rtpTime*/) { + return; +} + +void AVMediaServiceUtils::appendMeta(media::Metadata * /*meta*/) { + return; +} + +bool AVMediaServiceUtils::checkNPTMapping(uint32_t * /*rtpInfoTime*/, int64_t * /*playTimeUs*/, + bool * /*nptValid*/, uint32_t /*rtpTime*/) { + return false; +} + +bool AVMediaServiceUtils::parseNTPRange(const char *s, float *npt1, float *npt2) { + return ASessionDescription::parseNTPRange(s, npt1, npt2); +} + // ----- NO TRESSPASSING BEYOND THIS LINE ------ AVMediaServiceUtils::AVMediaServiceUtils() { } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp index 51fc1cd..e9ce52f 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp @@ -32,6 +32,7 @@ #include <media/stagefright/Utils.h> #include "mediaplayerservice/AVNuExtensions.h" +#include "mediaplayerservice/AVMediaServiceExtensions.h" namespace android { @@ -609,6 +610,8 @@ status_t NuPlayerDriver::getMetadata( Metadata::kSeekAvailable, mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); + AVMediaServiceUtils::get()->appendMeta(&meta); + return OK; } diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp index 58ff113..aae46d8 100644 --- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp +++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp @@ -27,6 +27,7 @@ #include <media/IMediaHTTPService.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MetaData.h> +#include <mediaplayerservice/AVMediaServiceExtensions.h> namespace android { @@ -474,8 +475,11 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { if (!info->mNPTMappingValid) { // This is a live stream, we didn't receive any normal // playtime mapping. We won't map to npt time. - source->queueAccessUnit(accessUnit); - break; + if (!AVMediaServiceUtils::get()->checkNPTMapping(&info->mRTPTime, + &info->mNormalPlaytimeUs, &info->mNPTMappingValid, rtpTime)) { + source->queueAccessUnit(accessUnit); + break; + } } int64_t nptUs = diff --git a/media/libstagefright/rtsp/AH263Assembler.cpp b/media/libstagefright/rtsp/AH263Assembler.cpp index 75cd911..28594e2 100644 --- a/media/libstagefright/rtsp/AH263Assembler.cpp +++ b/media/libstagefright/rtsp/AH263Assembler.cpp @@ -27,6 +27,8 @@ #include <media/stagefright/foundation/hexdump.h> #include <media/stagefright/Utils.h> +#include <mediaplayerservice/AVMediaServiceExtensions.h> + namespace android { AH263Assembler::AH263Assembler(const sp<AMessage> ¬ify) @@ -63,7 +65,8 @@ ARTPAssembler::AssemblyStatus AH263Assembler::addPacket( if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { break; } - + AVMediaServiceUtils::get()->addH263AdvancedPacket( + *it, &mPackets, mAccessUnitRTPTime); it = queue->erase(it); } diff --git a/media/libstagefright/rtsp/ASessionDescription.cpp b/media/libstagefright/rtsp/ASessionDescription.cpp index 98498e9..92ad1ec 100644 --- a/media/libstagefright/rtsp/ASessionDescription.cpp +++ b/media/libstagefright/rtsp/ASessionDescription.cpp @@ -22,7 +22,7 @@ #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AString.h> - +#include <mediaplayerservice/AVMediaServiceExtensions.h> #include <stdlib.h> namespace android { @@ -264,7 +264,8 @@ bool ASessionDescription::getDurationUs(int64_t *durationUs) const { } float from, to; - if (!parseNTPRange(value.c_str() + 4, &from, &to)) { + if (!AVMediaServiceUtils::get()->parseNTPRange( + value.c_str() + 4, &from, &to)) { return false; } diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index 2981685..8cf5f7c 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -705,6 +705,7 @@ struct MyHandler : public AHandler { timeoutSecs); } } + AVMediaServiceUtils::get()->setServerTimeoutUs(mKeepAliveTimeoutUs); i = mSessionID.find(";"); if (i >= 0) { @@ -779,6 +780,7 @@ struct MyHandler : public AHandler { request.append(mSessionID); request.append("\r\n"); + AVMediaServiceUtils::get()->appendRange(&request); request.append("\r\n"); sp<AMessage> reply = new AMessage('play', this); @@ -1476,7 +1478,9 @@ struct MyHandler : public AHandler { size_t trackIndex = 0; while (trackIndex < mTracks.size() - && !(val == mTracks.editItemAt(trackIndex).mURL)) { + && !(AVMediaServiceUtils::get()->parseTrackURL( + mTracks.editItemAt(trackIndex).mURL, val) + || val == mTracks.editItemAt(trackIndex).mURL)) { ++trackIndex; } CHECK_LT(trackIndex, mTracks.size()); |