1// 2// Copyright (C) 2011 The Android Open Source Project 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16 17// Imports --------------------------------------------------- 18@import android.filterpacks.videosrc; 19@import android.filterpacks.videosink; 20@import android.filterpacks.ui; 21@import android.filterpacks.base; 22@import android.filterpacks.imageproc; 23 24@import com.google.android.filterpacks.facedetect; 25 26@setting autoBranch = "synced"; 27 28// Externals ------------------------------------------------- 29 30@external textureSourceCallback; 31@external recordingWidth; 32@external recordingHeight; 33@external recordingProfile; 34@external recordingDoneListener; 35 36@external previewSurfaceTexture; 37@external previewWidth; 38@external previewHeight; 39 40// Not used by this graph, but simplifies higher-level 41// graph initialization code. 42@external orientation; 43 44// Filters --------------------------------------------------- 45 46// Camera input 47@filter SurfaceTextureSource source { 48 sourceListener = $textureSourceCallback; 49 width = $recordingWidth; 50 height = $recordingHeight; 51 closeOnTimeout = true; 52} 53 54// Face detection 55@filter ToPackedGrayFilter toPackedGray { 56 owidth = 320; 57 oheight = 240; 58 keepAspectRatio = true; 59} 60 61@filter MultiFaceTrackerFilter faceTracker { 62 numChannelsDetector = 3; 63 quality = 0.0f; 64 smoothness = 0.2f; 65 minEyeDist = 25.0f; 66 rollRange = 45.0f; 67 numSkipFrames = 9; 68 trackingError = 1.0; 69 mouthOnlySmoothing = 0; 70 useAffineCorrection = 1; 71 patchSize = 15; 72} 73 74// Goofyface 75@filter GoofyFastRenderFilter goofyrenderer { 76 distortionAmount = 1.0; 77} 78 79// Display output 80@filter SurfaceTextureTarget display { 81 surfaceTexture = $previewSurfaceTexture; 82 width = $previewWidth; 83 height = $previewHeight; 84 renderMode = "stretch"; 85} 86 87// Orientation rotation filter 88@filter FixedRotationFilter rotate { 89 rotation = 0; 90} 91 92// Orientation rotation filter for facemeta data 93@filter FaceMetaFixedRotationFilter metarotate { 94 rotation = 0; 95} 96 97 98// Recording output 99@filter MediaEncoderFilter recorder { 100 recordingProfile = $recordingProfile; 101 recordingDoneListener = $recordingDoneListener; 102 recording = false; 103 width = $recordingWidth; 104 height = $recordingHeight; 105 // outputFile, orientationHint, inputRegion, 106 // audioSource, listeners, captureRate 107 // will be set when recording starts 108} 109 110// Connections ----------------------------------------------- 111// camera -> faceTracker 112@connect source[video] => rotate[image]; 113@connect rotate[image] => toPackedGray[image]; 114@connect toPackedGray[image] => faceTracker[image]; 115// camera -> goofy 116@connect source[video] => goofyrenderer[image]; 117// faceTracker -> metarotate -> goofy 118@connect faceTracker[faces] => metarotate[faces]; 119@connect metarotate[faces] => goofyrenderer[faces]; 120// goofy -> display out 121@connect goofyrenderer[outimage] => display[frame]; 122// goofy -> record 123@connect goofyrenderer[outimage] => recorder[videoframe]; 124