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

Commit f43984e2 authored by Haofan Wang's avatar Haofan Wang Committed by Android (Google) Code Review
Browse files

Merge "Add get vendor parameter capability in Media Quality" into main

parents d92aa00c 4ec99a4b
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;
@@ -1053,10 +1054,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) {
@@ -1072,6 +1108,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;