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
17e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala#ifndef ANDROID_FILTERFW_CORE_NATIVE_FRAME_H
18e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala#define ANDROID_FILTERFW_CORE_NATIVE_FRAME_H
1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni#include "base/utilities.h"
2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroninamespace android {
2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroninamespace filterfw {
2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni// A NativeFrame stores data in a memory buffer (on the heap). It is used for
2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni// data processing on the CPU.
2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniclass NativeFrame {
2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni  public:
2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Create an empty native frame.
3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    NativeFrame(int size);
3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    ~NativeFrame();
3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Set the frame data and size in bytes. The NativeFrame object takes ownership of the data.
3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // To copy data into an existing frame, use WriteData().
36e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala    bool SetData(uint8_t* data, int size);
3730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Write the specified data of the given size to the frame at the specified offset. The
3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // receiver must be large enough to hold the data.
40e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala    bool WriteData(const uint8_t* data, int offset, int size);
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Returns a pointer to the data, or NULL if no data was set.
43e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala    const uint8_t* Data() const {
4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni      return data_;
4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Returns a non-const pointer to the data, or NULL if no data was set.
48e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala    uint8_t* MutableData() {
4930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni      return data_;
5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Resize the frame. You can only resize to a size that fits within the frame's capacity.
5330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Returns true if the resize was successful.
5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    bool Resize(int newSize);
5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Returns the size of the frame in bytes.
5730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    int Size() {
5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni      return size_;
5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Returns the capacity of the frame in bytes.
6230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    int Capacity() {
6330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni      return capacity_;
6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Returns a new native frame
6730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    NativeFrame* Clone() const;
6830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni  private:
7030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Pointer to the data. Owned by the frame.
71e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala    uint8_t* data_;
7230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Size of data buffer in bytes.
7430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    int size_;
7530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    // Capacity of data buffer in bytes.
7730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    int capacity_;
7830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    DISALLOW_COPY_AND_ASSIGN(NativeFrame);
8030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni};
8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} // namespace filterfw
8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} // namespace android
8430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
85e9912de34684f1b8deaf36bcf77686152d33765dEino-Ville Talvala#endif  // ANDROID_FILTERFW_CORE_NATIVE_FRAME_H
86