public async Task CS_W_MediaReader_LumiaEffect() { using (var mediaReader = await MediaReader.CreateFromPathAsync("ms-appx:///car.mp4", AudioInitialization.Deselected, VideoInitialization.Nv12)) using (var mediaResult = await mediaReader.VideoStream.ReadAsync()) { var streamProperties = mediaReader.VideoStream.GetCurrentStreamProperties(); int width = (int)streamProperties.Width; int height = (int)streamProperties.Height; Assert.AreEqual(320, width); Assert.AreEqual(240, height); var inputSample = (MediaSample2D)mediaResult.Sample; Assert.AreEqual(MediaSample2DFormat.Nv12, inputSample.Format); Assert.AreEqual(320, inputSample.Width); Assert.AreEqual(240, inputSample.Height); using (var outputSample = new MediaSample2D(MediaSample2DFormat.Nv12, width, height)) { Assert.AreEqual(MediaSample2DFormat.Nv12, outputSample.Format); Assert.AreEqual(320, outputSample.Width); Assert.AreEqual(240, outputSample.Height); using (var inputBuffer = inputSample.LockBuffer(BufferAccessMode.Read)) using (var outputBuffer = outputSample.LockBuffer(BufferAccessMode.Write)) { // Wrap MediaBuffer2D in Bitmap var inputBitmap = new Bitmap( new Size(width, height), ColorMode.Yuv420Sp, new uint[] { inputBuffer.Planes[0].Pitch, inputBuffer.Planes[1].Pitch }, new IBuffer[] { inputBuffer.Planes[0].Buffer, inputBuffer.Planes[1].Buffer } ); var outputBitmap = new Bitmap( new Size(width, height), ColorMode.Yuv420Sp, new uint[] { outputBuffer.Planes[0].Pitch, outputBuffer.Planes[1].Pitch }, new IBuffer[] { outputBuffer.Planes[0].Buffer, outputBuffer.Planes[1].Buffer } ); // Apply effect var effect = new FilterEffect(); effect.Filters = new IFilter[] { new WatercolorFilter() }; effect.Source = new BitmapImageSource(inputBitmap); var renderer = new BitmapRenderer(effect, outputBitmap); await renderer.RenderAsync(); } // Save the file var folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("MediaCaptureReaderTests", CreationCollisionOption.OpenIfExists); var file = await folder.CreateFileAsync("CS_W_MediaReader_TestLumiaEffect.jpg", CreationCollisionOption.ReplaceExisting); await outputSample.SaveToFileAsync(file, ImageCompression.Jpeg); Logger.LogMessage("Saved {0}", file.Path); } } }
public void Dispose() { lock (this) { if (m_sample != null) { m_sample.Dispose(); m_sample = null; } } }
private void DecodeSample() { MediaSample2D sample; lock (this) { sample = m_sample; } if (sample == null) { return; } Logger.Events.VideoBarcodeReader_DecodeSampleStart(); int scale = (int)Math.Round(Math.Max(sample.Width / 640.0, sample.Height / 480.0)); var e = new SampleDecodedEventArgs(); using (sample) using (var scaledSample = m_processor.Convert(sample, MediaSample2DFormat.Bgra8, sample.Width / scale, sample.Height / scale)) using (var buffer = scaledSample.LockBuffer(BufferAccessMode.Read)) { var plane = buffer.Planes[0]; var result = m_barcodeReader.Decode( plane.Buffer.ToArray(), buffer.Width, buffer.Height, BitmapFormat.BGR32 ); if (result != null) { e.Text = result.Text; for (int n = 0; n < result.ResultPoints.Length; n++) { e.Points.Add(new Point(result.ResultPoints[n].X / scaledSample.Width, result.ResultPoints[n].Y / scaledSample.Height)); } } } Logger.Events.VideoBarcodeReader_DecodeSampleStop(e.Text); lock (this) { m_sample = null; } if (SampleDecoded != null) { SampleDecoded(this, e); } }
public void CS_WP_N_Basic() { ExecuteOnUIThread(async() => { var capture = new MediaCapture(); await capture.InitializeAsync(new MediaCaptureInitializationSettings { StreamingCaptureMode = StreamingCaptureMode.Video }); var graphicsDevice = MediaGraphicsDevice.CreateFromMediaCapture(capture); var previewProps = (VideoEncodingProperties)capture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview); var image = new SurfaceImageSource((int)previewProps.Width, (int)previewProps.Height); var imagePresenter = ImagePresenter.CreateFromSurfaceImageSource( image, graphicsDevice, (int)previewProps.Width, (int)previewProps.Height ); var panel = new SwapChainPanel(); var swapChainPresenter = ImagePresenter.CreateFromSwapChainPanel( panel, graphicsDevice, (int)previewProps.Width, (int)previewProps.Height ); var readerProps = VideoEncodingProperties.CreateUncompressed(MediaEncodingSubtypes.Bgra8, previewProps.Width, previewProps.Height); readerProps.FrameRate.Numerator = previewProps.FrameRate.Numerator; readerProps.FrameRate.Denominator = previewProps.FrameRate.Denominator; var captureReader = await CaptureReader.CreateAsync( capture, new MediaEncodingProfile { Video = readerProps }); using (MediaSample2D sample = (MediaSample2D)await captureReader.GetVideoSampleAsync()) { swapChainPresenter.Present(sample); imagePresenter.Present(sample); var folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("MediaCaptureReaderTests", CreationCollisionOption.OpenIfExists); var file = await folder.CreateFileAsync("CS_WP_N_Basic.jpg", CreationCollisionOption.ReplaceExisting); await sample.SaveToFileAsync(file, ImageCompression.Jpeg); } }); }
public void QueueSample(MediaSample2D sample) { lock (this) { if (m_sample == null) { m_sample = sample; Task.Run((Action)DecodeSample); } else { sample.Dispose(); Logger.Events.VideoBarcodeReader_SampleDropped(); } } }
public async Task CS_W_ImageProcessor_ImageEncoder() { var processor = new ImageProcessor(); var sample1 = new MediaSample2D(MediaSample2DFormat.Nv12, 320, 240); var sample2 = processor.Rotate(sample1, BitmapRotation.Clockwise90Degrees); var sample3 = processor.Convert(sample2, MediaSample2DFormat.Bgra8, 480, 640); var file1 = await KnownFolders.PicturesLibrary.CreateFileAsync("CS_W_ImageProcessor_ImageEncoder1.jpg", CreationCollisionOption.ReplaceExisting); await ImageEncoder.SaveToFileAsync(sample1, file1, ImageCompression.Jpeg); var file2 = await KnownFolders.PicturesLibrary.CreateFileAsync("CS_W_ImageProcessor_ImageEncoder2.jpg", CreationCollisionOption.ReplaceExisting); await sample2.SaveToFileAsync(file2, ImageCompression.Jpeg); }
private unsafe void ProcessSample(MediaSample2D sample) { using (var buffer = sample.LockBuffer(BufferAccessMode.ReadWrite)) { int width = buffer.Width; int height = buffer.Height; int pitch = (int)buffer.Planes[0].Pitch; byte *data = buffer.Planes[0].Buffer.GetData(); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int pos = i * pitch + 4 * j; data[pos + 0] = (byte)Math.Min(255, 2 * data[pos + 0]); // B data[pos + 1] = (byte)Math.Min(255, 2 * data[pos + 1]); // G data[pos + 2] = (byte)Math.Min(255, 2 * data[pos + 2]); // R } } } }
/// <summary></summary> public static async Task SaveToStreamAsync(this MediaSample2D sample, IRandomAccessStream stream, ImageCompression compression) { await ImageEncoder.SaveToStreamAsync(sample, stream, compression); }
/// <summary></summary> public static async Task SaveToFileAsync(this MediaSample2D sample, IStorageFile file, ImageCompression compression) { await ImageEncoder.SaveToFileAsync(sample, file, compression); }