189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright (C) 2008 The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef ANDROID_VIDEO_FRAME_H
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define ANDROID_VIDEO_FRAME_H
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdio.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdlib.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Represents a color converted (RGB-based) video frame
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// with bitmap pixels stored in FrameBuffer
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass VideoFrame
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
3310db45259545989a80fae0cd6fd6a252f3c9924aChrister Fletcher    VideoFrame(): mWidth(0), mHeight(0), mDisplayWidth(0), mDisplayHeight(0), mSize(0), mData(0),
3410db45259545989a80fae0cd6fd6a252f3c9924aChrister Fletcher            mRotationAngle(0) {}
35e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VideoFrame(const VideoFrame& copy) {
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mWidth = copy.mWidth;
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mHeight = copy.mHeight;
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mDisplayWidth = copy.mDisplayWidth;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mDisplayHeight = copy.mDisplayHeight;
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSize = copy.mSize;
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mData = NULL;  // initialize it first
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSize > 0 && copy.mData != NULL) {
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mData = new uint8_t[mSize];
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mData != NULL) {
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                memcpy(mData, copy.mData, mSize);
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                mSize = 0;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
5110db45259545989a80fae0cd6fd6a252f3c9924aChrister Fletcher        mRotationAngle = copy.mRotationAngle;
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ~VideoFrame() {
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mData != 0) {
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            delete[] mData;
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Intentional public access modifier:
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mWidth;
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mHeight;
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mDisplayWidth;
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mDisplayHeight;
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mSize;            // Number of bytes in mData
6604906863a1fa7f296ac11f07e62aa688da39c3adMarco Nelissen    int32_t  mRotationAngle;   // rotation angle, clockwise, should be multiple of 90
6704906863a1fa7f296ac11f07e62aa688da39c3adMarco Nelissen    // mData should be 64 bit aligned to prevent additional padding
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint8_t* mData;            // Actual binary data
6904906863a1fa7f296ac11f07e62aa688da39c3adMarco Nelissen    // pad structure so it's the same size on 64 bit and 32 bit
7004906863a1fa7f296ac11f07e62aa688da39c3adMarco Nelissen    char     mPadding[8 - sizeof(mData)];
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_VIDEO_FRAME_H
76