2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Diagnostics;
19 using System.Runtime.InteropServices;
21 namespace Tizen.Multimedia
23 public interface IReadOnlyBuffer
26 /// Gets or sets a value at the specified index.
28 /// <param name="index">The index of the value to get or set.</param>
29 /// <exception cref="ArgumentOutOfRangeException">
30 /// index is less than zero.
32 /// index is equal to or greater than <see cref="Length"/>.
34 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
35 /// <exception cref="InvalidOperationException">The buffer is not available. i.e. not writable state.</exception>
42 /// Gets the size of the buffer, in bytes.
50 /// Copies data from a byte array to the buffer.
52 /// <param name="source">The array to copy from.</param>
53 /// <param name="startIndex">The zero-based index in the source array where copying should start.</param>
54 /// <param name="length">The number of array elements to copy.</param>
55 /// <exception cref="ArgumentOutOfRangeException">startIndex or length is not valid.</exception>
56 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
57 void CopyTo(byte[] dest, int startIndex, int length);
60 /// Copies data from a byte array to the buffer.
62 /// <param name="source">The array to copy from.</param>
63 /// <param name="startIndex">The zero-based index in the source array where copying should start.</param>
64 /// <param name="length">The number of array elements to copy.</param>
65 /// <param name="offset">The zero-based index in the buffer where copying should start.</param>
66 /// <exception cref="ArgumentOutOfRangeException">startIndex, offset or length is not valid.</exception>
67 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
68 void CopyTo(byte[] dest, int startIndex, int length, int offset);
71 public interface IMediaBuffer : IReadOnlyBuffer
74 /// Copies data from the buffer to a byte array.
76 /// <param name="dest">The array to copy to.</param>
77 /// <param name="startIndex">The zero-based index in the dest array where copying should start.</param>
78 /// <param name="length">The number of elements to copy.</param>
79 /// <exception cref="ArgumentOutOfRangeException">startIndex or length is not valid.</exception>
80 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
81 /// <exception cref="InvalidOperationException">The buffer is not available. i.e. not writable state.</exception>
83 void CopyFrom(byte[] source, int startIndex, int length);
86 /// Copies data from the buffer to a byte array.
88 /// <param name="dest">The array to copy to.</param>
89 /// <param name="startIndex">The zero-based index in the dest array where copying should start.</param>
90 /// <param name="length">The number of elements to copy.</param>
91 /// <param name="offset">The zero-based index in the buffer where copying should start.</param>
92 /// <exception cref="ArgumentOutOfRangeException">startIndex, offset or length is not valid.</exception>
93 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
94 /// <exception cref="InvalidOperationException">The buffer is not available. i.e. not writable state.</exception>
95 void CopyFrom(byte[] source, int startIndex, int length, int offset);
99 /// Represents a buffer for a <see cref="MediaPacket"/>.
101 internal class DependentMediaBuffer : IMediaBuffer
103 private readonly IBufferOwner _owner;
104 private readonly IntPtr _dataHandle;
106 internal DependentMediaBuffer(IBufferOwner owner, IntPtr dataHandle, int size)
108 Debug.Assert(owner != null, "Owner is null!");
109 Debug.Assert(!owner.IsDisposed, "Owner has been already disposed!");
110 Debug.Assert(dataHandle != IntPtr.Zero, "dataHandle is null!");
111 Debug.Assert(size >= 0, "size must not be negative!");
114 _dataHandle = dataHandle;
118 public byte this[int index]
122 _owner.ValidateBufferReadable(this);
124 if (index < 0 || index >= Length)
126 throw new ArgumentOutOfRangeException($"Valid index range is [0, { nameof(Length) }).");
129 return Marshal.ReadByte(_dataHandle, index);
133 _owner.ValidateBufferWritable(this);
135 Marshal.WriteByte(_dataHandle, index, value);
140 /// Validates the range
142 /// <param name="offset"></param>
143 /// <param name="length"></param>
144 /// <exception cref="ArgumentOutOfRangeException">
145 /// offset + length is greater than <see cref="Length"/>.
146 /// <para>-or-</para>
147 /// offset or length is less than zero.
149 private void ValidateRange(int offset, int length)
151 if (offset + length > Length)
153 throw new ArgumentOutOfRangeException("offset + length can't be greater than length of the buffer.");
157 throw new ArgumentOutOfRangeException($"Length can't be less than zero : { length }.");
161 throw new ArgumentOutOfRangeException($"Offset can't be less than zero : { offset }.");
165 public void CopyFrom(byte[] source, int startIndex, int length, int offset)
167 _owner.ValidateBufferReadable(this);
171 throw new ArgumentOutOfRangeException("startIndex can't be less than zero.");
173 if (startIndex + length > source.Length)
175 throw new ArgumentOutOfRangeException("startIndex + length can't be greater than source.Length.");
178 ValidateRange(offset, length);
180 Marshal.Copy(source, startIndex, IntPtr.Add(_dataHandle, offset), length);
183 public void CopyFrom(byte[] source, int startIndex, int length)
185 CopyFrom(source, startIndex, length, 0);
188 public void CopyTo(byte[] dest, int startIndex, int length, int offset)
190 _owner.ValidateBufferWritable(this);
194 throw new ArgumentOutOfRangeException("Start index can't be less than zero.");
196 if (startIndex + length > dest.Length)
198 throw new ArgumentOutOfRangeException("startIndex + length can't be greater than dest.Length.");
201 ValidateRange(offset, length);
203 Marshal.Copy(IntPtr.Add(_dataHandle, offset), dest, startIndex, length);
206 public void CopyTo(byte[] dest, int startIndex, int length)
208 CopyTo(dest, startIndex, length, 0);
211 public int Length { get; }