using System;
using System.Runtime.InteropServices;
-using Tizen;
using Tizen.Multimedia.Util;
internal static partial class Interop
{
internal static class ThumbnailExtractor
{
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate void ThumbnailExtractCallback(ThumbnailExtractorError error, string requestId,
- int thumbWidth, int thumbHeight, IntPtr thumbData, int thumbSize, IntPtr userData);
-
- [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_create")]
- internal static extern ThumbnailExtractorError Create(out ThumbnailExtractorHandle handle);
-
- [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_extract")]
- internal static extern ThumbnailExtractorError Extract(ThumbnailExtractorHandle handle,
- ThumbnailExtractCallback callback, IntPtr userData, out IntPtr requestId);
-
- [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_set_path")]
- internal static extern ThumbnailExtractorError SetPath(ThumbnailExtractorHandle handle, string path);
-
- [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_set_size")]
- internal static extern ThumbnailExtractorError SetSize(ThumbnailExtractorHandle handle, int width, int height);
-
-
- [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_cancel")]
- internal static extern ThumbnailExtractorError Cancel(ThumbnailExtractorHandle handle, string requestId);
-
- [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_destroy")]
- internal static extern ThumbnailExtractorError Destroy(IntPtr handle);
-
[DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_extract_to_buffer")]
internal static extern ThumbnailExtractorError ExtractToBuffer(string path, uint width, uint height, out IntPtr thumbData,
out int dataSize, out uint thumbWidth, out uint thumbHeight);
[DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_extract_to_file")]
internal static extern ThumbnailExtractorError ExtractToFile(string path, uint width, uint height, string thumbPath);
}
-
- internal class ThumbnailExtractorHandle : CriticalHandle
- {
- protected ThumbnailExtractorHandle() : base(IntPtr.Zero)
- {
- }
-
- public override bool IsInvalid => handle == IntPtr.Zero;
-
- protected override bool ReleaseHandle()
- {
- var result = ThumbnailExtractor.Destroy(handle);
-
- if (result == ThumbnailExtractorError.None)
- {
- return true;
- }
-
- Log.Error(GetType().Name, $"Failed to destroy handle : {result}");
- return false;
- }
- }
}
using System;
using System.IO;
-using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using Handle = Interop.ThumbnailExtractorHandle;
using Native = Interop.ThumbnailExtractor;
namespace Tizen.Multimedia.Util
/// <since_tizen> 4 </since_tizen>
public static class ThumbnailExtractor
{
- private static Handle CreateHandle()
- {
- Native.Create(out var handle).ThrowIfError("Failed to extract.");
-
- return handle;
- }
-
/// <summary>
/// Extracts the thumbnail for the given media with the specified path.
/// </summary>
throw new ArgumentNullException(nameof(path));
}
- if (File.Exists(path) == false)
+ if (!File.Exists(path))
{
throw new FileNotFoundException("File does not exists.", path);
}
ExtractAsyncCore(path, size, cancellationToken);
}
-
private static async Task<ThumbnailExtractionResult> ExtractAsyncCore(string path, Size? size,
CancellationToken cancellationToken)
{
- using (var handle = CreateHandle())
- {
- Native.SetPath(handle, path).ThrowIfError("Failed to extract; failed to set the path.");
-
- if (size.HasValue)
- {
- Native.SetSize(handle, size.Value.Width, size.Value.Height).
- ThrowIfError("Failed to extract; failed to set the size");
- }
+ var tcs = new TaskCompletionSource<ThumbnailExtractionResult>();
- var tcs = new TaskCompletionSource<ThumbnailExtractionResult>();
+ Task thumbTask = null;
- IntPtr id = IntPtr.Zero;
-
- try
+ if (cancellationToken.CanBeCanceled)
+ {
+ cancellationToken.Register(() =>
{
- var cb = GetCallback(tcs);
- using (var cbKeeper = ObjectKeeper.Get(cb))
+ if (tcs.Task.IsCompleted)
{
- Native.Extract(handle, cb, IntPtr.Zero, out id)
- .ThrowIfError("Failed to extract.");
-
- using (RegisterCancellationToken(tcs, cancellationToken, handle, Marshal.PtrToStringAnsi(id)))
- {
- return await tcs.Task;
- }
+ return;
}
- }
- finally
- {
- LibcSupport.Free(id);
- }
+
+ tcs.TrySetCanceled();
+ });
}
- }
- private static Native.ThumbnailExtractCallback GetCallback(TaskCompletionSource<ThumbnailExtractionResult> tcs)
- {
- return (error, requestId, thumbWidth, thumbHeight, thumbData, dataSize, _) =>
+ thumbTask = Task.Factory.StartNew( () =>
{
- if (error == ThumbnailExtractorError.None)
+ try
{
- try
- {
- tcs.TrySetResult(new ThumbnailExtractionResult(thumbData, thumbWidth, thumbHeight, dataSize));
- }
- catch (Exception e)
+ var result = Extract(path, size.HasValue ? size.Value : new Size(320, 240));
+ if (result != null)
{
- tcs.TrySetException(new InvalidOperationException("[" + error + "] Failed to create ThumbnailExtractionResult instance.", e));
+ tcs.TrySetResult(result);
}
- finally
+ else
{
- LibcSupport.Free(thumbData);
+ tcs.TrySetException(new InvalidOperationException("Failed to extract thumbnail"));
}
}
- else
- {
- tcs.TrySetException(error.ToException("Failed to extract."));
- }
- };
- }
-
- private static IDisposable RegisterCancellationToken(TaskCompletionSource<ThumbnailExtractionResult> tcs,
- CancellationToken cancellationToken, Handle handle, string id)
- {
- if (cancellationToken.CanBeCanceled == false)
- {
- return null;
- }
-
- return cancellationToken.Register(() =>
- {
- if (tcs.Task.IsCompleted)
+ catch (Exception e)
{
- return;
+ Log.Error("Tizen.Multimedia.Util", e.ToString());
+ tcs.TrySetException(e);
}
+ }, cancellationToken,
+ TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning,
+ TaskScheduler.Default);
- Native.Cancel(handle, id).ThrowIfError("Failed to cancel.");
- tcs.TrySetCanceled();
- });
+ return await tcs.Task;
}
/// <summary>