Name: libmm-fileinfo
Summary: Media Fileinfo
-Version: 0.6.57
+Version: 0.6.58
Release: 0
Group: System/Libraries
License: Apache-2.0
BuildRequires: pkgconfig(dlog)
BuildRequires: pkgconfig(libswscale)
BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(iniparser)
BuildRequires: pkgconfig(libavcodec)
BuildRequires: pkgconfig(libavutil)
BuildRequires: pkgconfig(libavformat)
%install
%make_install
+mkdir -p %{buildroot}%{_sysconfdir}/multimedia
+cp -rf %{_builddir}/%{name}-%{version}/mm_file_config.ini %{buildroot}%{_sysconfdir}/multimedia/mm_file_config.ini
+
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%{_libdir}/libmmfile_codecs.so
%{_libdir}/libmmfile_formats.so
%{_libdir}/libmmfile_utils.so
+%{_sysconfdir}/multimedia/mm_file_config.ini
%license LICENSE.APLv2.0
%files tool
#include <ctype.h>
#include <vconf.h>
#include <glib.h>
+#include <iniparser.h>
#include "mm_file.h"
#include "mm_file_debug.h"
static unsigned char gTagJPEGHeader[] = {0xff, 0xd8, 0xff };
static unsigned char gTagPNGHeader[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a };
+static int GetJunkCounterLimit(void);
+
static int GetStringFromTextTagBox(MMFileFormatContext *formatContext, MMFileIOHandle *fp, MMFILE_MP4_BASIC_BOX_HEADER *basic_header, eMMFILE_3GP_TEXT_TAG eTag)
{
int ret = MMFILE_UTIL_FAIL; /*fail*/
return MMFILE_UTIL_FAIL;
}
+static int g_junk_counter_limit = 0;
+static int GetJunkCounterLimit(void)
+{
+ dictionary *dict = NULL;
+ int data = 0;
+
+ dict = iniparser_load(MM_FILE_INI_PATH);
+ if (!dict) {
+ debug_error(DEBUG, "%s load failed", MM_FILE_INI_PATH);
+ return -1;
+ }
+
+ data = iniparser_getint(dict, "mm-file-config:junk_counter_limit", 0);
+ debug_msg(DEBUG, "mm-file-config:junk_counter_limit= %u", data);
+
+ iniparser_freedict(dict);
+
+ return data;
+}
#define BIG_CONTENT_BOX_SIZE_LEN 8
EXPORT_API int MMFileUtilGetMetaDataFromMP4(MMFileFormatContext *formatContext)
int ret = 0;
int readed;
unsigned long long chunk_size = 0;
+ long long moov_end = 0;
ret = mmfile_open(&fp, formatContext->uriFileName, MMFILE_RDONLY);
if (ret == MMFILE_UTIL_FAIL) {
MMFILE_MP4_BASIC_BOX_HEADER basic_header = {0, };
basic_header.start_offset = mmfile_tell(fp);
- while ((ret != MMFILE_UTIL_FAIL) && ((readed = mmfile_read(fp, (unsigned char *)&basic_header, MMFILE_MP4_BASIC_BOX_HEADER_LEN)) > 0)) {
+ int junk_counter = 0;
+ if (g_junk_counter_limit == 0)
+ g_junk_counter_limit = GetJunkCounterLimit();
+
+ while ((ret != MMFILE_UTIL_FAIL) && ((readed = mmfile_read(fp, (unsigned char *)&basic_header, MMFILE_MP4_BASIC_BOX_HEADER_LEN)) == MMFILE_MP4_BASIC_BOX_HEADER_LEN)) {
basic_header.size = mmfile_io_be_uint32(basic_header.size);
basic_header.type = mmfile_io_le_uint32(basic_header.type);
basic_header.size = readed;
basic_header.type = 0;
chunk_size = basic_header.size;
+
+ if ((moov_end != 0) && (moov_end < basic_header.start_offset))
+ {
+ debug_msg(DEBUG, "found junk data but moov data already was extracted, so junk counter will be increase: %d", junk_counter);
+ junk_counter++;
+
+ /* stop the loop for junk case. */
+ if ((g_junk_counter_limit > 0) && (junk_counter > g_junk_counter_limit))
+ {
+ debug_msg(DEBUG, "stop the loop by junk-data checker");
+ ret = MMFILE_UTIL_FAIL;
+ continue;
+ }
+ }
} else if (basic_header.size == 1) {
int i = 0;
unsigned char temp[BIG_CONTENT_BOX_SIZE_LEN] = {0, };
for(i = 0; i < BIG_CONTENT_BOX_SIZE_LEN; i++)
size |= (unsigned long long)temp[i] << (BIG_CONTENT_BOX_SIZE_LEN - 1 - i) * BIG_CONTENT_BOX_SIZE_LEN;
chunk_size = size;
+ junk_counter = 0;
} else {
chunk_size = basic_header.size;
+ junk_counter = 0;
}
switch (basic_header.type) {
case FOURCC('m', 'o', 'o', 'v'): {
debug_msg(RELEASE, "MPEG4: [moov] SIZE: [%lld]Byte\n", chunk_size);
+ moov_end = basic_header.start_offset + chunk_size;
break;
}
case FOURCC('u', 'd', 't', 'a'): {