2 * Copyright (c) 2011 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.
23 #include <metadata_extractor.h>
24 #include <metadata_extractor_private.h>
26 #define SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
28 #define READ_FROM_FILE(FILE_PATH, data, size) \
30 FILE *fp = fopen(FILE_PATH, "r"); \
32 fseek(fp, 0, SEEK_END); \
34 fseek(fp, 0, SEEK_SET); \
36 data = malloc(size); \
38 if (fread(data, sizeof(char), size, fp) != (size_t)size) \
39 printf("fread error\n"); \
42 printf("file size = %ld\n", size); \
46 /* Saves dump artwork and thumbnail to current path */
47 #define DUMP_ARTWORK_THUMBNAIL 0 /* disable: 0, enable: 1*/
48 #if DUMP_ARTWORK_THUMBNAIL
49 #define DUMP_ARTWORK_PATH "./test_artwork.jpg"
50 #define DUMP_THUMBNAIL_PATH "./test_thumbnail.rgb"
53 static int _is_file_exist(const char *filename);
54 static bool __capi_metadata_extractor(metadata_extractor_h metadata);
56 #if DUMP_ARTWORK_THUMBNAIL
57 static void __write_file(const char *path, void *data, size_t length)
62 if (!path || !data || length == 0) {
63 printf("\t[__write_file] invalid data\n");
67 printf("\t[__write_file] %s %p %zu write\n", path, data, length);
69 fp = fopen(path, "w");
71 printf("\t[__write_file] fopen failed (%d)\n", errno);
75 len = fwrite(data, 1, length, fp);
77 printf("\t[__write_file] fwrite failed\n");
83 printf("\t[__write_file] %s write DONE\n", path);
87 static int _is_file_exist(const char *filename)
91 const char *to_access = (strstr(filename, "file://") != NULL) ? filename + 7 : filename;
92 ret = access(to_access, R_OK);
94 printf("file [%s] not found.\n", to_access);
99 static bool __capi_metadata_extractor(metadata_extractor_h metadata)
102 char *audio_bitrate = 0;
103 char *audio_channel = 0;
104 char *audio_samplerate = 0;
105 char *audio_bitpersample = 0;
106 char *audio_track_cnt = 0;
107 char *video_bitrate = 0;
109 char *video_width = 0;
110 char *video_height = 0;
111 char *video_track_cnt = 0;
112 void *video_thumbnail = NULL;
113 int video_thumbnail_len = 0;
114 void *video_frame = NULL;
115 int video_frame_len = 0;
121 char *album_artist = NULL;
124 char *copyright = NULL;
126 char *description = NULL;
127 char *comment = NULL;
128 void *artwork = NULL;
129 int artwork_size = 0;
130 char *artwork_mime = NULL;
131 char *track_num = NULL;
132 char *classification = NULL;
137 char *conductor = NULL;
138 char *unsynclyrics = NULL;
139 char *synclyrics_num = NULL;
140 char *rec_date = NULL;
142 char *video_codec = NULL;
143 char *audio_codec = NULL;
145 #ifdef SUPPORT_GSPHERICAL_METADATA
146 char *is_stitched_v1 = NULL;
147 char *stitching_software_v1 = NULL;
148 char *projection_type_v1 = NULL;
149 char *stereo_mode_v1 = NULL;
150 char *source_count_v1 = NULL;
151 char *initial_view_heading_degrees_v1 = NULL;
152 char *initial_view_pitch_degrees_v1 = NULL;
153 char *initial_view_roll_degrees_v1 = NULL;
154 char *timestamp_v1 = NULL;
155 char *full_pano_width_v1 = NULL;
156 char *full_pano_height_v1 = NULL;
157 char *cropped_area_image_width_v1 = NULL;
158 char *cropped_area_image_height_v1 = NULL;
159 char *cropped_area_left_v1 = NULL;
160 char *cropped_area_top_v1 = NULL;
162 char *stereo_mode_v2 = NULL;
163 char *metadata_source_v2 = NULL;
164 char *proj_type_v2 = NULL;
165 char *pose_yaw_degrees_v2 = NULL;
166 char *pose_pitch_degrees_v2 = NULL;
167 char *pose_roll_degrees_v2 = NULL;
168 char *cbmp_layout_v2 = NULL;
169 char *cbmp_padding_v2 = NULL;
170 char *equi_projection_bounds_top_v2 = NULL;
171 char *equi_projection_bounds_bottom_v2 = NULL;
172 char *equi_projection_bounds_left_v2 = NULL;
173 char *equi_projection_bounds_right_v2 = NULL;
175 char *ambisonic_type = NULL;
176 char *ambisonic_format = NULL;
177 char *ambisonic_order = NULL;
182 unsigned long time_info = 0;
185 if (metadata == NULL) {
186 printf("Invalid handle \n");
191 metadata_extractor_get_metadata(metadata, METADATA_HAS_AUDIO, &audio_track_cnt);
192 printf("audio_track_cnt = [%s]\n", audio_track_cnt);
193 metadata_extractor_get_metadata(metadata, METADATA_HAS_VIDEO, &video_track_cnt);
194 printf("video_track_cnt = [%s]\n", video_track_cnt);
195 if (video_track_cnt != NULL)
196 video_cnt = atoi(video_track_cnt);
198 metadata_extractor_get_metadata(metadata, METADATA_DURATION, &duration);
199 printf("duration = [%s]\n", duration);
200 metadata_extractor_get_metadata(metadata, METADATA_AUDIO_BITRATE, &audio_bitrate);
201 printf("audio_bitrate = [%s]bps\n", audio_bitrate);
202 metadata_extractor_get_metadata(metadata, METADATA_AUDIO_CHANNELS, &audio_channel);
203 printf("audio_channel = [%s]\n", audio_channel);
204 metadata_extractor_get_metadata(metadata, METADATA_AUDIO_SAMPLERATE, &audio_samplerate);
205 printf("audio_samplerate = [%s]Hz\n", audio_samplerate);
206 metadata_extractor_get_metadata(metadata, METADATA_AUDIO_BITPERSAMPLE, &audio_bitpersample);
207 printf("audio_bitpersample = [%s]Bit\n", audio_bitpersample);
210 metadata_extractor_get_metadata(metadata, METADATA_VIDEO_BITRATE, &video_bitrate);
211 printf("video_bitrate = [%s]bps\n", video_bitrate);
212 metadata_extractor_get_metadata(metadata, METADATA_VIDEO_FPS, &video_fps);
213 printf("video_fps = [%s]\n", video_fps);
214 metadata_extractor_get_metadata(metadata, METADATA_VIDEO_WIDTH, &video_width);
215 printf("video_width = [%s]\n", video_width);
216 metadata_extractor_get_metadata(metadata, METADATA_VIDEO_HEIGHT, &video_height);
217 printf("video_height = [%s]\n", video_height);
220 metadata_extractor_get_metadata(metadata, METADATA_ARTIST, &artist);
221 printf("artist = [%s]\n", artist);
222 metadata_extractor_get_metadata(metadata, METADATA_TITLE, &title);
223 printf("title = [%s]\n", title);
224 metadata_extractor_get_metadata(metadata, METADATA_ALBUM, &album);
225 printf("album = [%s]\n", album);
226 metadata_extractor_get_metadata(metadata, METADATA_ALBUM_ARTIST, &album_artist);
227 printf("album_artist = [%s]\n", album_artist);
228 metadata_extractor_get_metadata(metadata, METADATA_GENRE, &genre);
229 printf("genre = [%s]\n", genre);
230 metadata_extractor_get_metadata(metadata, METADATA_COMPOSER, &author);
231 printf("author = [%s]\n", author);
232 metadata_extractor_get_metadata(metadata, METADATA_COPYRIGHT, ©right);
233 printf("copyright = [%s]\n", copyright);
234 metadata_extractor_get_metadata(metadata, METADATA_DATE, &date);
235 printf("date = [%s]\n", date);
236 metadata_extractor_get_metadata(metadata, METADATA_DESCRIPTION, &description);
237 printf("description = [%s]\n", description);
238 metadata_extractor_get_metadata(metadata, METADATA_COMMENT, &comment);
239 printf("comment = [%s]\n", comment);
240 metadata_extractor_get_metadata(metadata, METADATA_TRACK_NUM, &track_num);
241 printf("track_num = [%s]\n", track_num);
242 metadata_extractor_get_metadata(metadata, METADATA_CLASSIFICATION, &classification);
243 printf("classification = [%s]\n", classification);
244 metadata_extractor_get_metadata(metadata, METADATA_RATING, &rating);
245 printf("rating = [%s]\n", rating);
246 metadata_extractor_get_metadata(metadata, METADATA_LONGITUDE, &longitude);
247 printf("longitude = [%s]\n", longitude);
248 metadata_extractor_get_metadata(metadata, METADATA_LATITUDE, &latitude);
249 printf("latitude = [%s]\n", latitude);
250 metadata_extractor_get_metadata(metadata, METADATA_ALTITUDE, &altitude);
251 printf("altitude = [%s]\n", altitude);
252 metadata_extractor_get_metadata(metadata, METADATA_CONDUCTOR, &conductor);
253 printf("conductor = [%s]\n", conductor);
254 metadata_extractor_get_metadata(metadata, METADATA_UNSYNCLYRICS, &unsynclyrics);
255 printf("unsynclyrics = [%s]\n", unsynclyrics);
256 metadata_extractor_get_metadata(metadata, METADATA_RECDATE, &rec_date);
257 printf("rec_date = [%s]\n", rec_date);
258 metadata_extractor_get_metadata(metadata, METADATA_ROTATE, &rotate);
259 printf("rotate = [%s]\n", rotate);
260 metadata_extractor_get_metadata(metadata, METADATA_AUDIO_CODEC, &audio_codec);
261 printf("audio_codec = [%s]\n", audio_codec);
262 metadata_extractor_get_metadata(metadata, METADATA_VIDEO_CODEC, &video_codec);
263 printf("video_codec = [%s]\n", video_codec);
264 metadata_extractor_get_metadata(metadata, METADATA_360, &is_360);
265 printf("is_360 = [%s]\n", is_360);
267 #ifdef SUPPORT_GSPHERICAL_METADATA
268 metadata_extractor_get_metadata(metadata, METADATA_360_V1_STITCHED, &is_stitched_v1);
269 printf("is_stitched_v1 = [%s]\n", is_stitched_v1);
270 metadata_extractor_get_metadata(metadata, METADATA_360_V1_STITCHING_SOFTWARE, &stitching_software_v1);
271 printf("stitching_software_v1 = [%s]\n", stitching_software_v1);
272 metadata_extractor_get_metadata(metadata, METADATA_360_V1_PROJECTION_TYPE, &projection_type_v1);
273 printf("projection_type_v1 = [%s]\n", projection_type_v1);
274 metadata_extractor_get_metadata(metadata, METADATA_360_V1_STEREO_MODE, &stereo_mode_v1);
275 printf("stereo_mode_v1 = [%s]\n", stereo_mode_v1);
276 metadata_extractor_get_metadata(metadata, METADATA_360_V1_SOURCE_COUNT, &source_count_v1);
277 printf("source_count_v1 = [%s]\n", source_count_v1);
278 metadata_extractor_get_metadata(metadata, METADATA_360_V1_INIT_VIEW_HEADING, &initial_view_heading_degrees_v1);
279 printf("initial_view_heading_degrees_v1 = [%s]\n", initial_view_heading_degrees_v1);
280 metadata_extractor_get_metadata(metadata, METADATA_360_V1_INIT_VIEW_PITCH, &initial_view_pitch_degrees_v1);
281 printf("initial_view_pitch_degrees_v1 = [%s]\n", initial_view_pitch_degrees_v1);
282 metadata_extractor_get_metadata(metadata, METADATA_360_V1_INIT_VIEW_ROLL, &initial_view_roll_degrees_v1);
283 printf("initial_view_roll_degrees_v1 = [%s]\n", initial_view_roll_degrees_v1);
284 metadata_extractor_get_metadata(metadata, METADATA_360_V1_TIMESTAMP, ×tamp_v1);
285 printf("timestamp_v1 = [%s]\n", timestamp_v1);
286 metadata_extractor_get_metadata(metadata, METADATA_360_V1_FULL_PANO_WIDTH, &full_pano_width_v1);
287 printf("full_pano_width_v1 = [%s]\n", full_pano_width_v1);
288 metadata_extractor_get_metadata(metadata, METADATA_360_V1_FULL_PANO_HEIGHT, &full_pano_height_v1);
289 printf("full_pano_height_v1 = [%s]\n", full_pano_height_v1);
290 metadata_extractor_get_metadata(metadata, METADATA_360_V1_CROPPED_AREA_IMAGE_WIDTH, &cropped_area_image_width_v1);
291 printf("cropped_area_image_width_v1 = [%s]\n", cropped_area_image_width_v1);
292 metadata_extractor_get_metadata(metadata, METADATA_360_V1_CROPPED_AREA_IMAGE_HEIGHT, &cropped_area_image_height_v1);
293 printf("cropped_area_image_height_v1 = [%s]\n", cropped_area_image_height_v1);
294 metadata_extractor_get_metadata(metadata, METADATA_360_V1_CROPPED_AREA_LEFT, &cropped_area_left_v1);
295 printf("cropped_area_left_v1 = [%s]\n", cropped_area_left_v1);
296 metadata_extractor_get_metadata(metadata, METADATA_360_V1_CROPPED_AREA_TOP, &cropped_area_top_v1);
297 printf("cropped_area_top_v1 = [%s]\n", cropped_area_top_v1);
299 metadata_extractor_get_metadata(metadata, METADATA_360_V2_STEREO_MODE, &stereo_mode_v2);
300 printf("stereo_mode_v2 = [%s]\n", stereo_mode_v2);
301 metadata_extractor_get_metadata(metadata, METADATA_360_V2_METADATA_SOURCE, &metadata_source_v2);
302 printf("metadata_source_v2 = [%s]\n", metadata_source_v2);
303 metadata_extractor_get_metadata(metadata, METADATA_360_V2_PROJ_TYPE, &proj_type_v2);
304 printf("proj_type_v2 = [%s]\n", proj_type_v2);
305 metadata_extractor_get_metadata(metadata, METADATA_360_V2_POSE_YAW, &pose_yaw_degrees_v2);
306 printf("pose_yaw_degrees_v2 = [%s]\n", pose_yaw_degrees_v2);
307 metadata_extractor_get_metadata(metadata, METADATA_360_V2_POSE_PITCH, &pose_pitch_degrees_v2);
308 printf("pose_pitch_degrees_v2 = [%s]\n", pose_pitch_degrees_v2);
309 metadata_extractor_get_metadata(metadata, METADATA_360_V2_POSE_ROLL, &pose_roll_degrees_v2);
310 printf("pose_roll_degrees_v2 = [%s]\n", pose_roll_degrees_v2);
311 metadata_extractor_get_metadata(metadata, METADATA_360_V2_CBMP_LAYOUT, &cbmp_layout_v2);
312 printf("cbmp_layout_v2 = [%s]\n", cbmp_layout_v2);
313 metadata_extractor_get_metadata(metadata, METADATA_360_V2_CBMP_PADDING, &cbmp_padding_v2);
314 printf("cbmp_padding_v2 = [%s]\n", cbmp_padding_v2);
315 metadata_extractor_get_metadata(metadata, METADATA_360_V2_EQUI_BOUNDS_TOP, &equi_projection_bounds_top_v2);
316 printf("equi_projection_bounds_top_v2 = [%s]\n", equi_projection_bounds_top_v2);
317 metadata_extractor_get_metadata(metadata, METADATA_360_V2_EQUI_BOUNDS_BOTTOM, &equi_projection_bounds_bottom_v2);
318 printf("equi_projection_bounds_bottom_v2 = [%s]\n", equi_projection_bounds_bottom_v2);
319 metadata_extractor_get_metadata(metadata, METADATA_360_V2_EQUI_BOUNDS_LEFT, &equi_projection_bounds_left_v2);
320 printf("equi_projection_bounds_left_v2 = [%s]\n", equi_projection_bounds_left_v2);
321 metadata_extractor_get_metadata(metadata, METADATA_360_V2_EQUI_BOUNDS_RIGHT, &equi_projection_bounds_right_v2);
322 printf("equi_projection_bounds_right_v2 = [%s]\n", equi_projection_bounds_right_v2);
324 metadata_extractor_get_metadata(metadata, METADATA_AMBISONIC_TYPE, &ambisonic_type);
325 printf("ambisonic_type = [%s]\n", ambisonic_type);
326 metadata_extractor_get_metadata(metadata, METADATA_AMBISONIC_FORMAT, &ambisonic_format);
327 printf("ambisonic_format = [%s]\n", ambisonic_format);
328 metadata_extractor_get_metadata(metadata, METADATA_AMBISONIC_ORDER, &ambisonic_order);
329 printf("ambisonic_order = [%s]\n", ambisonic_order);
332 metadata_extractor_get_metadata(metadata, METADATA_SYNCLYRICS_NUM, &synclyrics_num);
333 if (synclyrics_num) {
334 int s_num = atoi(synclyrics_num);
335 for (idx = 0; idx < s_num; idx++) {
337 ret = metadata_extractor_get_synclyrics(metadata, idx, &time_info, &lyrics);
339 printf("[%2d][%6ld][%s]\n", idx, time_info, lyrics);
346 metadata_extractor_get_artwork(metadata, &artwork, &artwork_size, &artwork_mime);
347 printf("artwork = [%p], artwork_size = [%d]\n", artwork, artwork_size);
348 printf("artwork_mime = [%s]\n", artwork_mime);
349 #if DUMP_ARTWORK_THUMBNAIL
351 __write_file(DUMP_ARTWORK_PATH, artwork, (size_t)artwork_size);
356 metadata_extractor_get_frame(metadata, &video_thumbnail, &video_thumbnail_len);
357 printf("video_thumbnail[%p], video_thumbnail_len = [%d]\n\n", video_thumbnail, video_thumbnail_len);
358 #if DUMP_ARTWORK_THUMBNAIL
360 __write_file(DUMP_THUMBNAIL_PATH, video_thumbnail, (size_t)video_thumbnail_len);
363 /*Get Video frame at time, extract frame of 22.5 sec and not key frame*/
364 metadata_extractor_get_frame_at_time(metadata, 22500, false, &video_frame, &video_frame_len);
365 printf("video_frame[%p], video_frame_len = [%d]\n\n", video_frame, video_frame_len);
368 SAFE_FREE(audio_track_cnt);
369 SAFE_FREE(video_track_cnt);
371 SAFE_FREE(audio_bitrate);
372 SAFE_FREE(audio_channel);
373 SAFE_FREE(audio_samplerate);
374 SAFE_FREE(audio_bitpersample);
375 SAFE_FREE(video_bitrate);
376 SAFE_FREE(video_fps);
377 SAFE_FREE(video_width);
378 SAFE_FREE(video_height);
379 SAFE_FREE(video_thumbnail);
380 SAFE_FREE(video_frame);
385 SAFE_FREE(album_artist);
388 SAFE_FREE(copyright);
390 SAFE_FREE(description);
393 SAFE_FREE(artwork_mime);
394 SAFE_FREE(track_num);
395 SAFE_FREE(classification);
397 SAFE_FREE(longitude);
400 SAFE_FREE(conductor);
401 SAFE_FREE(unsynclyrics);
402 SAFE_FREE(synclyrics_num);
405 SAFE_FREE(audio_codec);
406 SAFE_FREE(video_codec);
408 #ifdef SUPPORT_GSPHERICAL_METADATA
409 SAFE_FREE(is_stitched_v1);
410 SAFE_FREE(stitching_software_v1);
411 SAFE_FREE(projection_type_v1);
412 SAFE_FREE(stereo_mode_v1);
413 SAFE_FREE(source_count_v1);
414 SAFE_FREE(initial_view_heading_degrees_v1);
415 SAFE_FREE(initial_view_pitch_degrees_v1);
416 SAFE_FREE(initial_view_roll_degrees_v1);
417 SAFE_FREE(timestamp_v1);
418 SAFE_FREE(full_pano_width_v1);
419 SAFE_FREE(full_pano_height_v1);
420 SAFE_FREE(cropped_area_image_width_v1);
421 SAFE_FREE(cropped_area_image_height_v1);
422 SAFE_FREE(cropped_area_left_v1);
423 SAFE_FREE(cropped_area_top_v1);
425 SAFE_FREE(stereo_mode_v2);
426 SAFE_FREE(metadata_source_v2);
427 SAFE_FREE(proj_type_v2);
428 SAFE_FREE(pose_yaw_degrees_v2);
429 SAFE_FREE(pose_pitch_degrees_v2);
430 SAFE_FREE(pose_roll_degrees_v2);
431 SAFE_FREE(cbmp_layout_v2);
432 SAFE_FREE(cbmp_padding_v2);
433 SAFE_FREE(equi_projection_bounds_top_v2);
434 SAFE_FREE(equi_projection_bounds_bottom_v2);
435 SAFE_FREE(equi_projection_bounds_left_v2);
436 SAFE_FREE(equi_projection_bounds_right_v2);
438 SAFE_FREE(ambisonic_type);
439 SAFE_FREE(ambisonic_format);
440 SAFE_FREE(ambisonic_order);
447 int main(int argc, char *argv[])
449 int ret = METADATA_EXTRACTOR_ERROR_NONE;
450 metadata_extractor_h metadata;
453 bool file_test = true;
454 /* bool file_test = false; */
456 unsigned char *buffer = NULL;
458 printf("--- metadata extractor test start ---\n\n");
461 printf("type file path plz. [%d]\n", cnt);
465 ret = metadata_extractor_create(&metadata);
466 if (ret != METADATA_EXTRACTOR_ERROR_NONE) {
467 printf("Fail metadata_extractor_create [%d]\n", ret);
471 for (idx = 0; idx < cnt; idx++) {
472 if (!_is_file_exist(argv[idx + 1])) {
473 printf("there is no file [%s]\n", argv[idx + 1]);
478 printf("Extract meta from file-----------------------\n");
479 ret = metadata_extractor_set_path(metadata, argv[idx + 1]);
480 if (ret != METADATA_EXTRACTOR_ERROR_NONE) {
481 printf("Fail metadata_extractor_set_path [%d]\n", ret);
485 printf("Extract meta from memory-----------------------\n");
487 READ_FROM_FILE(argv[idx + 1], buffer, file_size);
489 if (file_size >= INT_MAX) {
490 printf("File_size[%ld] is too big\n", file_size);
494 ret = metadata_extractor_set_buffer(metadata, buffer, (int)file_size);
495 if (ret != METADATA_EXTRACTOR_ERROR_NONE) {
496 printf("Fail metadata_extractor_set_buffer [%d]\n", ret);
501 __capi_metadata_extractor(metadata);
503 printf("--------------------------------------------\n");
508 ret = metadata_extractor_destroy(metadata);
509 printf("metadata_extractor_destroy [%d]\n", ret);
511 printf("--- metadata extractor test end ---\n\n");