Loading include/media/mediaplayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ enum media_event_type { MEDIA_TIMED_TEXT = 99, MEDIA_ERROR = 100, MEDIA_INFO = 200, MEDIA_SUBTITLE_DATA = 201, }; // Generic error codes for the media player framework. Errors are fatal, the Loading Loading @@ -176,6 +177,7 @@ enum media_track_type { MEDIA_TRACK_TYPE_VIDEO = 1, MEDIA_TRACK_TYPE_AUDIO = 2, MEDIA_TRACK_TYPE_TIMEDTEXT = 3, MEDIA_TRACK_TYPE_SUBTITLE = 4, }; // ---------------------------------------------------------------------------- Loading media/libmedia/mediaplayer.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -756,6 +756,9 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj) case MEDIA_TIMED_TEXT: ALOGV("Received timed text message"); break; case MEDIA_SUBTITLE_DATA: ALOGV("Received subtitle data message"); break; default: ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2); break; Loading media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp +57 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,8 @@ NuPlayer::HTTPLiveSource::HTTPLiveSource( mUID(uid), mFlags(0), mFinalResult(OK), mOffset(0) { mOffset(0), mFetchSubtitleDataGeneration(0) { if (headers) { mExtraHeaders = *headers; Loading Loading @@ -120,6 +121,28 @@ status_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) { return mLiveSession->getDuration(durationUs); } status_t NuPlayer::HTTPLiveSource::getTrackInfo(Parcel *reply) const { return mLiveSession->getTrackInfo(reply); } status_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select) { status_t err = mLiveSession->selectTrack(trackIndex, select); if (err == OK) { mFetchSubtitleDataGeneration++; if (select) { sp<AMessage> msg = new AMessage(kWhatFetchSubtitleData, id()); msg->setInt32("generation", mFetchSubtitleDataGeneration); msg->post(); } } // LiveSession::selectTrack returns BAD_VALUE when selecting the currently // selected track, or unselecting a non-selected track. In this case it's an // no-op so we return OK. return (err == OK || err == BAD_VALUE) ? OK : err; } status_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) { return mLiveSession->seekTo(seekTimeUs); } Loading @@ -132,6 +155,39 @@ void NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatFetchSubtitleData: { int32_t generation; CHECK(msg->findInt32("generation", &generation)); if (generation != mFetchSubtitleDataGeneration) { // stale break; } sp<ABuffer> buffer; if (mLiveSession->dequeueAccessUnit( LiveSession::STREAMTYPE_SUBTITLES, &buffer) == OK) { sp<AMessage> notify = dupNotify(); notify->setInt32("what", kWhatSubtitleData); notify->setBuffer("buffer", buffer); notify->post(); int64_t timeUs, baseUs, durationUs, delayUs; CHECK(buffer->meta()->findInt64("baseUs", &baseUs)); CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); delayUs = baseUs + timeUs - ALooper::GetNowUs(); msg->post(delayUs > 0ll ? delayUs : 0ll); } else { // try again in 1 second msg->post(1000000ll); } break; } default: Source::onMessageReceived(msg); break; Loading media/libmediaplayerservice/nuplayer/HTTPLiveSource.h +4 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ struct NuPlayer::HTTPLiveSource : public NuPlayer::Source { virtual status_t feedMoreTSData(); virtual status_t getDuration(int64_t *durationUs); virtual status_t getTrackInfo(Parcel *reply) const; virtual status_t selectTrack(size_t trackIndex, bool select); virtual status_t seekTo(int64_t seekTimeUs); protected: Loading @@ -56,6 +58,7 @@ private: enum { kWhatSessionNotify, kWhatFetchSubtitleData, }; AString mURL; Loading @@ -67,6 +70,7 @@ private: off64_t mOffset; sp<ALooper> mLiveLooper; sp<LiveSession> mLiveSession; int32_t mFetchSubtitleDataGeneration; void onSessionNotify(const sp<AMessage> &msg); Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +85 −2 Original line number Diff line number Diff line Loading @@ -340,6 +340,46 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatGetTrackInfo: { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); status_t err = INVALID_OPERATION; if (mSource != NULL) { Parcel* reply; CHECK(msg->findPointer("reply", (void**)&reply)); err = mSource->getTrackInfo(reply); } sp<AMessage> response = new AMessage; response->setInt32("err", err); response->postReply(replyID); break; } case kWhatSelectTrack: { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); status_t err = INVALID_OPERATION; if (mSource != NULL) { size_t trackIndex; int32_t select; CHECK(msg->findSize("trackIndex", &trackIndex)); CHECK(msg->findInt32("select", &select)); err = mSource->selectTrack(trackIndex, select); } sp<AMessage> response = new AMessage; response->setInt32("err", err); response->postReply(replyID); break; } case kWhatPollDuration: { int32_t generation; Loading Loading @@ -1045,7 +1085,7 @@ void NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { mRenderer->queueBuffer(audio, buffer, reply); } void NuPlayer::notifyListener(int msg, int ext1, int ext2) { void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { if (mDriver == NULL) { return; } Loading @@ -1056,7 +1096,7 @@ void NuPlayer::notifyListener(int msg, int ext1, int ext2) { return; } driver->notifyListener(msg, ext1, ext2); driver->notifyListener(msg, ext1, ext2, in); } void NuPlayer::flushDecoder(bool audio, bool needShutdown) { Loading Loading @@ -1132,6 +1172,26 @@ status_t NuPlayer::setVideoScalingMode(int32_t mode) { return OK; } status_t NuPlayer::getTrackInfo(Parcel* reply) const { sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, id()); msg->setPointer("reply", reply); sp<AMessage> response; status_t err = msg->postAndAwaitResponse(&response); return err; } status_t NuPlayer::selectTrack(size_t trackIndex, bool select) { sp<AMessage> msg = new AMessage(kWhatSelectTrack, id()); msg->setSize("trackIndex", trackIndex); msg->setInt32("select", select); sp<AMessage> response; status_t err = msg->postAndAwaitResponse(&response); return err; } void NuPlayer::schedulePollDuration() { sp<AMessage> msg = new AMessage(kWhatPollDuration, id()); msg->setInt32("generation", mPollDurationGeneration); Loading Loading @@ -1371,6 +1431,29 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; } case Source::kWhatSubtitleData: { sp<ABuffer> buffer; CHECK(msg->findBuffer("buffer", &buffer)); int32_t trackIndex; int64_t timeUs, durationUs; CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); Parcel in; in.writeInt32(trackIndex); in.writeInt64(timeUs); in.writeInt64(durationUs); in.writeInt32(buffer->size()); in.writeInt32(buffer->size()); in.write(buffer->data(), buffer->size()); notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); break; } case Source::kWhatQueueDecoderShutdown: { int32_t audio, video; Loading Loading
include/media/mediaplayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ enum media_event_type { MEDIA_TIMED_TEXT = 99, MEDIA_ERROR = 100, MEDIA_INFO = 200, MEDIA_SUBTITLE_DATA = 201, }; // Generic error codes for the media player framework. Errors are fatal, the Loading Loading @@ -176,6 +177,7 @@ enum media_track_type { MEDIA_TRACK_TYPE_VIDEO = 1, MEDIA_TRACK_TYPE_AUDIO = 2, MEDIA_TRACK_TYPE_TIMEDTEXT = 3, MEDIA_TRACK_TYPE_SUBTITLE = 4, }; // ---------------------------------------------------------------------------- Loading
media/libmedia/mediaplayer.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -756,6 +756,9 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj) case MEDIA_TIMED_TEXT: ALOGV("Received timed text message"); break; case MEDIA_SUBTITLE_DATA: ALOGV("Received subtitle data message"); break; default: ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2); break; Loading
media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp +57 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,8 @@ NuPlayer::HTTPLiveSource::HTTPLiveSource( mUID(uid), mFlags(0), mFinalResult(OK), mOffset(0) { mOffset(0), mFetchSubtitleDataGeneration(0) { if (headers) { mExtraHeaders = *headers; Loading Loading @@ -120,6 +121,28 @@ status_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) { return mLiveSession->getDuration(durationUs); } status_t NuPlayer::HTTPLiveSource::getTrackInfo(Parcel *reply) const { return mLiveSession->getTrackInfo(reply); } status_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select) { status_t err = mLiveSession->selectTrack(trackIndex, select); if (err == OK) { mFetchSubtitleDataGeneration++; if (select) { sp<AMessage> msg = new AMessage(kWhatFetchSubtitleData, id()); msg->setInt32("generation", mFetchSubtitleDataGeneration); msg->post(); } } // LiveSession::selectTrack returns BAD_VALUE when selecting the currently // selected track, or unselecting a non-selected track. In this case it's an // no-op so we return OK. return (err == OK || err == BAD_VALUE) ? OK : err; } status_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) { return mLiveSession->seekTo(seekTimeUs); } Loading @@ -132,6 +155,39 @@ void NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatFetchSubtitleData: { int32_t generation; CHECK(msg->findInt32("generation", &generation)); if (generation != mFetchSubtitleDataGeneration) { // stale break; } sp<ABuffer> buffer; if (mLiveSession->dequeueAccessUnit( LiveSession::STREAMTYPE_SUBTITLES, &buffer) == OK) { sp<AMessage> notify = dupNotify(); notify->setInt32("what", kWhatSubtitleData); notify->setBuffer("buffer", buffer); notify->post(); int64_t timeUs, baseUs, durationUs, delayUs; CHECK(buffer->meta()->findInt64("baseUs", &baseUs)); CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); delayUs = baseUs + timeUs - ALooper::GetNowUs(); msg->post(delayUs > 0ll ? delayUs : 0ll); } else { // try again in 1 second msg->post(1000000ll); } break; } default: Source::onMessageReceived(msg); break; Loading
media/libmediaplayerservice/nuplayer/HTTPLiveSource.h +4 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ struct NuPlayer::HTTPLiveSource : public NuPlayer::Source { virtual status_t feedMoreTSData(); virtual status_t getDuration(int64_t *durationUs); virtual status_t getTrackInfo(Parcel *reply) const; virtual status_t selectTrack(size_t trackIndex, bool select); virtual status_t seekTo(int64_t seekTimeUs); protected: Loading @@ -56,6 +58,7 @@ private: enum { kWhatSessionNotify, kWhatFetchSubtitleData, }; AString mURL; Loading @@ -67,6 +70,7 @@ private: off64_t mOffset; sp<ALooper> mLiveLooper; sp<LiveSession> mLiveSession; int32_t mFetchSubtitleDataGeneration; void onSessionNotify(const sp<AMessage> &msg); Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +85 −2 Original line number Diff line number Diff line Loading @@ -340,6 +340,46 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatGetTrackInfo: { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); status_t err = INVALID_OPERATION; if (mSource != NULL) { Parcel* reply; CHECK(msg->findPointer("reply", (void**)&reply)); err = mSource->getTrackInfo(reply); } sp<AMessage> response = new AMessage; response->setInt32("err", err); response->postReply(replyID); break; } case kWhatSelectTrack: { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); status_t err = INVALID_OPERATION; if (mSource != NULL) { size_t trackIndex; int32_t select; CHECK(msg->findSize("trackIndex", &trackIndex)); CHECK(msg->findInt32("select", &select)); err = mSource->selectTrack(trackIndex, select); } sp<AMessage> response = new AMessage; response->setInt32("err", err); response->postReply(replyID); break; } case kWhatPollDuration: { int32_t generation; Loading Loading @@ -1045,7 +1085,7 @@ void NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { mRenderer->queueBuffer(audio, buffer, reply); } void NuPlayer::notifyListener(int msg, int ext1, int ext2) { void NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { if (mDriver == NULL) { return; } Loading @@ -1056,7 +1096,7 @@ void NuPlayer::notifyListener(int msg, int ext1, int ext2) { return; } driver->notifyListener(msg, ext1, ext2); driver->notifyListener(msg, ext1, ext2, in); } void NuPlayer::flushDecoder(bool audio, bool needShutdown) { Loading Loading @@ -1132,6 +1172,26 @@ status_t NuPlayer::setVideoScalingMode(int32_t mode) { return OK; } status_t NuPlayer::getTrackInfo(Parcel* reply) const { sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, id()); msg->setPointer("reply", reply); sp<AMessage> response; status_t err = msg->postAndAwaitResponse(&response); return err; } status_t NuPlayer::selectTrack(size_t trackIndex, bool select) { sp<AMessage> msg = new AMessage(kWhatSelectTrack, id()); msg->setSize("trackIndex", trackIndex); msg->setInt32("select", select); sp<AMessage> response; status_t err = msg->postAndAwaitResponse(&response); return err; } void NuPlayer::schedulePollDuration() { sp<AMessage> msg = new AMessage(kWhatPollDuration, id()); msg->setInt32("generation", mPollDurationGeneration); Loading Loading @@ -1371,6 +1431,29 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) { break; } case Source::kWhatSubtitleData: { sp<ABuffer> buffer; CHECK(msg->findBuffer("buffer", &buffer)); int32_t trackIndex; int64_t timeUs, durationUs; CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); Parcel in; in.writeInt32(trackIndex); in.writeInt64(timeUs); in.writeInt64(durationUs); in.writeInt32(buffer->size()); in.writeInt32(buffer->size()); in.write(buffer->data(), buffer->size()); notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); break; } case Source::kWhatQueueDecoderShutdown: { int32_t audio, video; Loading