public static void TestConstructor() { using (Media.Codecs.Image.Image image = new Codecs.Image.Image(Media.Codecs.Image.ImageFormat.RGB(8), 1, 1)) { if (image.SampleCount != 1) { throw new System.InvalidOperationException(); } if (image.Data.Count != image.Width * image.Height * image.MediaFormat.Length) { throw new System.InvalidOperationException(); } } }
public static void TestConversionRGAB() { Codecs.Image.ImageFormat weird = new Codecs.Image.ImageFormat(Common.Binary.ByteOrder.Little, Codec.DataLayout.Packed, new Codec.MediaComponent[] { new Codec.MediaComponent((byte)'r', 10), new Codec.MediaComponent((byte)'g', 10), new Codec.MediaComponent((byte)'a', 2), new Codec.MediaComponent((byte)'b', 10), }); //Create the source image using (Media.Codecs.Image.Image rgbImage = new Codecs.Image.Image(weird, 8, 8)) { //Create the ImageFormat based on YUV packed but in Planar format with a full height luma plane and half hight chroma planes Media.Codecs.Image.ImageFormat Yuv420P = new Codecs.Image.ImageFormat(Media.Codecs.Image.ImageFormat.YUV(8, Common.Binary.ByteOrder.Little, Codec.DataLayout.Planar), new int[] { 0, 1, 1 }); if (Yuv420P.IsInterleaved) { throw new System.Exception("IsInterleaved should be false"); } if (Yuv420P.HasAlphaComponent) { throw new System.Exception("HasAlphaComponent should be false"); } if (false == rgbImage.ImageFormat.HasAlphaComponent) { throw new System.Exception("HasAlphaComponent should be true"); } if (rgbImage.ImageFormat.AlphaComponent.Size != 2) { throw new System.Exception("AlphaComponent.Size should be 2 (bits)"); } //ImageFormat could be given directly to constructor here //Create the destination image using (Media.Codecs.Image.Image yuvImage = new Codecs.Image.Image(Yuv420P, 8, 8)) { //Cache the data of the source before transformation byte[] left = rgbImage.Data.ToArray(), right; //Transform RGB to YUV using (Media.Codecs.Image.ImageTransformation it = new Media.Codecs.Image.Transformations.RGB(rgbImage, yuvImage)) { it.Transform(); //Yuv Data //left = dest.Data.ToArray(); } //Transform YUV to RGB using (Media.Codecs.Image.ImageTransformation it = new Media.Codecs.Image.Transformations.YUV(yuvImage, rgbImage)) { it.Transform(); //Rgb Data right = rgbImage.Data.ToArray(); } //Compare the two sequences if (false == left.SequenceEqual(right)) { throw new System.InvalidOperationException(); } } //Done with the format. Yuv420P = null; } }
//Averages around 100 msec, 0.1 sec, still 60 times would be 600 msec or .6 seconds, just fast enough public static void TestUnsafeConversionRGB() { int testHeight = 1920, testWidth = 1080; System.DateTime start = System.DateTime.UtcNow, end; Codecs.Image.Image yuvImage; //Create the source image using (Media.Codecs.Image.Image rgbImage = new Codecs.Image.Image(Media.Codecs.Image.ImageFormat.RGB(8), testWidth, testHeight)) { if (rgbImage.ImageFormat.HasAlphaComponent) { throw new System.Exception("HasAlphaComponent should be false"); } //Create the ImageFormat based on YUV packed but in Planar format with a full height luma plane and half hight chroma planes Media.Codecs.Image.ImageFormat Yuv420P = new Codecs.Image.ImageFormat(Media.Codecs.Image.ImageFormat.YUV(8, Common.Binary.ByteOrder.Little, Codec.DataLayout.Planar), new int[] { 0, 1, 1 }); if (Yuv420P.IsInterleaved) { throw new System.Exception("IsInterleaved should be false"); } if (Yuv420P.HasAlphaComponent) { throw new System.Exception("HasAlphaComponent should be false"); } //ImageFormat could be given directly to constructor here //Create the destination image //Cache the data of the source before transformation byte[] left = rgbImage.Data.ToArray(), right; //Transform RGB to YUV start = System.DateTime.UtcNow; unsafe { fixed(byte *ptr = rgbImage.Data.Array) { yuvImage = new Codecs.Image.Image(Yuv420P, testWidth, testHeight, Media.Codecs.Image.ColorConversions.RGBToYUV420Managed(rgbImage.Width, rgbImage.Height, (System.IntPtr)ptr)); } } end = System.DateTime.UtcNow; System.Console.WriteLine("Took: " + (end - start).TotalMilliseconds.ToString() + " ms"); //Transform YUV to RGB start = System.DateTime.UtcNow; //it.Transform(); Media.Codecs.Image.ColorConversions.YUV2RGBManaged(yuvImage.Data.Array, rgbImage.Data.Array, rgbImage.Width >> 1, rgbImage.Height >> 1); end = System.DateTime.UtcNow; System.Console.WriteLine("Took: " + (end - start).TotalMilliseconds.ToString() + " ms"); //Rgb Data right = rgbImage.Data.ToArray(); //Compare the two sequences //if (false == left.SequenceEqual(right)) throw new System.InvalidOperationException(); //Done with the format. Yuv420P = null; } }