summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinje Ahn <minje.ahn@samsung.com>2016-04-26 13:44:31 +0900
committerMinje Ahn <minje.ahn@samsung.com>2016-04-26 17:34:12 +0900
commit229300a38d0fe15528f26a643cb325ee09c81af0 (patch)
tree89c3dd01c4352864f6ed1360f4e6ebbed38e1f0e
parentd0b921ba01aa08e758df2c1fa222069de5568255 (diff)
downloadmetadata-extractor-229300a38d0fe15528f26a643cb325ee09c81af0.tar.gz
metadata-extractor-229300a38d0fe15528f26a643cb325ee09c81af0.tar.bz2
metadata-extractor-229300a38d0fe15528f26a643cb325ee09c81af0.zip
Change-Id: Ifc7408abe65087bc2c378d047e8c7120ef414758 Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
-rwxr-xr-xinclude/metadata_extractor.h18
-rwxr-xr-xinclude/metadata_extractor_type.h6
-rwxr-xr-xsrc/metadata_extractor.c93
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);