golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
3.2 KiB
87 lines
3.2 KiB
#include <stddef.h> |
|
#include <stdint.h> |
|
#include <string.h> |
|
#include <stdlib.h> |
|
|
|
#include "base64.h" |
|
|
|
static const unsigned char decoding_table[256] = { |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f, |
|
0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, |
|
0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
|
0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, |
|
0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, |
|
0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, |
|
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, |
|
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, |
|
0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
}; |
|
|
|
char* base64_decode(const char *data) { |
|
size_t input_length = strlen(data); |
|
if (input_length % 4 != 0) { |
|
return NULL; |
|
} |
|
|
|
size_t output_length = input_length / 4 * 3; |
|
|
|
if (data[input_length - 1] == '=') { |
|
(output_length)--; |
|
} |
|
if (data[input_length - 2] == '=') { |
|
(output_length)--; |
|
} |
|
|
|
unsigned char* output = (unsigned char *)malloc(output_length + 1); |
|
if (output == NULL) { |
|
return NULL; |
|
} |
|
|
|
for (int i = 0, j = 0; i < (int)input_length;) { |
|
uint32_t sextet_a = (data[i] == '=') ? (0 & i++) : decoding_table[(unsigned char)(data[i++])]; |
|
uint32_t sextet_b = (data[i] == '=') ? (0 & i++) : decoding_table[(unsigned char)(data[i++])]; |
|
uint32_t sextet_c = (data[i] == '=') ? (0 & i++) : decoding_table[(unsigned char)(data[i++])]; |
|
uint32_t sextet_d = (data[i] == '=') ? (0 & i++) : decoding_table[(unsigned char)(data[i++])]; |
|
|
|
uint32_t triple = (sextet_a << 3 * 6) |
|
+ (sextet_b << 2 * 6) |
|
+ (sextet_c << 1 * 6) |
|
+ (sextet_d << 0 * 6); |
|
|
|
if (j < (int)output_length) { |
|
output[j++] = (triple >> 2 * 8) & 0xFF; |
|
} |
|
if (j < (int)output_length) { |
|
output[j++] = (triple >> 1 * 8) & 0xFF; |
|
} |
|
if (j < (int)output_length) { |
|
output[j++] = (triple >> 0 * 8) & 0xFF; |
|
} |
|
} |
|
|
|
output[output_length] = 0x00; |
|
return (char *)output; |
|
};
|
|
|