diff options
| -rw-r--r-- | src/av_format_identify.c | 149 |
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; + } } |
