From cde1caf893390ed40f72788f84a41bf3e104cbbd Mon Sep 17 00:00:00 2001 From: zhengchao Date: Wed, 18 Jul 2018 11:01:55 +0800 Subject: reviewed by zhengchao, propose multiple suggestions. --- inc/av_format_identify.h | 36 ++-------- src/av_format_identify.c | 177 ++++++++++++++++++++++++++--------------------- 2 files changed, 102 insertions(+), 111 deletions(-) diff --git a/inc/av_format_identify.h b/inc/av_format_identify.h index 132cb8b..63dbb87 100644 --- a/inc/av_format_identify.h +++ b/inc/av_format_identify.h @@ -1,41 +1,13 @@ #ifndef _AV_FORMAT_IDENTIFY_H #define _AV_FORMAT_IDENTIFY_H -#include -#include -#include -#include -#include -#include -#include -#include +#define AV_CONTAINER_UNKNOWN 0 +#define AV_CONTAINER_MPEGTS 1 +#define AV_CONTAINER_FLV 2 +#define AV_CONTAINER_MP4 3 -#include -#define AV_CONTAINER_MPEGTS 1 -#define AV_CONTAINER_FLV 2 -#define AV_CONTAINER_MP4 3 -#define UNKNOWN 4 - -/*To find that whether the initial size bytes pointed to by buff satisfies the rules of MPEG-TS AV Container - * by supposing that its first 1 byte is sync_byte in ts header.*/ -int is_mpeg_ts_each(const char *buff, size_t size); -/*To identify whether the whole byte stream belongs to MPEG_TS container*/ -int is_mpeg_ts(const char* buff, size_t size); - - -/*To find that whether the initial size bytes pointed to by buff satisfies the rules of FLV AV Container - * by supposing that its first 1 byte is TagType in FLV Tag Header.*/ -int is_flv_each(const char* buff, size_t size); -/*To identify whether the whole byte stream belongs to FLV container*/ -int is_flv(const char* buff, size_t size); - -/*To find that whether the initial size bytes pointed to by buff satisfies the rules of MP4 AV Container - * by supposing that its first 4 byte is Boxtype in Box of MP4 file.*/ -int is_mp4_each(const char* buff, size_t size); -/*To identify whether the whole byte stream belongs to MP4 container*/ -int is_mp4(const char* buff, size_t size); /*To identify the container type of the whole byte stream*/ int AV_container_identify(const char* buff, size_t size); diff --git a/src/av_format_identify.c b/src/av_format_identify.c index 07df489..533d554 100644 --- a/src/av_format_identify.c +++ b/src/av_format_identify.c @@ -1,4 +1,15 @@ #include "av_format_identify.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include + #define FIT_TIMES 1 #define TS_SYNC_BYTE 0x47 @@ -17,79 +28,96 @@ const char *g_mp4_box_type_all[] = { "ftyp", "pdin", "moov", "mvhd", "trak", "tk "schi", "iinf", "xml", "bxml", "pitm", "fiin", "paen", "fpar", "fecr", "segr", "gitn", "tsel", "meco", "mere", "uuid" }; const int g_mp4_box_type_count = sizeof(g_mp4_box_type_all) / sizeof(char *); +/*To find that whether the initial size bytes pointed to by buff satisfies the rules of MPEG-TS AV Container + * by supposing that its first 1 byte is sync_byte in ts header.*/ +int is_mpeg_ts_each(const char *buff, size_t size); +/*To identify whether the whole byte stream belongs to MPEG_TS container*/ +int is_mpeg_ts(const char* buff, size_t size); + + +/*To find that whether the initial size bytes pointed to by buff satisfies the rules of FLV AV Container + * by supposing that its first 1 byte is TagType in FLV Tag Header.*/ +int is_flv_each(const char* buff, size_t size); +/*To identify whether the whole byte stream belongs to FLV container*/ +int is_flv(const char* buff, size_t size); + +/*To find that whether the initial size bytes pointed to by buff satisfies the rules of MP4 AV Container + * by supposing that its first 4 byte is Boxtype in Box of MP4 file.*/ +int is_mp4_each(const char* buff, size_t size); +/*To identify whether the whole byte stream belongs to MP4 container*/ +int is_mp4(const char* buff, size_t size); + int is_mpeg_ts_each(const char *buff, size_t size) { int ret_ts_each = 0; const char *p = buff; int fit_times = 0; - p += TS_PKT_SIZE; - - size_t cont_cout_pre, cont_cout_aft; + + size_t cont_cout_pre=0, cont_cout_aft=0; cont_cout_pre = htonl(*(size_t *)buff) & 0x0000000f; - uint32_t pid_pre, pid_aft; + uint32_t pid_pre=0, pid_aft=0; pid_pre = ((htonl(*(uint32_t *)buff) & 0x000fff00) >> 8) + ((((htonl(*(uint32_t *)buff) & 0x00f00000) >> 20) % 2) << 12); - const char *pack_tail; - const char *pack_half; - const char *pack_quarter; - - size_t whole_pack_cout; - size_t half_pack_cout; - size_t quarter_pack_cout; + const char *pack_tail=NULL; + const char *pack_half=NULL; + const char *pack_quarter=NULL; + size_t whole_pack_cnt=0; + size_t half_pack_cnt=0; + size_t quarter_pack_cnt=0; + + p += TS_PKT_SIZE; while (p < (buff + size)) { - if (*p == TS_SYNC_BYTE) + if (*p != TS_SYNC_BYTE) + { + break; + } + + if ((p + 3) < (buff + size)) { - if ((p + 3) < (buff + size)) + pid_aft = ((htonl(*(uint32_t *)p) & 0x000fff00) >> 8) + ((((htonl(*(uint32_t *)p) & 0x00f00000) >> 20) % 2) << 12); + if (pid_aft == pid_pre && pid_aft!=8191) + { + cont_cout_aft = htonl(*(size_t *)p) & 0x0000000f; + if (cont_cout_aft == (cont_cout_pre + 1) % 16) + { + fit_times++; + } + else + { + break; + } + } + else + { + fit_times++; + } + } + if (fit_times >= FIT_TIMES) + { + whole_pack_cnt = size / TS_PKT_SIZE; + if (size % TS_PKT_SIZE == 0) { - pid_aft = ((htonl(*(uint32_t *)p) & 0x000fff00) >> 8) + ((((htonl(*(uint32_t *)p) & 0x00f00000) >> 20) % 2) << 12); - if (pid_aft == pid_pre && pid_aft!=8191) - { - cont_cout_aft = htonl(*(size_t *)p) & 0x0000000f; - if (cont_cout_aft == (cont_cout_pre + 1) % 16) - { - fit_times++; - } - else - { - break; - } - } - else - { - fit_times++; - } + whole_pack_cnt--; } - if (fit_times >= FIT_TIMES) + half_pack_cnt = whole_pack_cnt/2; + quarter_pack_cnt = whole_pack_cnt/4; + if (whole_pack_cnt < 3 || half_pack_cnt < 2 || quarter_pack_cnt < 1) + { + break; + } + pack_tail = buff + whole_pack_cnt * TS_PKT_SIZE; + pack_half = buff + half_pack_cnt * TS_PKT_SIZE; + pack_quarter = buff + quarter_pack_cnt * TS_PKT_SIZE; + //if (*pack_tail == TS_SYNC_BYTE && *(pack_tail - TS_PKT_SIZE) == TS_SYNC_BYTE) + if (*pack_tail == TS_SYNC_BYTE && *pack_half == TS_SYNC_BYTE && *pack_quarter == TS_SYNC_BYTE) { - whole_pack_cout = size / TS_PKT_SIZE; - if (size % TS_PKT_SIZE == 0) - { - whole_pack_cout--; - } - half_pack_cout = whole_pack_cout/2; - quarter_pack_cout = whole_pack_cout/4; - if (whole_pack_cout < 3 || half_pack_cout < 2 || quarter_pack_cout < 1) - { - break; - } - pack_tail = buff + whole_pack_cout * TS_PKT_SIZE; - pack_half = buff + half_pack_cout * TS_PKT_SIZE; - pack_quarter = buff + quarter_pack_cout * TS_PKT_SIZE; - //if (*pack_tail == TS_SYNC_BYTE && *(pack_tail - TS_PKT_SIZE) == TS_SYNC_BYTE) - if (*pack_tail == TS_SYNC_BYTE && *pack_half == TS_SYNC_BYTE && *pack_quarter == TS_SYNC_BYTE) - { - ret_ts_each = 1; - break; - } + ret_ts_each = 1; break; } - } - else - { break; } @@ -102,32 +130,23 @@ int is_mpeg_ts_each(const char *buff, size_t size) int is_mpeg_ts(const char* buff, size_t size) { - int ret_ts = 0; - const char *p_each = buff; - int ret_ts_each; - while (p_each < buff + size) + const char *p = buff; + int is_ts=0; + while (p < buff + size) { - p_each = memchr(p_each, TS_SYNC_BYTE, size - (p_each - buff)); - if (p_each == NULL) + p = memchr(p, TS_SYNC_BYTE, size - (p - buff)); + if (p == NULL||p + 3 >= buff + size) { break; } - else if (p_each + 3 >= buff + size) + is_ts = is_mpeg_ts_each(p, size - (p - buff)); + if (is_ts == 1) { break; } - else - { - ret_ts_each = is_mpeg_ts_each(p_each, size - (p_each - buff)); - if (ret_ts_each == 1) - { - ret_ts = 1; - break; - } - p_each++; - } + p++; } - return ret_ts; + return is_ts; } @@ -152,13 +171,13 @@ int is_flv_each(const char* buff, size_t size) int ret_flv_each = 0; const char *p = buff; int fit_times = 0; - size_t left; - size_t right = 11 + (htonl(*(size_t *)p) & 0x00ffffff); + uint32_t left=0; + uint32_t right = 11 + (htonl(*(size_t *)p) & 0x00ffffff); p += (right + 4); while (p < (buff + size)) { - left = htonl(*(size_t *)(p - 4)); + left = htonl(*(uint32_t *)(p - 4)); if (right == left && (*(p) == FLV_TAG_AUDIO || *(p) == FLV_TAG_VIDEO || *(p) == FLV_TAG_SCRIPT_DATA)) { fit_times++; @@ -215,7 +234,7 @@ int is_flv(const char* buff, size_t size) -int is_mp4_boxtype(const char *buff) +int is_mp4_boxname_deep(const char *buff) { int i; size_t size_type_h; @@ -264,7 +283,7 @@ int is_mp4_each(const char* buff, size_t size) int ret_mp4_each = 0; int ret_mp4_boxname; int sig_mp4_boxtype = 0; - if (is_mp4_boxtype(buff) == 1) + if (is_mp4_boxname_deep(buff) == 1) { sig_mp4_boxtype = 1; } @@ -275,7 +294,7 @@ int is_mp4_each(const char* buff, size_t size) p += 8; while (p + 4 < (buff + size)) { - if (memcmp(p - 8, "mdat", 4) == 0 && htonl(*(size_t *)(p - 12)) == 1) + if (memcmp(p - 8, "mdat", 4) == 0 && htonl(*(size_t *)(p - 12)) == 1)//large size { p -= 8; if (p + 12 < buff + size) @@ -349,7 +368,7 @@ int is_mp4_each(const char* buff, size_t size) } } fit_times++; - if (is_mp4_boxtype(p) == 1) + if (is_mp4_boxname_deep(p) == 1) { sig_mp4_boxtype++; } -- cgit v1.2.3