19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef ANDROID_VE_TOOLS_H
189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define ANDROID_VE_TOOLS_H
199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4OSA_Types.h"
219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4OSA_Memory.h"
229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4OSA_Debug.h"
239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4VIFI_FiltersAPI.h"
249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* Macro definitions */
259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4VIFI_Defines.h"
269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* Clip table declaration */
279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4VIFI_Clip.h"
289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4VFL_transition.h"
299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4VSS3GPP_API.h"
309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4xVSS_API.h"
319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4xVSS_Internal.h"
329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4AIR_API.h"
339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "PreviewRenderer.h"
349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
358806b706693c0992724f6603353af18aeb4a0f80Hong Teng#define MEDIA_RENDERING_INVALID 255
369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define TRANSPARENT_COLOR 0x7E0
379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LUM_FACTOR_MAX 10
389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changenum {
399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_NONE               = 0,
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_BLACKANDWHITE      = 1,
419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_PINK               = 2,
429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_GREEN              = 4,
439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_SEPIA              = 8,
449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_NEGATIVE           = 16,
459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_FRAMING            = 32,
469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_FIFTIES            = 64,
479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_COLOR_RGB16        = 128,
489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_GRADIENT           = 256,
499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_FADEFROMBLACK      = 512,
509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VIDEO_EFFECT_FADETOBLACK        = 2048,
519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang};
529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changtypedef struct {
549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *vidBuffer;
559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 videoWidth;
569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 videoHeight;
579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 timeMs;
589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 timeOffset; //has the duration of clips played.
599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                             //The flag shall be used for Framing.
609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VSS3GPP_EffectSettings* effectsSettings;
619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 numberEffects;
629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 outVideoWidth;
639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 outVideoHeight;
649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 currentVideoEffect;
659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Bool isFiftiesEffectStarted;
669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_MediaRendering renderingMode;
679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint8_t *pOutBuffer;
689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    size_t outBufferStride;
699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8*  overlayFrameRGBBuffer;
709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8*  overlayFrameYUVBuffer;
719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} vePostProcessParams;
729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_YUV420PlanarToYUV420Semiplanar(void *user_data, M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane *PlaneOut );
749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_SemiplanarYUV420toYUV420(void *user_data, M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane *PlaneOut );
759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext, M4VIFI_ImagePlane *PlaneIn,
779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                                                    M4VIFI_ImagePlane *PlaneOut,M4VSS3GPP_ExternalProgress *pProgress, M4OSA_UInt32 uiEffectKind);
789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4VSS3GPP_externalVideoEffectFraming( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn[3], M4VIFI_ImagePlane *PlaneOut, M4VSS3GPP_ExternalProgress *pProgress, M4OSA_UInt32 uiEffectKind );
809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4VSS3GPP_externalVideoEffectFifties( M4OSA_Void *pUserData, M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut, M4VSS3GPP_ExternalProgress *pProgress, M4OSA_UInt32 uiEffectKind );
829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changunsigned char M4VFL_modifyLumaWithScale(M4ViComImagePlane *plane_in, M4ViComImagePlane *plane_out, unsigned long lum_factor, void *user_data);
849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx);
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8    M4VIFI_xVSS_RGB565toYUV420(void *pUserData, M4VIFI_ImagePlane *pPlaneIn,
879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                                                      M4VIFI_ImagePlane *pPlaneOut);
889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4xVSS_internalConvertRGB888toYUV(M4xVSS_FramingStruct* framingCtx);
909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_RGB888toYUV420(void *pUserData, M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane PlaneOut[3]);
919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*+ Handle the image files here */
939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR LvGetImageThumbNail(const char *fileName, M4OSA_UInt32 height, M4OSA_UInt32 width, M4OSA_Void **pBuffer);
949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*- Handle the image files here */
959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyRenderingMode(M4VIFI_ImagePlane* pPlaneIn, M4VIFI_ImagePlane* pPlaneOut, M4xVSS_MediaRendering mediaRendering);
979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_YUV420toYUV420(void *user_data, M4VIFI_ImagePlane PlaneIn[3], M4VIFI_ImagePlane *PlaneOut );
1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8    M4VIFI_ResizeBilinearYUV420toYUV420(void *pUserData,
1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                                                                M4VIFI_ImagePlane *pPlaneIn,
1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                                                                M4VIFI_ImagePlane *pPlaneOut);
1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void prepareYUV420ImagePlane(M4VIFI_ImagePlane *plane,
1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 width, M4OSA_UInt32 height, M4VIFI_UInt8 *buffer,
1069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 reportedWidth, M4OSA_UInt32 reportedHeight);
1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void prepareYV12ImagePlane(M4VIFI_ImagePlane *plane,
1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 width, M4OSA_UInt32 height, M4OSA_UInt32 stride, M4VIFI_UInt8 *buffer);
1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void swapImagePlanes(
1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_ImagePlane *planeIn, M4VIFI_ImagePlane *planeOut,
1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *buffer1, M4VIFI_UInt8 *buffer2);
1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void computePercentageDone(
1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     M4OSA_UInt32 ctsMs, M4OSA_UInt32 effectStartTimeMs,
1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     M4OSA_UInt32 effectDuration, M4OSA_Double *percentageDone);
1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void computeProgressForVideoEffect(
1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     M4OSA_UInt32 ctsMs, M4OSA_UInt32 effectStartTimeMs,
1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     M4OSA_UInt32 effectDuration, M4VSS3GPP_ExternalProgress* extProgress);
1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR prepareFramingStructure(
1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_FramingStruct* framingCtx,
1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VSS3GPP_EffectSettings* effectsSettings, M4OSA_UInt32 index,
1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8* overlayRGB, M4VIFI_UInt8* overlayYUV);
1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyColorEffect(M4xVSS_VideoEffectType colorEffect,
1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_ImagePlane *planeIn, M4VIFI_ImagePlane *planeOut,
1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *buffer1, M4VIFI_UInt8 *buffer2, M4OSA_UInt16 rgbColorData);
1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyLumaEffect(M4VSS3GPP_VideoEffectType videoEffect,
1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_ImagePlane *planeIn, M4VIFI_ImagePlane *planeOut,
1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *buffer1, M4VIFI_UInt8 *buffer2, M4OSA_Int32 lum_factor);
1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyEffectsAndRenderingMode(vePostProcessParams *params,
1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 reportedWidth, M4OSA_UInt32 reportedHeight);
1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1398806b706693c0992724f6603353af18aeb4a0f80Hong Tengandroid::status_t getVideoSizeByResolution(M4VIDEOEDITING_VideoFrameSize resolution,
1408806b706693c0992724f6603353af18aeb4a0f80Hong Teng    uint32_t *pWidth, uint32_t *pHeight);
1418806b706693c0992724f6603353af18aeb4a0f80Hong Teng
142e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4VIFI_UInt8 M4VIFI_Rotate90LeftYUV420toYUV420(void* pUserData,
143e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut);
144e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury
145e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4VIFI_UInt8 M4VIFI_Rotate90RightYUV420toYUV420(void* pUserData,
146e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut);
147e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury
148e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4VIFI_UInt8 M4VIFI_Rotate180YUV420toYUV420(void* pUserData,
149e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut);
150e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury
151e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4OSA_ERR applyVideoRotation(M4OSA_Void* pBuffer,
152e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    M4OSA_UInt32 width, M4OSA_UInt32 height, M4OSA_UInt32 rotation);
1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif // ANDROID_VE_TOOLS_H
154