aboutsummaryrefslogtreecommitdiffstats
path: root/src/ffmpeg.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/ffmpeg.zig')
-rw-r--r--src/ffmpeg.zig35
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;