diff options
Diffstat (limited to 'src/ffmpeg.zig')
| -rw-r--r-- | src/ffmpeg.zig | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/ffmpeg.zig b/src/ffmpeg.zig index be7b6bf..67c3c2c 100644 --- a/src/ffmpeg.zig +++ b/src/ffmpeg.zig @@ -23,17 +23,32 @@ pub fn check(err: c_int) Errors!void { return error.AVGenericError; } -fn get_format_context(filename: [*:0]const u8, format_name: ?[*:0]const u8) !*c.AVFormatContext { - var format_ctx: ?*c.AVFormatContext = null; - var format: ?*const c.AVInputFormat = null; - var options: ?*c.AVDictionary = null; - +fn get_format_context( + filename: [*:0]const u8, + format_name: ?[*:0]const u8, + format_options: []const [*c]c.lo_arg, +) !*c.AVFormatContext { c.avdevice_register_all(); + var format: ?*const c.AVInputFormat = null; if (format_name) |name| { format = c.av_find_input_format(name); } + var options: ?*c.AVDictionary = null; + var i: usize = 0; + std.debug.assert(format_options.len % 2 == 0); + std.debug.print("len {}\n", .{format_options.len}); + while (i < format_options.len) : (i += 2) { + try check(c.av_dict_set( + &options, + &format_options[i].*.s, + &format_options[i + 1].*.s, + 0, + )); + } + + var format_ctx: ?*c.AVFormatContext = null; try check(c.avformat_open_input(&format_ctx, filename, format, &options)); errdefer c.avformat_close_input(&format_ctx); @@ -239,8 +254,10 @@ pub const VideoSource = struct { pub fn init( allocator: std.mem.Allocator, progress_root: std.Progress.Node, - filename: [*:0]const u8, texture_type: gl.Texture.Type, + filename: [*:0]const u8, + format_name: ?[*:0]const u8, + format_options: []const [*c]c.lo_arg, ) !*gl.Source { const self = try allocator.create(VideoSource); errdefer allocator.destroy(self); @@ -248,7 +265,7 @@ pub const VideoSource = struct { const progress = progress_root.start("loading texture", 2); defer progress.end(); - var format = try get_format_context(filename, null); + var format = try get_format_context(filename, format_name, format_options); defer c.avformat_close_input(@ptrCast(&format)); try check(c.avformat_find_stream_info(format, null)); @@ -304,11 +321,13 @@ pub const StreamSource = struct { allocator: std.mem.Allocator, constants: *const gl.Constants, filename: [*:0]const u8, + format_name: ?[*:0]const u8, + format_options: []const [*c]c.lo_arg, ) !*gl.Source { const self = try allocator.create(StreamSource); errdefer allocator.destroy(self); - var format = try get_format_context(filename, null); + var format = try get_format_context(filename, format_name, format_options); errdefer c.avformat_close_input(@ptrCast(&format)); format.flags |= c.AVFMT_FLAG_NONBLOCK; |
