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
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// A simple buffer to hold binary data
29e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kastenclass MediaAlbumArt
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MediaAlbumArt(): mSize(0), mData(0) {}
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    explicit MediaAlbumArt(const char* url) {
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSize = 0;
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mData = NULL;
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        FILE *in = fopen(url, "r");
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (!in) {
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        fseek(in, 0, SEEK_END);
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSize = ftell(in);  // Allocating buffer of size equals to the external file size.
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSize == 0 || (mData = new uint8_t[mSize]) == NULL) {
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            fclose(in);
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mSize != 0) {
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                mSize = 0;
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        rewind(in);
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (fread(mData, 1, mSize, in) != mSize) {  // Read failed.
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            delete[] mData;
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mData = NULL;
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSize = 0;
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return;
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        fclose(in);
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
60e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    MediaAlbumArt(const MediaAlbumArt& copy) {
61e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        mSize = copy.mSize;
62e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        mData = NULL;  // initialize it first
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSize > 0 && copy.mData != NULL) {
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project           mData = new uint8_t[copy.mSize];
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project           if (mData != NULL) {
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project               memcpy(mData, copy.mData, mSize);
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project           } else {
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project               mSize = 0;
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project           }
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ~MediaAlbumArt() {
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mData != 0) {
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            delete[] mData;
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Intentional public access modifier:
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // We have to know the internal structure in order to share it between
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // processes?
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mSize;            // Number of bytes in mData
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint8_t* mData;            // Actual binary data
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Represents a color converted (RGB-based) video frame
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// with bitmap pixels stored in FrameBuffer
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass VideoFrame
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
9137007147edde731cd3dc74febd7bb7e093a35020Christer Fletcher    VideoFrame(): mWidth(0), mHeight(0), mDisplayWidth(0), mDisplayHeight(0), mSize(0), mData(0),
9237007147edde731cd3dc74febd7bb7e093a35020Christer Fletcher            mRotationAngle(0) {}
93e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VideoFrame(const VideoFrame& copy) {
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mWidth = copy.mWidth;
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mHeight = copy.mHeight;
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mDisplayWidth = copy.mDisplayWidth;
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mDisplayHeight = copy.mDisplayHeight;
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSize = copy.mSize;
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mData = NULL;  // initialize it first
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSize > 0 && copy.mData != NULL) {
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mData = new uint8_t[mSize];
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mData != NULL) {
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                memcpy(mData, copy.mData, mSize);
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                mSize = 0;
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
10937007147edde731cd3dc74febd7bb7e093a35020Christer Fletcher        mRotationAngle = copy.mRotationAngle;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ~VideoFrame() {
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mData != 0) {
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            delete[] mData;
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Intentional public access modifier:
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mWidth;
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mHeight;
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mDisplayWidth;
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mDisplayHeight;
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t mSize;            // Number of bytes in mData
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint8_t* mData;            // Actual binary data
125ce0febae177d1816ee7a6750ed9fba52472b9a71James Dong    int32_t  mRotationAngle;   // rotation angle, clockwise
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_VIDEO_FRAME_H
131