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