130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/*
230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project
330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License");
530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License.
630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at
730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *      http://www.apache.org/licenses/LICENSE-2.0
930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software
1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS,
1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and
1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License.
1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */
1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterfw.core;
1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.KeyValueMap;
2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.MutableFrameFormat;
2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.util.Arrays;
2421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport java.util.Map.Entry;
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
26a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/**
27a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide
28a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */
2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipublic class FrameFormat {
3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_UNSPECIFIED = 0;
3230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_BIT         = 1;
3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_BYTE        = 2;
3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_INT16       = 3;
3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_INT32       = 4;
3630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_FLOAT       = 5;
3730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_DOUBLE      = 6;
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_POINTER     = 7;
3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TYPE_OBJECT      = 8;
4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TARGET_UNSPECIFIED  = 0;
42bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn    public static final int TARGET_SIMPLE       = 1;
4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TARGET_NATIVE       = 2;
4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TARGET_GPU          = 3;
4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TARGET_VERTEXBUFFER = 4;
4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int TARGET_RS           = 5;
4730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int SIZE_UNSPECIFIED = 0;
4930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // TODO: When convenience formats are used, consider changing this to 0 and have the convenience
5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // intializers use a proper BPS.
5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public static final int BYTES_PER_SAMPLE_UNSPECIFIED = 1;
5330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected static final int SIZE_UNKNOWN = -1;
5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected int mBaseType = TYPE_UNSPECIFIED;
5730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected int mBytesPerSample = 1;
5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected int mSize = SIZE_UNKNOWN;
5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected int mTarget = TARGET_UNSPECIFIED;
6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected int[] mDimensions;
6130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected KeyValueMap mMetaData;
6230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected Class mObjectClass;
6330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected FrameFormat() {
6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public FrameFormat(int baseType, int target) {
6830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        mBaseType = baseType;
6930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        mTarget = target;
7030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        initDefaults();
7130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
7230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static FrameFormat unspecified() {
7421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        return new FrameFormat(TYPE_UNSPECIFIED, TARGET_UNSPECIFIED);
7521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
7621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
7730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getBaseType() {
7830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mBaseType;
7930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public boolean isBinaryDataType() {
8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mBaseType >= TYPE_BIT && mBaseType <= TYPE_DOUBLE;
8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getBytesPerSample() {
8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mBytesPerSample;
8730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public int getValuesPerSample() {
9021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        return mBytesPerSample / bytesPerSampleOf(mBaseType);
9121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
9221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getTarget() {
9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mTarget;
9530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int[] getDimensions() {
9830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mDimensions;
9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
10030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getDimension(int i) {
10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mDimensions[i];
10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getDimensionCount() {
10630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mDimensions == null ? 0 : mDimensions.length;
10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
10830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public boolean hasMetaKey(String key) {
110c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn        return mMetaData != null ? mMetaData.containsKey(key) : false;
11130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
11230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
11330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public boolean hasMetaKey(String key, Class expectedClass) {
114c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn        if (mMetaData != null && mMetaData.containsKey(key)) {
115c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn            if (!expectedClass.isAssignableFrom(mMetaData.get(key).getClass())) {
11630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                throw new RuntimeException(
11730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                    "FrameFormat meta-key '" + key + "' is of type " +
118c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn                    mMetaData.get(key).getClass() + " but expected to be of type " +
11930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                    expectedClass + "!");
12030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            }
12130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return true;
12230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
12330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return false;
12430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
12530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
12630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public Object getMetaValue(String key) {
127c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn        return mMetaData != null ? mMetaData.get(key) : null;
12830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
12930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getNumberOfDimensions() {
13130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mDimensions != null ? mDimensions.length : 0;
13230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
13330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getLength() {
13530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mDimensions != null && mDimensions.length >= 1) ? mDimensions[0] : -1;
13630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
13730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getWidth() {
13930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return getLength();
14030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
14130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
14230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getHeight() {
14330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mDimensions != null && mDimensions.length >= 2) ? mDimensions[1] : -1;
14430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
14530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
14630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getDepth() {
14730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mDimensions != null && mDimensions.length >= 3) ? mDimensions[2] : -1;
14830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
14930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
15030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getSize() {
15130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (mSize == SIZE_UNKNOWN) mSize = calcSize(mDimensions);
15230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mSize;
15330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
15430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
15530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public Class getObjectClass() {
15630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mObjectClass;
15730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
15830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
15930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public MutableFrameFormat mutableCopy() {
16030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        MutableFrameFormat result = new MutableFrameFormat();
16130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        result.setBaseType(getBaseType());
16230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        result.setTarget(getTarget());
16330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        result.setBytesPerSample(getBytesPerSample());
16430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        result.setDimensions(getDimensions());
16530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        result.setObjectClass(getObjectClass());
16621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        result.mMetaData = mMetaData == null ? null : (KeyValueMap)mMetaData.clone();
16730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return result;
16830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
16930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
17033d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
17130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public boolean equals(Object object) {
17230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (this == object) {
17330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return true;
17430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
17530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
17630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (!(object instanceof FrameFormat)) {
17730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return false;
17830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
17930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
18030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        FrameFormat format = (FrameFormat)object;
18130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return format.mBaseType == mBaseType &&
18230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                format.mTarget == mTarget &&
18330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                format.mBytesPerSample == mBytesPerSample &&
18430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                Arrays.equals(format.mDimensions, mDimensions) &&
18530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                format.mMetaData.equals(mMetaData);
18630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
18730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
18833d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
18930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int hashCode() {
19030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return 4211 ^ mBaseType ^ mBytesPerSample ^ getSize();
19130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
19230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
19330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public boolean isCompatibleWith(FrameFormat specification) {
19430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Check base type
19530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (specification.getBaseType() != TYPE_UNSPECIFIED
19630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            && getBaseType() != specification.getBaseType()) {
19730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return false;
19830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
19930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
20030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Check target
20130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (specification.getTarget() != TARGET_UNSPECIFIED
20230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            && getTarget() != specification.getTarget()) {
20330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return false;
20430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
20530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
20630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Check bytes per sample
20730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (specification.getBytesPerSample() != BYTES_PER_SAMPLE_UNSPECIFIED
20830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            && getBytesPerSample() != specification.getBytesPerSample()) {
20930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return false;
21030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
21130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
21230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Check number of dimensions
21330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (specification.getDimensionCount() > 0
21430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            && getDimensionCount() != specification.getDimensionCount()) {
21530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return false;
21630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
21730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
21830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Check dimensions
219a718cb84695939684101ceb70b05b4da1f96c63bEino-Ville Talvala        for (int i = 0; i < specification.getDimensionCount(); ++i) {
22030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            int specDim = specification.getDimension(i);
22130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            if (specDim != SIZE_UNSPECIFIED && getDimension(i) != specDim) {
22230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                return false;
22330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            }
22430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
22530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
22621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        // Check class
22721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        if (specification.getObjectClass() != null) {
22821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            if (getObjectClass() == null
22921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                || !specification.getObjectClass().isAssignableFrom(getObjectClass())) {
23021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                return false;
23121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            }
23221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        }
23321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
234b64fe6f6bbad306e4b10fafefcbdd981ec82a5baMarius Renn        // Check meta-data
235a4e8683367b9d4cfc4f8a6cbf3875fe2e35009f0Rodrigo Carceroni        if (specification.mMetaData != null) {
236a4e8683367b9d4cfc4f8a6cbf3875fe2e35009f0Rodrigo Carceroni            for (String specKey : specification.mMetaData.keySet()) {
237a4e8683367b9d4cfc4f8a6cbf3875fe2e35009f0Rodrigo Carceroni                if (mMetaData == null
238c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn                || !mMetaData.containsKey(specKey)
239c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn                || !mMetaData.get(specKey).equals(specification.mMetaData.get(specKey))) {
240a4e8683367b9d4cfc4f8a6cbf3875fe2e35009f0Rodrigo Carceroni                    return false;
241a4e8683367b9d4cfc4f8a6cbf3875fe2e35009f0Rodrigo Carceroni                }
242b64fe6f6bbad306e4b10fafefcbdd981ec82a5baMarius Renn            }
243b64fe6f6bbad306e4b10fafefcbdd981ec82a5baMarius Renn        }
244b64fe6f6bbad306e4b10fafefcbdd981ec82a5baMarius Renn
24530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Passed all the tests
24630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return true;
24730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
24830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
24921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public boolean mayBeCompatibleWith(FrameFormat specification) {
250489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check base type
251489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        if (specification.getBaseType() != TYPE_UNSPECIFIED
252489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getBaseType() != TYPE_UNSPECIFIED
253489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getBaseType() != specification.getBaseType()) {
254489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            return false;
255489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
256489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
257489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check target
258489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        if (specification.getTarget() != TARGET_UNSPECIFIED
259489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getTarget() != TARGET_UNSPECIFIED
260489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getTarget() != specification.getTarget()) {
261489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            return false;
262489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
263489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
264489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check bytes per sample
265489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        if (specification.getBytesPerSample() != BYTES_PER_SAMPLE_UNSPECIFIED
266489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getBytesPerSample() != BYTES_PER_SAMPLE_UNSPECIFIED
267489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getBytesPerSample() != specification.getBytesPerSample()) {
268489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            return false;
269489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
270489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
271489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check number of dimensions
272489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        if (specification.getDimensionCount() > 0
273489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getDimensionCount() > 0
274489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getDimensionCount() != specification.getDimensionCount()) {
275489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            return false;
276489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
277489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
278489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check dimensions
279489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        for (int i = 0; i < specification.getDimensionCount(); ++i) {
280489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            int specDim = specification.getDimension(i);
281489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            if (specDim != SIZE_UNSPECIFIED
282489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                && getDimension(i) != SIZE_UNSPECIFIED
283489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                && getDimension(i) != specDim) {
284489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                return false;
285489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            }
286489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
287489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
288489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check class
289489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        if (specification.getObjectClass() != null && getObjectClass() != null) {
290489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            if (!specification.getObjectClass().isAssignableFrom(getObjectClass())) {
291489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                return false;
292489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            }
293489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
294489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
295489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Check meta-data
296489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        if (specification.mMetaData != null && mMetaData != null) {
297489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            for (String specKey : specification.mMetaData.keySet()) {
298489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                if (mMetaData.containsKey(specKey)
299489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                    && !mMetaData.get(specKey).equals(specification.mMetaData.get(specKey))) {
300489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                    return false;
301489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn                }
302489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            }
303489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        }
304489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
305489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        // Passed all the tests
306489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        return true;
30721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
30821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
30921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static int bytesPerSampleOf(int baseType) {
31021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        // Defaults based on base-type
31121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        switch (baseType) {
31221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_BIT:
31321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_BYTE:
31421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                return 1;
31521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_INT16:
31621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                return 2;
31721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_INT32:
31821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_FLOAT:
31921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_POINTER:
32021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                return 4;
32121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_DOUBLE:
32221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                return 8;
32321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            default:
32421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                return 1;
32521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        }
32621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
32721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
32821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static String dimensionsToString(int[] dimensions) {
32921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        StringBuffer buffer = new StringBuffer();
33030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (dimensions != null) {
33130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            int n = dimensions.length;
33221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            for (int i = 0; i < n; ++i) {
33321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                if (dimensions[i] == SIZE_UNSPECIFIED) {
33421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                    buffer.append("[]");
33521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                } else {
33621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                    buffer.append("[" + String.valueOf(dimensions[i]) + "]");
33721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                }
33830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            }
33930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
34030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return buffer.toString();
34130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
34230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
34321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static String baseTypeToString(int baseType) {
34430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        switch (baseType) {
34530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_UNSPECIFIED: return "unspecified";
34630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_BIT:         return "bit";
34730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_BYTE:        return "byte";
34821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_INT16:       return "int";
34921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TYPE_INT32:       return "int";
35030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_FLOAT:       return "float";
35130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_DOUBLE:      return "double";
35230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_POINTER:     return "pointer";
35330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TYPE_OBJECT:      return "object";
35430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            default:               return "unknown";
35530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
35630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
35730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
35821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static String targetToString(int target) {
35930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        switch (target) {
36030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            case TARGET_UNSPECIFIED:  return "unspecified";
361bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn            case TARGET_SIMPLE:       return "simple";
36221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TARGET_NATIVE:       return "native";
36321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TARGET_GPU:          return "gpu";
36421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TARGET_VERTEXBUFFER: return "vbo";
36521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            case TARGET_RS:           return "renderscript";
36630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            default:                  return "unknown";
36730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
36830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
36930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
37021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static String metaDataToString(KeyValueMap metaData) {
37121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        if (metaData == null) {
37221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            return "";
37321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        } else {
37421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            StringBuffer buffer = new StringBuffer();
37521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            buffer.append("{ ");
37621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            for (Entry<String, Object> entry : metaData.entrySet()) {
37721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn                buffer.append(entry.getKey() + ": " + entry.getValue() + " ");
37821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            }
37921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            buffer.append("}");
38021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            return buffer.toString();
38121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        }
38221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
38321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
38421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    public static int readTargetString(String targetString) {
38521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        if (targetString.equalsIgnoreCase("CPU") || targetString.equalsIgnoreCase("NATIVE")) {
38621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            return FrameFormat.TARGET_NATIVE;
38721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        } else if (targetString.equalsIgnoreCase("GPU")) {
38821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            return FrameFormat.TARGET_GPU;
389bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn        } else if (targetString.equalsIgnoreCase("SIMPLE")) {
390bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn            return FrameFormat.TARGET_SIMPLE;
39121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        } else if (targetString.equalsIgnoreCase("VERTEXBUFFER")) {
39221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            return FrameFormat.TARGET_VERTEXBUFFER;
39321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        } else if (targetString.equalsIgnoreCase("UNSPECIFIED")) {
39421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            return FrameFormat.TARGET_UNSPECIFIED;
39521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        } else {
39621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            throw new RuntimeException("Unknown target type '" + targetString + "'!");
39721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        }
39821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
39921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
40021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    // TODO: FromString
40121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
40230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public String toString() {
40321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        int valuesPerSample = getValuesPerSample();
40421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        String sampleCountString = valuesPerSample == 1 ? "" : String.valueOf(valuesPerSample);
40521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        String targetString = mTarget == TARGET_UNSPECIFIED ? "" : (targetToString(mTarget) + " ");
406489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        String classString = mObjectClass == null
407489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            ? ""
408f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn            : (" class(" + mObjectClass.getSimpleName() + ") ");
409489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn
41021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        return targetString
41121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            + baseTypeToString(mBaseType)
41221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            + sampleCountString
41321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            + dimensionsToString(mDimensions)
414489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            + classString
41521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn            + metaDataToString(mMetaData);
41630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
41730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
41830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private void initDefaults() {
41921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        mBytesPerSample = bytesPerSampleOf(mBaseType);
42030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
42121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
42221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    // Core internal methods ///////////////////////////////////////////////////////////////////////
42330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    int calcSize(int[] dimensions) {
42430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (dimensions != null && dimensions.length > 0) {
42530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            int size = getBytesPerSample();
42630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            for (int dim : dimensions) {
42730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                size *= dim;
42830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            }
42930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            return size;
43030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
43130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return 0;
43230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
43330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
43430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    boolean isReplaceableBy(FrameFormat format) {
435489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn        return mTarget == format.mTarget
436489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && getSize() == format.getSize()
437489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn            && Arrays.equals(format.mDimensions, mDimensions);
43830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
43930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}
440