summaryrefslogtreecommitdiff
path: root/src/av_format_identify.c
diff options
context:
space:
mode:
authorXiaoqing MA <[email protected]>2018-07-27 16:33:05 +0800
committerXiaoqing MA <[email protected]>2018-07-27 16:33:05 +0800
commit98fb51badc4e73a657479600b531d5df037629e5 (patch)
tree148e751909f2432f2edafc0054b14433bb78f8c1 /src/av_format_identify.c
parent284f177a95bf744ac7d78c02b94c8df557a7af80 (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.c129
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)