summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-08-31 13:12:12 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-08-31 13:12:12 -0700
commit9a13e30fc2c2ca2bdcecae6daf5daa0a6b4fec41 (patch)
treed563ee3082e98eb49ffe89a2d77ddd447020feb6 /media/libmediaplayerservice
parentf10cf66d258ab88af9cb363077cdd96d59f7ca15 (diff)
parent8d0189dc829dc87a74ff91eb0c067dc291ff59c3 (diff)
downloadframeworks_av-9a13e30fc2c2ca2bdcecae6daf5daa0a6b4fec41.zip
frameworks_av-9a13e30fc2c2ca2bdcecae6daf5daa0a6b4fec41.tar.gz
frameworks_av-9a13e30fc2c2ca2bdcecae6daf5daa0a6b4fec41.tar.bz2
am 8d0189dc: am 61356671: Merge "Add support for mpeg2 transport streams to the RTSP implementation." into jb-mr1-dev
* commit '8d0189dc829dc87a74ff91eb0c067dc291ff59c3': Add support for mpeg2 transport streams to the RTSP implementation.
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r--media/libmediaplayerservice/nuplayer/RTSPSource.cpp76
-rw-r--r--media/libmediaplayerservice/nuplayer/RTSPSource.h4
2 files changed, 75 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
index 4a704e3..5a7a785 100644
--- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
@@ -23,6 +23,7 @@
#include "AnotherPacketSource.h"
#include "MyHandler.h"
+#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
namespace android {
@@ -159,6 +160,13 @@ status_t NuPlayer::RTSPSource::dequeueAccessUnit(
}
sp<AnotherPacketSource> NuPlayer::RTSPSource::getSource(bool audio) {
+ if (mTSParser != NULL) {
+ sp<MediaSource> source = mTSParser->getSource(
+ audio ? ATSParser::AUDIO : ATSParser::VIDEO);
+
+ return static_cast<AnotherPacketSource *>(source.get());
+ }
+
return audio ? mAudioTrack : mVideoTrack;
}
@@ -255,7 +263,12 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
{
size_t trackIndex;
CHECK(msg->findSize("trackIndex", &trackIndex));
- CHECK_LT(trackIndex, mTracks.size());
+
+ if (mTSParser == NULL) {
+ CHECK_LT(trackIndex, mTracks.size());
+ } else {
+ CHECK_EQ(trackIndex, 0u);
+ }
sp<ABuffer> accessUnit;
CHECK(msg->findBuffer("accessUnit", &accessUnit));
@@ -267,6 +280,37 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
break;
}
+ if (mTSParser != NULL) {
+ size_t offset = 0;
+ status_t err = OK;
+ while (offset + 188 <= accessUnit->size()) {
+ err = mTSParser->feedTSPacket(
+ accessUnit->data() + offset, 188);
+ if (err != OK) {
+ break;
+ }
+
+ offset += 188;
+ }
+
+ if (offset < accessUnit->size()) {
+ err = ERROR_MALFORMED;
+ }
+
+ if (err != OK) {
+ sp<AnotherPacketSource> source = getSource(false /* audio */);
+ if (source != NULL) {
+ source->signalEOS(err);
+ }
+
+ source = getSource(true /* audio */);
+ if (source != NULL) {
+ source->signalEOS(err);
+ }
+ }
+ break;
+ }
+
TrackInfo *info = &mTracks.editItemAt(trackIndex);
sp<AnotherPacketSource> source = info->mSource;
@@ -296,14 +340,28 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
case MyHandler::kWhatEOS:
{
- size_t trackIndex;
- CHECK(msg->findSize("trackIndex", &trackIndex));
- CHECK_LT(trackIndex, mTracks.size());
-
int32_t finalResult;
CHECK(msg->findInt32("finalResult", &finalResult));
CHECK_NE(finalResult, (status_t)OK);
+ if (mTSParser != NULL) {
+ sp<AnotherPacketSource> source = getSource(false /* audio */);
+ if (source != NULL) {
+ source->signalEOS(finalResult);
+ }
+
+ source = getSource(true /* audio */);
+ if (source != NULL) {
+ source->signalEOS(finalResult);
+ }
+
+ return;
+ }
+
+ size_t trackIndex;
+ CHECK(msg->findSize("trackIndex", &trackIndex));
+ CHECK_LT(trackIndex, mTracks.size());
+
TrackInfo *info = &mTracks.editItemAt(trackIndex);
sp<AnotherPacketSource> source = info->mSource;
if (source != NULL) {
@@ -364,6 +422,14 @@ void NuPlayer::RTSPSource::onConnected() {
const char *mime;
CHECK(format->findCString(kKeyMIMEType, &mime));
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) {
+ // Very special case for MPEG2 Transport Streams.
+ CHECK_EQ(numTracks, 1u);
+
+ mTSParser = new ATSParser;
+ return;
+ }
+
bool isAudio = !strncasecmp(mime, "audio/", 6);
bool isVideo = !strncasecmp(mime, "video/", 6);
diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.h b/media/libmediaplayerservice/nuplayer/RTSPSource.h
index c8409e5..f07c724 100644
--- a/media/libmediaplayerservice/nuplayer/RTSPSource.h
+++ b/media/libmediaplayerservice/nuplayer/RTSPSource.h
@@ -20,6 +20,8 @@
#include "NuPlayerSource.h"
+#include "ATSParser.h"
+
#include <media/stagefright/foundation/AHandlerReflector.h>
namespace android {
@@ -99,6 +101,8 @@ private:
sp<AnotherPacketSource> mAudioTrack;
sp<AnotherPacketSource> mVideoTrack;
+ sp<ATSParser> mTSParser;
+
int32_t mSeekGeneration;
sp<AnotherPacketSource> getSource(bool audio);