VideoFrame.h revision 3f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327
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 26namespace 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(); 33class VideoFrame 34{ 35public: 36 // Construct a VideoFrame object with the specified parameters, 37 // will calculate frame buffer size if |hasData| is set to true. 38 VideoFrame(uint32_t width, uint32_t height, 39 uint32_t displayWidth, uint32_t displayHeight, 40 uint32_t angle, uint32_t bpp, bool hasData, size_t iccSize): 41 mWidth(width), mHeight(height), 42 mDisplayWidth(displayWidth), mDisplayHeight(displayHeight), 43 mRotationAngle(angle), mBytesPerPixel(bpp), mRowBytes(bpp * width), 44 mSize(hasData ? (bpp * width * height) : 0), 45 mIccSize(iccSize), mReserved(0) { 46 } 47 48 void init(const VideoFrame& copy, const void* iccData, size_t iccSize) { 49 *this = copy; 50 if (mIccSize == iccSize && iccSize > 0 && iccData != NULL) { 51 memcpy(getFlattenedIccData(), iccData, iccSize); 52 } else { 53 mIccSize = 0; 54 } 55 } 56 57 // Calculate the flattened size to put it in IMemory 58 size_t getFlattenedSize() const { 59 return sizeof(VideoFrame) + mSize + mIccSize; 60 } 61 62 // Get the pointer to the frame data in a flattened VideoFrame in IMemory 63 uint8_t* getFlattenedData() const { 64 return (uint8_t*)this + sizeof(VideoFrame); 65 } 66 67 // Get the pointer to the ICC data in a flattened VideoFrame in IMemory 68 uint8_t* getFlattenedIccData() const { 69 return (uint8_t*)this + sizeof(VideoFrame) + mSize; 70 } 71 72 // Intentional public access modifier: 73 uint32_t mWidth; // Decoded image width before rotation 74 uint32_t mHeight; // Decoded image height before rotation 75 uint32_t mDisplayWidth; // Display width before rotation 76 uint32_t mDisplayHeight; // Display height before rotation 77 int32_t mRotationAngle; // Rotation angle, clockwise, should be multiple of 90 78 uint32_t mBytesPerPixel; // Number of bytes per pixel 79 uint32_t mRowBytes; // Number of bytes per row before rotation 80 uint32_t mSize; // Number of bytes of frame data 81 uint32_t mIccSize; // Number of bytes of ICC data 82 uint32_t mReserved; // (padding to make mData 64-bit aligned) 83}; 84 85}; // namespace android 86 87#endif // ANDROID_VIDEO_FRAME_H 88