Merge "Connect TunerFilter with FilterClient" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
fa341d7986
@@ -3786,7 +3786,7 @@ static jint android_media_tv_Tuner_read_filter_fmq(
|
||||
jniThrowRuntimeException(env, "Failed to GetByteArrayElements");
|
||||
return -1;
|
||||
}
|
||||
int realReadSize = filterClient->read(reinterpret_cast<uint8_t*>(dst) + offset, size);
|
||||
int realReadSize = filterClient->read(reinterpret_cast<int8_t*>(dst) + offset, size);
|
||||
env->ReleaseByteArrayElements(buffer, dst, 0);
|
||||
return (jint) realReadSize;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <aidlcommonsupport/NativeHandle.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <fmq/ConvertMQDescriptors.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
#include "FilterClient.h"
|
||||
@@ -68,18 +69,12 @@ void FilterClient::setHidlFilter(sp<IFilter> filter) {
|
||||
mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilter);
|
||||
}
|
||||
|
||||
int FilterClient::read(uint8_t* buffer, int size) {
|
||||
// TODO: pending aidl interface
|
||||
|
||||
if (mFilter != NULL) {
|
||||
Result res = getFilterMq();
|
||||
if (res != Result::SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
return copyData(buffer, size);
|
||||
int FilterClient::read(int8_t* buffer, int size) {
|
||||
Result res = getFilterMq();
|
||||
if (res != Result::SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
return copyData(buffer, size);
|
||||
}
|
||||
|
||||
SharedHandleInfo FilterClient::getAvSharedHandleInfo() {
|
||||
@@ -106,7 +101,10 @@ Result FilterClient::configure(DemuxFilterSettings configure) {
|
||||
}
|
||||
|
||||
Result FilterClient::configureMonitorEvent(int monitorEventType) {
|
||||
// TODO: pending aidl interface
|
||||
if (mTunerFilter != NULL) {
|
||||
Status s = mTunerFilter->configureMonitorEvent(monitorEventType);
|
||||
return ClientHelper::getServiceSpecificErrorCode(s);
|
||||
}
|
||||
|
||||
if (mFilter_1_1 != NULL) {
|
||||
return mFilter_1_1->configureMonitorEvent(monitorEventType);
|
||||
@@ -116,7 +114,10 @@ Result FilterClient::configureMonitorEvent(int monitorEventType) {
|
||||
}
|
||||
|
||||
Result FilterClient::configureIpFilterContextId(int cid) {
|
||||
// TODO: pending aidl interface
|
||||
if (mTunerFilter != NULL) {
|
||||
Status s = mTunerFilter->configureIpFilterContextId(cid);
|
||||
return ClientHelper::getServiceSpecificErrorCode(s);
|
||||
}
|
||||
|
||||
if (mFilter_1_1 != NULL) {
|
||||
return mFilter_1_1->configureIpCid(cid);
|
||||
@@ -126,7 +127,19 @@ Result FilterClient::configureIpFilterContextId(int cid) {
|
||||
}
|
||||
|
||||
Result FilterClient::configureAvStreamType(AvStreamType avStreamType) {
|
||||
// TODO: pending aidl interface
|
||||
if (mTunerFilter != NULL) {
|
||||
int type;
|
||||
switch (avStreamType.getDiscriminator()) {
|
||||
case AvStreamType::hidl_discriminator::audio:
|
||||
type = (int)avStreamType.audio();
|
||||
break;
|
||||
case AvStreamType::hidl_discriminator::video:
|
||||
type = (int)avStreamType.video();
|
||||
break;
|
||||
}
|
||||
Status s = mTunerFilter->configureAvStreamType(type);
|
||||
return ClientHelper::getServiceSpecificErrorCode(s);
|
||||
}
|
||||
|
||||
if (mFilter_1_1 != NULL) {
|
||||
return mFilter_1_1->configureAvStreamType(avStreamType);
|
||||
@@ -228,7 +241,10 @@ Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId)
|
||||
}
|
||||
|
||||
Result FilterClient::setDataSource(sp<FilterClient> filterClient){
|
||||
// TODO: pending aidl interface
|
||||
if (mTunerFilter != NULL) {
|
||||
Status s = mTunerFilter->setDataSource(filterClient->getAidlFilter());
|
||||
return ClientHelper::getServiceSpecificErrorCode(s);
|
||||
}
|
||||
|
||||
if (mFilter != NULL) {
|
||||
sp<IFilter> sourceFilter = filterClient->getHalFilter();
|
||||
@@ -891,29 +907,43 @@ void TunerFilterCallback::getHidlRestartEvent(const vector<TunerFilterEvent>& fi
|
||||
}
|
||||
|
||||
Result FilterClient::getFilterMq() {
|
||||
if (mFilter == NULL) {
|
||||
return Result::INVALID_STATE;
|
||||
}
|
||||
|
||||
if (mFilterMQ != NULL) {
|
||||
return Result::SUCCESS;
|
||||
}
|
||||
|
||||
Result getQueueDescResult = Result::UNKNOWN_ERROR;
|
||||
MQDescriptorSync<uint8_t> filterMQDesc;
|
||||
mFilter->getQueueDesc(
|
||||
[&](Result r, const MQDescriptorSync<uint8_t>& desc) {
|
||||
filterMQDesc = desc;
|
||||
getQueueDescResult = r;
|
||||
});
|
||||
if (getQueueDescResult == Result::SUCCESS) {
|
||||
mFilterMQ = std::make_unique<MQ>(filterMQDesc, true);
|
||||
EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
|
||||
AidlMQDesc aidlMqDesc;
|
||||
Result res = Result::UNAVAILABLE;
|
||||
|
||||
if (mTunerFilter != NULL) {
|
||||
Status s = mTunerFilter->getQueueDesc(&aidlMqDesc);
|
||||
res = ClientHelper::getServiceSpecificErrorCode(s);
|
||||
if (res == Result::SUCCESS) {
|
||||
mFilterMQ = new (nothrow) AidlMQ(aidlMqDesc);
|
||||
EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
return getQueueDescResult;
|
||||
|
||||
if (mFilter != NULL) {
|
||||
MQDescriptorSync<uint8_t> filterMQDesc;
|
||||
mFilter->getQueueDesc(
|
||||
[&](Result r, const MQDescriptorSync<uint8_t>& desc) {
|
||||
filterMQDesc = desc;
|
||||
res = r;
|
||||
});
|
||||
if (res == Result::SUCCESS) {
|
||||
AidlMQDesc aidlMQDesc;
|
||||
unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
|
||||
filterMQDesc, &aidlMQDesc);
|
||||
mFilterMQ = new (nothrow) AidlMessageQueue(aidlMQDesc);
|
||||
EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int FilterClient::copyData(uint8_t* buffer, int size) {
|
||||
int FilterClient::copyData(int8_t* buffer, int size) {
|
||||
if (mFilter == NULL || mFilterMQ == NULL || mFilterMQEventFlag == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -25,12 +25,14 @@
|
||||
#include <android/hardware/tv/tuner/1.1/IFilter.h>
|
||||
#include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
|
||||
#include <android/hardware/tv/tuner/1.1/types.h>
|
||||
#include <fmq/AidlMessageQueue.h>
|
||||
#include <fmq/MessageQueue.h>
|
||||
|
||||
#include "ClientHelper.h"
|
||||
#include "FilterClientCallback.h"
|
||||
|
||||
using Status = ::ndk::ScopedAStatus;
|
||||
using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
|
||||
using ::aidl::android::media::tv::tuner::BnTunerFilterCallback;
|
||||
using ::aidl::android::media::tv::tuner::ITunerFilter;
|
||||
using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress;
|
||||
@@ -69,10 +71,13 @@ using ::android::hardware::tv::tuner::V1_1::IFilterCallback;
|
||||
|
||||
using namespace std;
|
||||
|
||||
using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
|
||||
|
||||
namespace android {
|
||||
|
||||
using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
|
||||
using MQDesc = MQDescriptorSync<uint8_t>;
|
||||
using AidlMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
|
||||
using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;
|
||||
|
||||
struct SharedHandleInfo {
|
||||
native_handle_t* sharedHandle;
|
||||
uint64_t size;
|
||||
@@ -139,7 +144,7 @@ public:
|
||||
*
|
||||
* @return the actual reading size. -1 if failed to read.
|
||||
*/
|
||||
int read(uint8_t* buffer, int size);
|
||||
int read(int8_t* buffer, int size);
|
||||
|
||||
/**
|
||||
* Get the a/v shared memory handle information
|
||||
@@ -234,7 +239,7 @@ private:
|
||||
void getAidlIpAddress(DemuxIpAddress ipAddr,
|
||||
TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress);
|
||||
Result getFilterMq();
|
||||
int copyData(uint8_t* buffer, int size);
|
||||
int copyData(int8_t* buffer, int size);
|
||||
void checkIsMediaFilter(DemuxFilterType type);
|
||||
void handleAvShareMemory();
|
||||
void closeAvSharedMemory();
|
||||
@@ -259,7 +264,7 @@ private:
|
||||
*/
|
||||
sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;
|
||||
|
||||
unique_ptr<MQ> mFilterMQ;
|
||||
AidlMQ* mFilterMQ;
|
||||
EventFlag* mFilterMQEventFlag;
|
||||
|
||||
sp<FilterClientCallback> mCallback;
|
||||
|
||||
Reference in New Issue
Block a user