Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc9207cc authored by Amy Zhang's avatar Amy Zhang
Browse files

Move Tuner 1.1 new RecordFilterEvent fields into a separate struct

Previously we added the PTS and the mpuSequenceNumber separately into
the tsRecord and the mmtpRecord filter event data structure.

Now there is a better way that we merge all the new fields into one
new struct to pass as a callback parameter.

With this approach, we can minimize the change in both Tuner JNI and
Tuner HAL implementation side to reuse the 1.0 structure and
implementation.

Test: atest VtsHalTvTunerV1_1TargetTest
Bug: 158816517
Change-Id: Ic4f1dc78f76fb52ee0bc6b90d2d297026a788711
parent 433ac601
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -17,13 +17,15 @@
package android.hardware.tv.tuner@1.1;

import @1.0::IFilterCallback;
import @1.1::DemuxFilterEvent;
import @1.0::DemuxFilterEvent;
import @1.1::DemuxFilterEventExt;

interface IFilterCallback extends @1.0::IFilterCallback {
    /**
     * 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);
};
+20 −25
Original line number Diff line number Diff line
@@ -220,7 +220,7 @@ void Filter::filterThreadLoop() {
    // 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.
    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) {
                ALOGD("[Filter] wait for filter data output.");
            }
@@ -228,18 +228,17 @@ void Filter::filterThreadLoop() {
            continue;
        }
        // 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) {
                ALOGE("[Filter] IFilterCallback_1_1 has not been configured yet. Can't send event");
        if (mCallback_1_1 != nullptr) {
            mCallback_1_1->onFilterEvent_1_1(mFilterEvent, mFilterEventExt);
            mFilterEventExt.events.resize(0);
        } else if (mCallback != nullptr) {
            mCallback->onFilterEvent(mFilterEvent);
        } else {
            ALOGD("[Filter] filter callback is not configured yet.");
            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);
        }

        freeAvHandle();
        mFilterStatus = DemuxFilterStatus::DATA_READY;
@@ -279,8 +278,8 @@ void Filter::filterThreadLoop() {
                    mCallback->onFilterEvent(mFilterEvent);
                    mFilterEvent.events.resize(0);
                } else if (mCallback_1_1 != nullptr) {
                    mCallback_1_1->onFilterEvent_1_1(mFilterEvent_1_1);
                    mFilterEvent_1_1.events.resize(0);
                    mCallback_1_1->onFilterEvent_1_1(mFilterEvent, mFilterEventExt);
                    mFilterEventExt.events.resize(0);
                }
                break;
            }
@@ -612,22 +611,18 @@ Result Filter::startRecordFilterHandler() {
    recordEvent = {
            .byteNumber = mRecordFilterOutput.size(),
    };
    V1_1::DemuxFilterTsRecordEvent recordEvent_1_1;
    recordEvent_1_1 = {
            .tsRecordEvent_1_0 = recordEvent,
    V1_1::DemuxFilterRecordEventExt recordEventExt;
    recordEventExt = {
            .pts = (mPts == 0) ? time(NULL) * 900000 : mPts,
    };

    int size;
    if (mCallback_1_1 != nullptr) {
        size = mFilterEvent_1_1.events.size();
        mFilterEvent_1_1.events.resize(size + 1);
        mFilterEvent_1_1.events[size].tsRecord(recordEvent_1_1);
    } else if (mCallback != nullptr) {
    size = mFilterEventExt.events.size();
    mFilterEventExt.events.resize(size + 1);
    mFilterEventExt.events[size].tsRecord(recordEventExt);
    size = mFilterEvent.events.size();
    mFilterEvent.events.resize(size + 1);
    mFilterEvent.events[size].tsRecord(recordEvent);
    }

    mRecordFilterOutput.clear();
    return Result::SUCCESS;
+1 −1
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ class Filter : public V1_1::IFilter {
    bool mIsUsingFMQ = false;
    EventFlag* mFilterEventFlag;
    DemuxFilterEvent mFilterEvent;
    V1_1::DemuxFilterEvent mFilterEvent_1_1;
    V1_1::DemuxFilterEventExt mFilterEventExt;

    // Thread handlers
    pthread_t mFilterThread;
+12 −45
Original line number Diff line number Diff line
@@ -17,15 +17,10 @@
package android.hardware.tv.tuner@1.1;

import @1.0::Constant;
import @1.0::DemuxFilterDownloadEvent;
import @1.0::DemuxFilterIpPayloadEvent;
import @1.0::DemuxFilterMediaEvent;
import @1.0::DemuxFilterMmtpRecordEvent;
import @1.0::DemuxFilterPesEvent;
import @1.0::DemuxFilterSectionEvent;
import @1.0::DemuxFilterTemiEvent;
import @1.0::DemuxFilterTsRecordEvent;
import android.hidl.safe_union@1.0;
import android.hidl.safe_union@1.0::Monostate;

@export
enum Constant : @1.0::Constant {
@@ -52,64 +47,36 @@ enum Constant64Bit : uint64_t {
};

/**
 * Filter Event for TS Record data.
 * Extended Demux Filter Record Event.
 */
struct DemuxFilterTsRecordEvent {
    /**
     * V1_0 Filter Event for TS Record data.
     */
    @1.0::DemuxFilterTsRecordEvent tsRecordEvent_1_0;

struct DemuxFilterRecordEventExt {
    /**
     * 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 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.
     */
    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 {
        DemuxFilterSectionEvent section;

        DemuxFilterMediaEvent media;

        DemuxFilterPesEvent pes;

        @1.1::DemuxFilterTsRecordEvent tsRecord;

        @1.1::DemuxFilterMmtpRecordEvent mmtpRecord;

        DemuxFilterDownloadEvent download;
        /**
         * No extended record filter Event. This is used by the tsRecord or mmtpRecord filter event
         * that does not contain the DemuxFilterRecordEventExt information.
         */
        Monostate noinit;

        DemuxFilterIpPayloadEvent ipPayload;
        DemuxFilterRecordEventExt tsRecord;

        DemuxFilterTemiEvent temi;
        DemuxFilterRecordEventExt mmtpRecord;
    };

    /**
+6 −5
Original line number Diff line number Diff line
@@ -20,11 +20,12 @@ bool FilterCallback::readFilterEventData() {
    bool result = false;
    ALOGW("[vts] reading from filter FMQ or buffer %d", mFilterId);
    // todo separate filter handlers
    for (int i = 0; i < mFilterEvent.events.size(); i++) {
        switch (mFilterEventType) {
            case FilterEventType::RECORD:
                ALOGW("[vts] Record filter event, pts=%" PRIu64 ".",
                      mFilterEvent.events[0].tsRecord().pts);
    for (int i = 0; i < mFilterEventExt.events.size(); i++) {
        auto eventExt = mFilterEventExt.events[i];
        switch (eventExt.getDiscriminator()) {
            case DemuxFilterEventExt::Event::hidl_discriminator::tsRecord:
                ALOGW("[vts] Extended TS record filter event, pts=%" PRIu64 ".",
                      eventExt.tsRecord().pts);
                break;
            default:
                break;
Loading