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