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

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

Merge changes I2803d0ed,I8d83f7a3,I46acdd2f

* changes:
  Manager CiCam resources in Tuner Resource Manager
  Update client pid and priority on requesting resources
  Move Tuner resource updating from Tuner java into Tuner client
parents c7359d5d ed7fc385
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -223,6 +223,9 @@ filegroup {
        "media/java/**/*.java",
        "media/java/**/*.aidl",
    ],
    exclude_srcs: [
        ":framework-media-tv-tunerresourcemanager-sources-aidl",
    ],
    path: "media/java",
}

@@ -630,6 +633,7 @@ java_defaults {
        // in favor of an API stubs dependency in java_library "framework" below.
        "mimemap",
        "av-types-aidl-java",
        "tv_tuner_resource_manager_aidl_interface-java",
        "soundtrigger_middleware-aidl-java",
        "modules-utils-os",
    ],
+6 −3
Original line number Diff line number Diff line
@@ -716,8 +716,9 @@ public final class MediaCas implements AutoCloseable {
            context.getSystemService(Context.TV_TUNER_RESOURCE_MGR_SERVICE);
        if (mTunerResourceManager != null) {
            int[] clientId = new int[1];
            ResourceClientProfile profile =
                    new ResourceClientProfile(tvInputServiceSessionId, priorityHint);
            ResourceClientProfile profile = new ResourceClientProfile();
            profile.tvInputSessionId = tvInputServiceSessionId;
            profile.useCase = priorityHint;
            mTunerResourceManager.registerClientProfile(
                    profile, context.getMainExecutor(), mResourceListener, clientId);
            mClientId = clientId[0];
@@ -921,7 +922,9 @@ public final class MediaCas implements AutoCloseable {
        int[] sessionResourceHandle = new int[1];
        sessionResourceHandle[0] = -1;
        if (mTunerResourceManager != null) {
            CasSessionRequest casSessionRequest = new CasSessionRequest(mClientId, mCasSystemId);
            CasSessionRequest casSessionRequest = new CasSessionRequest();
            casSessionRequest.clientId = mClientId;
            casSessionRequest.casSystemId = mCasSystemId;
            if (!mTunerResourceManager
                    .requestCasSession(casSessionRequest, sessionResourceHandle)) {
                throw new MediaCasException.InsufficientResourceException(
+53 −31
Original line number Diff line number Diff line
@@ -44,9 +44,9 @@ import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType;
import android.media.tv.tuner.frontend.OnTuneEventListener;
import android.media.tv.tuner.frontend.ScanCallback;
import android.media.tv.tunerresourcemanager.ResourceClientProfile;
import android.media.tv.tunerresourcemanager.TunerCiCamRequest;
import android.media.tv.tunerresourcemanager.TunerDemuxRequest;
import android.media.tv.tunerresourcemanager.TunerDescramblerRequest;
import android.media.tv.tunerresourcemanager.TunerFrontendInfo;
import android.media.tv.tunerresourcemanager.TunerFrontendRequest;
import android.media.tv.tunerresourcemanager.TunerLnbRequest;
import android.media.tv.tunerresourcemanager.TunerResourceManager;
@@ -298,6 +298,8 @@ public class Tuner implements AutoCloseable {
    private Executor mOnResourceLostListenerExecutor;

    private Integer mDemuxHandle;
    private Integer mFrontendCiCamHandle;
    private Integer mFrontendCiCamId;
    private Map<Integer, WeakReference<Descrambler>> mDescramblers = new HashMap<>();
    private List<WeakReference<Filter>> mFilters = new ArrayList<WeakReference<Filter>>();

@@ -343,33 +345,14 @@ public class Tuner implements AutoCloseable {

        mHandler = createEventHandler();
        int[] clientId = new int[1];
        ResourceClientProfile profile = new ResourceClientProfile(tvInputSessionId, useCase);
        ResourceClientProfile profile = new ResourceClientProfile();
        profile.tvInputSessionId = tvInputSessionId;
        profile.useCase = useCase;
        mTunerResourceManager.registerClientProfile(
                profile, new HandlerExecutor(mHandler), mResourceListener, clientId);
        mClientId = clientId[0];

        mUserId = ActivityManager.getCurrentUser();

        setFrontendInfoList();
    }

    private void setFrontendInfoList() {
        List<Integer> ids = getFrontendIds();
        if (ids == null) {
            return;
        }
        TunerFrontendInfo[] infos = new TunerFrontendInfo[ids.size()];
        for (int i = 0; i < ids.size(); i++) {
            int id = ids.get(i);
            FrontendInfo frontendInfo = getFrontendInfoById(id);
            if (frontendInfo == null) {
                continue;
            }
            TunerFrontendInfo tunerFrontendInfo = new TunerFrontendInfo(
                    id, frontendInfo.getType(), frontendInfo.getExclusiveGroupId());
            infos[i] = tunerFrontendInfo;
        }
        mTunerResourceManager.setFrontendInfoList(infos);
    }

    /**
@@ -489,6 +472,14 @@ public class Tuner implements AutoCloseable {
        if (mLnb != null) {
            mLnb.close();
        }
        if (mFrontendCiCamHandle != null) {
            int result = nativeUnlinkCiCam(mFrontendCiCamId);
            if (result == RESULT_SUCCESS) {
                mTunerResourceManager.releaseCiCam(mFrontendCiCamHandle, mClientId);
                mFrontendCiCamId = null;
                mFrontendCiCamHandle = null;
            }
        }
        synchronized (mDescramblers) {
            if (!mDescramblers.isEmpty()) {
                for (Map.Entry<Integer, WeakReference<Descrambler>> d : mDescramblers.entrySet()) {
@@ -804,7 +795,9 @@ public class Tuner implements AutoCloseable {

    private boolean requestFrontend() {
        int[] feHandle = new int[1];
        TunerFrontendRequest request = new TunerFrontendRequest(mClientId, mFrontendType);
        TunerFrontendRequest request = new TunerFrontendRequest();
        request.clientId = mClientId;
        request.frontendType = mFrontendType;
        boolean granted = mTunerResourceManager.requestFrontend(request, feHandle);
        if (granted) {
            mFrontendHandle = feHandle[0];
@@ -935,7 +928,8 @@ public class Tuner implements AutoCloseable {
    public int connectFrontendToCiCam(int ciCamId) {
        if (TunerVersionChecker.checkHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1,
                "linkFrontendToCiCam")) {
            if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
            if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)
                    && checkCiCamResource(ciCamId)) {
                return nativeLinkCiCam(ciCamId);
            }
        }
@@ -954,7 +948,7 @@ public class Tuner implements AutoCloseable {
     */
    @Result
    public int disconnectCiCam() {
        if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
        if (mDemuxHandle != null) {
            return nativeDisconnectCiCam();
        }
        return RESULT_UNAVAILABLE;
@@ -980,8 +974,14 @@ public class Tuner implements AutoCloseable {
    public int disconnectFrontendToCiCam(int ciCamId) {
        if (TunerVersionChecker.checkHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1,
                "unlinkFrontendToCiCam")) {
            if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
                return nativeUnlinkCiCam(ciCamId);
            if (mFrontendCiCamHandle != null && mFrontendCiCamId == ciCamId) {
                int result = nativeUnlinkCiCam(ciCamId);
                if (result == RESULT_SUCCESS) {
                    mTunerResourceManager.releaseCiCam(mFrontendCiCamHandle, mClientId);
                    mFrontendCiCamId = null;
                    mFrontendCiCamHandle = null;
                }
                return result;
            }
        }
        return RESULT_UNAVAILABLE;
@@ -1258,7 +1258,8 @@ public class Tuner implements AutoCloseable {

    private boolean requestLnb() {
        int[] lnbHandle = new int[1];
        TunerLnbRequest request = new TunerLnbRequest(mClientId);
        TunerLnbRequest request = new TunerLnbRequest();
        request.clientId = mClientId;
        boolean granted = mTunerResourceManager.requestLnb(request, lnbHandle);
        if (granted) {
            mLnbHandle = lnbHandle[0];
@@ -1346,7 +1347,8 @@ public class Tuner implements AutoCloseable {

    private boolean requestDemux() {
        int[] demuxHandle = new int[1];
        TunerDemuxRequest request = new TunerDemuxRequest(mClientId);
        TunerDemuxRequest request = new TunerDemuxRequest();
        request.clientId = mClientId;
        boolean granted = mTunerResourceManager.requestDemux(request, demuxHandle);
        if (granted) {
            mDemuxHandle = demuxHandle[0];
@@ -1357,7 +1359,8 @@ public class Tuner implements AutoCloseable {

    private Descrambler requestDescrambler() {
        int[] descramblerHandle = new int[1];
        TunerDescramblerRequest request = new TunerDescramblerRequest(mClientId);
        TunerDescramblerRequest request = new TunerDescramblerRequest();
        request.clientId = mClientId;
        boolean granted = mTunerResourceManager.requestDescrambler(request, descramblerHandle);
        if (!granted) {
            return null;
@@ -1375,6 +1378,18 @@ public class Tuner implements AutoCloseable {
        return descrambler;
    }

    private boolean requestFrontendCiCam(int ciCamId) {
        int[] ciCamHandle = new int[1];
        TunerCiCamRequest request = new TunerCiCamRequest();
        request.clientId = mClientId;
        request.ciCamId = ciCamId;
        boolean granted = mTunerResourceManager.requestCiCam(request, ciCamHandle);
        if (granted) {
            mFrontendCiCamHandle = ciCamHandle[0];
        }
        return granted;
    }

    private boolean checkResource(int resourceType)  {
        switch (resourceType) {
            case TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND: {
@@ -1401,6 +1416,13 @@ public class Tuner implements AutoCloseable {
        return true;
    }

    private boolean checkCiCamResource(int ciCamId) {
        if (mFrontendCiCamHandle == null && !requestFrontendCiCam(ciCamId)) {
            return false;
        }
        return true;
    }

    /* package */ void releaseLnb() {
        if (mLnbHandle != null) {
            // LNB handle can be null if it's opened by name.
+30 −11
Original line number Diff line number Diff line
filegroup {
    name: "framework-media-tv-tunerresourcemanager-sources",
    name: "framework-media-tv-tunerresourcemanager-sources-aidl",
    srcs: [
        "*.java",
        "*.aidl",
        "aidl/android/media/tv/tunerresourcemanager/CasSessionRequest.aidl",
        "aidl/android/media/tv/tunerresourcemanager/IResourcesReclaimListener.aidl",
        "aidl/android/media/tv/tunerresourcemanager/ResourceClientProfile.aidl",
        "aidl/android/media/tv/tunerresourcemanager/TunerCiCamRequest.aidl",
        "aidl/android/media/tv/tunerresourcemanager/TunerDemuxRequest.aidl",
        "aidl/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.aidl",
        "aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.aidl",
        "aidl/android/media/tv/tunerresourcemanager/TunerFrontendRequest.aidl",
        "aidl/android/media/tv/tunerresourcemanager/TunerLnbRequest.aidl",
        "aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl",
    ],
    path: ".",
    path: "aidl",
}

java_library {
    name: "framework-media-tv-trm-sources",
    srcs: [":framework-media-tv-tunerresourcemanager-sources"],
    installable: true,
    visibility: [
        "//frameworks/base",
aidl_interface {
    name: "tv_tuner_resource_manager_aidl_interface",
    unstable: true,
    local_include_dir: "aidl",
    backend: {
        java: {
            sdk_version: "current",
        },
        cpp: {
            enabled: true,
        },
        ndk: {
            enabled: true,
        },
    },
    srcs: [
        ":framework-media-tv-tunerresourcemanager-sources-aidl",
    ],
}
+0 −114
Original line number Diff line number Diff line
/*
 * Copyright 2020 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.tunerresourcemanager;

import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

/**
 * Information required to request a Cas Session.
 *
 * @hide
 */
public final class CasSessionRequest implements Parcelable {
    static final String TAG = "CasSessionRequest";

    public static final
                @NonNull
                Parcelable.Creator<CasSessionRequest> CREATOR =
                new Parcelable.Creator<CasSessionRequest>() {
                @Override
                public CasSessionRequest createFromParcel(Parcel source) {
                    try {
                        return new CasSessionRequest(source);
                    } catch (Exception e) {
                        Log.e(TAG, "Exception creating CasSessionRequest from parcel", e);
                        return null;
                    }
                }

                @Override
                public CasSessionRequest[] newArray(int size) {
                    return new CasSessionRequest[size];
                }
            };

    /**
     * Client id of the client that sends the request.
     */
    private final int mClientId;

    /**
     * System id of the requested cas.
     */
    private final int mCasSystemId;

    private CasSessionRequest(@NonNull Parcel source) {
        mClientId = source.readInt();
        mCasSystemId = source.readInt();
    }

    /**
     * Constructs a new {@link CasSessionRequest} with the given parameters.
     *
     * @param clientId id of the client.
     * @param casSystemId the cas system id that the client is requesting.
     */
    public CasSessionRequest(int clientId,
                             int casSystemId) {
        mClientId = clientId;
        mCasSystemId = casSystemId;
    }

    /**
     * Returns the id of the client.
     */
    public int getClientId() {
        return mClientId;
    }

    /**
     * Returns the cas system id requested.
     */
    public int getCasSystemId() {
        return mCasSystemId;
    }

    // Parcelable
    @Override
    public int describeContents() {
        return 0;
    }

    @NonNull
    @Override
    public String toString() {
        StringBuilder b = new StringBuilder(128);
        b.append("CasSessionRequest {clientId=").append(mClientId);
        b.append(", casSystemId=").append(mCasSystemId);
        b.append("}");
        return b.toString();
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mClientId);
        dest.writeInt(mCasSystemId);
    }
}
Loading