From 229300a38d0fe15528f26a643cb325ee09c81af0 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 26 Apr 2016 13:44:31 +0900 Subject: [PATCH] [ACR-593] Add attributes(video codec, audio codec) Change-Id: Ifc7408abe65087bc2c378d047e8c7120ef414758 Signed-off-by: Minje Ahn --- include/metadata_extractor.h | 18 ++++---- include/metadata_extractor_type.h | 6 ++- src/metadata_extractor.c | 93 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/include/metadata_extractor.h b/include/metadata_extractor.h index b238fa4..da63d8f 100755 --- a/include/metadata_extractor.h +++ b/include/metadata_extractor.h @@ -39,7 +39,7 @@ extern "C" { /** * @brief Creates metadata. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * @remarks You must release @a metadata using metadata_extractor_destroy(). * * @param[in] metadata The handle to metadata @@ -55,7 +55,7 @@ int metadata_extractor_create(metadata_extractor_h *metadata); /** * @brief Sets the file path to extract. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * @param [in] metadata The handle to metadata * @param [in] path The path to extract metadata * @return @c 0 on success, @@ -73,7 +73,7 @@ int metadata_extractor_set_path(metadata_extractor_h metadata, const char *path) /** * @brief Sets the buffer to extract. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * @param [in] metadata The handle to metadata * @param [in] buffer The buffer to extract metadata * @param [in] size The buffer size @@ -91,7 +91,7 @@ int metadata_extractor_set_buffer(metadata_extractor_h metadata, const void *buf /** * @brief Destroys metadata. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * @param [in] metadata The handle to metadata * @return @c 0 on success, * otherwise a negative error value @@ -106,7 +106,7 @@ int metadata_extractor_destroy(metadata_extractor_h metadata); /** * @brief Gets metadata. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * * @remarks You must release @a value using @c free(). \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n @@ -130,7 +130,7 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr /** * @brief Gets the artwork image in a media file. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * * @remarks You must release @a artwork and @a artwork_mime using @c free(). \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n @@ -155,7 +155,7 @@ int metadata_extractor_get_artwork(metadata_extractor_h metadata, void **artwork /** * @brief Gets the frame of a video media file. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * * @remarks You must release @a frame using @c free(). * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n @@ -179,7 +179,7 @@ int metadata_extractor_get_frame(metadata_extractor_h metadata, void **frame, in /** * @brief Gets the synclyrics of a media file. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * * @remarks You must release @a lyrics using @c free(). * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n @@ -204,7 +204,7 @@ int metadata_extractor_get_synclyrics(metadata_extractor_h metadata, int index, /** * @brief Gets the frame of a video media. - * @since_tizen 2.3 + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * * @remarks You must release @a frame using @c free(). * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n diff --git a/include/metadata_extractor_type.h b/include/metadata_extractor_type.h index b78cff4..89b16c6 100755 --- a/include/metadata_extractor_type.h +++ b/include/metadata_extractor_type.h @@ -32,12 +32,12 @@ extern "C" { * @{ */ -/** @brief Definition for Content Error Class */ #define METADATA_EXTRACTOR_ERROR_CLASS TIZEN_ERROR_METADATA_EXTRACTOR /** * @ingroup CAPI_METADATA_EXTRACTOR_MODULE * @brief Enumeration for metadata extractor error. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { METADATA_EXTRACTOR_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ @@ -52,6 +52,7 @@ typedef enum { /** * @ingroup CAPI_METADATA_EXTRACTOR_MODULE * @brief Enumeration for attribute. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { METADATA_DURATION = 0, /**< Duration */ @@ -86,11 +87,14 @@ typedef enum { METADATA_SYNCLYRICS_NUM, /**< Synchronized lyric (time/lyric set) number */ METADATA_RECDATE, /**< Recording date */ METADATA_ROTATE, /**< Rotate(Orientation) Information */ + METADATA_VIDEO_CODEC, /**< Video Codec (Since 3.0) */ + METADATA_AUDIO_CODEC, /**< Audio Codec (Since 3.0) */ } metadata_extractor_attr_e; /** * @ingroup CAPI_METADATA_EXTRACTOR_MODULE * @brief The metadata extractor handle. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef struct metadata_extractor_s *metadata_extractor_h; diff --git a/src/metadata_extractor.c b/src/metadata_extractor.c index 83ab272..80213ce 100755 --- a/src/metadata_extractor.c +++ b/src/metadata_extractor.c @@ -71,6 +71,8 @@ static int __metadata_extractor_get_recording_date(metadata_extractor_s *metadat static int __metadata_extractor_get_rotate(metadata_extractor_s *metadata, char **rotate); static int __metadata_extractor_get_synclyrics_pair_num(metadata_extractor_s *metadata, int *synclyrics_num); static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata); +static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec); +static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec); static int __metadata_extractor_check_and_extract_meta(metadata_extractor_s *metadata, metadata_extractor_type_e metadata_type) { @@ -1002,6 +1004,85 @@ static int __metadata_extractor_get_synclyrics_pair_num(metadata_extractor_s *me return ret; } +static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec) +{ + int ret = METADATA_EXTRACTOR_ERROR_NONE; + char *err_attr_name = NULL; + int audio_codec_idx = 0; + int audio_codec_cnt = 45; + + const char *AudioCodecTypeString[] = { + "AMR", "G723.1", "MP3", "OGG", "AAC", "WMA", "MMF", "ADPCM", "WAVE", "WAVE NEW", "MIDI", "IMELODY", "MXMF", "MPEG1-Layer1 codec", "MPEG1-Layer2 codec", + "G711", "G722", "G722.1", "G722.2 (AMR-WB)", "G723 wideband speech", "G726 (ADPCM)", "G728 speech", "G729", "G729a", "G729.1", + "Real", + "AAC-Low complexity", "AAC-Main profile", "AAC-Scalable sample rate", "AAC-Long term prediction", "AAC-High Efficiency v1", "AAC-High efficiency v2", + "DolbyDigital", "Apple Lossless", "Sony proprietary", "SPEEX", "Vorbis", "AIFF", "AU", "None (will be deprecated)", + "PCM", "ALAW", "MULAW", "MS ADPCM", "FLAC" + }; + + if ((!metadata) || (!metadata->attr_h)) { + metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER); + return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER; + } + + if (metadata->audio_track_cnt > 0) { + ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_CODEC, &audio_codec_idx, NULL); + if (ret != FILEINFO_ERROR_NONE) { + metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret); + SAFE_FREE(err_attr_name); + return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED; + } + } + + if (audio_codec_idx < audio_codec_cnt) + *audio_codec = strdup(AudioCodecTypeString[audio_codec_idx]); + else { + metadata_extractor_error("Invalid Audio Codec [%d]", audio_codec_idx); + *audio_codec = NULL; + } + + return ret; +} + +static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec) +{ + int ret = METADATA_EXTRACTOR_ERROR_NONE; + char *err_attr_name = NULL; + int video_codec_idx = 0; + int video_codec_cnt = 29; + + const char *VideoCodecTypeString[] = { + "None (will be deprecated)", + "H263", "H264", "H26L", "MPEG4", "MPEG1", "WMV", "DIVX", "XVID", "H261", "H262/MPEG2-part2", "H263v2", "H263v3", + "Motion JPEG", "MPEG2", "MPEG4 part-2 Simple profile", "MPEG4 part-2 Advanced Simple profile", "MPEG4 part-2 Main profile", + "MPEG4 part-2 Core profile", "MPEG4 part-2 Adv Coding Eff profile", "MPEG4 part-2 Adv RealTime Simple profile", + "MPEG4 part-10 (h.264)", "Real", "VC-1", "AVS", "Cinepak", "Indeo", "Theora", "Flv" + }; + + if ((!metadata) || (!metadata->attr_h)) { + metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER); + return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER; + } + + if (metadata->video_track_cnt > 0) { + ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_CODEC, &video_codec_idx, NULL); + if (ret != FILEINFO_ERROR_NONE) { + metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret); + SAFE_FREE(err_attr_name); + return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED; + } + } + + if (video_codec_idx < video_codec_cnt) + *video_codec = strdup(VideoCodecTypeString[video_codec_idx]); + else { + metadata_extractor_error("Invalid Video Codec[%d]", video_codec_idx); + *video_codec = NULL; + } + + return ret; +} + static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata) { int ret = METADATA_EXTRACTOR_ERROR_NONE; @@ -1197,6 +1278,8 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_ATTR); else if ((attribute > METADATA_HAS_AUDIO) && (attribute <= METADATA_ROTATE)) ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_TAG); + else if((attribute == METADATA_AUDIO_CODEC) || (attribute == METADATA_VIDEO_CODEC)) + ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_ATTR); else { metadata_extractor_error("INVALID_PARAMETER [%d]", attribute); ret = METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER; @@ -1213,6 +1296,11 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr ret = __metadata_extractor_get_duration(_metadata, &i_value); break; } + case METADATA_VIDEO_CODEC: { + is_string = 1; + ret = __metadata_extractor_get_video_codec(_metadata, &s_value); + break; + } case METADATA_VIDEO_BITRATE: { is_string = 0; ret = __metadata_extractor_get_video_bitrate(_metadata, &i_value); @@ -1238,6 +1326,11 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr ret = __metadata_extractor_get_video_track_count(_metadata, &i_value); break; } + case METADATA_AUDIO_CODEC: { + is_string = 1; + ret = __metadata_extractor_get_audio_codec(_metadata, &s_value); + break; + } case METADATA_AUDIO_BITRATE: { is_string = 0; ret = __metadata_extractor_get_audio_bitrate(_metadata, &i_value); -- 2.7.4