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>
41 /// Gets the size of the buffer, in bytes.
49 /// Copies data from a byte array to the buffer.
51 /// <param name="source">The array to copy from.</param>
52 /// <param name="startIndex">The zero-based index in the source array where copying should start.</param>
53 /// <param name="length">The number of array elements to copy.</param>
54 /// <exception cref="ArgumentOutOfRangeException">startIndex or length is not valid.</exception>
55 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
56 void CopyTo(byte[] dest, int startIndex, int length);
59 /// Copies data from a byte array to the buffer.
61 /// <param name="source">The array to copy from.</param>
62 /// <param name="startIndex">The zero-based index in the source array where copying should start.</param>
63 /// <param name="length">The number of array elements to copy.</param>
64 /// <param name="offset">The zero-based index in the buffer where copying should start.</param>
65 /// <exception cref="ArgumentOutOfRangeException">startIndex, offset or length is not valid.</exception>
66 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
67 void CopyTo(byte[] dest, int startIndex, int length, int offset);
70 public interface IMediaBuffer : IReadOnlyBuffer
73 /// Gets or sets a value at the specified index.
75 /// <param name="index">The index of the value to get or set.</param>
76 /// <exception cref="ArgumentOutOfRangeException">
77 /// index is less than zero.
79 /// index is equal to or greater than <see cref="Length"/>.
81 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
82 /// <exception cref="InvalidOperationException">The buffer is not available. i.e. not writable state.</exception>
89 /// Copies data from the buffer to a byte array.
91 /// <param name="dest">The array to copy to.</param>
92 /// <param name="startIndex">The zero-based index in the dest array where copying should start.</param>
93 /// <param name="length">The number of elements to copy.</param>
94 /// <exception cref="ArgumentOutOfRangeException">startIndex or length is not valid.</exception>
95 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
96 /// <exception cref="InvalidOperationException">The buffer is not available. i.e. not writable state.</exception>
98 void CopyFrom(byte[] source, int startIndex, int length);
101 /// Copies data from the buffer to a byte array.
103 /// <param name="dest">The array to copy to.</param>
104 /// <param name="startIndex">The zero-based index in the dest array where copying should start.</param>
105 /// <param name="length">The number of elements to copy.</param>
106 /// <param name="offset">The zero-based index in the buffer where copying should start.</param>
107 /// <exception cref="ArgumentOutOfRangeException">startIndex, offset or length is not valid.</exception>
108 /// <exception cref="ObjectDisposedException">The object that owns the current buffer already has been disposed of.</exception>
109 /// <exception cref="InvalidOperationException">The buffer is not available. i.e. not writable state.</exception>
110 void CopyFrom(byte[] source, int startIndex, int length, int offset);
115 /// Represents a buffer for a <see cref="MediaPacket"/>.
117 internal class DependentMediaBuffer : IMediaBuffer
119 private readonly IBufferOwner _owner;
120 private readonly IntPtr _dataHandle;
122 internal DependentMediaBuffer(IBufferOwner owner, IntPtr dataHandle, int size)
124 Debug.Assert(owner != null, "Owner is null!");
125 Debug.Assert(!owner.IsDisposed, "Owner has been already disposed!");
126 Debug.Assert(dataHandle != IntPtr.Zero, "dataHandle is null!");
127 Debug.Assert(size >= 0, "size must not be negative!");
130 _dataHandle = dataHandle;
134 public byte this[int index]
138 _owner.ValidateBufferReadable(this);
140 if (index < 0 || index >= Length)
142 throw new ArgumentOutOfRangeException($"Valid index range is [0, { nameof(Length) }).");
145 return Marshal.ReadByte(_dataHandle, index);
149 _owner.ValidateBufferWritable(this);
151 Marshal.WriteByte(_dataHandle, index, value);
156 /// Validates the range
158 /// <param name="offset"></param>
159 /// <param name="length"></param>
160 /// <exception cref="ArgumentOutOfRangeException">
161 /// offset + length is greater than <see cref="Length"/>.
162 /// <para>-or-</para>
163 /// offset or length is less than zero.
165 private void ValidateRange(int offset, int length)
167 if (offset + length > Length)
169 throw new ArgumentOutOfRangeException("offset + length can't be greater than length of the buffer.");
173 throw new ArgumentOutOfRangeException($"Length can't be less than zero : { length }.");
177 throw new ArgumentOutOfRangeException($"Offset can't be less than zero : { offset }.");
181 public void CopyFrom(byte[] source, int startIndex, int length, int offset)
183 _owner.ValidateBufferReadable(this);
187 throw new ArgumentOutOfRangeException("startIndex can't be less than zero.");
189 if (startIndex + length > source.Length)
191 throw new ArgumentOutOfRangeException("startIndex + length can't be greater than source.Length.");
194 ValidateRange(offset, length);
196 Marshal.Copy(source, startIndex, IntPtr.Add(_dataHandle, offset), length);
199 public void CopyFrom(byte[] source, int startIndex, int length)
201 CopyFrom(source, startIndex, length, 0);
204 public void CopyTo(byte[] dest, int startIndex, int length, int offset)
206 _owner.ValidateBufferWritable(this);
210 throw new ArgumentOutOfRangeException("Start index can't be less than zero.");
212 if (startIndex + length > dest.Length)
214 throw new ArgumentOutOfRangeException("startIndex + length can't be greater than dest.Length.");
217 ValidateRange(offset, length);
219 Marshal.Copy(IntPtr.Add(_dataHandle, offset), dest, startIndex, length);
222 public void CopyTo(byte[] dest, int startIndex, int length)
224 CopyTo(dest, startIndex, length, 0);
227 public int Length { get; }