diff options
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 103 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.h | 36 |
2 files changed, 99 insertions, 40 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 05ea512ea970..f0f2d8fd676f 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -309,9 +309,9 @@ C2DataIdInfo::C2DataIdInfo(uint32_t index, uint64_t value) : C2Param(kParamSize, /////////////// MediaEvent /////////////////////// -MediaEvent::MediaEvent(sp<IFilter> iFilter, hidl_handle avHandle, - uint64_t dataId, uint64_t dataLength, jobject obj) : mIFilter(iFilter), - mDataId(dataId), mDataLength(dataLength), mBuffer(nullptr), +MediaEvent::MediaEvent(sp<Filter> filter, hidl_handle avHandle, + uint64_t dataId, uint64_t dataSize, jobject obj) : mFilter(filter), + mDataId(dataId), mDataSize(dataSize), mBuffer(nullptr), mDataIdRefCnt(0), mAvHandleRefCnt(0), mIonHandle(nullptr) { JNIEnv *env = AndroidRuntime::getJNIEnv(); mMediaEventObj = env->NewWeakGlobalRef(obj); @@ -335,7 +335,8 @@ MediaEvent::~MediaEvent() { void MediaEvent::finalize() { if (mAvHandleRefCnt == 0) { - mIFilter->releaseAvHandle(hidl_handle(mAvHandle), mDataIdRefCnt == 0 ? mDataId : 0); + mFilter->mFilterSp->releaseAvHandle( + hidl_handle(mAvHandle), mDataIdRefCnt == 0 ? mDataId : 0); native_handle_close(mAvHandle); } } @@ -348,7 +349,47 @@ jobject MediaEvent::getLinearBlock() { if (mLinearBlockObj != NULL) { return mLinearBlockObj; } - mIonHandle = new C2HandleIon(dup(mAvHandle->data[0]), mDataLength); + + int fd; + int numInts = 0; + int memIndex; + int dataSize; + if (mAvHandle->numFds == 0) { + if (mFilter->mAvSharedHandle == NULL) { + ALOGE("Shared AV memory handle is not initialized."); + return NULL; + } + if (mFilter->mAvSharedHandle->numFds == 0) { + ALOGE("Shared AV memory handle is empty."); + return NULL; + } + fd = mFilter->mAvSharedHandle->data[0]; + dataSize = mFilter->mAvSharedMemSize; + numInts = mFilter->mAvSharedHandle->numInts; + if (numInts > 0) { + // If the first int in the shared native handle has value, use it as the index + memIndex = mFilter->mAvSharedHandle->data[mFilter->mAvSharedHandle->numFds]; + } + } else { + fd = mAvHandle->data[0]; + dataSize = mDataSize; + numInts = mAvHandle->numInts; + if (numInts > 0) { + // Otherwise if the first int in the av native handle returned from the filter + // event has value, use it as the index + memIndex = mAvHandle->data[mAvHandle->numFds]; + } else { + if (mFilter->mAvSharedHandle != NULL) { + numInts = mFilter->mAvSharedHandle->numInts; + if (numInts > 0) { + // If the first int in the shared native handle has value, use it as the index + memIndex = mFilter->mAvSharedHandle->data[mFilter->mAvSharedHandle->numFds]; + } + } + } + } + + mIonHandle = new C2HandleIon(dup(fd), dataSize); std::shared_ptr<C2LinearBlock> block = _C2BlockFactory::CreateLinearBlock(mIonHandle); if (block != nullptr) { // CreateLinearBlock delete mIonHandle after it create block successfully. @@ -357,13 +398,11 @@ jobject MediaEvent::getLinearBlock() { JNIEnv *env = AndroidRuntime::getJNIEnv(); std::unique_ptr<JMediaCodecLinearBlock> context{new JMediaCodecLinearBlock}; context->mBlock = block; - std::shared_ptr<C2Buffer> pC2Buffer = context->toC2Buffer(0, mDataLength); + std::shared_ptr<C2Buffer> pC2Buffer = context->toC2Buffer(0, dataSize); context->mBuffer = pC2Buffer; mC2Buffer = pC2Buffer; - if (mAvHandle->numInts > 0) { - // use first int in the native_handle as the index - int index = mAvHandle->data[mAvHandle->numFds]; - std::shared_ptr<C2Param> c2param = std::make_shared<C2DataIdInfo>(index, mDataId); + if (numInts > 0) { + std::shared_ptr<C2Param> c2param = std::make_shared<C2DataIdInfo>(memIndex, mDataId); std::shared_ptr<C2Info> info(std::static_pointer_cast<C2Info>(c2param)); pC2Buffer->setInfo(info); } @@ -470,7 +509,7 @@ jobjectArray FilterCallback::getMediaEvent( if (mediaEvent.avMemory.getNativeHandle() != NULL || mediaEvent.avDataId != 0) { sp<MediaEvent> mediaEventSp = - new MediaEvent(mIFilter, mediaEvent.avMemory, + new MediaEvent(mFilter, mediaEvent.avMemory, mediaEvent.avDataId, dataLength + offset, obj); mediaEventSp->mAvHandleRefCnt++; env->SetLongField(obj, eventContext, (jlong) mediaEventSp.get()); @@ -690,7 +729,7 @@ Return<void> FilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filterEve } } env->CallVoidMethod( - mFilter, + mFilter->mFilterObj, gFields.onFilterEventID, array); return Void(); @@ -709,7 +748,7 @@ Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus status) { ALOGD("FilterCallback::onFilterStatus"); JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod( - mFilter, + mFilter->mFilterObj, gFields.onFilterStatusID, (jint)status); return Void(); @@ -717,17 +756,11 @@ Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus status) { void FilterCallback::setFilter(const sp<Filter> filter) { ALOGD("FilterCallback::setFilter"); - mFilter = filter->mFilterObj; - mIFilter = filter->mFilterSp; + // JNI Object + mFilter = filter; } -FilterCallback::~FilterCallback() { - JNIEnv *env = AndroidRuntime::getJNIEnv(); - if (mFilter != NULL) { - env->DeleteWeakGlobalRef(mFilter); - mFilter = NULL; - } -} +FilterCallback::~FilterCallback() {} /////////////// Filter /////////////////////// @@ -1609,9 +1642,33 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { sp<Filter> filterSp = new Filter(iFilterSp, filterObj); filterSp->incStrong(filterObj); env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get()); - + filterSp->mIsMediaFilter = false; + filterSp->mAvSharedHandle = NULL; callback->setFilter(filterSp); + if (type.mainType == DemuxFilterMainType::MMTP) { + if (type.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || + type.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { + filterSp->mIsMediaFilter = true; + } + } + + if (type.mainType == DemuxFilterMainType::TS) { + if (type.subType.tsFilterType() == DemuxTsFilterType::AUDIO || + type.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { + filterSp->mIsMediaFilter = true; + } + } + + if (iFilterSp_1_1 != NULL && filterSp->mIsMediaFilter) { + iFilterSp_1_1->getAvSharedHandle([&](Result r, hidl_handle avMemory, uint64_t avMemSize) { + if (r == Result::SUCCESS) { + filterSp->mAvSharedHandle = native_handle_clone(avMemory.getNativeHandle()); + filterSp->mAvSharedMemSize = avMemSize; + } + }); + } + return filterObj; } diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 3cd1564b7089..5a59a5881586 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -118,18 +118,32 @@ struct Dvr : public RefBase { int mFd; }; +struct Filter : public RefBase { + Filter(sp<IFilter> sp, jobject obj); + ~Filter(); + int close(); + sp<IFilter> getIFilter(); + sp<IFilter> mFilterSp; + std::unique_ptr<MQ> mFilterMQ; + EventFlag* mFilterMQEventFlag; + jweak mFilterObj; + native_handle_t* mAvSharedHandle; + uint64_t mAvSharedMemSize; + bool mIsMediaFilter; +}; + struct MediaEvent : public RefBase { - MediaEvent(sp<IFilter> iFilter, hidl_handle avHandle, uint64_t dataId, - uint64_t dataLength, jobject obj); + MediaEvent(sp<Filter> filter, hidl_handle avHandle, uint64_t dataId, + uint64_t dataSize, jobject obj); ~MediaEvent(); jobject getLinearBlock(); uint64_t getAudioHandle(); void finalize(); - sp<IFilter> mIFilter; + sp<Filter> mFilter; native_handle_t* mAvHandle; uint64_t mDataId; - uint64_t mDataLength; + uint64_t mDataSize; uint8_t* mBuffer; android::Mutex mLock; int mDataIdRefCnt; @@ -140,17 +154,6 @@ struct MediaEvent : public RefBase { std::weak_ptr<C2Buffer> mC2Buffer; }; -struct Filter : public RefBase { - Filter(sp<IFilter> sp, jobject obj); - ~Filter(); - int close(); - sp<IFilter> getIFilter(); - sp<IFilter> mFilterSp; - std::unique_ptr<MQ> mFilterMQ; - EventFlag* mFilterMQEventFlag; - jweak mFilterObj; -}; - struct FilterCallback : public IFilterCallback { ~FilterCallback(); virtual Return<void> onFilterEvent_1_1(const DemuxFilterEvent& filterEvent, @@ -160,8 +163,7 @@ struct FilterCallback : public IFilterCallback { void setFilter(const sp<Filter> filter); private: - jweak mFilter; - sp<IFilter> mIFilter; + sp<Filter> mFilter; jobjectArray getSectionEvent( jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events); jobjectArray getMediaEvent( |