Loading media/libmediaplayerservice/nuplayer/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/av/media/libstagefright/include \ $(TOP)/frameworks/av/media/libstagefright/mpeg2ts \ $(TOP)/frameworks/av/media/libstagefright/rtsp \ $(TOP)/frameworks/av/media/libstagefright/timedtext \ $(TOP)/frameworks/native/include/media/openmax LOCAL_MODULE:= libstagefright_nuplayer Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include "RTSPSource.h" #include "StreamingSource.h" #include "GenericSource.h" #include "TextDescriptions.h" #include "ATSParser.h" Loading Loading @@ -151,6 +152,7 @@ NuPlayer::NuPlayer() mScanSourcesPending(false), mScanSourcesGeneration(0), mPollDurationGeneration(0), mTimedTextGeneration(0), mTimeDiscontinuityPending(false), mFlushingAudio(NONE), mFlushingVideo(NONE), Loading Loading @@ -428,6 +430,16 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { if (trackIndex < inbandTracks) { err = mSource->selectTrack(trackIndex, select); if (!select && err == OK) { int32_t type; sp<AMessage> info = mSource->getTrackInfo(trackIndex); if (info != NULL && info->findInt32("type", &type) && type == MEDIA_TRACK_TYPE_TIMEDTEXT) { ++mTimedTextGeneration; } } } else { trackIndex -= inbandTracks; Loading Loading @@ -1492,6 +1504,7 @@ void NuPlayer::performSeek(int64_t seekTimeUs) { seekTimeUs / 1E6); mSource->seekTo(seekTimeUs); ++mTimedTextGeneration; if (mDriver != NULL) { sp<NuPlayerDriver> driver = mDriver.promote(); Loading Loading @@ -1700,6 +1713,39 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; } case Source::kWhatTimedTextData: { int32_t generation; if (msg->findInt32("generation", &generation) && generation != mTimedTextGeneration) { break; } sp<ABuffer> buffer; CHECK(msg->findBuffer("buffer", &buffer)); sp<NuPlayerDriver> driver = mDriver.promote(); if (driver == NULL) { break; } int posMs; int64_t timeUs, posUs; driver->getCurrentPosition(&posMs); posUs = posMs * 1000; CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); if (posUs < timeUs) { if (!msg->findInt32("generation", &generation)) { msg->setInt32("generation", mTimedTextGeneration); } msg->post(timeUs - posUs); } else { sendTimedTextData(buffer); } break; } case Source::kWhatQueueDecoderShutdown: { int32_t audio, video; Loading Loading @@ -1768,6 +1814,34 @@ void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) { notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); } void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) { const void *data; size_t size = 0; int64_t timeUs; int32_t flag = TextDescriptions::LOCAL_DESCRIPTIONS; AString mime; CHECK(buffer->meta()->findString("mime", &mime)); CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0); data = buffer->data(); size = buffer->size(); Parcel parcel; if (size > 0) { CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); flag |= TextDescriptions::IN_BAND_TEXT_3GPP; TextDescriptions::getParcelOfDescriptions( (const uint8_t *)data, size, flag, timeUs / 1000, &parcel); } if ((parcel.dataSize() > 0)) { notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel); } else { // send an empty timed text notifyListener(MEDIA_TIMED_TEXT, 0, 0); } } //////////////////////////////////////////////////////////////////////////////// void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { Loading media/libmediaplayerservice/nuplayer/NuPlayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,7 @@ private: int32_t mScanSourcesGeneration; int32_t mPollDurationGeneration; int32_t mTimedTextGeneration; enum FlushStatus { NONE, Loading Loading @@ -198,6 +199,7 @@ private: bool audio, bool video, const sp<AMessage> &reply); void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex); void sendTimedTextData(const sp<ABuffer> &buffer); void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const; Loading media/libmediaplayerservice/nuplayer/NuPlayerSource.h +1 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ struct NuPlayer::Source : public AHandler { kWhatBufferingStart, kWhatBufferingEnd, kWhatSubtitleData, kWhatTimedTextData, kWhatQueueDecoderShutdown, }; Loading Loading
media/libmediaplayerservice/nuplayer/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/av/media/libstagefright/include \ $(TOP)/frameworks/av/media/libstagefright/mpeg2ts \ $(TOP)/frameworks/av/media/libstagefright/rtsp \ $(TOP)/frameworks/av/media/libstagefright/timedtext \ $(TOP)/frameworks/native/include/media/openmax LOCAL_MODULE:= libstagefright_nuplayer Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include "RTSPSource.h" #include "StreamingSource.h" #include "GenericSource.h" #include "TextDescriptions.h" #include "ATSParser.h" Loading Loading @@ -151,6 +152,7 @@ NuPlayer::NuPlayer() mScanSourcesPending(false), mScanSourcesGeneration(0), mPollDurationGeneration(0), mTimedTextGeneration(0), mTimeDiscontinuityPending(false), mFlushingAudio(NONE), mFlushingVideo(NONE), Loading Loading @@ -428,6 +430,16 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { if (trackIndex < inbandTracks) { err = mSource->selectTrack(trackIndex, select); if (!select && err == OK) { int32_t type; sp<AMessage> info = mSource->getTrackInfo(trackIndex); if (info != NULL && info->findInt32("type", &type) && type == MEDIA_TRACK_TYPE_TIMEDTEXT) { ++mTimedTextGeneration; } } } else { trackIndex -= inbandTracks; Loading Loading @@ -1492,6 +1504,7 @@ void NuPlayer::performSeek(int64_t seekTimeUs) { seekTimeUs / 1E6); mSource->seekTo(seekTimeUs); ++mTimedTextGeneration; if (mDriver != NULL) { sp<NuPlayerDriver> driver = mDriver.promote(); Loading Loading @@ -1700,6 +1713,39 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; } case Source::kWhatTimedTextData: { int32_t generation; if (msg->findInt32("generation", &generation) && generation != mTimedTextGeneration) { break; } sp<ABuffer> buffer; CHECK(msg->findBuffer("buffer", &buffer)); sp<NuPlayerDriver> driver = mDriver.promote(); if (driver == NULL) { break; } int posMs; int64_t timeUs, posUs; driver->getCurrentPosition(&posMs); posUs = posMs * 1000; CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); if (posUs < timeUs) { if (!msg->findInt32("generation", &generation)) { msg->setInt32("generation", mTimedTextGeneration); } msg->post(timeUs - posUs); } else { sendTimedTextData(buffer); } break; } case Source::kWhatQueueDecoderShutdown: { int32_t audio, video; Loading Loading @@ -1768,6 +1814,34 @@ void NuPlayer::sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex) { notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); } void NuPlayer::sendTimedTextData(const sp<ABuffer> &buffer) { const void *data; size_t size = 0; int64_t timeUs; int32_t flag = TextDescriptions::LOCAL_DESCRIPTIONS; AString mime; CHECK(buffer->meta()->findString("mime", &mime)); CHECK(strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP) == 0); data = buffer->data(); size = buffer->size(); Parcel parcel; if (size > 0) { CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); flag |= TextDescriptions::IN_BAND_TEXT_3GPP; TextDescriptions::getParcelOfDescriptions( (const uint8_t *)data, size, flag, timeUs / 1000, &parcel); } if ((parcel.dataSize() > 0)) { notifyListener(MEDIA_TIMED_TEXT, 0, 0, &parcel); } else { // send an empty timed text notifyListener(MEDIA_TIMED_TEXT, 0, 0); } } //////////////////////////////////////////////////////////////////////////////// void NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { Loading
media/libmediaplayerservice/nuplayer/NuPlayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,7 @@ private: int32_t mScanSourcesGeneration; int32_t mPollDurationGeneration; int32_t mTimedTextGeneration; enum FlushStatus { NONE, Loading Loading @@ -198,6 +199,7 @@ private: bool audio, bool video, const sp<AMessage> &reply); void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex); void sendTimedTextData(const sp<ABuffer> &buffer); void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const; Loading
media/libmediaplayerservice/nuplayer/NuPlayerSource.h +1 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ struct NuPlayer::Source : public AHandler { kWhatBufferingStart, kWhatBufferingEnd, kWhatSubtitleData, kWhatTimedTextData, kWhatQueueDecoderShutdown, }; Loading