跳到内容
导航菜单
切换导航
登录
产品
行动
自动化任何工作流
包装
托管和管理包
安全
查找并修复漏洞
代码空间
即时开发环境
GitHub Copilot公司
使用AI编写更好的代码
代码审查
管理代码更改
问题
计划和跟踪工作
讨论
在代码外协作
探索
所有功能
文档
GitHub技能
博客
解决方案
对于
企业
团队
创业公司
教育类
按解决方案
CI/CD和自动化
开发运营
开发安全操作
资源
学习途径
白皮书、电子书、网络研讨会
客户案例
合作伙伴
开放源代码
GitHub赞助商
资助开源开发人员
ReadME项目
GitHub社区文章
存储库
话题
趋向
收藏
企业
企业平台
人工智能驱动的开发者平台
可用附加组件
高级安全
企业级安全功能
GitHub Copilot公司
企业级AI功能
特优支持
企业级全天候支持
定价
搜索或跳转到。。。
搜索代码、存储库、用户、问题、推送请求。。。
搜索
清除
搜索语法提示
提供反馈
我们阅读了每一条反馈,并非常认真地对待您的意见。
包括我的电子邮件地址以便联系我
保存的搜索
使用保存的搜索更快地筛选结果
姓名
查询
要查看所有可用的限定符,请参阅我们的
文档
.
登录
注册
您使用另一个选项卡或窗口登录。
重新加载
刷新会话。
您在另一个选项卡或窗口中注销。
重新加载
刷新会话。
您在另一个选项卡或窗口上切换了帐户。
重新加载
刷新会话。
解除警报
{{消息}}
WordPress(文字出版社)
/
文字印刷-开发
公共镜像
镜像自
git://develop.git.wordpress.org/
通知
您必须登录才能更改通知设置
福克
240公里
星星
230公里
代码
Pull请求
1.6公里
行动
安全
见解
其他导航选项
代码
Pull请求
行动
安全
见解
文件夹
6.5
面包屑
文字印刷-开发
/
型钢混凝土
/
wp包括
/
类avif-info.php
责备
责备
最新提交
历史
历史
781行(736个位置)·28.9 KB
6.5
面包屑
文字印刷-开发
/
型钢混凝土
/
wp包括
/
类avif-info.php
顶部
文件元数据和控件
代码
责备
781行(736个位置)·28.9 KB
原始
1
2
三
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
<?
php(电话)
/**
*版权所有(c)2021,开放媒体联盟。
保留所有权利
*
*此源代码受BSD 2条款许可和
*开放媒体专利许可证联盟1.0。
如果BSD 2条款许可
*没有在LICENSE文件中随此源代码一起分发,您可以
*请访问www.aomedia.org/license/software获取。
如果开放联盟
*媒体专利许可证1.0未与此源代码一起发布在
*PATENTS文件,您可以从www.aomedia.org/license/patent获取。
*
*注:该类来自libavifinfo-
https://aomedia.googlesource.com/libavifinfo网站/
+/参考/标题/主要/avifinfo.php,见f509487。
*当服务器不支持AVIF时,它用作回退来解析AVIF文件,
*主要用于识别图像的宽度和高度。
*
*注意,PHP 8.2添加了对AVIF的本地支持,所以当WordPress需要PHP 8.2时,可以删除这个类。
*/
命名空间
Avifinfo公司
;
常数
已找到
=
0
;
//正确解析输入并检索信息。
常数
未找到
=
1
;
//输入已正确解析,但信息缺失或其他地方。
常数
已截断
=
2
;
//输入正确解析,直到丢失字节才能继续。
常数
已中止
=
三
;
//正确解析输入,直到停止,以避免超时或崩溃。
常数
无效
=
4
;
//输入解析不正确。
常数
最大_尺寸
=
4294967295
;
//不太可能不足以解析AVIF标头。
常数
最大箱数
=
4096
;
//保持理智。
避免超时和内存不足。
常数
最大值(_V)
=
255
;
常数
最大文件数
=
16
;
常数
最大PROPS
=
32
;
常数
最大特征
=
8
;
常数
未定义
=
0
;
//尚未分析值。
/**
*首先读取具有最高有效位的无符号整数。
*
*@param二进制字符串$input必须至少为$num_bytes-long。
*@param int$num_bytes已解析字节数。
*@return int值。
*/
功能
读_比格_印地安语
(
$
输入
,
$
num_bytes(字节数)
) {
如果
(
$
num_bytes(字节数)
==
1
) {
返回
打开包装(
“C”
,
$
输入
) [
1
];
}
其他的
如果
(
$
num_bytes(字节数)
==
2
) {
返回
打开包装(
“n”
,
$
输入
) [
1
];
}
其他的
如果
(
$
num_bytes(字节数)
==
三
) {
$
字节
=拆包(
“C3”
,
$
输入
);
返回
(
$
字节
[
1
] <<
16
) | (
$
字节
[
2
] <<
8
) |
$
字节
[
三
];
}
其他的
{
//$num_bytes是4
//这可能无法在32位系统上读取大于等于2^31的无符号值。
//请参见
https://www.php.net/manual/en/function.inpack.php#106041
返回
打开包装(
“否”
,
$
输入
) [
1
];
}
}
/**
*读取字节并按相同的计数推进流位置。
*
*将从此资源中读取@param流$handle字节。
*@param int$num_bytes读取的字节数。
必须大于0。
*@return binary string | false失败时的原始字节或false。
*/
功能
阅读
(
$
手柄
,
$
num_bytes(字节数)
) {
$
数据
=运费(
$
手柄
,
$
num_bytes(字节数)
);
返回
(
$
数据
!==
虚假的
&&斯特伦(
$
数据
)>=
$
num_bytes(字节数)
)?
$
数据
:
虚假的
;
}
/**
*按给定偏移量推进流位置。
*
*将从此资源中跳过@param流$handle字节。
*@param int$num_bytes跳过的字节数。
可以是0。
*@return bool成功时为True,失败时为false。
*/
//跳过“流”中的“num_bytes”
num_bytes”可以为零。
功能
跳过
(
$
手柄
,
$
num_bytes(字节数)
) {
返回
(f周(
$
手柄
,
$
num_bytes(字节数)
,
搜索CUR(_C)
) ==
0
);
}
//------------------------------------------------------------------------------
//功能被解析为临时属性关联。
班
瓦片
{
//平铺项id<->父项id关联。
公众的
$
tile_item_id
;
公众的
$
父项id
;
}
班
道具
{
//属性索引<->项id关联。
公众的
$
属性索引
;
公众的
$
项目id
;
}
班
尺寸_位置
{
//属性<->具有关联性。
公众的
$
属性索引
;
公众的
$
宽度
;
公众的
$
高度
;
}
班
频道_播放
{
//属性<->具有关联性。
公众的
$
属性索引
;
公众的
$
位_深度
;
公众的
$
num_channels(频道数)
;
}
班
特征
{
公众的
$
有_主要_项目
=
虚假的
;
//如果解析了“pitm”,则为True。
公众的
$
哈斯_阿尔法
=
虚假的
;
//如果分析了alpha“auxC”,则为True。
公众的
$
主项目id
;
公众的
$
主要项目特性
=
阵列
(
//根据以下数据推断。
'宽度'
=>
未定义
,
//像素数。
“高度”
=>
未定义
,
//忽略镜像和旋转。
'位_深度'
=>
未定义
,
//每像素每个通道可能有8、10或12位。
'数字频道'
=>
未定义
//可能有1、2、3或4个通道:
//(1单色或3色)+(0或1 alpha)
);
公众的
$
瓷砖
=
阵列
();
//平铺[]
公众的
$
道具
=
阵列
();
//道具[]
公众的
$
dim_props(dim_props)
=
阵列
();
//维度_属性[]
公众的
$
chan_props(频道_节目)
=
阵列
();
//频道_节目[]
/**
*从存储的内部功能绑定通道的宽度、高度、位深度和数量。
*
*@param int$target_item_id特性将被绑定的项的id。
*@param int$tile_depth在tile-parent关系中搜索的最大递归。
*@return成功时状态为FOUND,失败时状态为NOT_FOUND。
*/
私有的
功能
获取项目功能
(
$
目标项id
,
$
平铺_深度
) {
foreach公司
(
$
这
->
道具
作为
$
支柱
) {
如果
(
$
支柱
->
项目id
!=
$
目标项id
) {
持续
;
}
//检索主要项的宽度和高度(如果尚未检索)。
如果
(
$
目标项id
==
$
这
->
主项目id
&&
(
$
这
->
主要项目特性
[
'宽度'
]==
未定义
||
$
这
->
主要项目特性
[
“高度”
]==
未定义
) ) {
foreach公司
(
$
这
->
dim_props(dim_props)
作为
$
dim_prop(尺寸_位置)
) {
如果
(
$
dim_prop(尺寸_位置)
->
属性索引
!=
$
支柱
->
属性索引
) {
持续
;
}
$
这
->
主要项目特性
[
'宽度'
] =
$
dim_prop(尺寸_位置)
->
宽度
;
$
这
->
主要项目特性
[
“高度”
] =
$
dim_prop(尺寸_位置)
->
高度
;
如果
(
$
这
->
主要项目特性
[
'位_深度'
] !=
未定义
&&
$
这
->
主要项目特性
[
'数字频道'
] !=
未定义
) {
返回
已找到
;
}
打破
;
}
}
//如果没有,检索目标项的位深度和通道数
//已经完成。
如果
(
$
这
->
主要项目特性
[
'位_深度'
]==
未定义
||
$
这
->
主要项目特性
[
'数字频道'
]==
未定义
) {
foreach公司
(
$
这
->
chan_props(频道_节目)
作为
$
chan_prop(频道_节目)
) {
如果
(
$
chan_prop(频道_节目)
->
属性索引
!=
$
支柱
->
属性索引
) {
持续
;
}
$
这
->
主要项目特性
[
'位_深度'
] =
$
chan_prop(频道_节目)
->
位_深度
;
$
这
->
主要项目特性
[
'数字频道'
] =
$
chan_prop(频道_节目)
->
num_channels(频道数)
;
如果
(
$
这
->
主要项目特性
[
'宽度'
] !=
未定义
&&
$
这
->
主要项目特性
[
“高度”
] !=
未定义
) {
返回
已找到
;
}
打破
;
}
}
}
//如果尚未找到tile中的bit_depth和num_channels,请检查它们。
如果
(
$
平铺_深度
<
三
) {
foreach公司
(
$
这
->
瓷砖
作为
$
瓦片
) {
如果
(
$
瓦片
->
父项id
!=
$
目标项id
) {
持续
;
}
$
地位
=
$
这
->
获取项目功能
(
$
瓦片
->
tile_item_id
,
$
平铺_深度
+
1
);
如果
(
$
地位
!=
未找到
) {
返回
$
地位
;
}
}
}
返回
未找到
;
}
/**
*查找主要项的宽度、高度、位深度和通道数。
*
*@return成功时状态为FOUND,失败时状态为NOT_FOUND。
*/
公众的
功能
获取主要项目功能
() {
//如果没有主项ID,则无需执行任何操作。
如果
( !
$
这
->
有_主要_项目
) {
返回
未找到
;
}
//提前退出。
如果
(空(
$
这
->
dim_props(dim_props)
)||空(
$
这
->
chan_props(频道_节目)
) ) {
返回
未找到
;
}
$
地位
=
$
这
->
获取项目功能
(
$
这
->
主项目id
,
/*平铺_深度=*/
0
);
如果
(
$
地位
!=
已找到
) {
返回
$
地位
;
}
//“auxC”是在“ipma”属性之前解析的,因此现在已知它(如果有)。
如果
(
$
这
->
哈斯_阿尔法
) {
++
$
这
->
主要项目特性
[
'数字频道'
];
}
返回
已找到
;
}
}
//------------------------------------------------------------------------------
班
方框
{
公众的
$
大小
;
//以字节为单位。
公众的
$
类型
;
//四个字符。
公众的
$
版本
;
//0或实际版本(如果这是一个完整的框)。
公众的
$
旗帜
;
//0或实际值(如果这是一个完整的框)。
公众的
$
内容_大小
;
//“size”减去标头大小。
/**
*读取框标题。
*
*@param stream$handle将从中分析标头的资源。
*@param int$num_parsed_boxes解析的框总数。
防止超时。
*@param int$num_remaining_bytes应从资源中可用的字节数。
*@return成功时发现状态或失败时出错。
*/
公众的
功能
解析
(
$
手柄
, &
$
解析框数
,
$
剩余字节数
=
最大_尺寸
) {
//参见ISO/IEC 14496-12:2012(E)4.2
$
页眉_大小
=
8
;
//32b尺寸+32b类型的盒子(至少)
如果
(
$
页眉_大小
>
$
剩余字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
手柄
,
8
) ) ) {
返回
已截断
;
}
$
这
->
大小
=read_big_endian(
$
数据
,
4
);
$
这
->
类型
=子项(
$
数据
,
4
,
4
);
//“box->size==1”表示应在box类型之后读取64位大小。
//“box->size==0”表示此框扩展到所有剩余字节。
如果
(
$
这
->
大小
==
1
) {
$
页眉_大小
+=
8
;
如果
(
$
页眉_大小
>
$
剩余字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
手柄
,
8
) ) ) {
返回
已截断
;
}
//如果任何框的大小大于4GB,则停止解析。
如果
(读_big_endian(
$
数据
,
4
)=
0
) {
返回
已中止
;
}
//读取32个最不重要的位。
$
这
->
大小
=read_big_endian(子项(
$
数据
,
4
,
4
),
4
);
}
其他的
如果
(
$
这
->
大小
==
0
) {
$
这
->
大小
=
$
剩余字节数
;
}
如果
(
$
这
->
大小
<
$
页眉_大小
) {
返回
无效
;
}
如果
(
$
这
->
大小
>
$
剩余字节数
) {
返回
无效
;
}
$
has_fullbox_header
=
$
这
->
类型
==
“meta”
||
$
这
->
类型
==
“皮特姆”
||
$
这
->
类型
==
“ipma”
||
$
这
->
类型
==
“ispe”
||
$
这
->
类型
==
“皮西”
||
$
这
->
类型
==
“iref”
||
$
这
->
类型
==
“auxC”
;
如果
(
$
has_fullbox_header
) {
$
页眉_大小
+=
4
;
}
如果
(
$
这
->
大小
<
$
页眉_大小
) {
返回
无效
;
}
$
这
->
内容_大小
=
$
这
->
大小
-
$
页眉_大小
;
//避免超时。
解析的框的最大数量是任意的。
++
$
解析框数
;
如果
(
$
解析框数
>=
最大箱数
) {
返回
已中止
;
}
$
这
->
版本
=
0
;
$
这
->
旗帜
=
0
;
如果
(
$
has_fullbox_header
) {
如果
( !(
$
数据
=已读(
$
手柄
,
4
) ) ) {
返回
已截断
;
}
$
这
->
版本
=read_big_endian(
$
数据
,
1
);
$
这
->
旗帜
=read_big_endian(子项(
$
数据
,
1
,
三
),
三
);
//参见AV1图像文件格式(AVIF)8.1
//在
https://aomediacodec.github.io/av1-avif/#avif
-框(在以下情况下可用
//
https://github.com/AOMediaCodec/av1-avif/pull/170
合并)。
$
可解析(_P)
= (
$
这
->
类型
==
“meta”
&&
$
这
->
版本
<=
0
) ||
(
$
这
->
类型
==
“皮特姆”
&&
$
这
->
版本
<=
1
) ||
(
$
这
->
类型
==
“ipma”
&&
$
这
->
版本
<=
1
) ||
(
$
这
->
类型
==
“ispe”
&&
$
这
->
版本
<=
0
) ||
(
$
这
->
类型
==
“皮西”
&&
$
这
->
版本
<=
0
) ||
(
$
这
->
类型
==
“iref”
&&
$
这
->
版本
<=
1
) ||
(
$
这
->
类型
==
“auxC”
&&
$
这
->
版本
<=
0
);
//不要认为此文件无效,请跳过无法解析的框。
如果
( !
$
可解析(_P)
) {
$
这
->
类型
=
“未知版本”
;
}
}
//print_r($this);//
取消注释以打印所有框。
返回
已找到
;
}
}
//------------------------------------------------------------------------------
班
分析器
{
私有的
$
手柄
;
//输入流。
私有的
$
解析框数
=
0
;
私有的
$
数据被跳过
=
虚假的
;
公众的
$
特征
;
功能
__构造
(
$
手柄
) {
$
这
->
手柄
=
$
手柄
;
$
这
->
特征
=
新的
特征
();
}
/**
*分析“ipco”框。
*
*“ispe”用于宽度和高度,“pixi”和“av1C”用于位深度
*和通道数,“auxC”用于alpha。
*
*@param stream$handle将从中分析框的资源。
*@param int$num_remaining_bytes应从资源中可用的字节数。
*@return成功时发现状态或失败时出错。
*/
私有的
功能
解析ipco
(
$
剩余字节数
) {
$
框_索引
=
1
;
//基于1的索引。
用于迭代属性。
做
{
$
箱
=
新的
方框
();
$
地位
=
$
箱
->
解析
(
$
这
->
手柄
,
$
这
->
解析框数
,
$
剩余字节数
);
如果
(
$
地位
!=
已找到
) {
返回
$
地位
;
}
如果
(
$
箱
->
类型
==
“ispe”
) {
//参见ISO/IEC 23008-12:2017(E)6.5.3.2
如果
(
$
箱
->
内容_大小
<
8
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
8
) ) ) {
返回
已截断
;
}
$
宽度
=read_big_endian(子项(
$
数据
,
0
,
4
),
4
);
$
高度
=read_big_endian(子项(
$
数据
,
4
,
4
),
4
);
如果
(
$
宽度
==
0
||
$
高度
==
0
) {
返回
无效
;
}
如果
(计数(
$
这
->
特征
->
dim_props(dim_props)
) <=
最大特征
&&
$
框_索引
<=
最大值(_V)
) {
$
尺寸_放置_计数
=计数(
$
这
->
特征
->
dim_props(dim_props)
);
$
这
->
特征
->
dim_props(dim_props)
[
$
尺寸_放置_计数
] =
新的
尺寸_位置
();
$
这
->
特征
->
dim_props(dim_props)
[
$
尺寸_放置_计数
]->
属性索引
=
$
框_索引
;
$
这
->
特征
->
dim_props(dim_props)
[
$
尺寸_放置_计数
]->
宽度
=
$
宽度
;
$
这
->
特征
->
dim_props(dim_props)
[
$
尺寸_放置_计数
]->
高度
=
$
高度
;
}
其他的
{
$
这
->
数据被跳过
=
真实的
;
}
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
-
8
) ) {
返回
已截断
;
}
}
其他的
如果
(
$
箱
->
类型
==
“皮西”
) {
//参见ISO/IEC 23008-12:2017(E)6.5.6.2
如果
(
$
箱
->
内容_大小
<
1
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
1
) ) ) {
返回
已截断
;
}
$
num_channels(频道数)
=read_big_endian(
$
数据
,
1
);
如果
(
$
num_channels(频道数)
<
1
) {
返回
无效
;
}
如果
(
$
箱
->
内容_大小
<
1
+
$
num_channels(频道数)
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
1
) ) ) {
返回
已截断
;
}
$
位_深度
=read_big_endian(
$
数据
,
1
);
如果
(
$
位_深度
<
1
) {
返回
无效
;
}
的(
$
我
=
1
;
$
我
<
$
num_channels(频道数)
++
$
我
) {
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
1
) ) ) {
返回
已截断
;
}
//所有通道的位深度应相同。
如果
(读_big_endian(
$
数据
,
1
)=
$
位_深度
) {
返回
无效
;
}
如果
(
$
我
>
32
) {
返回
已中止
;
//讲道理。
}
}
如果
(计数(
$
这
->
特征
->
chan_props(频道_节目)
) <=
最大特征
&&
$
框_索引
<=
最大值(_V)
&&
$
位_深度
<=
最大值(_V)
&&
$
num_channels(频道数)
<=
最大值(_V)
) {
$
chan_prop_count(频道_节目_计数)
=计数(
$
这
->
特征
->
chan_props(频道_节目)
);
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
] =
新的
频道_播放
();
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
]->
属性索引
=
$
框_索引
;
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
]->
位_深度
=
$
位_深度
;
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
]->
num_channels(频道数)
=
$
num_channels(频道数)
;
}
其他的
{
$
这
->
数据被跳过
=
真实的
;
}
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
- (
1
+
$
num_channels(频道数)
) ) ) {
返回
已截断
;
}
}
其他的
如果
(
$
箱
->
类型
==
“av1C”
) {
//参见AV1编解码器ISO媒体文件格式绑定2.3.1
//在
https://aomediacodec.github.io/av1 isobmff/#av1c
//只分析必要的第三个字节。
假设其他的都是有效的。
如果
(
$
箱
->
内容_大小
<
三
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
三
) ) ) {
返回
已截断
;
}
$
字节
=read_big_endian(子项(
$
数据
,
2
,
1
),
1
);
$
高位深度(_B)
= (
$
字节
&
0x40个
)=
0
;
$
十二比特
= (
$
字节
&
0x20个
)=
0
;
$
单色的
= (
$
字节
&
0x10个
)=
0
;
如果
(
$
十二比特
&& !
$
高位深度(_B)
) {
返回
无效
;
}
如果
(计数(
$
这
->
特征
->
chan_props(频道_节目)
) <=
最大特征
&&
$
框_索引
<=
最大值(_V)
) {
$
chan_prop_count(频道_节目_计数)
=计数(
$
这
->
特征
->
chan_props(频道_节目)
);
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
] =
新的
频道_播放
();
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
]->
属性索引
=
$
框_索引
;
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
]->
位_深度
=
$
高位深度(_B)
?
$
十二比特
?
12
:
10
:
8
;
$
这
->
特征
->
chan_props(频道_节目)
[
$
chan_prop_count(频道_节目_计数)
]->
num_channels(频道数)
=
$
单色的
?
1
:
三
;
}
其他的
{
$
这
->
数据被跳过
=
真实的
;
}
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
-
三
) ) {
返回
已截断
;
}
}
其他的
如果
(
$
箱
->
类型
==
“auxC”
) {
//参见AV1图像文件格式(AVIF)4
//在
https://aomediacodec.github.io/av1-avif/#辅助
-图像
$
字母顺序
= "
urn:mpeg:mpegB:cicp:systems:auxiliant:alpha
\0";
$
kAlphaStr长度
=
44
;
//包括终止字符。
如果
(
$
箱
->
内容_大小
>=
$
kAlphaStr长度
) {
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
kAlphaStr长度
) ) ) {
返回
已截断
;
}
如果
(子项(
$
数据
,
0
,
$
kAlphaStr长度
) ==
$
字母顺序
) {
//注意:这不太可能,但有可能是这个阿尔法平面
//不属于主项或磁贴。
忽略此问题。
$
这
->
特征
->
哈斯_阿尔法
=
真实的
;
}
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
-
$
kAlphaStr长度
) ) {
返回
已截断
;
}
}
其他的
{
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
) ) {
返回
已截断
;
}
}
}
其他的
{
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
) ) {
返回
已截断
;
}
}
++
$
框_索引
;
$
剩余字节数
-=
$
箱
->
大小
;
}
虽然
(
$
剩余字节数
>
0
);
返回
未找到
;
}
/**
*分析“iprp”框。
*
*“ipco”框包含通过“ipma”框链接到项目的属性。
*
*@param stream$handle将从中分析框的资源。
*@param int$num_remaining_bytes应从资源中可用的字节数。
*@return成功时发现状态或失败时出错。
*/
私有的
功能
解析iprp
(
$
剩余字节数
) {
做
{
$
箱
=
新的
方框
();
$
地位
=
$
箱
->
解析
(
$
这
->
手柄
,
$
这
->
解析框数
,
$
剩余字节数
);
如果
(
$
地位
!=
已找到
) {
返回
$
地位
;
}
如果
(
$
箱
->
类型
==
“ipco”
) {
$
地位
=
$
这
->
解析ipco
(
$
箱
->
内容_大小
);
如果
(
$
地位
!=
未找到
) {
返回
$
地位
;
}
}
其他的
如果
(
$
箱
->
类型
==
“ipma”
) {
//参见ISO/IEC 23008-12:2017(E)9.3.2
$
读字节数
=
4
;
如果
(
$
箱
->
内容_大小
<
$
读字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
读字节数
) ) ) {
返回
已截断
;
}
$
条目_计数
=read_big_endian(
$
数据
,
4
);
$
id _ num _字节
= (
$
箱
->
版本
<
1
) ?
2
:
4
;
$
索引_字节数
= (
$
箱
->
旗帜
&
1
) ?
2
:
1
;
$
基本_位_任务
= (
$
箱
->
旗帜
&
1
) ?
0x8000个
:
0x80个
;
的(
$
进入
=
0
;
$
进入
<
$
条目_计数
++
$
进入
) {
如果
(
$
进入
>=
最大PROPS
||
计数(
$
这
->
特征
->
支柱
)>=
最大PROPS
) {
$
这
->
数据被跳过
=
真实的
;
打破
;
}
$
读字节数
+=
$
id _ num _字节
+
1
;
如果
(
$
箱
->
内容_大小
<
$
读字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
id _ num _字节
+
1
) ) ) {
返回
已截断
;
}
$
项目id
=read_big_endian(
子(substr)(
$
数据
,
0
,
$
id _ num _字节
),
$
id _ num _字节
);
$
关联_计数
=read_big_endian(
子(substr)(
$
数据
,
$
id _ num _字节
,
1
),
1
);
的(
$
财产
=
0
;
$
财产
<
$
关联_计数
++
$
财产
) {
如果
(
$
财产
>=
最大PROPS
||
计数(
$
这
->
特征
->
道具
)>=
最大PROPS
) {
$
这
->
数据被跳过
=
真实的
;
打破
;
}
$
读字节数
+=
$
索引_字节数
;
如果
(
$
箱
->
内容_大小
<
$
读字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
索引_字节数
) ) ) {
返回
已截断
;
}
$
价值
=read_big_endian(
$
数据
,
$
索引_字节数
);
//$essential=($value&$essential_bit_mask);//
未使用。
$
属性索引
= (
$
价值
& ~
$
基本_位_任务
);
如果
(
$
属性索引
<=
最大值(_V)
&&
$
项目id
<=
最大值(_V)
) {
$
prop_count(项目_计数)
=计数(
$
这
->
特征
->
道具
);
$
这
->
特征
->
道具
[
$
prop_count(项目_计数)
] =
新的
道具
();
$
这
->
特征
->
道具
[
$
prop_count(项目_计数)
]->
属性索引
=
$
属性索引
;
$
这
->
特征
->
道具
[
$
prop_count(项目_计数)
]->
项目id
=
$
项目id
;
}
其他的
{
$
这
->
数据被跳过
=
真实的
;
}
}
如果
(
$
财产
<
$
关联_计数
) {
打破
;
//不要读垃圾。
}
}
//如果所有功能现在都可用,请不要再往下看。
$
地位
=
$
这
->
特征
->
获取主要项目功能
();
如果
(
$
地位
!=
未找到
) {
返回
$
地位
;
}
//主要是如果“data_was_skipped”。
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
-
$
读字节数
) ) {
返回
已截断
;
}
}
其他的
{
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
) ) {
返回
已截断
;
}
}
$
剩余字节数
-=
$
箱
->
大小
;
}
虽然
(
$
剩余字节数
>
0
);
返回
未找到
;
}
/**
*分析“iref”框。
*
*“dimg”框包含瓷砖及其父项之间的链接
*可用于推断主要项的位深度和通道数
*当后者不具有这些属性时。
*
*@param stream$handle将从中分析框的资源。
*@param int$num_remaining_bytes应从资源中可用的字节数。
*@return成功时发现状态或失败时出错。
*/
私有的
功能
解析_引用
(
$
剩余字节数
) {
做
{
$
箱
=
新的
方框
();
$
地位
=
$
箱
->
解析
(
$
这
->
手柄
,
$
这
->
解析框数
,
$
剩余字节数
);
如果
(
$
地位
!=
已找到
) {
返回
$
地位
;
}
如果
(
$
箱
->
类型
==
“变暗”
) {
//参见ISO/IEC 14496-12:2015(E)8.11.12.2
$
字节数
= (
$
箱
->
版本
==
0
) ?
2
:
4
;
$
读字节数
=
$
字节数
+
2
;
如果
(
$
箱
->
内容_大小
<
$
读字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
读字节数
) ) ) {
返回
已截断
;
}
$
来自_item_id
=read_big_endian(
$
数据
,
$
字节数
);
$
参考_计数
=read_big_endian(子项(
$
数据
,
$
字节数
,
2
),
2
);
的(
$
我
=
0
;
$
我
<
$
参考_计数
++
$
我
) {
如果
(
$
我
>=
最大文件数
) {
$
这
->
数据被跳过
=
真实的
;
打破
;
}
$
读字节数
+=
$
字节数
;
如果
(
$
箱
->
内容_大小
<
$
读字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
字节数
) ) ) {
返回
已截断
;
}
$
收件人id
=read_big_endian(
$
数据
,
$
字节数
);
$
平铺_计数
=计数(
$
这
->
特征
->
瓷砖
);
如果
(
$
来自_item_id
<=
最大值(_V)
&&
$
收件人id
<=
最大值(_V)
&&
$
平铺_计数
<
最大文件数
) {
$
这
->
特征
->
瓷砖
[
$
平铺_计数
] =
新的
瓦片
();
$
这
->
特征
->
瓷砖
[
$
平铺_计数
]->
tile_item_id
=
$
收件人id
;
$
这
->
特征
->
瓷砖
[
$
平铺_计数
]->
父项id
=
$
来自_item_id
;
}
其他的
{
$
这
->
数据被跳过
=
真实的
;
}
}
//如果所有功能现在都可用,请不要再往下看。
$
地位
=
$
这
->
特征
->
获取主要项目功能
();
如果
(
$
地位
!=
未找到
) {
返回
$
地位
;
}
//主要是如果“data_was_skipped”。
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
-
$
读字节数
) ) {
返回
已截断
;
}
}
其他的
{
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
) ) {
返回
已截断
;
}
}
$
剩余字节数
-=
$
箱
->
大小
;
}
虽然
(
$
剩余字节数
>
0
);
返回
未找到
;
}
/**
*分析一个“元”框。
*
*它在“pitm”框中查找主项ID并递归到其他框中
*找到它的特征。
*
*@param stream$handle将从中分析框的资源。
*@param int$num_remaining_bytes应从资源中可用的字节数。
*@return成功时发现状态或失败时出错。
*/
私有的
功能
解析元数据
(
$
剩余字节数
) {
做
{
$
箱
=
新的
方框
();
$
地位
=
$
箱
->
解析
(
$
这
->
手柄
,
$
这
->
解析框数
,
$
剩余字节数
);
如果
(
$
地位
!=
已找到
) {
返回
$
地位
;
}
如果
(
$
箱
->
类型
==
“皮特姆”
) {
//参见ISO/IEC 14496-12:2015(E)8.11.4.2
$
字节数
= (
$
箱
->
版本
==
0
) ?
2
:
4
;
如果
(
$
字节数
>
$
剩余字节数
) {
返回
无效
;
}
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
$
字节数
) ) ) {
返回
已截断
;
}
$
主项目id
=read_big_endian(
$
数据
,
$
字节数
);
如果
(
$
主项目id
>
最大值(_V)
) {
返回
已中止
;
}
$
这
->
特征
->
有_主要_项目
=
真实的
;
$
这
->
特征
->
主项目id
=
$
主项目id
;
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
-
$
字节数
) ) {
返回
已截断
;
}
}
其他的
如果
(
$
箱
->
类型
==
“iprp”
) {
$
地位
=
$
这
->
解析iprp
(
$
箱
->
内容_大小
);
如果
(
$
地位
!=
未找到
) {
返回
$
地位
;
}
}
其他的
如果
(
$
箱
->
类型
==
“iref”
) {
$
地位
=
$
这
->
解析_引用
(
$
箱
->
内容_大小
);
如果
(
$
地位
!=
未找到
) {
返回
$
地位
;
}
}
其他的
{
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
) ) {
返回
已截断
;
}
}
$
剩余字节数
-=
$
箱
->
大小
;
}
虽然
(
$
剩余字节数
!=
0
);
//根据ISO/IEC 14496-12:2012(E)8.11.1.1,最多有一个“元”。
返回
无效
;
}
/**
*分析文件流。
*
*通过“ftyp”框检查文件类型。
*
*@return bool如果输入流是AVIF比特流或false,则返回bool True。
*/
公众的
功能
解析类型
() {
$
箱
=
新的
方框
();
$
地位
=
$
箱
->
解析
(
$
这
->
手柄
,
$
这
->
解析框数
);
如果
(
$
地位
!=
已找到
) {
返回
虚假的
;
}
如果
(
$
箱
->
类型
!=
“ftyp”
) {
返回
虚假的
;
}
//重复品牌。
参见ISO/IEC 14496-12:2012(E)4.3.1
如果
(
$
箱
->
内容_大小
<
8
) {
返回
虚假的
;
}
的(
$
我
=
0
;
$
我
+
4
<=
$
箱
->
内容_大小
;
$
我
+=
4
) {
如果
( !(
$
数据
=已读(
$
这
->
手柄
,
4
) ) ) {
返回
虚假的
;
}
如果
(
$
我
==
4
) {
持续
;
//跳过minor_version。
}
如果
(子项(
$
数据
,
0
,
4
) ==
“avif”
||子(substr)(
$
数据
,
0
,
4
) ==
“阿维斯”
) {
返回
跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
- (
$
我
+
4
) );
}
如果
(
$
我
>
32
*
4
) {
返回
虚假的
;
//讲道理。
}
}
返回
虚假的
;
//没有AVIF品牌就没有好的。
}
/**
*分析文件流。
*
*特征从“元”框中提取。
*
*@return bool如果主要项的主要功能被解析或为false,则返回bool True。
*/
公众的
功能
解析文件
() {
$
箱
=
新的
方框
();
虽然
(
$
箱
->
解析
(
$
这
->
手柄
,
$
这
->
解析框数
) ==
已找到
) {
如果
(
$
箱
->
类型
===
“meta”
) {
如果
(
$
这
->
解析元数据
(
$
箱
->
内容_大小
)=
已找到
) {
返回
虚假的
;
}
返回
真实的
;
}
如果
(!跳过(
$
这
->
手柄
,
$
箱
->
内容_大小
) ) {
返回
虚假的
;
}
}
返回
虚假的
;
//没有“元”就没有好处。
}
}
此时无法执行该操作。