1package matchers
2
3var (
4	TypeMp4  = newType("mp4", "video/mp4")
5	TypeM4v  = newType("m4v", "video/x-m4v")
6	TypeMkv  = newType("mkv", "video/x-matroska")
7	TypeWebm = newType("webm", "video/webm")
8	TypeMov  = newType("mov", "video/quicktime")
9	TypeAvi  = newType("avi", "video/x-msvideo")
10	TypeWmv  = newType("wmv", "video/x-ms-wmv")
11	TypeMpeg = newType("mpg", "video/mpeg")
12	TypeFlv  = newType("flv", "video/x-flv")
13)
14
15var Video = Map{
16	TypeMp4:  Mp4,
17	TypeM4v:  M4v,
18	TypeMkv:  Mkv,
19	TypeWebm: Webm,
20	TypeMov:  Mov,
21	TypeAvi:  Avi,
22	TypeWmv:  Wmv,
23	TypeMpeg: Mpeg,
24	TypeFlv:  Flv,
25}
26
27func M4v(buf []byte) bool {
28	return len(buf) > 10 &&
29		buf[0] == 0x0 && buf[1] == 0x0 &&
30		buf[2] == 0x0 && buf[3] == 0x1C &&
31		buf[4] == 0x66 && buf[5] == 0x74 &&
32		buf[6] == 0x79 && buf[7] == 0x70 &&
33		buf[8] == 0x4D && buf[9] == 0x34 &&
34		buf[10] == 0x56
35}
36
37func Mkv(buf []byte) bool {
38	return (len(buf) > 15 &&
39		buf[0] == 0x1A && buf[1] == 0x45 &&
40		buf[2] == 0xDF && buf[3] == 0xA3 &&
41		buf[4] == 0x93 && buf[5] == 0x42 &&
42		buf[6] == 0x82 && buf[7] == 0x88 &&
43		buf[8] == 0x6D && buf[9] == 0x61 &&
44		buf[10] == 0x74 && buf[11] == 0x72 &&
45		buf[12] == 0x6F && buf[13] == 0x73 &&
46		buf[14] == 0x6B && buf[15] == 0x61) ||
47		(len(buf) > 38 &&
48			buf[31] == 0x6D && buf[32] == 0x61 &&
49			buf[33] == 0x74 && buf[34] == 0x72 &&
50			buf[35] == 0x6f && buf[36] == 0x73 &&
51			buf[37] == 0x6B && buf[38] == 0x61)
52}
53
54func Webm(buf []byte) bool {
55	return len(buf) > 3 &&
56		buf[0] == 0x1A && buf[1] == 0x45 &&
57		buf[2] == 0xDF && buf[3] == 0xA3
58}
59
60func Mov(buf []byte) bool {
61	return len(buf) > 7 &&
62		buf[0] == 0x0 && buf[1] == 0x0 &&
63		buf[2] == 0x0 && buf[3] == 0x14 &&
64		buf[4] == 0x66 && buf[5] == 0x74 &&
65		buf[6] == 0x79 && buf[7] == 0x70
66}
67
68func Avi(buf []byte) bool {
69	return len(buf) > 10 &&
70		buf[0] == 0x52 && buf[1] == 0x49 &&
71		buf[2] == 0x46 && buf[3] == 0x46 &&
72		buf[8] == 0x41 && buf[9] == 0x56 &&
73		buf[10] == 0x49
74}
75
76func Wmv(buf []byte) bool {
77	return len(buf) > 9 &&
78		buf[0] == 0x30 && buf[1] == 0x26 &&
79		buf[2] == 0xB2 && buf[3] == 0x75 &&
80		buf[4] == 0x8E && buf[5] == 0x66 &&
81		buf[6] == 0xCF && buf[7] == 0x11 &&
82		buf[8] == 0xA6 && buf[9] == 0xD9
83}
84
85func Mpeg(buf []byte) bool {
86	return len(buf) > 3 &&
87		buf[0] == 0x0 && buf[1] == 0x0 &&
88		buf[2] == 0x1 && buf[3] >= 0xb0 &&
89		buf[3] <= 0xbf
90}
91
92func Flv(buf []byte) bool {
93	return len(buf) > 3 &&
94		buf[0] == 0x46 && buf[1] == 0x4C &&
95		buf[2] == 0x56 && buf[3] == 0x01
96}
97
98func Mp4(buf []byte) bool {
99	return len(buf) > 27 &&
100		(buf[0] == 0x0 && buf[1] == 0x0 && buf[2] == 0x0 &&
101			((buf[3] == 0x18 || buf[3] == 0x20) && buf[4] == 0x66 &&
102				buf[5] == 0x74 && buf[6] == 0x79 && buf[7] == 0x70) ||
103			(buf[0] == 0x33 && buf[1] == 0x67 && buf[2] == 0x70 && buf[3] == 0x35) ||
104			(buf[0] == 0x0 && buf[1] == 0x0 && buf[2] == 0x0 && buf[3] == 0x1C &&
105				buf[4] == 0x66 && buf[5] == 0x74 && buf[6] == 0x79 && buf[7] == 0x70 &&
106				buf[8] == 0x6D && buf[9] == 0x70 && buf[10] == 0x34 && buf[11] == 0x32 &&
107				buf[16] == 0x6D && buf[17] == 0x70 && buf[18] == 0x34 && buf[19] == 0x31 &&
108				buf[20] == 0x6D && buf[21] == 0x70 && buf[22] == 0x34 && buf[23] == 0x32 &&
109				buf[24] == 0x69 && buf[25] == 0x73 && buf[26] == 0x6F && buf[27] == 0x6D))
110}
111