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
283f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang// Represents a color converted (RGB-based) video frame with bitmap
293f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang// pixels stored in FrameBuffer.
303f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang// In a VideoFrame struct stored in IMemory, frame data and ICC data
313f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang// come after the VideoFrame structure. Their locations can be retrieved
323f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang// by getFlattenedData() and getFlattenedIccData();
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass VideoFrame
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
36b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    // Construct a VideoFrame object with the specified parameters,
373f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang    // will calculate frame buffer size if |hasData| is set to true.
38b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    VideoFrame(uint32_t width, uint32_t height,
39b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang            uint32_t displayWidth, uint32_t displayHeight,
400c1407f79ef36422330c2003a608d37df714256bChong Zhang            uint32_t tileWidth, uint32_t tileHeight,
413f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang            uint32_t angle, uint32_t bpp, bool hasData, size_t iccSize):
42b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        mWidth(width), mHeight(height),
43b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        mDisplayWidth(displayWidth), mDisplayHeight(displayHeight),
440c1407f79ef36422330c2003a608d37df714256bChong Zhang        mTileWidth(tileWidth), mTileHeight(tileHeight),
45b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        mRotationAngle(angle), mBytesPerPixel(bpp), mRowBytes(bpp * width),
463f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang        mSize(hasData ? (bpp * width * height) : 0),
473f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang        mIccSize(iccSize), mReserved(0) {
48b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    }
49b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang
503f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang    void init(const VideoFrame& copy, const void* iccData, size_t iccSize) {
513f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang        *this = copy;
523f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang        if (mIccSize == iccSize && iccSize > 0 && iccData != NULL) {
533f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang            memcpy(getFlattenedIccData(), iccData, iccSize);
543f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang        } else {
553f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang            mIccSize = 0;
56b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        }
57b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    }
58b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang
59b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    // Calculate the flattened size to put it in IMemory
60b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    size_t getFlattenedSize() const {
61b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        return sizeof(VideoFrame) + mSize + mIccSize;
62b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    }
63b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang
64b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    // Get the pointer to the frame data in a flattened VideoFrame in IMemory
65b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint8_t* getFlattenedData() const {
66b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        return (uint8_t*)this + sizeof(VideoFrame);
67b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    }
68b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang
69b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    // Get the pointer to the ICC data in a flattened VideoFrame in IMemory
70b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint8_t* getFlattenedIccData() const {
71b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang        return (uint8_t*)this + sizeof(VideoFrame) + mSize;
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Intentional public access modifier:
75b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mWidth;           // Decoded image width before rotation
76b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mHeight;          // Decoded image height before rotation
77b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mDisplayWidth;    // Display width before rotation
78b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mDisplayHeight;   // Display height before rotation
790c1407f79ef36422330c2003a608d37df714256bChong Zhang    uint32_t mTileWidth;       // Tile width (0 if image doesn't have grid)
800c1407f79ef36422330c2003a608d37df714256bChong Zhang    uint32_t mTileHeight;      // Tile height (0 if image doesn't have grid)
81b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    int32_t  mRotationAngle;   // Rotation angle, clockwise, should be multiple of 90
82b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mBytesPerPixel;   // Number of bytes per pixel
83b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mRowBytes;        // Number of bytes per row before rotation
843f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang    uint32_t mSize;            // Number of bytes of frame data
853f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang    uint32_t mIccSize;         // Number of bytes of ICC data
86b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang    uint32_t mReserved;        // (padding to make mData 64-bit aligned)
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_VIDEO_FRAME_H
92