-
Notifications
You must be signed in to change notification settings - Fork 53
/
util.jl
102 lines (91 loc) · 2.97 KB
/
util.jl
1
2
3
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
# Helpful utility functions
function fieldposition(::Type{T}, name::Symbol) where T
field_pos = findfirst(isequal(name), fieldnames(T))
if field_pos === nothing
throw(ErrorException("The type `$T` does not contain field $name!"))
end
return field_pos
end
# Set the value of a field of a pointer
# Equivalent to s->name = value
function av_setfield(s::Ptr{T}, name::Symbol, value) where T
field_pos = fieldposition(T, name)
byteoffset = fieldoffset(T, field_pos)
S = T.types[field_pos]
p = convert(Ptr{S}, s + byteoffset)
a = unsafe_wrap(Array, p, 1)
a[1] = convert(S, value)
end
function av_pointer_to_field(s::Ptr{T}, name::Symbol) where T
field_pos = fieldposition(T, name)
byteoffset = fieldoffset(T, field_pos)
return s + byteoffset
end
av_pointer_to_field(s::Array, name::Symbol) = av_pointer_to_field(pointer(s), name)
function collectexecoutput(exec::Cmd)
out = Pipe(); err = Pipe()
p = Base.open(pipeline(ignorestatus(exec), stdout=out, stderr=err))
close(out.in); close(err.in)
err_s = readlines(err); out_s = readlines(out)
return (length(out_s) > length(err_s)) ? out_s : err_s
end
"""
loglevel!(loglevel::Integer)
Set FFMPEG log level. Options are:
- `VideoIO.AVUtil.AV_LOG_QUIET`
- `VideoIO.AVUtil.AV_LOG_PANIC`
- `VideoIO.AVUtil.AV_LOG_FATAL`
- `VideoIO.AVUtil.AV_LOG_ERROR`
- `VideoIO.AVUtil.AV_LOG_WARNING`
- `VideoIO.AVUtil.AV_LOG_INFO`
- `VideoIO.AVUtil.AV_LOG_VERBOSE`
- `VideoIO.AVUtil.AV_LOG_DEBUG`
- `VideoIO.AVUtil.AV_LOG_TRACE`
"""
function loglevel!(level::Integer)
av_log_set_level(level)
return loglevel()
end
"""
loglevel() -> String
Get FFMPEG log level as a variable name string.
"""
function loglevel()
current_level = av_log_get_level()
level_strings = [
"VideoIO.AVUtil.AV_LOG_QUIET",
"VideoIO.AVUtil.AV_LOG_PANIC",
"VideoIO.AVUtil.AV_LOG_FATAL",
"VideoIO.AVUtil.AV_LOG_ERROR",
"VideoIO.AVUtil.AV_LOG_WARNING",
"VideoIO.AVUtil.AV_LOG_INFO",
"VideoIO.AVUtil.AV_LOG_VERBOSE",
"VideoIO.AVUtil.AV_LOG_DEBUG",
"VideoIO.AVUtil.AV_LOG_TRACE"
]
level_values = [
VideoIO.AVUtil.AV_LOG_QUIET,
VideoIO.AVUtil.AV_LOG_PANIC,
VideoIO.AVUtil.AV_LOG_FATAL,
VideoIO.AVUtil.AV_LOG_ERROR,
VideoIO.AVUtil.AV_LOG_WARNING,
VideoIO.AVUtil.AV_LOG_INFO,
VideoIO.AVUtil.AV_LOG_VERBOSE,
VideoIO.AVUtil.AV_LOG_DEBUG,
VideoIO.AVUtil.AV_LOG_TRACE
]
i = findfirst(level_values.==current_level)
if i > 0
return level_strings[i]
else
return "Unknown log level: $current_level"
end
end
# a convenience function for getting the aspect ratio
function aspect_ratio(f)
if iszero(f.aspect_ratio) || isnan(f.aspect_ratio) || isinf(f.aspect_ratio) # if the stored aspect ratio is nonsense then we default to one. OBS, this might still be wrong for some videos and an unnecessary test for most
1//1
else
f.aspect_ratio
end
end