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