From d9125b1f5e3bfd1c657d75c4ef812f1202dc406d Mon Sep 17 00:00:00 2001
From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期一, 10 七月 2017 10:12:44 +0800
Subject: [PATCH] proto support st_track_id

---
 FaceServer/STFaceCache.cpp      |   61 +++++-
 FaceServer/PbFaceList.pb.h      |  112 ++++++++----
 FaceServer/PbFaceList           |   19 +-
 FaceServer/main_face_daemon.cpp |   22 ++
 FaceServer/face_daemon_proto.h  |    9 
 FaceServer/PbFaceList.pb.cc     |  288 +++++++++++++++++++------------
 FaceServer/STFaceCache.h        |   17 +
 FaceServer/proto_hton_ntoh.cpp  |    6 
 8 files changed, 356 insertions(+), 178 deletions(-)

diff --git a/FaceServer/PbFaceList b/FaceServer/PbFaceList
index aec8661..6909943 100644
--- a/FaceServer/PbFaceList
+++ b/FaceServer/PbFaceList
@@ -8,7 +8,7 @@
 	required uint32 image_count = 2;
 	optional uint32 src_width = 3;
 	optional uint32 src_height = 4;
-	
+
 	message FaceListImage
 	{
 		enum ImageType
@@ -43,14 +43,15 @@
 		}
 		
 		required uint32 idx = 1;
-		required uint32 size = 2;
-		required ImageType type = 3 [default = MBFT_Y8];
-		
-		required uint32 width = 4;
-		required uint32 height = 5;
-		optional uint32 top_left_x = 6;
-		optional uint32 top_left_y = 7;
-		repeated bytes img = 8;
+		required uint32 st_track_id = 2;
+		required uint32 size = 3;
+		required ImageType type = 4 [default = MBFT_Y8];
+
+		required uint32 width = 5;
+		required uint32 height = 6;
+		optional uint32 top_left_x = 7;
+		optional uint32 top_left_y = 8;
+		repeated bytes img = 9;
 	}
 	
 	repeated FaceListImage images = 5;
diff --git a/FaceServer/PbFaceList.pb.cc b/FaceServer/PbFaceList.pb.cc
index 38d9ab6..5550951 100644
--- a/FaceServer/PbFaceList.pb.cc
+++ b/FaceServer/PbFaceList.pb.cc
@@ -37,6 +37,7 @@
   ~0u,  // no _extensions_
   ~0u,  // no _oneof_case_
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList_FaceListImage, idx_),
+  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList_FaceListImage, st_track_id_),
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList_FaceListImage, size_),
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList_FaceListImage, type_),
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList_FaceListImage, width_),
@@ -46,11 +47,12 @@
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList_FaceListImage, img_),
   0,
   1,
-  6,
   2,
+  7,
   3,
   4,
   5,
+  6,
   ~0u,
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList, _has_bits_),
   GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PbFaceList, _internal_metadata_),
@@ -69,8 +71,8 @@
 };
 
 static const ::google::protobuf::internal::MigrationSchema schemas[] = {
-  { 0, 12, sizeof(PbFaceList_FaceListImage)},
-  { 20, 29, sizeof(PbFaceList)},
+  { 0, 13, sizeof(PbFaceList_FaceListImage)},
+  { 22, 31, sizeof(PbFaceList)},
 };
 
 static ::google::protobuf::Message const * const file_default_instances[] = {
@@ -123,26 +125,27 @@
 void AddDescriptorsImpl() {
   InitDefaults();
   static const char descriptor[] = {
-      "\n\nPbFaceList\"\227\005\n\nPbFaceList\022\027\n\005magic\030\001 \002"
+      "\n\nPbFaceList\"\254\005\n\nPbFaceList\022\027\n\005magic\030\001 \002"
       "(\r:\01011706629\022\023\n\013image_count\030\002 \002(\r\022\021\n\tsrc"
       "_width\030\003 \001(\r\022\022\n\nsrc_height\030\004 \001(\r\022)\n\006imag"
-      "es\030\005 \003(\0132\031.PbFaceList.FaceListImage\032\210\004\n\r"
-      "FaceListImage\022\013\n\003idx\030\001 \002(\r\022\014\n\004size\030\002 \002(\r"
-      "\022:\n\004type\030\003 \002(\0162#.PbFaceList.FaceListImag"
-      "e.ImageType:\007MBFT_Y8\022\r\n\005width\030\004 \002(\r\022\016\n\006h"
-      "eight\030\005 \002(\r\022\022\n\ntop_left_x\030\006 \001(\r\022\022\n\ntop_l"
-      "eft_y\030\007 \001(\r\022\013\n\003img\030\010 \003(\014\"\313\002\n\tImageType\022\014"
-      "\n\010MBFT_SDP\020\001\022\r\n\tMBFT_FMTP\020\002\022\016\n\nMBFT_INDE"
-      "X\020\003\022\024\n\020MBFT_PTR_AVFRAME\020\004\022\022\n\016MBFT_H264_N"
-      "ALU\020\005\022\026\n\022MBFT_H264_NALU_AUX\020\006\022\r\n\tMBFT_JP"
-      "EG\020\007\022\014\n\010MBFT_YUV\020\010\022\013\n\007MBFT_Y8\020\t\022\017\n\013MBFT_"
-      "YUV420\020\n\022\r\n\tMBFT_NV12\020\013\022\014\n\010MBFT_RGB\020\014\022\017\n"
-      "\013MBFT_RGB888\020\r\022\017\n\013MBFT_RGB565\020\016\022\r\n\tMBFT_"
-      "RGBA\020\017\022\r\n\tMBFT_BGRA\020\020\022\021\n\rMBFT_BGRA8888\020\021"
-      "\022\021\n\rMBFT_ABGR8888\020\022\022\021\n\rMBFT_ARGB8888\020\023"
+      "es\030\005 \003(\0132\031.PbFaceList.FaceListImage\032\235\004\n\r"
+      "FaceListImage\022\013\n\003idx\030\001 \002(\r\022\023\n\013st_track_i"
+      "d\030\002 \002(\r\022\014\n\004size\030\003 \002(\r\022:\n\004type\030\004 \002(\0162#.Pb"
+      "FaceList.FaceListImage.ImageType:\007MBFT_Y"
+      "8\022\r\n\005width\030\005 \002(\r\022\016\n\006height\030\006 \002(\r\022\022\n\ntop_"
+      "left_x\030\007 \001(\r\022\022\n\ntop_left_y\030\010 \001(\r\022\013\n\003img\030"
+      "\t \003(\014\"\313\002\n\tImageType\022\014\n\010MBFT_SDP\020\001\022\r\n\tMBF"
+      "T_FMTP\020\002\022\016\n\nMBFT_INDEX\020\003\022\024\n\020MBFT_PTR_AVF"
+      "RAME\020\004\022\022\n\016MBFT_H264_NALU\020\005\022\026\n\022MBFT_H264_"
+      "NALU_AUX\020\006\022\r\n\tMBFT_JPEG\020\007\022\014\n\010MBFT_YUV\020\010\022"
+      "\013\n\007MBFT_Y8\020\t\022\017\n\013MBFT_YUV420\020\n\022\r\n\tMBFT_NV"
+      "12\020\013\022\014\n\010MBFT_RGB\020\014\022\017\n\013MBFT_RGB888\020\r\022\017\n\013M"
+      "BFT_RGB565\020\016\022\r\n\tMBFT_RGBA\020\017\022\r\n\tMBFT_BGRA"
+      "\020\020\022\021\n\rMBFT_BGRA8888\020\021\022\021\n\rMBFT_ABGR8888\020\022"
+      "\022\021\n\rMBFT_ARGB8888\020\023"
   };
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 678);
+      descriptor, 699);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "PbFaceList", &protobuf_RegisterTypes);
   ::google::protobuf::internal::OnShutdown(&TableStruct::Shutdown);
@@ -221,6 +224,7 @@
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int PbFaceList_FaceListImage::kIdxFieldNumber;
+const int PbFaceList_FaceListImage::kStTrackIdFieldNumber;
 const int PbFaceList_FaceListImage::kSizeFieldNumber;
 const int PbFaceList_FaceListImage::kTypeFieldNumber;
 const int PbFaceList_FaceListImage::kWidthFieldNumber;
@@ -292,7 +296,7 @@
 void PbFaceList_FaceListImage::Clear() {
 // @@protoc_insertion_point(message_clear_start:PbFaceList.FaceListImage)
   img_.Clear();
-  if (_has_bits_[0 / 32] & 127u) {
+  if (_has_bits_[0 / 32] & 255u) {
     ::memset(&idx_, 0, reinterpret_cast<char*>(&top_left_y_) -
       reinterpret_cast<char*>(&idx_) + sizeof(top_left_y_));
     type_ = 9;
@@ -325,10 +329,24 @@
         break;
       }
 
-      // required uint32 size = 2;
+      // required uint32 st_track_id = 2;
       case 2: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
             static_cast< ::google::protobuf::uint8>(16u)) {
+          set_has_st_track_id();
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
+                 input, &st_track_id_)));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // required uint32 size = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) ==
+            static_cast< ::google::protobuf::uint8>(24u)) {
           set_has_size();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
@@ -339,10 +357,10 @@
         break;
       }
 
-      // required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
-      case 3: {
+      // required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
+      case 4: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u)) {
+            static_cast< ::google::protobuf::uint8>(32u)) {
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -350,7 +368,7 @@
           if (::PbFaceList_FaceListImage_ImageType_IsValid(value)) {
             set_type(static_cast< ::PbFaceList_FaceListImage_ImageType >(value));
           } else {
-            mutable_unknown_fields()->AddVarint(3, value);
+            mutable_unknown_fields()->AddVarint(4, value);
           }
         } else {
           goto handle_unusual;
@@ -358,10 +376,10 @@
         break;
       }
 
-      // required uint32 width = 4;
-      case 4: {
+      // required uint32 width = 5;
+      case 5: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(32u)) {
+            static_cast< ::google::protobuf::uint8>(40u)) {
           set_has_width();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
@@ -372,10 +390,10 @@
         break;
       }
 
-      // required uint32 height = 5;
-      case 5: {
+      // required uint32 height = 6;
+      case 6: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u)) {
+            static_cast< ::google::protobuf::uint8>(48u)) {
           set_has_height();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
@@ -386,10 +404,10 @@
         break;
       }
 
-      // optional uint32 top_left_x = 6;
-      case 6: {
+      // optional uint32 top_left_x = 7;
+      case 7: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(48u)) {
+            static_cast< ::google::protobuf::uint8>(56u)) {
           set_has_top_left_x();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
@@ -400,10 +418,10 @@
         break;
       }
 
-      // optional uint32 top_left_y = 7;
-      case 7: {
+      // optional uint32 top_left_y = 8;
+      case 8: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(56u)) {
+            static_cast< ::google::protobuf::uint8>(64u)) {
           set_has_top_left_y();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
@@ -414,10 +432,10 @@
         break;
       }
 
-      // repeated bytes img = 8;
-      case 8: {
+      // repeated bytes img = 9;
+      case 9: {
         if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u)) {
+            static_cast< ::google::protobuf::uint8>(74u)) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->add_img()));
         } else {
@@ -456,41 +474,46 @@
     ::google::protobuf::internal::WireFormatLite::WriteUInt32(1, this->idx(), output);
   }
 
-  // required uint32 size = 2;
-  if (has_size()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->size(), output);
+  // required uint32 st_track_id = 2;
+  if (has_st_track_id()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->st_track_id(), output);
   }
 
-  // required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+  // required uint32 size = 3;
+  if (has_size()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->size(), output);
+  }
+
+  // required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
   if (has_type()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
-      3, this->type(), output);
+      4, this->type(), output);
   }
 
-  // required uint32 width = 4;
+  // required uint32 width = 5;
   if (has_width()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt32(4, this->width(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(5, this->width(), output);
   }
 
-  // required uint32 height = 5;
+  // required uint32 height = 6;
   if (has_height()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt32(5, this->height(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(6, this->height(), output);
   }
 
-  // optional uint32 top_left_x = 6;
+  // optional uint32 top_left_x = 7;
   if (has_top_left_x()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt32(6, this->top_left_x(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(7, this->top_left_x(), output);
   }
 
-  // optional uint32 top_left_y = 7;
+  // optional uint32 top_left_y = 8;
   if (has_top_left_y()) {
-    ::google::protobuf::internal::WireFormatLite::WriteUInt32(7, this->top_left_y(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(8, this->top_left_y(), output);
   }
 
-  // repeated bytes img = 8;
+  // repeated bytes img = 9;
   for (int i = 0, n = this->img_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteBytes(
-      8, this->img(i), output);
+      9, this->img(i), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
@@ -509,41 +532,46 @@
     target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(1, this->idx(), target);
   }
 
-  // required uint32 size = 2;
-  if (has_size()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->size(), target);
+  // required uint32 st_track_id = 2;
+  if (has_st_track_id()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->st_track_id(), target);
   }
 
-  // required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+  // required uint32 size = 3;
+  if (has_size()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(3, this->size(), target);
+  }
+
+  // required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
   if (has_type()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
-      3, this->type(), target);
+      4, this->type(), target);
   }
 
-  // required uint32 width = 4;
+  // required uint32 width = 5;
   if (has_width()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(4, this->width(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(5, this->width(), target);
   }
 
-  // required uint32 height = 5;
+  // required uint32 height = 6;
   if (has_height()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(5, this->height(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(6, this->height(), target);
   }
 
-  // optional uint32 top_left_x = 6;
+  // optional uint32 top_left_x = 7;
   if (has_top_left_x()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(6, this->top_left_x(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(7, this->top_left_x(), target);
   }
 
-  // optional uint32 top_left_y = 7;
+  // optional uint32 top_left_y = 8;
   if (has_top_left_y()) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(7, this->top_left_y(), target);
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(8, this->top_left_y(), target);
   }
 
-  // repeated bytes img = 8;
+  // repeated bytes img = 9;
   for (int i = 0, n = this->img_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      WriteBytesToArray(8, this->img(i), target);
+      WriteBytesToArray(9, this->img(i), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
@@ -565,29 +593,36 @@
         this->idx());
   }
 
+  if (has_st_track_id()) {
+    // required uint32 st_track_id = 2;
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::UInt32Size(
+        this->st_track_id());
+  }
+
   if (has_size()) {
-    // required uint32 size = 2;
+    // required uint32 size = 3;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->size());
   }
 
   if (has_width()) {
-    // required uint32 width = 4;
+    // required uint32 width = 5;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->width());
   }
 
   if (has_height()) {
-    // required uint32 height = 5;
+    // required uint32 height = 6;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->height());
   }
 
   if (has_type()) {
-    // required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+    // required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->type());
   }
@@ -603,35 +638,40 @@
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
         unknown_fields());
   }
-  if (((_has_bits_[0] & 0x0000004f) ^ 0x0000004f) == 0) {  // All required fields are present.
+  if (((_has_bits_[0] & 0x0000009f) ^ 0x0000009f) == 0) {  // All required fields are present.
     // required uint32 idx = 1;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->idx());
 
-    // required uint32 size = 2;
+    // required uint32 st_track_id = 2;
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::UInt32Size(
+        this->st_track_id());
+
+    // required uint32 size = 3;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->size());
 
-    // required uint32 width = 4;
+    // required uint32 width = 5;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->width());
 
-    // required uint32 height = 5;
+    // required uint32 height = 6;
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->height());
 
-    // required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+    // required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->type());
 
   } else {
     total_size += RequiredFieldsByteSizeFallback();
   }
-  // repeated bytes img = 8;
+  // repeated bytes img = 9;
   total_size += 1 *
       ::google::protobuf::internal::FromIntSize(this->img_size());
   for (int i = 0, n = this->img_size(); i < n; i++) {
@@ -639,15 +679,15 @@
       this->img(i));
   }
 
-  if (_has_bits_[0 / 32] & 48u) {
-    // optional uint32 top_left_x = 6;
+  if (_has_bits_[0 / 32] & 96u) {
+    // optional uint32 top_left_x = 7;
     if (has_top_left_x()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt32Size(
           this->top_left_x());
     }
 
-    // optional uint32 top_left_y = 7;
+    // optional uint32 top_left_y = 8;
     if (has_top_left_y()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::UInt32Size(
@@ -682,9 +722,12 @@
   GOOGLE_DCHECK_NE(&from, this);
   _internal_metadata_.MergeFrom(from._internal_metadata_);
   img_.MergeFrom(from.img_);
-  if (from._has_bits_[0 / 32] & 127u) {
+  if (from._has_bits_[0 / 32] & 255u) {
     if (from.has_idx()) {
       set_idx(from.idx());
+    }
+    if (from.has_st_track_id()) {
+      set_st_track_id(from.st_track_id());
     }
     if (from.has_size()) {
       set_size(from.size());
@@ -722,7 +765,7 @@
 }
 
 bool PbFaceList_FaceListImage::IsInitialized() const {
-  if ((_has_bits_[0] & 0x0000004f) != 0x0000004f) return false;
+  if ((_has_bits_[0] & 0x0000009f) != 0x0000009f) return false;
   return true;
 }
 
@@ -733,6 +776,7 @@
 void PbFaceList_FaceListImage::InternalSwap(PbFaceList_FaceListImage* other) {
   img_.UnsafeArenaSwap(&other->img_);
   std::swap(idx_, other->idx_);
+  std::swap(st_track_id_, other->st_track_id_);
   std::swap(size_, other->size_);
   std::swap(width_, other->width_);
   std::swap(height_, other->height_);
@@ -776,15 +820,39 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.idx)
 }
 
-// required uint32 size = 2;
-bool PbFaceList_FaceListImage::has_size() const {
+// required uint32 st_track_id = 2;
+bool PbFaceList_FaceListImage::has_st_track_id() const {
   return (_has_bits_[0] & 0x00000002u) != 0;
 }
-void PbFaceList_FaceListImage::set_has_size() {
+void PbFaceList_FaceListImage::set_has_st_track_id() {
   _has_bits_[0] |= 0x00000002u;
 }
-void PbFaceList_FaceListImage::clear_has_size() {
+void PbFaceList_FaceListImage::clear_has_st_track_id() {
   _has_bits_[0] &= ~0x00000002u;
+}
+void PbFaceList_FaceListImage::clear_st_track_id() {
+  st_track_id_ = 0u;
+  clear_has_st_track_id();
+}
+::google::protobuf::uint32 PbFaceList_FaceListImage::st_track_id() const {
+  // @@protoc_insertion_point(field_get:PbFaceList.FaceListImage.st_track_id)
+  return st_track_id_;
+}
+void PbFaceList_FaceListImage::set_st_track_id(::google::protobuf::uint32 value) {
+  set_has_st_track_id();
+  st_track_id_ = value;
+  // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.st_track_id)
+}
+
+// required uint32 size = 3;
+bool PbFaceList_FaceListImage::has_size() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void PbFaceList_FaceListImage::set_has_size() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void PbFaceList_FaceListImage::clear_has_size() {
+  _has_bits_[0] &= ~0x00000004u;
 }
 void PbFaceList_FaceListImage::clear_size() {
   size_ = 0u;
@@ -800,15 +868,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.size)
 }
 
-// required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+// required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
 bool PbFaceList_FaceListImage::has_type() const {
-  return (_has_bits_[0] & 0x00000040u) != 0;
+  return (_has_bits_[0] & 0x00000080u) != 0;
 }
 void PbFaceList_FaceListImage::set_has_type() {
-  _has_bits_[0] |= 0x00000040u;
+  _has_bits_[0] |= 0x00000080u;
 }
 void PbFaceList_FaceListImage::clear_has_type() {
-  _has_bits_[0] &= ~0x00000040u;
+  _has_bits_[0] &= ~0x00000080u;
 }
 void PbFaceList_FaceListImage::clear_type() {
   type_ = 9;
@@ -825,15 +893,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.type)
 }
 
-// required uint32 width = 4;
+// required uint32 width = 5;
 bool PbFaceList_FaceListImage::has_width() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 void PbFaceList_FaceListImage::set_has_width() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000008u;
 }
 void PbFaceList_FaceListImage::clear_has_width() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 void PbFaceList_FaceListImage::clear_width() {
   width_ = 0u;
@@ -849,15 +917,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.width)
 }
 
-// required uint32 height = 5;
+// required uint32 height = 6;
 bool PbFaceList_FaceListImage::has_height() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
 void PbFaceList_FaceListImage::set_has_height() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000010u;
 }
 void PbFaceList_FaceListImage::clear_has_height() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 void PbFaceList_FaceListImage::clear_height() {
   height_ = 0u;
@@ -873,15 +941,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.height)
 }
 
-// optional uint32 top_left_x = 6;
+// optional uint32 top_left_x = 7;
 bool PbFaceList_FaceListImage::has_top_left_x() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 void PbFaceList_FaceListImage::set_has_top_left_x() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000020u;
 }
 void PbFaceList_FaceListImage::clear_has_top_left_x() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 void PbFaceList_FaceListImage::clear_top_left_x() {
   top_left_x_ = 0u;
@@ -897,15 +965,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.top_left_x)
 }
 
-// optional uint32 top_left_y = 7;
+// optional uint32 top_left_y = 8;
 bool PbFaceList_FaceListImage::has_top_left_y() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return (_has_bits_[0] & 0x00000040u) != 0;
 }
 void PbFaceList_FaceListImage::set_has_top_left_y() {
-  _has_bits_[0] |= 0x00000020u;
+  _has_bits_[0] |= 0x00000040u;
 }
 void PbFaceList_FaceListImage::clear_has_top_left_y() {
-  _has_bits_[0] &= ~0x00000020u;
+  _has_bits_[0] &= ~0x00000040u;
 }
 void PbFaceList_FaceListImage::clear_top_left_y() {
   top_left_y_ = 0u;
@@ -921,7 +989,7 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.top_left_y)
 }
 
-// repeated bytes img = 8;
+// repeated bytes img = 9;
 int PbFaceList_FaceListImage::img_size() const {
   return img_.size();
 }
diff --git a/FaceServer/PbFaceList.pb.h b/FaceServer/PbFaceList.pb.h
index 8085a09..9a00cfc 100644
--- a/FaceServer/PbFaceList.pb.h
+++ b/FaceServer/PbFaceList.pb.h
@@ -221,10 +221,10 @@
 
   // accessors -------------------------------------------------------
 
-  // repeated bytes img = 8;
+  // repeated bytes img = 9;
   int img_size() const;
   void clear_img();
-  static const int kImgFieldNumber = 8;
+  static const int kImgFieldNumber = 9;
   const ::std::string& img(int index) const;
   ::std::string* mutable_img(int index);
   void set_img(int index, const ::std::string& value);
@@ -250,45 +250,52 @@
   ::google::protobuf::uint32 idx() const;
   void set_idx(::google::protobuf::uint32 value);
 
-  // required uint32 size = 2;
+  // required uint32 st_track_id = 2;
+  bool has_st_track_id() const;
+  void clear_st_track_id();
+  static const int kStTrackIdFieldNumber = 2;
+  ::google::protobuf::uint32 st_track_id() const;
+  void set_st_track_id(::google::protobuf::uint32 value);
+
+  // required uint32 size = 3;
   bool has_size() const;
   void clear_size();
-  static const int kSizeFieldNumber = 2;
+  static const int kSizeFieldNumber = 3;
   ::google::protobuf::uint32 size() const;
   void set_size(::google::protobuf::uint32 value);
 
-  // required uint32 width = 4;
+  // required uint32 width = 5;
   bool has_width() const;
   void clear_width();
-  static const int kWidthFieldNumber = 4;
+  static const int kWidthFieldNumber = 5;
   ::google::protobuf::uint32 width() const;
   void set_width(::google::protobuf::uint32 value);
 
-  // required uint32 height = 5;
+  // required uint32 height = 6;
   bool has_height() const;
   void clear_height();
-  static const int kHeightFieldNumber = 5;
+  static const int kHeightFieldNumber = 6;
   ::google::protobuf::uint32 height() const;
   void set_height(::google::protobuf::uint32 value);
 
-  // optional uint32 top_left_x = 6;
+  // optional uint32 top_left_x = 7;
   bool has_top_left_x() const;
   void clear_top_left_x();
-  static const int kTopLeftXFieldNumber = 6;
+  static const int kTopLeftXFieldNumber = 7;
   ::google::protobuf::uint32 top_left_x() const;
   void set_top_left_x(::google::protobuf::uint32 value);
 
-  // optional uint32 top_left_y = 7;
+  // optional uint32 top_left_y = 8;
   bool has_top_left_y() const;
   void clear_top_left_y();
-  static const int kTopLeftYFieldNumber = 7;
+  static const int kTopLeftYFieldNumber = 8;
   ::google::protobuf::uint32 top_left_y() const;
   void set_top_left_y(::google::protobuf::uint32 value);
 
-  // required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+  // required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
   bool has_type() const;
   void clear_type();
-  static const int kTypeFieldNumber = 3;
+  static const int kTypeFieldNumber = 4;
   ::PbFaceList_FaceListImage_ImageType type() const;
   void set_type(::PbFaceList_FaceListImage_ImageType value);
 
@@ -296,6 +303,8 @@
  private:
   void set_has_idx();
   void clear_has_idx();
+  void set_has_st_track_id();
+  void clear_has_st_track_id();
   void set_has_size();
   void clear_has_size();
   void set_has_type();
@@ -317,6 +326,7 @@
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::std::string> img_;
   ::google::protobuf::uint32 idx_;
+  ::google::protobuf::uint32 st_track_id_;
   ::google::protobuf::uint32 size_;
   ::google::protobuf::uint32 width_;
   ::google::protobuf::uint32 height_;
@@ -500,15 +510,39 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.idx)
 }
 
-// required uint32 size = 2;
-inline bool PbFaceList_FaceListImage::has_size() const {
+// required uint32 st_track_id = 2;
+inline bool PbFaceList_FaceListImage::has_st_track_id() const {
   return (_has_bits_[0] & 0x00000002u) != 0;
 }
-inline void PbFaceList_FaceListImage::set_has_size() {
+inline void PbFaceList_FaceListImage::set_has_st_track_id() {
   _has_bits_[0] |= 0x00000002u;
 }
-inline void PbFaceList_FaceListImage::clear_has_size() {
+inline void PbFaceList_FaceListImage::clear_has_st_track_id() {
   _has_bits_[0] &= ~0x00000002u;
+}
+inline void PbFaceList_FaceListImage::clear_st_track_id() {
+  st_track_id_ = 0u;
+  clear_has_st_track_id();
+}
+inline ::google::protobuf::uint32 PbFaceList_FaceListImage::st_track_id() const {
+  // @@protoc_insertion_point(field_get:PbFaceList.FaceListImage.st_track_id)
+  return st_track_id_;
+}
+inline void PbFaceList_FaceListImage::set_st_track_id(::google::protobuf::uint32 value) {
+  set_has_st_track_id();
+  st_track_id_ = value;
+  // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.st_track_id)
+}
+
+// required uint32 size = 3;
+inline bool PbFaceList_FaceListImage::has_size() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+inline void PbFaceList_FaceListImage::set_has_size() {
+  _has_bits_[0] |= 0x00000004u;
+}
+inline void PbFaceList_FaceListImage::clear_has_size() {
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void PbFaceList_FaceListImage::clear_size() {
   size_ = 0u;
@@ -524,15 +558,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.size)
 }
 
-// required .PbFaceList.FaceListImage.ImageType type = 3 [default = MBFT_Y8];
+// required .PbFaceList.FaceListImage.ImageType type = 4 [default = MBFT_Y8];
 inline bool PbFaceList_FaceListImage::has_type() const {
-  return (_has_bits_[0] & 0x00000040u) != 0;
+  return (_has_bits_[0] & 0x00000080u) != 0;
 }
 inline void PbFaceList_FaceListImage::set_has_type() {
-  _has_bits_[0] |= 0x00000040u;
+  _has_bits_[0] |= 0x00000080u;
 }
 inline void PbFaceList_FaceListImage::clear_has_type() {
-  _has_bits_[0] &= ~0x00000040u;
+  _has_bits_[0] &= ~0x00000080u;
 }
 inline void PbFaceList_FaceListImage::clear_type() {
   type_ = 9;
@@ -549,15 +583,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.type)
 }
 
-// required uint32 width = 4;
+// required uint32 width = 5;
 inline bool PbFaceList_FaceListImage::has_width() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void PbFaceList_FaceListImage::set_has_width() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void PbFaceList_FaceListImage::clear_has_width() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void PbFaceList_FaceListImage::clear_width() {
   width_ = 0u;
@@ -573,15 +607,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.width)
 }
 
-// required uint32 height = 5;
+// required uint32 height = 6;
 inline bool PbFaceList_FaceListImage::has_height() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
 inline void PbFaceList_FaceListImage::set_has_height() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000010u;
 }
 inline void PbFaceList_FaceListImage::clear_has_height() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 inline void PbFaceList_FaceListImage::clear_height() {
   height_ = 0u;
@@ -597,15 +631,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.height)
 }
 
-// optional uint32 top_left_x = 6;
+// optional uint32 top_left_x = 7;
 inline bool PbFaceList_FaceListImage::has_top_left_x() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 inline void PbFaceList_FaceListImage::set_has_top_left_x() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000020u;
 }
 inline void PbFaceList_FaceListImage::clear_has_top_left_x() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline void PbFaceList_FaceListImage::clear_top_left_x() {
   top_left_x_ = 0u;
@@ -621,15 +655,15 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.top_left_x)
 }
 
-// optional uint32 top_left_y = 7;
+// optional uint32 top_left_y = 8;
 inline bool PbFaceList_FaceListImage::has_top_left_y() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return (_has_bits_[0] & 0x00000040u) != 0;
 }
 inline void PbFaceList_FaceListImage::set_has_top_left_y() {
-  _has_bits_[0] |= 0x00000020u;
+  _has_bits_[0] |= 0x00000040u;
 }
 inline void PbFaceList_FaceListImage::clear_has_top_left_y() {
-  _has_bits_[0] &= ~0x00000020u;
+  _has_bits_[0] &= ~0x00000040u;
 }
 inline void PbFaceList_FaceListImage::clear_top_left_y() {
   top_left_y_ = 0u;
@@ -645,7 +679,7 @@
   // @@protoc_insertion_point(field_set:PbFaceList.FaceListImage.top_left_y)
 }
 
-// repeated bytes img = 8;
+// repeated bytes img = 9;
 inline int PbFaceList_FaceListImage::img_size() const {
   return img_.size();
 }
diff --git a/FaceServer/STFaceCache.cpp b/FaceServer/STFaceCache.cpp
index 52e3c69..6d5026d 100644
--- a/FaceServer/STFaceCache.cpp
+++ b/FaceServer/STFaceCache.cpp
@@ -9,12 +9,6 @@
 #include "sample_face_search.h"
 #include <cv_face.h>
 
-#define FDP_FDR_INVALID FDP_FaceDetectResult(0, 0, 0)
-#define ENABLE_AUTO_CREATE_STFACEDB
-#define ENABLE_SEARCH_IN_NEGATIVE_DBID
-#define ENABLE_SEARCH_IN_NEGATIVE_DBID
-#define RESULT_CONFIDENCE 0.70
-
 struct STFaceCacheContext
 {
 	cv_handle_t handle_verify;
@@ -72,7 +66,7 @@
 		handles.handle_db = nullptr;
 		dbLoadOK = false;
 	}
-	
+
 	std::string db_full_path() const
 	{
 		if (dbfpath.empty() || dbfname.empty())
@@ -89,7 +83,8 @@
 
 STFaceCache::STFaceCache(const std::string& _stfacedbPath)
 	: stfacedbPath(_stfacedbPath), stfaceModels(STFACESDK_BASE "/models"), 
-	_dbContext(new stface_ctx_map_t), _cacheContext(new STFaceCacheContext)
+	_dbContext(new stface_ctx_map_t), _cacheContext(new STFaceCacheContext), 
+	tempdbFaceCount(0)
 {
 	LOG_INFO << "st face db: " << stfacedbPath << LOG_ENDL;
 	LOG_INFO << "st face sdk models: " << stfaceModels << LOG_ENDL;
@@ -207,13 +202,22 @@
 		return FDP_FDR_INVALID;
 	}
 	
-#ifdef ENABLE_SEARCH_IN_NEGATIVE_DBID
-			STFaceImage imgNeg(img);
-			imgNeg.db_id = -1;
-			return detect(imgNeg);
-#else
-			return FDP_FDR_INVALID;
+#ifdef ENABLE_DETECT_IN_NEGATIVE_DBID
+	STFaceImage imgNeg(img);
+	FDP_FaceDetectResult res(FDP_FDR_INVALID);
+	
+	imgNeg.db_id = STFS_DBID_VISITOR_1;
+	res = detect(imgNeg); // #todo optimize extract feature once
+	if (res.db_id != STFS_DBID_INVALID)
+		return res;
+	
+	imgNeg.db_id = STFS_DBID_TEMPDB_1;
+	res = detect(imgNeg);
+	if (res.db_id != STFS_DBID_INVALID)
+		return res;
 #endif
+
+	return FDP_FDR_INVALID;
 }
 
 FDP_FaceDetectResult STFaceCache::detect(const STFaceImage& img)
@@ -323,6 +327,10 @@
 		return FDP_FDR_INVALID;
 	}
 	
+#ifdef ENABLE_ADD_TO_TEMPDB_WHEN_NOT_DETECT
+	tempdbFaceCount++;
+#endif
+	
 	int idx = stface_db_add(ctx.handles, img);
 	LOG_INFO << "stface_db_add dbid=" << img.db_id << ", idx=" << idx << LOG_ENDL;
 	if (idx <= 1)
@@ -347,7 +355,6 @@
 	stface_ctx_map_t& dbContext(*(stface_ctx_map_t*)_dbContext);
 	STFaceCacheContext& cacheContext(*(STFaceCacheContext*)_cacheContext);
 
-	
 	for(stface_ctx_map_t::iterator iterCtx = dbContext.begin(); iterCtx != dbContext.end(); ++iterCtx)
 	{
 		STFaceDBContext& ctx(iterCtx->second);
@@ -416,4 +423,26 @@
 	topResult.push_back(FDP_FaceDetectResult(-1, 2, 4));
 	topResult.push_back(FDP_FaceDetectResult(1, 6, 5));
 	*/
-}
\ No newline at end of file
+}
+
+void STFaceCache::delete_db(int dbid)
+{
+	stface_ctx_map_t& dbContext(*(stface_ctx_map_t*)_dbContext);
+	STFaceCacheContext& cacheContext(*(STFaceCacheContext*)_cacheContext);
+
+	stface_ctx_map_t::iterator iterCtx = dbContext.find(dbid);
+	if (iterCtx == dbContext.end())
+	{
+		LOG_WARN << "no dbid=%d" << dbid << LOG_ENDL;
+		return;
+	}
+	
+	STFaceDBContext& ctx(iterCtx->second);
+	ctx.close_db();
+	
+	char mvDBtoBak[1000];
+	sprintf(mvDBtoBak, "cd %s; mv %s %d.bak;", stfacedbPath.c_str(), ctx.db_full_path().c_str(), dbid);
+	system(mvDBtoBak);
+	
+	dbContext.erase(iterCtx);
+}
diff --git a/FaceServer/STFaceCache.h b/FaceServer/STFaceCache.h
index ff50309..44fb677 100644
--- a/FaceServer/STFaceCache.h
+++ b/FaceServer/STFaceCache.h
@@ -4,6 +4,20 @@
 #include <string>
 #include "face_daemon_proto.h"
 
+#define FDP_FDR_INVALID FDP_FaceDetectResult(STFS_DBID_INVALID, 0, 0)
+#define ENABLE_AUTO_CREATE_STFACEDB
+#define ENABLE_DETECT_IN_NEGATIVE_DBID
+//#define ENABLE_ADD_TO_TEMPDB_WHEN_NOT_DETECT
+#define RESULT_CONFIDENCE 0.70
+#define TEMPDB_FACE_COUNT_MAX 10
+
+enum STFSpecialDBID
+{
+	STFS_DBID_INVALID = 0,
+	STFS_DBID_VISITOR_1 = -1,
+	STFS_DBID_TEMPDB_1 = -1000
+};
+
 struct STFaceImage;
 
 class STFaceCache
@@ -21,6 +35,7 @@
 	FDP_FaceDetectResult add(const STFaceImage& img);
 	void search(const STFaceImage& img, fdr_vec_t& topResult);
 	FDP_FaceDetectResult compare(const STFaceImage& img1, const STFaceImage& img2);
+	void delete_db(int dbid);
 	
 	//#todo need a delete img, if business not linked faceid and its personid
 	// they can delete it and save/find again!
@@ -33,6 +48,8 @@
 	const std::string stfaceModels;
 	void* _dbContext;
 	void* _cacheContext;
+	
+	int tempdbFaceCount;
 };
 
 #endif
diff --git a/FaceServer/face_daemon_proto.h b/FaceServer/face_daemon_proto.h
index ed82594..cf642a9 100644
--- a/FaceServer/face_daemon_proto.h
+++ b/FaceServer/face_daemon_proto.h
@@ -42,8 +42,9 @@
 struct FDP_FaceDetectPB
 {
 	int32_t db_id;
+	int16_t camera_id;
 	
-	FDP_FaceDetectPB(int32_t _db_id) : db_id(_db_id)
+	FDP_FaceDetectPB(int32_t _db_id, int16_t _camera_id) : db_id(_db_id), camera_id(_camera_id)
 	{}
 	
 	void hton();
@@ -56,7 +57,11 @@
 	int32_t st_id; // sensetime id
 	int16_t confidence; // 1000 times of float confidence, less than zero means error
 	
-	FDP_FaceDetectResult(int32_t _db_id, int32_t _st_id, int _confidence) : db_id(_db_id), st_id(_st_id), confidence(_confidence)
+	int16_t camera_id;
+	int32_t st_track_id;
+	
+	FDP_FaceDetectResult(int32_t _db_id, int32_t _st_id, int _confidence) : 
+		db_id(_db_id), st_id(_st_id), confidence(_confidence), camera_id(0), st_track_id(0)
 	{}
 	
 	void hton();
diff --git a/FaceServer/main_face_daemon.cpp b/FaceServer/main_face_daemon.cpp
index bd12356..baff933 100644
--- a/FaceServer/main_face_daemon.cpp
+++ b/FaceServer/main_face_daemon.cpp
@@ -34,7 +34,11 @@
 	ss << "\"result\":[";
 	for(fdr_vec_t::const_iterator iter = result.begin(); iter != result.end(); ++iter)
 	{
-		ss << "[" << WRAPPER_TEXT(iter->db_id) << "," << WRAPPER_TEXT(iter->st_id) <<  "," << WRAPPER_TEXT(iter->confidence) << "]";
+		ss << "[" << WRAPPER_TEXT(iter->db_id) << "," 
+			<< WRAPPER_TEXT(iter->st_id) <<  "," 
+			<< WRAPPER_TEXT(iter->confidence) <<  "," 
+			<< WRAPPER_TEXT(iter->camera_id) <<  "," 
+			<< WRAPPER_TEXT(iter->st_track_id) << "]";
 		if (iter != std::prev(result.end()))
 			ss << ",";
 	}
@@ -93,7 +97,21 @@
 		stimg.height = pbFaceListImage.height();
 		stimg.size = img->size();
 		stimg.buff = (const uint8_t*)img->data();
-		result.push_back(g_STFaceCache.detect(stimg));
+		
+		FDP_FaceDetectResult res(g_STFaceCache.detect(stimg));
+		
+#ifdef ENABLE_ADD_TO_TEMPDB_WHEN_NOT_DETECT
+		if (res.db_id == STFS_DBID_INVALID)
+		{
+			// #todo optimize extract feature once
+			stimg.db_id = STFS_DBID_TEMPDB_1;
+			res = g_STFaceCache.add(stimg);
+		}
+#endif
+
+		res.camera_id = fdpFaceDetectPB->camera_id;
+		res.st_track_id = pbFaceListImage.st_track_id();
+		result.push_back(res);
 	}
 
 	//#test
diff --git a/FaceServer/proto_hton_ntoh.cpp b/FaceServer/proto_hton_ntoh.cpp
index ccc2da9..1aaa892 100644
--- a/FaceServer/proto_hton_ntoh.cpp
+++ b/FaceServer/proto_hton_ntoh.cpp
@@ -55,11 +55,13 @@
 void FDP_FaceDetectPB::hton()
 {
 	db_id = htonl(db_id);
+	camera_id = htons(camera_id);
 }
 
 void FDP_FaceDetectPB::ntoh()
 {
 	db_id = ntohl(db_id);
+	camera_id = ntohs(camera_id);
 }
 
 void FDP_FaceDetectResult::hton()
@@ -67,6 +69,8 @@
 	db_id = htonl(db_id);
 	st_id = htonl(st_id);
 	confidence = htons(confidence);
+	camera_id = htons(camera_id);
+	st_track_id = htonl(st_track_id);
 }
 
 void FDP_FaceDetectResult::ntoh()
@@ -74,4 +78,6 @@
 	db_id = ntohl(db_id);
 	st_id = ntohl(st_id);
 	confidence = ntohs(confidence);
+	camera_id = ntohs(camera_id);
+	st_track_id = ntohl(st_track_id);
 }

--
Gitblit v1.8.0