feat: representative frame limited to first half of video
This commit is contained in:
@@ -872,6 +872,19 @@ pub async fn query_auto_representative_frame(
|
|||||||
let fd_table = t("face_detections");
|
let fd_table = t("face_detections");
|
||||||
let nodes_table = t("tkg_nodes");
|
let nodes_table = t("tkg_nodes");
|
||||||
let edges_table = t("tkg_edges");
|
let edges_table = t("tkg_edges");
|
||||||
|
let video_table = t("videos");
|
||||||
|
|
||||||
|
let half_frame: i64 = match sqlx::query_scalar::<_, i64>(&format!(
|
||||||
|
"SELECT COALESCE(total_frames / 2, 0) FROM {} WHERE file_uuid = $1",
|
||||||
|
video_table
|
||||||
|
))
|
||||||
|
.bind(file_uuid)
|
||||||
|
.fetch_optional(pool)
|
||||||
|
.await?
|
||||||
|
{
|
||||||
|
Some(f) if f > 0 => f,
|
||||||
|
_ => i64::MAX,
|
||||||
|
};
|
||||||
|
|
||||||
let mains = sqlx::query_as::<_, (i32, String, String, i64)>(&format!(
|
let mains = sqlx::query_as::<_, (i32, String, String, i64)>(&format!(
|
||||||
"SELECT i.id, i.uuid::text, i.name, COUNT(fd.id)::bigint \
|
"SELECT i.id, i.uuid::text, i.name, COUNT(fd.id)::bigint \
|
||||||
@@ -931,17 +944,17 @@ pub async fn query_auto_representative_frame(
|
|||||||
.fetch_optional(pool).await?;
|
.fetch_optional(pool).await?;
|
||||||
|
|
||||||
if let Some((f,)) = tkg_frame {
|
if let Some((f,)) = tkg_frame {
|
||||||
Some(f)
|
if f <= half_frame { Some(f) } else { None }
|
||||||
} else {
|
} else {
|
||||||
sqlx::query_scalar::<_, i64>(&format!(
|
sqlx::query_scalar::<_, i64>(&format!(
|
||||||
"SELECT MIN(fd_a.frame_number)::bigint \
|
"SELECT MIN(fd_a.frame_number)::bigint \
|
||||||
FROM {} fd_a \
|
FROM {} fd_a \
|
||||||
JOIN {} fd_b ON fd_a.frame_number = fd_b.frame_number \
|
JOIN {} fd_b ON fd_a.frame_number = fd_b.frame_number \
|
||||||
WHERE fd_a.file_uuid = $1 AND fd_a.identity_id = $2 \
|
WHERE fd_a.file_uuid = $1 AND fd_a.identity_id = $2 \
|
||||||
AND fd_b.identity_id = $3",
|
AND fd_b.identity_id = $3 AND fd_a.frame_number <= $4",
|
||||||
fd_table, fd_table
|
fd_table, fd_table
|
||||||
))
|
))
|
||||||
.bind(file_uuid).bind(id_a).bind(id_b)
|
.bind(file_uuid).bind(id_a).bind(id_b).bind(half_frame)
|
||||||
.fetch_optional(pool).await?
|
.fetch_optional(pool).await?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -958,11 +971,12 @@ pub async fn query_auto_representative_frame(
|
|||||||
sqlx::query_scalar::<_, i64>(&format!(
|
sqlx::query_scalar::<_, i64>(&format!(
|
||||||
"SELECT frame_number::bigint FROM {} \
|
"SELECT frame_number::bigint FROM {} \
|
||||||
WHERE file_uuid = $1 AND identity_id = $2 \
|
WHERE file_uuid = $1 AND identity_id = $2 \
|
||||||
|
AND frame_number <= $3 \
|
||||||
ORDER BY (width::float8 * height::float8) * confidence::float8 DESC \
|
ORDER BY (width::float8 * height::float8) * confidence::float8 DESC \
|
||||||
LIMIT 1",
|
LIMIT 1",
|
||||||
fd_table
|
fd_table
|
||||||
))
|
))
|
||||||
.bind(file_uuid).bind(first_id)
|
.bind(file_uuid).bind(first_id).bind(half_frame)
|
||||||
.fetch_optional(pool).await?
|
.fetch_optional(pool).await?
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@@ -976,11 +990,12 @@ pub async fn query_auto_representative_frame(
|
|||||||
sqlx::query_scalar::<_, i64>(&format!(
|
sqlx::query_scalar::<_, i64>(&format!(
|
||||||
"SELECT frame_number::bigint FROM {} \
|
"SELECT frame_number::bigint FROM {} \
|
||||||
WHERE file_uuid = $1 AND identity_id IS NOT NULL \
|
WHERE file_uuid = $1 AND identity_id IS NOT NULL \
|
||||||
|
AND frame_number <= $2 \
|
||||||
ORDER BY (width::float8 * height::float8) * confidence::float8 DESC \
|
ORDER BY (width::float8 * height::float8) * confidence::float8 DESC \
|
||||||
LIMIT 1",
|
LIMIT 1",
|
||||||
fd_table
|
fd_table
|
||||||
))
|
))
|
||||||
.bind(file_uuid)
|
.bind(file_uuid).bind(half_frame)
|
||||||
.fetch_optional(pool).await?
|
.fetch_optional(pool).await?
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user