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; | 
						|
};
 | 
						|
 |