@video-supply/dahua-player 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -713,6 +713,64 @@ var PlayerAdapter = class {
713
713
  }
714
714
  };
715
715
 
716
+ // src/sdk/PlaybackTime.ts
717
+ function extractPlaybackTimeMsFromFrameInfo(data) {
718
+ const vf = data && typeof data === "object" ? data.videoFrameInfo : void 0;
719
+ const utcMsRaw = vf && typeof vf === "object" ? vf.utcTimeStamp : void 0;
720
+ const secRaw = data && typeof data === "object" ? data.timeStamp : void 0;
721
+ const utcMs = typeof utcMsRaw === "number" && Number.isFinite(utcMsRaw) ? Math.floor(utcMsRaw) : null;
722
+ const sec = typeof secRaw === "number" && Number.isFinite(secRaw) ? Math.floor(secRaw) : null;
723
+ const baseMs = utcMs != null ? utcMs : sec != null ? sec * 1e3 : null;
724
+ if (baseMs == null) return null;
725
+ const shouldApplySubMs = utcMs == null ? true : utcMs % 1e3 === 0;
726
+ if (!shouldApplySubMs) return baseMs;
727
+ const nTimeStampRaw = vf && typeof vf === "object" ? vf.nTimeStamp : void 0;
728
+ if (typeof nTimeStampRaw !== "number" || !Number.isFinite(nTimeStampRaw)) return baseMs;
729
+ const sub = (Math.floor(nTimeStampRaw) % 1e3 + 1e3) % 1e3;
730
+ return baseMs + sub;
731
+ }
732
+ function buildPlaybackTimePayloadFromFrameInfo(data) {
733
+ var _a;
734
+ const timeMs = extractPlaybackTimeMsFromFrameInfo(data);
735
+ if (timeMs == null) return null;
736
+ const secRaw = data && typeof data === "object" ? data.timeStamp : void 0;
737
+ const timeSec = typeof secRaw === "number" && Number.isFinite(secRaw) ? Math.floor(secRaw) : Math.floor(timeMs / 1e3);
738
+ const idxRaw = data && typeof data === "object" ? data.selectIndex : void 0;
739
+ const windowIndex = typeof idxRaw === "number" && Number.isFinite(idxRaw) ? Math.floor(idxRaw) : void 0;
740
+ const channelCodeRaw = data && typeof data === "object" ? (_a = data.channelData) == null ? void 0 : _a.channelCode : void 0;
741
+ const channelCode = typeof channelCodeRaw === "string" ? channelCodeRaw : void 0;
742
+ return { timeMs, timeSec, windowIndex, channelCode, raw: data };
743
+ }
744
+
745
+ // src/sdk/DateTime.ts
746
+ function parseDateTimeToMs(datetime) {
747
+ if (typeof datetime === "number") {
748
+ if (!Number.isFinite(datetime)) return NaN;
749
+ return Math.floor(datetime > 1e12 ? datetime : datetime * 1e3);
750
+ }
751
+ if (datetime instanceof Date) {
752
+ const ms2 = datetime.getTime();
753
+ return Number.isFinite(ms2) ? Math.floor(ms2) : NaN;
754
+ }
755
+ const raw = (datetime || "").trim();
756
+ if (!raw) return NaN;
757
+ const v = raw.includes("T") ? raw : raw.replace(" ", "T");
758
+ const m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/.exec(v);
759
+ if (!m) {
760
+ const ms2 = new Date(v).getTime();
761
+ return Number.isFinite(ms2) ? Math.floor(ms2) : NaN;
762
+ }
763
+ const y = Number(m[1]);
764
+ const mon = Number(m[2]);
765
+ const d = Number(m[3]);
766
+ const hh = Number(m[4]);
767
+ const mm = Number(m[5]);
768
+ const ss = Number(m[6]);
769
+ const dt = new Date(y, mon - 1, d, hh, mm, ss, 0);
770
+ const ms = dt.getTime();
771
+ return Number.isFinite(ms) ? Math.floor(ms) : NaN;
772
+ }
773
+
716
774
  // src/DahuaPlayer.ts
717
775
  function normalizeStaticPath(path) {
718
776
  const raw = (path || "").trim();
@@ -884,6 +942,10 @@ var DahuaPlayer = class {
884
942
  };
885
943
  let readyReject = () => {
886
944
  };
945
+ let lastPlaybackTimeMs = null;
946
+ let lastEmittedPlaybackTimeSec = null;
947
+ const jumpWaiters = [];
948
+ let jumpWaiterId = 0;
887
949
  const safeOnError = (e) => {
888
950
  var _a2;
889
951
  try {
@@ -892,6 +954,29 @@ var DahuaPlayer = class {
892
954
  }
893
955
  emit(listeners, "error", e);
894
956
  };
957
+ const createDestroyedError = () => new DahuaPlayerError({
958
+ code: "DESTROYED" /* DESTROYED */,
959
+ message: "destroyed",
960
+ userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
961
+ });
962
+ const createNotReadyError = () => new DahuaPlayerError({
963
+ code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
964
+ message: "player not ready",
965
+ userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
966
+ });
967
+ const requireAdapter = () => {
968
+ if (destroyed) {
969
+ const err = createDestroyedError();
970
+ safeOnError(err);
971
+ throw err;
972
+ }
973
+ if (!adapter) {
974
+ const err = createNotReadyError();
975
+ safeOnError(err);
976
+ throw err;
977
+ }
978
+ return adapter;
979
+ };
895
980
  const tryAutoPlay = () => {
896
981
  if (!autoPlay) return;
897
982
  if (mode === "real") {
@@ -965,11 +1050,41 @@ var DahuaPlayer = class {
965
1050
  playerOptions: opts.playerOptions,
966
1051
  debug: opts.debug,
967
1052
  onMessage: (type, data) => {
968
- var _a3;
1053
+ var _a3, _b2, _c2;
969
1054
  try {
970
1055
  (_a3 = opts.onSdkMessage) == null ? void 0 : _a3.call(opts, type, data);
971
1056
  } catch {
972
1057
  }
1058
+ if (type === "getVideoFrameInfo") {
1059
+ const payload = buildPlaybackTimePayloadFromFrameInfo(data);
1060
+ if (!payload) return;
1061
+ lastPlaybackTimeMs = payload.timeMs;
1062
+ if (payload.timeSec !== lastEmittedPlaybackTimeSec) {
1063
+ lastEmittedPlaybackTimeSec = payload.timeSec;
1064
+ try {
1065
+ (_b2 = opts.onPlaybackTime) == null ? void 0 : _b2.call(opts, payload);
1066
+ } catch {
1067
+ }
1068
+ emit(listeners, "playbackTime", payload);
1069
+ }
1070
+ if (jumpWaiters.length > 0) {
1071
+ for (let i = jumpWaiters.length - 1; i >= 0; i--) {
1072
+ const w = jumpWaiters[i];
1073
+ if (typeof w.index === "number" && typeof payload.windowIndex === "number" && w.index !== payload.windowIndex) {
1074
+ continue;
1075
+ }
1076
+ if (Math.abs(payload.timeMs - w.targetMs) <= w.toleranceMs) {
1077
+ jumpWaiters.splice(i, 1);
1078
+ clearTimeout(w.timeoutTimer);
1079
+ try {
1080
+ (_c2 = w.onDone) == null ? void 0 : _c2.call(w, payload);
1081
+ } catch {
1082
+ }
1083
+ w.resolve(payload);
1084
+ }
1085
+ }
1086
+ }
1087
+ }
973
1088
  },
974
1089
  emit: (event, payload) => {
975
1090
  var _a3, _b2, _c2;
@@ -1006,6 +1121,13 @@ var DahuaPlayer = class {
1006
1121
  }
1007
1122
  if (event === "error") {
1008
1123
  const msg = formatUserMessage(payload, "\u64AD\u653E\u5931\u8D25");
1124
+ if (jumpWaiters.length > 0) {
1125
+ const waiters = jumpWaiters.splice(0, jumpWaiters.length);
1126
+ for (const w of waiters) {
1127
+ clearTimeout(w.timeoutTimer);
1128
+ w.reject(payload);
1129
+ }
1130
+ }
1009
1131
  if (payload instanceof DahuaPlayerError) {
1010
1132
  const initCodes = /* @__PURE__ */ new Set([
1011
1133
  "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
@@ -1037,6 +1159,7 @@ var DahuaPlayer = class {
1037
1159
  readyReject(err);
1038
1160
  }
1039
1161
  })();
1162
+ const getPlaybackTimeMs = () => lastPlaybackTimeMs;
1040
1163
  const instance = {
1041
1164
  id,
1042
1165
  ready,
@@ -1049,6 +1172,7 @@ var DahuaPlayer = class {
1049
1172
  if (!adapter) return;
1050
1173
  adapter.pause();
1051
1174
  },
1175
+ getPlaybackTimeMs,
1052
1176
  /**
1053
1177
  * 销毁播放器实例并释放资源。
1054
1178
  *
@@ -1062,6 +1186,14 @@ var DahuaPlayer = class {
1062
1186
  if (destroyed) return;
1063
1187
  destroyed = true;
1064
1188
  clearTimeout(readyTimer);
1189
+ if (jumpWaiters.length > 0) {
1190
+ const waiters = jumpWaiters.splice(0, jumpWaiters.length);
1191
+ const err = createDestroyedError();
1192
+ for (const w of waiters) {
1193
+ clearTimeout(w.timeoutTimer);
1194
+ w.reject(err);
1195
+ }
1196
+ }
1065
1197
  if (transientOverlayTimer) {
1066
1198
  clearTimeout(transientOverlayTimer);
1067
1199
  transientOverlayTimer = null;
@@ -1102,26 +1234,9 @@ var DahuaPlayer = class {
1102
1234
  sdk: {
1103
1235
  getRaw: () => adapter == null ? void 0 : adapter.getRaw(),
1104
1236
  callRaw: (method, ...args) => {
1105
- if (destroyed) {
1106
- const err = new DahuaPlayerError({
1107
- code: "DESTROYED" /* DESTROYED */,
1108
- message: "destroyed",
1109
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1110
- });
1111
- safeOnError(err);
1112
- throw err;
1113
- }
1114
- if (!adapter) {
1115
- const err = new DahuaPlayerError({
1116
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1117
- message: "player not ready",
1118
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1119
- });
1120
- safeOnError(err);
1121
- throw err;
1122
- }
1237
+ const ad = requireAdapter();
1123
1238
  try {
1124
- return adapter.callRaw(method, ...args);
1239
+ return ad.callRaw(method, ...args);
1125
1240
  } catch (e) {
1126
1241
  const err = toDahuaError(e, {
1127
1242
  code: "PLAY_FAILED" /* PLAY_FAILED */,
@@ -1133,27 +1248,10 @@ var DahuaPlayer = class {
1133
1248
  }
1134
1249
  },
1135
1250
  playRealVideo: (opt) => {
1136
- if (destroyed) {
1137
- const err = new DahuaPlayerError({
1138
- code: "DESTROYED" /* DESTROYED */,
1139
- message: "destroyed",
1140
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1141
- });
1142
- safeOnError(err);
1143
- throw err;
1144
- }
1145
- if (!adapter) {
1146
- const err = new DahuaPlayerError({
1147
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1148
- message: "player not ready",
1149
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1150
- });
1151
- safeOnError(err);
1152
- throw err;
1153
- }
1251
+ const ad = requireAdapter();
1154
1252
  showLoading("\u52A0\u8F7D\u89C6\u9891\u4E2D\u2026");
1155
1253
  try {
1156
- adapter.playRealVideo(opt);
1254
+ ad.playRealVideo(opt);
1157
1255
  } catch (e) {
1158
1256
  setLoading(false);
1159
1257
  const err = toDahuaError(e, {
@@ -1166,27 +1264,10 @@ var DahuaPlayer = class {
1166
1264
  }
1167
1265
  },
1168
1266
  playRecordVideo: (opt) => {
1169
- if (destroyed) {
1170
- const err = new DahuaPlayerError({
1171
- code: "DESTROYED" /* DESTROYED */,
1172
- message: "destroyed",
1173
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1174
- });
1175
- safeOnError(err);
1176
- throw err;
1177
- }
1178
- if (!adapter) {
1179
- const err = new DahuaPlayerError({
1180
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1181
- message: "player not ready",
1182
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1183
- });
1184
- safeOnError(err);
1185
- throw err;
1186
- }
1267
+ const ad = requireAdapter();
1187
1268
  showLoading("\u52A0\u8F7D\u5F55\u50CF\u4E2D\u2026");
1188
1269
  try {
1189
- adapter.playRecordVideo(opt);
1270
+ ad.playRecordVideo(opt);
1190
1271
  } catch (e) {
1191
1272
  setLoading(false);
1192
1273
  const err = toDahuaError(e, {
@@ -1202,26 +1283,9 @@ var DahuaPlayer = class {
1202
1283
  play: (windowIndex) => adapter == null ? void 0 : adapter.playWindow(windowIndex),
1203
1284
  close: (windowIndex) => adapter == null ? void 0 : adapter.closeWindow(windowIndex),
1204
1285
  setPlayerNum: (n) => {
1205
- if (destroyed) {
1206
- const err = new DahuaPlayerError({
1207
- code: "DESTROYED" /* DESTROYED */,
1208
- message: "destroyed",
1209
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1210
- });
1211
- safeOnError(err);
1212
- throw err;
1213
- }
1214
- if (!adapter) {
1215
- const err = new DahuaPlayerError({
1216
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1217
- message: "player not ready",
1218
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1219
- });
1220
- safeOnError(err);
1221
- throw err;
1222
- }
1286
+ const ad = requireAdapter();
1223
1287
  try {
1224
- adapter.setPlayerNum(n);
1288
+ ad.setPlayerNum(n);
1225
1289
  } catch (e) {
1226
1290
  const err = toDahuaError(e, {
1227
1291
  code: "PLAY_FAILED" /* PLAY_FAILED */,
@@ -1233,28 +1297,84 @@ var DahuaPlayer = class {
1233
1297
  }
1234
1298
  },
1235
1299
  jumpPlayByDateTime: (datetime, index) => {
1236
- if (destroyed) {
1237
- const err = new DahuaPlayerError({
1238
- code: "DESTROYED" /* DESTROYED */,
1239
- message: "destroyed",
1240
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1300
+ const ad = requireAdapter();
1301
+ showLoading("\u8DF3\u8F6C\u4E2D\u2026");
1302
+ try {
1303
+ ad.jumpPlayByDateTime(datetime, index);
1304
+ } catch (e) {
1305
+ setLoading(false);
1306
+ const err = toDahuaError(e, {
1307
+ code: "PLAY_FAILED" /* PLAY_FAILED */,
1308
+ message: "jumpPlayByDateTime failed",
1309
+ userMessage: "\u5F55\u50CF\u8DF3\u8F6C\u64AD\u653E\u5931\u8D25"
1241
1310
  });
1242
1311
  safeOnError(err);
1243
1312
  throw err;
1244
1313
  }
1245
- if (!adapter) {
1314
+ },
1315
+ jumpPlayByDateTimeAsync: (datetime, index, options2) => {
1316
+ let ad;
1317
+ try {
1318
+ ad = requireAdapter();
1319
+ } catch (e) {
1320
+ return Promise.reject(e);
1321
+ }
1322
+ const onDone = typeof options2 === "function" ? options2 : options2 == null ? void 0 : options2.onDone;
1323
+ const timeoutMs = typeof options2 === "object" && options2 && Number.isFinite(options2.timeoutMs) ? Math.floor(Number(options2.timeoutMs)) : 3e4;
1324
+ const toleranceMs = typeof options2 === "object" && options2 && Number.isFinite(options2.toleranceMs) ? Math.floor(Number(options2.toleranceMs)) : 1500;
1325
+ const targetMs = parseDateTimeToMs(datetime);
1326
+ if (!Number.isFinite(targetMs)) {
1246
1327
  const err = new DahuaPlayerError({
1247
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1248
- message: "player not ready",
1249
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1328
+ code: "PLAY_FAILED" /* PLAY_FAILED */,
1329
+ message: "invalid datetime",
1330
+ userMessage: "\u8DF3\u8F6C\u65F6\u95F4\u683C\u5F0F\u4E0D\u5408\u6CD5",
1331
+ cause: { datetime }
1250
1332
  });
1251
1333
  safeOnError(err);
1252
- throw err;
1334
+ return Promise.reject(err);
1253
1335
  }
1254
1336
  showLoading("\u8DF3\u8F6C\u4E2D\u2026");
1337
+ const idx = typeof index === "number" ? Math.floor(index) : void 0;
1338
+ const id2 = ++jumpWaiterId;
1339
+ const p = new Promise((resolve, reject) => {
1340
+ const timeoutTimer = setTimeout(() => {
1341
+ const at = jumpWaiters.findIndex((w) => w.id === id2);
1342
+ if (at >= 0) jumpWaiters.splice(at, 1);
1343
+ setLoading(false);
1344
+ const err = new DahuaPlayerError({
1345
+ code: "PLAY_FAILED" /* PLAY_FAILED */,
1346
+ message: "jumpPlayByDateTimeAsync timeout",
1347
+ userMessage: "\u5F55\u50CF\u8DF3\u8F6C\u8D85\u65F6",
1348
+ cause: { timeoutMs, datetime, index: idx }
1349
+ });
1350
+ safeOnError(err);
1351
+ reject(err);
1352
+ }, Math.max(0, timeoutMs));
1353
+ jumpWaiters.push({
1354
+ id: id2,
1355
+ targetMs,
1356
+ toleranceMs: Math.max(0, toleranceMs),
1357
+ index: idx,
1358
+ timeoutTimer,
1359
+ onDone,
1360
+ resolve: (payload) => {
1361
+ setLoading(false);
1362
+ resolve(payload);
1363
+ },
1364
+ reject: (e) => {
1365
+ setLoading(false);
1366
+ reject(e);
1367
+ }
1368
+ });
1369
+ });
1255
1370
  try {
1256
- adapter.jumpPlayByDateTime(datetime, index);
1371
+ ad.jumpPlayByDateTime(datetime, idx);
1257
1372
  } catch (e) {
1373
+ const at = jumpWaiters.findIndex((w) => w.id === id2);
1374
+ if (at >= 0) {
1375
+ const w = jumpWaiters.splice(at, 1)[0];
1376
+ clearTimeout(w.timeoutTimer);
1377
+ }
1258
1378
  setLoading(false);
1259
1379
  const err = toDahuaError(e, {
1260
1380
  code: "PLAY_FAILED" /* PLAY_FAILED */,
@@ -1262,30 +1382,14 @@ var DahuaPlayer = class {
1262
1382
  userMessage: "\u5F55\u50CF\u8DF3\u8F6C\u64AD\u653E\u5931\u8D25"
1263
1383
  });
1264
1384
  safeOnError(err);
1265
- throw err;
1385
+ return Promise.reject(err);
1266
1386
  }
1387
+ return p;
1267
1388
  },
1268
1389
  playSpeed: (speed, index) => {
1269
- if (destroyed) {
1270
- const err = new DahuaPlayerError({
1271
- code: "DESTROYED" /* DESTROYED */,
1272
- message: "destroyed",
1273
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1274
- });
1275
- safeOnError(err);
1276
- throw err;
1277
- }
1278
- if (!adapter) {
1279
- const err = new DahuaPlayerError({
1280
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1281
- message: "player not ready",
1282
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1283
- });
1284
- safeOnError(err);
1285
- throw err;
1286
- }
1390
+ const ad = requireAdapter();
1287
1391
  try {
1288
- adapter.playSpeed(speed, index);
1392
+ ad.playSpeed(speed, index);
1289
1393
  } catch (e) {
1290
1394
  const err = toDahuaError(e, {
1291
1395
  code: "PLAY_FAILED" /* PLAY_FAILED */,
@@ -1297,26 +1401,9 @@ var DahuaPlayer = class {
1297
1401
  }
1298
1402
  },
1299
1403
  setFullScreen: () => {
1300
- if (destroyed) {
1301
- const err = new DahuaPlayerError({
1302
- code: "DESTROYED" /* DESTROYED */,
1303
- message: "destroyed",
1304
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1305
- });
1306
- safeOnError(err);
1307
- throw err;
1308
- }
1309
- if (!adapter) {
1310
- const err = new DahuaPlayerError({
1311
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1312
- message: "player not ready",
1313
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1314
- });
1315
- safeOnError(err);
1316
- throw err;
1317
- }
1404
+ const ad = requireAdapter();
1318
1405
  try {
1319
- adapter.setFullScreen();
1406
+ ad.setFullScreen();
1320
1407
  return;
1321
1408
  } catch {
1322
1409
  }
@@ -1334,26 +1421,9 @@ var DahuaPlayer = class {
1334
1421
  void req.call(el);
1335
1422
  },
1336
1423
  setExitFullScreen: () => {
1337
- if (destroyed) {
1338
- const err2 = new DahuaPlayerError({
1339
- code: "DESTROYED" /* DESTROYED */,
1340
- message: "destroyed",
1341
- userMessage: "\u64AD\u653E\u5668\u5DF2\u9500\u6BC1"
1342
- });
1343
- safeOnError(err2);
1344
- throw err2;
1345
- }
1346
- if (!adapter) {
1347
- const err2 = new DahuaPlayerError({
1348
- code: "SDK_INIT_FAILED" /* SDK_INIT_FAILED */,
1349
- message: "player not ready",
1350
- userMessage: "\u64AD\u653E\u5668\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7B49\u5F85 ready \u540E\u518D\u8C03\u7528"
1351
- });
1352
- safeOnError(err2);
1353
- throw err2;
1354
- }
1424
+ const ad = requireAdapter();
1355
1425
  try {
1356
- adapter.setExitFullScreen();
1426
+ ad.setExitFullScreen();
1357
1427
  return;
1358
1428
  } catch {
1359
1429
  }