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

Commit a658180f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Move nested classes out of Tuner.java"

parents e0167178 cecc980a
Loading
Loading
Loading
Loading
+103 −0
Original line number Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media.tv.tuner;

import android.annotation.Nullable;
import android.media.tv.tuner.Tuner.Filter;
import android.media.tv.tuner.TunerConstants.DemuxPidType;

/**
 * This class is used to interact with descramblers.
 *
 * <p> Descrambler is a hardware component used to descramble data.
 *
 * <p> This class controls the TIS interaction with Tuner HAL.
 * @hide
 */
public class Descrambler implements AutoCloseable {
    private long mNativeContext;

    private native int nativeAddPid(int pidType, int pid, Filter filter);
    private native int nativeRemovePid(int pidType, int pid, Filter filter);
    private native int nativeSetKeyToken(byte[] keyToken);
    private native int nativeClose();

    private Descrambler() {}

    /**
     * Add packets' PID to the descrambler for descrambling.
     *
     * The descrambler will start descrambling packets with this PID. Multiple PIDs can be added
     * into one descrambler instance because descambling can happen simultaneously on packets
     * from different PIDs.
     *
     * If the Descrambler previously contained a filter for the PID, the old filter is replaced
     * by the specified filter.
     *
     * @param pidType the type of the PID.
     * @param pid the PID of packets to start to be descrambled.
     * @param filter an optional filter instance to identify upper stream.
     * @return result status of the operation.
     *
     * @hide
     */
    public int addPid(@DemuxPidType int pidType, int pid, @Nullable Filter filter) {
        return nativeAddPid(pidType, pid, filter);
    }

    /**
     * Remove packets' PID from the descrambler
     *
     * The descrambler will stop descrambling packets with this PID.
     *
     * @param pidType the type of the PID.
     * @param pid the PID of packets to stop to be descrambled.
     * @param filter an optional filter instance to identify upper stream.
     * @return result status of the operation.
     *
     * @hide
     */
    public int removePid(@DemuxPidType int pidType, int pid, @Nullable Filter filter) {
        return nativeRemovePid(pidType, pid, filter);
    }

    /**
     * Set a key token to link descrambler to a key slot
     *
     * A descrambler instance can have only one key slot to link, but a key slot can hold a few
     * keys for different purposes.
     *
     * @param keyToken the token to be used to link the key slot.
     * @return result status of the operation.
     *
     * @hide
     */
    public int setKeyToken(byte[] keyToken) {
        return nativeSetKeyToken(keyToken);
    }

    /**
     * Release the descrambler instance.
     *
     * @hide
     */
    @Override
    public void close() {
        nativeClose();
    }

}
+152 −0
Original line number Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media.tv.tuner;

import android.annotation.NonNull;
import android.media.tv.tuner.Tuner.DvrCallback;
import android.media.tv.tuner.Tuner.Filter;
import android.os.ParcelFileDescriptor;

/** @hide */
public class Dvr {
    private long mNativeContext;
    private DvrCallback mCallback;

    private native int nativeAttachFilter(Filter filter);
    private native int nativeDetachFilter(Filter filter);
    private native int nativeConfigureDvr(DvrSettings settings);
    private native int nativeStartDvr();
    private native int nativeStopDvr();
    private native int nativeFlushDvr();
    private native int nativeClose();
    private native void nativeSetFileDescriptor(int fd);
    private native int nativeRead(int size);
    private native int nativeRead(byte[] bytes, int offset, int size);
    private native int nativeWrite(int size);
    private native int nativeWrite(byte[] bytes, int offset, int size);

    private Dvr() {}

    /**
     * Attaches a filter to DVR interface for recording.
     *
     * @param filter the filter to be attached.
     * @return result status of the operation.
     */
    public int attachFilter(Filter filter) {
        return nativeAttachFilter(filter);
    }

    /**
     * Detaches a filter from DVR interface.
     *
     * @param filter the filter to be detached.
     * @return result status of the operation.
     */
    public int detachFilter(Filter filter) {
        return nativeDetachFilter(filter);
    }

    /**
     * Configures the DVR.
     *
     * @param settings the settings of the DVR interface.
     * @return result status of the operation.
     */
    public int configure(DvrSettings settings) {
        return nativeConfigureDvr(settings);
    }

    /**
     * Starts DVR.
     *
     * Starts consuming playback data or producing data for recording.
     *
     * @return result status of the operation.
     */
    public int start() {
        return nativeStartDvr();
    }

    /**
     * Stops DVR.
     *
     * Stops consuming playback data or producing data for recording.
     *
     * @return result status of the operation.
     */
    public int stop() {
        return nativeStopDvr();
    }

    /**
     * Flushed DVR data.
     *
     * @return result status of the operation.
     */
    public int flush() {
        return nativeFlushDvr();
    }

    /**
     * closes the DVR instance to release resources.
     *
     * @return result status of the operation.
     */
    public int close() {
        return nativeClose();
    }

    /**
     * Sets file descriptor to read/write data.
     */
    public void setFileDescriptor(ParcelFileDescriptor fd) {
        nativeSetFileDescriptor(fd.getFd());
    }

    /**
     * Reads data from the file for DVR playback.
     */
    public int read(int size) {
        return nativeRead(size);
    }

    /**
     * Reads data from the buffer for DVR playback.
     */
    public int read(@NonNull byte[] bytes, int offset, int size) {
        if (size + offset > bytes.length) {
            throw new ArrayIndexOutOfBoundsException(
                    "Array length=" + bytes.length + ", offset=" + offset + ", size=" + size);
        }
        return nativeRead(bytes, offset, size);
    }

    /**
     * Writes recording data to file.
     */
    public int write(int size) {
        return nativeWrite(size);
    }

    /**
     * Writes recording data to buffer.
     */
    public int write(@NonNull byte[] bytes, int offset, int size) {
        return nativeWrite(bytes, offset, size);
    }
}
+142 −0
Original line number Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media.tv.tuner;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.media.tv.tuner.Tuner.FilterCallback;
import android.media.tv.tuner.filter.FilterConfiguration;
import android.media.tv.tuner.filter.Settings;

/**
 * Tuner data filter.
 *
 * <p> This class is used to filter wanted data according to the filter's configuration.
 * @hide
 */
public class Filter implements AutoCloseable {
    private long mNativeContext;
    private FilterCallback mCallback;
    int mId;

    private native int nativeConfigureFilter(
            int type, int subType, FilterConfiguration settings);
    private native int nativeGetId();
    private native int nativeSetDataSource(Tuner.Filter source);
    private native int nativeStartFilter();
    private native int nativeStopFilter();
    private native int nativeFlushFilter();
    private native int nativeRead(byte[] buffer, int offset, int size);
    private native int nativeClose();

    private Filter(int id) {
        mId = id;
    }

    private void onFilterStatus(int status) {
    }

    /**
     * Configures the filter.
     *
     * @param settings the settings of the filter.
     * @return result status of the operation.
     * @hide
     */
    public int configure(FilterConfiguration settings) {
        int subType = -1;
        Settings s = settings.getSettings();
        if (s != null) {
            subType = s.getType();
        }
        return nativeConfigureFilter(settings.getType(), subType, settings);
    }

    /**
     * Gets the filter Id.
     *
     * @return the hardware resource Id for the filter.
     * @hide
     */
    public int getId() {
        return nativeGetId();
    }

    /**
     * Sets the filter's data source.
     *
     * A filter uses demux as data source by default. If the data was packetized
     * by multiple protocols, multiple filters may need to work together to
     * extract all protocols' header. Then a filter's data source can be output
     * from another filter.
     *
     * @param source the filter instance which provides data input. Switch to
     * use demux as data source if the filter instance is NULL.
     * @return result status of the operation.
     * @hide
     */
    public int setDataSource(@Nullable Tuner.Filter source) {
        return nativeSetDataSource(source);
    }

    /**
     * Starts the filter.
     *
     * @return result status of the operation.
     * @hide
     */
    public int start() {
        return nativeStartFilter();
    }


    /**
     * Stops the filter.
     *
     * @return result status of the operation.
     * @hide
     */
    public int stop() {
        return nativeStopFilter();
    }

    /**
     * Flushes the filter.
     *
     * @return result status of the operation.
     * @hide
     */
    public int flush() {
        return nativeFlushFilter();
    }

    /** @hide */
    public int read(@NonNull byte[] buffer, int offset, int size) {
        size = Math.min(size, buffer.length - offset);
        return nativeRead(buffer, offset, size);
    }

    /**
     * Release the Filter instance.
     *
     * @hide
     */
    @Override
    public void close() {
        nativeClose();
    }
}
+127 −0
Original line number Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media.tv.tuner;

import android.annotation.Nullable;
import android.media.tv.tuner.TunerConstants.Result;

/**
 *  A timer filter is used to filter data based on timestamps.
 *
 *  <p> If the timestamp is set, data is discarded if its timestamp is smaller than the
 *  timestamp in this time filter.
 *
 *  <p> The format of the timestamps is the same as PTS defined in ISO/IEC 13818-1:2019. The
 *  timestamps may or may not be related to PTS or DTS.
 *
 * @hide
 */
public class TimeFilter implements AutoCloseable {
    private native int nativeSetTimestamp(long timestamp);
    private native int nativeClearTimestamp();
    private native Long nativeGetTimestamp();
    private native Long nativeGetSourceTime();
    private native int nativeClose();

    private boolean mEnable = false;

    /**
     * Set timestamp for time based filter.
     *
     * It is used to set initial timestamp and enable time filtering. Once set, the time will be
     * increased automatically like a clock. Contents are discarded if their timestamps are
     * older than the time in the time filter.
     *
     * This method can be called more than once to reset the initial timestamp.
     *
     * @param timestamp initial timestamp for the time filter before it's increased. It's
     * based on the 90KHz counter, and it's the same format as PTS (Presentation Time Stamp)
     * defined in ISO/IEC 13818-1:2019. The timestamps may or may not be related to PTS or DTS.
     * @return result status of the operation.
     */
    @Result
    public int setCurrentTimestamp(long timestamp) {
        int res = nativeSetTimestamp(timestamp);
        // TODO: use a constant for SUCCESS
        if (res == 0) {
            mEnable = true;
        }
        return res;
    }

    /**
     * Clear the timestamp in the time filter.
     *
     * It is used to clear the time value of the time filter. Time filtering is disabled then.
     *
     * @return result status of the operation.
     */
    @Result
    public int clearTimestamp() {
        int res = nativeClearTimestamp();
        if (res == 0) {
            mEnable = false;
        }
        return res;
    }

    /**
     * Get the current time in the time filter.
     *
     * It is used to inquiry current time in the time filter.
     *
     * @return current timestamp in the time filter. It's based on the 90KHz counter, and it's
     * the same format as PTS (Presentation Time Stamp) defined in ISO/IEC 13818-1:2019. The
     * timestamps may or may not be related to PTS or DTS. {@code null} if the timestamp is
     * never set.
     */
    @Nullable
    public Long getTimeStamp() {
        if (!mEnable) {
            return null;
        }
        return nativeGetTimestamp();
    }

    /**
     * Get the timestamp from the beginning of incoming data stream.
     *
     * It is used to inquiry the timestamp from the beginning of incoming data stream.
     *
     * @return first timestamp of incoming data stream. It's based on the 90KHz counter, and
     * it's the same format as PTS (Presentation Time Stamp) defined in ISO/IEC 13818-1:2019.
     * The timestamps may or may not be related to PTS or DTS.
     */
    @Nullable
    public Long getSourceTime() {
        if (!mEnable) {
            return null;
        }
        return nativeGetSourceTime();
    }

    /**
     * Close the Time Filter instance
     *
     * It is to release the TimeFilter instance. Resources are reclaimed so the instance must
     * not be accessed after this method is called.
     */
    @Override
    public void close() {
        nativeClose();
    }
}
+5 −430

File changed.

Preview size limit exceeded, changes collapsed.