[Multimedia] Fix ASAN crash issue (#5699)
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia.Metadata / MetadataExtractor / Metadata.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using System.Diagnostics;
19
20 namespace Tizen.Multimedia
21 {
22     /// <summary>
23     /// Represents the video metadata information.
24     /// </summary>
25     /// <since_tizen> 4 </since_tizen>
26     public class VideoMetadata
27     {
28         private VideoMetadata(int streamCount, MetadataExtractor extractor)
29         {
30             Debug.Assert(streamCount > 0);
31
32             StreamCount = streamCount;
33             BitRate = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.VideoBitrate));
34             Fps = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.VideoFps));
35             Width = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.VideoWidth));
36             Height = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.VideoHeight));
37             Codec = extractor.GetMetadata(MetadataExtractorAttr.VideoCodec);
38
39             _description = new Lazy<string>(() => ObjectDescriptionBuilder.BuildWithProperties(this));
40         }
41
42         internal static VideoMetadata From(MetadataExtractor extractor)
43         {
44             var streamCount = ValueConverter.ToInt(extractor.GetMetadata(MetadataExtractorAttr.VideoStreamCount));
45
46             return streamCount > 0 ? new VideoMetadata(streamCount, extractor) : null;
47         }
48
49         /// <summary>
50         /// Gets the bitrate.
51         /// </summary>
52         /// <since_tizen> 4 </since_tizen>
53         /// <value>The bitrate value, or null if the information does not exist.</value>
54         public int? BitRate { get; }
55
56         /// <summary>
57         /// Gets the video fps.
58         /// </summary>
59         /// <since_tizen> 4 </since_tizen>
60         /// <value>The fps value, or null if the information does not exist.</value>
61         public int? Fps { get; }
62
63         /// <summary>
64         /// Gets the width of the video.
65         /// </summary>
66         /// <since_tizen> 4 </since_tizen>
67         /// <value>The width value, or null if the information does not exist.</value>
68         public int? Width { get; }
69
70         /// <summary>
71         /// Gets the height of the video.
72         /// </summary>
73         /// <since_tizen> 4 </since_tizen>
74         /// <value>The height value, or null if the information does not exist.</value>
75         public int? Height { get; }
76
77         /// <summary>
78         /// Gets the codec type of the video.
79         /// </summary>
80         /// <since_tizen> 4 </since_tizen>
81         /// <value>A string representing the codec type, or null if the information does not exist.</value>
82         public string Codec { get; }
83
84         /// <summary>
85         /// Gets the video stream count.
86         /// </summary>
87         /// <since_tizen> 4 </since_tizen>
88         /// <value>The number of video streams.</value>
89         public int StreamCount { get; }
90
91         private Lazy<string> _description;
92
93         /// <summary>
94         /// Returns a string that represents the current object.
95         /// </summary>
96         /// <returns>A string that represents the current object.</returns>
97         /// <since_tizen> 4 </since_tizen>
98         public override string ToString() => _description.Value;
99     }
100
101     /// <summary>
102     /// Represents the audio metadata information.
103     /// </summary>
104     /// <since_tizen> 4 </since_tizen>
105     public class AudioMetadata
106     {
107         private AudioMetadata(int streamCount, MetadataExtractor extractor)
108         {
109             Debug.Assert(streamCount > 0);
110
111             StreamCount = streamCount;
112             BitRate = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.AudioBitrate));
113             Channels = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.AudioChannels));
114             SampleRate = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.AudioSamplerate));
115             BitPerSample = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.AudioBitPerSample));
116             Codec = extractor.GetMetadata(MetadataExtractorAttr.AudioCodec);
117
118             _description = new Lazy<string>(() => ObjectDescriptionBuilder.BuildWithProperties(this));
119         }
120
121         internal static AudioMetadata From(MetadataExtractor extractor)
122         {
123             var streamCount = ValueConverter.ToInt(extractor.GetMetadata(MetadataExtractorAttr.AudioStreamCount));
124
125             return streamCount > 0 ? new AudioMetadata(streamCount, extractor) : null;
126         }
127
128         /// <summary>
129         /// Gets the audio bitrate.
130         /// </summary>
131         /// <since_tizen> 4 </since_tizen>
132         /// <value>The bit rate value, or null if the information does not exist.</value>
133         public int? BitRate { get; }
134
135         /// <summary>
136         /// Gets the audio channels.
137         /// </summary>
138         /// <since_tizen> 4 </since_tizen>
139         /// <value>The number of the audio channels, or null if the information does not exist.</value>
140         public int? Channels { get; }
141
142         /// <summary>
143         /// Gets the audio sample rate.
144         /// </summary>
145         /// <since_tizen> 4 </since_tizen>
146         /// <value>The sample rate, or null if the information does not exist.</value>
147         public int? SampleRate { get; }
148
149         /// <summary>
150         /// Gets the bit per sample of the audio.
151         /// </summary>
152         /// <since_tizen> 4 </since_tizen>
153         /// <value>The bit per sample, or null if the information does not exist.</value>
154         public int? BitPerSample { get; }
155
156         /// <summary>
157         /// Gets the audio stream count.
158         /// </summary>
159         /// <since_tizen> 4 </since_tizen>
160         /// <value>The number of audio streams.</value>
161         public int StreamCount { get; }
162
163         /// <summary>
164         /// Gets the audio codec type.
165         /// </summary>
166         /// <since_tizen> 4 </since_tizen>
167         public string Codec { get; }
168
169         private Lazy<string> _description;
170
171         /// <summary>
172         /// Returns a string that represents the current object.
173         /// </summary>
174         /// <returns>A string that represents the current object.</returns>
175         /// <since_tizen> 4 </since_tizen>
176         public override string ToString() => _description.Value;
177     }
178
179     /// <summary>
180     /// Represents the metadata information of a media.
181     /// </summary>
182     /// <since_tizen> 3 </since_tizen>
183     public class Metadata
184     {
185         internal Metadata(MetadataExtractor extractor)
186         {
187             Debug.Assert(extractor != null);
188
189             Video = VideoMetadata.From(extractor);
190             Audio = AudioMetadata.From(extractor);
191
192             Duration = ValueConverter.ToNullableInt(extractor.GetMetadata(MetadataExtractorAttr.Duration));
193             Artist = extractor.GetMetadata(MetadataExtractorAttr.Artist);
194             Title = extractor.GetMetadata(MetadataExtractorAttr.Title);
195             Album = extractor.GetMetadata(MetadataExtractorAttr.Album);
196             AlbumArtist = extractor.GetMetadata(MetadataExtractorAttr.AlbumArtist);
197             Genre = extractor.GetMetadata(MetadataExtractorAttr.Genre);
198 #pragma warning disable CS0618 // Type or member is obsolete
199             Author = extractor.GetMetadata(MetadataExtractorAttr.Composer);
200 #pragma warning restore CS0618 // Type or member is obsolete
201             Composer = extractor.GetMetadata(MetadataExtractorAttr.Composer);
202             Copyright = extractor.GetMetadata(MetadataExtractorAttr.Copyright);
203             DateReleased = extractor.GetMetadata(MetadataExtractorAttr.ReleaseDate);
204             Description = extractor.GetMetadata(MetadataExtractorAttr.Description);
205             Comment = extractor.GetMetadata(MetadataExtractorAttr.Comment);
206             TrackNumber = extractor.GetMetadata(MetadataExtractorAttr.TrackNum);
207             Classification = extractor.GetMetadata(MetadataExtractorAttr.Classification);
208             Rating = extractor.GetMetadata(MetadataExtractorAttr.Rating);
209             Longitude = ValueConverter.ToNullableDouble(extractor.GetMetadata(MetadataExtractorAttr.Longitude));
210             Latitude = ValueConverter.ToNullableDouble(extractor.GetMetadata(MetadataExtractorAttr.Latitude));
211             Altitude = ValueConverter.ToNullableDouble(extractor.GetMetadata(MetadataExtractorAttr.Altitude));
212             Conductor = extractor.GetMetadata(MetadataExtractorAttr.Conductor);
213             UnsyncLyrics = extractor.GetMetadata(MetadataExtractorAttr.UnSyncLyrics);
214             SyncLyricsCount = ValueConverter.ToInt(extractor.GetMetadata(MetadataExtractorAttr.SyncLyricsNum));
215             DateRecorded = extractor.GetMetadata(MetadataExtractorAttr.RecordingDate);
216             Rotation = extractor.GetMetadata(MetadataExtractorAttr.Rotate);
217             Content360 = extractor.GetMetadata(MetadataExtractorAttr.ContentFor360);
218
219             _description = new Lazy<string>(() => ObjectDescriptionBuilder.BuildWithProperties(this));
220         }
221
222         /// <summary>
223         /// Gets the duration of the media.
224         /// </summary>
225         /// <since_tizen> 4 </since_tizen>
226         /// <value>The duration value, or null if the information does not exist.</value>
227         public int? Duration { get; }
228
229         /// <summary>
230         /// Gets the video metadata.
231         /// </summary>
232         /// <since_tizen> 4 </since_tizen>
233         /// <value>The video metadata, or null if the information does not exist.</value>
234         public VideoMetadata Video { get; }
235
236         /// <summary>
237         /// Gets the audio metadata.
238         /// </summary>
239         /// <since_tizen> 4 </since_tizen>
240         /// <value>The audio metadata, or null if the information does not exist.</value>
241         public AudioMetadata Audio { get; }
242
243         /// <summary>
244         /// Gets the artist of the media.
245         /// </summary>
246         /// <since_tizen> 3 </since_tizen>
247         /// <value>A string representing the artist, or null if the information does not exist.</value>
248         public string Artist { get; }
249
250         /// <summary>
251         /// Gets the title of the media.
252         /// </summary>
253         /// <since_tizen> 3 </since_tizen>
254         /// <value>A string representing the title, or null if the information does not exist.</value>
255         public string Title { get; }
256
257         /// <summary>
258         /// Gets the album name of the media.
259         /// </summary>
260         /// <since_tizen> 3 </since_tizen>
261         /// <value>A string representing the album name, or null if the information does not exist.</value>
262         public string Album { get; }
263
264         /// <summary>
265         /// Gets the album artist of the media.
266         /// </summary>
267         /// <since_tizen> 3 </since_tizen>
268         /// <value>A string representing the album artist, or null if the information does not exist.</value>
269         public string AlbumArtist { get; }
270
271         /// <summary>
272         /// Gets the genre of the media.
273         /// </summary>
274         /// <since_tizen> 3 </since_tizen>
275         /// <value>A string representing the genre, or null if the information does not exist.</value>
276         public string Genre { get; }
277
278         /// <summary>
279         /// Gets the author of the media.
280         /// </summary>
281         /// <since_tizen> 3 </since_tizen>
282         /// <value>A string representing the author, or null if the information does not exist.</value>
283         [Obsolete("Please do not use! This will be deprecated. Please use Composer instead.")]
284         public string Author { get; }
285
286         /// <summary>
287         /// Gets the composer of the media.
288         /// </summary>
289         /// <since_tizen> 6 </since_tizen>
290         /// <value>A string representing the composer, or null if the information does not exist.</value>
291         public string Composer { get; }
292
293         /// <summary>
294         /// Gets the copyright of the media.
295         /// </summary>
296         /// <since_tizen> 3 </since_tizen>
297         /// <value>A string representing the copyright, or null if the information does not exist.</value>
298         public string Copyright { get; }
299
300         /// <summary>
301         /// Gets the release date of the media.
302         /// </summary>
303         /// <since_tizen> 4 </since_tizen>
304         /// <value>A string representing the release date, or null if the information does not exist.</value>
305         public string DateReleased { get; }
306
307         /// <summary>
308         /// Gets the description of the media.
309         /// </summary>
310         /// <since_tizen> 3 </since_tizen>
311         /// <value>A string representing the description, or null if the information does not exist.</value>
312         public string Description { get; }
313
314         /// <summary>
315         /// Gets the comment of the media.
316         /// </summary>
317         /// <since_tizen> 3 </since_tizen>
318         /// <value>A string representing the comment, or null if the information does not exist.</value>
319         public string Comment { get; }
320
321         /// <summary>
322         /// Gets the track number of the media.
323         /// </summary>
324         /// <since_tizen> 3 </since_tizen>
325         /// <value>A string representing the track number, or null if the information does not exist.</value>
326         public string TrackNumber { get; }
327
328         /// <summary>
329         /// Gets the classification of the media.
330         /// </summary>
331         /// <since_tizen> 3 </since_tizen>
332         /// <value>A string representing the classification, or null if the information does not exist.</value>
333         public string Classification { get; }
334
335         /// <summary>
336         /// Gets the rating of the media.
337         /// </summary>
338         /// <since_tizen> 3 </since_tizen>
339         /// <value>A string representing the rating, or null if the information does not exist.</value>
340         public string Rating { get; }
341
342         /// <summary>
343         /// Gets the longitude of the media.
344         /// </summary>
345         /// <since_tizen> 4 </since_tizen>
346         /// <value>The longitude value, or null if the information does not exist.</value>
347         public double? Longitude { get; }
348
349         /// <summary>
350         /// Gets the latitude of the media.
351         /// </summary>
352         /// <since_tizen> 4 </since_tizen>
353         /// <value>The latitude value, or null if the information does not exist.</value>
354         public double? Latitude { get; }
355
356         /// <summary>
357         /// Gets the altitude of the media.
358         /// </summary>
359         /// <since_tizen> 4 </since_tizen>
360         /// <value>The altitude value, or null if the information does not exist.</value>
361         public double? Altitude { get; }
362
363         /// <summary>
364         /// Gets the conductor of the media.
365         /// </summary>
366         /// <since_tizen> 3 </since_tizen>
367         /// <value>A string representing the conductor, or null if the information does not exist.</value>
368         public string Conductor { get; }
369
370         /// <summary>
371         /// Gets the unsynchronized lyrics of the media.
372         /// </summary>
373         /// <since_tizen> 4 </since_tizen>
374         /// <value>A string representing the unsynchronized lyrics, or null if the information does not exist.</value>
375         public string UnsyncLyrics { get; }
376
377         /// <summary>
378         /// Gets the number of synchronized lyrics of the media.
379         /// </summary>
380         /// <since_tizen> 4 </since_tizen>
381         /// <value>The number of the synchronized lyrics.</value>
382         public int SyncLyricsCount { get; }
383
384         /// <summary>
385         /// Gets the recording date of the media.
386         /// </summary>
387         /// <since_tizen> 4 </since_tizen>
388         /// <value>A string representing the recording date, or null if the information does not exist.</value>
389         public string DateRecorded { get; }
390
391         /// <summary>
392         /// Gets the rotate(orientation) information of the media.
393         /// </summary>
394         /// <since_tizen> 4 </since_tizen>
395         /// <value>A string representing the rotation information, or null if the information does not exist.</value>
396         public string Rotation { get; }
397
398         /// <summary>
399         /// Gets the information for 360 content of the media.
400         /// </summary>
401         /// <since_tizen> 3 </since_tizen>
402         /// <value>A string representing the information for 360 content, or null if the information does not exist.</value>
403         public string Content360 { get; }
404
405         private Lazy<string> _description;
406
407         /// <summary>
408         /// Returns a string that represents the current object.
409         /// </summary>
410         /// <returns>A string that represents the current object.</returns>
411         /// <since_tizen> 3 </since_tizen>
412         public override string ToString() => _description.Value;
413     }
414 }