JuliaIO/VideoIO.jl

Error when loading an x265 video encoded with `monochrome12` profile

Opened this issue · 1 comments

I'm trying to load a video that was saved with this command:

imgstack = copy(reinterpret(UInt16, imgstack))
VideoIO.save("x265_lossless.mp4", eachslice(imgstack, dims = 3), framerate = 5, codec_name = "libx265", encoder_options = (var"x265-params" = "profile=monochrome12:lossless=1", preset = "medium"))

But I get this error:

ERROR: MethodError: no method matching out_frame_size(::VideoIO.VideoReader{true, VideoIO.GrayTransform, String})
Closest candidates are:
  out_frame_size(::VideoIO.VideoReader{<:Any, VideoIO.NestedCStruct{VideoIO.libffmpeg.AVFrame}}) at C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:712
  out_frame_size(::VideoIO.VideoReader{true, VideoIO.SwsTransform}) at C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:714
  out_frame_size(::VideoIO.SwsTransform) at C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:713
Stacktrace:
  [1] retrieve(r::VideoIO.VideoReader{true, VideoIO.GrayTransform, String})
    @ VideoIO C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:548
  [2] read(::VideoIO.VideoReader{true, VideoIO.GrayTransform, String})
    @ VideoIO C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:653
  [3] iterate
    @ C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:103 [inlined]
  [4] iterate
    @ C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:102 [inlined]
  [5] grow_to!
    @ .\array.jl:860 [inlined]
  [6] _collect
    @ .\array.jl:764 [inlined]
  [7] collect
    @ .\array.jl:712 [inlined]
  [8] (::VideoIO.var"#13#14")(io::VideoIO.VideoReader{true, VideoIO.GrayTransform, String})        
    @ VideoIO C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:95
  [9] openvideo(f::VideoIO.var"#13#14", args::String; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ VideoIO C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:641
 [10] openvideo
    @ C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:638 [inlined]
 [11] #load#12
    @ C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:94 [inlined]
 [12] load(::String)
    @ VideoIO C:\Users\nicho\.julia\packages\VideoIO\V24Bg\src\avio.jl:93
 [13] top-level scope
    @ REPL[11]:1

The workaround/solution is to define these methods:

out_frame_size(t::GrayTransform) = (t.dstframe.width, t.dstframe.height)
out_frame_size(r::VideoReader{TRANSCODE,GrayTransform}) = out_frame_size(r.frame_graph)

But perhaps GrayTransform and SwsTransform need a shared abstract type and methods should dispatch on the abstract type?