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;