165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpackage android.filterfw.core;
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.KeyValueMap;
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.MutableFrameFormat;
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.util.Arrays;
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.util.Map.Entry;
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/**
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic class FrameFormat {
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_UNSPECIFIED = 0;
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_BIT         = 1;
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_BYTE        = 2;
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_INT16       = 3;
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_INT32       = 4;
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_FLOAT       = 5;
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_DOUBLE      = 6;
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_POINTER     = 7;
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TYPE_OBJECT      = 8;
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TARGET_UNSPECIFIED  = 0;
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TARGET_SIMPLE       = 1;
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TARGET_NATIVE       = 2;
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TARGET_GPU          = 3;
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TARGET_VERTEXBUFFER = 4;
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int TARGET_RS           = 5;
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int SIZE_UNSPECIFIED = 0;
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // TODO: When convenience formats are used, consider changing this to 0 and have the convenience
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // intializers use a proper BPS.
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static final int BYTES_PER_SAMPLE_UNSPECIFIED = 1;
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected static final int SIZE_UNKNOWN = -1;
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected int mBaseType = TYPE_UNSPECIFIED;
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected int mBytesPerSample = 1;
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected int mSize = SIZE_UNKNOWN;
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected int mTarget = TARGET_UNSPECIFIED;
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected int[] mDimensions;
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected KeyValueMap mMetaData;
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected Class mObjectClass;
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected FrameFormat() {
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public FrameFormat(int baseType, int target) {
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mBaseType = baseType;
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mTarget = target;
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        initDefaults();
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static FrameFormat unspecified() {
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new FrameFormat(TYPE_UNSPECIFIED, TARGET_UNSPECIFIED);
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getBaseType() {
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mBaseType;
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isBinaryDataType() {
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mBaseType >= TYPE_BIT && mBaseType <= TYPE_DOUBLE;
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getBytesPerSample() {
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mBytesPerSample;
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getValuesPerSample() {
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mBytesPerSample / bytesPerSampleOf(mBaseType);
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getTarget() {
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mTarget;
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int[] getDimensions() {
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mDimensions;
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getDimension(int i) {
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mDimensions[i];
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getDimensionCount() {
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mDimensions == null ? 0 : mDimensions.length;
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean hasMetaKey(String key) {
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mMetaData != null ? mMetaData.containsKey(key) : false;
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean hasMetaKey(String key, Class expectedClass) {
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mMetaData != null && mMetaData.containsKey(key)) {
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (!expectedClass.isAssignableFrom(mMetaData.get(key).getClass())) {
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                throw new RuntimeException(
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    "FrameFormat meta-key '" + key + "' is of type " +
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    mMetaData.get(key).getClass() + " but expected to be of type " +
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    expectedClass + "!");
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return true;
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return false;
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Object getMetaValue(String key) {
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mMetaData != null ? mMetaData.get(key) : null;
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getNumberOfDimensions() {
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mDimensions != null ? mDimensions.length : 0;
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getLength() {
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return (mDimensions != null && mDimensions.length >= 1) ? mDimensions[0] : -1;
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getWidth() {
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return getLength();
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getHeight() {
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return (mDimensions != null && mDimensions.length >= 2) ? mDimensions[1] : -1;
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getDepth() {
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return (mDimensions != null && mDimensions.length >= 3) ? mDimensions[2] : -1;
14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int getSize() {
15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mSize == SIZE_UNKNOWN) mSize = calcSize(mDimensions);
15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mSize;
15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Class getObjectClass() {
15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mObjectClass;
15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public MutableFrameFormat mutableCopy() {
16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        MutableFrameFormat result = new MutableFrameFormat();
16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        result.setBaseType(getBaseType());
16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        result.setTarget(getTarget());
16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        result.setBytesPerSample(getBytesPerSample());
16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        result.setDimensions(getDimensions());
16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        result.setObjectClass(getObjectClass());
16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        result.mMetaData = mMetaData == null ? null : (KeyValueMap)mMetaData.clone();
16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return result;
16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean equals(Object object) {
17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (this == object) {
17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return true;
17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (!(object instanceof FrameFormat)) {
17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        FrameFormat format = (FrameFormat)object;
18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return format.mBaseType == mBaseType &&
18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                format.mTarget == mTarget &&
18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                format.mBytesPerSample == mBytesPerSample &&
18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                Arrays.equals(format.mDimensions, mDimensions) &&
18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                format.mMetaData.equals(mMetaData);
18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public int hashCode() {
19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return 4211 ^ mBaseType ^ mBytesPerSample ^ getSize();
19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isCompatibleWith(FrameFormat specification) {
19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check base type
19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getBaseType() != TYPE_UNSPECIFIED
19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getBaseType() != specification.getBaseType()) {
19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check target
20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getTarget() != TARGET_UNSPECIFIED
20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getTarget() != specification.getTarget()) {
20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check bytes per sample
20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getBytesPerSample() != BYTES_PER_SAMPLE_UNSPECIFIED
20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getBytesPerSample() != specification.getBytesPerSample()) {
20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check number of dimensions
21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getDimensionCount() > 0
21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getDimensionCount() != specification.getDimensionCount()) {
21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check dimensions
21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        for (int i = 0; i < specification.getDimensionCount(); ++i) {
22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            int specDim = specification.getDimension(i);
22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (specDim != SIZE_UNSPECIFIED && getDimension(i) != specDim) {
22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return false;
22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check class
22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getObjectClass() != null) {
22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (getObjectClass() == null
22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                || !specification.getObjectClass().isAssignableFrom(getObjectClass())) {
23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return false;
23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check meta-data
23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.mMetaData != null) {
23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            for (String specKey : specification.mMetaData.keySet()) {
23765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                if (mMetaData == null
23865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                || !mMetaData.containsKey(specKey)
23965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                || !mMetaData.get(specKey).equals(specification.mMetaData.get(specKey))) {
24065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    return false;
24165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                }
24265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
24365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
24465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
24565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Passed all the tests
24665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return true;
24765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
24865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
24965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean mayBeCompatibleWith(FrameFormat specification) {
25065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check base type
25165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getBaseType() != TYPE_UNSPECIFIED
25265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getBaseType() != TYPE_UNSPECIFIED
25365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getBaseType() != specification.getBaseType()) {
25465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
25565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
25665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
25765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check target
25865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getTarget() != TARGET_UNSPECIFIED
25965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getTarget() != TARGET_UNSPECIFIED
26065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getTarget() != specification.getTarget()) {
26165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
26265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
26365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
26465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check bytes per sample
26565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getBytesPerSample() != BYTES_PER_SAMPLE_UNSPECIFIED
26665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getBytesPerSample() != BYTES_PER_SAMPLE_UNSPECIFIED
26765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getBytesPerSample() != specification.getBytesPerSample()) {
26865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
26965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
27065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
27165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check number of dimensions
27265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getDimensionCount() > 0
27365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getDimensionCount() > 0
27465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getDimensionCount() != specification.getDimensionCount()) {
27565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return false;
27665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
27765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
27865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check dimensions
27965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        for (int i = 0; i < specification.getDimensionCount(); ++i) {
28065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            int specDim = specification.getDimension(i);
28165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (specDim != SIZE_UNSPECIFIED
28265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                && getDimension(i) != SIZE_UNSPECIFIED
28365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                && getDimension(i) != specDim) {
28465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return false;
28565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
28665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
28765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
28865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check class
28965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.getObjectClass() != null && getObjectClass() != null) {
29065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            if (!specification.getObjectClass().isAssignableFrom(getObjectClass())) {
29165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return false;
29265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
29365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
29465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
29565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Check meta-data
29665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (specification.mMetaData != null && mMetaData != null) {
29765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            for (String specKey : specification.mMetaData.keySet()) {
29865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                if (mMetaData.containsKey(specKey)
29965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    && !mMetaData.get(specKey).equals(specification.mMetaData.get(specKey))) {
30065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    return false;
30165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                }
30265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
30365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
30465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
30565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Passed all the tests
30665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return true;
30765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
30865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
30965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static int bytesPerSampleOf(int baseType) {
31065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // Defaults based on base-type
31165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        switch (baseType) {
31265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_BIT:
31365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_BYTE:
31465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return 1;
31565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_INT16:
31665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return 2;
31765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_INT32:
31865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_FLOAT:
31965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_POINTER:
32065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return 4;
32165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_DOUBLE:
32265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return 8;
32365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            default:
32465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                return 1;
32565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
32665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
32765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
32865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static String dimensionsToString(int[] dimensions) {
32965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        StringBuffer buffer = new StringBuffer();
33065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (dimensions != null) {
33165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            int n = dimensions.length;
33265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            for (int i = 0; i < n; ++i) {
33365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                if (dimensions[i] == SIZE_UNSPECIFIED) {
33465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    buffer.append("[]");
33565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                } else {
33665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                    buffer.append("[" + String.valueOf(dimensions[i]) + "]");
33765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                }
33865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
33965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
34065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return buffer.toString();
34165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
34265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
34365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static String baseTypeToString(int baseType) {
34465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        switch (baseType) {
34565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_UNSPECIFIED: return "unspecified";
34665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_BIT:         return "bit";
34765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_BYTE:        return "byte";
34865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_INT16:       return "int";
34965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_INT32:       return "int";
35065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_FLOAT:       return "float";
35165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_DOUBLE:      return "double";
35265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_POINTER:     return "pointer";
35365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TYPE_OBJECT:      return "object";
35465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            default:               return "unknown";
35565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
35665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
35765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
35865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static String targetToString(int target) {
35965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        switch (target) {
36065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TARGET_UNSPECIFIED:  return "unspecified";
36165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TARGET_SIMPLE:       return "simple";
36265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TARGET_NATIVE:       return "native";
36365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TARGET_GPU:          return "gpu";
36465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TARGET_VERTEXBUFFER: return "vbo";
36565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            case TARGET_RS:           return "renderscript";
36665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            default:                  return "unknown";
36765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
36865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
36965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
37065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static String metaDataToString(KeyValueMap metaData) {
37165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (metaData == null) {
37265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return "";
37365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        } else {
37465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            StringBuffer buffer = new StringBuffer();
37565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            buffer.append("{ ");
37665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            for (Entry<String, Object> entry : metaData.entrySet()) {
37765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                buffer.append(entry.getKey() + ": " + entry.getValue() + " ");
37865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
37965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            buffer.append("}");
38065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return buffer.toString();
38165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
38265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
38365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
38465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static int readTargetString(String targetString) {
38565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (targetString.equalsIgnoreCase("CPU") || targetString.equalsIgnoreCase("NATIVE")) {
38665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return FrameFormat.TARGET_NATIVE;
38765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        } else if (targetString.equalsIgnoreCase("GPU")) {
38865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return FrameFormat.TARGET_GPU;
38965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        } else if (targetString.equalsIgnoreCase("SIMPLE")) {
39065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return FrameFormat.TARGET_SIMPLE;
39165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        } else if (targetString.equalsIgnoreCase("VERTEXBUFFER")) {
39265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return FrameFormat.TARGET_VERTEXBUFFER;
39365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        } else if (targetString.equalsIgnoreCase("UNSPECIFIED")) {
39465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return FrameFormat.TARGET_UNSPECIFIED;
39565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        } else {
39665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException("Unknown target type '" + targetString + "'!");
39765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
39865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
39965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
40065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // TODO: FromString
40165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
40265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public String toString() {
40365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        int valuesPerSample = getValuesPerSample();
40465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        String sampleCountString = valuesPerSample == 1 ? "" : String.valueOf(valuesPerSample);
40565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        String targetString = mTarget == TARGET_UNSPECIFIED ? "" : (targetToString(mTarget) + " ");
40665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        String classString = mObjectClass == null
40765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            ? ""
40865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            : (" class(" + mObjectClass.getSimpleName() + ") ");
40965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
41065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return targetString
41165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            + baseTypeToString(mBaseType)
41265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            + sampleCountString
41365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            + dimensionsToString(mDimensions)
41465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            + classString
41565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            + metaDataToString(mMetaData);
41665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
41765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
41865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    private void initDefaults() {
41965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mBytesPerSample = bytesPerSampleOf(mBaseType);
42065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
42165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
42265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Core internal methods ///////////////////////////////////////////////////////////////////////
42365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int calcSize(int[] dimensions) {
42465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (dimensions != null && dimensions.length > 0) {
42565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            int size = getBytesPerSample();
42665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            for (int dim : dimensions) {
42765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                size *= dim;
42865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            }
42965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            return size;
43065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
43165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return 0;
43265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
43365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
43465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    boolean isReplaceableBy(FrameFormat format) {
43565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mTarget == format.mTarget
43665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && getSize() == format.getSize()
43765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            && Arrays.equals(format.mDimensions, mDimensions);
43865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
43965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
440