summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzhengchao <[email protected]>2018-07-18 11:01:55 +0800
committerzhengchao <[email protected]>2018-07-18 11:01:55 +0800
commitcde1caf893390ed40f72788f84a41bf3e104cbbd (patch)
treeac650470b547ad8d4cb4bd010f2e8ff540948ffc /src
parent96c7a36449f80ab767a6eac122d66227d2edaed7 (diff)
reviewed by zhengchao, propose multiple suggestions.
Diffstat (limited to 'src')
-rw-r--r--src/av_format_identify.c177
1 files changed, 98 insertions, 79 deletions
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 <arpa/inet.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <math.h>
+#include <sys/types.h>
+
+#include <sys/io.h>
+#include <arpa/inet.h>
+
#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++;
}