Merge changes from topic "trm-demux-des" into rvc-dev

* changes:
  Add Descrambler resource management in Tuner Resource Manager
  Add demux resource management into Tuner Resource Manager
This commit is contained in:
Amy Zhang
2020-03-12 21:45:58 +00:00
committed by Android (Google) Code Review
7 changed files with 437 additions and 0 deletions

View File

@@ -19,6 +19,8 @@ package android.media.tv.tunerresourcemanager;
import android.media.tv.tunerresourcemanager.CasSessionRequest;
import android.media.tv.tunerresourcemanager.IResourcesReclaimListener;
import android.media.tv.tunerresourcemanager.ResourceClientProfile;
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;
@@ -147,6 +149,53 @@ interface ITunerResourceManager {
*/
void shareFrontend(in int selfClientId, in int targetClientId);
/*
* This API is used by the Tuner framework to request an available demux from the TunerHAL.
*
* <p>There are three possible scenarios:
* <ul>
* <li>If there is demux available, the API would send the handle back.
*
* <li>If no Demux is available but the current request info can show higher priority than
* other uses of demuxes, the API will send
* {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
* handle the resource reclaim on the holder of lower priority and notify the holder of its
* resource loss.
*
* <li>If no demux can be granted, the API would return false.
* <ul>
*
* @param request {@link TunerDemuxRequest} information of the current request.
* @param demuxHandle a one-element array to return the granted demux handle.
*
* @return true if there is demux granted.
*/
boolean requestDemux(in TunerDemuxRequest request, out int[] demuxHandle);
/*
* This API is used by the Tuner framework to request an available descrambler from the
* TunerHAL.
*
* <p>There are three possible scenarios:
* <ul>
* <li>If there is descrambler available, the API would send the handle back.
*
* <li>If no Descrambler is available but the current request info can show higher priority than
* other uses of Descrambler, the API will send
* {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
* handle the resource reclaim on the holder of lower priority and notify the holder of its
* resource loss.
*
* <li>If no Descrambler can be granted, the API would return false.
* <ul>
*
* @param request {@link TunerDescramblerRequest} information of the current request.
* @param descramblerHandle a one-element array to return the granted descrambler handle.
*
* @return true if there is Descrambler granted.
*/
boolean requestDescrambler(in TunerDescramblerRequest request, out int[] descramblerHandle);
/*
* This API is used by the Tuner framework to request an available Cas session. This session
* needs to be under the CAS system with the id indicated in the {@code request}.
@@ -209,6 +258,24 @@ interface ITunerResourceManager {
*/
void releaseFrontend(in int frontendId);
/*
* Notifies the TRM that the Demux with the given handle was released.
*
* <p>Client must call this whenever it releases a demux.
*
* @param demuxHandle the handle of the released Tuner Demux.
*/
void releaseDemux(in int demuxHandle);
/*
* Notifies the TRM that the Descrambler with the given handle was released.
*
* <p>Client must call this whenever it releases a descrambler.
*
* @param demuxHandle the handle of the released Tuner Descrambler.
*/
void releaseDescrambler(in int descramblerHandle);
/*
* Notifies the TRM that the given Cas session has been released.
*

View File

@@ -0,0 +1,24 @@
/*
* 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;
/**
* Information required to request a Tuner Demux.
*
* @hide
*/
parcelable TunerDemuxRequest;

View File

@@ -0,0 +1,96 @@
/*
* 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 Tuner Demux.
*
* @hide
*/
public final class TunerDemuxRequest implements Parcelable {
static final String TAG = "TunerDemuxRequest";
public static final
@NonNull
Parcelable.Creator<TunerDemuxRequest> CREATOR =
new Parcelable.Creator<TunerDemuxRequest>() {
@Override
public TunerDemuxRequest createFromParcel(Parcel source) {
try {
return new TunerDemuxRequest(source);
} catch (Exception e) {
Log.e(TAG, "Exception creating TunerDemuxRequest from parcel", e);
return null;
}
}
@Override
public TunerDemuxRequest[] newArray(int size) {
return new TunerDemuxRequest[size];
}
};
/**
* Client id of the client that sends the request.
*/
private final int mClientId;
private TunerDemuxRequest(@NonNull Parcel source) {
mClientId = source.readInt();
}
/**
* Constructs a new {@link TunerDemuxRequest} with the given parameters.
*
* @param clientId id of the client.
*/
public TunerDemuxRequest(int clientId) {
mClientId = clientId;
}
/**
* Returns the id of the client.
*/
public int getClientId() {
return mClientId;
}
// Parcelable
@Override
public int describeContents() {
return 0;
}
@NonNull
@Override
public String toString() {
StringBuilder b = new StringBuilder(128);
b.append("TunerDemuxRequest {clientId=").append(mClientId);
b.append("}");
return b.toString();
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mClientId);
}
}

View File

@@ -0,0 +1,24 @@
/*
* 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;
/**
* Information required to request a Tuner Descrambler.
*
* @hide
*/
parcelable TunerDescramblerRequest;

View File

@@ -0,0 +1,96 @@
/*
* 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 Tuner Descrambler.
*
* @hide
*/
public final class TunerDescramblerRequest implements Parcelable {
static final String TAG = "TunerDescramblerRequest";
public static final
@NonNull
Parcelable.Creator<TunerDescramblerRequest> CREATOR =
new Parcelable.Creator<TunerDescramblerRequest>() {
@Override
public TunerDescramblerRequest createFromParcel(Parcel source) {
try {
return new TunerDescramblerRequest(source);
} catch (Exception e) {
Log.e(TAG, "Exception creating TunerDescramblerRequest from parcel", e);
return null;
}
}
@Override
public TunerDescramblerRequest[] newArray(int size) {
return new TunerDescramblerRequest[size];
}
};
/**
* Client id of the client that sends the request.
*/
private final int mClientId;
private TunerDescramblerRequest(@NonNull Parcel source) {
mClientId = source.readInt();
}
/**
* Constructs a new {@link TunerDescramblerRequest} with the given parameters.
*
* @param clientId id of the client.
*/
public TunerDescramblerRequest(int clientId) {
mClientId = clientId;
}
/**
* Returns the id of the client.
*/
public int getClientId() {
return mClientId;
}
// Parcelable
@Override
public int describeContents() {
return 0;
}
@NonNull
@Override
public String toString() {
StringBuilder b = new StringBuilder(128);
b.append("TunerDescramblerRequest {clientId=").append(mClientId);
b.append("}");
return b.toString();
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mClientId);
}
}

View File

@@ -65,6 +65,7 @@ public class TunerResourceManager {
public static final int INVALID_LNB_ID = -1;
public static final int INVALID_TV_INPUT_DEVICE_ID = -1;
public static final int INVALID_TV_INPUT_PORT_ID = -1;
public static final int INVALID_RESOURCE_HANDLE = -1;
private final ITunerResourceManager mService;
private final int mUserId;
@@ -259,6 +260,71 @@ public class TunerResourceManager {
}
}
/**
* Requests a Tuner Demux resource.
*
* <p>There are three possible scenarios:
* <ul>
* <li>If there is Demux available, the API would send the handle back.
*
* <li>If no Demux is available but the current request has a higher priority than other uses of
* demuxes, the API will send {@link IResourcesReclaimListener#onReclaimResources()} to the
* {@link Tuner}. Tuner would handle the resource reclaim on the holder of lower priority and
* notify the holder of its resource loss.
*
* <li>If no Demux system can be granted, the API would return false.
* <ul>
*
* @param request {@link TunerDemuxRequest} information of the current request.
* @param demuxHandle a one-element array to return the granted Demux handle.
* If no Demux granted, this will return {@link #INVALID_RESOURCE_HANDLE}.
*
* @return true if there is Demux granted.
*/
public boolean requestDemux(@NonNull TunerDemuxRequest request, @NonNull int[] demuxHandle) {
boolean result = false;
try {
result = mService.requestDemux(request, demuxHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return result;
}
/**
* Requests a Tuner Descrambler resource.
*
* <p>There are three possible scenarios:
* <ul>
* <li>If there is Descrambler available, the API would send the handle back.
*
* <li>If no Descrambler is available but the current request has a higher priority than other
* uses of descramblers, the API will send
* {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
* handle the resource reclaim on the holder of lower priority and notify the holder of its
* resource loss.
*
* <li>If no Descrambler system can be granted, the API would return false.
* <ul>
*
* @param request {@link TunerDescramblerRequest} information of the current request.
* @param descramblerHandle a one-element array to return the granted Descrambler handle.
* If no Descrambler granted, this will return
* {@link #INVALID_RESOURCE_HANDLE}.
*
* @return true if there is Descrambler granted.
*/
public boolean requestDescrambler(@NonNull TunerDescramblerRequest request,
@NonNull int[] descramblerHandle) {
boolean result = false;
try {
result = mService.requestDescrambler(request, descramblerHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return result;
}
/**
* Requests a CAS session resource.
*
@@ -344,6 +410,36 @@ public class TunerResourceManager {
}
}
/**
* Notifies the TRM that the Demux with the given handle has been released.
*
* <p>Client must call this whenever it releases an Demux.
*
* @param demuxHandle the handle of the released Tuner Demux.
*/
public void releaseDemux(int demuxHandle) {
try {
mService.releaseDemux(demuxHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Notifies the TRM that the Descrambler with the given handle has been released.
*
* <p>Client must call this whenever it releases an Descrambler.
*
* @param descramblerHandle the handle of the released Tuner Descrambler.
*/
public void releaseDescrambler(int descramblerHandle) {
try {
mService.releaseDescrambler(descramblerHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Notifies the TRM that the given Cas session has been released.
*

View File

@@ -24,6 +24,8 @@ import android.media.tv.tunerresourcemanager.CasSessionRequest;
import android.media.tv.tunerresourcemanager.IResourcesReclaimListener;
import android.media.tv.tunerresourcemanager.ITunerResourceManager;
import android.media.tv.tunerresourcemanager.ResourceClientProfile;
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;
@@ -188,6 +190,24 @@ public class TunerResourceManagerService extends SystemService {
}
}
@Override
public boolean requestDemux(@NonNull TunerDemuxRequest request,
@NonNull int[] demuxHandle) {
if (DEBUG) {
Slog.d(TAG, "requestDemux(request=" + request + ")");
}
return true;
}
@Override
public boolean requestDescrambler(@NonNull TunerDescramblerRequest request,
@NonNull int[] descrambleHandle) {
if (DEBUG) {
Slog.d(TAG, "requestDescrambler(request=" + request + ")");
}
return true;
}
@Override
public boolean requestCasSession(
@NonNull CasSessionRequest request, @NonNull int[] sessionResourceId) {
@@ -213,6 +233,20 @@ public class TunerResourceManagerService extends SystemService {
}
}
@Override
public void releaseDemux(int demuxHandle) {
if (DEBUG) {
Slog.d(TAG, "releaseDemux(demuxHandle=" + demuxHandle + ")");
}
}
@Override
public void releaseDescrambler(int descramblerHandle) {
if (DEBUG) {
Slog.d(TAG, "releaseDescrambler(descramblerHandle=" + descramblerHandle + ")");
}
}
@Override
public void releaseCasSession(int sessionResourceId) {
if (DEBUG) {