1 /* 2 ** 3 ** Copyright (C) 2008 The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #ifndef ANDROID_VIDEO_FRAME_H 19 #define ANDROID_VIDEO_FRAME_H 20 21 #include <stdint.h> 22 #include <stdio.h> 23 #include <stdlib.h> 24 #include <utils/Log.h> 25 26 namespace android { 27 28 // Represents a color converted (RGB-based) video frame with bitmap 29 // pixels stored in FrameBuffer. 30 // In a VideoFrame struct stored in IMemory, frame data and ICC data 31 // come after the VideoFrame structure. Their locations can be retrieved 32 // by getFlattenedData() and getFlattenedIccData(); 33 class VideoFrame 34 { 35 public: 36 // Construct a VideoFrame object with the specified parameters, 37 // will calculate frame buffer size if |hasData| is set to true. VideoFrame(uint32_t width,uint32_t height,uint32_t displayWidth,uint32_t displayHeight,uint32_t tileWidth,uint32_t tileHeight,uint32_t angle,uint32_t bpp,bool hasData,size_t iccSize)38 VideoFrame(uint32_t width, uint32_t height, 39 uint32_t displayWidth, uint32_t displayHeight, 40 uint32_t tileWidth, uint32_t tileHeight, 41 uint32_t angle, uint32_t bpp, bool hasData, size_t iccSize): 42 mWidth(width), mHeight(height), 43 mDisplayWidth(displayWidth), mDisplayHeight(displayHeight), 44 mTileWidth(tileWidth), mTileHeight(tileHeight), mDurationUs(0), 45 mRotationAngle(angle), mBytesPerPixel(bpp), mRowBytes(bpp * width), 46 mSize(hasData ? (bpp * width * height) : 0), 47 mIccSize(iccSize), mReserved(0) { 48 } 49 init(const VideoFrame & copy,const void * iccData,size_t iccSize)50 void init(const VideoFrame& copy, const void* iccData, size_t iccSize) { 51 *this = copy; 52 if (mIccSize == iccSize && iccSize > 0 && iccData != NULL) { 53 memcpy(getFlattenedIccData(), iccData, iccSize); 54 } else { 55 mIccSize = 0; 56 } 57 } 58 59 // Calculate the flattened size to put it in IMemory getFlattenedSize()60 size_t getFlattenedSize() const { 61 return sizeof(VideoFrame) + mSize + mIccSize; 62 } 63 64 // Get the pointer to the frame data in a flattened VideoFrame in IMemory getFlattenedData()65 uint8_t* getFlattenedData() const { 66 return (uint8_t*)this + sizeof(VideoFrame); 67 } 68 69 // Get the pointer to the ICC data in a flattened VideoFrame in IMemory getFlattenedIccData()70 uint8_t* getFlattenedIccData() const { 71 return (uint8_t*)this + sizeof(VideoFrame) + mSize; 72 } 73 74 // Intentional public access modifier: 75 uint32_t mWidth; // Decoded image width before rotation 76 uint32_t mHeight; // Decoded image height before rotation 77 uint32_t mDisplayWidth; // Display width before rotation 78 uint32_t mDisplayHeight; // Display height before rotation 79 uint32_t mTileWidth; // Tile width (0 if image doesn't have grid) 80 uint32_t mTileHeight; // Tile height (0 if image doesn't have grid) 81 int64_t mDurationUs; // Frame duration in microseconds 82 int32_t mRotationAngle; // Rotation angle, clockwise, should be multiple of 90 83 uint32_t mBytesPerPixel; // Number of bytes per pixel 84 uint32_t mRowBytes; // Number of bytes per row before rotation 85 uint32_t mSize; // Number of bytes of frame data 86 uint32_t mIccSize; // Number of bytes of ICC data 87 uint32_t mReserved; // (padding to make mData 64-bit aligned) 88 }; 89 90 }; // namespace android 91 92 #endif // ANDROID_VIDEO_FRAME_H 93