Mobile UI pass + serve comment sync
Browse filesLatency/fps readouts always visible on mobile; panel titles icon-only
(fixes clipped source toggle); drop 40/36 fps tiers; prompt box
autosizes up to 6 lines (12px on mobile, matching the PE block).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- static/index.html +13 -10
- xvideo/serving/serve_joyomni_streaming.py +1 -2
static/index.html
CHANGED
|
@@ -90,7 +90,7 @@
|
|
| 90 |
.team-strip .team-thumbs { display: flex; gap: 8px; min-width: 0; overflow-x: auto; }
|
| 91 |
.team-strip img { height: 46px; width: auto; border-radius: 8px; border: 1px solid var(--line); cursor: zoom-in; background: var(--media-bg); flex: 0 0 auto; }
|
| 92 |
.team-strip img:hover { border-color: var(--accent); }
|
| 93 |
-
.cmd-input { flex: 1 1 auto; min-width: 0; border: none; outline: none; background: transparent; resize: none; font: inherit; font-size: 15px; color: var(--text); line-height: 1.4; max-height:
|
| 94 |
.cmd-input::placeholder { color: #b6b6b0; }
|
| 95 |
.send-fab { flex: 0 0 auto; width: 46px; height: 46px; border-radius: 50%; border: none; cursor: pointer; background: var(--accent); color: #fff; font-size: 0; display: inline-flex; align-items: center; justify-content: center; }
|
| 96 |
.send-fab::before { content: "\2191"; font-size: 20px; font-weight: 700; line-height: 1; }
|
|
@@ -167,11 +167,9 @@
|
|
| 167 |
.cmd-foot .kvreset-field { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; width: 100%; }
|
| 168 |
.qtier { flex-wrap: wrap; }
|
| 169 |
.qtier button { padding: 7px 12px; }
|
| 170 |
-
/*
|
| 171 |
-
.
|
| 172 |
-
|
| 173 |
-
body:has(#profileTimings:checked) .latency-row #dispLatency,
|
| 174 |
-
body:has(#profileTimings:checked) .latency-row #fpsReadout { display: inline; }
|
| 175 |
.team-strip { flex-wrap: wrap; padding: 0 12px 10px; }
|
| 176 |
.team-strip .team-thumbs { width: 100%; display: grid; grid-template-columns: repeat(2, 1fr); }
|
| 177 |
.team-strip .team-thumbs img:first-child { grid-column: 1 / -1; }
|
|
@@ -291,8 +289,6 @@
|
|
| 291 |
<span class="kvreset-field keep-min">
|
| 292 |
<span data-i18n="frame_speed">送帧速度</span>
|
| 293 |
<span id="fpsTier" class="qtier">
|
| 294 |
-
<button type="button" data-fps="40">40</button>
|
| 295 |
-
<button type="button" data-fps="36">36</button>
|
| 296 |
<button type="button" data-fps="32">32</button>
|
| 297 |
<button type="button" data-fps="30">30</button>
|
| 298 |
<button type="button" data-fps="28">28</button>
|
|
@@ -2270,9 +2266,16 @@ const PROMPT_GROUPS = [
|
|
| 2270 |
},
|
| 2271 |
];
|
| 2272 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2273 |
function applyCaseSelection(item, group) {
|
| 2274 |
-
|
| 2275 |
-
|
| 2276 |
if (item.ref && REF_IMAGES && REF_IMAGES[item.ref]) {
|
| 2277 |
const el = document.getElementById("refImage");
|
| 2278 |
if (el) el.value = "";
|
|
|
|
| 90 |
.team-strip .team-thumbs { display: flex; gap: 8px; min-width: 0; overflow-x: auto; }
|
| 91 |
.team-strip img { height: 46px; width: auto; border-radius: 8px; border: 1px solid var(--line); cursor: zoom-in; background: var(--media-bg); flex: 0 0 auto; }
|
| 92 |
.team-strip img:hover { border-color: var(--accent); }
|
| 93 |
+
.cmd-input { flex: 1 1 auto; min-width: 0; border: none; outline: none; background: transparent; resize: none; font: inherit; font-size: 15px; color: var(--text); line-height: 1.4; max-height: 150px; padding: 12px 4px; }
|
| 94 |
.cmd-input::placeholder { color: #b6b6b0; }
|
| 95 |
.send-fab { flex: 0 0 auto; width: 46px; height: 46px; border-radius: 50%; border: none; cursor: pointer; background: var(--accent); color: #fff; font-size: 0; display: inline-flex; align-items: center; justify-content: center; }
|
| 96 |
.send-fab::before { content: "\2191"; font-size: 20px; font-weight: 700; line-height: 1; }
|
|
|
|
| 167 |
.cmd-foot .kvreset-field { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; width: 100%; }
|
| 168 |
.qtier { flex-wrap: wrap; }
|
| 169 |
.qtier button { padding: 7px 12px; }
|
| 170 |
+
/* panel titles go icon-only so 摄像头/MP4 fits the narrow head */
|
| 171 |
+
.vpanel-head .vp-title span[data-i18n] { display: none; }
|
| 172 |
+
.cmd-input { font-size: 12px; max-height: 125px; }
|
|
|
|
|
|
|
| 173 |
.team-strip { flex-wrap: wrap; padding: 0 12px 10px; }
|
| 174 |
.team-strip .team-thumbs { width: 100%; display: grid; grid-template-columns: repeat(2, 1fr); }
|
| 175 |
.team-strip .team-thumbs img:first-child { grid-column: 1 / -1; }
|
|
|
|
| 289 |
<span class="kvreset-field keep-min">
|
| 290 |
<span data-i18n="frame_speed">送帧速度</span>
|
| 291 |
<span id="fpsTier" class="qtier">
|
|
|
|
|
|
|
| 292 |
<button type="button" data-fps="32">32</button>
|
| 293 |
<button type="button" data-fps="30">30</button>
|
| 294 |
<button type="button" data-fps="28">28</button>
|
|
|
|
| 2266 |
},
|
| 2267 |
];
|
| 2268 |
|
| 2269 |
+
const promptBox = document.getElementById("prompt");
|
| 2270 |
+
function autosizePrompt() {
|
| 2271 |
+
promptBox.style.height = "auto";
|
| 2272 |
+
promptBox.style.height = promptBox.scrollHeight + "px";
|
| 2273 |
+
}
|
| 2274 |
+
promptBox.addEventListener("input", autosizePrompt);
|
| 2275 |
+
|
| 2276 |
function applyCaseSelection(item, group) {
|
| 2277 |
+
promptBox.value = sceneField(item, "text");
|
| 2278 |
+
autosizePrompt();
|
| 2279 |
if (item.ref && REF_IMAGES && REF_IMAGES[item.ref]) {
|
| 2280 |
const el = document.getElementById("refImage");
|
| 2281 |
if (el) el.value = "";
|
xvideo/serving/serve_joyomni_streaming.py
CHANGED
|
@@ -197,8 +197,7 @@ class _H264Ingest:
|
|
| 197 |
import numpy as np
|
| 198 |
|
| 199 |
self._dec = av.CodecContext.create("h264", "r")
|
| 200 |
-
#
|
| 201 |
-
# with the exact linear map A709 @ inv(A601).
|
| 202 |
self._bt601_to_bt709 = np.array([[1.086529, -0.072448, -0.014080],
|
| 203 |
[0.096451, 0.844939, 0.058610],
|
| 204 |
[-0.014082, -0.027645, 1.041727]])
|
|
|
|
| 197 |
import numpy as np
|
| 198 |
|
| 199 |
self._dec = av.CodecContext.create("h264", "r")
|
| 200 |
+
# Chrome uplink is BT.709/tv, cv2's I420 path is BT.601: exact fix = A709 @ inv(A601).
|
|
|
|
| 201 |
self._bt601_to_bt709 = np.array([[1.086529, -0.072448, -0.014080],
|
| 202 |
[0.096451, 0.844939, 0.058610],
|
| 203 |
[-0.014082, -0.027645, 1.041727]])
|