diff options
| author | Xiaoqing MA <[email protected]> | 2018-07-27 16:33:05 +0800 |
|---|---|---|
| committer | Xiaoqing MA <[email protected]> | 2018-07-27 16:33:05 +0800 |
| commit | 98fb51badc4e73a657479600b531d5df037629e5 (patch) | |
| tree | 148e751909f2432f2edafc0054b14433bb78f8c1 /src/av_format_identify.c | |
| parent | 284f177a95bf744ac7d78c02b94c8df557a7af80 (diff) | |
1.按照编译提示错误修改
2.各封装结构struct应用的修改(#pragma pack(1), &0x....等方面)
3.mp4中memchr考虑在is_mp4_boxname基础上添加is_mp4_boxname_deep判断(因为存在本身字母或数字字符情况较多的文件,例如mp4中的4408.mp4,4414.mp4,4418.mp4,4385.mp4,实际形似avi格式)
4.mp4添加+8情况(因为存在某tag过大导致超出size类的误判非mp4,eg类似2553257454726467900_108.unkonwn in 20180730)
Diffstat (limited to 'src/av_format_identify.c')
| -rw-r--r-- | src/av_format_identify.c | 129 |
1 files changed, 69 insertions, 60 deletions
diff --git a/src/av_format_identify.c b/src/av_format_identify.c index 661b35a..4458b97 100644 --- a/src/av_format_identify.c +++ b/src/av_format_identify.c @@ -46,22 +46,23 @@ const int g_mp4_box_type_count = sizeof(g_mp4_box_type_all) / sizeof(char *); * by supposing that its first 4 byte is Boxtype in Box of MP4 file.*/ /*To identify whether the whole byte stream belongs to MP4 container*/ - -struct ts_pkg_t +#pragma pack (1) +typedef struct ts_pkg_t { uint8_t sync_byte; uint16_t con_pid; uint8_t con_cnt; char *pyld_data; -}; -#define MIN_TS_PKT_LEN (sizeof(struct ts_pack_t)-8) +}ts_pkg; +#pragma pack () +#define MIN_TS_PKT_LEN (sizeof(ts_pkg)-8) int is_mpeg_ts_each(const char *buff, size_t size) { int ret = 0; int fit_times = 0; const char *p = buff; - const struct ts_pkg_t *pkg = NULL; + const ts_pkg *pkg = NULL; //uint16_t cont_cnt_pre=0, cont_cnt_cur=0; //cont_cnt_pre = (*(uint16_t *)(pkg->con_cnt)) & 0x0f; @@ -77,30 +78,30 @@ int is_mpeg_ts_each(const char *buff, size_t size) //p += TS_PKT_SIZE; /*when p == buff(first of while), record pid and continuous_count of package head and go to fit_times++ directly. special for mpeg-ts cause of the format requirement for two packages together.*/ - if (p - buff + MIN_TS_PKT_LEN <= size) + if (p - buff + MIN_TS_PKT_LEN > size) { return ret; } - pkg = (const struct ts_pkg_t *)p; - pid_pre = (htons(*(uint16_t *)(pkg->con_pid))) << 3 >> 3;//? - cont_cnt_pre = pkt->con_cnt; + pkg = (const ts_pkg *)p; + pid_pre = htons(pkg->con_pid) & 0x1fff;//(htons(pkg->con_pid)) << 3 >> 3;//? + cont_cnt_pre = (pkg->con_cnt) & 0x0f;//(pkg->con_cnt) >> 4; p += TS_PKT_SIZE; fit_times++; while (p - buff + MIN_TS_PKT_LEN <= size)//while (p < (buff + size)) { - pkg = (const struct ts_pkg_t *)p; + pkg = (const ts_pkg *)p; if (pkg->sync_byte != TS_SYNC_BYTE) { break; } - pid_cur = (htons(*(uint16_t *)(pkg->con_pid))) << 3 >> 3; + pid_cur = htons(pkg->con_pid) & 0x1fff;//(htons(pkg->con_pid)) << 3 >> 3; //pid_cur = ((htonl(*(uint32_t *)(p+TS_PKT_SIZE)) & 0x000fff00) >> 8) + ((((htonl(*(uint32_t *)(p + TS_PKT_SIZE)) & 0x00f00000) >> 20) % 2) << 12); if (pid_cur == pid_pre && pid_cur != 8191)// { - cont_cnt_cur = pkt->con_cnt;// p + TS_PKT_SIZE;//cont_cnt_cur = (*(uint16_t *)(p + TS_PKT_SIZE)) & 0x0f; + cont_cnt_cur = (pkg->con_cnt) & 0x0f;//(pkg->con_cnt) >> 4;// p + TS_PKT_SIZE;//cont_cnt_cur = (*(uint16_t *)(p + TS_PKT_SIZE)) & 0x0f; if (cont_cnt_cur != (cont_cnt_pre + 1) % 16) { break; @@ -118,10 +119,10 @@ int is_mpeg_ts_each(const char *buff, size_t size) int i; for (i = 0; i < 3; i++) { - char *pkg_seg = buff + whole_pkg_cnt / group[i] * TS_PKT_SIZE; + const char *pkg_seg = buff + whole_pkg_cnt / group[i] * TS_PKT_SIZE; if (*pkg_seg != TS_SYNC_BYTE) { - break; + return ret;//break; } } ret = 1; @@ -149,7 +150,8 @@ int is_mpeg_ts(const char* buff, size_t size) is_ts = is_mpeg_ts_each(p, size - (p - buff)); if (is_ts == 1) { - break; + printf("p-buff is %lx.\n",p-buff); + break; } p++; } @@ -172,41 +174,43 @@ void *memchr_flv(const char *buff, size_t size) } return ret_memflv; } - -struct flv_tag_t +#pragma pack (1) +typedef struct flv_tag_t { uint32_t pre_len; uint8_t tag_type; - uint8_t pyld_len[3];//payload length -}; -#define MIN_FLV_TAG_LEN (sizeof(struct flv_tag_t) + 1)//? + uint32_t con_pyld_len;//uint8_t pyld_len[3];//payload length +}flv_tag; +#pragma pack () +#define MIN_FLV_TAG_LEN (sizeof(flv_tag))//(sizeof(flv_tag) + 1)//? int is_flv_each(const char* buff, size_t size) { int ret = 0; int fit_times = 0; const char *p = buff; - const struct flv_tag_t *tag = NULL; + const flv_tag *tag = NULL; //uint32_t tag_len_show = 0; //uint32_t tag_len_cnt = 0;// = 11 + (htonl(*(size_t *)p) & 0x00ffffff); //p += (tag_len_cnt + 4); uint32_t tag_len_cnt = 0; uint32_t tag_len_show = 0; - if (p - buff + MIN_TS_PKT_LEN - 4 <= size) + if (p - buff + MIN_FLV_TAG_LEN - 4 > size) { return ret; } - tag_len_cnt = 11 + htonl(*(uint32_t *)tag->pyld_len) >> 8; + + tag_len_cnt = (htonl(*(uint32_t *)p) & 0x00ffffff) + 11;//?? 11 + (htonl(tag->con_pyld_len) >> 8);//11 + (htonl(*(uint32_t *)tag->pyld_len) >> 8); p += tag_len_cnt;//p is the first previous_length after buff fit_times++; - while (p - buff + MIN_FLV_TAG_SIZE <= size)//while (p < (buff + size)) + while (p - buff + MIN_FLV_TAG_LEN <= size)//while (p < (buff + size)) { - tag = (const struct flv_tag_t *)p; - tag_len_show = htonl(*(uint32_t *)(tag->pre_len)); + tag = (const flv_tag *)p; + tag_len_show = htonl(tag->pre_len); - if (*(tag->tag_type) != FLV_TAG_AUDIO && *(tag->tag_type) != FLV_TAG_VIDEO && *(tag->tag_type) != FLV_TAG_SCRIPT_DATA) + if ((tag->tag_type) != FLV_TAG_AUDIO && (tag->tag_type) != FLV_TAG_VIDEO && (tag->tag_type) != FLV_TAG_SCRIPT_DATA) { break; } @@ -215,7 +219,7 @@ int is_flv_each(const char* buff, size_t size) break; } - uint32_t tag_len_cnt = 11 + htonl(*(uint32_t *)(tag->pyld_len)) >> 8;//(htonl(*(uint32_t *)tag)) & 0x00ffffff; + uint32_t tag_len_cnt = (htonl(tag->con_pyld_len) >> 8) + 11;//11 + (htonl(*(uint32_t *)(tag->pyld_len)) >> 8);//(htonl(*(uint32_t *)tag)) & 0x00ffffff; fit_times++; if (fit_times >= FIT_TIMES) @@ -230,7 +234,7 @@ int is_flv_each(const char* buff, size_t size) int is_flv(const char* buff, size_t size) { - int ret = 0; + int is_flv = 0; const char *p = buff; while (p - buff < size)//same as p - buff + 1 <= size//while (p < size + buff) @@ -240,14 +244,15 @@ int is_flv(const char* buff, size_t size) { break; } - if (is_flv_each(p, size - (p - buff)) == 1) + is_flv = is_flv_each(p, size - (p - buff)); + if (is_flv == 1) { - ret = 1; + printf("p-buff is %lx.\n",p-buff); break; } p++; } - return ret; + return is_flv; } @@ -267,7 +272,7 @@ int is_mp4_boxname_deep(const char *buff) -int is_mp4_boxname(const char *buff);// , size_t size) +int is_mp4_boxname(const char *buff)// , size_t size) { int i=0,raw_filter=0; /* @@ -278,7 +283,7 @@ int is_mp4_boxname(const char *buff);// , size_t size) */ for (i = 0; i < 4; i++) { - if (*(buff + i) < '0' || (*(buff + i) > '9'&&*(buff + i) < 'a') || *(buff + i) > 'z') + if (((*(buff + i) >= '0') && (*(buff + i) <= '9')) || ((*(buff + i) >= 'a') && (*(buff + i) <= 'z'))) { raw_filter++; @@ -294,7 +299,7 @@ int is_mp4_boxname(const char *buff);// , size_t size) } else if (raw_filter == 3) { - if (memecmp(buff, "xmf", 3) == 0) + if (memcmp(buff, "xmf", 3) == 0) { return 1; } @@ -308,7 +313,8 @@ void *memmem_mp4(const char *buff, size_t size) const char *p = buff; while (p + 3 < buff + size) { - if (is_mp4_boxname(p) == 1) + //if (is_mp4_boxname(p) == 1) + if ((is_mp4_boxname(p) == 1) && (is_mp4_boxname_deep(p) == 1)) { ret_memmp4 = (void *)p; break; @@ -317,7 +323,8 @@ void *memmem_mp4(const char *buff, size_t size) } return ret_memmp4; } -struct mp4_box_t +#pragma pack (1) +typedef struct mp4_box_t { uint32_t atom_size; char name[4]; @@ -326,41 +333,48 @@ struct mp4_box_t uint64_t large_size; char* box_data; }; -}; -#define MIN_MP4_BOX_SIZE (sizeof(struct mp4_box_t)-8) -#define htonll(buff) ((htonl(*(uint32_t *)buff)<<32)+htonl(*(size_t *)(buff+4))) +}mp4_box; +#pragma pack () +#define MIN_MP4_BOX_SIZE (sizeof(mp4_box)-8) +#define htonll(buff) (((uint64_t) htonl(buff)) << 32) + htonl(buff >> 32)//(((uint64_t)(htonl(*(uint32_t *)buff))<<32)+htonl(*(uint32_t *)(buff+4))) int is_mp4_each(const char* buff, size_t size) { int ret = 0; int fit_times = 0; const char *p = buff; const char *q = NULL; - const struct mp4_box_t *box=NULL; + const mp4_box *box=NULL; uint64_t offset = 0; while (p - buff + MIN_MP4_BOX_SIZE <= size)//while(p-buff+MIN_MP4_BOX_SIZE<size)//at least contain atom_size and name of mp4 box for current p { - box = (const struct mp4_box_t *)p;//? - if(!is_mp4_boxname(box->name)//?,sizeof(box->name)) + box = (const mp4_box *)p;//? + if(!is_mp4_boxname(box->name))//?,sizeof(box->name)) { if (offset <= 0xffffffff) { p = q + 8; - box = (const struct mp4_box_t *)p; + box = (const mp4_box *)p; } - if (!is_mp4_boxname(box->name) + if (!is_mp4_boxname(box->name)) { break; } //break; } fit_times++; - - if(htonl(box->atom_size==1))//?if(box->atom_size == 1) + if (fit_times >= FIT_TIMES) + { + ret = 1; + break; + }// + + + if(htonl(box->atom_size)==1)//?if(box->atom_size == 1) { - if(size-(p-buff)>sizeof(struct mp4_box_t)) + if(size-(p-buff)>sizeof(mp4_box))//??? { - offset = htonll(&box->large_size);//p += htonll(&box->large_size);//p+=htonll(box->large_size);//TODO: Implement htonll + offset = htonll(box->large_size);//htonll(&(box->large_size));//p += htonll(&box->large_size);//p+=htonll(box->large_size);//TODO: Implement htonll } else { @@ -373,11 +387,7 @@ int is_mp4_each(const char* buff, size_t size) } q = p; p += offset; - if (fit_times > FIT_TIMES) - { - ret = 1; - break; - }// + } /*else @@ -391,8 +401,7 @@ int is_mp4_each(const char* buff, size_t size) int is_mp4(const char* buff, size_t size) { - int ret_mp4 = 0; - int ret_mp4_each; + int is_mp4 = 0; const char *p = buff; while (p < buff + size) @@ -408,15 +417,15 @@ int is_mp4(const char* buff, size_t size) continue; } - ret_mp4_each = is_mp4_each(p - 4, size - (p - buff) + 4); - if (ret_mp4_each == 1) + is_mp4 = is_mp4_each(p - 4, size - (p - buff) + 4); + if (is_mp4 == 1) { - ret_mp4 = 1; + printf("p-buff is %lx.\n",p-buff); break; } p++; } - return ret_mp4; + return is_mp4; } int AV_container_identify(const char* buff, size_t size) |
