<Reference Include="System.Core">\r
<RequiredTargetFramework>3.5</RequiredTargetFramework>\r
</Reference>\r
- <Reference Include="System.Drawing" />\r
<Reference Include="System.Xml.Linq">\r
<RequiredTargetFramework>3.5</RequiredTargetFramework>\r
</Reference>\r
<Compile Include="Interop\Model\Encoding\DeinterlaceFilter.cs" />\r
<Compile Include="Interop\Model\Encoding\HBPresetTune.cs" />\r
<Compile Include="Interop\Model\Encoding\Sharpen.cs" />\r
+ <Compile Include="Interop\Model\Preview\RawPreviewData.cs" />\r
<Compile Include="Properties\AssemblyInfo.cs" />\r
<Compile Include="Interop\Json\Scan\SourceAudioTrack.cs" />\r
<Compile Include="Interop\Json\Scan\SourceChapter.cs" />\r
using System;\r
using System.Collections.Generic;\r
using System.Diagnostics;\r
- using System.Drawing;\r
- using System.Drawing.Imaging;\r
- using System.IO;\r
using System.Linq;\r
using System.Runtime.ExceptionServices;\r
using System.Runtime.InteropServices;\r
using HandBrake.ApplicationServices.Interop.Interfaces;\r
using HandBrake.ApplicationServices.Interop.Json.Encode;\r
using HandBrake.ApplicationServices.Interop.Json.Scan;\r
- using HandBrake.ApplicationServices.Interop.Json.Shared;\r
using HandBrake.ApplicationServices.Interop.Json.State;\r
- using HandBrake.ApplicationServices.Interop.Model;\r
using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
using HandBrake.ApplicationServices.Interop.Model.Preview;\r
using HandBrake.ApplicationServices.Services.Logging;\r
\r
using Newtonsoft.Json;\r
\r
- using Size = HandBrake.ApplicationServices.Interop.Model.Size;\r
-\r
/// <summary>\r
/// A wrapper for a HandBrake instance.\r
/// </summary>\r
/// An image with the requested preview.\r
/// </returns>\r
[HandleProcessCorruptedStateExceptions]\r
- public Bitmap GetPreview(PreviewSettings settings, int previewNumber, bool deinterlace)\r
+ public RawPreviewData GetPreview(PreviewSettings settings, int previewNumber, bool deinterlace)\r
{\r
SourceTitle title = this.Titles.TitleList.FirstOrDefault(t => t.Index == settings.TitleNumber);\r
\r
byte[] managedBuffer = new byte[imageBufferSize];\r
Marshal.Copy(image.plane[0].data, managedBuffer, 0, imageBufferSize);\r
\r
- var bitmap = new Bitmap(image.width, image.height);\r
-\r
- BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, image.width, image.height), ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);\r
-\r
- IntPtr ptr = bitmapData.Scan0; // Pointer to the first pixel.\r
- for (int i = 0; i < image.height; i++)\r
- {\r
- try\r
- {\r
- Marshal.Copy(managedBuffer, i * stride_width, ptr, stride_width);\r
- ptr = IntPtr.Add(ptr, image.width * 4);\r
- }\r
- catch (Exception exc)\r
- {\r
- Debug.WriteLine(exc); // In theory, this will allow a partial image display if this happens. TODO add better logging of this.\r
- }\r
- }\r
-\r
- bitmap.UnlockBits(bitmapData);\r
+ RawPreviewData preview = new RawPreviewData(managedBuffer, stride_width, stride_height, image.width, image.height);\r
\r
// Close the image so we don't leak memory.\r
IntPtr nativeJobPtrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));\r
HBFunctions.hb_image_close(nativeJobPtrPtr);\r
Marshal.FreeHGlobal(nativeJobPtrPtr);\r
\r
- return bitmap;\r
+ return preview;\r
}\r
\r
/// <summary>\r
namespace HandBrake.ApplicationServices.Interop.Interfaces\r
{\r
using System;\r
- using System.Drawing;\r
\r
using HandBrake.ApplicationServices.Interop.EventArgs;\r
using HandBrake.ApplicationServices.Interop.Json.Encode;\r
/// <returns>\r
/// An image with the requested preview.\r
/// </returns>\r
- Bitmap GetPreview(PreviewSettings job, int previewNumber, bool deinterlace);\r
+ RawPreviewData GetPreview(PreviewSettings job, int previewNumber, bool deinterlace);\r
\r
/// <summary>\r
/// Pauses the current encode.\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------
+// <copyright file="RawPreviewData.cs" company="HandBrake Project (http://handbrake.fr)">
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
+// </copyright>
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace HandBrake.ApplicationServices.Interop.Model.Preview
+{
+ public class RawPreviewData
+ {
+ public RawPreviewData(byte[] rawBitmapData, int strideWidth, int strideHeight, int width, int height)
+ {
+ this.RawBitmapData = rawBitmapData;
+ this.StrideWidth = strideWidth;
+ this.StrideHeight = strideHeight;
+ this.Width = width;
+ this.Height = height;
+ }
+
+ public byte[] RawBitmapData { get; }
+ public int StrideWidth { get; }
+ public int StrideHeight { get; }
+ public int Width { get; }
+ public int Height { get; }
+ }
+}
PixelAspectY = job.PixelAspectY
};
- bitmapImage = BitmapUtilities.ConvertToBitmapImage(this.instance.GetPreview(settings, preview, job.DeinterlaceFilter != DeinterlaceFilter.Off));
+ var bitmapData = this.instance.GetPreview(settings, preview, job.DeinterlaceFilter != DeinterlaceFilter.Off);
+ bitmapImage = BitmapUtilities.ConvertToBitmapImage(BitmapUtilities.ConvertByteArrayToBitmap(bitmapData));
}
catch (AccessViolationException e)
{
namespace HandBrakeWPF.Utilities
{
+ using System;
+ using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
+ using System.Runtime.InteropServices;
using System.Windows.Media.Imaging;
+ using HandBrake.ApplicationServices.Interop.Model.Preview;
+
/// <summary>
/// The bitmap utilities.
/// </summary>
return wpfBitmap;
}
}
+
+ public static Bitmap ConvertByteArrayToBitmap(RawPreviewData previewData)
+ {
+ var bitmap = new Bitmap(previewData.Width, previewData.Height);
+
+ BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, previewData.Width, previewData.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);
+
+ IntPtr ptr = bitmapData.Scan0; // Pointer to the first pixel.
+ for (int i = 0; i < previewData.Height; i++)
+ {
+ try
+ {
+ Marshal.Copy(previewData.RawBitmapData, i * previewData.StrideWidth, ptr, previewData.StrideWidth);
+ ptr = IntPtr.Add(ptr, previewData.Width * 4);
+ }
+ catch (Exception exc)
+ {
+ Debug.WriteLine(exc); // In theory, this will allow a partial image display if this happens. TODO add better logging of this.
+ }
+ }
+
+ bitmap.UnlockBits(bitmapData);
+
+ return bitmap;
+ }
}
}