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