summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/av_format_identify.c149
1 files changed, 59 insertions, 90 deletions
diff --git a/src/av_format_identify.c b/src/av_format_identify.c
index 533d554..f0764dc 100644
--- a/src/av_format_identify.c
+++ b/src/av_format_identify.c
@@ -249,17 +249,37 @@ int is_mp4_boxname_deep(const char *buff)
-int is_mp4_boxname(const char *buff)
+int is_mp4_boxname(const char *buff, size_t size)
{
- int i;
+ int i=0,raw_filter=0;
+ if (size<4)
+ {
+ return 0;
+ }
for (i = 0; i < 4; i++)
{
if (*(buff + i) < '0' || (*(buff + i) > '9'&&*(buff + i) < 'a') || *(buff + i) > 'z')
{
- return 0;
+
+ raw_filter++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ if(raw_filter!=4)
+ {
+ return 0;
+ }
+ else
+ {
+ if(1==is_mp4_boxname_deep(buff))
+ {
+ return 1;
}
}
- return 1;
+ return 0;
}
void *memmem_mp4(const char *buff, size_t size)
@@ -277,7 +297,17 @@ void *memmem_mp4(const char *buff, size_t size)
}
return ret_memmp4;
}
-
+struct mp4_box_t
+{
+ uint32_t atom_size;
+ char name[4];
+ union
+ {
+ uint64_t large_size;
+ char* box_data;
+ };
+};
+#define MIN_MP4_BOX_SIZE (sizeof(struct mp4_box_t)-8)
int is_mp4_each(const char* buff, size_t size)
{
int ret_mp4_each = 0;
@@ -290,101 +320,40 @@ int is_mp4_each(const char* buff, size_t size)
const char *p = buff;
int fit_times = 0;
- size_t size_h;
- p += 8;
- while (p + 4 < (buff + size))
+ const struct mp4_box_t *box=NULL;
+ while(p-buff+MIN_MP4_BOX_SIZE<size)
{
- if (memcmp(p - 8, "mdat", 4) == 0 && htonl(*(size_t *)(p - 12)) == 1)//large size
+ box=(const struct mp4_box_t *)p;
+ if(!is_mp4_boxname(box->name,sizeof(box->name))
+ {
+ break;
+ }
+ fit_times++;
+
+ if(box->atom_size==1)
{
- p -= 8;
- if (p + 12 < buff + size)
+ if(size-(p-buff)>sizeof(struct mp4_box_t))
{
- size_h = htonl(*(size_t *)(p + 4));
- size_h = (size_h<<32)+ htonl(*(size_t *)(p + 8));
- p += size_h;
- if (p + 4 < buff + size)
- {
- ret_mp4_boxname = is_mp4_boxname(p);
- if (!ret_mp4_boxname)
- {
- p -= size_h;
- if (p + 16 < buff + size)
- {
- size_h = htonl(*(size_t *)(p + 8));
- size_h = (size_h << 32) + htonl(*(size_t *)(p + 12));
- p += size_h;
- if (p + 4 < buff + size)
- {
- ret_mp4_boxname = is_mp4_boxname(p);
- if (!ret_mp4_boxname)
- {
- p -= size_h;
- }
- }
- else
- {
- break;
- }
-
- }
- else
- {
- break;
- }
-
- }
- }
- else
- {
- break;
- }
-
+ p+=htonll(box->large_size);//TODO: Implement htonll
}
- else
- {
- break;
- }
- }
- else
- {
- ret_mp4_boxname = is_mp4_boxname(p);
- if (!ret_mp4_boxname)
+ else
{
- p -= 8;
- size_h = htonl(*(size_t *)(p - 4));
- p += size_h;
- if (p + 4 < buff + size)
- {
- ret_mp4_boxname = is_mp4_boxname(p);
- if (!ret_mp4_boxname)
- {
- break;
- }
- }
- else
- {
- break;
- }
+ break;
}
}
- fit_times++;
- if (is_mp4_boxname_deep(p) == 1)
- {
- sig_mp4_boxtype++;
- }
- if (fit_times >= FIT_TIMES && sig_mp4_boxtype >= 1)
- {
- ret_mp4_each = 1;
- break;
- }
- if (fit_times > FIT_TIMES)
+ else
{
- break;
+ p+=htonl(box->atom_size);
}
-
- p += 8;
}
- return ret_mp4_each;
+ if (fit_times > FIT_TIMES)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
}