diff --git a/.gitignore b/.gitignore
index 465dc6ce..0ce10e10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -111,10 +111,12 @@ UpgradeLog*.XML
# FFmpeg binaries (download via FFmpeg/download-ffmpeg.ps1)
FFmpeg/bin/
+FFmpeg/sample.*
# JetBrains Rider
.idea/
*.sln.iml
# Claude
-.claude/
\ No newline at end of file
+.claude/
+CLAUDE.md
\ No newline at end of file
diff --git a/FFmpeg.AutoGen.Abstractions/generated/ffmpeg.macros.g.cs b/FFmpeg.AutoGen.Abstractions/generated/ffmpeg.macros.g.cs
index c2ab9547..9da96324 100644
--- a/FFmpeg.AutoGen.Abstractions/generated/ffmpeg.macros.g.cs
+++ b/FFmpeg.AutoGen.Abstractions/generated/ffmpeg.macros.g.cs
@@ -171,53 +171,93 @@ public static unsafe partial class ffmpeg
public static readonly ulong AV_CH_WIDE_LEFT = 0x1UL << 31;
/// AV_CH_WIDE_RIGHT = (1ULL << AV_CHAN_WIDE_RIGHT )
public static readonly ulong AV_CH_WIDE_RIGHT = 0x1UL << 32;
- // public static AV_CHANNEL_LAYOUT_2_1 = AV_CHANNEL_LAYOUT_MASK(0x3, AV_CH_LAYOUT_2_1);
- // public static AV_CHANNEL_LAYOUT_2_2 = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_2_2);
- // public static AV_CHANNEL_LAYOUT_22POINT2 = AV_CHANNEL_LAYOUT_MASK(0x18, AV_CH_LAYOUT_22POINT2);
- // public static AV_CHANNEL_LAYOUT_2POINT1 = AV_CHANNEL_LAYOUT_MASK(0x3, AV_CH_LAYOUT_2POINT1);
- // public static AV_CHANNEL_LAYOUT_3POINT1 = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_3POINT1);
- // public static AV_CHANNEL_LAYOUT_3POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_3POINT1POINT2);
- // public static AV_CHANNEL_LAYOUT_4POINT0 = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_4POINT0);
- // public static AV_CHANNEL_LAYOUT_4POINT1 = AV_CHANNEL_LAYOUT_MASK(0x5, AV_CH_LAYOUT_4POINT1);
- // public static AV_CHANNEL_LAYOUT_5POINT0 = AV_CHANNEL_LAYOUT_MASK(0x5, AV_CH_LAYOUT_5POINT0);
- // public static AV_CHANNEL_LAYOUT_5POINT0_BACK = AV_CHANNEL_LAYOUT_MASK(0x5, AV_CH_LAYOUT_5POINT0_BACK);
- // public static AV_CHANNEL_LAYOUT_5POINT1 = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_5POINT1);
- // public static AV_CHANNEL_LAYOUT_5POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_5POINT1_BACK);
- // public static AV_CHANNEL_LAYOUT_5POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_5POINT1POINT2);
- // public static AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_5POINT1POINT2_BACK);
- // public static AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(0xa, AV_CH_LAYOUT_5POINT1POINT4_BACK);
- // public static AV_CHANNEL_LAYOUT_6POINT0 = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_6POINT0);
- // public static AV_CHANNEL_LAYOUT_6POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_6POINT0_FRONT);
- // public static AV_CHANNEL_LAYOUT_6POINT1 = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_6POINT1);
- // public static AV_CHANNEL_LAYOUT_6POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_6POINT1_BACK);
- // public static AV_CHANNEL_LAYOUT_6POINT1_FRONT = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_6POINT1_FRONT);
- // public static AV_CHANNEL_LAYOUT_7POINT0 = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_7POINT0);
- // public static AV_CHANNEL_LAYOUT_7POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_7POINT0_FRONT);
- // public static AV_CHANNEL_LAYOUT_7POINT1 = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_7POINT1);
+ /// AV_CHANNEL_LAYOUT_2_1 = AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2_1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_2_1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x3 };
+ /// AV_CHANNEL_LAYOUT_2_2 = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_2_2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_2_2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
+ /// AV_CHANNEL_LAYOUT_22POINT2 = AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_22POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x18 };
+ /// AV_CHANNEL_LAYOUT_2POINT1 = AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_2POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x3 };
+ /// AV_CHANNEL_LAYOUT_3POINT1 = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_3POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_3POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
+ /// AV_CHANNEL_LAYOUT_3POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_3POINT1POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_3POINT1POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_4POINT0 = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_4POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_4POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
+ /// AV_CHANNEL_LAYOUT_4POINT1 = AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_4POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_4POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x5 };
+ /// AV_CHANNEL_LAYOUT_5POINT0 = AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x5 };
+ /// AV_CHANNEL_LAYOUT_5POINT0_BACK = AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT0_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x5 };
+ /// AV_CHANNEL_LAYOUT_5POINT1 = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_5POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_5POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_5POINT1POINT4_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xa };
+ /// AV_CHANNEL_LAYOUT_6POINT0 = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_6POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0_FRONT)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT0_FRONT = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_6POINT1 = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_6POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT1_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_6POINT1_FRONT = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_FRONT)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT1_FRONT = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_7POINT0 = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_7POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0_FRONT)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT0_FRONT = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_7POINT1 = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
// public static AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK = AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK;
- // public static AV_CHANNEL_LAYOUT_7POINT1_WIDE = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_7POINT1_WIDE);
- // public static AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_7POINT1_WIDE_BACK);
- // public static AV_CHANNEL_LAYOUT_7POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(0xa, AV_CH_LAYOUT_7POINT1POINT2);
- // public static AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(0xc, AV_CH_LAYOUT_7POINT1POINT4_BACK);
- // public static AV_CHANNEL_LAYOUT_7POINT2POINT3 = AV_CHANNEL_LAYOUT_MASK(0xc, AV_CH_LAYOUT_7POINT2POINT3);
- // public static AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(0xe, AV_CH_LAYOUT_9POINT1POINT4_BACK);
- // public static AV_CHANNEL_LAYOUT_9POINT1POINT6 = AV_CHANNEL_LAYOUT_MASK(0x10, AV_CH_LAYOUT_9POINT1POINT6);
+ /// AV_CHANNEL_LAYOUT_7POINT1_WIDE = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1_WIDE = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_7POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_7POINT1POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xa };
+ /// AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT1POINT4_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xc };
+ /// AV_CHANNEL_LAYOUT_7POINT2POINT3 = AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT2POINT3)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT2POINT3 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xc };
+ /// AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(14, AV_CH_LAYOUT_9POINT1POINT4_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xe };
+ /// AV_CHANNEL_LAYOUT_9POINT1POINT6 = AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_9POINT1POINT6)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_9POINT1POINT6 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x10 };
// public static AV_CHANNEL_LAYOUT_AMBISONIC_FIRST_ORDER = { /* .order */ AV_CHANNEL_ORDER_AMBISONIC, /* .nb_channels */ 4, /* .u.mask */ { 0 }, /* .opaque */ NULL };
- // public static AV_CHANNEL_LAYOUT_BINAURAL = AV_CHANNEL_LAYOUT_MASK(0x2, AV_CH_LAYOUT_BINAURAL);
- // public static AV_CHANNEL_LAYOUT_CUBE = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_CUBE);
- // public static AV_CHANNEL_LAYOUT_HEXADECAGONAL = AV_CHANNEL_LAYOUT_MASK(0x10, AV_CH_LAYOUT_HEXADECAGONAL);
- // public static AV_CHANNEL_LAYOUT_HEXAGONAL = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_HEXAGONAL);
+ /// AV_CHANNEL_LAYOUT_BINAURAL = AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_BINAURAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_BINAURAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x2 };
+ /// AV_CHANNEL_LAYOUT_CUBE = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_CUBE)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_CUBE = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_HEXADECAGONAL = AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_HEXADECAGONAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x10 };
+ /// AV_CHANNEL_LAYOUT_HEXAGONAL = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_HEXAGONAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_HEXAGONAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
// public static AV_CHANNEL_LAYOUT_MASK = nb;
- // public static AV_CHANNEL_LAYOUT_MONO = AV_CHANNEL_LAYOUT_MASK(0x1, AV_CH_LAYOUT_MONO);
- // public static AV_CHANNEL_LAYOUT_OCTAGONAL = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_OCTAGONAL);
- // public static AV_CHANNEL_LAYOUT_QUAD = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_QUAD);
+ /// AV_CHANNEL_LAYOUT_MONO = AV_CHANNEL_LAYOUT_MASK(1, AV_CH_LAYOUT_MONO)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_MONO = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x1 };
+ /// AV_CHANNEL_LAYOUT_OCTAGONAL = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_OCTAGONAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_OCTAGONAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_QUAD = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_QUAD)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_QUAD = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
/// AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL = (1 << 1)
public const int AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL = 0x1 << 0x1;
/// AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS = (1 << 0)
public const int AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS = 0x1 << 0x0;
- // public static AV_CHANNEL_LAYOUT_STEREO = AV_CHANNEL_LAYOUT_MASK(0x2, AV_CH_LAYOUT_STEREO);
- // public static AV_CHANNEL_LAYOUT_STEREO_DOWNMIX = AV_CHANNEL_LAYOUT_MASK(0x2, AV_CH_LAYOUT_STEREO_DOWNMIX);
- // public static AV_CHANNEL_LAYOUT_SURROUND = AV_CHANNEL_LAYOUT_MASK(0x3, AV_CH_LAYOUT_SURROUND);
+ /// AV_CHANNEL_LAYOUT_STEREO = AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_STEREO = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x2 };
+ /// AV_CHANNEL_LAYOUT_STEREO_DOWNMIX = AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO_DOWNMIX)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_STEREO_DOWNMIX = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x2 };
+ /// AV_CHANNEL_LAYOUT_SURROUND = AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_SURROUND)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_SURROUND = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x3 };
// public static av_clip = av_clip_c;
// public static av_clip_int16 = av_clip_int16_c;
// public static av_clip_int8 = av_clip_int8_c;
@@ -1192,11 +1232,12 @@ public static unsafe partial class ffmpeg
public const int AV_SUBTITLE_FLAG_FORCED = 0x1;
/// AV_TIME_BASE = 1000000
public const int AV_TIME_BASE = 0xf4240;
- // public static AV_TIME_BASE_Q = (AVRational){1, AV_TIME_BASE};
+ /// AV_TIME_BASE_Q = (AVRational){1, AV_TIME_BASE}
+ public static readonly AVRational AV_TIME_BASE_Q = new AVRational { num = 0x1, den = AV_TIME_BASE };
/// AV_TIMECODE_STR_SIZE = 0x17
public const int AV_TIMECODE_STR_SIZE = 0x17;
// public static AV_TOSTRING = (s) #s;
- // public static av_uninit = (x) x=x;
+ // public static av_uninit = (x)(x);
// public static av_unused = __attribute__((unused));
// public static av_used = __attribute__((used));
// public static AV_VERSION = a;
diff --git a/FFmpeg.AutoGen.ClangMacroParser.Test/ParserTest.cs b/FFmpeg.AutoGen.ClangMacroParser.Test/ParserTest.cs
index a2171230..176b778e 100644
--- a/FFmpeg.AutoGen.ClangMacroParser.Test/ParserTest.cs
+++ b/FFmpeg.AutoGen.ClangMacroParser.Test/ParserTest.cs
@@ -140,5 +140,93 @@ public void FunctionCallWithDigitPrefixedArg()
CastExpression(args[1], y => Assert.AreEqual("RGB0", y.Name));
});
}
+
+ [TestMethod]
+ public void CompoundLiteral()
+ {
+ var e = Parser.Parse("(AVRational){1, 1000000}");
+ CastExpression(e,
+ x =>
+ {
+ Assert.AreEqual("AVRational", x.TypeName);
+ Assert.AreEqual(2, x.Initializer.Fields.Count);
+ Assert.IsNull(x.Initializer.Fields[0].Name);
+ CastExpression(x.Initializer.Fields[0].Value, y => Assert.AreEqual(1, y.Value));
+ CastExpression(x.Initializer.Fields[1].Value, y => Assert.AreEqual(1000000, y.Value));
+ });
+ }
+
+ [TestMethod]
+ public void InitializerList()
+ {
+ var e = Parser.Parse("{ 0, 2, { 3 }, 0 }");
+ CastExpression(e,
+ x =>
+ {
+ Assert.AreEqual(4, x.Fields.Count);
+ CastExpression(x.Fields[0].Value, y => Assert.AreEqual(0, y.Value));
+ CastExpression(x.Fields[1].Value, y => Assert.AreEqual(2, y.Value));
+ CastExpression(x.Fields[2].Value, y => Assert.AreEqual(1, y.Fields.Count));
+ CastExpression(x.Fields[3].Value, y => Assert.AreEqual(0, y.Value));
+ });
+ }
+
+ [TestMethod]
+ public void CCommentSkipping()
+ {
+ var e = Parser.Parse("{ /* .order */ 0, /* .nb */ 2 }");
+ CastExpression(e,
+ x =>
+ {
+ Assert.AreEqual(2, x.Fields.Count);
+ CastExpression(x.Fields[0].Value, y => Assert.AreEqual(0, y.Value));
+ CastExpression(x.Fields[1].Value, y => Assert.AreEqual(2, y.Value));
+ });
+ }
+
+ [TestMethod]
+ public void NullHandling()
+ {
+ var e = Parser.Parse("NULL");
+ CastExpression(e, x => Assert.AreEqual(0, x.Value));
+ }
+
+ [TestMethod]
+ public void DesignatedInitializer()
+ {
+ var e = Parser.Parse("{ .order = 0, .nb_channels = 2 }");
+ CastExpression(e,
+ x =>
+ {
+ Assert.AreEqual(2, x.Fields.Count);
+ Assert.AreEqual("order", x.Fields[0].Name);
+ Assert.AreEqual("nb_channels", x.Fields[1].Name);
+ CastExpression(x.Fields[0].Value, y => Assert.AreEqual(0, y.Value));
+ CastExpression(x.Fields[1].Value, y => Assert.AreEqual(2, y.Value));
+ });
+ }
+
+ [TestMethod]
+ public void NestedDesignatedInitializer()
+ {
+ var e = Parser.Parse("{ .order = AV_CHANNEL_ORDER_NATIVE, .nb_channels = 1, .u.mask = { AV_CH_LAYOUT_MONO }, .opaque = NULL }");
+ CastExpression(e,
+ x =>
+ {
+ Assert.AreEqual(4, x.Fields.Count);
+ Assert.AreEqual("order", x.Fields[0].Name);
+ Assert.AreEqual("nb_channels", x.Fields[1].Name);
+ Assert.AreEqual("u.mask", x.Fields[2].Name);
+ Assert.AreEqual("opaque", x.Fields[3].Name);
+ CastExpression(x.Fields[0].Value, y => Assert.AreEqual("AV_CHANNEL_ORDER_NATIVE", y.Name));
+ CastExpression(x.Fields[1].Value, y => Assert.AreEqual(1, y.Value));
+ CastExpression(x.Fields[2].Value, y =>
+ {
+ Assert.AreEqual(1, y.Fields.Count);
+ CastExpression(y.Fields[0].Value, z => Assert.AreEqual("AV_CH_LAYOUT_MONO", z.Name));
+ });
+ CastExpression(x.Fields[3].Value, y => Assert.AreEqual(0, y.Value));
+ });
+ }
}
}
diff --git a/FFmpeg.AutoGen.ClangMacroParser/Expressions/CompoundLiteralExpression.cs b/FFmpeg.AutoGen.ClangMacroParser/Expressions/CompoundLiteralExpression.cs
new file mode 100644
index 00000000..6c764399
--- /dev/null
+++ b/FFmpeg.AutoGen.ClangMacroParser/Expressions/CompoundLiteralExpression.cs
@@ -0,0 +1,18 @@
+namespace FFmpeg.AutoGen.ClangMacroParser.Expressions
+{
+ ///
+ /// Represents a C99 compound literal: (TypeName){ expr, expr } or (TypeName){ .field = expr }
+ ///
+ public class CompoundLiteralExpression : IExpression
+ {
+ public CompoundLiteralExpression(string typeName, InitializerListExpression initializer)
+ {
+ TypeName = typeName;
+ Initializer = initializer;
+ }
+
+ public string TypeName { get; }
+
+ public InitializerListExpression Initializer { get; }
+ }
+}
diff --git a/FFmpeg.AutoGen.ClangMacroParser/Expressions/InitializerListExpression.cs b/FFmpeg.AutoGen.ClangMacroParser/Expressions/InitializerListExpression.cs
new file mode 100644
index 00000000..bd95bdbf
--- /dev/null
+++ b/FFmpeg.AutoGen.ClangMacroParser/Expressions/InitializerListExpression.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+
+namespace FFmpeg.AutoGen.ClangMacroParser.Expressions
+{
+ ///
+ /// Represents a C initializer list: { expr, expr } or { .field = expr, .field = expr }
+ ///
+ public class InitializerListExpression : IExpression
+ {
+ public InitializerListExpression(IEnumerable fields)
+ {
+ Fields = new List(fields);
+ }
+
+ public List Fields { get; }
+ }
+
+ public class InitializerField
+ {
+ ///
+ /// Field name for designated initializers (.field = value). Null for positional.
+ ///
+ public string? Name { get; set; }
+
+ ///
+ /// The value expression.
+ ///
+ public IExpression Value { get; set; }
+ }
+}
diff --git a/FFmpeg.AutoGen.ClangMacroParser/Expressions/OperationTypeExtensions.cs b/FFmpeg.AutoGen.ClangMacroParser/Expressions/OperationTypeExtensions.cs
index 4bdcc72e..b677823d 100644
--- a/FFmpeg.AutoGen.ClangMacroParser/Expressions/OperationTypeExtensions.cs
+++ b/FFmpeg.AutoGen.ClangMacroParser/Expressions/OperationTypeExtensions.cs
@@ -32,35 +32,40 @@ public static class OperationTypeExtensions
public static int GetPrecedence(this OperationType operationType) => OperationPrecedence[operationType];
- public static OperationType ToOperationType(this string value)
+ public static bool TryToOperationType(this string value, out OperationType result)
{
switch (value)
{
- case "+": return OperationType.Add;
- case "/": return OperationType.Divide;
- case "%": return OperationType.Modulo;
- case "*": return OperationType.Multiply;
- case "^": return OperationType.Power;
- case "-": return OperationType.Subtract;
- case "&": return OperationType.And;
- case "|": return OperationType.Or;
- case "~": return OperationType.ExclusiveOr;
- case "<<": return OperationType.LeftShift;
- case ">>": return OperationType.RightShift;
- case "&&": return OperationType.AndAlso;
- case "||": return OperationType.OrElse;
- case "==": return OperationType.Equal;
- case "!=": return OperationType.NotEqual;
- case ">=": return OperationType.GreaterThanOrEqual;
- case ">": return OperationType.GreaterThan;
- case "<": return OperationType.LessThan;
- case "<=": return OperationType.LessThanOrEqual;
- case "##": return OperationType.TokenConcat;
- default:
- throw new ArgumentOutOfRangeException(nameof(value));
+ case "+": result = OperationType.Add; return true;
+ case "/": result = OperationType.Divide; return true;
+ case "%": result = OperationType.Modulo; return true;
+ case "*": result = OperationType.Multiply; return true;
+ case "^": result = OperationType.Power; return true;
+ case "-": result = OperationType.Subtract; return true;
+ case "&": result = OperationType.And; return true;
+ case "|": result = OperationType.Or; return true;
+ case "~": result = OperationType.ExclusiveOr; return true;
+ case "<<": result = OperationType.LeftShift; return true;
+ case ">>": result = OperationType.RightShift; return true;
+ case "&&": result = OperationType.AndAlso; return true;
+ case "||": result = OperationType.OrElse; return true;
+ case "==": result = OperationType.Equal; return true;
+ case "!=": result = OperationType.NotEqual; return true;
+ case ">=": result = OperationType.GreaterThanOrEqual; return true;
+ case ">": result = OperationType.GreaterThan; return true;
+ case "<": result = OperationType.LessThan; return true;
+ case "<=": result = OperationType.LessThanOrEqual; return true;
+ case "##": result = OperationType.TokenConcat; return true;
+ default: result = default; return false;
}
}
+ public static OperationType ToOperationType(this string value)
+ {
+ if (TryToOperationType(value, out var result)) return result;
+ throw new ArgumentOutOfRangeException(nameof(value));
+ }
+
public static string ToOperationTypeString(this OperationType operationType)
{
switch (operationType)
diff --git a/FFmpeg.AutoGen.ClangMacroParser/Parser.cs b/FFmpeg.AutoGen.ClangMacroParser/Parser.cs
index 45f624f1..1c81d7b6 100644
--- a/FFmpeg.AutoGen.ClangMacroParser/Parser.cs
+++ b/FFmpeg.AutoGen.ClangMacroParser/Parser.cs
@@ -80,15 +80,65 @@ IExpression Unary()
return new UnaryExpression(operationType, Expression());
}
+ IExpression InitializerList()
+ {
+ Read(); // skip {
+ var fields = new List();
+
+ while (CanRead() && !Current().IsPunctuator("}"))
+ {
+ string? fieldName = null;
+
+ // Check for designated initializer: .field = value
+ // After tokenizer, ".field" is a single Identifier token starting with "."
+ if (Current().IsIdentifier() && Current().Value.StartsWith(".") &&
+ i + 1 < tokens.Length && tokens[i + 1].IsOperator() && tokens[i + 1].Value == "=")
+ {
+ fieldName = Current().Value.Substring(1); // remove leading "."
+ Read(); // skip .field
+ Read(); // skip =
+ }
+
+ fields.Add(new InitializerField { Name = fieldName, Value = Expression() });
+
+ if (CanRead() && Current().IsPunctuator(",")) Read();
+ }
+
+ if (CanRead() && Current().IsPunctuator("}")) Read(); // skip }
+
+ return new InitializerListExpression(fields);
+ }
+
IExpression Atomic()
{
+ if (Current().IsPunctuator("{")) return InitializerList();
if (Current().IsPunctuator("(")) return InParentheses(Expression);
if (Current().IsConstant() || Current().IsString()) return Constant();
- if (Current().IsIdentifier()) return Variable();
+ if (Current().IsIdentifier())
+ {
+ // NULL → null constant
+ if (Current().Value == "NULL") { Read(); return new ConstantExpression(0); }
+ return Variable();
+ }
throw new NotSupportedException();
}
- bool IsCast() => IsSequenceOf(x => x.IsPunctuator("("), x => x.IsKeyword() || x.IsIdentifier(), x => x.IsPunctuator(")"));
+ bool IsTypeInParentheses() => IsSequenceOf(
+ x => x.IsPunctuator("("),
+ x => x.IsKeyword() || x.IsIdentifier(),
+ x => x.IsPunctuator(")"));
+
+ bool IsCast() => IsTypeInParentheses();
+
+ bool IsCompoundLiteral() => IsTypeInParentheses()
+ && i + 3 < tokens.Length && tokens[i + 3].IsPunctuator("{");
+
+ IExpression CompoundLiteral()
+ {
+ var typeName = InParentheses(() => Read().Value);
+ var init = (InitializerListExpression)InitializerList();
+ return new CompoundLiteralExpression(typeName, init);
+ }
IExpression Cast() => new CastExpression(InParentheses(() => Read().Value), NoneAtomic());
@@ -98,6 +148,7 @@ IExpression NoneAtomic()
{
if (IsSequenceOf(x => x.IsIdentifier(), x => x.IsPunctuator("("))) return Call();
if (Current().IsOperator()) return Unary();
+ if (IsCompoundLiteral()) return CompoundLiteral();
if (IsCast()) return Cast();
return Atomic();
}
@@ -105,11 +156,14 @@ IExpression NoneAtomic()
throw new NotSupportedException();
}
+ bool IsKnownBinaryOperator() =>
+ CanRead() && Current().IsOperator() && Current().Value.TryToOperationType(out _);
+
IExpression MaybeBinary(IExpression left, int precedence = int.MaxValue)
{
while (true)
{
- if (CanRead() && Current().IsOperator())
+ if (IsKnownBinaryOperator())
{
var operationType = Current().Value.ToOperationType();
var currentPrecedence = operationType.GetPrecedence();
diff --git a/FFmpeg.AutoGen.ClangMacroParser/Tokenization/Tokenizer.cs b/FFmpeg.AutoGen.ClangMacroParser/Tokenization/Tokenizer.cs
index b26cb493..96412d1a 100644
--- a/FFmpeg.AutoGen.ClangMacroParser/Tokenization/Tokenizer.cs
+++ b/FFmpeg.AutoGen.ClangMacroParser/Tokenization/Tokenizer.cs
@@ -110,6 +110,22 @@ Token Punctuator()
var c = Current();
if (Separators.Contains(c)) Skip(Separators.Contains);
+ else if (c == '/' && i + 1 < characters.Length && characters[i + 1] == '*')
+ {
+ // Skip C-style comments /* ... */
+ Read(); Read(); // skip /*
+ while (CanRead() && !(Current() == '*' && i + 1 < characters.Length && characters[i + 1] == '/'))
+ Read();
+ if (CanRead()) { Read(); Read(); } // skip */
+ }
+ else if (c == '.' && i + 1 < characters.Length && IsIdentifierStart(characters[i + 1]))
+ {
+ // Designated initializer field: .field or .u.mask
+ var startPos = i;
+ Read(); // consume '.'
+ var value = "." + new string(YieldWhile(IsIdentifierStart, IsId).ToArray());
+ yield return new Token(TokenType.Identifier, value, startPos, value.Length);
+ }
else if (IsNumberStart(c))
{
var num = Number();
diff --git a/FFmpeg.AutoGen.CppSharpUnsafeGenerator/Processing/MacroPostProcessor.cs b/FFmpeg.AutoGen.CppSharpUnsafeGenerator/Processing/MacroPostProcessor.cs
index 95d1fd11..6e919e87 100644
--- a/FFmpeg.AutoGen.CppSharpUnsafeGenerator/Processing/MacroPostProcessor.cs
+++ b/FFmpeg.AutoGen.CppSharpUnsafeGenerator/Processing/MacroPostProcessor.cs
@@ -35,9 +35,9 @@ public void Process(IReadOnlyList macros)
{
var expression = CleanUp(macro.Expression);
- // Detect function-like macro definitions with ## (token concatenation)
+ // Detect function-like macro definitions with ## or struct init body
var funcMatch = FunctionMacroRegex.Match(expression);
- if (funcMatch.Success && expression.Contains("##"))
+ if (funcMatch.Success && (expression.Contains("##") || expression.Contains("{")))
{
var parameters = funcMatch.Groups[1].Value.Split(',').Select(p => p.Trim()).ToArray();
var body = funcMatch.Groups[2].Value.Trim();
@@ -74,9 +74,17 @@ private void Process(MacroDefinition macro)
macro.TypeName = typeOrAlias.ToString();
macro.Content = $"{macro.Name} = {CleanUp(macro.Expression)}";
+
+ // Wrap bare InitializerList with inferred type into CompoundLiteral for proper serialization
+ if (expression is InitializerListExpression initList && !typeOrAlias.IsType
+ && _context.Definitions.Any(d => d.Name == typeOrAlias.Alias))
+ expression = new CompoundLiteralExpression(typeOrAlias.Alias, initList);
+
macro.Expression = Serialize(expression);
macro.IsConst = IsConst(expression);
- macro.IsValid = typeOrAlias.IsType || _context.TypeAliases.ContainsKey(typeOrAlias.Alias);
+ macro.IsValid = typeOrAlias.IsType
+ || _context.TypeAliases.ContainsKey(typeOrAlias.Alias)
+ || (expression is CompoundLiteralExpression && _context.Definitions.Any(d => d.Name == typeOrAlias.Alias));
}
private static string CleanUp(string expression)
@@ -90,6 +98,8 @@ private TypeOrAlias DeduceType(IExpression expression)
{
return expression switch
{
+ CompoundLiteralExpression e => new TypeOrAlias(e.TypeName),
+ InitializerListExpression e => DeduceStructType(e),
BinaryExpression e => DeduceType(e),
UnaryExpression e => DeduceType(e.Operand),
CastExpression e => GetTypeAlias(e.TargetType),
@@ -100,6 +110,27 @@ private TypeOrAlias DeduceType(IExpression expression)
};
}
+ ///
+ /// Tries to infer struct type from designated initializer field names.
+ /// Matches field names against known struct definitions.
+ ///
+ private TypeOrAlias DeduceStructType(InitializerListExpression e)
+ {
+ // Extract top-level field names (e.g. "u.mask" → "u", "order" → "order")
+ var fieldNames = e.Fields
+ .Where(f => f.Name != null)
+ .Select(f => f.Name.Split('.')[0])
+ .ToHashSet();
+ if (fieldNames.Count == 0) return null;
+
+ var match = _context.Definitions
+ .OfType()
+ .FirstOrDefault(s => s.Fields != null &&
+ fieldNames.All(fn => s.Fields.Any(sf => sf.Name == fn)));
+
+ return match != null ? new TypeOrAlias(match.Name) : null;
+ }
+
private TypeOrAlias DeduceCallType(CallExpression e)
{
// Try to expand function-like macros with ## token concatenation
@@ -148,6 +179,11 @@ private IExpression Rewrite(IExpression expression)
case UnaryExpression e: return new UnaryExpression(e.OperationType, Rewrite(e.Operand));
case CastExpression e: return new CastExpression(e.TargetType, Rewrite(e.Operand));
case CallExpression e: return RewriteCall(e);
+ case CompoundLiteralExpression e: return new CompoundLiteralExpression(e.TypeName,
+ new InitializerListExpression(e.Initializer.Fields.Select(f =>
+ new InitializerField { Name = f.Name, Value = Rewrite(f.Value) })));
+ case InitializerListExpression e: return new InitializerListExpression(
+ e.Fields.Select(f => new InitializerField { Name = f.Name, Value = Rewrite(f.Value) }));
case VariableExpression e: return Rewrite(e);
case ConstantExpression e: return e;
default: return expression;
@@ -193,12 +229,17 @@ private IExpression TryExpandFunctionMacro(CallExpression call)
// Substitute parameters in the body and evaluate ## concatenation
var body = macroDef.Body;
- // First substitute parameters (both with ## and standalone)
+ // First substitute parameters with word-boundary matching
foreach (var (param, arg) in paramMap)
- body = body.Replace(param, arg);
+ body = Regex.Replace(body, $@"\b{Regex.Escape(param)}\b", arg);
// Then evaluate ## (token concatenation = string join)
body = body.Replace("##", "");
+
+ // Convert C-style designated init comments to actual designators:
+ // { /* .order */ value } → { .order = value }
+ body = Regex.Replace(body, @"/\*\s*(\.[\w.]+)\s*\*/", "$1 =");
+
body = body.Replace(" ", " ").Trim();
// Try to parse the result as a single identifier/expression
@@ -229,6 +270,8 @@ private string Serialize(IExpression expression)
{
return expression switch
{
+ CompoundLiteralExpression e => SerializeCompoundLiteral(e),
+ InitializerListExpression e => SerializeInitializerList(e),
BinaryExpression e =>
$"{Serialize(e.Left)} {e.OperationType.ToOperationTypeString()} {Serialize(e.Right)}",
UnaryExpression e => $"{e.OperationType.ToOperationTypeString()}{Serialize(e.Operand)}",
@@ -240,6 +283,71 @@ private string Serialize(IExpression expression)
};
}
+ private string SerializeCompoundLiteral(CompoundLiteralExpression e)
+ {
+ var typeName = GetTypeAlias(e.TypeName);
+ var fields = e.Initializer.Fields;
+
+ var structDef = _context.Definitions
+ .OfType()
+ .FirstOrDefault(s => s.Name == e.TypeName.ToString());
+
+ // For positional initializers, resolve field names from struct definition
+ if (fields.Count > 0 && fields[0].Name == null && structDef?.Fields != null)
+ {
+ for (var idx = 0; idx < fields.Count && idx < structDef.Fields.Length; idx++)
+ fields[idx].Name = structDef.Fields[idx].Name;
+ }
+
+ var serialized = fields
+ // Skip nested fields (u.mask) — C# doesn't support nested object initializer access
+ .Where(f => f.Name == null || !f.Name.Contains('.'))
+ // Skip zero-initialized fields (default value)
+ .Where(f => !(f.Value is ConstantExpression c && c.Value is int v && v == 0))
+ .Select(f => f.Name != null
+ ? $"{f.Name} = {SerializeFieldValue(f.Name, f.Value, structDef)}"
+ : Serialize(f.Value));
+ return $"new {typeName} {{ {string.Join(", ", serialized)} }}";
+ }
+
+ private string SerializeFieldValue(string fieldName, IExpression value, Definitions.StructureDefinition structDef)
+ {
+ // Unwrap single-element initializer list: { x } → x
+ if (value is InitializerListExpression initList && initList.Fields.Count == 1)
+ value = initList.Fields[0].Value;
+
+ // Cast value to enum type if struct field is an enum
+ if (structDef?.Fields != null)
+ {
+ var field = structDef.Fields.FirstOrDefault(f => f.Name == fieldName);
+ if (field != null)
+ {
+ var enumDef = _context.Definitions
+ .OfType()
+ .FirstOrDefault(d => d.Name == field.FieldType.Name);
+ if (enumDef != null)
+ {
+ // Try to find matching enum member by value
+ var serializedValue = Serialize(value);
+ var enumItem = enumDef.Items.FirstOrDefault(i => i.Value == serializedValue);
+ if (enumItem != null)
+ return $"{enumDef.Name}.{enumItem.Name}";
+ return $"({enumDef.Name})({serializedValue})";
+ }
+ }
+ }
+
+ return Serialize(value);
+ }
+
+ private string SerializeInitializerList(InitializerListExpression e)
+ {
+ var fields = e.Fields.Select(f => f.Name != null
+ ? $"{f.Name} = {Serialize(f.Value)}"
+ : Serialize(f.Value));
+ return $"{{ {string.Join(", ", fields)} }}";
+ }
+
internal TypeOrAlias GetWellKnownMacroType(string macroName)
{
if (_context.WellKnownMacros.TryGetValue(macroName, out var alias))
@@ -270,6 +378,8 @@ private bool IsConst(IExpression expression)
{
return expression switch
{
+ CompoundLiteralExpression _ => false,
+ InitializerListExpression _ => false,
BinaryExpression e => IsConst(e.Left) && IsConst(e.Right),
UnaryExpression e => IsConst(e.Operand),
CastExpression e => IsConst(e.Operand),
diff --git a/FFmpeg.AutoGen.Example/MediaDecoder.cs b/FFmpeg.AutoGen.Example/MediaDecoder.cs
deleted file mode 100644
index e25c0038..00000000
--- a/FFmpeg.AutoGen.Example/MediaDecoder.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Drawing;
-using System.Runtime.InteropServices;
-using FFmpeg.AutoGen.Abstractions;
-
-namespace FFmpeg.AutoGen.Example;
-
-public sealed unsafe class VideoConverter : IDisposable
-{
- private readonly SwsContext* _pConvertContext;
-
- public VideoConverter(Size sourceSize, AVPixelFormat sourcePixelFormat,
- Size destinationSize, AVPixelFormat destinationPixelFormat)
- {
- _pConvertContext = ffmpeg.sws_getContext(sourceSize.Width,
- sourceSize.Height,
- sourcePixelFormat,
- destinationSize.Width,
- destinationSize.Height,
- destinationPixelFormat,
- (int)SwsFlags.SWS_FAST_BILINEAR,
- null,
- null,
- null);
- if (_pConvertContext == null)
- throw new ApplicationException("Could not initialize the conversion context.");
-
- var convertedFrameBufferSize = ffmpeg.av_image_get_buffer_size(destinationPixelFormat,
- destinationSize.Width,
- destinationSize.Height,
- 1);
- var convertedFrameBufferPtr = Marshal.AllocHGlobal(convertedFrameBufferSize);
- var dstData = new byte_ptr4();
- var dstLinesize = new int4();
-
- ffmpeg.av_image_fill_arrays(ref dstData,
- ref dstLinesize,
- (byte*)convertedFrameBufferPtr,
- destinationPixelFormat,
- destinationSize.Width,
- destinationSize.Height,
- 1);
- }
-
- public void Dispose()
- {
- }
-
- public AVFrame Convert(AVFrame sourceFrame)
- {
- var dstData = new byte_ptr4();
- var dstLinesize = new int4();
-
- ffmpeg.sws_scale(_pConvertContext,
- sourceFrame.data,
- sourceFrame.linesize,
- 0,
- sourceFrame.height,
- dstData,
- dstLinesize);
-
- return new AVFrame();
- }
-}
diff --git a/FFmpeg.AutoGen/generated/ffmpeg.macros.g.cs b/FFmpeg.AutoGen/generated/ffmpeg.macros.g.cs
index 1401db55..21d74d60 100644
--- a/FFmpeg.AutoGen/generated/ffmpeg.macros.g.cs
+++ b/FFmpeg.AutoGen/generated/ffmpeg.macros.g.cs
@@ -171,53 +171,93 @@ public static unsafe partial class ffmpeg
public static readonly ulong AV_CH_WIDE_LEFT = 0x1UL << 31;
/// AV_CH_WIDE_RIGHT = (1ULL << AV_CHAN_WIDE_RIGHT )
public static readonly ulong AV_CH_WIDE_RIGHT = 0x1UL << 32;
- // public static AV_CHANNEL_LAYOUT_2_1 = AV_CHANNEL_LAYOUT_MASK(0x3, AV_CH_LAYOUT_2_1);
- // public static AV_CHANNEL_LAYOUT_2_2 = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_2_2);
- // public static AV_CHANNEL_LAYOUT_22POINT2 = AV_CHANNEL_LAYOUT_MASK(0x18, AV_CH_LAYOUT_22POINT2);
- // public static AV_CHANNEL_LAYOUT_2POINT1 = AV_CHANNEL_LAYOUT_MASK(0x3, AV_CH_LAYOUT_2POINT1);
- // public static AV_CHANNEL_LAYOUT_3POINT1 = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_3POINT1);
- // public static AV_CHANNEL_LAYOUT_3POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_3POINT1POINT2);
- // public static AV_CHANNEL_LAYOUT_4POINT0 = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_4POINT0);
- // public static AV_CHANNEL_LAYOUT_4POINT1 = AV_CHANNEL_LAYOUT_MASK(0x5, AV_CH_LAYOUT_4POINT1);
- // public static AV_CHANNEL_LAYOUT_5POINT0 = AV_CHANNEL_LAYOUT_MASK(0x5, AV_CH_LAYOUT_5POINT0);
- // public static AV_CHANNEL_LAYOUT_5POINT0_BACK = AV_CHANNEL_LAYOUT_MASK(0x5, AV_CH_LAYOUT_5POINT0_BACK);
- // public static AV_CHANNEL_LAYOUT_5POINT1 = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_5POINT1);
- // public static AV_CHANNEL_LAYOUT_5POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_5POINT1_BACK);
- // public static AV_CHANNEL_LAYOUT_5POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_5POINT1POINT2);
- // public static AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_5POINT1POINT2_BACK);
- // public static AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(0xa, AV_CH_LAYOUT_5POINT1POINT4_BACK);
- // public static AV_CHANNEL_LAYOUT_6POINT0 = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_6POINT0);
- // public static AV_CHANNEL_LAYOUT_6POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_6POINT0_FRONT);
- // public static AV_CHANNEL_LAYOUT_6POINT1 = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_6POINT1);
- // public static AV_CHANNEL_LAYOUT_6POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_6POINT1_BACK);
- // public static AV_CHANNEL_LAYOUT_6POINT1_FRONT = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_6POINT1_FRONT);
- // public static AV_CHANNEL_LAYOUT_7POINT0 = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_7POINT0);
- // public static AV_CHANNEL_LAYOUT_7POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(0x7, AV_CH_LAYOUT_7POINT0_FRONT);
- // public static AV_CHANNEL_LAYOUT_7POINT1 = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_7POINT1);
+ /// AV_CHANNEL_LAYOUT_2_1 = AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2_1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_2_1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x3 };
+ /// AV_CHANNEL_LAYOUT_2_2 = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_2_2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_2_2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
+ /// AV_CHANNEL_LAYOUT_22POINT2 = AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_22POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x18 };
+ /// AV_CHANNEL_LAYOUT_2POINT1 = AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_2POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x3 };
+ /// AV_CHANNEL_LAYOUT_3POINT1 = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_3POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_3POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
+ /// AV_CHANNEL_LAYOUT_3POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_3POINT1POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_3POINT1POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_4POINT0 = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_4POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_4POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
+ /// AV_CHANNEL_LAYOUT_4POINT1 = AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_4POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_4POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x5 };
+ /// AV_CHANNEL_LAYOUT_5POINT0 = AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x5 };
+ /// AV_CHANNEL_LAYOUT_5POINT0_BACK = AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT0_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x5 };
+ /// AV_CHANNEL_LAYOUT_5POINT1 = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_5POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_5POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_5POINT1POINT4_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xa };
+ /// AV_CHANNEL_LAYOUT_6POINT0 = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_6POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0_FRONT)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT0_FRONT = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
+ /// AV_CHANNEL_LAYOUT_6POINT1 = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_6POINT1_BACK = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT1_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_6POINT1_FRONT = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_FRONT)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_6POINT1_FRONT = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_7POINT0 = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT0 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_7POINT0_FRONT = AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0_FRONT)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT0_FRONT = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x7 };
+ /// AV_CHANNEL_LAYOUT_7POINT1 = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
// public static AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK = AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK;
- // public static AV_CHANNEL_LAYOUT_7POINT1_WIDE = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_7POINT1_WIDE);
- // public static AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_7POINT1_WIDE_BACK);
- // public static AV_CHANNEL_LAYOUT_7POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(0xa, AV_CH_LAYOUT_7POINT1POINT2);
- // public static AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(0xc, AV_CH_LAYOUT_7POINT1POINT4_BACK);
- // public static AV_CHANNEL_LAYOUT_7POINT2POINT3 = AV_CHANNEL_LAYOUT_MASK(0xc, AV_CH_LAYOUT_7POINT2POINT3);
- // public static AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(0xe, AV_CH_LAYOUT_9POINT1POINT4_BACK);
- // public static AV_CHANNEL_LAYOUT_9POINT1POINT6 = AV_CHANNEL_LAYOUT_MASK(0x10, AV_CH_LAYOUT_9POINT1POINT6);
+ /// AV_CHANNEL_LAYOUT_7POINT1_WIDE = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1_WIDE = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_7POINT1POINT2 = AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_7POINT1POINT2)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1POINT2 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xa };
+ /// AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT1POINT4_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xc };
+ /// AV_CHANNEL_LAYOUT_7POINT2POINT3 = AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT2POINT3)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_7POINT2POINT3 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xc };
+ /// AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK = AV_CHANNEL_LAYOUT_MASK(14, AV_CH_LAYOUT_9POINT1POINT4_BACK)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0xe };
+ /// AV_CHANNEL_LAYOUT_9POINT1POINT6 = AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_9POINT1POINT6)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_9POINT1POINT6 = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x10 };
// public static AV_CHANNEL_LAYOUT_AMBISONIC_FIRST_ORDER = { /* .order */ AV_CHANNEL_ORDER_AMBISONIC, /* .nb_channels */ 4, /* .u.mask */ { 0 }, /* .opaque */ NULL };
- // public static AV_CHANNEL_LAYOUT_BINAURAL = AV_CHANNEL_LAYOUT_MASK(0x2, AV_CH_LAYOUT_BINAURAL);
- // public static AV_CHANNEL_LAYOUT_CUBE = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_CUBE);
- // public static AV_CHANNEL_LAYOUT_HEXADECAGONAL = AV_CHANNEL_LAYOUT_MASK(0x10, AV_CH_LAYOUT_HEXADECAGONAL);
- // public static AV_CHANNEL_LAYOUT_HEXAGONAL = AV_CHANNEL_LAYOUT_MASK(0x6, AV_CH_LAYOUT_HEXAGONAL);
+ /// AV_CHANNEL_LAYOUT_BINAURAL = AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_BINAURAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_BINAURAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x2 };
+ /// AV_CHANNEL_LAYOUT_CUBE = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_CUBE)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_CUBE = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_HEXADECAGONAL = AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_HEXADECAGONAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x10 };
+ /// AV_CHANNEL_LAYOUT_HEXAGONAL = AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_HEXAGONAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_HEXAGONAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x6 };
// public static AV_CHANNEL_LAYOUT_MASK = nb;
- // public static AV_CHANNEL_LAYOUT_MONO = AV_CHANNEL_LAYOUT_MASK(0x1, AV_CH_LAYOUT_MONO);
- // public static AV_CHANNEL_LAYOUT_OCTAGONAL = AV_CHANNEL_LAYOUT_MASK(0x8, AV_CH_LAYOUT_OCTAGONAL);
- // public static AV_CHANNEL_LAYOUT_QUAD = AV_CHANNEL_LAYOUT_MASK(0x4, AV_CH_LAYOUT_QUAD);
+ /// AV_CHANNEL_LAYOUT_MONO = AV_CHANNEL_LAYOUT_MASK(1, AV_CH_LAYOUT_MONO)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_MONO = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x1 };
+ /// AV_CHANNEL_LAYOUT_OCTAGONAL = AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_OCTAGONAL)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_OCTAGONAL = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x8 };
+ /// AV_CHANNEL_LAYOUT_QUAD = AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_QUAD)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_QUAD = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x4 };
/// AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL = (1 << 1)
public const int AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL = 0x1 << 0x1;
/// AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS = (1 << 0)
public const int AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS = 0x1 << 0x0;
- // public static AV_CHANNEL_LAYOUT_STEREO = AV_CHANNEL_LAYOUT_MASK(0x2, AV_CH_LAYOUT_STEREO);
- // public static AV_CHANNEL_LAYOUT_STEREO_DOWNMIX = AV_CHANNEL_LAYOUT_MASK(0x2, AV_CH_LAYOUT_STEREO_DOWNMIX);
- // public static AV_CHANNEL_LAYOUT_SURROUND = AV_CHANNEL_LAYOUT_MASK(0x3, AV_CH_LAYOUT_SURROUND);
+ /// AV_CHANNEL_LAYOUT_STEREO = AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_STEREO = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x2 };
+ /// AV_CHANNEL_LAYOUT_STEREO_DOWNMIX = AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO_DOWNMIX)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_STEREO_DOWNMIX = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x2 };
+ /// AV_CHANNEL_LAYOUT_SURROUND = AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_SURROUND)
+ public static readonly AVChannelLayout AV_CHANNEL_LAYOUT_SURROUND = new AVChannelLayout { order = AVChannelOrder.AV_CHANNEL_ORDER_NATIVE, nb_channels = 0x3 };
// public static av_clip = av_clip_c;
// public static av_clip_int16 = av_clip_int16_c;
// public static av_clip_int8 = av_clip_int8_c;
@@ -1192,11 +1232,12 @@ public static unsafe partial class ffmpeg
public const int AV_SUBTITLE_FLAG_FORCED = 0x1;
/// AV_TIME_BASE = 1000000
public const int AV_TIME_BASE = 0xf4240;
- // public static AV_TIME_BASE_Q = (AVRational){1, AV_TIME_BASE};
+ /// AV_TIME_BASE_Q = (AVRational){1, AV_TIME_BASE}
+ public static readonly AVRational AV_TIME_BASE_Q = new AVRational { num = 0x1, den = AV_TIME_BASE };
/// AV_TIMECODE_STR_SIZE = 0x17
public const int AV_TIMECODE_STR_SIZE = 0x17;
// public static AV_TOSTRING = (s) #s;
- // public static av_uninit = (x) x=x;
+ // public static av_uninit = (x)(x);
// public static av_unused = __attribute__((unused));
// public static av_used = __attribute__((used));
// public static AV_VERSION = a;