Loading tv/tuner/1.1/IFilterCallback.hal +5 −3 Original line number Original line Diff line number Diff line Loading @@ -17,13 +17,15 @@ package android.hardware.tv.tuner@1.1; package android.hardware.tv.tuner@1.1; import @1.0::IFilterCallback; import @1.0::IFilterCallback; import @1.1::DemuxFilterEvent; import @1.0::DemuxFilterEvent; import @1.1::DemuxFilterEventExt; interface IFilterCallback extends @1.0::IFilterCallback { interface IFilterCallback extends @1.0::IFilterCallback { /** /** * Notify the client that a new filter event happened. * Notify the client that a new filter event happened. * * * @param filterEvent a v1_1 filter event. * @param filterEvent a v1_0 filter event. * @param filterEventExt a v1_1 extended filter event. */ */ oneway onFilterEvent_1_1(DemuxFilterEvent filterEvent); oneway onFilterEvent_1_1(DemuxFilterEvent filterEvent, DemuxFilterEventExt filterEventExt); }; }; tv/tuner/1.1/default/Filter.cpp +20 −25 Original line number Original line Diff line number Diff line Loading @@ -220,7 +220,7 @@ void Filter::filterThreadLoop() { // For the first time of filter output, implementation needs to send the filter // For the first time of filter output, implementation needs to send the filter // Event Callback without waiting for the DATA_CONSUMED to init the process. // Event Callback without waiting for the DATA_CONSUMED to init the process. while (mFilterThreadRunning) { while (mFilterThreadRunning) { if (mFilterEvent.events.size() == 0 && mFilterEvent_1_1.events.size() == 0) { if (mFilterEvent.events.size() == 0 && mFilterEventExt.events.size() == 0) { if (DEBUG_FILTER) { if (DEBUG_FILTER) { ALOGD("[Filter] wait for filter data output."); ALOGD("[Filter] wait for filter data output."); } } Loading @@ -228,18 +228,17 @@ void Filter::filterThreadLoop() { continue; continue; } } // After successfully write, send a callback and wait for the read to be done // After successfully write, send a callback and wait for the read to be done if (mFilterEvent_1_1.events.size() > 0) { if (mCallback_1_1 != nullptr) { if (mCallback_1_1 == nullptr) { mCallback_1_1->onFilterEvent_1_1(mFilterEvent, mFilterEventExt); ALOGE("[Filter] IFilterCallback_1_1 has not been configured yet. Can't send event"); mFilterEventExt.events.resize(0); } else if (mCallback != nullptr) { mCallback->onFilterEvent(mFilterEvent); } else { ALOGD("[Filter] filter callback is not configured yet."); mFilterThreadRunning = false; mFilterThreadRunning = false; break; return; } } mCallback_1_1->onFilterEvent_1_1(mFilterEvent_1_1); mFilterEvent_1_1.events.resize(0); } else { mCallback->onFilterEvent(mFilterEvent); mFilterEvent.events.resize(0); mFilterEvent.events.resize(0); } freeAvHandle(); freeAvHandle(); mFilterStatus = DemuxFilterStatus::DATA_READY; mFilterStatus = DemuxFilterStatus::DATA_READY; Loading Loading @@ -279,8 +278,8 @@ void Filter::filterThreadLoop() { mCallback->onFilterEvent(mFilterEvent); mCallback->onFilterEvent(mFilterEvent); mFilterEvent.events.resize(0); mFilterEvent.events.resize(0); } else if (mCallback_1_1 != nullptr) { } else if (mCallback_1_1 != nullptr) { mCallback_1_1->onFilterEvent_1_1(mFilterEvent_1_1); mCallback_1_1->onFilterEvent_1_1(mFilterEvent, mFilterEventExt); mFilterEvent_1_1.events.resize(0); mFilterEventExt.events.resize(0); } } break; break; } } Loading Loading @@ -612,22 +611,18 @@ Result Filter::startRecordFilterHandler() { recordEvent = { recordEvent = { .byteNumber = mRecordFilterOutput.size(), .byteNumber = mRecordFilterOutput.size(), }; }; V1_1::DemuxFilterTsRecordEvent recordEvent_1_1; V1_1::DemuxFilterRecordEventExt recordEventExt; recordEvent_1_1 = { recordEventExt = { .tsRecordEvent_1_0 = recordEvent, .pts = (mPts == 0) ? time(NULL) * 900000 : mPts, .pts = (mPts == 0) ? time(NULL) * 900000 : mPts, }; }; int size; int size; if (mCallback_1_1 != nullptr) { size = mFilterEventExt.events.size(); size = mFilterEvent_1_1.events.size(); mFilterEventExt.events.resize(size + 1); mFilterEvent_1_1.events.resize(size + 1); mFilterEventExt.events[size].tsRecord(recordEventExt); mFilterEvent_1_1.events[size].tsRecord(recordEvent_1_1); } else if (mCallback != nullptr) { size = mFilterEvent.events.size(); size = mFilterEvent.events.size(); mFilterEvent.events.resize(size + 1); mFilterEvent.events.resize(size + 1); mFilterEvent.events[size].tsRecord(recordEvent); mFilterEvent.events[size].tsRecord(recordEvent); } mRecordFilterOutput.clear(); mRecordFilterOutput.clear(); return Result::SUCCESS; return Result::SUCCESS; Loading tv/tuner/1.1/default/Filter.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -128,7 +128,7 @@ class Filter : public V1_1::IFilter { bool mIsUsingFMQ = false; bool mIsUsingFMQ = false; EventFlag* mFilterEventFlag; EventFlag* mFilterEventFlag; DemuxFilterEvent mFilterEvent; DemuxFilterEvent mFilterEvent; V1_1::DemuxFilterEvent mFilterEvent_1_1; V1_1::DemuxFilterEventExt mFilterEventExt; // Thread handlers // Thread handlers pthread_t mFilterThread; pthread_t mFilterThread; Loading tv/tuner/1.1/types.hal +12 −45 Original line number Original line Diff line number Diff line Loading @@ -17,15 +17,10 @@ package android.hardware.tv.tuner@1.1; package android.hardware.tv.tuner@1.1; import @1.0::Constant; import @1.0::Constant; import @1.0::DemuxFilterDownloadEvent; import @1.0::DemuxFilterIpPayloadEvent; import @1.0::DemuxFilterMediaEvent; import @1.0::DemuxFilterMmtpRecordEvent; import @1.0::DemuxFilterMmtpRecordEvent; import @1.0::DemuxFilterPesEvent; import @1.0::DemuxFilterSectionEvent; import @1.0::DemuxFilterTemiEvent; import @1.0::DemuxFilterTsRecordEvent; import @1.0::DemuxFilterTsRecordEvent; import android.hidl.safe_union@1.0; import android.hidl.safe_union@1.0; import android.hidl.safe_union@1.0::Monostate; @export @export enum Constant : @1.0::Constant { enum Constant : @1.0::Constant { Loading @@ -52,64 +47,36 @@ enum Constant64Bit : uint64_t { }; }; /** /** * Filter Event for TS Record data. * Extended Demux Filter Record Event. */ */ struct DemuxFilterTsRecordEvent { struct DemuxFilterRecordEventExt { /** * V1_0 Filter Event for TS Record data. */ @1.0::DemuxFilterTsRecordEvent tsRecordEvent_1_0; /** /** * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and * the SC_HEVC. * the SC_HEVC. */ */ uint64_t pts; uint64_t pts; }; /** * Filter Event for MMTP Record data. */ struct DemuxFilterMmtpRecordEvent { /** * V1_0 Filter Event for MMTP Record data. */ @1.0::DemuxFilterMmtpRecordEvent mmtpRecordEvent_1_0; /** /** * MPU sequence number of the filtered data. This is only used for MMTP. * MPU sequence number of the filtered data. This is only used for MMTP. */ */ uint32_t mpuSequenceNumber; uint32_t mpuSequenceNumber; /** * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and * the SC_HEVC. */ uint64_t pts; }; }; /** /** * Filter Event. * Extended Demux Filter Event. */ */ struct DemuxFilterEvent { struct DemuxFilterEventExt { safe_union Event { safe_union Event { DemuxFilterSectionEvent section; /** * No extended record filter Event. This is used by the tsRecord or mmtpRecord filter event DemuxFilterMediaEvent media; * that does not contain the DemuxFilterRecordEventExt information. */ DemuxFilterPesEvent pes; Monostate noinit; @1.1::DemuxFilterTsRecordEvent tsRecord; @1.1::DemuxFilterMmtpRecordEvent mmtpRecord; DemuxFilterDownloadEvent download; DemuxFilterIpPayloadEvent ipPayload; DemuxFilterRecordEventExt tsRecord; DemuxFilterTemiEvent temi; DemuxFilterRecordEventExt mmtpRecord; }; }; /** /** Loading tv/tuner/1.1/vts/functional/FilterTests.cpp +6 −5 Original line number Original line Diff line number Diff line Loading @@ -20,11 +20,12 @@ bool FilterCallback::readFilterEventData() { bool result = false; bool result = false; ALOGW("[vts] reading from filter FMQ or buffer %d", mFilterId); ALOGW("[vts] reading from filter FMQ or buffer %d", mFilterId); // todo separate filter handlers // todo separate filter handlers for (int i = 0; i < mFilterEvent.events.size(); i++) { for (int i = 0; i < mFilterEventExt.events.size(); i++) { switch (mFilterEventType) { auto eventExt = mFilterEventExt.events[i]; case FilterEventType::RECORD: switch (eventExt.getDiscriminator()) { ALOGW("[vts] Record filter event, pts=%" PRIu64 ".", case DemuxFilterEventExt::Event::hidl_discriminator::tsRecord: mFilterEvent.events[0].tsRecord().pts); ALOGW("[vts] Extended TS record filter event, pts=%" PRIu64 ".", eventExt.tsRecord().pts); break; break; default: default: break; break; Loading Loading
tv/tuner/1.1/IFilterCallback.hal +5 −3 Original line number Original line Diff line number Diff line Loading @@ -17,13 +17,15 @@ package android.hardware.tv.tuner@1.1; package android.hardware.tv.tuner@1.1; import @1.0::IFilterCallback; import @1.0::IFilterCallback; import @1.1::DemuxFilterEvent; import @1.0::DemuxFilterEvent; import @1.1::DemuxFilterEventExt; interface IFilterCallback extends @1.0::IFilterCallback { interface IFilterCallback extends @1.0::IFilterCallback { /** /** * Notify the client that a new filter event happened. * Notify the client that a new filter event happened. * * * @param filterEvent a v1_1 filter event. * @param filterEvent a v1_0 filter event. * @param filterEventExt a v1_1 extended filter event. */ */ oneway onFilterEvent_1_1(DemuxFilterEvent filterEvent); oneway onFilterEvent_1_1(DemuxFilterEvent filterEvent, DemuxFilterEventExt filterEventExt); }; };
tv/tuner/1.1/default/Filter.cpp +20 −25 Original line number Original line Diff line number Diff line Loading @@ -220,7 +220,7 @@ void Filter::filterThreadLoop() { // For the first time of filter output, implementation needs to send the filter // For the first time of filter output, implementation needs to send the filter // Event Callback without waiting for the DATA_CONSUMED to init the process. // Event Callback without waiting for the DATA_CONSUMED to init the process. while (mFilterThreadRunning) { while (mFilterThreadRunning) { if (mFilterEvent.events.size() == 0 && mFilterEvent_1_1.events.size() == 0) { if (mFilterEvent.events.size() == 0 && mFilterEventExt.events.size() == 0) { if (DEBUG_FILTER) { if (DEBUG_FILTER) { ALOGD("[Filter] wait for filter data output."); ALOGD("[Filter] wait for filter data output."); } } Loading @@ -228,18 +228,17 @@ void Filter::filterThreadLoop() { continue; continue; } } // After successfully write, send a callback and wait for the read to be done // After successfully write, send a callback and wait for the read to be done if (mFilterEvent_1_1.events.size() > 0) { if (mCallback_1_1 != nullptr) { if (mCallback_1_1 == nullptr) { mCallback_1_1->onFilterEvent_1_1(mFilterEvent, mFilterEventExt); ALOGE("[Filter] IFilterCallback_1_1 has not been configured yet. Can't send event"); mFilterEventExt.events.resize(0); } else if (mCallback != nullptr) { mCallback->onFilterEvent(mFilterEvent); } else { ALOGD("[Filter] filter callback is not configured yet."); mFilterThreadRunning = false; mFilterThreadRunning = false; break; return; } } mCallback_1_1->onFilterEvent_1_1(mFilterEvent_1_1); mFilterEvent_1_1.events.resize(0); } else { mCallback->onFilterEvent(mFilterEvent); mFilterEvent.events.resize(0); mFilterEvent.events.resize(0); } freeAvHandle(); freeAvHandle(); mFilterStatus = DemuxFilterStatus::DATA_READY; mFilterStatus = DemuxFilterStatus::DATA_READY; Loading Loading @@ -279,8 +278,8 @@ void Filter::filterThreadLoop() { mCallback->onFilterEvent(mFilterEvent); mCallback->onFilterEvent(mFilterEvent); mFilterEvent.events.resize(0); mFilterEvent.events.resize(0); } else if (mCallback_1_1 != nullptr) { } else if (mCallback_1_1 != nullptr) { mCallback_1_1->onFilterEvent_1_1(mFilterEvent_1_1); mCallback_1_1->onFilterEvent_1_1(mFilterEvent, mFilterEventExt); mFilterEvent_1_1.events.resize(0); mFilterEventExt.events.resize(0); } } break; break; } } Loading Loading @@ -612,22 +611,18 @@ Result Filter::startRecordFilterHandler() { recordEvent = { recordEvent = { .byteNumber = mRecordFilterOutput.size(), .byteNumber = mRecordFilterOutput.size(), }; }; V1_1::DemuxFilterTsRecordEvent recordEvent_1_1; V1_1::DemuxFilterRecordEventExt recordEventExt; recordEvent_1_1 = { recordEventExt = { .tsRecordEvent_1_0 = recordEvent, .pts = (mPts == 0) ? time(NULL) * 900000 : mPts, .pts = (mPts == 0) ? time(NULL) * 900000 : mPts, }; }; int size; int size; if (mCallback_1_1 != nullptr) { size = mFilterEventExt.events.size(); size = mFilterEvent_1_1.events.size(); mFilterEventExt.events.resize(size + 1); mFilterEvent_1_1.events.resize(size + 1); mFilterEventExt.events[size].tsRecord(recordEventExt); mFilterEvent_1_1.events[size].tsRecord(recordEvent_1_1); } else if (mCallback != nullptr) { size = mFilterEvent.events.size(); size = mFilterEvent.events.size(); mFilterEvent.events.resize(size + 1); mFilterEvent.events.resize(size + 1); mFilterEvent.events[size].tsRecord(recordEvent); mFilterEvent.events[size].tsRecord(recordEvent); } mRecordFilterOutput.clear(); mRecordFilterOutput.clear(); return Result::SUCCESS; return Result::SUCCESS; Loading
tv/tuner/1.1/default/Filter.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -128,7 +128,7 @@ class Filter : public V1_1::IFilter { bool mIsUsingFMQ = false; bool mIsUsingFMQ = false; EventFlag* mFilterEventFlag; EventFlag* mFilterEventFlag; DemuxFilterEvent mFilterEvent; DemuxFilterEvent mFilterEvent; V1_1::DemuxFilterEvent mFilterEvent_1_1; V1_1::DemuxFilterEventExt mFilterEventExt; // Thread handlers // Thread handlers pthread_t mFilterThread; pthread_t mFilterThread; Loading
tv/tuner/1.1/types.hal +12 −45 Original line number Original line Diff line number Diff line Loading @@ -17,15 +17,10 @@ package android.hardware.tv.tuner@1.1; package android.hardware.tv.tuner@1.1; import @1.0::Constant; import @1.0::Constant; import @1.0::DemuxFilterDownloadEvent; import @1.0::DemuxFilterIpPayloadEvent; import @1.0::DemuxFilterMediaEvent; import @1.0::DemuxFilterMmtpRecordEvent; import @1.0::DemuxFilterMmtpRecordEvent; import @1.0::DemuxFilterPesEvent; import @1.0::DemuxFilterSectionEvent; import @1.0::DemuxFilterTemiEvent; import @1.0::DemuxFilterTsRecordEvent; import @1.0::DemuxFilterTsRecordEvent; import android.hidl.safe_union@1.0; import android.hidl.safe_union@1.0; import android.hidl.safe_union@1.0::Monostate; @export @export enum Constant : @1.0::Constant { enum Constant : @1.0::Constant { Loading @@ -52,64 +47,36 @@ enum Constant64Bit : uint64_t { }; }; /** /** * Filter Event for TS Record data. * Extended Demux Filter Record Event. */ */ struct DemuxFilterTsRecordEvent { struct DemuxFilterRecordEventExt { /** * V1_0 Filter Event for TS Record data. */ @1.0::DemuxFilterTsRecordEvent tsRecordEvent_1_0; /** /** * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and * the SC_HEVC. * the SC_HEVC. */ */ uint64_t pts; uint64_t pts; }; /** * Filter Event for MMTP Record data. */ struct DemuxFilterMmtpRecordEvent { /** * V1_0 Filter Event for MMTP Record data. */ @1.0::DemuxFilterMmtpRecordEvent mmtpRecordEvent_1_0; /** /** * MPU sequence number of the filtered data. This is only used for MMTP. * MPU sequence number of the filtered data. This is only used for MMTP. */ */ uint32_t mpuSequenceNumber; uint32_t mpuSequenceNumber; /** * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and * the SC_HEVC. */ uint64_t pts; }; }; /** /** * Filter Event. * Extended Demux Filter Event. */ */ struct DemuxFilterEvent { struct DemuxFilterEventExt { safe_union Event { safe_union Event { DemuxFilterSectionEvent section; /** * No extended record filter Event. This is used by the tsRecord or mmtpRecord filter event DemuxFilterMediaEvent media; * that does not contain the DemuxFilterRecordEventExt information. */ DemuxFilterPesEvent pes; Monostate noinit; @1.1::DemuxFilterTsRecordEvent tsRecord; @1.1::DemuxFilterMmtpRecordEvent mmtpRecord; DemuxFilterDownloadEvent download; DemuxFilterIpPayloadEvent ipPayload; DemuxFilterRecordEventExt tsRecord; DemuxFilterTemiEvent temi; DemuxFilterRecordEventExt mmtpRecord; }; }; /** /** Loading
tv/tuner/1.1/vts/functional/FilterTests.cpp +6 −5 Original line number Original line Diff line number Diff line Loading @@ -20,11 +20,12 @@ bool FilterCallback::readFilterEventData() { bool result = false; bool result = false; ALOGW("[vts] reading from filter FMQ or buffer %d", mFilterId); ALOGW("[vts] reading from filter FMQ or buffer %d", mFilterId); // todo separate filter handlers // todo separate filter handlers for (int i = 0; i < mFilterEvent.events.size(); i++) { for (int i = 0; i < mFilterEventExt.events.size(); i++) { switch (mFilterEventType) { auto eventExt = mFilterEventExt.events[i]; case FilterEventType::RECORD: switch (eventExt.getDiscriminator()) { ALOGW("[vts] Record filter event, pts=%" PRIu64 ".", case DemuxFilterEventExt::Event::hidl_discriminator::tsRecord: mFilterEvent.events[0].tsRecord().pts); ALOGW("[vts] Extended TS record filter event, pts=%" PRIu64 ".", eventExt.tsRecord().pts); break; break; default: default: break; break; Loading