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);
            }
        }
Exemple #4
0
        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);
 }