Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +8 −1 Original line number Diff line number Diff line Loading @@ -1006,7 +1006,14 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { &NuPlayer::performScanSources)); } flushDecoder(audio, formatChange); sp<AMessage> newFormat = mSource->getFormat(audio); sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder; if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) { flushDecoder(audio, /* needShutdown = */ true); } else { flushDecoder(audio, /* needShutdown = */ false); err = OK; } } else { // This stream is unaffected by the discontinuity Loading media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +61 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ void NuPlayer::Decoder::configure(const sp<AMessage> &format) { // queue. bool needDedicatedLooper = !strncasecmp(mime.c_str(), "video/", 6); mFormat = format; mCodec = new ACodec; if (needDedicatedLooper && mCodecLooper == NULL) { Loading Loading @@ -147,5 +148,65 @@ void NuPlayer::Decoder::initiateShutdown() { } } bool NuPlayer::Decoder::supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const { if (targetFormat == NULL) { return true; } AString mime; if (!targetFormat->findString("mime", &mime)) { return false; } if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) { // field-by-field comparison const char * keys[] = { "channel-count", "sample-rate", "is-adts" }; for (unsigned int i = 0; i < sizeof(keys) / sizeof(keys[0]); i++) { int32_t oldVal, newVal; if (!mFormat->findInt32(keys[i], &oldVal) || !targetFormat->findInt32(keys[i], &newVal) || oldVal != newVal) { return false; } } sp<ABuffer> oldBuf, newBuf; if (mFormat->findBuffer("csd-0", &oldBuf) && targetFormat->findBuffer("csd-0", &newBuf)) { if (oldBuf->size() != newBuf->size()) { return false; } return !memcmp(oldBuf->data(), newBuf->data(), oldBuf->size()); } } return false; } bool NuPlayer::Decoder::supportsSeamlessFormatChange(const sp<AMessage> &targetFormat) const { if (mFormat == NULL) { return false; } if (targetFormat == NULL) { return true; } AString oldMime, newMime; if (!mFormat->findString("mime", &oldMime) || !targetFormat->findString("mime", &newMime) || !(oldMime == newMime)) { return false; } bool audio = !strncasecmp(oldMime.c_str(), "audio/", strlen("audio/")); bool seamless; if (audio) { seamless = supportsSeamlessAudioFormatChange(targetFormat); } else { seamless = mCodec != NULL && mCodec->isConfiguredForAdaptivePlayback(); } ALOGV("%s seamless support for %s", seamless ? "yes" : "no", oldMime.c_str()); return seamless; } } // namespace android media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h +5 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ struct NuPlayer::Decoder : public AHandler { void signalResume(); void initiateShutdown(); bool supportsSeamlessFormatChange(const sp<AMessage> &to) const; protected: virtual ~Decoder(); Loading @@ -49,6 +51,7 @@ private: sp<AMessage> mNotify; sp<NativeWindowWrapper> mNativeWindow; sp<AMessage> mFormat; sp<ACodec> mCodec; sp<ALooper> mCodecLooper; Loading @@ -59,6 +62,8 @@ private: void onFillThisBuffer(const sp<AMessage> &msg); bool supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const; DISALLOW_EVIL_CONSTRUCTORS(Decoder); }; Loading Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +8 −1 Original line number Diff line number Diff line Loading @@ -1006,7 +1006,14 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { &NuPlayer::performScanSources)); } flushDecoder(audio, formatChange); sp<AMessage> newFormat = mSource->getFormat(audio); sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder; if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) { flushDecoder(audio, /* needShutdown = */ true); } else { flushDecoder(audio, /* needShutdown = */ false); err = OK; } } else { // This stream is unaffected by the discontinuity Loading
media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +61 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ void NuPlayer::Decoder::configure(const sp<AMessage> &format) { // queue. bool needDedicatedLooper = !strncasecmp(mime.c_str(), "video/", 6); mFormat = format; mCodec = new ACodec; if (needDedicatedLooper && mCodecLooper == NULL) { Loading Loading @@ -147,5 +148,65 @@ void NuPlayer::Decoder::initiateShutdown() { } } bool NuPlayer::Decoder::supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const { if (targetFormat == NULL) { return true; } AString mime; if (!targetFormat->findString("mime", &mime)) { return false; } if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) { // field-by-field comparison const char * keys[] = { "channel-count", "sample-rate", "is-adts" }; for (unsigned int i = 0; i < sizeof(keys) / sizeof(keys[0]); i++) { int32_t oldVal, newVal; if (!mFormat->findInt32(keys[i], &oldVal) || !targetFormat->findInt32(keys[i], &newVal) || oldVal != newVal) { return false; } } sp<ABuffer> oldBuf, newBuf; if (mFormat->findBuffer("csd-0", &oldBuf) && targetFormat->findBuffer("csd-0", &newBuf)) { if (oldBuf->size() != newBuf->size()) { return false; } return !memcmp(oldBuf->data(), newBuf->data(), oldBuf->size()); } } return false; } bool NuPlayer::Decoder::supportsSeamlessFormatChange(const sp<AMessage> &targetFormat) const { if (mFormat == NULL) { return false; } if (targetFormat == NULL) { return true; } AString oldMime, newMime; if (!mFormat->findString("mime", &oldMime) || !targetFormat->findString("mime", &newMime) || !(oldMime == newMime)) { return false; } bool audio = !strncasecmp(oldMime.c_str(), "audio/", strlen("audio/")); bool seamless; if (audio) { seamless = supportsSeamlessAudioFormatChange(targetFormat); } else { seamless = mCodec != NULL && mCodec->isConfiguredForAdaptivePlayback(); } ALOGV("%s seamless support for %s", seamless ? "yes" : "no", oldMime.c_str()); return seamless; } } // namespace android
media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h +5 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ struct NuPlayer::Decoder : public AHandler { void signalResume(); void initiateShutdown(); bool supportsSeamlessFormatChange(const sp<AMessage> &to) const; protected: virtual ~Decoder(); Loading @@ -49,6 +51,7 @@ private: sp<AMessage> mNotify; sp<NativeWindowWrapper> mNativeWindow; sp<AMessage> mFormat; sp<ACodec> mCodec; sp<ALooper> mCodecLooper; Loading @@ -59,6 +62,8 @@ private: void onFillThisBuffer(const sp<AMessage> &msg); bool supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const; DISALLOW_EVIL_CONSTRUCTORS(Decoder); }; Loading