summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/MediaExtractor.h4
-rw-r--r--media/libavextensions/mediaplayerservice/AVNuExtensions.h2
-rw-r--r--media/libavextensions/mediaplayerservice/AVNuUtils.cpp8
-rw-r--r--media/libavextensions/stagefright/AVExtensions.h7
-rw-r--r--media/libavextensions/stagefright/AVFactory.cpp5
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.cpp22
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.h1
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp3
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp9
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerSource.h1
-rw-r--r--media/libstagefright/Android.mk6
-rw-r--r--media/libstagefright/MPEG4Writer.cpp30
-rw-r--r--media/libstagefright/MediaCodec.cpp2
-rw-r--r--media/libstagefright/MediaCodecSource.cpp2
-rw-r--r--media/libstagefright/MediaExtractor.cpp7
-rw-r--r--media/libstagefright/avc_utils.cpp18
-rw-r--r--services/camera/libcameraservice/CameraFlashlight.cpp12
17 files changed, 105 insertions, 34 deletions
diff --git a/include/media/stagefright/MediaExtractor.h b/include/media/stagefright/MediaExtractor.h
index 183933a..32925ca 100644
--- a/include/media/stagefright/MediaExtractor.h
+++ b/include/media/stagefright/MediaExtractor.h
@@ -29,7 +29,8 @@ class MetaData;
class MediaExtractor : public RefBase {
public:
static sp<MediaExtractor> Create(
- const sp<DataSource> &source, const char *mime = NULL);
+ const sp<DataSource> &source, const char *mime = NULL,
+ const uint32_t flags = 0);
virtual size_t countTracks() = 0;
virtual sp<MediaSource> getTrack(size_t index) = 0;
@@ -67,6 +68,7 @@ public:
}
virtual void setUID(uid_t uid) {
}
+ virtual void setExtraFlags(uint32_t flag) {}
protected:
MediaExtractor() : mIsDrm(false) {}
diff --git a/media/libavextensions/mediaplayerservice/AVNuExtensions.h b/media/libavextensions/mediaplayerservice/AVNuExtensions.h
index a10937d..c6aba71 100644
--- a/media/libavextensions/mediaplayerservice/AVNuExtensions.h
+++ b/media/libavextensions/mediaplayerservice/AVNuExtensions.h
@@ -80,6 +80,8 @@ struct AVNuUtils {
virtual void setDecodedPCMFormat(const sp<AMessage> &);
virtual status_t convertToSinkFormatIfNeeded(const sp<ABuffer> &, sp<ABuffer> &,
audio_format_t sinkFormat, bool isOffload);
+ virtual uint32_t getUseSetBuffersFlag();
+ virtual bool canUseSetBuffers(const sp<MetaData> &Meta);
virtual void printFileName(int fd);
virtual void checkFormatChange(bool *formatChange, const sp<ABuffer> &accessUnit);
diff --git a/media/libavextensions/mediaplayerservice/AVNuUtils.cpp b/media/libavextensions/mediaplayerservice/AVNuUtils.cpp
index aacf76a..c254a70 100644
--- a/media/libavextensions/mediaplayerservice/AVNuUtils.cpp
+++ b/media/libavextensions/mediaplayerservice/AVNuUtils.cpp
@@ -104,6 +104,14 @@ void AVNuUtils::checkFormatChange(bool * /*formatChange*/,
const sp<ABuffer> & /*accessUnit*/) {
}
+uint32_t AVNuUtils::getUseSetBuffersFlag() {
+ return 0;
+}
+
+bool AVNuUtils::canUseSetBuffers(const sp<MetaData> &/*Meta*/) {
+ return false;
+}
+
// ----- NO TRESSPASSING BEYOND THIS LINE ------
AVNuUtils::AVNuUtils() {}
diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h
index 9c712e4..937180f 100644
--- a/media/libavextensions/stagefright/AVExtensions.h
+++ b/media/libavextensions/stagefright/AVExtensions.h
@@ -68,10 +68,10 @@ struct AVFactory {
virtual sp<ACodec> createACodec();
virtual MediaExtractor* createExtendedExtractor(
const sp<DataSource> &source, const char *mime,
- const sp<AMessage> &meta);
+ const sp<AMessage> &meta, const uint32_t flags);
virtual sp<MediaExtractor> updateExtractor(
sp<MediaExtractor> ext, const sp<DataSource> &source,
- const char *mime, const sp<AMessage> &meta);
+ const char *mime, const sp<AMessage> &meta, const uint32_t flags);
virtual sp<NuCachedSource2> createCachedSource(
const sp<DataSource> &source,
const char *cacheConfig = NULL,
@@ -161,6 +161,9 @@ struct AVUtils {
virtual bool useQCHWEncoder(const sp<AMessage> &, AString &) { return false; }
+ virtual bool canDeferRelease(const sp<MetaData> &/*meta*/) { return false; }
+ virtual void setDeferRelease(sp<MetaData> &/*meta*/) {}
+
struct HEVCMuxer {
virtual bool reassembleHEVCCSD(const AString &mime, sp<ABuffer> csd0, sp<MetaData> &meta);
diff --git a/media/libavextensions/stagefright/AVFactory.cpp b/media/libavextensions/stagefright/AVFactory.cpp
index 90ac7b2..2a3810d 100644
--- a/media/libavextensions/stagefright/AVFactory.cpp
+++ b/media/libavextensions/stagefright/AVFactory.cpp
@@ -57,13 +57,14 @@ sp<ACodec> AVFactory::createACodec() {
}
MediaExtractor* AVFactory::createExtendedExtractor(
- const sp<DataSource> &, const char *, const sp<AMessage> &) {
+ const sp<DataSource> &, const char *, const sp<AMessage> &,
+ const uint32_t) {
return NULL;
}
sp<MediaExtractor> AVFactory::updateExtractor(
sp<MediaExtractor> ext, const sp<DataSource> &,
- const char *, const sp<AMessage> &) {
+ const char *, const sp<AMessage> &, const uint32_t) {
return ext;
}
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 6406971..a86dce1 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -37,6 +37,7 @@
#include "../../libstagefright/include/NuCachedSource2.h"
#include "../../libstagefright/include/WVMExtractor.h"
#include "../../libstagefright/include/HTTPBase.h"
+#include "mediaplayerservice/AVNuExtensions.h"
namespace android {
@@ -60,6 +61,7 @@ NuPlayer::GenericSource::GenericSource(
mAudioIsVorbis(false),
mIsWidevine(false),
mIsSecure(false),
+ mUseSetBuffers(false),
mIsStreaming(false),
mUIDValid(uidValid),
mUID(uid),
@@ -173,7 +175,8 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
extractor = mWVMExtractor;
} else {
extractor = MediaExtractor::Create(mDataSource,
- mimeType.isEmpty() ? NULL : mimeType.string());
+ mimeType.isEmpty() ? NULL : mimeType.string(),
+ mIsStreaming ? 0 : AVNuUtils::get()->getUseSetBuffersFlag());
}
if (extractor == NULL) {
@@ -203,6 +206,11 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
}
}
+ if (AVNuUtils::get()->canUseSetBuffers(mFileMeta)) {
+ mUseSetBuffers = true;
+ ALOGI("setBuffers mode enabled");
+ }
+
int32_t totalBitrate = 0;
size_t numtracks = extractor->countTracks();
@@ -319,7 +327,7 @@ int64_t NuPlayer::GenericSource::getLastReadPosition() {
status_t NuPlayer::GenericSource::setBuffers(
bool audio, Vector<MediaBuffer *> &buffers) {
- if (mIsSecure && !audio) {
+ if ((mIsSecure || mUseSetBuffers) && !audio) {
return mVideoTrack.mSource->setBuffers(buffers);
}
return INVALID_OPERATION;
@@ -431,7 +439,8 @@ void NuPlayer::GenericSource::onPrepareAsync() {
| FLAG_CAN_PAUSE
| FLAG_CAN_SEEK_BACKWARD
| FLAG_CAN_SEEK_FORWARD
- | FLAG_CAN_SEEK);
+ | FLAG_CAN_SEEK
+ | (mUseSetBuffers ? FLAG_USE_SET_BUFFERS : 0));
if (mIsSecure) {
// secure decoders must be instantiated before starting widevine source
@@ -1020,7 +1029,8 @@ status_t NuPlayer::GenericSource::dequeueAccessUnit(
// start pulling in more buffers if we only have one (or no) buffer left
// so that decoder has less chance of being starved
- if (track->mPackets->getAvailableBufferCount(&finalResult) < 2) {
+ if ((track->mPackets->getAvailableBufferCount(&finalResult) < 2)
+ && !mUseSetBuffers) {
postReadBuffer(audio? MEDIA_TRACK_TYPE_AUDIO : MEDIA_TRACK_TYPE_VIDEO);
}
@@ -1364,7 +1374,7 @@ sp<ABuffer> NuPlayer::GenericSource::mediaBufferToABuffer(
}
sp<ABuffer> ab;
- if (mIsSecure && !audio) {
+ if ((mIsSecure || mUseSetBuffers) && !audio) {
// data is already provided in the buffer
ab = new ABuffer(NULL, mb->range_length());
mb->add_ref();
@@ -1515,7 +1525,7 @@ void NuPlayer::GenericSource::readBuffer(
track->mPackets->clear();
}
- if (mIsWidevine) {
+ if (mIsWidevine || mUseSetBuffers) {
options.setNonBlocking();
}
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h
index beaee9a..c1d6e3e 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.h
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.h
@@ -126,6 +126,7 @@ protected:
bool mAudioIsVorbis;
bool mIsWidevine;
bool mIsSecure;
+ bool mUseSetBuffers;
bool mIsStreaming;
bool mUIDValid;
uid_t mUID;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 1186149..ec1ab79 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -1605,7 +1605,8 @@ status_t NuPlayer::instantiateDecoder(bool audio, sp<DecoderBase> *decoder) {
(*decoder)->configure(format);
// allocate buffers to decrypt widevine source buffers
- if (!audio && (mSourceFlags & Source::FLAG_SECURE)) {
+ if (!audio && ((mSourceFlags & Source::FLAG_SECURE) ||
+ (mSourceFlags & Source::FLAG_USE_SET_BUFFERS))) {
Vector<sp<ABuffer> > inputBufs;
CHECK_EQ((*decoder)->getInputBuffers(&inputBufs), (status_t)OK);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index f83eaf6..baea834 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -364,7 +364,14 @@ void NuPlayer::Decoder::onResume(bool notifyComplete) {
if (notifyComplete) {
mResumePending = true;
}
- mCodec->start();
+
+ if (mCodec != NULL) {
+ mCodec->start();
+ } else {
+ ALOGW("Decoder %s onResume without a valid codec object",
+ mComponentName.c_str());
+ handleError(NO_INIT);
+ }
}
void NuPlayer::Decoder::doFlush(bool notifyComplete) {
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
index 9ee6c7b..b248316 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
@@ -39,6 +39,7 @@ struct NuPlayer::Source : public AHandler {
FLAG_DYNAMIC_DURATION = 16,
FLAG_SECURE = 32,
FLAG_PROTECTED = 64,
+ FLAG_USE_SET_BUFFERS = 128,
};
enum {
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index 03e7e46..b2729af 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -137,6 +137,12 @@ ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DENABLE_STAGEFRIGHT_EXPERIMENTS
endif
+ifeq ($(call is-vendor-board-platform,QCOM),true)
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_EXTN_FLAC_DECODER)),true)
+ LOCAL_CFLAGS += -DQTI_FLAC_DECODER
+endif
+endif
+
LOCAL_CLANG := true
LOCAL_MODULE:= libstagefright
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 94f40b4..8dfc54c 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -2231,7 +2231,9 @@ status_t MPEG4Writer::Track::threadEntry() {
MediaBuffer *buffer;
const char *trackName = mIsAudio ? "Audio" : "Video";
while (!mDone && (err = mSource->read(&buffer)) == OK) {
- if (buffer->range_length() == 0) {
+ if (buffer == NULL) {
+ continue;
+ } else if (buffer->range_length() == 0) {
buffer->release();
buffer = NULL;
++nZeroLengthFrames;
@@ -2284,15 +2286,23 @@ status_t MPEG4Writer::Track::threadEntry() {
continue;
}
- // Make a deep copy of the MediaBuffer and Metadata and release
- // the original as soon as we can
- MediaBuffer *copy = new MediaBuffer(buffer->range_length());
- memcpy(copy->data(), (uint8_t *)buffer->data() + buffer->range_offset(),
- buffer->range_length());
- copy->set_range(0, buffer->range_length());
- meta_data = new MetaData(*buffer->meta_data().get());
- buffer->release();
- buffer = NULL;
+ MediaBuffer *copy = NULL;
+ // Check if the upstream source hints it is OK to hold on to the
+ // buffer without releasing immediately and avoid cloning the buffer
+ if (AVUtils::get()->canDeferRelease(buffer->meta_data())) {
+ copy = buffer;
+ meta_data = new MetaData(*buffer->meta_data().get());
+ } else {
+ // Make a deep copy of the MediaBuffer and Metadata and release
+ // the original as soon as we can
+ copy = new MediaBuffer(buffer->range_length());
+ memcpy(copy->data(), (uint8_t *)buffer->data() + buffer->range_offset(),
+ buffer->range_length());
+ copy->set_range(0, buffer->range_length());
+ meta_data = new MetaData(*buffer->meta_data().get());
+ buffer->release();
+ buffer = NULL;
+ }
if (mIsAvc || mIsHEVC) StripStartcode(copy);
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 7f7c7fa..c6ba76e 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -871,6 +871,8 @@ status_t MediaCodec::getBufferAndFormat(
}
*format = info.mFormat;
}
+ } else {
+ return BAD_INDEX;
}
return OK;
}
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index dbd9cb0..925be14 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -759,6 +759,8 @@ void MediaCodecSource::onMessageReceived(const sp<AMessage> &msg) {
MediaBuffer *mbuf = new MediaBuffer(outbuf->size());
memcpy(mbuf->data(), outbuf->data(), outbuf->size());
+ sp<MetaData> meta = mbuf->meta_data();
+ AVUtils::get()->setDeferRelease(meta);
if (!(flags & MediaCodec::BUFFER_FLAG_CODECCONFIG)) {
if (mIsVideo) {
diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp
index 0f656a1..bfb2a16 100644
--- a/media/libstagefright/MediaExtractor.cpp
+++ b/media/libstagefright/MediaExtractor.cpp
@@ -54,7 +54,8 @@ uint32_t MediaExtractor::flags() const {
// static
sp<MediaExtractor> MediaExtractor::Create(
- const sp<DataSource> &source, const char *mime) {
+ const sp<DataSource> &source, const char *mime,
+ const uint32_t flags) {
sp<AMessage> meta;
String8 tmp;
@@ -94,7 +95,7 @@ sp<MediaExtractor> MediaExtractor::Create(
}
sp<MediaExtractor> ret = NULL;
- if ((ret = AVFactory::get()->createExtendedExtractor(source, mime, meta)) != NULL) {
+ if ((ret = AVFactory::get()->createExtendedExtractor(source, mime, meta, flags)) != NULL) {
} else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)
|| !strcasecmp(mime, "audio/mp4")) {
ret = new MPEG4Extractor(source);
@@ -124,7 +125,7 @@ sp<MediaExtractor> MediaExtractor::Create(
ret = new MidiExtractor(source);
}
- ret = AVFactory::get()->updateExtractor(ret, source, mime, meta);
+ ret = AVFactory::get()->updateExtractor(ret, source, mime, meta, flags);
if (ret != NULL) {
if (isDrm) {
ret->setDrmFlag(true);
diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp
index 8c371ba..98b5c0e 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -25,6 +25,7 @@
#include <media/stagefright/foundation/hexdump.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MetaData.h>
#include <utils/misc.h>
@@ -443,25 +444,34 @@ bool IsIDR(const sp<ABuffer> &buffer) {
}
bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) {
- const uint8_t *data = accessUnit->data();
+ MediaBuffer *mediaBuffer =
+ (MediaBuffer *)(accessUnit->getMediaBufferBase());
+ const uint8_t *data =
+ (mediaBuffer != NULL) ? (uint8_t *) mediaBuffer->data() : accessUnit->data();
size_t size = accessUnit->size();
const uint8_t *nalStart;
size_t nalSize;
+ bool bIsReferenceFrame = true;
while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) {
CHECK_GT(nalSize, 0u);
unsigned nalType = nalStart[0] & 0x1f;
if (nalType == 5) {
- return true;
+ bIsReferenceFrame = true;
+ break;
} else if (nalType == 1) {
unsigned nal_ref_idc = (nalStart[0] >> 5) & 3;
- return nal_ref_idc != 0;
+ bIsReferenceFrame = (nal_ref_idc != 0);
+ break;
}
}
- return true;
+ if (mediaBuffer != NULL) {
+ mediaBuffer->release();
+ }
+ return bIsReferenceFrame;
}
sp<MetaData> MakeAACCodecSpecificData(
diff --git a/services/camera/libcameraservice/CameraFlashlight.cpp b/services/camera/libcameraservice/CameraFlashlight.cpp
index 280bb9d..fd23ef9 100644
--- a/services/camera/libcameraservice/CameraFlashlight.cpp
+++ b/services/camera/libcameraservice/CameraFlashlight.cpp
@@ -99,7 +99,8 @@ status_t CameraFlashlight::createFlashlightControl(const String8& cameraId) {
status_t CameraFlashlight::setTorchMode(const String8& cameraId, bool enabled) {
if (!mFlashlightMapInitialized) {
- ALOGE("%s: findFlashUnits() must be called before this method.");
+ ALOGE("%s: findFlashUnits() must be called before this method.",
+ __FUNCTION__);
return NO_INIT;
}
@@ -200,7 +201,8 @@ bool CameraFlashlight::hasFlashUnit(const String8& cameraId) {
bool CameraFlashlight::hasFlashUnitLocked(const String8& cameraId) {
if (!mFlashlightMapInitialized) {
- ALOGE("%s: findFlashUnits() must be called before this method.");
+ ALOGE("%s: findFlashUnits() must be called before this method.",
+ __FUNCTION__);
return false;
}
@@ -219,7 +221,8 @@ status_t CameraFlashlight::prepareDeviceOpen(const String8& cameraId) {
Mutex::Autolock l(mLock);
if (!mFlashlightMapInitialized) {
- ALOGE("%s: findFlashUnits() must be called before this method.");
+ ALOGE("%s: findFlashUnits() must be called before this method.",
+ __FUNCTION__);
return NO_INIT;
}
@@ -256,7 +259,8 @@ status_t CameraFlashlight::deviceClosed(const String8& cameraId) {
Mutex::Autolock l(mLock);
if (!mFlashlightMapInitialized) {
- ALOGE("%s: findFlashUnits() must be called before this method.");
+ ALOGE("%s: findFlashUnits() must be called before this method.",
+ __FUNCTION__);
return NO_INIT;
}