xref: /aosp_15_r20/frameworks/av/include/private/media/VideoFrame.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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