-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathh264Splitter.c
81 lines (69 loc) · 1.67 KB
/
h264Splitter.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/**
* `h264Splitter.c`
*
* copyright (c) 2019 Christian Alvarado
*/
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#ifdef STARTER264NAL4
int STARTER264NAL = 4;
unsigned char starter[] = {0, 0, 0, 1};
#else
int STARTER264NAL = 3;
unsigned char starter[] = {0, 0, 1};
#endif
int main(int argc, const char *argv[]) {
int f = open(argv[1], O_RDONLY);
char fileName[50];
unsigned MAX_BUFFER_SIZE = 256;
unsigned char data[MAX_BUFFER_SIZE];
unsigned char tmp[MAX_BUFFER_SIZE];
unsigned char *head;
unsigned char *tail;
unsigned char *DATA_TAIL;
memset(data, 0, MAX_BUFFER_SIZE);
long int nalIdx = 0;
int nalUnit = -1;
DATA_TAIL = data + MAX_BUFFER_SIZE - 1;
head = data;
while (1) {
int len = read(f, head, DATA_TAIL - head + 1);
if (len <= 0) {
close(nalUnit);
break;
}
tail = data;
head -= STARTER264NAL - 1;
while(head < DATA_TAIL - (STARTER264NAL - 2)) {
if(memcmp(head, starter, STARTER264NAL) == 0) {
if (nalUnit > 0) {
write(nalUnit, tail, head - tail);
close(nalUnit);
}
tail = head;
printf("New NAL unit created %ld\n", nalIdx);
sprintf(fileName, "%s.%04ld",argv[1], nalIdx);
nalUnit = open(fileName, O_CREAT | O_WRONLY, 0666);
nalIdx++;
}
head++;
}
if (data == tail) {
write(nalUnit, tail, head - tail);
memcpy(tmp, head, DATA_TAIL - head + 1);
memcpy(data, tmp, DATA_TAIL - head + 1);
head = data + (DATA_TAIL - head + 1);
}
else {
memcpy(tmp, tail, DATA_TAIL - tail + 1);
memcpy(data, tmp, DATA_TAIL - tail + 1);
head = data + (DATA_TAIL - tail + 1);
}
}
write(nalUnit, data, (DATA_TAIL - data));
close(nalUnit);
close(f);
return 0;
}