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

Commit 4ec99a4b authored by Haofan Wang's avatar Haofan Wang
Browse files

Add get vendor parameter capability in Media Quality

Currently the media quality framework doesn't support to get the vendor
parameter capability. Added the implementation for getting vendor parameter
capability.

Bug: 407132368
Test: atest CtsMediaQualityTestCases
Flag: EXEMPT bugfix

Change-Id: Ie56fa970fa9b3cf8f18a6eae3c83f5daa1598d3f
parent dd1af35e
Loading
Loading
Loading
Loading
+59 −2
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.hardware.tv.mediaquality.SoundParameter;
import android.hardware.tv.mediaquality.SoundParameters;
import android.hardware.tv.mediaquality.StreamStatus;
import android.hardware.tv.mediaquality.VendorParamCapability;
import android.hardware.tv.mediaquality.VendorParameterIdentifier;
import android.media.quality.ActiveProcessingPicture;
import android.media.quality.AmbientBacklightEvent;
import android.media.quality.AmbientBacklightMetadata;
@@ -1028,10 +1029,45 @@ public class MediaQualityService extends SystemService {
                Slog.e(TAG, "Failed to get parameter capabilities", e);
            }

            return getListParameterCapability(caps);
            //Handle vendor parameter capability.
            MediaQualityUtils.getVendorParamsByRemovePreDefineParams(names);
            int namesCount = names.size();
            VendorParamCapability[] vendorParamCapabilities =
                    new VendorParamCapability[namesCount];
            if (!names.isEmpty()) {
                List<VendorParameterIdentifier> vendorParamIdentifiersList = new ArrayList<>();
                for (String name: names){
                    DefaultExtension vendorParamCapDefaultExtension = new DefaultExtension();
                    Parcel vendorParamCapParcel = Parcel.obtain();
                    vendorParamCapParcel.writeString(name);
                    vendorParamCapDefaultExtension.bytes = vendorParamCapParcel.marshall();

                    VendorParameterIdentifier vendorParamIdentifier =
                            new VendorParameterIdentifier();
                    vendorParamIdentifier.identifier.setParcelable(vendorParamCapDefaultExtension);
                    vendorParamIdentifiersList.add(vendorParamIdentifier);
                    vendorParamCapParcel.recycle();
                }

                VendorParameterIdentifier[] vendorParamIdentifierArray =
                        new VendorParameterIdentifier[namesCount];
                for (int i = 0; i < namesCount; i++) {
                    vendorParamIdentifierArray[i] = vendorParamIdentifiersList.get(i);
                }

                try {
                    mMediaQuality.getVendorParamCaps(
                            vendorParamIdentifierArray, vendorParamCapabilities);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Failed to get vendor parameter capabilities", e);
                }
            }

            return getParameterCapabilityList(caps, vendorParamCapabilities);
        }

        private List<ParameterCapability> getListParameterCapability(ParamCapability[] caps) {
        private List<ParameterCapability> getParameterCapabilityList(
                ParamCapability[] caps, VendorParamCapability[] vendorParamCaps) {
            List<ParameterCapability> pcList = new ArrayList<>();

            if (caps != null) {
@@ -1047,6 +1083,27 @@ public class MediaQualityService extends SystemService {
                }
            }

            if (vendorParamCaps != null) {
                for (VendorParamCapability vpcHal : vendorParamCaps) {
                    if (vpcHal != null) {
                        String name = MediaQualityUtils.getVendorParameterName(vpcHal);
                        boolean isSupported = vpcHal.isSupported;
                        // The default value for VendorParamCapability in HAL is IntValue = 0,
                        // LongValue = 1, DoubleValue = 2, StringValue = 3. The default value for
                        // ParameterCapability in the framework is None = 0, IntValue = 1,
                        // LongValue = 2, DoubleValue = 3, StringValue = 4. So +1 here to map the
                        // default value in HAL with framework.
                        int type = vpcHal.defaultValue
                                == null ? 0 : vpcHal.defaultValue.getTag() + 1;
                        Bundle paramRangeBundle = MediaQualityUtils.convertToCaps(
                                type, vpcHal.range);
                        MediaQualityUtils.convertToVendorCaps(vpcHal, paramRangeBundle);
                        pcList.add(new ParameterCapability(
                                name, isSupported, type, paramRangeBundle));
                    }
                }
            }

            return pcList;
        }

+42 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.media.quality;

import android.content.ContentValues;
import android.database.Cursor;
import android.hardware.audio.effect.DefaultExtension;
import android.hardware.tv.mediaquality.ColorRange;
import android.hardware.tv.mediaquality.ColorSpace;
import android.hardware.tv.mediaquality.ColorTemperature;
@@ -31,6 +32,7 @@ import android.hardware.tv.mediaquality.PictureParameter;
import android.hardware.tv.mediaquality.PictureQualityEventType;
import android.hardware.tv.mediaquality.QualityLevel;
import android.hardware.tv.mediaquality.SoundParameter;
import android.hardware.tv.mediaquality.VendorParamCapability;
import android.media.quality.MediaQualityContract;
import android.media.quality.MediaQualityContract.BaseParameters;
import android.media.quality.MediaQualityContract.PictureQuality;
@@ -41,6 +43,7 @@ import android.media.quality.PictureProfileHandle;
import android.media.quality.SoundProfile;
import android.media.quality.SoundProfileHandle;
import android.os.Bundle;
import android.os.Parcel;
import android.os.PersistableBundle;
import android.util.Log;

@@ -54,6 +57,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;

@@ -1764,7 +1768,7 @@ public final class MediaQualityUtils {
        return byteArray;
    }

    public void getVendorParamsByRemovePreDefineParams(List<String> names) {
    public static void getVendorParamsByRemovePreDefineParams(List<String> names) {
        if (names == null) {
            return;
        }
@@ -1948,6 +1952,21 @@ public final class MediaQualityUtils {
        return parameterNameMap.get(pn);
    }

    /**
     * Get vendor parameter name.
     */
    public static String getVendorParameterName(VendorParamCapability vpcHal) {
        byte[] vendorParamCapByteArray = Objects.requireNonNull(
                vpcHal.identifier.identifier.getParcelable(DefaultExtension.class)).bytes;
        Parcel vendorParamNameParcel = Parcel.obtain();
        vendorParamNameParcel.unmarshall(
                vendorParamCapByteArray, 0, vendorParamCapByteArray.length);
        vendorParamNameParcel.setDataPosition(0);
        String name = vendorParamNameParcel.readString();
        vendorParamNameParcel.recycle();
        return name;
    }

    /**
     * Convert ParameterRange to a Bundle.
     */
@@ -1972,6 +1991,28 @@ public final class MediaQualityUtils {
        return bundle;
    }

    /**
     * Retrieve the vendor parameter capability from the HAL and stores in the bundle.
     * @param vpcHal vendor param capability from the HAL. Contains information about the param
     *               Identifier, is supported, default value and range.
     * @param paramRangeBundle bundle that will contains vendor param defined values.
     */
    public static void convertToVendorCaps(VendorParamCapability vpcHal, Bundle paramRangeBundle) {
        byte[] vendorParamCapRangeByteArray = Objects.requireNonNull(
                vpcHal.range.vendorDefinedValues.getParcelable(
                        DefaultExtension.class)).bytes;
        Parcel vendorParamCapRangeParcel = Parcel.obtain();
        vendorParamCapRangeParcel.unmarshall(
                vendorParamCapRangeByteArray, 0, vendorParamCapRangeByteArray.length);
        vendorParamCapRangeParcel.setDataPosition(0);
        int vendorDefinedValuesSize = vendorParamCapRangeParcel.readInt();
        vendorParamCapRangeParcel.setDataPosition(0);
        String[] vendorDefinedValues = new String[vendorDefinedValuesSize];
        vendorParamCapRangeParcel.readStringArray(vendorDefinedValues);
        paramRangeBundle.putStringArray(ParameterCapability.CAPABILITY_ENUM, vendorDefinedValues);
        vendorParamCapRangeParcel.recycle();
    }

    private static String getTempId(BiMap<Long, String> map, Cursor cursor) {
        int colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_ID);
        Long dbId = colIndex != -1 ? cursor.getLong(colIndex) : null;