summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXiaoqing MA <[email protected]>2018-07-09 10:49:37 +0800
committerXiaoqing MA <[email protected]>2018-07-09 10:49:37 +0800
commit47264e953600db873e5861a4257250789146c9f8 (patch)
tree8712e44fa55d879870d34b274afd8d1474c6302d /src
new ed1
Diffstat (limited to 'src')
-rw-r--r--src/vdefine.c465
-rw-r--r--src/vdefine.h50
2 files changed, 515 insertions, 0 deletions
diff --git a/src/vdefine.c b/src/vdefine.c
new file mode 100644
index 0000000..a0395fe
--- /dev/null
+++ b/src/vdefine.c
@@ -0,0 +1,465 @@
+#include "vdefine.h"
+
+#define AV_CONTAINER_MPEGTS 1
+#define AV_CONTAINER_FLV 2
+#define AV_CONTAINER_MP4 3
+#define UNKNOWN 4
+#define FIT_TIMES 2
+#define MAX_FLV_FRAME max_flv_frame;//?
+/*int xtoint(const char* buff, size_t size)
+{
+ int size_h = 0;
+ int i;
+ unsigned char *add=(unsigned char *)malloc(sizeof(unsigned char *));
+ for (i = 0; i < size; i++)
+ {
+ memcpy(add,(buff+i),1);
+ size_h +=((*add) << (8 * (size - i - 1)));
+ }
+ free(add);
+ add = NULL;
+ return size_h;
+
+}*/
+int is_mpeg_ts_each(const char *buff_each, size_t size_each, const char *buff, size_t size)
+{
+ int ret_ts_each = 0;
+ const char *p = buff_each;
+ int fit_times = 1;// 0;//special 1;//CH--0;
+ p += 188;
+
+ //if ((buff_each+3)>=(buff_each+size_each))
+ // return 0;
+ //int cont_cout_ori = xtoint(buff_each + 3, 1);
+ //cont_cout_ori = cont_cout_ori % 16;
+ size_t cont_cout_ori, cont_cout_end, cont_cout_pre, cont_cout_aft;
+ cont_cout_ori = htonl(*(size_t *)buff_each) & 0x0000000f;
+ cont_cout_pre = cont_cout_ori;
+ //size_t cont_cout_aft;//int cont_cout_aft;
+ while (p < (buff_each + size_each))//=?
+ {
+ if (*p == 0x47)
+ {
+ if ((p + 3) < (buff_each + size_each))
+ {
+ //cont_cout_aft = xtoint(p + 3, 1);
+ //cont_cout_aft = cont_cout_aft % 16;
+ cont_cout_aft = htonl(*(size_t *)p) & 0x0000000f;
+ //cont_cout_aft = (cont_cout_aft == 0 ? 16 : cont_cout_aft);
+ if (cont_cout_aft == (cont_cout_pre + 1) % 16)
+ {
+ fit_times++;
+ }
+ else
+ {
+ break;
+ //return 0;
+ }
+ }
+ if (fit_times > FIT_TIMES)
+ {
+ size_t whole_pack_cout = size_each / 188;
+ if (size_each % 188 == 0)
+ {
+ whole_pack_cout--;
+ }
+ size_t whole_pack_bites = whole_pack_cout * 188;
+ const char *pack_tail = buff_each + whole_pack_bites;
+ if (*pack_tail == 0x47)
+ {
+ //if (pack_tail + 3 < buff_each + size_each)
+ //{
+ // cont_cout_end = htonl(*(size_t *)pack_tail) & 0x0000000f;
+ // if (cont_cout_end != (cont_cout_ori + whole_pack_cout) % 16)
+ // {
+ // //ret_ts_each = 0;
+ // break;
+ // }
+ //}
+ ret_ts_each = 1;
+ break;
+ }
+ break;
+ //ret_ts_each = 1;
+ //break;
+ //return 1;
+ }
+ }
+ else
+ {
+ break;
+ //return 0;
+ }
+
+ cont_cout_pre = cont_cout_aft;//cont_cout_ori = cont_cout_aft;
+ p += 188;
+ }
+ return ret_ts_each;//return 0;
+}
+
+int is_mpeg_ts(const char* buff, size_t size)
+{
+ int ret_ts = 0;
+ //const char*p = buff;
+ const char *p_each = buff;
+ //size_t size_move = 0;
+ int ret_ts_each;
+ while (p_each < buff + size)//while (size_move < size)//while (size_move <= 188)
+ {
+ p_each = memchr(p_each, 0x47, size - (p_each - buff));
+ if (p_each == NULL)
+ {
+ //return 0;
+ break;
+ }
+ else if (p_each +3 >= buff + size)//else if (p_each + 3 >= buff + size || p_each - buff > 187)
+ {
+ break;
+ }
+ else
+ {
+ ret_ts_each = is_mpeg_ts_each(p_each, size - (p_each - buff), buff, size);//int ret = is_mpeg_ts_each(p_each,size-(p_each-buff));
+ if (ret_ts_each == 1)
+ {
+ //printf("p_each... is %x,%x,%x,%x,%x,%x.\n",*p_each,*(p_each+1),*(p_each+2),*(p_each+3),*(p_each+4),*(p_each+5));
+ //return 1;
+ ret_ts = 1;
+ break;
+ }
+ p_each++;
+ //size_move = p_each - buff;//size_move+= (p_each - buff);
+ }
+ }
+ return ret_ts;
+}
+/*void *memchr_flv(const char *buff, size_t size, int count_type)//void * memchr_flv(const void * buff, size_t size, int count_type)
+{
+ int sig;
+ int i;
+ while (size)
+ {
+ sig = 0;//int sig = 0;
+ i = 0;//int i;
+ for (i = 0; i < count_type; i++)
+ {
+ if (*buff != (const char)flv_tag_type_all[i])//if (*(unsigned char *)buff != (unsigned char)flv_tag_type_all[i]);//?
+ sig++;
+ }
+ if (sig == count_type)
+ {
+ buff ++;//buff = (unsigned char *)buff + 1;
+ size --;
+ }
+ else
+ return (void *)buff;
+ }
+ return NULL;
+}*/
+
+void *memchr_flv(const char *buff_each, size_t size_each)
+{
+ void *ret_memflv = NULL;
+ //int i;
+ const char *p = buff_each;
+ while (p < buff_each + size_each)//for (i = 0; i < size_ each; i++)
+ {
+ if (*p == 0x08 || *p == 0x09 || *p == 0x12)
+ {
+ ret_memflv = (void *)p;
+ break;
+ }
+ p++;
+ }
+ return ret_memflv;
+}
+
+int is_flv_each(const char* buff_each, size_t size_each)
+{
+ int ret_flv_each = 0;
+ const char *p = buff_each;
+ int fit_times = 1;//CH--0;
+ //int left_ori;
+ //unsigned int left;
+ size_t left;//unsigned int left;
+ //if ((p+3)>=(buff_each+size_each))
+ // return 0;
+ size_t right = 11 + htonl(*(size_t *)p) & 0x00ffffff;//int right = 11 + xtoint(p + 1, 3);
+ p += (right + 4);
+
+ while (p < (buff_each + size_each))
+ {
+ //left_ori = xtoint(p - 4, 4);
+ //left = left_ori;
+ left = htonl(*(size_t *)(p - 4));// left = xtoint(p - 4, 4);
+ if (right==left&&(*(p) == 0x08 || *(p) == 0x09 || *(p) == 0x12))
+ {
+ fit_times++;
+ if (fit_times > FIT_TIMES)
+ {
+ ret_flv_each = 1;
+ break;
+ //return 1;
+ }
+ }
+ else
+ {
+ break;
+ //return 0;
+ }
+ if ((p + 3) >= (buff_each + size_each))
+ {
+ break;
+ //return 0;
+ }
+ right = 11 + htonl(*(size_t *)p) & 0x00ffffff;//right = 11 + xtoint(p + 1, 3);
+ p += (right + 4);
+ }
+ return ret_flv_each;//return 0;
+}
+
+int is_flv(const char* buff, size_t size)
+{
+ int ret_flv = 0;
+ int ret_flv_each;
+ const char*p = buff;
+ const char *p_each = buff;
+ //size_t size_move = 0;
+
+ while (p_each < size + buff)//while (size_move < size)
+ {
+ //int flv_sig[3]={ 0x08, 0x09, 0x12 };
+ p_each = memchr_flv(p_each, size - (p_each - buff));// size_move, 3);
+ if (p_each == NULL)
+ {
+ break;
+ //return 0;
+ }
+ else if (p_each + 3 >= buff + size)
+ {
+ break;
+ }
+ else
+ {
+ ret_flv_each = is_flv_each(p_each, size - (p_each - buff));
+ if (ret_flv_each == 1)
+ {
+ ret_flv = 1;
+ break;
+ //return 1;
+ }
+ p_each++;///
+ //size_move = p_each - buff;//size_move += (p_each - buff);
+ }
+ }
+ return ret_flv;//return 0;
+}
+
+
+/*void * memmem_mp4(const char * buf, size_t size)//, int count_type)
+{
+ int i;
+ const char *ret;
+ const char *ret_rec;//??
+ for (i = 0; i < count_type; i++)
+ {
+ ret = (const char *)memmem(buf,size, mp4_box_type_all[i], strlen(mp4_box_type_all[i]));
+ if (ret != NULL)
+ break;
+ }
+ if (ret == NULL)
+ return NULL;
+ for (i = 0; i < count_type; i++)
+ {
+ ret_rec = ret;//memcpy(ret_rec, ret, strlen(ret));
+ ret = (const char *)memmem(buf,size, mp4_box_type_all[i], strlen(mp4_box_type_all[i]));
+ if (ret != NULL)
+ {
+ if (ret_rec > ret)
+ return (void *)ret;
+ else if (ret_rec < ret)
+ return (void *)ret_rec;
+ else
+ continue;
+ }
+ else
+ ret = ret_rec;
+ }
+ return (void *)ret;//return NULL;
+}*/
+
+int is_mp4_part_spe(const char *buff)//, int count_type)
+{
+ int i;
+ //const char *ret;
+ size_t size_type_h;
+ for (i = 0; i < count_type; i++)
+ {
+ size_type_h = strlen(mp4_box_type_all[i]);
+ //ret = (const char *)memmem(buff, size_type_h, mp4_box_type_all[i], size_type_h);
+ //if (ret != NULL)
+ // return 1;
+ if (memcmp(buff, mp4_box_type_all[i], size_type_h) == 0)
+ return 1;
+ }
+ return 0;
+}
+
+int c_is_mp3(char c)
+{
+ if (c >= 'a'&&c <= 'z' || c >= '0'&&c <= '9')
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+int is_mp4_part(const char *buff_part)
+{
+ if (c_is_mp3(*buff_part) == 1 && c_is_mp3(*(buff_part + 1)) == 1 && c_is_mp3(*(buff_part + 2)) == 1 && c_is_mp3(*(buff_part + 3)) == 1)
+ {
+ //ret_memmp4 = (void *)p;
+ return 1;
+ }
+ return 0;
+}
+
+void *memmem_mp4(const char *buff_each, size_t size_each)
+{
+ void *ret_memmp4 = NULL;
+ char s;
+ const char *p = buff_each;
+ //int i;
+ while (p + 3 < buff_each + size_each)//for (i = 0; i < size; i++)
+ {
+ if (is_mp4_part(p) == 1 && is_mp4_part_spe(p) == 1)
+ {
+ ret_memmp4 = (void *)p;
+ break;
+ }
+ p++;
+ }
+ return ret_memmp4;
+}
+
+int is_mp4_each(const char* buff_each, size_t size_each, const char *buff)//, int count_type)
+{
+ int ret_mp4_each = 0;
+ int ret_mp4_part;
+ int sig_spe = 0;
+
+ const char *p = buff_each;
+ int fit_times = 1;//CH--0;
+
+ //int size_h_ori;
+ //unsigned int size_h;
+ size_t size_h;//unsigned int size_h;
+
+ p += 8;
+ while (p + 4 < (buff_each + size_each))
+ {
+ ret_mp4_part = is_mp4_part(p);// , count_type);
+ if (ret_mp4_part == 1)
+ {
+ fit_times++;
+ if (is_mp4_part_spe(p) == 1)
+ {
+ sig_spe++;
+ }
+ if (fit_times > FIT_TIMES&&sig_spe >= 1)
+ {
+ ret_mp4_each = 1;
+ break;
+ //return 1;
+ }
+ }
+
+ else
+ {
+ p -= 8;
+ //size_h_ori = xtoint(p - 8 - 4, 4);
+ //size_h = size_h_ori;
+ size_h = htonl(*(size_t *)(p - 4));//size_h = xtoint(p - 8 - 4, 4);
+ p += size_h;//p += (size_h - 8);
+ if (p + 4 < buff_each + size_each)
+ {
+ ret_mp4_part = is_mp4_part(p);// , count_type);
+ if (ret_mp4_part == 1)
+ {
+ fit_times++;
+ if (is_mp4_part_spe(p) == 1)
+ {
+ sig_spe++;
+ }
+ if (fit_times > FIT_TIMES&&sig_spe >= 1)
+ {
+ ret_mp4_each = 1;
+ break;
+ //return 1;
+ }
+ }
+ }
+ }
+ p += 8;
+ }
+ return ret_mp4_each;//return 0;
+}
+
+int is_mp4(const char* buff, size_t size)
+{
+ int ret_mp4 = 0;
+ int ret_mp4_each;
+ const char *p = buff;
+ const char *p_each = buff;
+ //size_t size_move = 0;
+
+ //int count_type = sizeof(mp4_box_type_all) / sizeof(char *);
+ //int ret;
+ while (p_each < buff + size)//while (size_move < size)
+ {
+ p_each = (const char *)memmem_mp4(p_each, size - (p_each - buff));//size_move, count_type);
+ if (p_each == NULL)
+ {
+ break;
+ //return 0;
+ }
+ else if (p_each + 12 >= buff + size || p_each - 4 < buff)
+ {
+ break;
+ }
+ else
+ {
+ ret_mp4_each = is_mp4_each(p_each, size - (p_each - buff), buff);//,count_type);//int ret = is_mp4_each(p_each, size - (p_each - buff), buff,count_type);
+ if (ret_mp4_each == 1)
+ {
+ ret_mp4 = 1;
+ break;
+ //return 1;
+ }
+ p_each++;
+ //size_move = p_each - buff;//size_move += (p_each - buff);
+ }
+ }
+ return ret_mp4;//return 0;
+}
+
+int AV_container_identify(const char* buff, size_t size)
+{
+ if (1 == is_mpeg_ts(buff, size))
+ {
+ return AV_CONTAINER_MPEGTS;
+ }
+ if (1 == is_flv(buff, size))
+ {
+ return AV_CONTAINER_FLV;
+ }
+ if (1 == is_mp4(buff, size))
+ {
+ return AV_CONTAINER_MP4;
+ }
+ return UNKNOWN;
+}
+
+
diff --git a/src/vdefine.h b/src/vdefine.h
new file mode 100644
index 0000000..8ad8c50
--- /dev/null
+++ b/src/vdefine.h
@@ -0,0 +1,50 @@
+#ifndef _VDEFINE_H
+#define _VDEFINE_H
+
+#include <arpa/inet.h>
+#include <stdlib.h>
+#define _GNU_SOURCE
+#define __USE_GNU
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <sys/types.h>
+
+#include <sys/io.h>
+
+#include <arpa/inet.h>
+const char *mp4_box_type_all[] = { "ftyp", "pdin", "moov", "mvhd", "trak", "tkhd", "tref", "edts", "elst", "mdia", "mdhd",
+"hdlr", "minf", "vmhd", "smhd", "hmhd", "nmhd", "dinf", "dref", "stbl", "stsd", "stts", "ctts", "stsc", "stsz",
+"stz2", "stco", "co64", "stss", "stsh", "padb", "stdp", "sdtp", "sbgp", "sgpd", "subs", "mvex", "mehd", "trex",
+"ipmc", "moof", "mfhd", "traf", "tfhd", "trun", "sdtp", "sbgp", "subs", "mfra", "tfra", "mfro", "mdat", "free",
+"skip", "udta", "cprt", "meta", "hdlr", "dinf", "dref", "ipmc", "iloc", "ipro", "sinf", "frma", "imif", "schm",
+"schi", "iinf", "xml", "bxml", "pitm", "fiin", "paen", "fpar", "fecr", "segr", "gitn", "tsel", "meco", "mere" };
+//const int flv_tag_type_all[] = { 0x08,0x09,0x12 };
+int count_type = sizeof(mp4_box_type_all) / sizeof(char *);
+
+/*int xtoint(const char* buff, size_t size);
+int is_mpeg_ts_each(const char *buff, size_t size);
+int is_mpeg_ts(const char* buff, size_t size);
+void * my_memchr_flv(const char * buffer, size_t size, int count_set);//void * my_memchr_flv(const void * buffer, size_t size, int count_set);
+int is_flv_each(const char* buff, size_t size);
+int is_flv(const char* buff, size_t size);
+void * my_memmem_mp4(const char * buf, size_t size, int count_type);
+int is_mp4_each_part(const char *buff, int count_type);
+int is_mp4_each(const char* buff, size_t size, const char *buff_s, int count_type);
+int is_mp4(const char* buff, size_t size);
+int AV_container_identify(const char* buff, size_t size);*/
+int is_mpeg_ts_each(const char *buff_each, size_t size_each, const char *buff, size_t size);
+int is_mpeg_ts(const char* buff, size_t size);
+void *memchr_flv(const char *buff_each, size_t size_each);
+int is_flv_each(const char* buff_each, size_t size_each);
+int is_flv(const char* buff, size_t size);
+int is_mp4_part_spe(const char *buff);//, int count_type)
+int c_is_mp3(char c);
+int is_mp4_part(const char *buff_part);
+void *memmem_mp4(const char *buff_each, size_t size_each);
+int is_mp4_each(const char* buff_each, size_t size_each, const char *buff);//, int count_type)
+int is_mp4(const char* buff, size_t size);
+int AV_container_identify(const char* buff, size_t size);
+
+
+#endif