From f0893e122e7d5903bc993fb1fdf6554943196fa9 Mon Sep 17 00:00:00 2001 From: Lukas Hejtmanek Date: Fri, 5 Feb 2010 16:17:33 +0100 Subject: [PATCH] reindent --- ultragrid/acconfig.h | 4 +- ultragrid/src/audio/audio.c | 580 +- ultragrid/src/bitstream.c | 48 +- ultragrid/src/compat/drand48.c | 2 +- ultragrid/src/compat/gettimeofday.c | 10 +- ultragrid/src/compat/inet_ntop.c | 236 +- ultragrid/src/compat/inet_pton.c | 264 +- ultragrid/src/compat/platform_semaphore.c | 41 +- ultragrid/src/compat/vsnprintf.c | 10 +- ultragrid/src/crypto/crypt_aes.c | 747 +-- ultragrid/src/crypto/crypt_aes_impl.c | 2647 ++++----- ultragrid/src/crypto/crypt_des.c | 918 ++-- ultragrid/src/crypto/md5.c | 307 +- ultragrid/src/crypto/random.c | 53 +- ultragrid/src/debug.c | 140 +- ultragrid/src/ihdtv/ihdtv.c | 700 +-- ultragrid/src/main.c | 1240 ++--- ultragrid/src/ntp.c | 10 +- ultragrid/src/pdb.c | 231 +- ultragrid/src/rtp/decoders.c | 89 +- ultragrid/src/rtp/net_udp.c | 1108 ++-- ultragrid/src/rtp/pbuf.c | 516 +- ultragrid/src/rtp/ptime.c | 123 +- ultragrid/src/rtp/rtp.c | 4760 +++++++++-------- ultragrid/src/rtp/rtp_callback.c | 303 +- ultragrid/src/tfrc.c | 669 ++- ultragrid/src/transmit.c | 120 +- ultragrid/src/tv.c | 63 +- ultragrid/src/video_capture.c | 255 +- .../src/video_capture/firewire_dv_freebsd.c | 118 +- ultragrid/src/video_capture/hdstation.c | 437 +- ultragrid/src/video_capture/make_testcard.c | 38 +- ultragrid/src/video_capture/null.c | 47 +- ultragrid/src/video_capture/quad.c | 482 +- ultragrid/src/video_capture/quicktime.c | 844 ++- ultragrid/src/video_capture/testcard.c | 377 +- ultragrid/src/video_codec.c | 318 +- ultragrid/src/video_compress.c | 450 +- ultragrid/src/video_display.c | 327 +- ultragrid/src/video_display/dxt.c | 729 +-- ultragrid/src/video_display/gl_sdl.c | 1181 ++-- ultragrid/src/video_display/hdstation.c | 507 +- ultragrid/src/video_display/null.c | 95 +- ultragrid/src/video_display/quicktime.c | 941 ++-- ultragrid/src/video_display/sage.c | 797 ++- ultragrid/src/video_display/sdl.c | 794 +-- ultragrid/src/video_display/sdl.h | 15 +- ultragrid/src/video_display/x11.c | 229 +- ultragrid/src/video_display/xv.c | 481 +- ultragrid/test/run_tests.c | 80 +- ultragrid/test/test_aes.c | 1455 +++-- ultragrid/test/test_bitstream.c | 88 +- ultragrid/test/test_des.c | 344 +- ultragrid/test/test_md5.c | 159 +- ultragrid/test/test_net_udp.c | 914 ++-- ultragrid/test/test_random.c | 9 +- ultragrid/test/test_rtp.c | 14 +- ultragrid/test/test_tv.c | 243 +- ultragrid/test/test_video_capture.c | 41 +- ultragrid/test/test_video_display.c | 114 +- 60 files changed, 14677 insertions(+), 14185 deletions(-) diff --git a/ultragrid/acconfig.h b/ultragrid/acconfig.h index 33845c806..40cdd1c4d 100644 --- a/ultragrid/acconfig.h +++ b/ultragrid/acconfig.h @@ -62,9 +62,7 @@ #undef DEBUG #undef DEBUG_MEM -@BOTTOM@ - +@ BOTTOM @ #ifndef WORDS_BIGENDIAN #define WORDS_SMALLENDIAN #endif - diff --git a/ultragrid/src/audio/audio.c b/ultragrid/src/audio/audio.c index 9fb763137..92aca90f8 100644 --- a/ultragrid/src/audio/audio.c +++ b/ultragrid/src/audio/audio.c @@ -54,419 +54,415 @@ #include "audio/audio.h" #include "portaudio.h" -const int interleaved = 1; // whether we use interleaved or non-interleaved input. ideally should get rid of this and use always non-interleaved mode...but there are some troubles with nonInterlevad support in MaxOSX(probably portaudio bug) +const int interleaved = 1; // whether we use interleaved or non-interleaved input. ideally should get rid of this and use always non-interleaved mode...but there are some troubles with nonInterlevad support in MaxOSX(probably portaudio bug) -PaStream *stream; // portaudio stream defined globally +PaStream *stream; // portaudio stream defined globally void audio_wait_for_reading(void) { - unsigned int x; -// printf("%d..\n", Pa_GetStreamWriteAvailable(stream)); - while((x = Pa_GetStreamReadAvailable(stream)) < audio_samples_per_frame*2) - printf("%d..",x); + unsigned int x; +// printf("%d..\n", Pa_GetStreamWriteAvailable(stream)); + while ((x = + Pa_GetStreamReadAvailable(stream)) < + audio_samples_per_frame * 2) + printf("%d..", x); - printf("ok, now:%d\n", x); + printf("ok, now:%d\n", x); } int audio_init(int output_device, int input_device) { - /* - * so far we only work with portaudio - * might get more complicated later..(jack?) - */ + /* + * so far we only work with portaudio + * might get more complicated later..(jack?) + */ - printf("Initializing portaudio..\n"); + printf("Initializing portaudio..\n"); - PaError error; - - error = Pa_Initialize(); - if(error != paNoError) - { - printf("error initializing portaudio\n"); - printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) ); - return -1; - } + PaError error; - printf("Using PortAudio version: %s\n", Pa_GetVersionText()); + error = Pa_Initialize(); + if (error != paNoError) { + printf("error initializing portaudio\n"); + printf("\tPortAudio error: %s\n", Pa_GetErrorText(error)); + return -1; + } - PaStreamParameters inputParameters, outputParameters; + printf("Using PortAudio version: %s\n", Pa_GetVersionText()); - // default device - if(output_device == -1) - { - printf("\nUsing default output audio device:"); - fflush(stdout); - print_device_info(Pa_GetDefaultOutputDevice()); - printf("\n"); - outputParameters.device = Pa_GetDefaultOutputDevice(); - } - else - if(output_device >= 0) - { - printf("\nUsing output audio device:"); - print_device_info(output_device); - printf("\n"); - outputParameters.device = output_device; - } - - // default device - if(input_device == -1) - { - printf("Using default input audio device"); - print_device_info(Pa_GetDefaultInputDevice()); - printf("\n"); - inputParameters.device = Pa_GetDefaultInputDevice(); - } - else - if(input_device >= 0) - { - printf("Using input audio device:"); - print_device_info(input_device); - printf("\n"); - inputParameters.device = input_device; - } + PaStreamParameters inputParameters, outputParameters; - if(input_device != -2) - { - inputParameters.channelCount = 1; - inputParameters.sampleFormat = paInt24; - if(!interleaved) - inputParameters.sampleFormat |= paNonInterleaved; + // default device + if (output_device == -1) { + printf("\nUsing default output audio device:"); + fflush(stdout); + print_device_info(Pa_GetDefaultOutputDevice()); + printf("\n"); + outputParameters.device = Pa_GetDefaultOutputDevice(); + } else if (output_device >= 0) { + printf("\nUsing output audio device:"); + print_device_info(output_device); + printf("\n"); + outputParameters.device = output_device; + } + // default device + if (input_device == -1) { + printf("Using default input audio device"); + print_device_info(Pa_GetDefaultInputDevice()); + printf("\n"); + inputParameters.device = Pa_GetDefaultInputDevice(); + } else if (input_device >= 0) { + printf("Using input audio device:"); + print_device_info(input_device); + printf("\n"); + inputParameters.device = input_device; + } - inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency ; + if (input_device != -2) { + inputParameters.channelCount = 1; + inputParameters.sampleFormat = paInt24; + if (!interleaved) + inputParameters.sampleFormat |= paNonInterleaved; - inputParameters.hostApiSpecificStreamInfo = NULL; - } + inputParameters.suggestedLatency = + Pa_GetDeviceInfo(inputParameters.device)-> + defaultHighInputLatency; - if(output_device != -2) - { - outputParameters.channelCount = 1; // output channels - outputParameters.sampleFormat = paInt24; - if(!interleaved) - outputParameters.sampleFormat |= paNonInterleaved; - outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultHighOutputLatency; - outputParameters.hostApiSpecificStreamInfo = NULL; - } + inputParameters.hostApiSpecificStreamInfo = NULL; + } + if (output_device != -2) { + outputParameters.channelCount = 1; // output channels + outputParameters.sampleFormat = paInt24; + if (!interleaved) + outputParameters.sampleFormat |= paNonInterleaved; + outputParameters.suggestedLatency = + Pa_GetDeviceInfo(outputParameters.device)-> + defaultHighOutputLatency; + outputParameters.hostApiSpecificStreamInfo = NULL; + } - error = Pa_OpenStream( &stream, - (input_device == -2)?NULL:&inputParameters, - (output_device == -2)?NULL:&outputParameters, - 48000, - audio_samples_per_frame, // frames per buffer // TODO decide on the amount - paNoFlag, - NULL, // callback function; NULL, because we use blocking functions - NULL // user data - none, because we use blocking functions - ); - if(error != paNoError) - { - printf("Error opening audio stream\n"); - printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) ); - return -1; - } + error = Pa_OpenStream(&stream, (input_device == -2) ? NULL : &inputParameters, (output_device == -2) ? NULL : &outputParameters, 48000, audio_samples_per_frame, // frames per buffer // TODO decide on the amount + paNoFlag, NULL, // callback function; NULL, because we use blocking functions + NULL // user data - none, because we use blocking functions + ); + if (error != paNoError) { + printf("Error opening audio stream\n"); + printf("\tPortAudio error: %s\n", Pa_GetErrorText(error)); + return -1; + } - return 0; + return 0; } -int audio_close() // closes and frees all audio resources +int audio_close() // closes and frees all audio resources { - Pa_StopStream(stream); // may not be necessary - Pa_Terminate(); + Pa_StopStream(stream); // may not be necessary + Pa_Terminate(); } -int audio_buffer_full(const audio_frame_buffer *buffer) +int audio_buffer_full(const audio_frame_buffer * buffer) { - return (buffer->occupation == buffer->total_number_of_frames); + return (buffer->occupation == buffer->total_number_of_frames); } -int audio_buffer_empty(audio_frame_buffer *buffer) +int audio_buffer_empty(audio_frame_buffer * buffer) { - return (buffer->occupation == 0); + return (buffer->occupation == 0); } -int init_audio_frame_buffer(audio_frame_buffer *buffer, int frames_per_buffer) +int init_audio_frame_buffer(audio_frame_buffer * buffer, int frames_per_buffer) { - assert(frames_per_buffer > 0); + assert(frames_per_buffer > 0); - int i; - if((buffer->audio_frames = (audio_frame**) malloc(frames_per_buffer * sizeof(audio_frame*))) == NULL) - { - printf("Error allocating memory for audio buffer!\n"); - return 1; - } + int i; + if ((buffer->audio_frames = + (audio_frame **) malloc(frames_per_buffer * + sizeof(audio_frame *))) == NULL) { + printf("Error allocating memory for audio buffer!\n"); + return 1; + } - for(i = 0; i < frames_per_buffer; i++) - { - buffer->audio_frames[i] = (audio_frame*)malloc(sizeof(audio_frame)); // FIXME: all audio frames should be allocated with one malloc call... - init_audio_frame(buffer->audio_frames[i], audio_samples_per_frame); - } + for (i = 0; i < frames_per_buffer; i++) { + buffer->audio_frames[i] = (audio_frame *) malloc(sizeof(audio_frame)); // FIXME: all audio frames should be allocated with one malloc call... + init_audio_frame(buffer->audio_frames[i], + audio_samples_per_frame); + } - buffer->total_number_of_frames = frames_per_buffer; - buffer->start = 0; - buffer->end = 0; - buffer->occupation = 0; - return 0; + buffer->total_number_of_frames = frames_per_buffer; + buffer->start = 0; + buffer->end = 0; + buffer->occupation = 0; + return 0; } // write buffer to output device -int audio_write(const audio_frame *buffer) +int audio_write(const audio_frame * buffer) { - PaError error; - if(interleaved) - { - audio_frame_to_interleaved_buffer(buffer->tmp_buffer, buffer, 1); - error = Pa_WriteStream(stream, buffer->tmp_buffer, buffer->samples_per_channel); - } - else - error = Pa_WriteStream(stream, buffer->channels, buffer->samples_per_channel); + PaError error; + if (interleaved) { + audio_frame_to_interleaved_buffer(buffer->tmp_buffer, buffer, + 1); + error = + Pa_WriteStream(stream, buffer->tmp_buffer, + buffer->samples_per_channel); + } else + error = + Pa_WriteStream(stream, buffer->channels, + buffer->samples_per_channel); - if(error != paNoError) - { - printf("Pa write stream error:%s\n", Pa_GetErrorText(error)); - return 1; - } + if (error != paNoError) { + printf("Pa write stream error:%s\n", Pa_GetErrorText(error)); + return 1; + } - return 0; + return 0; } // get first empty frame, bud don't consider it as being used -audio_frame* audio_buffer_get_empty_frame(audio_frame_buffer *buffer) +audio_frame *audio_buffer_get_empty_frame(audio_frame_buffer * buffer) { - // if we are full, we return NULL - if(audio_buffer_full(buffer)) - return NULL; + // if we are full, we return NULL + if (audio_buffer_full(buffer)) + return NULL; - audio_frame *frame = buffer->audio_frames[buffer->end]; - return frame; + audio_frame *frame = buffer->audio_frames[buffer->end]; + return frame; } void print_available_devices(void) { - int numDevices; + int numDevices; - PaError error; - - error = Pa_Initialize(); - if(error != paNoError) - { - printf("error initializing portaudio\n"); - printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) ); - return; - } + PaError error; - numDevices = Pa_GetDeviceCount(); - if( numDevices < 0) - { - printf("Error getting portaudio devices number\n"); - return; - } - if( numDevices == 0) - { - printf("There are NO available audio devices!\n"); - return; - } + error = Pa_Initialize(); + if (error != paNoError) { + printf("error initializing portaudio\n"); + printf("\tPortAudio error: %s\n", Pa_GetErrorText(error)); + return; + } - int i; - printf("Available devices(%d)\n", numDevices); - for(i = 0; i < numDevices; i++) - { - if(i == Pa_GetDefaultInputDevice()) - printf("(*i) "); - if(i == Pa_GetDefaultOutputDevice()) - printf("(*o)"); - - printf("Device %d :", i); - print_device_info(i); - printf("\n"); - } + numDevices = Pa_GetDeviceCount(); + if (numDevices < 0) { + printf("Error getting portaudio devices number\n"); + return; + } + if (numDevices == 0) { + printf("There are NO available audio devices!\n"); + return; + } - return; + int i; + printf("Available devices(%d)\n", numDevices); + for (i = 0; i < numDevices; i++) { + if (i == Pa_GetDefaultInputDevice()) + printf("(*i) "); + if (i == Pa_GetDefaultOutputDevice()) + printf("(*o)"); + + printf("Device %d :", i); + print_device_info(i); + printf("\n"); + } + + return; } void print_device_info(PaDeviceIndex device) { - if( (device < 0) || (device >= Pa_GetDeviceCount()) ) - { - printf("Requested info on non-existing device"); - return; - } - - const PaDeviceInfo *device_info = Pa_GetDeviceInfo(device); - printf(" %s (output channels: %d; input channels: %d)", device_info->name, device_info->maxOutputChannels, device_info->maxInputChannels); + if ((device < 0) || (device >= Pa_GetDeviceCount())) { + printf("Requested info on non-existing device"); + return; + } + + const PaDeviceInfo *device_info = Pa_GetDeviceInfo(device); + printf(" %s (output channels: %d; input channels: %d)", + device_info->name, device_info->maxOutputChannels, + device_info->maxInputChannels); } // read from input device -int audio_read(audio_frame *buffer) +int audio_read(audio_frame * buffer) { - // here we distinguish between interleaved and noninterleved, but non interleaved version hasn't been tested yet - PaError error; - if(interleaved) - { - error = Pa_ReadStream( stream, buffer->tmp_buffer, buffer->samples_per_channel); - interleaved_buffer_to_audio_frame(buffer, buffer->tmp_buffer, 1); - } - else - { - error = Pa_ReadStream( stream, buffer->channels, buffer->samples_per_channel); - } + // here we distinguish between interleaved and noninterleved, but non interleaved version hasn't been tested yet + PaError error; + if (interleaved) { + error = + Pa_ReadStream(stream, buffer->tmp_buffer, + buffer->samples_per_channel); + interleaved_buffer_to_audio_frame(buffer, buffer->tmp_buffer, + 1); + } else { + error = + Pa_ReadStream(stream, buffer->channels, + buffer->samples_per_channel); + } - if((error != paNoError) && (error != paInputOverflowed)) - { - printf("Pa read stream error:%s\n", Pa_GetErrorText(error)); - return 1; - } - - return 0; + if ((error != paNoError) && (error != paInputOverflowed)) { + printf("Pa read stream error:%s\n", Pa_GetErrorText(error)); + return 1; + } + + return 0; } -int init_audio_frame(audio_frame *buffer, unsigned int samples_per_channel) +int init_audio_frame(audio_frame * buffer, unsigned int samples_per_channel) { - int i; - for(i = 0; i < 8; i++) - { - if((buffer->channels[i] = (char*)malloc(samples_per_channel * 3/* ~24 bit*/ )) == NULL) - { - printf("Error allocating memory for audio buffers\n"); - return -1; - } + int i; + for (i = 0; i < 8; i++) { + if ((buffer->channels[i] = + (char *)malloc(samples_per_channel * 3 /* ~24 bit */ )) == + NULL) { + printf("Error allocating memory for audio buffers\n"); + return -1; + } - memset(buffer->channels[i], 0, samples_per_channel * 3); - } - buffer->samples_per_channel = samples_per_channel; + memset(buffer->channels[i], 0, samples_per_channel * 3); + } + buffer->samples_per_channel = samples_per_channel; - // the temporary buffer is large enough to store all channels - if((buffer->tmp_buffer = (char *)malloc(samples_per_channel * 3 * 8)) == NULL) - { - printf("Error allocating temporary buffer"); - return -1; - } + // the temporary buffer is large enough to store all channels + if ((buffer->tmp_buffer = + (char *)malloc(samples_per_channel * 3 * 8)) == NULL) { + printf("Error allocating temporary buffer"); + return -1; + } - return 0; + return 0; } -void free_audio_frame_buffer(audio_frame_buffer *buffer) +void free_audio_frame_buffer(audio_frame_buffer * buffer) { - int i; - for(i = 0; i < buffer->total_number_of_frames; i++) - free(buffer->audio_frames[i]); + int i; + for (i = 0; i < buffer->total_number_of_frames; i++) + free(buffer->audio_frames[i]); - free(buffer->audio_frames); + free(buffer->audio_frames); - buffer->start = buffer->end = buffer->total_number_of_frames = 0; + buffer->start = buffer->end = buffer->total_number_of_frames = 0; } -void free_audio_frame(audio_frame *buffer) +void free_audio_frame(audio_frame * buffer) { - int i; - for(i = 0; i < 8; i++) - free(buffer->channels[i]); - - free(buffer->tmp_buffer); + int i; + for (i = 0; i < 8; i++) + free(buffer->channels[i]); + + free(buffer->tmp_buffer); } inline -void interleaved_buffer_to_audio_frame(audio_frame *pa_buffer, const char *in_buffer, int num_channels) + void interleaved_buffer_to_audio_frame(audio_frame * pa_buffer, + const char *in_buffer, + int num_channels) { - assert(num_channels == 1); // we only handle mono buffer for now... + assert(num_channels == 1); // we only handle mono buffer for now... - // we suppose the number of samples in in_buffer is equal to the number in pa_buffer (this should be set globally) - - memcpy(pa_buffer->channels[0], in_buffer, pa_buffer->samples_per_channel * 3); + // we suppose the number of samples in in_buffer is equal to the number in pa_buffer (this should be set globally) + + memcpy(pa_buffer->channels[0], in_buffer, + pa_buffer->samples_per_channel * 3); } inline -void network_buffer_to_audio_frame(audio_frame *pa_buffer, const char *network_buffer) + void network_buffer_to_audio_frame(audio_frame * pa_buffer, + const char *network_buffer) { - unsigned int i; - const char *tmp_buffer = network_buffer; - for(i = 0; i < pa_buffer->samples_per_channel*8; i++) - { - int actual_channel = i % 8; - int actual_sample = i / 8; - - pa_buffer->channels[actual_channel][actual_sample*3+0] = tmp_buffer[2]; - pa_buffer->channels[actual_channel][actual_sample*3+1] = tmp_buffer[1]; - pa_buffer->channels[actual_channel][actual_sample*3+2] = tmp_buffer[0]; + unsigned int i; + const char *tmp_buffer = network_buffer; + for (i = 0; i < pa_buffer->samples_per_channel * 8; i++) { + int actual_channel = i % 8; + int actual_sample = i / 8; - tmp_buffer += 3; // we iterate over 3 byte samples.. - } + pa_buffer->channels[actual_channel][actual_sample * 3 + 0] = + tmp_buffer[2]; + pa_buffer->channels[actual_channel][actual_sample * 3 + 1] = + tmp_buffer[1]; + pa_buffer->channels[actual_channel][actual_sample * 3 + 2] = + tmp_buffer[0]; + + tmp_buffer += 3; // we iterate over 3 byte samples.. + } } int audio_ready_to_write(void) { - return Pa_GetStreamWriteAvailable(stream); + return Pa_GetStreamWriteAvailable(stream); } int audio_start_stream(void) { - PaError error; + PaError error; - error = Pa_StartStream(stream); - if(error != paNoError) - { - printf("Error starting stream:%s\n", Pa_GetErrorText(error)); - printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) ); - return -1; - } + error = Pa_StartStream(stream); + if (error != paNoError) { + printf("Error starting stream:%s\n", Pa_GetErrorText(error)); + printf("\tPortAudio error: %s\n", Pa_GetErrorText(error)); + return -1; + } - return 0; + return 0; } inline -void audio_frame_to_interleaved_buffer(char *in_buffer, const audio_frame *pa_buffer, int num_channels) + void audio_frame_to_interleaved_buffer(char *in_buffer, + const audio_frame * pa_buffer, + int num_channels) { - assert(num_channels == 1); + assert(num_channels == 1); - memcpy(in_buffer, pa_buffer->channels[0], pa_buffer->samples_per_channel * 3); + memcpy(in_buffer, pa_buffer->channels[0], + pa_buffer->samples_per_channel * 3); } inline -void audio_frame_to_network_buffer(char *network_buffer, const audio_frame *a_buffer) + void audio_frame_to_network_buffer(char *network_buffer, + const audio_frame * a_buffer) { - assert(!(a_buffer->samples_per_channel % 8)); // we send data in octets + assert(!(a_buffer->samples_per_channel % 8)); // we send data in octets - unsigned int i; - for(i = 0; i < a_buffer->samples_per_channel * 3; i += 3) - { + unsigned int i; + for (i = 0; i < a_buffer->samples_per_channel * 3; i += 3) { #ifdef WORDS_BIGENDIAN - printf("Error! Big endian machines are not currenty supported by audio transfer protocol!\n"); + printf + ("Error! Big endian machines are not currenty supported by audio transfer protocol!\n"); #endif - - int j; - for(j = 0; j < 8; j++) - { - // we need to revers the data to network byte order - network_buffer[0] = a_buffer->channels[j][i+2]; - network_buffer[1] = a_buffer->channels[j][i+1]; - network_buffer[2] = a_buffer->channels[j][i+0]; - network_buffer += 3; // iterate over the output buffer - } - } + + int j; + for (j = 0; j < 8; j++) { + // we need to revers the data to network byte order + network_buffer[0] = a_buffer->channels[j][i + 2]; + network_buffer[1] = a_buffer->channels[j][i + 1]; + network_buffer[2] = a_buffer->channels[j][i + 0]; + network_buffer += 3; // iterate over the output buffer + } + } } // we return first full frame and think about it as being empty since now -audio_frame* audio_buffer_get_full_frame(audio_frame_buffer *buffer) +audio_frame *audio_buffer_get_full_frame(audio_frame_buffer * buffer) { - if(audio_buffer_empty(buffer)) - return NULL; + if (audio_buffer_empty(buffer)) + return NULL; - audio_frame *frame = buffer->audio_frames[buffer->start]; + audio_frame *frame = buffer->audio_frames[buffer->start]; - buffer->start++; - if(buffer->start == buffer->total_number_of_frames) - buffer->start = 0; + buffer->start++; + if (buffer->start == buffer->total_number_of_frames) + buffer->start = 0; - buffer->occupation--; - return frame; + buffer->occupation--; + return frame; } // this should be called in case last audio_frame returned by audio_buffer_get_empty_frame should be considered full (used) -void audio_buffer_mark_last_frame_full(audio_frame_buffer *buffer) +void audio_buffer_mark_last_frame_full(audio_frame_buffer * buffer) { - buffer->end++; - if(buffer->end == buffer->total_number_of_frames) - buffer->end = 0; + buffer->end++; + if (buffer->end == buffer->total_number_of_frames) + buffer->end = 0; - buffer->occupation++; + buffer->occupation++; } diff --git a/ultragrid/src/bitstream.c b/ultragrid/src/bitstream.c index d9dd3c2e3..1d873f90b 100644 --- a/ultragrid/src/bitstream.c +++ b/ultragrid/src/bitstream.c @@ -10,23 +10,22 @@ * $Revision: 1.1 $ * $Date: 2007/11/08 09:48:59 $ */ - + #include "config_unix.h" #include "config_win32.h" #include "bitstream.h" typedef struct s_bitstream { - u_char *buf; /* head of bitstream */ - u_char *pos; /* current byte in bitstream */ - unsigned int remain; /* bits remaining */ - unsigned int len; /* length of bitstream in bytes */ + u_char *buf; /* head of bitstream */ + u_char *pos; /* current byte in bitstream */ + unsigned int remain; /* bits remaining */ + unsigned int len; /* length of bitstream in bytes */ } bs; -int -bs_create(bitstream_t **ppb) +int bs_create(bitstream_t ** ppb) { bs *pb; - pb = (bs*) malloc(sizeof(bs)); + pb = (bs *) malloc(sizeof(bs)); if (pb) { memset(pb, 0, sizeof(bs)); *ppb = pb; @@ -35,32 +34,25 @@ bs_create(bitstream_t **ppb) return FALSE; } -int -bs_destroy(bitstream_t **ppb) +int bs_destroy(bitstream_t ** ppb) { free(*ppb); return TRUE; } -int -bs_attach(bitstream_t *b, - u_char *buf, - int blen) +int bs_attach(bitstream_t * b, u_char * buf, int blen) { - b->buf = b->pos = buf; + b->buf = b->pos = buf; b->remain = 8; - b->len = blen; - memset(b->buf, 0, b->len); + b->len = blen; + memset(b->buf, 0, b->len); return TRUE; } -int -bs_put(bitstream_t *b, - u_char bits, - uint8_t nbits) +int bs_put(bitstream_t * b, u_char bits, uint8_t nbits) { assert(nbits != 0 && nbits <= 8); - + if (b->remain == 0) { b->pos++; b->remain = 8; @@ -71,19 +63,17 @@ bs_put(bitstream_t *b, (*b->pos) |= (bits >> over); b->pos++; b->remain = 8 - over; - (*b->pos) = (bits << b->remain); + (*b->pos) = (bits << b->remain); } else { (*b->pos) |= bits << (b->remain - nbits); b->remain -= nbits; } - + assert((unsigned int)(b->pos - b->buf) <= b->len); return TRUE; } -u_char -bs_get(bitstream_t *b, - uint8_t nbits) +u_char bs_get(bitstream_t * b, uint8_t nbits) { u_char out; @@ -111,8 +101,7 @@ bs_get(bitstream_t *b, return out; } -int -bs_bytes_used(bitstream_t *b) +int bs_bytes_used(bitstream_t * b) { unsigned int used = (unsigned int)(b->pos - b->buf); if (b->remain != 8) { @@ -120,4 +109,3 @@ bs_bytes_used(bitstream_t *b) } return used; } - diff --git a/ultragrid/src/compat/drand48.c b/ultragrid/src/compat/drand48.c index 116126eb8..e8864a2c1 100644 --- a/ultragrid/src/compat/drand48.c +++ b/ultragrid/src/compat/drand48.c @@ -7,7 +7,7 @@ double drand48(void) { unsigned int x = (rand() << 16) | rand(); - return ((double)x / (double)0xffffffff); + return ((double)x / (double)0xffffffff); } #endif diff --git a/ultragrid/src/compat/gettimeofday.c b/ultragrid/src/compat/gettimeofday.c index aef028fb2..4a3be6e94 100644 --- a/ultragrid/src/compat/gettimeofday.c +++ b/ultragrid/src/compat/gettimeofday.c @@ -6,12 +6,12 @@ int gettimeofday(struct timeval *tp, void *tz) { - struct _timeb timebuffer; + struct _timeb timebuffer; - _ftime( &timebuffer ); - tp->tv_sec = timebuffer.time; - tp->tv_usec = timebuffer.millitm * 1000; - return 0; + _ftime(&timebuffer); + tp->tv_sec = timebuffer.time; + tp->tv_usec = timebuffer.millitm * 1000; + return 0; } #endif diff --git a/ultragrid/src/compat/inet_ntop.c b/ultragrid/src/compat/inet_ntop.c index 3b854d641..b417a29f3 100644 --- a/ultragrid/src/compat/inet_ntop.c +++ b/ultragrid/src/compat/inet_ntop.c @@ -31,7 +31,7 @@ #define INT16SZ 2 #ifndef AF_INET6 -#define AF_INET6 AF_MAX+1 /* just to let this compile */ +#define AF_INET6 AF_MAX+1 /* just to let this compile */ #endif /* @@ -39,8 +39,8 @@ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. */ -static const char *inet_ntop4(const u_char *src, char *dst, size_t size); -static const char *inet_ntop6(const u_char *src, char *dst, size_t size); +static const char *inet_ntop4(const u_char * src, char *dst, size_t size); +static const char *inet_ntop6(const u_char * src, char *dst, size_t size); /* char * * inet_ntop(af, src, dst, size) @@ -50,23 +50,22 @@ static const char *inet_ntop6(const u_char *src, char *dst, size_t size); * author: * Paul Vixie, 1996. */ -const char * -inet_ntop(af, src, dst, size) - int af; - const void *src; - char *dst; - size_t size; +const char *inet_ntop(af, src, dst, size) +int af; +const void *src; +char *dst; +size_t size; { - switch (af) { - case AF_INET: - return (inet_ntop4(src, dst, size)); - case AF_INET6: - return (inet_ntop6(src, dst, size)); - default: - errno = EAFNOSUPPORT; - return (NULL); - } - /* NOTREACHED */ + switch (af) { + case AF_INET: + return (inet_ntop4(src, dst, size)); + case AF_INET6: + return (inet_ntop6(src, dst, size)); + default: + errno = EAFNOSUPPORT; + return (NULL); + } + /* NOTREACHED */ } /* const char * @@ -80,22 +79,21 @@ inet_ntop(af, src, dst, size) * author: * Paul Vixie, 1996. */ -static const char * -inet_ntop4(src, dst, size) - const u_char *src; - char *dst; - size_t size; +static const char *inet_ntop4(src, dst, size) +const u_char *src; +char *dst; +size_t size; { - static const char fmt[] = "%u.%u.%u.%u"; - char tmp[sizeof "255.255.255.255"]; + static const char fmt[] = "%u.%u.%u.%u"; + char tmp[sizeof "255.255.255.255"]; - sprintf(tmp, fmt, src[0], src[1], src[2], src[3]); - if ((size_t)strlen(tmp) > size) { - errno = ENOSPC; - return (NULL); - } - strcpy(dst, tmp); - return (dst); + sprintf(tmp, fmt, src[0], src[1], src[2], src[3]); + if ((size_t) strlen(tmp) > size) { + errno = ENOSPC; + return (NULL); + } + strcpy(dst, tmp); + return (dst); } /* const char * @@ -104,96 +102,96 @@ inet_ntop4(src, dst, size) * author: * Paul Vixie, 1996. */ -static const char * -inet_ntop6(src, dst, size) - const u_char *src; - char *dst; - size_t size; +static const char *inet_ntop6(src, dst, size) +const u_char *src; +char *dst; +size_t size; { - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; - struct { int base, len; } best, cur; - uint32_t words[IN6ADDRSZ / INT16SZ]; - int i; + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; + struct { + int base, len; + } best, cur; + uint32_t words[IN6ADDRSZ / INT16SZ]; + int i; - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - memset(words, 0, sizeof words); - for (i = 0; i < IN6ADDRSZ; i++) - words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); - best.base = -1; - cur.base = -1; - for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) { - if (words[i] == 0) { - if (cur.base == -1) - cur.base = i, cur.len = 1; - else - cur.len++; - } else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - cur.base = -1; - } - } - } - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - } - if (best.base != -1 && best.len < 2) - best.base = -1; + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset(words, 0, sizeof words); + for (i = 0; i < IN6ADDRSZ; i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + best.base = -1; + cur.base = -1; + for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) { + if (words[i] == 0) { + if (cur.base == -1) + cur.base = i, cur.len = 1; + else + cur.len++; + } else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; + } + } + } + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + if (best.base != -1 && best.len < 2) + best.base = -1; - /* - * Format the result. - */ - tp = tmp; - for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) { - /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) - *tp++ = ':'; - continue; - } - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) - *tp++ = ':'; - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && - (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) - return (NULL); - tp += strlen(tp); - break; - } - sprintf(tp, "%x", words[i]); - tp += strlen(tp); - } - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) - *tp++ = ':'; - *tp++ = '\0'; + /* + * Format the result. + */ + tp = tmp; + for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) { + if (i == best.base) + *tp++ = ':'; + continue; + } + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) + *tp++ = ':'; + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && + (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src + 12, tp, sizeof tmp - (tp - tmp))) + return (NULL); + tp += strlen(tp); + break; + } + sprintf(tp, "%x", words[i]); + tp += strlen(tp); + } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) + *tp++ = ':'; + *tp++ = '\0'; - /* - * Check for overflow, copy, and we're done. - */ - if ((size_t) (tp - tmp) > size) { - errno = ENOSPC; - return (NULL); - } - strcpy(dst, tmp); - return (dst); + /* + * Check for overflow, copy, and we're done. + */ + if ((size_t) (tp - tmp) > size) { + errno = ENOSPC; + return (NULL); + } + strcpy(dst, tmp); + return (dst); } #endif - diff --git a/ultragrid/src/compat/inet_pton.c b/ultragrid/src/compat/inet_pton.c index a6c62f9f7..ff0cc2b9a 100644 --- a/ultragrid/src/compat/inet_pton.c +++ b/ultragrid/src/compat/inet_pton.c @@ -32,7 +32,7 @@ #define INT16SZ 2 #ifndef AF_INET6 -#define AF_INET6 AF_MAX+1 /* just to let this compile */ +#define AF_INET6 AF_MAX+1 /* just to let this compile */ #endif /* @@ -40,8 +40,8 @@ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. */ -static int inet_pton4(const char *src, u_char *dst); -static int inet_pton6(const char *src, u_char *dst); +static int inet_pton4(const char *src, u_char * dst); +static int inet_pton6(const char *src, u_char * dst); /* int * inet_pton(af, src, dst) @@ -54,22 +54,21 @@ static int inet_pton6(const char *src, u_char *dst); * author: * Paul Vixie, 1996. */ -int -inet_pton(af, src, dst) - int af; - const char *src; - void *dst; +int inet_pton(af, src, dst) +int af; +const char *src; +void *dst; { - switch (af) { - case AF_INET: - return (inet_pton4(src, dst)); - case AF_INET6: - return (inet_pton6(src, dst)); - default: - errno = EAFNOSUPPORT; - return (-1); - } - /* NOTREACHED */ + switch (af) { + case AF_INET: + return (inet_pton4(src, dst)); + case AF_INET6: + return (inet_pton6(src, dst)); + default: + errno = EAFNOSUPPORT; + return (-1); + } + /* NOTREACHED */ } /* int @@ -82,45 +81,44 @@ inet_pton(af, src, dst) * author: * Paul Vixie, 1996. */ -static int -inet_pton4(src, dst) - const char *src; - u_char *dst; +static int inet_pton4(src, dst) +const char *src; +u_char *dst; { - static const char digits[] = "0123456789"; - int saw_digit, octets, ch; - u_char tmp[INADDRSZ], *tp; + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + u_char tmp[INADDRSZ], *tp; - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; - while ((ch = *src++) != '\0') { - const char *pch; + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; - if ((pch = (char *) strchr(digits, ch)) != NULL) { - uint8_t new = *tp * 10 + (pch - digits); + if ((pch = (char *)strchr(digits, ch)) != NULL) { + uint8_t new = *tp * 10 + (pch - digits); - if (new > 255) - return (0); - *tp = new; - if (! saw_digit) { - if (++octets > 4) - return (0); - saw_digit = 1; - } - } else if (ch == '.' && saw_digit) { - if (octets == 4) - return (0); - *++tp = 0; - saw_digit = 0; - } else - return (0); - } - if (octets < 4) - return (0); - /* bcopy(tmp, dst, INADDRSZ); */ - memcpy(dst, tmp, INADDRSZ); - return (1); + if (new > 255) + return (0); + *tp = new; + if (!saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + /* bcopy(tmp, dst, INADDRSZ); */ + memcpy(dst, tmp, INADDRSZ); + return (1); } /* int @@ -136,91 +134,89 @@ inet_pton4(src, dst) * author: * Paul Vixie, 1996. */ -static int -inet_pton6(src, dst) - const char *src; - u_char *dst; +static int inet_pton6(src, dst) +const char *src; +u_char *dst; { - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, saw_xdigit; - unsigned val; + static const char xdigits_l[] = "0123456789abcdef", + xdigits_u[] = "0123456789ABCDEF"; + u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp; + const char *xdigits, *curtok; + int ch, saw_xdigit; + unsigned val; - memset((tp = tmp), 0, IN6ADDRSZ); - endp = tp + IN6ADDRSZ; - colonp = NULL; - /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') - return (0); - curtok = src; - saw_xdigit = 0; - val = 0; - while ((ch = *src++) != '\0') { - const char *pch; + memset((tp = tmp), 0, IN6ADDRSZ); + endp = tp + IN6ADDRSZ; + colonp = NULL; + /* Leading :: requires some special handling. */ + if (*src == ':') + if (*++src != ':') + return (0); + curtok = src; + saw_xdigit = 0; + val = 0; + while ((ch = *src++) != '\0') { + const char *pch; - if ((pch = (char *) strchr((xdigits = xdigits_l), ch)) == NULL) - pch = (char *) strchr((xdigits = xdigits_u), ch); - if (pch != NULL) { - val <<= 4; - val |= (pch - xdigits); - if (val > 0xffff) - return (0); - saw_xdigit = 1; - continue; - } - if (ch == ':') { - curtok = src; - if (!saw_xdigit) { - if (colonp) - return (0); - colonp = tp; - continue; - } - if (tp + INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - saw_xdigit = 0; - val = 0; - continue; - } - if (ch == '.' && ((tp + INADDRSZ) <= endp) && - inet_pton4(curtok, tp) > 0) { - tp += INADDRSZ; - saw_xdigit = 0; - break; /* '\0' was seen by inet_pton4(). */ - } - return (0); - } - if (saw_xdigit) { - if (tp + INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - } - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const int n = tp - colonp; - int i; + if ((pch = (char *)strchr((xdigits = xdigits_l), ch)) == NULL) + pch = (char *)strchr((xdigits = xdigits_u), ch); + if (pch != NULL) { + val <<= 4; + val |= (pch - xdigits); + if (val > 0xffff) + return (0); + saw_xdigit = 1; + continue; + } + if (ch == ':') { + curtok = src; + if (!saw_xdigit) { + if (colonp) + return (0); + colonp = tp; + continue; + } + if (tp + INT16SZ > endp) + return (0); + *tp++ = (u_char) (val >> 8) & 0xff; + *tp++ = (u_char) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + if (ch == '.' && ((tp + INADDRSZ) <= endp) && + inet_pton4(curtok, tp) > 0) { + tp += INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + return (0); + } + if (saw_xdigit) { + if (tp + INT16SZ > endp) + return (0); + *tp++ = (u_char) (val >> 8) & 0xff; + *tp++ = (u_char) val & 0xff; + } + if (colonp != NULL) { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + int i; - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - tp = endp; - } - if (tp != endp) - return (0); - /* bcopy(tmp, dst, IN6ADDRSZ); */ - memcpy(dst, tmp, IN6ADDRSZ); - return (1); + for (i = 1; i <= n; i++) { + endp[-i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return (0); + /* bcopy(tmp, dst, IN6ADDRSZ); */ + memcpy(dst, tmp, IN6ADDRSZ); + return (1); } #endif - diff --git a/ultragrid/src/compat/platform_semaphore.c b/ultragrid/src/compat/platform_semaphore.c index 320a7b8a0..d021750a1 100644 --- a/ultragrid/src/compat/platform_semaphore.c +++ b/ultragrid/src/compat/platform_semaphore.c @@ -55,34 +55,35 @@ #include #else #include -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ #include "compat/platform_semaphore.h" -inline void platform_sem_init(void * semStructure, int pshared, int initialValue) +inline void platform_sem_init(void *semStructure, int pshared, int initialValue) { - #ifdef HAVE_MACOSX - UNUSED(pshared); - semaphore_create(mach_task_self(), (semaphore_t *)semStructure, SYNC_POLICY_FIFO, initialValue); - #else - sem_init((sem_t *)semStructure, pshared, initialValue); - #endif /* HAVE_MACOSX */ +#ifdef HAVE_MACOSX + UNUSED(pshared); + semaphore_create(mach_task_self(), (semaphore_t *) semStructure, + SYNC_POLICY_FIFO, initialValue); +#else + sem_init((sem_t *) semStructure, pshared, initialValue); +#endif /* HAVE_MACOSX */ } -inline void platform_sem_post(void * semStructure) +inline void platform_sem_post(void *semStructure) { - #ifdef HAVE_MACOSX - semaphore_signal(*((semaphore_t *)semStructure)); - #else - sem_post((sem_t *)semStructure); - #endif /* HAVE_MACOSX */ +#ifdef HAVE_MACOSX + semaphore_signal(*((semaphore_t *) semStructure)); +#else + sem_post((sem_t *) semStructure); +#endif /* HAVE_MACOSX */ } -inline void platform_sem_wait(void * semStructure) +inline void platform_sem_wait(void *semStructure) { - #ifdef HAVE_MACOSX - semaphore_wait(*((semaphore_t *)semStructure)); - #else - sem_wait((sem_t *)semStructure); - #endif /* HAVE_MACOSX */ +#ifdef HAVE_MACOSX + semaphore_wait(*((semaphore_t *) semStructure)); +#else + sem_wait((sem_t *) semStructure); +#endif /* HAVE_MACOSX */ } diff --git a/ultragrid/src/compat/vsnprintf.c b/ultragrid/src/compat/vsnprintf.c index deea1102a..5b41b0e8e 100644 --- a/ultragrid/src/compat/vsnprintf.c +++ b/ultragrid/src/compat/vsnprintf.c @@ -45,10 +45,10 @@ #ifndef HAVE_VSNPRINTF int vsnprintf(char *s, size_t buf_size, const char *format, va_list ap) { - /* Quick hack replacement for vsnprintf... note that this */ - /* doesn't check for buffer overflows, and so is open to */ - /* many really nasty attacks! */ - UNUSED(buf_size); - return vsprintf(s,format,ap); + /* Quick hack replacement for vsnprintf... note that this */ + /* doesn't check for buffer overflows, and so is open to */ + /* many really nasty attacks! */ + UNUSED(buf_size); + return vsprintf(s, format, ap); } #endif diff --git a/ultragrid/src/crypto/crypt_aes.c b/ultragrid/src/crypto/crypt_aes.c index 6b1d57868..4d7f6e5c4 100644 --- a/ultragrid/src/crypto/crypt_aes.c +++ b/ultragrid/src/crypto/crypt_aes.c @@ -41,151 +41,175 @@ #include "crypt_aes_impl.h" #include "crypt_aes.h" -int makeKey(keyInstance *key, BYTE direction, int keyLen, char *keyMaterial) { - int i; - char *keyMat; - u8 cipherKey[MAXKB]; - - if (key == NULL) { - return BAD_KEY_INSTANCE; - } +int makeKey(keyInstance * key, BYTE direction, int keyLen, char *keyMaterial) +{ + int i; + char *keyMat; + u8 cipherKey[MAXKB]; - if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) { - key->direction = direction; - } else { - return BAD_KEY_DIR; - } - - if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { - key->keyLen = keyLen; - } else { - return BAD_KEY_MAT; - } - - if (keyMaterial != NULL) { - strncpy(key->keyMaterial, keyMaterial, keyLen/4); - } - - /* initialize key schedule: */ - keyMat = key->keyMaterial; - for (i = 0; i < key->keyLen/8; i++) { - int t, v; - - t = *keyMat++; - if ((t >= '0') && (t <= '9')) v = (t - '0') << 4; - else if ((t >= 'a') && (t <= 'f')) v = (t - 'a' + 10) << 4; - else if ((t >= 'A') && (t <= 'F')) v = (t - 'A' + 10) << 4; - else return BAD_KEY_MAT; - - t = *keyMat++; - if ((t >= '0') && (t <= '9')) v ^= (t - '0'); - else if ((t >= 'a') && (t <= 'f')) v ^= (t - 'a' + 10); - else if ((t >= 'A') && (t <= 'F')) v ^= (t - 'A' + 10); - else return BAD_KEY_MAT; - - cipherKey[i] = (u8)v; - } - if (direction == DIR_ENCRYPT) { - key->Nr = rijndaelKeySetupEnc(key->rk, cipherKey, keyLen); - } else { - key->Nr = rijndaelKeySetupDec(key->rk, cipherKey, keyLen); - } - rijndaelKeySetupEnc(key->ek, cipherKey, keyLen); - return TRUE; -} - -int cipherInit(cipherInstance *cipher, BYTE mode, char *IV) { - if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) { - cipher->mode = mode; - } else { - return BAD_CIPHER_MODE; - } - if (IV != NULL) { - int i; - for (i = 0; i < MAX_IV_SIZE; i++) { - int t, j; - - t = IV[2*i]; - if ((t >= '0') && (t <= '9')) j = (t - '0') << 4; - else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4; - else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4; - else return BAD_CIPHER_INSTANCE; - - t = IV[2*i+1]; - if ((t >= '0') && (t <= '9')) j ^= (t - '0'); - else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10); - else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10); - else return BAD_CIPHER_INSTANCE; - - cipher->IV[i] = (u8)j; - } - } else { - memset(cipher->IV, 0, MAX_IV_SIZE); - } - return TRUE; -} - -int blockEncrypt(cipherInstance *cipher, keyInstance *key, - BYTE *input, int inputLen, BYTE *outBuffer) { - int i, k, t, numBlocks; - u8 block[16], *iv; - - if (cipher == NULL || - key == NULL || - key->direction == DIR_DECRYPT) { - return BAD_CIPHER_STATE; - } - if (input == NULL || inputLen <= 0) { - return 0; /* nothing to do */ - } - - numBlocks = inputLen/128; - - switch (cipher->mode) { - case MODE_ECB: - for (i = numBlocks; i > 0; i--) { - rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); - input += 16; - outBuffer += 16; - } - break; - - case MODE_CBC: - iv = cipher->IV; - for (i = numBlocks; i > 0; i--) { - ((u32*)block)[0] = ((u32*)input)[0] ^ ((u32*)iv)[0]; - ((u32*)block)[1] = ((u32*)input)[1] ^ ((u32*)iv)[1]; - ((u32*)block)[2] = ((u32*)input)[2] ^ ((u32*)iv)[2]; - ((u32*)block)[3] = ((u32*)input)[3] ^ ((u32*)iv)[3]; - rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); - iv = outBuffer; - input += 16; - outBuffer += 16; - } - break; - - case MODE_CFB1: - iv = cipher->IV; - for (i = numBlocks; i > 0; i--) { - memcpy(outBuffer, input, 16); - for (k = 0; k < 128; k++) { - rijndaelEncrypt(key->ek, key->Nr, iv, block); - outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7); - for (t = 0; t < 15; t++) { - iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); - } - iv[15] = (iv[15] << 1) | ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1); - } - outBuffer += 16; - input += 16; + if (key == NULL) { + return BAD_KEY_INSTANCE; } - break; - default: - return BAD_CIPHER_STATE; - } - - return 128*numBlocks; + if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) { + key->direction = direction; + } else { + return BAD_KEY_DIR; + } + + if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { + key->keyLen = keyLen; + } else { + return BAD_KEY_MAT; + } + + if (keyMaterial != NULL) { + strncpy(key->keyMaterial, keyMaterial, keyLen / 4); + } + + /* initialize key schedule: */ + keyMat = key->keyMaterial; + for (i = 0; i < key->keyLen / 8; i++) { + int t, v; + + t = *keyMat++; + if ((t >= '0') && (t <= '9')) + v = (t - '0') << 4; + else if ((t >= 'a') && (t <= 'f')) + v = (t - 'a' + 10) << 4; + else if ((t >= 'A') && (t <= 'F')) + v = (t - 'A' + 10) << 4; + else + return BAD_KEY_MAT; + + t = *keyMat++; + if ((t >= '0') && (t <= '9')) + v ^= (t - '0'); + else if ((t >= 'a') && (t <= 'f')) + v ^= (t - 'a' + 10); + else if ((t >= 'A') && (t <= 'F')) + v ^= (t - 'A' + 10); + else + return BAD_KEY_MAT; + + cipherKey[i] = (u8) v; + } + if (direction == DIR_ENCRYPT) { + key->Nr = rijndaelKeySetupEnc(key->rk, cipherKey, keyLen); + } else { + key->Nr = rijndaelKeySetupDec(key->rk, cipherKey, keyLen); + } + rijndaelKeySetupEnc(key->ek, cipherKey, keyLen); + return TRUE; +} + +int cipherInit(cipherInstance * cipher, BYTE mode, char *IV) +{ + if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) { + cipher->mode = mode; + } else { + return BAD_CIPHER_MODE; + } + if (IV != NULL) { + int i; + for (i = 0; i < MAX_IV_SIZE; i++) { + int t, j; + + t = IV[2 * i]; + if ((t >= '0') && (t <= '9')) + j = (t - '0') << 4; + else if ((t >= 'a') && (t <= 'f')) + j = (t - 'a' + 10) << 4; + else if ((t >= 'A') && (t <= 'F')) + j = (t - 'A' + 10) << 4; + else + return BAD_CIPHER_INSTANCE; + + t = IV[2 * i + 1]; + if ((t >= '0') && (t <= '9')) + j ^= (t - '0'); + else if ((t >= 'a') && (t <= 'f')) + j ^= (t - 'a' + 10); + else if ((t >= 'A') && (t <= 'F')) + j ^= (t - 'A' + 10); + else + return BAD_CIPHER_INSTANCE; + + cipher->IV[i] = (u8) j; + } + } else { + memset(cipher->IV, 0, MAX_IV_SIZE); + } + return TRUE; +} + +int blockEncrypt(cipherInstance * cipher, keyInstance * key, + BYTE * input, int inputLen, BYTE * outBuffer) +{ + int i, k, t, numBlocks; + u8 block[16], *iv; + + if (cipher == NULL || key == NULL || key->direction == DIR_DECRYPT) { + return BAD_CIPHER_STATE; + } + if (input == NULL || inputLen <= 0) { + return 0; /* nothing to do */ + } + + numBlocks = inputLen / 128; + + switch (cipher->mode) { + case MODE_ECB: + for (i = numBlocks; i > 0; i--) { + rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); + input += 16; + outBuffer += 16; + } + break; + + case MODE_CBC: + iv = cipher->IV; + for (i = numBlocks; i > 0; i--) { + ((u32 *) block)[0] = + ((u32 *) input)[0] ^ ((u32 *) iv)[0]; + ((u32 *) block)[1] = + ((u32 *) input)[1] ^ ((u32 *) iv)[1]; + ((u32 *) block)[2] = + ((u32 *) input)[2] ^ ((u32 *) iv)[2]; + ((u32 *) block)[3] = + ((u32 *) input)[3] ^ ((u32 *) iv)[3]; + rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); + iv = outBuffer; + input += 16; + outBuffer += 16; + } + break; + + case MODE_CFB1: + iv = cipher->IV; + for (i = numBlocks; i > 0; i--) { + memcpy(outBuffer, input, 16); + for (k = 0; k < 128; k++) { + rijndaelEncrypt(key->ek, key->Nr, iv, block); + outBuffer[k >> 3] ^= + (block[0] & 0x80U) >> (k & 7); + for (t = 0; t < 15; t++) { + iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); + } + iv[15] = + (iv[15] << 1) | + ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1); + } + outBuffer += 16; + input += 16; + } + break; + + default: + return BAD_CIPHER_STATE; + } + + return 128 * numBlocks; } /** @@ -197,207 +221,213 @@ int blockEncrypt(cipherInstance *cipher, keyInstance *key, * * @return length in octets (not bits) of the encrypted output buffer. */ -int padEncrypt(cipherInstance *cipher, keyInstance *key, - BYTE *input, int inputOctets, BYTE *outBuffer) { - int i, numBlocks, padLen; - u8 block[16], *iv; +int padEncrypt(cipherInstance * cipher, keyInstance * key, + BYTE * input, int inputOctets, BYTE * outBuffer) +{ + int i, numBlocks, padLen; + u8 block[16], *iv; - if (cipher == NULL || - key == NULL || - key->direction == DIR_DECRYPT) { - return BAD_CIPHER_STATE; - } - if (input == NULL || inputOctets <= 0) { - return 0; /* nothing to do */ - } - - numBlocks = inputOctets/16; - - switch (cipher->mode) { - case MODE_ECB: - for (i = numBlocks; i > 0; i--) { - rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); - input += 16; - outBuffer += 16; - } - padLen = 16 - (inputOctets - 16*numBlocks); - assert(padLen > 0 && padLen <= 16); - memcpy(block, input, 16 - padLen); - memset(block + 16 - padLen, padLen, padLen); - rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); - break; - - case MODE_CBC: - iv = cipher->IV; - for (i = numBlocks; i > 0; i--) { - ((u32*)block)[0] = ((u32*)input)[0] ^ ((u32*)iv)[0]; - ((u32*)block)[1] = ((u32*)input)[1] ^ ((u32*)iv)[1]; - ((u32*)block)[2] = ((u32*)input)[2] ^ ((u32*)iv)[2]; - ((u32*)block)[3] = ((u32*)input)[3] ^ ((u32*)iv)[3]; - rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); - iv = outBuffer; - input += 16; - outBuffer += 16; - } - padLen = 16 - (inputOctets - 16*numBlocks); - assert(padLen > 0 && padLen <= 16); - for (i = 0; i < 16 - padLen; i++) { - block[i] = input[i] ^ iv[i]; - } - for (i = 16 - padLen; i < 16; i++) { - block[i] = (BYTE)padLen ^ iv[i]; - } - rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); - break; - - default: - return BAD_CIPHER_STATE; - } - - return 16*(numBlocks + 1); -} - -int blockDecrypt(cipherInstance *cipher, keyInstance *key, - BYTE *input, int inputLen, BYTE *outBuffer) { - int i, k, t, numBlocks; - u8 block[16], *iv; - - if (cipher == NULL || - key == NULL || - (cipher->mode != MODE_CFB1 && key->direction == DIR_ENCRYPT)) { - return BAD_CIPHER_STATE; - } - if (input == NULL || inputLen <= 0) { - return 0; /* nothing to do */ - } - - numBlocks = inputLen/128; - - switch (cipher->mode) { - case MODE_ECB: - for (i = numBlocks; i > 0; i--) { - rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); - input += 16; - outBuffer += 16; - } - break; - - case MODE_CBC: - iv = cipher->IV; - for (i = numBlocks; i > 0; i--) { - rijndaelDecrypt(key->rk, key->Nr, input, block); - ((u32*)block)[0] ^= ((u32*)iv)[0]; - ((u32*)block)[1] ^= ((u32*)iv)[1]; - ((u32*)block)[2] ^= ((u32*)iv)[2]; - ((u32*)block)[3] ^= ((u32*)iv)[3]; - memcpy(cipher->IV, input, 16); - memcpy(outBuffer, block, 16); - input += 16; - outBuffer += 16; - } - break; - - case MODE_CFB1: - iv = cipher->IV; - for (i = numBlocks; i > 0; i--) { - memcpy(outBuffer, input, 16); - for (k = 0; k < 128; k++) { - rijndaelEncrypt(key->ek, key->Nr, iv, block); - for (t = 0; t < 15; t++) { - iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); - } - iv[15] = (iv[15] << 1) | ((input[k >> 3] >> (7 - (k & 7))) & 1); - outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7); - } - outBuffer += 16; - input += 16; + if (cipher == NULL || key == NULL || key->direction == DIR_DECRYPT) { + return BAD_CIPHER_STATE; + } + if (input == NULL || inputOctets <= 0) { + return 0; /* nothing to do */ } - break; - default: - return BAD_CIPHER_STATE; - } - - return 128*numBlocks; + numBlocks = inputOctets / 16; + + switch (cipher->mode) { + case MODE_ECB: + for (i = numBlocks; i > 0; i--) { + rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); + input += 16; + outBuffer += 16; + } + padLen = 16 - (inputOctets - 16 * numBlocks); + assert(padLen > 0 && padLen <= 16); + memcpy(block, input, 16 - padLen); + memset(block + 16 - padLen, padLen, padLen); + rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); + break; + + case MODE_CBC: + iv = cipher->IV; + for (i = numBlocks; i > 0; i--) { + ((u32 *) block)[0] = + ((u32 *) input)[0] ^ ((u32 *) iv)[0]; + ((u32 *) block)[1] = + ((u32 *) input)[1] ^ ((u32 *) iv)[1]; + ((u32 *) block)[2] = + ((u32 *) input)[2] ^ ((u32 *) iv)[2]; + ((u32 *) block)[3] = + ((u32 *) input)[3] ^ ((u32 *) iv)[3]; + rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); + iv = outBuffer; + input += 16; + outBuffer += 16; + } + padLen = 16 - (inputOctets - 16 * numBlocks); + assert(padLen > 0 && padLen <= 16); + for (i = 0; i < 16 - padLen; i++) { + block[i] = input[i] ^ iv[i]; + } + for (i = 16 - padLen; i < 16; i++) { + block[i] = (BYTE) padLen ^ iv[i]; + } + rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); + break; + + default: + return BAD_CIPHER_STATE; + } + + return 16 * (numBlocks + 1); } -int padDecrypt(cipherInstance *cipher, keyInstance *key, - BYTE *input, int inputOctets, BYTE *outBuffer) { - int i, numBlocks, padLen; - u8 block[16]; +int blockDecrypt(cipherInstance * cipher, keyInstance * key, + BYTE * input, int inputLen, BYTE * outBuffer) +{ + int i, k, t, numBlocks; + u8 block[16], *iv; - if (cipher == NULL || - key == NULL || - key->direction == DIR_ENCRYPT) { - return BAD_CIPHER_STATE; - } - if (input == NULL || inputOctets <= 0) { - return 0; /* nothing to do */ - } - if (inputOctets % 16 != 0) { - return BAD_DATA; - } + if (cipher == NULL || + key == NULL || + (cipher->mode != MODE_CFB1 && key->direction == DIR_ENCRYPT)) { + return BAD_CIPHER_STATE; + } + if (input == NULL || inputLen <= 0) { + return 0; /* nothing to do */ + } - numBlocks = inputOctets/16; + numBlocks = inputLen / 128; - switch (cipher->mode) { - case MODE_ECB: - /* all blocks but last */ - for (i = numBlocks - 1; i > 0; i--) { - rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); - input += 16; - outBuffer += 16; - } - /* last block */ - rijndaelDecrypt(key->rk, key->Nr, input, block); - padLen = block[15]; - if (padLen >= 16) { - return BAD_DATA; - } - for (i = 16 - padLen; i < 16; i++) { - if (block[i] != padLen) { - return BAD_DATA; - } - } - memcpy(outBuffer, block, 16 - padLen); - break; - - case MODE_CBC: - /* all blocks but last */ - for (i = numBlocks - 1; i > 0; i--) { - rijndaelDecrypt(key->rk, key->Nr, input, block); - ((u32*)block)[0] ^= ((u32*)cipher->IV)[0]; - ((u32*)block)[1] ^= ((u32*)cipher->IV)[1]; - ((u32*)block)[2] ^= ((u32*)cipher->IV)[2]; - ((u32*)block)[3] ^= ((u32*)cipher->IV)[3]; - memcpy(cipher->IV, input, 16); - memcpy(outBuffer, block, 16); - input += 16; - outBuffer += 16; - } - /* last block */ - rijndaelDecrypt(key->rk, key->Nr, input, block); - ((u32*)block)[0] ^= ((u32*)cipher->IV)[0]; - ((u32*)block)[1] ^= ((u32*)cipher->IV)[1]; - ((u32*)block)[2] ^= ((u32*)cipher->IV)[2]; - ((u32*)block)[3] ^= ((u32*)cipher->IV)[3]; - padLen = block[15]; - if (padLen <= 0 || padLen > 16) { - return BAD_DATA; - } - for (i = 16 - padLen; i < 16; i++) { - if (block[i] != padLen) { - return BAD_DATA; - } - } - memcpy(outBuffer, block, 16 - padLen); - break; - - default: - return BAD_CIPHER_STATE; - } - - return 16*numBlocks - padLen; + switch (cipher->mode) { + case MODE_ECB: + for (i = numBlocks; i > 0; i--) { + rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); + input += 16; + outBuffer += 16; + } + break; + + case MODE_CBC: + iv = cipher->IV; + for (i = numBlocks; i > 0; i--) { + rijndaelDecrypt(key->rk, key->Nr, input, block); + ((u32 *) block)[0] ^= ((u32 *) iv)[0]; + ((u32 *) block)[1] ^= ((u32 *) iv)[1]; + ((u32 *) block)[2] ^= ((u32 *) iv)[2]; + ((u32 *) block)[3] ^= ((u32 *) iv)[3]; + memcpy(cipher->IV, input, 16); + memcpy(outBuffer, block, 16); + input += 16; + outBuffer += 16; + } + break; + + case MODE_CFB1: + iv = cipher->IV; + for (i = numBlocks; i > 0; i--) { + memcpy(outBuffer, input, 16); + for (k = 0; k < 128; k++) { + rijndaelEncrypt(key->ek, key->Nr, iv, block); + for (t = 0; t < 15; t++) { + iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); + } + iv[15] = + (iv[15] << 1) | + ((input[k >> 3] >> (7 - (k & 7))) & 1); + outBuffer[k >> 3] ^= + (block[0] & 0x80U) >> (k & 7); + } + outBuffer += 16; + input += 16; + } + break; + + default: + return BAD_CIPHER_STATE; + } + + return 128 * numBlocks; +} + +int padDecrypt(cipherInstance * cipher, keyInstance * key, + BYTE * input, int inputOctets, BYTE * outBuffer) +{ + int i, numBlocks, padLen; + u8 block[16]; + + if (cipher == NULL || key == NULL || key->direction == DIR_ENCRYPT) { + return BAD_CIPHER_STATE; + } + if (input == NULL || inputOctets <= 0) { + return 0; /* nothing to do */ + } + if (inputOctets % 16 != 0) { + return BAD_DATA; + } + + numBlocks = inputOctets / 16; + + switch (cipher->mode) { + case MODE_ECB: + /* all blocks but last */ + for (i = numBlocks - 1; i > 0; i--) { + rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); + input += 16; + outBuffer += 16; + } + /* last block */ + rijndaelDecrypt(key->rk, key->Nr, input, block); + padLen = block[15]; + if (padLen >= 16) { + return BAD_DATA; + } + for (i = 16 - padLen; i < 16; i++) { + if (block[i] != padLen) { + return BAD_DATA; + } + } + memcpy(outBuffer, block, 16 - padLen); + break; + + case MODE_CBC: + /* all blocks but last */ + for (i = numBlocks - 1; i > 0; i--) { + rijndaelDecrypt(key->rk, key->Nr, input, block); + ((u32 *) block)[0] ^= ((u32 *) cipher->IV)[0]; + ((u32 *) block)[1] ^= ((u32 *) cipher->IV)[1]; + ((u32 *) block)[2] ^= ((u32 *) cipher->IV)[2]; + ((u32 *) block)[3] ^= ((u32 *) cipher->IV)[3]; + memcpy(cipher->IV, input, 16); + memcpy(outBuffer, block, 16); + input += 16; + outBuffer += 16; + } + /* last block */ + rijndaelDecrypt(key->rk, key->Nr, input, block); + ((u32 *) block)[0] ^= ((u32 *) cipher->IV)[0]; + ((u32 *) block)[1] ^= ((u32 *) cipher->IV)[1]; + ((u32 *) block)[2] ^= ((u32 *) cipher->IV)[2]; + ((u32 *) block)[3] ^= ((u32 *) cipher->IV)[3]; + padLen = block[15]; + if (padLen <= 0 || padLen > 16) { + return BAD_DATA; + } + for (i = 16 - padLen; i < 16; i++) { + if (block[i] != padLen) { + return BAD_DATA; + } + } + memcpy(outBuffer, block, 16 - padLen); + break; + + default: + return BAD_CIPHER_STATE; + } + + return 16 * numBlocks - padLen; } /** @@ -410,32 +440,33 @@ int padDecrypt(cipherInstance *cipher, keyInstance *key, * TRUE - on success * BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized) */ -int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key, - BYTE *input, int inputLen, BYTE *outBuffer, int rounds) { - u8 block[16]; +int cipherUpdateRounds(cipherInstance * cipher, keyInstance * key, + BYTE * input, int inputLen, BYTE * outBuffer, int rounds) +{ + u8 block[16]; - UNUSED(inputLen); + UNUSED(inputLen); - if (cipher == NULL || key == NULL) { - return BAD_CIPHER_STATE; - } + if (cipher == NULL || key == NULL) { + return BAD_CIPHER_STATE; + } - memcpy(block, input, 16); + memcpy(block, input, 16); - switch (key->direction) { - case DIR_ENCRYPT: - rijndaelEncryptRound(key->rk, key->Nr, block, rounds); - break; - - case DIR_DECRYPT: - rijndaelDecryptRound(key->rk, key->Nr, block, rounds); - break; - - default: - return BAD_KEY_DIR; - } + switch (key->direction) { + case DIR_ENCRYPT: + rijndaelEncryptRound(key->rk, key->Nr, block, rounds); + break; - memcpy(outBuffer, block, 16); - - return TRUE; + case DIR_DECRYPT: + rijndaelDecryptRound(key->rk, key->Nr, block, rounds); + break; + + default: + return BAD_KEY_DIR; + } + + memcpy(outBuffer, block, 16); + + return TRUE; } diff --git a/ultragrid/src/crypto/crypt_aes_impl.c b/ultragrid/src/crypto/crypt_aes_impl.c index 1a0e5c728..3fce220f6 100644 --- a/ultragrid/src/crypto/crypt_aes_impl.c +++ b/ultragrid/src/crypto/crypt_aes_impl.c @@ -24,14 +24,12 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "config_unix.h" #include "config_win32.h" #include "debug.h" #include "crypt_aes_impl.h" #include "crypt_aes.h" - /* Te0[x] = S [x].[02, 01, 01, 03]; Te1[x] = S [x].[03, 02, 01, 01]; @@ -47,671 +45,681 @@ Td4[x] = Si[x].[01, 01, 01, 01]; */ static const u32 Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, }; + static const u32 Te1[256] = { - 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, - 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, - 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, - 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, - 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, - 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, - 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, - 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, - 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, - 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, - 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, - 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, - 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, - 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, - 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, - 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, - 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, - 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, - 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, - 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, - 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, - 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, - 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, - 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, - 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, - 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, - 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, - 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, - 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, - 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, - 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, - 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, - 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, - 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, - 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, - 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, - 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, - 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, - 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, - 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, - 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, - 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, - 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, - 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, - 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, - 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, - 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, - 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, - 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, - 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, - 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, - 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, - 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, - 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, - 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, - 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, - 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, - 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, - 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, - 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, - 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, - 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, - 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, - 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, }; + static const u32 Te2[256] = { - 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, - 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, - 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, - 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, - 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, - 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, - 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, - 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, - 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, - 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, - 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, - 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, - 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, - 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, - 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, - 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, - 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, - 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, - 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, - 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, - 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, - 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, - 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, - 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, - 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, - 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, - 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, - 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, - 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, - 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, - 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, - 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, - 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, - 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, - 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, - 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, - 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, - 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, - 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, - 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, - 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, - 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, - 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, - 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, - 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, - 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, - 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, - 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, - 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, - 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, - 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, - 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, - 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, - 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, - 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, - 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, - 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, - 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, - 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, - 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, - 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, - 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, - 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, - 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, }; + static const u32 Te3[256] = { - 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, - 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, - 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, - 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, - 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, - 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, - 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, - 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, - 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, - 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, - 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, - 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, - 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, - 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, - 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, - 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, - 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, - 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, - 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, - 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, - 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, - 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, - 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, - 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, - 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, - 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, - 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, - 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, - 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, - 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, - 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, - 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, - 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, - 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, - 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, - 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, - 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, - 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, - 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, - 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, - 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, - 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, - 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, - 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, - 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, - 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, - 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, - 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, - 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, - 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, - 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, - 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, - 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, - 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, - 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, - 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, - 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, - 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, - 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, - 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, - 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, - 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, - 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, - 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, }; -static const u32 Te4[256] = { - 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, - 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, - 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, - 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, - 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, - 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, - 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, - 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, - 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, - 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, - 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, - 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, - 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, - 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, - 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, - 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, - 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, - 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, - 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, - 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, - 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, - 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, - 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, - 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, - 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, - 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, - 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, - 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, - 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, - 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, - 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, - 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, - 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, - 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, - 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, - 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, - 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, - 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, - 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, - 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, - 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, - 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, - 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, - 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, - 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, - 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, - 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, - 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, - 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, - 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, - 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, - 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, - 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, - 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, - 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, - 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, - 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, - 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, - 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, - 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, - 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, - 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, - 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, - 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, -}; -static const u32 Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, -}; -static const u32 Td1[256] = { - 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, - 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, - 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, - 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, - 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, - 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, - 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, - 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, - 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, - 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, - 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, - 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, - 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, - 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, - 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, - 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, - 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, - 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, - 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, - 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, - 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, - 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, - 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, - 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, - 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, - 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, - 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, - 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, - 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, - 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, - 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, - 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, - 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, - 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, - 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, - 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, - 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, - 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, - 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, - 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, - 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, - 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, - 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, - 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, - 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, - 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, - 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, - 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, - 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, - 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, - 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, - 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, - 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, - 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, - 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, - 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, - 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, - 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, - 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, - 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, - 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, - 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, - 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, - 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, -}; -static const u32 Td2[256] = { - 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, - 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, - 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, - 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, - 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, - 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, - 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, - 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, - 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, - 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, - 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, - 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, - 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, - 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, - 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, - 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, - 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, - 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, - 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, - 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, - 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, - 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, - 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, - 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, - 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, - 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, - 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, - 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, - 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, - 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, - 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, - 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, - 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, - 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, - 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, - 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, - 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, - 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, - 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, - 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, - 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, - 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, - 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, - 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, - 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, - 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, - 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, - 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, - 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, - 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, - 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, - 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, - 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, - 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, - 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, - 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, - 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, - 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, - 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, - 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, - 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, - 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, - 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, - 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +static const u32 Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, }; + +static const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; + +static const u32 Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; + +static const u32 Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; + static const u32 Td3[256] = { - 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, - 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, - 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, - 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, - 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, - 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, - 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, - 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, - 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, - 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, - 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, - 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, - 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, - 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, - 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, - 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, - 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, - 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, - 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, - 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, - 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, - 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, - 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, - 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, - 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, - 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, - 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, - 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, - 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, - 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, - 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, - 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, - 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, - 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, - 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, - 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, - 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, - 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, - 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, - 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, - 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, - 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, - 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, - 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, - 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, - 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, - 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, - 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, - 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, - 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, - 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, - 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, - 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, - 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, - 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, - 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, - 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, - 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, - 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, - 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, - 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, - 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, - 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, - 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, }; + static const u32 Td4[256] = { - 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, - 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, - 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, - 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, - 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, - 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, - 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, - 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, - 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, - 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, - 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, - 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, - 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, - 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, - 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, - 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, - 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, - 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, - 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, - 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, - 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, - 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, - 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, - 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, - 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, - 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, - 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, - 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, - 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, - 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, - 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, - 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, - 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, - 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, - 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, - 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, - 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, - 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, - 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, - 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, - 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, - 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, - 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, - 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, - 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, - 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, - 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, - 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, - 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, - 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, - 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, - 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, - 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, - 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, - 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, - 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, - 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, - 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, - 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, - 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, - 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, - 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, - 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, - 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, }; + static const u32 rcon[] = { - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) @@ -729,85 +737,84 @@ static const u32 rcon[] = { * * @return the number of rounds for the given cipher key size. */ -int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { - int i = 0; - u32 temp; +int rijndaelKeySetupEnc(u32 rk[ /*4*(Nr + 1) */ ], const u8 cipherKey[], + int keyBits) +{ + int i = 0; + u32 temp; - rk[0] = GETU32(cipherKey ); - rk[1] = GETU32(cipherKey + 4); - rk[2] = GETU32(cipherKey + 8); - rk[3] = GETU32(cipherKey + 12); - if (keyBits == 128) { - for (;;) { - temp = rk[3]; - rk[4] = rk[0] ^ - (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp ) & 0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24) ] & 0x000000ff) ^ - rcon[i]; - rk[5] = rk[1] ^ rk[4]; - rk[6] = rk[2] ^ rk[5]; - rk[7] = rk[3] ^ rk[6]; - if (++i == 10) { - return 10; - } - rk += 4; - } - } - rk[4] = GETU32(cipherKey + 16); - rk[5] = GETU32(cipherKey + 20); - if (keyBits == 192) { - for (;;) { - temp = rk[ 5]; - rk[ 6] = rk[ 0] ^ - (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp ) & 0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24) ] & 0x000000ff) ^ - rcon[i]; - rk[ 7] = rk[ 1] ^ rk[ 6]; - rk[ 8] = rk[ 2] ^ rk[ 7]; - rk[ 9] = rk[ 3] ^ rk[ 8]; - if (++i == 8) { - return 12; - } - rk[10] = rk[ 4] ^ rk[ 9]; - rk[11] = rk[ 5] ^ rk[10]; - rk += 6; - } - } - rk[6] = GETU32(cipherKey + 24); - rk[7] = GETU32(cipherKey + 28); - if (keyBits == 256) { - for (;;) { - temp = rk[ 7]; - rk[ 8] = rk[ 0] ^ - (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp ) & 0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24) ] & 0x000000ff) ^ - rcon[i]; - rk[ 9] = rk[ 1] ^ rk[ 8]; - rk[10] = rk[ 2] ^ rk[ 9]; - rk[11] = rk[ 3] ^ rk[10]; - if (++i == 7) { - return 14; - } - temp = rk[11]; - rk[12] = rk[ 4] ^ - (Te4[(temp >> 24) ] & 0xff000000) ^ - (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(temp ) & 0xff] & 0x000000ff); - rk[13] = rk[ 5] ^ rk[12]; - rk[14] = rk[ 6] ^ rk[13]; - rk[15] = rk[ 7] ^ rk[14]; - - rk += 8; + rk[0] = GETU32(cipherKey); + rk[1] = GETU32(cipherKey + 4); + rk[2] = GETU32(cipherKey + 8); + rk[3] = GETU32(cipherKey + 12); + if (keyBits == 128) { + for (;;) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + return 10; + } + rk += 4; + } } - } - return 0; + rk[4] = GETU32(cipherKey + 16); + rk[5] = GETU32(cipherKey + 20); + if (keyBits == 192) { + for (;;) { + temp = rk[5]; + rk[6] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; + rk[7] = rk[1] ^ rk[6]; + rk[8] = rk[2] ^ rk[7]; + rk[9] = rk[3] ^ rk[8]; + if (++i == 8) { + return 12; + } + rk[10] = rk[4] ^ rk[9]; + rk[11] = rk[5] ^ rk[10]; + rk += 6; + } + } + rk[6] = GETU32(cipherKey + 24); + rk[7] = GETU32(cipherKey + 28); + if (keyBits == 256) { + for (;;) { + temp = rk[7]; + rk[8] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; + rk[9] = rk[1] ^ rk[8]; + rk[10] = rk[2] ^ rk[9]; + rk[11] = rk[3] ^ rk[10]; + if (++i == 7) { + return 14; + } + temp = rk[11]; + rk[12] = rk[4] ^ + (Te4[(temp >> 24)] & 0xff000000) ^ + (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(temp) & 0xff] & 0x000000ff); + rk[13] = rk[5] ^ rk[12]; + rk[14] = rk[6] ^ rk[13]; + rk[15] = rk[7] ^ rk[14]; + + rk += 8; + } + } + return 0; } /** @@ -815,588 +822,656 @@ int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBit * * @return the number of rounds for the given cipher key size. */ -int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { - int Nr, i, j; - u32 temp; +int rijndaelKeySetupDec(u32 rk[ /*4*(Nr + 1) */ ], const u8 cipherKey[], + int keyBits) +{ + int Nr, i, j; + u32 temp; - /* expand the cipher key: */ - Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); - /* invert the order of the round keys: */ - for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { - temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; - temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; - temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; - temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; - } - /* apply the inverse MixColumn transform to all round keys but the first and the last: */ - for (i = 1; i < Nr; i++) { - rk += 4; - rk[0] = - Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[0] ) & 0xff] & 0xff]; - rk[1] = - Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[1] ) & 0xff] & 0xff]; - rk[2] = - Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[2] ) & 0xff] & 0xff]; - rk[3] = - Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[3] ) & 0xff] & 0xff]; - } - return Nr; + /* expand the cipher key: */ + Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); + /* invert the order of the round keys: */ + for (i = 0, j = 4 * Nr; i < j; i += 4, j -= 4) { + temp = rk[i]; + rk[i] = rk[j]; + rk[j] = temp; + temp = rk[i + 1]; + rk[i + 1] = rk[j + 1]; + rk[j + 1] = temp; + temp = rk[i + 2]; + rk[i + 2] = rk[j + 2]; + rk[j + 2] = temp; + temp = rk[i + 3]; + rk[i + 3] = rk[j + 3]; + rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < Nr; i++) { + rk += 4; + rk[0] = + Td0[Te4[(rk[0] >> 24)] & 0xff] ^ + Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[0]) & 0xff] & 0xff]; + rk[1] = + Td0[Te4[(rk[1] >> 24)] & 0xff] ^ + Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[1]) & 0xff] & 0xff]; + rk[2] = + Td0[Te4[(rk[2] >> 24)] & 0xff] ^ + Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[2]) & 0xff] & 0xff]; + rk[3] = + Td0[Te4[(rk[3] >> 24)] & 0xff] ^ + Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[3]) & 0xff] & 0xff]; + } + return Nr; } -void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { - u32 s0, s1, s2, s3, t0, t1, t2, t3; +void rijndaelEncrypt(const u32 rk[ /*4*(Nr + 1) */ ], int Nr, const u8 pt[16], + u8 ct[16]) +{ + u32 s0, s1, s2, s3, t0, t1, t2, t3; #ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ + int r; +#endif /* ?FULL_UNROLL */ - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(pt ) ^ rk[0]; - s1 = GETU32(pt + 4) ^ rk[1]; - s2 = GETU32(pt + 8) ^ rk[2]; - s3 = GETU32(pt + 12) ^ rk[3]; + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(pt) ^ rk[0]; + s1 = GETU32(pt + 4) ^ rk[1]; + s2 = GETU32(pt + 8) ^ rk[2]; + s3 = GETU32(pt + 12) ^ rk[3]; #ifdef FULL_UNROLL - /* round 1: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; - if (Nr > 10) { - /* round 10: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; - if (Nr > 12) { - /* round 12: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ + Te3[s3 & 0xff] ^ rk[4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ + Te3[s0 & 0xff] ^ rk[5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ + Te3[s1 & 0xff] ^ rk[6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ + Te3[s2 & 0xff] ^ rk[7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ + Te3[t3 & 0xff] ^ rk[8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ + Te3[t0 & 0xff] ^ rk[9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ + Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ + Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ + Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ + Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ + Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ + Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ + Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ + Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ + Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ + Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ + Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ + Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ + Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ + Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ + Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ + Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ + Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ + Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ + Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ + Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ + Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ + Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ + Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ + Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ + Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ + Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ + Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ + Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ + Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ + Te3[s2 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & + 0xff] ^ Te3[t3 + & + 0xff] + ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & + 0xff] ^ Te3[t0 + & + 0xff] + ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & + 0xff] ^ Te3[t1 + & + 0xff] + ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & + 0xff] ^ Te3[t2 + & + 0xff] + ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & + 0xff] ^ Te3[s3 + & + 0xff] + ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & + 0xff] ^ Te3[s0 + & + 0xff] + ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & + 0xff] ^ Te3[s1 + & + 0xff] + ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & + 0xff] ^ Te3[s2 + & + 0xff] + ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } } - } - rk += Nr << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = Nr >> 1; - for (;;) { - t0 = - Te0[(s0 >> 24) ] ^ - Te1[(s1 >> 16) & 0xff] ^ - Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3 ) & 0xff] ^ - rk[4]; - t1 = - Te0[(s1 >> 24) ] ^ - Te1[(s2 >> 16) & 0xff] ^ - Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0 ) & 0xff] ^ - rk[5]; - t2 = - Te0[(s2 >> 24) ] ^ - Te1[(s3 >> 16) & 0xff] ^ - Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1 ) & 0xff] ^ - rk[6]; - t3 = - Te0[(s3 >> 24) ] ^ - Te1[(s0 >> 16) & 0xff] ^ - Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2 ) & 0xff] ^ - rk[7]; + rk += Nr << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = Te0[(s0 >> 24)] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[4]; + t1 = Te0[(s1 >> 24)] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[5]; + t2 = Te0[(s2 >> 24)] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[6]; + t3 = Te0[(s3 >> 24)] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[7]; - rk += 8; - if (--r == 0) { - break; + rk += 8; + if (--r == 0) { + break; + } + + s0 = Te0[(t0 >> 24)] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ Te3[(t3) & 0xff] ^ rk[0]; + s1 = Te0[(t1 >> 24)] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ Te3[(t0) & 0xff] ^ rk[1]; + s2 = Te0[(t2 >> 24)] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ Te3[(t1) & 0xff] ^ rk[2]; + s3 = Te0[(t3 >> 24)] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ Te3[(t2) & 0xff] ^ rk[3]; } - - s0 = - Te0[(t0 >> 24) ] ^ - Te1[(t1 >> 16) & 0xff] ^ - Te2[(t2 >> 8) & 0xff] ^ - Te3[(t3 ) & 0xff] ^ - rk[0]; - s1 = - Te0[(t1 >> 24) ] ^ - Te1[(t2 >> 16) & 0xff] ^ - Te2[(t3 >> 8) & 0xff] ^ - Te3[(t0 ) & 0xff] ^ - rk[1]; - s2 = - Te0[(t2 >> 24) ] ^ - Te1[(t3 >> 16) & 0xff] ^ - Te2[(t0 >> 8) & 0xff] ^ - Te3[(t1 ) & 0xff] ^ - rk[2]; - s3 = - Te0[(t3 >> 24) ] ^ - Te1[(t0 >> 16) & 0xff] ^ - Te2[(t1 >> 8) & 0xff] ^ - Te3[(t2 ) & 0xff] ^ - rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = - (Te4[(t0 >> 24) ] & 0xff000000) ^ - (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t3 ) & 0xff] & 0x000000ff) ^ - rk[0]; - PUTU32(ct , s0); - s1 = - (Te4[(t1 >> 24) ] & 0xff000000) ^ - (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t0 ) & 0xff] & 0x000000ff) ^ - rk[1]; - PUTU32(ct + 4, s1); - s2 = - (Te4[(t2 >> 24) ] & 0xff000000) ^ - (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t1 ) & 0xff] & 0x000000ff) ^ - rk[2]; - PUTU32(ct + 8, s2); - s3 = - (Te4[(t3 >> 24) ] & 0xff000000) ^ - (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t2 ) & 0xff] & 0x000000ff) ^ - rk[3]; - PUTU32(ct + 12, s3); +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = (Te4[(t0 >> 24)] & 0xff000000) ^ + (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t3) & 0xff] & 0x000000ff) ^ rk[0]; + PUTU32(ct, s0); + s1 = (Te4[(t1 >> 24)] & 0xff000000) ^ + (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t0) & 0xff] & 0x000000ff) ^ rk[1]; + PUTU32(ct + 4, s1); + s2 = (Te4[(t2 >> 24)] & 0xff000000) ^ + (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t1) & 0xff] & 0x000000ff) ^ rk[2]; + PUTU32(ct + 8, s2); + s3 = (Te4[(t3 >> 24)] & 0xff000000) ^ + (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t2) & 0xff] & 0x000000ff) ^ rk[3]; + PUTU32(ct + 12, s3); } -void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { - u32 s0, s1, s2, s3, t0, t1, t2, t3; +void rijndaelDecrypt(const u32 rk[ /*4*(Nr + 1) */ ], int Nr, const u8 ct[16], + u8 pt[16]) +{ + u32 s0, s1, s2, s3, t0, t1, t2, t3; #ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ + int r; +#endif /* ?FULL_UNROLL */ - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(ct ) ^ rk[0]; - s1 = GETU32(ct + 4) ^ rk[1]; - s2 = GETU32(ct + 8) ^ rk[2]; - s3 = GETU32(ct + 12) ^ rk[3]; + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(ct) ^ rk[0]; + s1 = GETU32(ct + 4) ^ rk[1]; + s2 = GETU32(ct + 8) ^ rk[2]; + s3 = GETU32(ct + 12) ^ rk[3]; #ifdef FULL_UNROLL - /* round 1: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; - if (Nr > 10) { - /* round 10: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; - if (Nr > 12) { - /* round 12: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ + Td3[s1 & 0xff] ^ rk[4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ + Td3[s2 & 0xff] ^ rk[5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ + Td3[s3 & 0xff] ^ rk[6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ + Td3[s0 & 0xff] ^ rk[7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ + Td3[t1 & 0xff] ^ rk[8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ + Td3[t2 & 0xff] ^ rk[9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ + Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ + Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ + Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ + Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ + Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ + Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ + Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ + Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ + Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ + Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ + Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ + Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ + Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ + Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ + Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ + Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ + Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ + Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ + Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ + Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ + Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ + Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ + Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ + Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ + Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ + Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ + Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ + Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ + Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ + Td3[s0 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & + 0xff] ^ Td3[t1 + & + 0xff] + ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & + 0xff] ^ Td3[t2 + & + 0xff] + ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & + 0xff] ^ Td3[t3 + & + 0xff] + ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & + 0xff] ^ Td3[t0 + & + 0xff] + ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & + 0xff] ^ Td3[s1 + & + 0xff] + ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & + 0xff] ^ Td3[s2 + & + 0xff] + ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & + 0xff] ^ Td3[s3 + & + 0xff] + ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & + 0xff] ^ Td3[s0 + & + 0xff] + ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } } - } - rk += Nr << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = Nr >> 1; - for (;;) { - t0 = - Td0[(s0 >> 24) ] ^ - Td1[(s3 >> 16) & 0xff] ^ - Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1 ) & 0xff] ^ - rk[4]; - t1 = - Td0[(s1 >> 24) ] ^ - Td1[(s0 >> 16) & 0xff] ^ - Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2 ) & 0xff] ^ - rk[5]; - t2 = - Td0[(s2 >> 24) ] ^ - Td1[(s1 >> 16) & 0xff] ^ - Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3 ) & 0xff] ^ - rk[6]; - t3 = - Td0[(s3 >> 24) ] ^ - Td1[(s2 >> 16) & 0xff] ^ - Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0 ) & 0xff] ^ - rk[7]; + rk += Nr << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = Td0[(s0 >> 24)] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[4]; + t1 = Td0[(s1 >> 24)] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[5]; + t2 = Td0[(s2 >> 24)] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[6]; + t3 = Td0[(s3 >> 24)] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = Td0[(t0 >> 24)] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ Td3[(t1) & 0xff] ^ rk[0]; + s1 = Td0[(t1 >> 24)] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ Td3[(t2) & 0xff] ^ rk[1]; + s2 = Td0[(t2 >> 24)] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ Td3[(t3) & 0xff] ^ rk[2]; + s3 = Td0[(t3 >> 24)] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ Td3[(t0) & 0xff] ^ rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = (Td4[(t0 >> 24)] & 0xff000000) ^ + (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t1) & 0xff] & 0x000000ff) ^ rk[0]; + PUTU32(pt, s0); + s1 = (Td4[(t1 >> 24)] & 0xff000000) ^ + (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t2) & 0xff] & 0x000000ff) ^ rk[1]; + PUTU32(pt + 4, s1); + s2 = (Td4[(t2 >> 24)] & 0xff000000) ^ + (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t3) & 0xff] & 0x000000ff) ^ rk[2]; + PUTU32(pt + 8, s2); + s3 = (Td4[(t3 >> 24)] & 0xff000000) ^ + (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t0) & 0xff] & 0x000000ff) ^ rk[3]; + PUTU32(pt + 12, s3); +} + +void rijndaelEncryptRound(const u32 rk[ /*4*(Nr + 1) */ ], int Nr, u8 block[16], + int rounds) +{ + int r; + u32 s0, s1, s2, s3, t0, t1, t2, t3; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(block) ^ rk[0]; + s1 = GETU32(block + 4) ^ rk[1]; + s2 = GETU32(block + 8) ^ rk[2]; + s3 = GETU32(block + 12) ^ rk[3]; + rk += 4; + + /* + * Nr - 1 full rounds: + */ + for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) { + t0 = Te0[(s0 >> 24)] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[0]; + t1 = Te0[(s1 >> 24)] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[1]; + t2 = Te0[(s2 >> 24)] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[2]; + t3 = Te0[(s3 >> 24)] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[3]; + + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + rk += 4; - rk += 8; - if (--r == 0) { - break; } - s0 = - Td0[(t0 >> 24) ] ^ - Td1[(t3 >> 16) & 0xff] ^ - Td2[(t2 >> 8) & 0xff] ^ - Td3[(t1 ) & 0xff] ^ - rk[0]; - s1 = - Td0[(t1 >> 24) ] ^ - Td1[(t0 >> 16) & 0xff] ^ - Td2[(t3 >> 8) & 0xff] ^ - Td3[(t2 ) & 0xff] ^ - rk[1]; - s2 = - Td0[(t2 >> 24) ] ^ - Td1[(t1 >> 16) & 0xff] ^ - Td2[(t0 >> 8) & 0xff] ^ - Td3[(t3 ) & 0xff] ^ - rk[2]; - s3 = - Td0[(t3 >> 24) ] ^ - Td1[(t2 >> 16) & 0xff] ^ - Td2[(t1 >> 8) & 0xff] ^ - Td3[(t0 ) & 0xff] ^ - rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = - (Td4[(t0 >> 24) ] & 0xff000000) ^ - (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(t1 ) & 0xff] & 0x000000ff) ^ - rk[0]; - PUTU32(pt , s0); - s1 = - (Td4[(t1 >> 24) ] & 0xff000000) ^ - (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(t2 ) & 0xff] & 0x000000ff) ^ - rk[1]; - PUTU32(pt + 4, s1); - s2 = - (Td4[(t2 >> 24) ] & 0xff000000) ^ - (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(t3 ) & 0xff] & 0x000000ff) ^ - rk[2]; - PUTU32(pt + 8, s2); - s3 = - (Td4[(t3 >> 24) ] & 0xff000000) ^ - (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(t0 ) & 0xff] & 0x000000ff) ^ - rk[3]; - PUTU32(pt + 12, s3); + /* + * apply last round and + * map cipher state to byte array block: + */ + if (rounds == Nr) { + t0 = (Te4[(s0 >> 24)] & 0xff000000) ^ + (Te4[(s1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s3) & 0xff] & 0x000000ff) ^ rk[0]; + t1 = (Te4[(s1 >> 24)] & 0xff000000) ^ + (Te4[(s2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s0) & 0xff] & 0x000000ff) ^ rk[1]; + t2 = (Te4[(s2 >> 24)] & 0xff000000) ^ + (Te4[(s3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s1) & 0xff] & 0x000000ff) ^ rk[2]; + t3 = (Te4[(s3 >> 24)] & 0xff000000) ^ + (Te4[(s0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s2) & 0xff] & 0x000000ff) ^ rk[3]; + + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + PUTU32(block, s0); + PUTU32(block + 4, s1); + PUTU32(block + 8, s2); + PUTU32(block + 12, s3); } +void rijndaelDecryptRound(const u32 rk[ /*4*(Nr + 1) */ ], int Nr, u8 block[16], + int rounds) +{ + int r; + u32 s0, s1, s2, s3, t0, t1, t2, t3; -void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { - int r; - u32 s0, s1, s2, s3, t0, t1, t2, t3; + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(block) ^ rk[0]; + s1 = GETU32(block + 4) ^ rk[1]; + s2 = GETU32(block + 8) ^ rk[2]; + s3 = GETU32(block + 12) ^ rk[3]; + rk += 4; - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(block ) ^ rk[0]; - s1 = GETU32(block + 4) ^ rk[1]; - s2 = GETU32(block + 8) ^ rk[2]; - s3 = GETU32(block + 12) ^ rk[3]; - rk += 4; + /* + * Nr - 1 full rounds: + */ + for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) { + t0 = Td0[(s0 >> 24)] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[0]; + t1 = Td0[(s1 >> 24)] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[1]; + t2 = Td0[(s2 >> 24)] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[2]; + t3 = Td0[(s3 >> 24)] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[3]; - /* - * Nr - 1 full rounds: - */ - for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) { - t0 = - Te0[(s0 >> 24) ] ^ - Te1[(s1 >> 16) & 0xff] ^ - Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3 ) & 0xff] ^ - rk[0]; - t1 = - Te0[(s1 >> 24) ] ^ - Te1[(s2 >> 16) & 0xff] ^ - Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0 ) & 0xff] ^ - rk[1]; - t2 = - Te0[(s2 >> 24) ] ^ - Te1[(s3 >> 16) & 0xff] ^ - Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1 ) & 0xff] ^ - rk[2]; - t3 = - Te0[(s3 >> 24) ] ^ - Te1[(s0 >> 16) & 0xff] ^ - Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2 ) & 0xff] ^ - rk[3]; + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + rk += 4; - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - rk += 4; + } - } + /* + * complete the last round and + * map cipher state to byte array block: + */ + t0 = (Td4[(s0 >> 24)] & 0xff000000) ^ + (Td4[(s3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s1) & 0xff] & 0x000000ff); + t1 = (Td4[(s1 >> 24)] & 0xff000000) ^ + (Td4[(s0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s2) & 0xff] & 0x000000ff); + t2 = (Td4[(s2 >> 24)] & 0xff000000) ^ + (Td4[(s1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s3) & 0xff] & 0x000000ff); + t3 = (Td4[(s3 >> 24)] & 0xff000000) ^ + (Td4[(s2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s0) & 0xff] & 0x000000ff); - /* - * apply last round and - * map cipher state to byte array block: - */ - if (rounds == Nr) { - t0 = - (Te4[(s0 >> 24) ] & 0xff000000) ^ - (Te4[(s1 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(s2 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(s3 ) & 0xff] & 0x000000ff) ^ - rk[0]; - t1 = - (Te4[(s1 >> 24) ] & 0xff000000) ^ - (Te4[(s2 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(s3 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(s0 ) & 0xff] & 0x000000ff) ^ - rk[1]; - t2 = - (Te4[(s2 >> 24) ] & 0xff000000) ^ - (Te4[(s3 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(s0 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(s1 ) & 0xff] & 0x000000ff) ^ - rk[2]; - t3 = - (Te4[(s3 >> 24) ] & 0xff000000) ^ - (Te4[(s0 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(s1 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(s2 ) & 0xff] & 0x000000ff) ^ - rk[3]; - - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - } + if (rounds == Nr) { + t0 ^= rk[0]; + t1 ^= rk[1]; + t2 ^= rk[2]; + t3 ^= rk[3]; + } - PUTU32(block , s0); - PUTU32(block + 4, s1); - PUTU32(block + 8, s2); - PUTU32(block + 12, s3); + PUTU32(block, t0); + PUTU32(block + 4, t1); + PUTU32(block + 8, t2); + PUTU32(block + 12, t3); } - -void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { - int r; - u32 s0, s1, s2, s3, t0, t1, t2, t3; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(block ) ^ rk[0]; - s1 = GETU32(block + 4) ^ rk[1]; - s2 = GETU32(block + 8) ^ rk[2]; - s3 = GETU32(block + 12) ^ rk[3]; - rk += 4; - - /* - * Nr - 1 full rounds: - */ - for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) { - t0 = - Td0[(s0 >> 24) ] ^ - Td1[(s3 >> 16) & 0xff] ^ - Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1 ) & 0xff] ^ - rk[0]; - t1 = - Td0[(s1 >> 24) ] ^ - Td1[(s0 >> 16) & 0xff] ^ - Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2 ) & 0xff] ^ - rk[1]; - t2 = - Td0[(s2 >> 24) ] ^ - Td1[(s1 >> 16) & 0xff] ^ - Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3 ) & 0xff] ^ - rk[2]; - t3 = - Td0[(s3 >> 24) ] ^ - Td1[(s2 >> 16) & 0xff] ^ - Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0 ) & 0xff] ^ - rk[3]; - - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - rk += 4; - - } - - /* - * complete the last round and - * map cipher state to byte array block: - */ - t0 = - (Td4[(s0 >> 24) ] & 0xff000000) ^ - (Td4[(s3 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(s2 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(s1 ) & 0xff] & 0x000000ff); - t1 = - (Td4[(s1 >> 24) ] & 0xff000000) ^ - (Td4[(s0 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(s3 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(s2 ) & 0xff] & 0x000000ff); - t2 = - (Td4[(s2 >> 24) ] & 0xff000000) ^ - (Td4[(s1 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(s0 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(s3 ) & 0xff] & 0x000000ff); - t3 = - (Td4[(s3 >> 24) ] & 0xff000000) ^ - (Td4[(s2 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(s1 >> 8) & 0xff] & 0x0000ff00) ^ - (Td4[(s0 ) & 0xff] & 0x000000ff); - - if (rounds == Nr) { - t0 ^= rk[0]; - t1 ^= rk[1]; - t2 ^= rk[2]; - t3 ^= rk[3]; - } - - PUTU32(block , t0); - PUTU32(block + 4, t1); - PUTU32(block + 8, t2); - PUTU32(block + 12, t3); -} - diff --git a/ultragrid/src/crypto/crypt_des.c b/ultragrid/src/crypto/crypt_des.c index 84dccc84d..f7b6ad887 100644 --- a/ultragrid/src/crypto/crypt_des.c +++ b/ultragrid/src/crypto/crypt_des.c @@ -303,171 +303,163 @@ _o1 |= (_i1 & B03) >> 28; /* 32 */ \ } static -Word s_p0[64] = -{ /* Combined S-Box1 and permutation P */ -0x00808200, 0x00000000, 0x00008000, 0x00808202, -0x00808002, 0x00008202, 0x00000002, 0x00008000, -0x00000200, 0x00808200, 0x00808202, 0x00000200, -0x00800202, 0x00808002, 0x00800000, 0x00000002, -0x00000202, 0x00800200, 0x00800200, 0x00008200, -0x00008200, 0x00808000, 0x00808000, 0x00800202, -0x00008002, 0x00800002, 0x00800002, 0x00008002, -0x00000000, 0x00000202, 0x00008202, 0x00800000, -0x00008000, 0x00808202, 0x00000002, 0x00808000, -0x00808200, 0x00800000, 0x00800000, 0x00000200, -0x00808002, 0x00008000, 0x00008200, 0x00800002, -0x00000200, 0x00000002, 0x00800202, 0x00008202, -0x00808202, 0x00008002, 0x00808000, 0x00800202, -0x00800002, 0x00000202, 0x00008202, 0x00808200, -0x00000202, 0x00800200, 0x00800200, 0x00000000, -0x00008002, 0x00008200, 0x00000000, 0x00808002 +Word s_p0[64] = { /* Combined S-Box1 and permutation P */ + 0x00808200, 0x00000000, 0x00008000, 0x00808202, + 0x00808002, 0x00008202, 0x00000002, 0x00008000, + 0x00000200, 0x00808200, 0x00808202, 0x00000200, + 0x00800202, 0x00808002, 0x00800000, 0x00000002, + 0x00000202, 0x00800200, 0x00800200, 0x00008200, + 0x00008200, 0x00808000, 0x00808000, 0x00800202, + 0x00008002, 0x00800002, 0x00800002, 0x00008002, + 0x00000000, 0x00000202, 0x00008202, 0x00800000, + 0x00008000, 0x00808202, 0x00000002, 0x00808000, + 0x00808200, 0x00800000, 0x00800000, 0x00000200, + 0x00808002, 0x00008000, 0x00008200, 0x00800002, + 0x00000200, 0x00000002, 0x00800202, 0x00008202, + 0x00808202, 0x00008002, 0x00808000, 0x00800202, + 0x00800002, 0x00000202, 0x00008202, 0x00808200, + 0x00000202, 0x00800200, 0x00800200, 0x00000000, + 0x00008002, 0x00008200, 0x00000000, 0x00808002 }; static -Word s_p1[64] = -{ /* Combined S-Box2 and permutation P */ -0x40084010, 0x40004000, 0x00004000, 0x00084010, -0x00080000, 0x00000010, 0x40080010, 0x40004010, -0x40000010, 0x40084010, 0x40084000, 0x40000000, -0x40004000, 0x00080000, 0x00000010, 0x40080010, -0x00084000, 0x00080010, 0x40004010, 0x00000000, -0x40000000, 0x00004000, 0x00084010, 0x40080000, -0x00080010, 0x40000010, 0x00000000, 0x00084000, -0x00004010, 0x40084000, 0x40080000, 0x00004010, -0x00000000, 0x00084010, 0x40080010, 0x00080000, -0x40004010, 0x40080000, 0x40084000, 0x00004000, -0x40080000, 0x40004000, 0x00000010, 0x40084010, -0x00084010, 0x00000010, 0x00004000, 0x40000000, -0x00004010, 0x40084000, 0x00080000, 0x40000010, -0x00080010, 0x40004010, 0x40000010, 0x00080010, -0x00084000, 0x00000000, 0x40004000, 0x00004010, -0x40000000, 0x40080010, 0x40084010, 0x00084000 +Word s_p1[64] = { /* Combined S-Box2 and permutation P */ + 0x40084010, 0x40004000, 0x00004000, 0x00084010, + 0x00080000, 0x00000010, 0x40080010, 0x40004010, + 0x40000010, 0x40084010, 0x40084000, 0x40000000, + 0x40004000, 0x00080000, 0x00000010, 0x40080010, + 0x00084000, 0x00080010, 0x40004010, 0x00000000, + 0x40000000, 0x00004000, 0x00084010, 0x40080000, + 0x00080010, 0x40000010, 0x00000000, 0x00084000, + 0x00004010, 0x40084000, 0x40080000, 0x00004010, + 0x00000000, 0x00084010, 0x40080010, 0x00080000, + 0x40004010, 0x40080000, 0x40084000, 0x00004000, + 0x40080000, 0x40004000, 0x00000010, 0x40084010, + 0x00084010, 0x00000010, 0x00004000, 0x40000000, + 0x00004010, 0x40084000, 0x00080000, 0x40000010, + 0x00080010, 0x40004010, 0x40000010, 0x00080010, + 0x00084000, 0x00000000, 0x40004000, 0x00004010, + 0x40000000, 0x40080010, 0x40084010, 0x00084000 }; static -Word s_p2[64] = -{ /* Combined S-Box3 and permutation P */ -0x00000104, 0x04010100, 0x00000000, 0x04010004, -0x04000100, 0x00000000, 0x00010104, 0x04000100, -0x00010004, 0x04000004, 0x04000004, 0x00010000, -0x04010104, 0x00010004, 0x04010000, 0x00000104, -0x04000000, 0x00000004, 0x04010100, 0x00000100, -0x00010100, 0x04010000, 0x04010004, 0x00010104, -0x04000104, 0x00010100, 0x00010000, 0x04000104, -0x00000004, 0x04010104, 0x00000100, 0x04000000, -0x04010100, 0x04000000, 0x00010004, 0x00000104, -0x00010000, 0x04010100, 0x04000100, 0x00000000, -0x00000100, 0x00010004, 0x04010104, 0x04000100, -0x04000004, 0x00000100, 0x00000000, 0x04010004, -0x04000104, 0x00010000, 0x04000000, 0x04010104, -0x00000004, 0x00010104, 0x00010100, 0x04000004, -0x04010000, 0x04000104, 0x00000104, 0x04010000, -0x00010104, 0x00000004, 0x04010004, 0x00010100 +Word s_p2[64] = { /* Combined S-Box3 and permutation P */ + 0x00000104, 0x04010100, 0x00000000, 0x04010004, + 0x04000100, 0x00000000, 0x00010104, 0x04000100, + 0x00010004, 0x04000004, 0x04000004, 0x00010000, + 0x04010104, 0x00010004, 0x04010000, 0x00000104, + 0x04000000, 0x00000004, 0x04010100, 0x00000100, + 0x00010100, 0x04010000, 0x04010004, 0x00010104, + 0x04000104, 0x00010100, 0x00010000, 0x04000104, + 0x00000004, 0x04010104, 0x00000100, 0x04000000, + 0x04010100, 0x04000000, 0x00010004, 0x00000104, + 0x00010000, 0x04010100, 0x04000100, 0x00000000, + 0x00000100, 0x00010004, 0x04010104, 0x04000100, + 0x04000004, 0x00000100, 0x00000000, 0x04010004, + 0x04000104, 0x00010000, 0x04000000, 0x04010104, + 0x00000004, 0x00010104, 0x00010100, 0x04000004, + 0x04010000, 0x04000104, 0x00000104, 0x04010000, + 0x00010104, 0x00000004, 0x04010004, 0x00010100 }; static -Word s_p3[64] = -{ /* Combined S-Box4 and permutation P */ -0x80401000, 0x80001040, 0x80001040, 0x00000040, -0x00401040, 0x80400040, 0x80400000, 0x80001000, -0x00000000, 0x00401000, 0x00401000, 0x80401040, -0x80000040, 0x00000000, 0x00400040, 0x80400000, -0x80000000, 0x00001000, 0x00400000, 0x80401000, -0x00000040, 0x00400000, 0x80001000, 0x00001040, -0x80400040, 0x80000000, 0x00001040, 0x00400040, -0x00001000, 0x00401040, 0x80401040, 0x80000040, -0x00400040, 0x80400000, 0x00401000, 0x80401040, -0x80000040, 0x00000000, 0x00000000, 0x00401000, -0x00001040, 0x00400040, 0x80400040, 0x80000000, -0x80401000, 0x80001040, 0x80001040, 0x00000040, -0x80401040, 0x80000040, 0x80000000, 0x00001000, -0x80400000, 0x80001000, 0x00401040, 0x80400040, -0x80001000, 0x00001040, 0x00400000, 0x80401000, -0x00000040, 0x00400000, 0x00001000, 0x00401040 +Word s_p3[64] = { /* Combined S-Box4 and permutation P */ + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x00401040, 0x80400040, 0x80400000, 0x80001000, + 0x00000000, 0x00401000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00400040, 0x80400000, + 0x80000000, 0x00001000, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x80001000, 0x00001040, + 0x80400040, 0x80000000, 0x00001040, 0x00400040, + 0x00001000, 0x00401040, 0x80401040, 0x80000040, + 0x00400040, 0x80400000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00000000, 0x00401000, + 0x00001040, 0x00400040, 0x80400040, 0x80000000, + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x80401040, 0x80000040, 0x80000000, 0x00001000, + 0x80400000, 0x80001000, 0x00401040, 0x80400040, + 0x80001000, 0x00001040, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x00001000, 0x00401040 }; static -Word s_p4[64] = -{ /* Combined S-Box5 and permutation P */ -0x00000080, 0x01040080, 0x01040000, 0x21000080, -0x00040000, 0x00000080, 0x20000000, 0x01040000, -0x20040080, 0x00040000, 0x01000080, 0x20040080, -0x21000080, 0x21040000, 0x00040080, 0x20000000, -0x01000000, 0x20040000, 0x20040000, 0x00000000, -0x20000080, 0x21040080, 0x21040080, 0x01000080, -0x21040000, 0x20000080, 0x00000000, 0x21000000, -0x01040080, 0x01000000, 0x21000000, 0x00040080, -0x00040000, 0x21000080, 0x00000080, 0x01000000, -0x20000000, 0x01040000, 0x21000080, 0x20040080, -0x01000080, 0x20000000, 0x21040000, 0x01040080, -0x20040080, 0x00000080, 0x01000000, 0x21040000, -0x21040080, 0x00040080, 0x21000000, 0x21040080, -0x01040000, 0x00000000, 0x20040000, 0x21000000, -0x00040080, 0x01000080, 0x20000080, 0x00040000, -0x00000000, 0x20040000, 0x01040080, 0x20000080 +Word s_p4[64] = { /* Combined S-Box5 and permutation P */ + 0x00000080, 0x01040080, 0x01040000, 0x21000080, + 0x00040000, 0x00000080, 0x20000000, 0x01040000, + 0x20040080, 0x00040000, 0x01000080, 0x20040080, + 0x21000080, 0x21040000, 0x00040080, 0x20000000, + 0x01000000, 0x20040000, 0x20040000, 0x00000000, + 0x20000080, 0x21040080, 0x21040080, 0x01000080, + 0x21040000, 0x20000080, 0x00000000, 0x21000000, + 0x01040080, 0x01000000, 0x21000000, 0x00040080, + 0x00040000, 0x21000080, 0x00000080, 0x01000000, + 0x20000000, 0x01040000, 0x21000080, 0x20040080, + 0x01000080, 0x20000000, 0x21040000, 0x01040080, + 0x20040080, 0x00000080, 0x01000000, 0x21040000, + 0x21040080, 0x00040080, 0x21000000, 0x21040080, + 0x01040000, 0x00000000, 0x20040000, 0x21000000, + 0x00040080, 0x01000080, 0x20000080, 0x00040000, + 0x00000000, 0x20040000, 0x01040080, 0x20000080 }; static -Word s_p5[64] = -{ /* Combined S-Box6 and permutation P */ -0x10000008, 0x10200000, 0x00002000, 0x10202008, -0x10200000, 0x00000008, 0x10202008, 0x00200000, -0x10002000, 0x00202008, 0x00200000, 0x10000008, -0x00200008, 0x10002000, 0x10000000, 0x00002008, -0x00000000, 0x00200008, 0x10002008, 0x00002000, -0x00202000, 0x10002008, 0x00000008, 0x10200008, -0x10200008, 0x00000000, 0x00202008, 0x10202000, -0x00002008, 0x00202000, 0x10202000, 0x10000000, -0x10002000, 0x00000008, 0x10200008, 0x00202000, -0x10202008, 0x00200000, 0x00002008, 0x10000008, -0x00200000, 0x10002000, 0x10000000, 0x00002008, -0x10000008, 0x10202008, 0x00202000, 0x10200000, -0x00202008, 0x10202000, 0x00000000, 0x10200008, -0x00000008, 0x00002000, 0x10200000, 0x00202008, -0x00002000, 0x00200008, 0x10002008, 0x00000000, -0x10202000, 0x10000000, 0x00200008, 0x10002008 +Word s_p5[64] = { /* Combined S-Box6 and permutation P */ + 0x10000008, 0x10200000, 0x00002000, 0x10202008, + 0x10200000, 0x00000008, 0x10202008, 0x00200000, + 0x10002000, 0x00202008, 0x00200000, 0x10000008, + 0x00200008, 0x10002000, 0x10000000, 0x00002008, + 0x00000000, 0x00200008, 0x10002008, 0x00002000, + 0x00202000, 0x10002008, 0x00000008, 0x10200008, + 0x10200008, 0x00000000, 0x00202008, 0x10202000, + 0x00002008, 0x00202000, 0x10202000, 0x10000000, + 0x10002000, 0x00000008, 0x10200008, 0x00202000, + 0x10202008, 0x00200000, 0x00002008, 0x10000008, + 0x00200000, 0x10002000, 0x10000000, 0x00002008, + 0x10000008, 0x10202008, 0x00202000, 0x10200000, + 0x00202008, 0x10202000, 0x00000000, 0x10200008, + 0x00000008, 0x00002000, 0x10200000, 0x00202008, + 0x00002000, 0x00200008, 0x10002008, 0x00000000, + 0x10202000, 0x10000000, 0x00200008, 0x10002008 }; static -Word s_p6[64] = -{ /* Combined S-Box7 and permutation P */ -0x00100000, 0x02100001, 0x02000401, 0x00000000, -0x00000400, 0x02000401, 0x00100401, 0x02100400, -0x02100401, 0x00100000, 0x00000000, 0x02000001, -0x00000001, 0x02000000, 0x02100001, 0x00000401, -0x02000400, 0x00100401, 0x00100001, 0x02000400, -0x02000001, 0x02100000, 0x02100400, 0x00100001, -0x02100000, 0x00000400, 0x00000401, 0x02100401, -0x00100400, 0x00000001, 0x02000000, 0x00100400, -0x02000000, 0x00100400, 0x00100000, 0x02000401, -0x02000401, 0x02100001, 0x02100001, 0x00000001, -0x00100001, 0x02000000, 0x02000400, 0x00100000, -0x02100400, 0x00000401, 0x00100401, 0x02100400, -0x00000401, 0x02000001, 0x02100401, 0x02100000, -0x00100400, 0x00000000, 0x00000001, 0x02100401, -0x00000000, 0x00100401, 0x02100000, 0x00000400, -0x02000001, 0x02000400, 0x00000400, 0x00100001 +Word s_p6[64] = { /* Combined S-Box7 and permutation P */ + 0x00100000, 0x02100001, 0x02000401, 0x00000000, + 0x00000400, 0x02000401, 0x00100401, 0x02100400, + 0x02100401, 0x00100000, 0x00000000, 0x02000001, + 0x00000001, 0x02000000, 0x02100001, 0x00000401, + 0x02000400, 0x00100401, 0x00100001, 0x02000400, + 0x02000001, 0x02100000, 0x02100400, 0x00100001, + 0x02100000, 0x00000400, 0x00000401, 0x02100401, + 0x00100400, 0x00000001, 0x02000000, 0x00100400, + 0x02000000, 0x00100400, 0x00100000, 0x02000401, + 0x02000401, 0x02100001, 0x02100001, 0x00000001, + 0x00100001, 0x02000000, 0x02000400, 0x00100000, + 0x02100400, 0x00000401, 0x00100401, 0x02100400, + 0x00000401, 0x02000001, 0x02100401, 0x02100000, + 0x00100400, 0x00000000, 0x00000001, 0x02100401, + 0x00000000, 0x00100401, 0x02100000, 0x00000400, + 0x02000001, 0x02000400, 0x00000400, 0x00100001 }; static -Word s_p7[64] = -{ /* Combined S-Box8 and permutation P */ -0x08000820, 0x00000800, 0x00020000, 0x08020820, -0x08000000, 0x08000820, 0x00000020, 0x08000000, -0x00020020, 0x08020000, 0x08020820, 0x00020800, -0x08020800, 0x00020820, 0x00000800, 0x00000020, -0x08020000, 0x08000020, 0x08000800, 0x00000820, -0x00020800, 0x00020020, 0x08020020, 0x08020800, -0x00000820, 0x00000000, 0x00000000, 0x08020020, -0x08000020, 0x08000800, 0x00020820, 0x00020000, -0x00020820, 0x00020000, 0x08020800, 0x00000800, -0x00000020, 0x08020020, 0x00000800, 0x00020820, -0x08000800, 0x00000020, 0x08000020, 0x08020000, -0x08020020, 0x08000000, 0x00020000, 0x08000820, -0x00000000, 0x08020820, 0x00020020, 0x08000020, -0x08020000, 0x08000800, 0x08000820, 0x00000000, -0x08020820, 0x00020800, 0x00020800, 0x00000820, -0x00000820, 0x00020020, 0x08000000, 0x08020800 +Word s_p7[64] = { /* Combined S-Box8 and permutation P */ + 0x08000820, 0x00000800, 0x00020000, 0x08020820, + 0x08000000, 0x08000820, 0x00000020, 0x08000000, + 0x00020020, 0x08020000, 0x08020820, 0x00020800, + 0x08020800, 0x00020820, 0x00000800, 0x00000020, + 0x08020000, 0x08000020, 0x08000800, 0x00000820, + 0x00020800, 0x00020020, 0x08020020, 0x08020800, + 0x00000820, 0x00000000, 0x00000000, 0x08020020, + 0x08000020, 0x08000800, 0x00020820, 0x00020000, + 0x00020820, 0x00020000, 0x08020800, 0x00000800, + 0x00000020, 0x08020020, 0x00000800, 0x00020820, + 0x08000800, 0x00000020, 0x08000020, 0x08020000, + 0x08020020, 0x08000000, 0x00020000, 0x08000820, + 0x00000000, 0x08020820, 0x00020020, 0x08000020, + 0x08020000, 0x08000800, 0x08000820, 0x00000000, + 0x08020820, 0x00020800, 0x00020800, 0x00000820, + 0x00000820, 0x00020020, 0x08000000, 0x08020800 }; #define INITIAL_PERMUTATION(t, regL, regR) \ @@ -482,20 +474,20 @@ Word s_p7[64] = #define PC2(regC, regD, k) \ PC2_AUX(regC, regD, k[0], k[1]) -unsigned char G_padChar = (char) 0; /* Default pad charcater */ +unsigned char G_padChar = (char)0; /* Default pad charcater */ -static Word ROTATE_LEFT(Word x) +static Word ROTATE_LEFT(Word x) { - Word a; - a = (x & 0x80000000) >> 27; - return (x << 1) | a; + Word a; + a = (x & 0x80000000) >> 27; + return (x << 1) | a; } -static Word ROTATE_RIGHT(Word x) +static Word ROTATE_RIGHT(Word x) { - Word a; - a = x & 0x00000010; - return (x >> 1) | (a << 27); + Word a; + a = x & 0x00000010; + return (x >> 1) | (a << 27); } /* @@ -529,7 +521,6 @@ static Word ROTATE_RIGHT(Word x) FINAL_PERMUTATION(r, l, t); \ } - #define MAKE_LITTLE_ENDIAN(t, s) \ { \ register unsigned int z, l = s/4; \ @@ -537,7 +528,7 @@ static Word ROTATE_RIGHT(Word x) for(z = 0; z < l; ++z) tp[z] = htonl(tp[z]); \ } -#else /* WORDS_BIGENDIAN */ +#else /* WORDS_BIGENDIAN */ #define DES(t, ik) \ { \ @@ -561,256 +552,284 @@ static Word ROTATE_RIGHT(Word x) FINAL_PERMUTATION(r, l, t); \ } -#endif /* WORDS_BIGENDIAN */ +#endif /* WORDS_BIGENDIAN */ int -qfDES(unsigned char *key, - unsigned char *data, - unsigned int size, -const QFDES_what what, -const QFDES_mode mode, - unsigned char *initVec) +qfDES(unsigned char *key, + unsigned char *data, + unsigned int size, + const QFDES_what what, const QFDES_mode mode, unsigned char *initVec) { - /* Store some info to optimise for multiple calls ... */ - static unsigned char desKey[8], desKeys[128]; - static Word *oldKey = (Word *) desKey, - *keys = (Word *) desKeys; - static QFDES_what oldWhat; - static QFDES_mode oldMode; - unsigned char b0[8], b1[8]; /* feedback blocks */ - Word *newKey = (Word *) key, /* key from user */ - *text, /* text to be [en|de]crypted */ - *cb = (Word *) b0, /* the chained block in CBC mode */ - *cb1 = (Word *) b1; /* a copy for use when decrypting */ + /* Store some info to optimise for multiple calls ... */ + static unsigned char desKey[8], desKeys[128]; + static Word *oldKey = (Word *) desKey, *keys = (Word *) desKeys; + static QFDES_what oldWhat; + static QFDES_mode oldMode; + unsigned char b0[8], b1[8]; /* feedback blocks */ + Word *newKey = (Word *) key, /* key from user */ + *text, /* text to be [en|de]crypted */ + *cb = (Word *) b0, /* the chained block in CBC mode */ + *cb1 = (Word *) b1; /* a copy for use when decrypting */ #if !defined(WORDS_BIGENDIAN) - unsigned int origSize = size; - MAKE_LITTLE_ENDIAN(key, 8); - MAKE_LITTLE_ENDIAN(data, origSize); + unsigned int origSize = size; + MAKE_LITTLE_ENDIAN(key, 8); + MAKE_LITTLE_ENDIAN(data, origSize); #endif - /* - ** Check new key against old key - ** and set up intermediate keys. - */ - if (newKey[0] != oldKey[0] || newKey[1] != oldKey[1]) { - Word c, d; /* C and D registers */ - - oldKey[0] = newKey[0]; oldKey[1] = newKey[1]; - oldWhat = what; - oldMode = mode; - - PC1(newKey, c, d); - - if ((what == qfDES_encrypt) || (mode == qfDES_cfb) || (mode == qfDES_ofb)) { - int z; - Word r; - Word *k = keys; - Word rol[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; - - for(z = 0; z < 16; z++, k += 2) { - for (r = 0; r < rol[z]; r++) { - c = ROTATE_LEFT(c); - d = ROTATE_LEFT(d); - } - PC2(c, d, k); - } - } else { - int z; - Word r; - Word *k = keys; - Word ror[16] = {0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; - - for(z = 0; z < 16; z++, k += 2) { - r = 0; - while (ror[z] > r) { - r++; - c = ROTATE_RIGHT(c); - d = ROTATE_RIGHT(d); - } - PC2(c, d, k); - } - } - } else if ((what != oldWhat) && ((mode == qfDES_ecb) || (mode == qfDES_cbc))) { /* - ** Same key but different direction. - ** Reverse intermediate key sequence (ECB and CBC). - */ - Word *ik1, *ik2, ik3[2]; + ** Check new key against old key + ** and set up intermediate keys. + */ + if (newKey[0] != oldKey[0] || newKey[1] != oldKey[1]) { + Word c, d; /* C and D registers */ - for(ik1 = keys, ik2 = &(keys[30]); ik1 < ik2; ik1 += 2, ik2 -= 2) { - ik3[0] = ik1[0]; ik3[1] = ik1[1]; - ik1[0] = ik2[0]; ik1[1] = ik2[1]; - ik2[0] = ik3[0]; ik2[1] = ik3[1]; + oldKey[0] = newKey[0]; + oldKey[1] = newKey[1]; + oldWhat = what; + oldMode = mode; + + PC1(newKey, c, d); + + if ((what == qfDES_encrypt) || (mode == qfDES_cfb) + || (mode == qfDES_ofb)) { + int z; + Word r; + Word *k = keys; + Word rol[16] = + { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + + for (z = 0; z < 16; z++, k += 2) { + for (r = 0; r < rol[z]; r++) { + c = ROTATE_LEFT(c); + d = ROTATE_LEFT(d); + } + PC2(c, d, k); + } + } else { + int z; + Word r; + Word *k = keys; + Word ror[16] = + { 0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + + for (z = 0; z < 16; z++, k += 2) { + r = 0; + while (ror[z] > r) { + r++; + c = ROTATE_RIGHT(c); + d = ROTATE_RIGHT(d); + } + PC2(c, d, k); + } + } + } else if ((what != oldWhat) + && ((mode == qfDES_ecb) || (mode == qfDES_cbc))) { + /* + ** Same key but different direction. + ** Reverse intermediate key sequence (ECB and CBC). + */ + Word *ik1, *ik2, ik3[2]; + + for (ik1 = keys, ik2 = &(keys[30]); ik1 < ik2; + ik1 += 2, ik2 -= 2) { + ik3[0] = ik1[0]; + ik3[1] = ik1[1]; + ik1[0] = ik2[0]; + ik1[1] = ik2[1]; + ik2[0] = ik3[0]; + ik2[1] = ik3[1]; + } + + oldWhat = what; } - oldWhat = what; - } + /* Set up initilaisation vector */ + if (mode != qfDES_ecb) { + if (initVec) { + { + cb[0] = ((Word *) initVec)[0]; + cb[1] = ((Word *) initVec)[1]; + } + } else { + cb[0] = 0; + cb[1] = 0; + } +#if !defined(WORDS_BIGENDIAN) + MAKE_LITTLE_ENDIAN(cb, 8); +#endif + } - /* Set up initilaisation vector */ - if (mode != qfDES_ecb) { + /* + ** Lots of gotos and code duplication follow (arrgh) but it speeds + ** it up a wee bit! + ** What would be more useful is looking more carefully at the DES + ** permutations to produce more efficient versions of the macros + ** of the "auto-generated" versions used in qfDES-aux.c. + */ + + size >>= 3; /* this is always a multpile of 8 */ + + if (what == qfDES_encrypt) { + switch ((int)mode) { + case ((int)qfDES_ecb): + goto _ECB_; + case ((int)qfDES_cbc): + goto _CBC_encrypt_; + case ((int)qfDES_cfb): + goto _CFB_encrypt_; + case ((int)qfDES_ofb): + goto _OFB_; + } + } else { + switch ((int)mode) { + case ((int)qfDES_ecb): + goto _ECB_; + case ((int)qfDES_cbc): + goto _CBC_decrypt_; + case ((int)qfDES_cfb): + goto _CFB_decrypt_; + case ((int)qfDES_ofb): + goto _OFB_; + } + } + + _ECB_: + + /* ECB */ + for (text = (Word *) data; size; --size, text += 2) { + DES(text, keys); + } + + goto _exit_qfDES_; + + _CBC_encrypt_: + + /* CBC Encryption */ + for (text = (Word *) data; size; --size, text += 2) { + + /* chaining block */ + text[0] ^= cb[0]; + text[1] ^= cb[1]; + + DES(text, keys); + + /* set up chaining block for next round */ + cb[0] = text[0]; + cb[1] = text[1]; + } + + goto _initVec_; + + _CBC_decrypt_: + + /* CBC Decryption */ + for (text = (Word *) data; size; --size, text += 2) { + + /* set up chaining block */ + /* + ** The decryption is done in place so I need + ** to copy this text block for the next round. + */ + cb1[0] = text[0]; + cb1[1] = text[1]; + + DES(text, keys); + + /* chaining block for next round */ + text[0] ^= cb[0]; + text[1] ^= cb[1]; + + /* + ** Copy back the saved encrypted text - this makes + ** CBC decryption slower than CBC encryption. + */ + cb[0] = cb1[0]; + cb[1] = cb1[1]; + } + + goto _initVec_; + + _CFB_encrypt_: + + /* CFB Encryption */ + for (text = (Word *) data; size; --size, text += 2) { + + /* use cb as the feedback block */ + DES(cb, keys); + + text[0] ^= cb[0]; + text[1] ^= cb[1]; + + /* set up feedback block for next round */ + cb[0] = text[0]; + cb[1] = text[1]; + } + + goto _initVec_; + + _CFB_decrypt_: + + /* CFB Decryption */ + for (text = (Word *) data; size; --size, text += 2) { + + /* set up feedback block */ + /* + ** The decryption is done in place so I need + ** to copy this text block for the next round. + */ + cb1[0] = text[0]; + cb1[1] = text[1]; + + /* use cb as the feedback block */ + DES(cb, keys); + + text[0] ^= cb[0]; + text[1] ^= cb[1]; + + /* set up feedback block for next round */ + cb[0] = cb1[0]; + cb[1] = cb1[1]; + } + + goto _initVec_; + + _OFB_: + + /* OFB */ + for (text = (Word *) data; size; --size, text += 2) { + + /* use cb as the feed back block */ + DES(cb, keys); + + text[0] ^= cb[0]; + text[1] ^= cb[1]; + } + + _initVec_: + + /* + ** Copy the final chained block back to initVec (CBC, CFB and OFB). + ** This allows the [en|de]cryption of large amounts of data in small + ** chunks. + */ if (initVec) { - { cb[0] = ((Word *) initVec)[0]; cb[1] = ((Word *) initVec)[1]; } - } else { - cb[0] = 0; - cb[1] = 0; - } + ((Word *) initVec)[0] = cb[0]; + ((Word *) initVec)[1] = cb[1]; + #if !defined(WORDS_BIGENDIAN) - MAKE_LITTLE_ENDIAN(cb, 8); + MAKE_LITTLE_ENDIAN(initVec, 8); #endif - } - - /* - ** Lots of gotos and code duplication follow (arrgh) but it speeds - ** it up a wee bit! - ** What would be more useful is looking more carefully at the DES - ** permutations to produce more efficient versions of the macros - ** of the "auto-generated" versions used in qfDES-aux.c. - */ - - size >>= 3; /* this is always a multpile of 8 */ - - if (what == qfDES_encrypt) { - switch ((int) mode) { - case ((int) qfDES_ecb): goto _ECB_; - case ((int) qfDES_cbc): goto _CBC_encrypt_; - case ((int) qfDES_cfb): goto _CFB_encrypt_; - case ((int) qfDES_ofb): goto _OFB_; } - } - else { - switch ((int) mode) { - case ((int) qfDES_ecb): goto _ECB_; - case ((int) qfDES_cbc): goto _CBC_decrypt_; - case ((int) qfDES_cfb): goto _CFB_decrypt_; - case ((int) qfDES_ofb): goto _OFB_; - } - } -_ECB_: - - /* ECB */ - for(text = (Word *) data; size; --size, text += 2) - { DES(text, keys); } - - goto _exit_qfDES_; - -_CBC_encrypt_: - - /* CBC Encryption */ - for(text = (Word *) data; size; --size, text += 2) { - - /* chaining block */ - text[0] ^= cb[0]; text[1] ^= cb[1]; - - DES(text, keys); - - /* set up chaining block for next round */ - cb[0] = text[0]; cb[1] = text[1]; - } - - goto _initVec_; - -_CBC_decrypt_: - - /* CBC Decryption */ - for(text = (Word *) data; size; --size, text += 2) { - - /* set up chaining block */ - /* - ** The decryption is done in place so I need - ** to copy this text block for the next round. - */ - cb1[0] = text[0]; cb1[1] = text[1]; - - DES(text, keys); - - /* chaining block for next round */ - text[0] ^= cb[0]; text[1] ^= cb[1]; - - /* - ** Copy back the saved encrypted text - this makes - ** CBC decryption slower than CBC encryption. - */ - cb[0] = cb1[0]; cb[1] = cb1[1]; - } - - goto _initVec_; - -_CFB_encrypt_: - - /* CFB Encryption */ - for(text = (Word *) data; size; --size, text += 2) { - - /* use cb as the feedback block */ - DES(cb, keys); - - text[0] ^= cb[0]; text[1] ^= cb[1]; - - /* set up feedback block for next round */ - cb[0] = text[0]; cb[1] = text[1]; - } - - goto _initVec_; - -_CFB_decrypt_: - - /* CFB Decryption */ - for(text = (Word *) data; size; --size, text += 2) { - - /* set up feedback block */ - /* - ** The decryption is done in place so I need - ** to copy this text block for the next round. - */ - cb1[0] = text[0]; cb1[1] = text[1]; - - /* use cb as the feedback block */ - DES(cb, keys); - - text[0] ^= cb[0]; text[1] ^= cb[1]; - - /* set up feedback block for next round */ - cb[0] = cb1[0]; cb[1] = cb1[1]; - } - - goto _initVec_; - -_OFB_: - - /* OFB */ - for(text = (Word *) data; size; --size, text += 2) { - - /* use cb as the feed back block */ - DES(cb, keys); - - text[0] ^= cb[0]; text[1] ^= cb[1]; - } - -_initVec_: - - /* - ** Copy the final chained block back to initVec (CBC, CFB and OFB). - ** This allows the [en|de]cryption of large amounts of data in small - ** chunks. - */ - if (initVec) { - ((Word *) initVec)[0] = cb[0]; - ((Word *) initVec)[1] = cb[1]; + _exit_qfDES_: #if !defined(WORDS_BIGENDIAN) - MAKE_LITTLE_ENDIAN(initVec, 8); -#endif - } - -_exit_qfDES_: - -#if !defined(WORDS_BIGENDIAN) - MAKE_LITTLE_ENDIAN(key, 8); - MAKE_LITTLE_ENDIAN(data, origSize); + MAKE_LITTLE_ENDIAN(key, 8); + MAKE_LITTLE_ENDIAN(data, origSize); #endif - return 0; + return 0; } /* @@ -820,55 +839,60 @@ _exit_qfDES_: ** it may be useful to someone. */ -void qfDES_setParity(unsigned char *ptr, unsigned int size, const QFDES_parity parity) +void qfDES_setParity(unsigned char *ptr, unsigned int size, + const QFDES_parity parity) { - unsigned int i, mask, bits; + unsigned int i, mask, bits; - for(i = 0; i < size; ++i, ++ptr) { - for(mask = 0x80, bits = 0; mask > 0x01; mask >>= 1) - if (((unsigned int) *ptr) & mask) ++bits; + for (i = 0; i < size; ++i, ++ptr) { + for (mask = 0x80, bits = 0; mask > 0x01; mask >>= 1) + if (((unsigned int)*ptr) & mask) + ++bits; - *ptr |= bits % 2 == (unsigned int) parity ? 0x00 : 0x01; - } + *ptr |= bits % 2 == (unsigned int)parity ? 0x00 : 0x01; + } } -unsigned int qfDES_checkParity(unsigned char *ptr, unsigned int size, const QFDES_parity parity) +unsigned int qfDES_checkParity(unsigned char *ptr, unsigned int size, + const QFDES_parity parity) { - unsigned int i, mask, bits, parityBit, parityErrors = 0; + unsigned int i, mask, bits, parityBit, parityErrors = 0; - for(i = 0; i < size; ++i, ++ptr) { - for(mask = 0x80, bits = 0; mask > 0x01; mask >>= 1) - if (((unsigned int) *ptr) & mask) ++bits; + for (i = 0; i < size; ++i, ++ptr) { + for (mask = 0x80, bits = 0; mask > 0x01; mask >>= 1) + if (((unsigned int)*ptr) & mask) + ++bits; - parityBit = bits % 2 == (unsigned int) parity ? 0 : 1; + parityBit = bits % 2 == (unsigned int)parity ? 0 : 1; - if ((((unsigned int) *ptr) & 0x1) != parityBit) - ++parityErrors; - } + if ((((unsigned int)*ptr) & 0x1) != parityBit) + ++parityErrors; + } - return parityErrors; + return parityErrors; } static unsigned char weakKeys[18][8] = -{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, - {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, - {0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe}, - {0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e}, - {0xe0, 0xe0, 0xe0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1}, - {0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe}, - {0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01}, - {0x1f, 0xe0, 0x1f, 0xe0, 0x0e, 0xf1, 0x0e, 0xf1}, - {0xe0, 0x1f, 0xe0, 0x1f, 0xf1, 0x0e, 0xf1, 0x0e}, - {0x01, 0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1}, - {0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1, 0x01}, - {0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe}, - {0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e}, - {0x01, 0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e}, - {0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e, 0x01}, - {0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe}, - {0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1}}; + { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, +{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, +{0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe}, +{0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e}, +{0xe0, 0xe0, 0xe0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1}, +{0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe}, +{0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01}, +{0x1f, 0xe0, 0x1f, 0xe0, 0x0e, 0xf1, 0x0e, 0xf1}, +{0xe0, 0x1f, 0xe0, 0x1f, 0xf1, 0x0e, 0xf1, 0x0e}, +{0x01, 0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1}, +{0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1, 0x01}, +{0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe}, +{0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e}, +{0x01, 0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e}, +{0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e, 0x01}, +{0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe}, +{0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1} +}; /* ** Although this is really only used by the key generation function below, @@ -877,13 +901,14 @@ unsigned char weakKeys[18][8] = int qfDES_checkWeakKeys(unsigned char *key) { - unsigned char *bp; - int i; + unsigned char *bp; + int i; - for(bp = weakKeys[i = 0]; i < 18; bp = weakKeys[++i]) - if (memcmp((void *) key, (void *) bp, 8) == 0) return -1; + for (bp = weakKeys[i = 0]; i < 18; bp = weakKeys[++i]) + if (memcmp((void *)key, (void *)bp, 8) == 0) + return -1; - return 0; + return 0; } /* @@ -895,34 +920,35 @@ int qfDES_checkWeakKeys(unsigned char *key) unsigned char *qfDES_generate(const QFDES_generate what) { - static - unsigned char buffer[8]; - static - int flag = 0; + static + unsigned char buffer[8]; + static + int flag = 0; - unsigned char *bp; - int mask = what == qfDES_key ? 0xfe : 0xff; + unsigned char *bp; + int mask = what == qfDES_key ? 0xfe : 0xff; - /* Set up a seed - 42 is the answer ... */ - if (!flag) { - lbl_srandom((int) (getpid() * 42) ^ (int) time((time_t *) 0)); - flag = 1; - } - do { + /* Set up a seed - 42 is the answer ... */ + if (!flag) { + lbl_srandom((int)(getpid() * 42) ^ (int)time((time_t *) 0)); + flag = 1; + } + do { - for(bp = buffer; bp <= &(buffer[7]); *bp++ = (unsigned char) (lbl_random() & mask)); + for (bp = buffer; bp <= &(buffer[7]); + *bp++ = (unsigned char)(lbl_random() & mask)) ; - if (what == qfDES_key) - qfDES_setParity(buffer, 8, qfDES_odd); + if (what == qfDES_key) + qfDES_setParity(buffer, 8, qfDES_odd); - } while(what == qfDES_key ? qfDES_checkWeakKeys(buffer) : 0); + } while (what == qfDES_key ? qfDES_checkWeakKeys(buffer) : 0); - return buffer; + return buffer; } -unsigned char -qfDES_setPad(unsigned char pad) -{ - unsigned char b = G_padChar; G_padChar = pad; return b; +unsigned char qfDES_setPad(unsigned char pad) +{ + unsigned char b = G_padChar; + G_padChar = pad; + return b; } - diff --git a/ultragrid/src/crypto/md5.c b/ultragrid/src/crypto/md5.c index 5a284bdab..49fe2c957 100644 --- a/ultragrid/src/crypto/md5.c +++ b/ultragrid/src/crypto/md5.c @@ -52,9 +52,9 @@ #define S44 21 static unsigned char PADDING[64] = { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* @@ -99,127 +99,125 @@ static unsigned char PADDING[64] = { * Encodes input (uint32_t) into output (unsigned char). Assumes len is a * multiple of 4. */ -static void -Encode(unsigned char *output, uint32_t * input, unsigned int len) +static void Encode(unsigned char *output, uint32_t * input, unsigned int len) { - unsigned int i, j; + unsigned int i, j; - assert((len % 4) == 0); + assert((len % 4) == 0); - for (i = 0, j = 0; j < len; i++, j += 4) { - output[j] = (unsigned char) (input[i] & 0xff); - output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff); - output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff); - output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff); - } + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j + 1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j + 2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j + 3] = (unsigned char)((input[i] >> 24) & 0xff); + } } /* * Decodes input (unsigned char) into output (uint32_t). Assumes len is a * multiple of 4. */ -static void -Decode(uint32_t * output, unsigned char *input, unsigned int len) +static void Decode(uint32_t * output, unsigned char *input, unsigned int len) { - unsigned int i, j; + unsigned int i, j; - for (i = 0, j = 0; j < len; i++, j += 4) - output[i] = ((uint32_t) input[j]) | (((uint32_t) input[j + 1]) << 8) | - (((uint32_t) input[j + 2]) << 16) | (((uint32_t) input[j + 3]) << 24); + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = + ((uint32_t) input[j]) | (((uint32_t) input[j + 1]) << 8) | + (((uint32_t) input[j + 2]) << 16) | + (((uint32_t) input[j + 3]) << 24); } /* * MD5 basic transformation. Transforms state based on block. */ -static void -MD5Transform(uint32_t state[4], unsigned char block[64]) +static void MD5Transform(uint32_t state[4], unsigned char block[64]) { - uint32_t a = state[0], b = state[1], c = state[2], d = state[3], - x[16]; + uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; - Decode(x, block, 64); + Decode(x, block, 64); - /* Round 1 */ - FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ - FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ - FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ - FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ - FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ - FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ - FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ - FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ - FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ - FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ - FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ - FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ - FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ - FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ - FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ - FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + /* Round 1 */ + FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ + FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ + FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ + FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ + FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ + FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ + FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ + FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ + FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ + FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ + FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ - /* Round 2 */ - GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ - GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ - GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ - GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ - GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ - GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ - GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ - GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ - GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ - GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ - GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ - GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ - GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ - GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ - GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ - GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + /* Round 2 */ + GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ + GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ + GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ + GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ + GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ + GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ + GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ + GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ + GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ + GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ + GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ - /* Round 3 */ - HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ - HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ - HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ - HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ - HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ - HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ - HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ - HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ - HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ - HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ - HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ - HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ - HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ - HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ - HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ - HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ + /* Round 3 */ + HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ + HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ + HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ + HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ + HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ + HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ + HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ + HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ + HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ + HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ - /* Round 4 */ - II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ - II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ - II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ - II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ - II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ - II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ - II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ - II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ - II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ - II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ - II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ - II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ - II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ - II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ - II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ - II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ + /* Round 4 */ + II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ + II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ + II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ + II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ + II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ + II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ + II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ + II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ + II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ + II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; - /* - * Zeroize sensitive information. - */ - memset((unsigned char *) x, 0, sizeof(x)); + /* + * Zeroize sensitive information. + */ + memset((unsigned char *)x, 0, sizeof(x)); } /** @@ -228,15 +226,14 @@ MD5Transform(uint32_t state[4], unsigned char block[64]) * * Initializes MD5 context for the start of message digest computation. **/ -void -MD5Init(MD5_CTX * context) +void MD5Init(MD5_CTX * context) { - context->count[0] = context->count[1] = 0; - /* Load magic initialization constants. */ - context->state[0] = 0x67452301; - context->state[1] = 0xefcdab89; - context->state[2] = 0x98badcfe; - context->state[3] = 0x10325476; + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; } /** @@ -249,38 +246,40 @@ MD5Init(MD5_CTX * context) * processing another message block, and updating the context. **/ -void -MD5Update(MD5_CTX * context, unsigned char *input, unsigned int inputLen) +void MD5Update(MD5_CTX * context, unsigned char *input, unsigned int inputLen) { - unsigned int i, index, partLen; + unsigned int i, index, partLen; - /* Compute number of bytes mod 64 */ - index = (unsigned int) ((context->count[0] >> 3) & 0x3F); + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); - /* Update number of bits */ - if ((context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) { - context->count[1]++; - } - context->count[1] += ((uint32_t) inputLen >> 29); + /* Update number of bits */ + if ((context->count[0] += + ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) { + context->count[1]++; + } + context->count[1] += ((uint32_t) inputLen >> 29); - partLen = 64 - index; + partLen = 64 - index; - /* Transform as many times as possible. */ - if (inputLen >= partLen) { - memcpy((unsigned char *) & context->buffer[index], (unsigned char *) input, partLen); - MD5Transform(context->state, context->buffer); + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + memcpy((unsigned char *)&context->buffer[index], + (unsigned char *)input, partLen); + MD5Transform(context->state, context->buffer); - for (i = partLen; i + 63 < inputLen; i += 64) { - MD5Transform(context->state, &input[i]); - } - index = 0; - } else { - i = 0; - } - /* Buffer remaining input */ - if ((inputLen - i) != 0) { - memcpy((unsigned char *) & context->buffer[index], (unsigned char *) & input[i], inputLen - i); - } + for (i = partLen; i + 63 < inputLen; i += 64) { + MD5Transform(context->state, &input[i]); + } + index = 0; + } else { + i = 0; + } + /* Buffer remaining input */ + if ((inputLen - i) != 0) { + memcpy((unsigned char *)&context->buffer[index], + (unsigned char *)&input[i], inputLen - i); + } } /** @@ -293,30 +292,28 @@ MD5Update(MD5_CTX * context, unsigned char *input, unsigned int inputLen) * with MD5Init() before being used for other MD5 checksum calculations. **/ -void -MD5Final(unsigned char digest[16], MD5_CTX * context) +void MD5Final(unsigned char digest[16], MD5_CTX * context) { - unsigned char bits[8]; - unsigned int index, padLen; + unsigned char bits[8]; + unsigned int index, padLen; - /* Save number of bits */ - Encode(bits, context->count, 8); + /* Save number of bits */ + Encode(bits, context->count, 8); - /* - * Pad out to 56 mod 64. - */ - index = (unsigned int) ((context->count[0] >> 3) & 0x3f); - padLen = (index < 56) ? (56 - index) : (120 - index); - MD5Update(context, PADDING, padLen); + /* + * Pad out to 56 mod 64. + */ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update(context, PADDING, padLen); - /* Append length (before padding) */ - MD5Update(context, bits, 8); - /* Store state in digest */ - Encode(digest, context->state, 16); + /* Append length (before padding) */ + MD5Update(context, bits, 8); + /* Store state in digest */ + Encode(digest, context->state, 16); - /* - * Zeroize sensitive information. - */ - memset((unsigned char *) context, 0, sizeof(*context)); + /* + * Zeroize sensitive information. + */ + memset((unsigned char *)context, 0, sizeof(*context)); } - diff --git a/ultragrid/src/crypto/random.c b/ultragrid/src/crypto/random.c index 33ea37934..0b0399399 100644 --- a/ultragrid/src/crypto/random.c +++ b/ultragrid/src/crypto/random.c @@ -53,41 +53,38 @@ static uint32_t randseed = 1; -void -lbl_srandom(uint32_t seed) +void lbl_srandom(uint32_t seed) { - randseed = seed; + randseed = seed; } -uint32_t -lbl_random(void) +uint32_t lbl_random(void) { #ifdef HAVE_DEV_URANDOM - int fd, res, l; + int fd, res, l; - fd = open("/dev/urandom", O_RDONLY); - if (fd == -1) { - perror("Cannot open random sequence generator"); - abort(); - } - l = read(fd, &res, sizeof(res)); - if (l != sizeof(res)) { - perror("Cannot read random data"); - abort(); - } - close(fd); - return res; + fd = open("/dev/urandom", O_RDONLY); + if (fd == -1) { + perror("Cannot open random sequence generator"); + abort(); + } + l = read(fd, &res, sizeof(res)); + if (l != sizeof(res)) { + perror("Cannot read random data"); + abort(); + } + close(fd); + return res; #else - register uint32_t x = randseed; - register uint32_t hi, lo, t; + register uint32_t x = randseed; + register uint32_t hi, lo, t; - hi = x / 127773; - lo = x % 127773; - t = 16807 * lo - 2836 * hi; - if (t <= 0) - t += 0x7fffffff; - randseed = t; - return (t); + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if (t <= 0) + t += 0x7fffffff; + randseed = t; + return (t); #endif } - diff --git a/ultragrid/src/debug.c b/ultragrid/src/debug.c index c9a1bbd51..d8cb982c8 100644 --- a/ultragrid/src/debug.c +++ b/ultragrid/src/debug.c @@ -52,21 +52,21 @@ void _dprintf(const char *format, ...) #ifdef WIN32 char msg[65535]; va_list ap; - + va_start(ap, format); - _vsnprintf(msg, 65535, format, ap); + _vsnprintf(msg, 65535, format, ap); va_end(ap); OutputDebugString(msg); -#else +#else va_list ap; - + va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); -#endif /* WIN32 */ +#endif /* WIN32 */ #else - UNUSED (format); -#endif /* DEBUG */ + UNUSED(format); +#endif /* DEBUG */ } /** @@ -78,72 +78,64 @@ void _dprintf(const char *format, ...) * hexadecimal and an ascii representation of the memory region. * **/ -void debug_dump(void*lp, int len) +void debug_dump(void *lp, int len) { - char * p; - int i, j, start; - char Buff[81]; - char stuffBuff[10]; - char tmpBuf[10]; - - _dprintf("Dump of %ld=%lx bytes\n",len, len); - start = 0L; - while (start < len) - { - /* start line with pointer position key */ - p = (char*)lp + start; - sprintf(Buff,"%p: ",p); - - /* display each character as hex value */ - for (i=start, j=0; j < 16; p++,i++, j++) - { - if (i < len) - { - sprintf(tmpBuf,"%X",((int)(*p) & 0xFF)); - - if (strlen((char *)tmpBuf) < 2) - { - stuffBuff[0] = '0'; - stuffBuff[1] = tmpBuf[0]; - stuffBuff[2] = ' '; - stuffBuff[3] = '\0'; - } else - { - stuffBuff[0] = tmpBuf[0]; - stuffBuff[1] = tmpBuf[1]; - stuffBuff[2] = ' '; - stuffBuff[3] = '\0'; - } - strcat(Buff, stuffBuff); - } else - strcat(Buff," "); - if (j == 7) /* space between groups of 8 */ - strcat(Buff," "); - } - - /* fill out incomplete lines */ - for(;j<16;j++) - { - strcat(Buff," "); - if (j == 7) - strcat(Buff," "); - } - strcat(Buff," "); - - /* display each character as character value */ - for (i=start,j=0,p=(char*)lp+start; - (i < len && j < 16); p++,i++, j++) - { - if ( ((*p) >= ' ') && ((*p) <= '~') ) /* test displayable */ - sprintf(tmpBuf,"%c", *p); - else - sprintf(tmpBuf,"%c", '.'); - strcat(Buff,tmpBuf); - if (j == 7) /* space between groups of 8 */ - strcat(Buff," "); - } - _dprintf("%s\n", Buff); - start = i; /* next line starting byte */ - } -} + char *p; + int i, j, start; + char Buff[81]; + char stuffBuff[10]; + char tmpBuf[10]; + _dprintf("Dump of %ld=%lx bytes\n", len, len); + start = 0L; + while (start < len) { + /* start line with pointer position key */ + p = (char *)lp + start; + sprintf(Buff, "%p: ", p); + + /* display each character as hex value */ + for (i = start, j = 0; j < 16; p++, i++, j++) { + if (i < len) { + sprintf(tmpBuf, "%X", ((int)(*p) & 0xFF)); + + if (strlen((char *)tmpBuf) < 2) { + stuffBuff[0] = '0'; + stuffBuff[1] = tmpBuf[0]; + stuffBuff[2] = ' '; + stuffBuff[3] = '\0'; + } else { + stuffBuff[0] = tmpBuf[0]; + stuffBuff[1] = tmpBuf[1]; + stuffBuff[2] = ' '; + stuffBuff[3] = '\0'; + } + strcat(Buff, stuffBuff); + } else + strcat(Buff, " "); + if (j == 7) /* space between groups of 8 */ + strcat(Buff, " "); + } + + /* fill out incomplete lines */ + for (; j < 16; j++) { + strcat(Buff, " "); + if (j == 7) + strcat(Buff, " "); + } + strcat(Buff, " "); + + /* display each character as character value */ + for (i = start, j = 0, p = (char *)lp + start; + (i < len && j < 16); p++, i++, j++) { + if (((*p) >= ' ') && ((*p) <= '~')) /* test displayable */ + sprintf(tmpBuf, "%c", *p); + else + sprintf(tmpBuf, "%c", '.'); + strcat(Buff, tmpBuf); + if (j == 7) /* space between groups of 8 */ + strcat(Buff, " "); + } + _dprintf("%s\n", Buff); + start = i; /* next line starting byte */ + } +} diff --git a/ultragrid/src/ihdtv/ihdtv.c b/ultragrid/src/ihdtv/ihdtv.c index 2fc426e49..59ff46932 100644 --- a/ultragrid/src/ihdtv/ihdtv.c +++ b/ultragrid/src/ihdtv/ihdtv.c @@ -62,105 +62,105 @@ void init_reciever(void); - int -ihdtv_init_rx_session(ihdtv_connection *connection, const char* address_1, const char* address_2, unsigned int port1, unsigned int port2, long mtu) +ihdtv_init_rx_session(ihdtv_connection * connection, const char *address_1, + const char *address_2, unsigned int port1, + unsigned int port2, long mtu) { - connection->rx_port_1 = port1; - connection->rx_port_2 = port2; - connection->tx_port = 0; - connection->tx_socket_1 = 0; - connection->tx_socket_2 = 0; + connection->rx_port_1 = port1; + connection->rx_port_2 = port2; + connection->tx_port = 0; + connection->tx_socket_1 = 0; + connection->tx_socket_2 = 0; - connection->check_peer_ip = 0; + connection->check_peer_ip = 0; - if( (connection->rx_socket_1 = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) - { - fprintf(stderr, "Error creating first recieving socket"); - exit(1); - } + if ((connection->rx_socket_1 = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + fprintf(stderr, "Error creating first recieving socket"); + exit(1); + } - if( (connection->rx_socket_2 = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) - { - fprintf(stderr, "Error creating second recieving socket"); - exit(1); - } + if ((connection->rx_socket_2 = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + fprintf(stderr, "Error creating second recieving socket"); + exit(1); + } - if( address_1 != NULL) // we want to accept packets only from certain address so we connect() the socket - { - struct hostent *target = gethostbyname(address_1); // FIXME: should free? - if(target == NULL) - { - printf("Unknown target 1"); - exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection - } + if (address_1 != NULL) // we want to accept packets only from certain address so we connect() the socket + { + struct hostent *target = gethostbyname(address_1); // FIXME: should free? + if (target == NULL) { + printf("Unknown target 1"); + exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection + } - connection->peer_address_1 = *(struct in_addr *) target->h_addr; - - connection->check_peer_ip = 1; - } + connection->peer_address_1 = *(struct in_addr *)target->h_addr; - if( address_2 != NULL) // we want to accept packets only from certain address so we connect() the socket - { - struct hostent *target = gethostbyname(address_2); // FIXME: should free? - if(target == NULL) - { - printf("Unknown target 2"); - exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection - } + connection->check_peer_ip = 1; + } - connection->peer_address_2 = *(struct in_addr *) target->h_addr; + if (address_2 != NULL) // we want to accept packets only from certain address so we connect() the socket + { + struct hostent *target = gethostbyname(address_2); // FIXME: should free? + if (target == NULL) { + printf("Unknown target 2"); + exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection + } - connection->check_peer_ip = 1; - } + connection->peer_address_2 = *(struct in_addr *)target->h_addr; + connection->check_peer_ip = 1; + } - struct sockaddr_in rx_address; - rx_address.sin_family = AF_INET; - rx_address.sin_addr.s_addr = htonl(INADDR_ANY); - rx_address.sin_port = htons(connection->rx_port_1); - memset(rx_address.sin_zero, '\0', sizeof(rx_address.sin_zero)); - if( bind(connection->rx_socket_1, (struct sockaddr *) &rx_address, sizeof(rx_address)) == -1) - { - fprintf(stderr, "Error binding reciever to the first socket"); - exit(1); - } + struct sockaddr_in rx_address; + rx_address.sin_family = AF_INET; + rx_address.sin_addr.s_addr = htonl(INADDR_ANY); + rx_address.sin_port = htons(connection->rx_port_1); + memset(rx_address.sin_zero, '\0', sizeof(rx_address.sin_zero)); + if (bind + (connection->rx_socket_1, (struct sockaddr *)&rx_address, + sizeof(rx_address)) == -1) { + fprintf(stderr, "Error binding reciever to the first socket"); + exit(1); + } - rx_address.sin_family = AF_INET; - rx_address.sin_addr.s_addr = htonl(INADDR_ANY); - rx_address.sin_port = htons(connection->rx_port_2); - memset(rx_address.sin_zero, '\0', sizeof(rx_address.sin_zero)); - if( bind(connection->rx_socket_2, (struct sockaddr *) &rx_address, sizeof(rx_address)) == -1) - { - fprintf(stderr, "Error binding reciever to the second socket"); - exit(1); - } + rx_address.sin_family = AF_INET; + rx_address.sin_addr.s_addr = htonl(INADDR_ANY); + rx_address.sin_port = htons(connection->rx_port_2); + memset(rx_address.sin_zero, '\0', sizeof(rx_address.sin_zero)); + if (bind + (connection->rx_socket_2, (struct sockaddr *)&rx_address, + sizeof(rx_address)) == -1) { + fprintf(stderr, "Error binding reciever to the second socket"); + exit(1); + } + connection->video_data_per_packet = mtu; + if (mtu == 0) { + fprintf(stderr, "Error: mtu must be > 0"); + return -1; + } - connection->video_data_per_packet = mtu; - if(mtu == 0){ - fprintf(stderr, "Error: mtu must be > 0"); - return -1; - } + connection->bytes_per_frame = 5529600; + connection->bytes_per_half_frame = connection->bytes_per_frame / 2; - connection->bytes_per_frame = 5529600; - connection->bytes_per_half_frame = connection->bytes_per_frame / 2; + // we will count the number of packets/frame and the size of the last packet + connection->video_packets_per_half_frame = + connection->bytes_per_half_frame / + connection->video_data_per_packet; + if (connection->bytes_per_half_frame % connection->video_data_per_packet) // we have the final packet of each half of the frame smaller than video_data_per_packet + { + connection->video_data_per_last_packet = + connection->bytes_per_half_frame % + connection->video_data_per_packet; + connection->video_packets_per_half_frame++; + } else { + connection->video_data_per_last_packet = + connection->video_data_per_packet; + } - - // we will count the number of packets/frame and the size of the last packet - connection->video_packets_per_half_frame = connection->bytes_per_half_frame / connection->video_data_per_packet; - if(connection->bytes_per_half_frame % connection->video_data_per_packet) // we have the final packet of each half of the frame smaller than video_data_per_packet - { - connection->video_data_per_last_packet = connection->bytes_per_half_frame % connection->video_data_per_packet; - connection->video_packets_per_half_frame++; - } - else - { - connection->video_data_per_last_packet = connection->video_data_per_packet; - } - - connection->video_packets_per_frame = 2 * connection->video_packets_per_half_frame; -// fprintf(stderr,"Video_packets_per_frame=%u, video_data_per_packet=%d, video_data_per_last_packet %d\n", connection->video_packets_per_frame, (int)connection->video_data_per_packet, connection->video_data_per_last_packet); + connection->video_packets_per_frame = + 2 * connection->video_packets_per_half_frame; +// fprintf(stderr,"Video_packets_per_frame=%u, video_data_per_packet=%d, video_data_per_last_packet %d\n", connection->video_packets_per_frame, (int)connection->video_data_per_packet, connection->video_data_per_last_packet); /* connection->video_packets_per_frame = 682; @@ -168,327 +168,343 @@ ihdtv_init_rx_session(ihdtv_connection *connection, const char* address_1, const connection->bytes_per_half_frame = connection->bytes_per_frame / 2; */ - connection->current_frame = 0; - connection->pending_packet = 0; + connection->current_frame = 0; + connection->pending_packet = 0; - // set sockets to nonblocking(will utilitize 100% of a CPU) - if(fcntl(connection->rx_socket_1, F_SETFL, O_NONBLOCK) < 0) - { - fprintf(stderr, "Error setting rx_socket_1 as nonblocking\n"); - exit(1); - } + // set sockets to nonblocking(will utilitize 100% of a CPU) + if (fcntl(connection->rx_socket_1, F_SETFL, O_NONBLOCK) < 0) { + fprintf(stderr, "Error setting rx_socket_1 as nonblocking\n"); + exit(1); + } - if(fcntl(connection->rx_socket_2, F_SETFL, O_NONBLOCK) < 0) - { - fprintf(stderr, "Error setting rx_socket_2 as nonblocking\n"); - exit(1); - } - - return 0; + if (fcntl(connection->rx_socket_2, F_SETFL, O_NONBLOCK) < 0) { + fprintf(stderr, "Error setting rx_socket_2 as nonblocking\n"); + exit(1); + } + + return 0; } int -ihdtv_init_tx_session(ihdtv_connection *connection, const char* address_1, const char *address_2, long mtu) +ihdtv_init_tx_session(ihdtv_connection * connection, const char *address_1, + const char *address_2, long mtu) { - connection->rx_port_1 = 0; - connection->rx_port_2 = 0; - connection->tx_port = 0; // not used so far - connection->tx_socket_1 = 0; - connection->tx_socket_2 = 0; + connection->rx_port_1 = 0; + connection->rx_port_2 = 0; + connection->tx_port = 0; // not used so far + connection->tx_socket_1 = 0; + connection->tx_socket_2 = 0; - struct hostent *target_1 = gethostbyname(address_1); - if(target_1 == NULL) - { - printf("Unknown target 1"); - exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection - } - - struct hostent *target_2 = gethostbyname(address_2); - if(target_2 == NULL) - { - printf("Unknown target 2"); - exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection - } + struct hostent *target_1 = gethostbyname(address_1); + if (target_1 == NULL) { + printf("Unknown target 1"); + exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection + } - if( (connection->tx_socket_1 = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) - { - fprintf(stderr, "Error creating sending socket 1"); - exit(1); - } - if( (connection->tx_socket_2 = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) - { - fprintf(stderr, "Error creating sending socket 2"); - exit(1); - } + struct hostent *target_2 = gethostbyname(address_2); + if (target_2 == NULL) { + printf("Unknown target 2"); + exit(1); // FIXME: maybe should just return but it requires not returnin ihdtv_connection + } + if ((connection->tx_socket_1 = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + fprintf(stderr, "Error creating sending socket 1"); + exit(1); + } + if ((connection->tx_socket_2 = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + fprintf(stderr, "Error creating sending socket 2"); + exit(1); + } - connection->target_sockaddress_1.sin_family = AF_INET; - connection->target_sockaddress_1.sin_port = htons(3000); // FIXME: target port - connection->target_sockaddress_1.sin_addr = *((struct in_addr *) target_1->h_addr); - memset(connection->target_sockaddress_1.sin_zero, '\0', sizeof(connection->target_sockaddress_1.sin_zero)); - connection->target_sockaddress_2.sin_family = AF_INET; - connection->target_sockaddress_2.sin_port = htons(3001); // FIXME: target port - connection->target_sockaddress_2.sin_addr = *((struct in_addr *) target_2->h_addr); - memset(connection->target_sockaddress_2.sin_zero, '\0', sizeof(connection->target_sockaddress_2.sin_zero)); + connection->target_sockaddress_1.sin_family = AF_INET; + connection->target_sockaddress_1.sin_port = htons(3000); // FIXME: target port + connection->target_sockaddress_1.sin_addr = + *((struct in_addr *)target_1->h_addr); + memset(connection->target_sockaddress_1.sin_zero, '\0', + sizeof(connection->target_sockaddress_1.sin_zero)); + connection->target_sockaddress_2.sin_family = AF_INET; + connection->target_sockaddress_2.sin_port = htons(3001); // FIXME: target port + connection->target_sockaddress_2.sin_addr = + *((struct in_addr *)target_2->h_addr); + memset(connection->target_sockaddress_2.sin_zero, '\0', + sizeof(connection->target_sockaddress_2.sin_zero)); - connection->video_data_per_packet = mtu; - if(mtu == 0){ - fprintf(stderr, "Error: mtu must be > 0"); - return -1; - } + connection->video_data_per_packet = mtu; + if (mtu == 0) { + fprintf(stderr, "Error: mtu must be > 0"); + return -1; + } - connection->bytes_per_frame = 5529600; - connection->bytes_per_half_frame = connection->bytes_per_frame / 2; + connection->bytes_per_frame = 5529600; + connection->bytes_per_half_frame = connection->bytes_per_frame / 2; + // we will count the number of packets/frame and the size of the last packet + connection->video_packets_per_half_frame = + connection->bytes_per_half_frame / + connection->video_data_per_packet; + if (connection->bytes_per_half_frame % connection->video_data_per_packet) // we have the final packet of each half of the frame smaller than video_data_per_packet + { + connection->video_data_per_last_packet = + connection->bytes_per_half_frame % + connection->video_data_per_packet; + connection->video_packets_per_half_frame++; + } else { + connection->video_data_per_last_packet = + connection->video_data_per_packet; + } - // we will count the number of packets/frame and the size of the last packet - connection->video_packets_per_half_frame = connection->bytes_per_half_frame / connection->video_data_per_packet; - if(connection->bytes_per_half_frame % connection->video_data_per_packet) // we have the final packet of each half of the frame smaller than video_data_per_packet - { - connection->video_data_per_last_packet = connection->bytes_per_half_frame % connection->video_data_per_packet; - connection->video_packets_per_half_frame++; - } - else - { - connection->video_data_per_last_packet = connection->video_data_per_packet; - } - - connection->video_packets_per_frame = 2 * connection->video_packets_per_half_frame; + connection->video_packets_per_frame = + 2 * connection->video_packets_per_half_frame; -// fprintf(stderr,"Video_packets_per_frame=%u, video_data_per_packet=%d, video_data_per_last_packet %d\n", connection->video_packets_per_frame, (int)connection->video_data_per_packet, connection->video_data_per_last_packet); +// fprintf(stderr,"Video_packets_per_frame=%u, video_data_per_packet=%d, video_data_per_last_packet %d\n", connection->video_packets_per_frame, (int)connection->video_data_per_packet, connection->video_data_per_last_packet); + connection->current_frame = 0; + connection->pending_packet = 0; - connection->current_frame = 0; - connection->pending_packet = 0; - - return 0; + return 0; } int -ihdtv_send(ihdtv_connection *connection, struct video_frame *tx_frame, unsigned long buffer_length) +ihdtv_send(ihdtv_connection * connection, struct video_frame *tx_frame, + unsigned long buffer_length) { - struct msghdr msg1, msg2; + struct msghdr msg1, msg2; - msg1.msg_name = &connection->target_sockaddress_1; - msg2.msg_name = &connection->target_sockaddress_2; + msg1.msg_name = &connection->target_sockaddress_1; + msg2.msg_name = &connection->target_sockaddress_2; - msg1.msg_namelen = sizeof(connection->target_sockaddress_1); - msg2.msg_namelen = sizeof(connection->target_sockaddress_2); + msg1.msg_namelen = sizeof(connection->target_sockaddress_1); + msg2.msg_namelen = sizeof(connection->target_sockaddress_2); - // header + data - struct iovec vector1[2]; - struct iovec vector2[2]; + // header + data + struct iovec vector1[2]; + struct iovec vector2[2]; - msg1.msg_iov = &vector1; - msg2.msg_iov = &vector2; + msg1.msg_iov = &vector1; + msg2.msg_iov = &vector2; - msg1.msg_iovlen = 2; - msg2.msg_iovlen = 2; + msg1.msg_iovlen = 2; + msg2.msg_iovlen = 2; - msg1.msg_control = 0; - msg2.msg_control = 0; - msg1.msg_controllen = 0; - msg2.msg_controllen = 0; - msg1.msg_flags = 0; - msg2.msg_flags = 0; - - // only used for headers - ihdtv_packet packet_1; - ihdtv_packet packet_2; + msg1.msg_control = 0; + msg2.msg_control = 0; + msg1.msg_controllen = 0; + msg2.msg_controllen = 0; + msg1.msg_flags = 0; + msg2.msg_flags = 0; - packet_1.frame_number = connection->current_frame; - packet_2.frame_number = connection->current_frame; + // only used for headers + ihdtv_packet packet_1; + ihdtv_packet packet_2; - packet_1.stream_id = 0; // top half - packet_2.stream_id = 1; // bottom half + packet_1.frame_number = connection->current_frame; + packet_2.frame_number = connection->current_frame; - unsigned int offset_absolut_1 = 0; // offset to buffer ( in bytes ) - unsigned int offset_absolut_2 = connection->bytes_per_half_frame; + packet_1.stream_id = 0; // top half + packet_2.stream_id = 1; // bottom half - unsigned int packet_relative_offset=0; // this is the number we put into buffer + unsigned int offset_absolut_1 = 0; // offset to buffer ( in bytes ) + unsigned int offset_absolut_2 = connection->bytes_per_half_frame; - unsigned int i; - for(i = 0; i < connection->video_packets_per_half_frame - 1;i++) - { - packet_1.offset = packet_relative_offset; - vector1[0].iov_base = &packet_1; - vector1[0].iov_len = 16; // we only use the header - vector1[1].iov_base = (tx_frame->data) + offset_absolut_1; - vector1[1].iov_len = connection->video_data_per_packet; - if(sendmsg(connection->tx_socket_1, &msg1, 0) == -1) - { - perror("Sending data to address 1"); - exit(1); - } + unsigned int packet_relative_offset = 0; // this is the number we put into buffer + unsigned int i; + for (i = 0; i < connection->video_packets_per_half_frame - 1; i++) { + packet_1.offset = packet_relative_offset; + vector1[0].iov_base = &packet_1; + vector1[0].iov_len = 16; // we only use the header + vector1[1].iov_base = (tx_frame->data) + offset_absolut_1; + vector1[1].iov_len = connection->video_data_per_packet; + if (sendmsg(connection->tx_socket_1, &msg1, 0) == -1) { + perror("Sending data to address 1"); + exit(1); + } - packet_2.offset = packet_relative_offset; - vector2[0].iov_base = &packet_2; - vector2[0].iov_len = 16; // we only use the header - vector2[1].iov_base = (tx_frame->data) + offset_absolut_2; - vector2[1].iov_len = connection->video_data_per_packet; - if(sendmsg(connection->tx_socket_2, &msg2, 0) == -1) - { - perror("Sending data to address 2"); - exit(1); - } + packet_2.offset = packet_relative_offset; + vector2[0].iov_base = &packet_2; + vector2[0].iov_len = 16; // we only use the header + vector2[1].iov_base = (tx_frame->data) + offset_absolut_2; + vector2[1].iov_len = connection->video_data_per_packet; + if (sendmsg(connection->tx_socket_2, &msg2, 0) == -1) { + perror("Sending data to address 2"); + exit(1); + } + ++packet_relative_offset; + offset_absolut_1 += connection->video_data_per_packet; + offset_absolut_2 += connection->video_data_per_packet; + } - ++packet_relative_offset; - offset_absolut_1 += connection->video_data_per_packet; - offset_absolut_2 += connection->video_data_per_packet; - } - - packet_1.offset = packet_relative_offset; - vector1[0].iov_base = &packet_1; - vector1[0].iov_len = 16; // we only use the header - vector1[1].iov_base = (tx_frame->data) + offset_absolut_1; - vector1[1].iov_len = connection->video_data_per_last_packet; - if(sendmsg(connection->tx_socket_1, &msg1, 0) == -1) - { - perror("Sending data to address 1"); - exit(1); - } + packet_1.offset = packet_relative_offset; + vector1[0].iov_base = &packet_1; + vector1[0].iov_len = 16; // we only use the header + vector1[1].iov_base = (tx_frame->data) + offset_absolut_1; + vector1[1].iov_len = connection->video_data_per_last_packet; + if (sendmsg(connection->tx_socket_1, &msg1, 0) == -1) { + perror("Sending data to address 1"); + exit(1); + } + packet_2.offset = packet_relative_offset; + vector2[0].iov_base = &packet_2; + vector2[0].iov_len = 16; // we only use the header + vector2[1].iov_base = (tx_frame->data) + offset_absolut_2; + vector2[1].iov_len = connection->video_data_per_last_packet; + if (sendmsg(connection->tx_socket_2, &msg2, 0) == -1) { + perror("Sending data to address 2"); + exit(1); + } - packet_2.offset = packet_relative_offset; - vector2[0].iov_base = &packet_2; - vector2[0].iov_len = 16; // we only use the header - vector2[1].iov_base = (tx_frame->data) + offset_absolut_2; - vector2[1].iov_len = connection->video_data_per_last_packet; - if(sendmsg(connection->tx_socket_2, &msg2, 0) == -1) - { - perror("Sending data to address 2"); - exit(1); - } - - ++(connection->current_frame); + ++(connection->current_frame); } -inline static int -packet_to_buffer(const ihdtv_connection *connection, char *buffer, const unsigned long buffer_length, const ihdtv_packet *packet, const int packet_length) // returns number of written packets (1 or 0) +inline static int packet_to_buffer(const ihdtv_connection * connection, char *buffer, const unsigned long buffer_length, const ihdtv_packet * packet, const int packet_length) // returns number of written packets (1 or 0) { - if( buffer_length < ( packet->offset * connection->video_data_per_packet + (packet_length - 16)) ) - return 0; - - if( packet->stream_id == 0) - { - memcpy(buffer + (packet->offset) * connection->video_data_per_packet, packet->data, packet_length - 16); - return 1; - } + if (buffer_length < + (packet->offset * connection->video_data_per_packet + + (packet_length - 16))) + return 0; - if( packet->stream_id == 1) - { - memcpy(buffer + (packet->offset) * connection->video_data_per_packet + connection->bytes_per_half_frame, packet->data, packet_length - 16); - return 1; - } + if (packet->stream_id == 0) { + memcpy(buffer + + (packet->offset) * connection->video_data_per_packet, + packet->data, packet_length - 16); + return 1; + } - return 0; + if (packet->stream_id == 1) { + memcpy(buffer + + (packet->offset) * connection->video_data_per_packet + + connection->bytes_per_half_frame, packet->data, + packet_length - 16); + return 1; + } + + return 0; } int -ihdtv_recieve(ihdtv_connection *connection, char *buffer, const unsigned long buffer_length) +ihdtv_recieve(ihdtv_connection * connection, char *buffer, + const unsigned long buffer_length) { - int packets_number = 0; + int packets_number = 0; - ihdtv_packet packet; - int num_bytes; - struct sockaddr_in sender_address; // where did the packets come from - socklen_t sender_address_length = sizeof(sender_address); + ihdtv_packet packet; + int num_bytes; + struct sockaddr_in sender_address; // where did the packets come from + socklen_t sender_address_length = sizeof(sender_address); - int dont_check_ip = !(connection->check_peer_ip); + int dont_check_ip = !(connection->check_peer_ip); - if(buffer == NULL) - { - fprintf(stderr, "iHDTV reciever: buffer is empty, not recieving.\n"); - return -1; - } + if (buffer == NULL) { + fprintf(stderr, + "iHDTV reciever: buffer is empty, not recieving.\n"); + return -1; + } +// memset(buffer, 0, buffer_length); // make holes in frame more visible -- your computer might not be fast enough for this, if you experience performance problems, try to comment this out -// memset(buffer, 0, buffer_length); // make holes in frame more visible -- your computer might not be fast enough for this, if you experience performance problems, try to comment this out + // if we have some data from previous session, we use it + if (connection->pending_packet) { + packet_to_buffer(connection, buffer, buffer_length, + &(connection->ppacket), + connection->ppacket_size); +// printf("processing pending packet %ld\n", connection->ppacket.frame_number); // FIXME: delete this - // if we have some data from previous session, we use it - if(connection->pending_packet) - { - packet_to_buffer(connection, buffer, buffer_length, &(connection->ppacket), connection->ppacket_size); -// printf("processing pending packet %ld\n", connection->ppacket.frame_number); // FIXME: delete this + connection->pending_packet = 0; + ++packets_number; + } - connection->pending_packet = 0; - ++packets_number; - } + while (1) { + if ((num_bytes = + recvfrom(connection->rx_socket_1, &packet, sizeof(packet), + 0, (struct sockaddr *)&sender_address, + &sender_address_length)) > -1) { + if ((dont_check_ip) + || (connection->peer_address_1.s_addr == + sender_address.sin_addr.s_addr) + || (connection->peer_address_2.s_addr == + sender_address.sin_addr.s_addr)) { + if (packet.stream_id == 0 || packet.stream_id == 1) { // it is strange, but ihdtv seems to be sending video and audio with different frame numbers in some cases, so we only work with video here + if ((connection->current_frame < packet.frame_number) || (packet.frame_number + 10 < connection->current_frame)) // we just recieved frame we didn't expect + { +// printf("current frame: %llu (packets: %u) incoming frame: %llu\n", connection->current_frame, packets_number, packet.frame_number); + connection->current_frame = + packet.frame_number; + connection->pending_packet++; + connection->ppacket = packet; + connection->ppacket_size = + num_bytes; - while(1) - { - if( (num_bytes = recvfrom(connection->rx_socket_1, &packet, sizeof(packet), 0, (struct sockaddr *)& sender_address, &sender_address_length)) > -1) - { - if( (dont_check_ip) || (connection->peer_address_1.s_addr == sender_address.sin_addr.s_addr) || (connection->peer_address_2.s_addr == sender_address.sin_addr.s_addr)) - { - if( packet.stream_id == 0 || packet.stream_id == 1){ // it is strange, but ihdtv seems to be sending video and audio with different frame numbers in some cases, so we only work with video here - if((connection->current_frame < packet.frame_number) || (packet.frame_number + 10 < connection->current_frame )) // we just recieved frame we didn't expect - { -// printf("current frame: %llu (packets: %u) incoming frame: %llu\n", connection->current_frame, packets_number, packet.frame_number); - connection->current_frame = packet.frame_number; - connection->pending_packet++; - connection->ppacket = packet; - connection->ppacket_size = num_bytes; + break; + } - break; - } + if (packet.frame_number == + connection->current_frame) + packets_number += + packet_to_buffer(connection, + buffer, + buffer_length, + &packet, + num_bytes); - if(packet.frame_number == connection->current_frame) - packets_number += packet_to_buffer(connection, buffer, buffer_length, &packet, num_bytes); + if (packets_number == connection->video_packets_per_frame) // we have all packets of a frame + { + connection->current_frame++; + break; + } + } + } - if(packets_number == connection->video_packets_per_frame) // we have all packets of a frame - { - connection->current_frame++; - break; - } - } - } + } else if (errno != EWOULDBLOCK) { + fprintf(stderr, "Error recieving packet\n"); + exit(1); + } - } - else - if(errno != EWOULDBLOCK) - { - fprintf(stderr, "Error recieving packet\n"); - exit(1); - } + if ((num_bytes = + recvfrom(connection->rx_socket_2, &packet, sizeof(packet), + 0, (struct sockaddr *)&sender_address, + &sender_address_length)) > -1) { + if ((dont_check_ip) + || (connection->peer_address_1.s_addr == + sender_address.sin_addr.s_addr) + || (connection->peer_address_2.s_addr == + sender_address.sin_addr.s_addr)) { + if (packet.stream_id == 0 || packet.stream_id == 1) { // it is strange, but ihdtv seems to be sending video and audio with different frame numbers in some cases, so we only work with video here + if ((connection->current_frame < packet.frame_number) || (packet.frame_number + 10 < connection->current_frame)) // we just recieved frame we didn't expect + { +// printf("current frame: %llu (packets: %u) incoming frame: %llu\n", connection->current_frame, packets_number, packet.frame_number); + connection->current_frame = + packet.frame_number; + connection->pending_packet++; + connection->ppacket = packet; + connection->ppacket_size = + num_bytes; - if( (num_bytes = recvfrom(connection->rx_socket_2, &packet, sizeof(packet), 0, (struct sockaddr *)& sender_address, &sender_address_length)) > -1) - { - if( (dont_check_ip) || (connection->peer_address_1.s_addr == sender_address.sin_addr.s_addr) || (connection->peer_address_2.s_addr == sender_address.sin_addr.s_addr)) - { - if( packet.stream_id == 0 || packet.stream_id == 1){ // it is strange, but ihdtv seems to be sending video and audio with different frame numbers in some cases, so we only work with video here - if((connection->current_frame < packet.frame_number) || (packet.frame_number + 10 < connection->current_frame)) // we just recieved frame we didn't expect - { -// printf("current frame: %llu (packets: %u) incoming frame: %llu\n", connection->current_frame, packets_number, packet.frame_number); - connection->current_frame = packet.frame_number; - connection->pending_packet++; - connection->ppacket = packet; - connection->ppacket_size = num_bytes; + break; + } + if (packet.frame_number == + connection->current_frame) + packets_number += + packet_to_buffer(connection, + buffer, + buffer_length, + &packet, + num_bytes); - break; - } - if(packet.frame_number == connection->current_frame) - packets_number += packet_to_buffer(connection, buffer, buffer_length, &packet, num_bytes); + if (packets_number == connection->video_packets_per_frame) // we have all packets of a frame + { + connection->current_frame++; + break; + } + } + } - if(packets_number == connection->video_packets_per_frame) // we have all packets of a frame - { - connection->current_frame++; - break; - } - } - } + } else if (errno != EWOULDBLOCK) { + fprintf(stderr, "Error recieving packet\n"); + exit(1); + } + } - } - else - if(errno != EWOULDBLOCK) - { - fprintf(stderr, "Error recieving packet\n"); - exit(1); - } - } - - - return 0; + return 0; } diff --git a/ultragrid/src/main.c b/ultragrid/src/main.c index 402078b9f..c6ff06aaf 100644 --- a/ultragrid/src/main.c +++ b/ultragrid/src/main.c @@ -84,763 +84,783 @@ #define EXIT_FAIL_NETWORK 5 #define EXIT_FAIL_TRANSMIT 6 - struct state_uv { - struct rtp *network_device; - struct rtp *audio_network_device; - struct vidcap *capture_device; - struct timeval start_time, curr_time; - struct pdb *participants; - struct pdb *audio_participants; - uint32_t ts; - int fps; - struct video_tx *tx; - struct display *display_device; - struct video_compress *compression; - const char *requested_display; - const char *requested_capture; - int requested_compression; - int dxt_display; - unsigned requested_mtu; + struct rtp *network_device; + struct rtp *audio_network_device; + struct vidcap *capture_device; + struct timeval start_time, curr_time; + struct pdb *participants; + struct pdb *audio_participants; + uint32_t ts; + int fps; + struct video_tx *tx; + struct display *display_device; + struct video_compress *compression; + const char *requested_display; + const char *requested_capture; + int requested_compression; + int dxt_display; + unsigned requested_mtu; - int use_ihdtv_protocol; + int use_ihdtv_protocol; - int audio_capture_device; - int audio_playback_device; + int audio_capture_device; + int audio_playback_device; }; -long packet_rate = 13600; -int should_exit = FALSE; -uint32_t RTT = 0; /* this is computed by handle_rr in rtp_callback */ +long packet_rate = 13600; +int should_exit = FALSE; +uint32_t RTT = 0; /* this is computed by handle_rr in rtp_callback */ struct video_frame *frame_buffer = NULL; -uint32_t hd_color_spc = 0; -uint32_t bitdepth = 8; -uint32_t progressive = 0; +uint32_t hd_color_spc = 0; +uint32_t bitdepth = 8; +uint32_t progressive = 0; long frame_begin[2]; #ifndef WIN32 -static void -signal_handler(int signal) +static void signal_handler(int signal) { - debug_msg("Caught signal %d\n", signal); - should_exit = TRUE; - return; + debug_msg("Caught signal %d\n", signal); + should_exit = TRUE; + return; } -#endif /* WIN32 */ +#endif /* WIN32 */ -static void -usage(void) +static void usage(void) { - /* TODO -c -p -b are deprecated options */ - printf("Usage: uv [-d ] [-t ] [-g ] [-m ] [-f ] [-c] [-p] [-i] [-b <8|10>] address\n\n"); - printf("\t-d \tselect display device, use -d help to get\n"); - printf("\t \tlist of devices availabe\n"); - printf("\t-t \tselect capture device, use -t help to get\n"); - printf("\t \tlist of devices availabe\n"); - printf("\t-g \tconfigure capture/display device,\n"); - printf("\t \tuse -g help with a device to get info about\n"); - printf("\t \tsupported capture/display modes\n"); - printf("\t-i \tiHDTV compatibility mode\n"); + /* TODO -c -p -b are deprecated options */ + printf + ("Usage: uv [-d ] [-t ] [-g ] [-m ] [-f ] [-c] [-p] [-i] [-b <8|10>] address\n\n"); + printf + ("\t-d \tselect display device, use -d help to get\n"); + printf("\t \tlist of devices availabe\n"); + printf + ("\t-t \tselect capture device, use -t help to get\n"); + printf("\t \tlist of devices availabe\n"); + printf("\t-g \tconfigure capture/display device,\n"); + printf + ("\t \tuse -g help with a device to get info about\n"); + printf("\t \tsupported capture/display modes\n"); + printf("\t-i \tiHDTV compatibility mode\n"); } -void -list_video_display_devices() +void list_video_display_devices() { - int i; - display_type_t *dt; + int i; + display_type_t *dt; - printf("Available display devices:\n"); - display_init_devices(); - for (i = 0; i < display_get_device_count(); i++) { - dt = display_get_device_details(i); - printf("\t%s\n", dt->name); - } - display_free_devices(); + printf("Available display devices:\n"); + display_init_devices(); + for (i = 0; i < display_get_device_count(); i++) { + dt = display_get_device_details(i); + printf("\t%s\n", dt->name); + } + display_free_devices(); } -static struct display * -initialize_video_display(const char *requested_display, char *fmt) +static struct display *initialize_video_display(const char *requested_display, + char *fmt) { - struct display *d; - display_type_t *dt; - display_id_t id = display_get_null_device_id(); - int i; + struct display *d; + display_type_t *dt; + display_id_t id = display_get_null_device_id(); + int i; - if (display_init_devices() != 0) { - printf("Unable to initialise devices\n"); - abort(); - } else { - debug_msg("Found %d display devices\n", display_get_device_count()); - } - for (i = 0; i < display_get_device_count(); i++) { - dt = display_get_device_details(i); - if (strcmp(requested_display, dt->name) == 0) { - id = dt->id; - debug_msg("Found device\n"); - } else { - debug_msg("Device %s does not match %s\n", dt->name, requested_display); - } - } - display_free_devices(); + if (display_init_devices() != 0) { + printf("Unable to initialise devices\n"); + abort(); + } else { + debug_msg("Found %d display devices\n", + display_get_device_count()); + } + for (i = 0; i < display_get_device_count(); i++) { + dt = display_get_device_details(i); + if (strcmp(requested_display, dt->name) == 0) { + id = dt->id; + debug_msg("Found device\n"); + } else { + debug_msg("Device %s does not match %s\n", dt->name, + requested_display); + } + } + display_free_devices(); - d = display_init(id, fmt); - if (d != NULL) { - frame_buffer = display_get_frame(d); - } - return d; + d = display_init(id, fmt); + if (d != NULL) { + frame_buffer = display_get_frame(d); + } + return d; } -void -list_video_capture_devices() +void list_video_capture_devices() { - int i; - struct vidcap_type *vt; + int i; + struct vidcap_type *vt; - printf("Available capture devices:\n"); - vidcap_init_devices(); - for (i = 0; i < vidcap_get_device_count(); i++) { - vt = vidcap_get_device_details(i); - printf("\t%s\n", vt->name); - } - vidcap_free_devices(); + printf("Available capture devices:\n"); + vidcap_init_devices(); + for (i = 0; i < vidcap_get_device_count(); i++) { + vt = vidcap_get_device_details(i); + printf("\t%s\n", vt->name); + } + vidcap_free_devices(); } -static struct vidcap * -initialize_video_capture(const char *requested_capture, char *fmt) +static struct vidcap *initialize_video_capture(const char *requested_capture, + char *fmt) { - struct vidcap_type *vt; - vidcap_id_t id = vidcap_get_null_device_id(); - int i; + struct vidcap_type *vt; + vidcap_id_t id = vidcap_get_null_device_id(); + int i; - vidcap_init_devices(); - for (i = 0; i < vidcap_get_device_count(); i++) { - vt = vidcap_get_device_details(i); - if (strcmp(vt->name, requested_capture) == 0) { - id = vt->id; - } - } - vidcap_free_devices(); + vidcap_init_devices(); + for (i = 0; i < vidcap_get_device_count(); i++) { + vt = vidcap_get_device_details(i); + if (strcmp(vt->name, requested_capture) == 0) { + id = vt->id; + } + } + vidcap_free_devices(); - return vidcap_init(id, fmt); + return vidcap_init(id, fmt); } -static struct rtp * -initialize_network(char *addr, struct pdb *participants) +static struct rtp *initialize_network(char *addr, struct pdb *participants) { - struct rtp *r; - double rtcp_bw = 5 * 1024 * 1024; /* FIXME */ - - r = rtp_init(addr, 5004, 5004, 255, rtcp_bw, FALSE, rtp_recv_callback, (void *) participants); - if (r != NULL) { - pdb_add(participants, rtp_my_ssrc(r)); - rtp_set_option(r, RTP_OPT_WEAK_VALIDATION, TRUE); - rtp_set_sdes(r, rtp_my_ssrc(r), RTCP_SDES_TOOL, ULTRAGRID_VERSION, strlen(ULTRAGRID_VERSION)); - } - return r; + struct rtp *r; + double rtcp_bw = 5 * 1024 * 1024; /* FIXME */ + + r = rtp_init(addr, 5004, 5004, 255, rtcp_bw, FALSE, rtp_recv_callback, + (void *)participants); + if (r != NULL) { + pdb_add(participants, rtp_my_ssrc(r)); + rtp_set_option(r, RTP_OPT_WEAK_VALIDATION, TRUE); + rtp_set_sdes(r, rtp_my_ssrc(r), RTCP_SDES_TOOL, + ULTRAGRID_VERSION, strlen(ULTRAGRID_VERSION)); + } + return r; } -static struct video_tx * -initialize_transmit(unsigned requested_mtu) +static struct video_tx *initialize_transmit(unsigned requested_mtu) { - /* Currently this is trivial. It'll get more complex once we */ - /* have multiple codecs and/or error correction. */ - return tx_init(requested_mtu); + /* Currently this is trivial. It'll get more complex once we */ + /* have multiple codecs and/or error correction. */ + return tx_init(requested_mtu); } -static void * -ihdtv_reciever_thread(void *arg) +static void *ihdtv_reciever_thread(void *arg) { - ihdtv_connection *connection = (ihdtv_connection*) ((void**)arg)[0]; - struct display *display_device = (struct display*) ((void**)arg)[1]; + ihdtv_connection *connection = (ihdtv_connection *) ((void **)arg)[0]; + struct display *display_device = (struct display *)((void **)arg)[1]; - while(!should_exit) - { - if(ihdtv_recieve(connection, frame_buffer->data, hd_size_x * hd_size_y * 3)) - return 0; // we've got some error. probably empty buffer - display_put_frame(display_device, frame_buffer->data); - frame_buffer = display_get_frame(display_device); - } - return 0; + while (!should_exit) { + if (ihdtv_recieve + (connection, frame_buffer->data, hd_size_x * hd_size_y * 3)) + return 0; // we've got some error. probably empty buffer + display_put_frame(display_device, frame_buffer->data); + frame_buffer = display_get_frame(display_device); + } + return 0; } - -static void * -ihdtv_sender_thread(void *arg) +static void *ihdtv_sender_thread(void *arg) { - ihdtv_connection *connection = (ihdtv_connection*) ((void**)arg)[0]; - struct vidcap *capture_device = (struct vidcap*) ((void**)arg)[1]; - struct video_frame *tx_frame; + ihdtv_connection *connection = (ihdtv_connection *) ((void **)arg)[0]; + struct vidcap *capture_device = (struct vidcap *)((void **)arg)[1]; + struct video_frame *tx_frame; - while(!should_exit){ - if((tx_frame = vidcap_grab(capture_device)) != NULL) - { - ihdtv_send(connection, tx_frame, 9000000); // FIXME: fix the use of frame size!! - free(tx_frame); - } - else - { - fprintf(stderr,"Error recieving frame from capture device\n"); - return 0; - } - } + while (!should_exit) { + if ((tx_frame = vidcap_grab(capture_device)) != NULL) { + ihdtv_send(connection, tx_frame, 9000000); // FIXME: fix the use of frame size!! + free(tx_frame); + } else { + fprintf(stderr, + "Error recieving frame from capture device\n"); + return 0; + } + } - return 0; + return 0; } #ifdef HAVE_AUDIO -static struct rtp * -initialize_audio_network(char *addr, struct pdb *participants) // GiX +static struct rtp *initialize_audio_network(char *addr, struct pdb *participants) // GiX { - struct rtp *r; - double rtcp_bw = 1024*512; // FIXME: something about 5% for rtcp is said in rfc + struct rtp *r; + double rtcp_bw = 1024 * 512; // FIXME: something about 5% for rtcp is said in rfc - r = rtp_init(addr, 5006, 5006, 255, rtcp_bw, FALSE, rtp_recv_callback, (void *) participants); - if(r != NULL) - { - pdb_add(participants, rtp_my_ssrc(r)); - rtp_set_option(r, RTP_OPT_WEAK_VALIDATION, TRUE); - rtp_set_sdes(r, rtp_my_ssrc(r), RTCP_SDES_TOOL, ULTRAGRID_VERSION, strlen(ULTRAGRID_VERSION)); - } + r = rtp_init(addr, 5006, 5006, 255, rtcp_bw, FALSE, rtp_recv_callback, + (void *)participants); + if (r != NULL) { + pdb_add(participants, rtp_my_ssrc(r)); + rtp_set_option(r, RTP_OPT_WEAK_VALIDATION, TRUE); + rtp_set_sdes(r, rtp_my_ssrc(r), RTCP_SDES_TOOL, + ULTRAGRID_VERSION, strlen(ULTRAGRID_VERSION)); + } - return r; + return r; } -static void * -audio_thread(void *arg) +static void *audio_thread(void *arg) { - struct state_uv *uv = arg; - audio_init(uv->audio_playback_device, uv->audio_capture_device); + struct state_uv *uv = arg; + audio_init(uv->audio_playback_device, uv->audio_capture_device); - // we act as a receiver - if(uv->audio_playback_device != -2) - { - audio_frame_buffer buffer; - int size_of_frame_buffer = 5; - init_audio_frame_buffer(&buffer, size_of_frame_buffer); -// int buffer_underrun = 1; // so far we only use buffer at the beginning + // we act as a receiver + if (uv->audio_playback_device != -2) { + audio_frame_buffer buffer; + int size_of_frame_buffer = 5; + init_audio_frame_buffer(&buffer, size_of_frame_buffer); +// int buffer_underrun = 1; // so far we only use buffer at the beginning - // rtp variables - struct timeval timeout, curr_time; - uint32_t ts; - struct pdb_e *cp; + // rtp variables + struct timeval timeout, curr_time; + uint32_t ts; + struct pdb_e *cp; + audio_start_stream(); + while (!should_exit) { + timeout.tv_sec = 0; + timeout.tv_usec = + 999999 / ((48000 / audio_samples_per_frame) * 2); + gettimeofday(&curr_time, NULL); + ts = tv_diff(curr_time, uv->start_time) * 90000; // What is this? + rtp_update(uv->audio_network_device, curr_time); // this is just some internal rtp housekeeping...nothing to worry about + rtp_send_ctrl(uv->audio_network_device, ts, 0, curr_time); // strange.. - audio_start_stream(); - while(!should_exit) - { - timeout.tv_sec = 0; - timeout.tv_usec = 999999/((48000/audio_samples_per_frame)*2); - gettimeofday(&curr_time, NULL); - ts = tv_diff(curr_time, uv->start_time) * 90000; // What is this? - rtp_update(uv->audio_network_device, curr_time); // this is just some internal rtp housekeeping...nothing to worry about - rtp_send_ctrl(uv->audio_network_device, ts, 0, curr_time); // strange.. + // initially we wait to fill the buffer -- probably should be completely deleted.. + /* + if(buffer_underrun) + { + while(!audio_buffer_full(&buffer)) + { + gettimeofday(&curr_time, NULL); + ts = tv_diff(curr_time, uv->start_time) * 90000; + rtp_update(uv->audio_network_device, curr_time); + rtp_send_ctrl(uv->audio_network_device, ts, 0, curr_time); - // initially we wait to fill the buffer -- probably should be completely deleted.. - /* - if(buffer_underrun) - { - while(!audio_buffer_full(&buffer)) - { - gettimeofday(&curr_time, NULL); - ts = tv_diff(curr_time, uv->start_time) * 90000; - rtp_update(uv->audio_network_device, curr_time); - rtp_send_ctrl(uv->audio_network_device, ts, 0, curr_time); + timeout.tv_sec = 0; + timeout.tv_usec = 999999/((48000/audio_samples_per_frame)*2); + rtp_recv(uv->audio_network_device, &timeout, ts); + cp = pdb_iter_init(uv->audio_participants); - timeout.tv_sec = 0; - timeout.tv_usec = 999999/((48000/audio_samples_per_frame)*2); - rtp_recv(uv->audio_network_device, &timeout, ts); - cp = pdb_iter_init(uv->audio_participants); + while((cp != NULL) && (!audio_buffer_full(&buffer))) + { + audio_frame *frame = audio_buffer_get_empty_frame(&buffer); + if(audio_pbuf_decode(cp->playout_buffer, curr_time, frame)) + audio_buffer_mark_last_frame_full(&buffer); + pbuf_remove(cp->playout_buffer, curr_time); + cp = pdb_iter_next(uv->audio_participants); + } - while((cp != NULL) && (!audio_buffer_full(&buffer))) - { - audio_frame *frame = audio_buffer_get_empty_frame(&buffer); - if(audio_pbuf_decode(cp->playout_buffer, curr_time, frame)) - audio_buffer_mark_last_frame_full(&buffer); - pbuf_remove(cp->playout_buffer, curr_time); - cp = pdb_iter_next(uv->audio_participants); - } + pdb_iter_done(uv->audio_participants); + } - pdb_iter_done(uv->audio_participants); - } + buffer_underrun = 0; + audio_start_stream(); + } + */ - buffer_underrun = 0; - audio_start_stream(); - } - */ + rtp_recv(uv->audio_network_device, &timeout, ts); + cp = pdb_iter_init(uv->audio_participants); - rtp_recv(uv->audio_network_device, &timeout, ts); - cp = pdb_iter_init(uv->audio_participants); + while ((cp != NULL) && (!audio_buffer_full(&buffer))) { + audio_frame *frame = + audio_buffer_get_empty_frame(&buffer); + if (audio_pbuf_decode + (cp->playout_buffer, curr_time, frame)) + audio_buffer_mark_last_frame_full + (&buffer); - while((cp != NULL) && (!audio_buffer_full(&buffer))) - { - audio_frame *frame = audio_buffer_get_empty_frame(&buffer); - if(audio_pbuf_decode(cp->playout_buffer, curr_time, frame)) - audio_buffer_mark_last_frame_full(&buffer); + pbuf_remove(cp->playout_buffer, curr_time); + cp = pdb_iter_next(uv->audio_participants); + } + pdb_iter_done(uv->audio_participants); - pbuf_remove(cp->playout_buffer, curr_time); - cp = pdb_iter_next(uv->audio_participants); - } - pdb_iter_done(uv->audio_participants); + while (audio_ready_to_write() >= + audio_samples_per_frame) { + audio_frame *frame = + audio_buffer_get_full_frame(&buffer); - while(audio_ready_to_write() >= audio_samples_per_frame) - { - audio_frame *frame = audio_buffer_get_full_frame(&buffer); + if (frame != NULL) + audio_write(frame); - if(frame != NULL) - audio_write(frame); + else + break; // audio buffer is empty...nead to read some data + } + } + free_audio_frame_buffer(&buffer); + } - else - break; // audio buffer is empty...nead to read some data - } - } - free_audio_frame_buffer(&buffer); - } + else // we act as a sender + if (uv->audio_capture_device != -2) { + audio_frame buffer; + init_audio_frame(&buffer, audio_samples_per_frame); + audio_start_stream(); + while (!should_exit) { + audio_read(&buffer); + audio_tx_send(uv->audio_network_device, &buffer); + } + free_audio_frame(&buffer); + } - else // we act as a sender - if(uv->audio_capture_device != -2) - { - audio_frame buffer; - init_audio_frame(&buffer, audio_samples_per_frame); - audio_start_stream(); - while(!should_exit) - { - audio_read(&buffer); - audio_tx_send(uv->audio_network_device, &buffer); - } - free_audio_frame(&buffer); - } - - - audio_close(); - return NULL; + audio_close(); + return NULL; } -#endif /* HAVE_AUDIO */ +#endif /* HAVE_AUDIO */ -static void * -receiver_thread(void *arg) +static void *receiver_thread(void *arg) { - struct state_uv *uv = (struct state_uv *) arg; + struct state_uv *uv = (struct state_uv *)arg; - struct pdb_e *cp; - struct timeval timeout; - int fr; - int i = 0; - int ret; + struct pdb_e *cp; + struct timeval timeout; + int fr; + int i = 0; + int ret; - fr = 1; + fr = 1; - while (!should_exit) { - /* Housekeeping and RTCP... */ - gettimeofday(&uv->curr_time, NULL); - uv->ts = tv_diff(uv->curr_time, uv->start_time) * 90000; - rtp_update(uv->network_device, uv->curr_time); - rtp_send_ctrl(uv->network_device, uv->ts, 0, uv->curr_time); + while (!should_exit) { + /* Housekeeping and RTCP... */ + gettimeofday(&uv->curr_time, NULL); + uv->ts = tv_diff(uv->curr_time, uv->start_time) * 90000; + rtp_update(uv->network_device, uv->curr_time); + rtp_send_ctrl(uv->network_device, uv->ts, 0, uv->curr_time); - /* Receive packets from the network... The timeout is adjusted */ - /* to match the video capture rate, so the transmitter works. */ - if(fr) { - gettimeofday(&uv->curr_time, NULL); - frame_begin[i] = uv->curr_time.tv_usec; - fr=0; - } + /* Receive packets from the network... The timeout is adjusted */ + /* to match the video capture rate, so the transmitter works. */ + if (fr) { + gettimeofday(&uv->curr_time, NULL); + frame_begin[i] = uv->curr_time.tv_usec; + fr = 0; + } - timeout.tv_sec = 0; - timeout.tv_usec = 999999 / 59.94; - ret = rtp_recv(uv->network_device, &timeout, uv->ts); - - /* - if (ret == FALSE) { - printf("Failed to receive data\n"); - } - */ + timeout.tv_sec = 0; + timeout.tv_usec = 999999 / 59.94; + ret = rtp_recv(uv->network_device, &timeout, uv->ts); - /* Decode and render for each participant in the conference... */ - cp = pdb_iter_init(uv->participants); - while (cp != NULL) { - if (tfrc_feedback_is_due(cp->tfrc_state, uv->curr_time)) { - debug_msg("tfrc rate %f\n", - tfrc_feedback_txrate(cp->tfrc_state, uv->curr_time)); - } + /* + if (ret == FALSE) { + printf("Failed to receive data\n"); + } + */ - /* Decode and render video... */ - if (pbuf_decode(cp->playout_buffer, uv->curr_time, frame_buffer, i)) { - gettimeofday(&uv->curr_time, NULL); - fr = 1; - display_put_frame(uv->display_device, frame_buffer->data); - i = (i + 1) % 2; - frame_buffer = display_get_frame(uv->display_device); - } - pbuf_remove(cp->playout_buffer, uv->curr_time); - cp = pdb_iter_next(uv->participants); - } - pdb_iter_done(uv->participants); - } + /* Decode and render for each participant in the conference... */ + cp = pdb_iter_init(uv->participants); + while (cp != NULL) { + if (tfrc_feedback_is_due(cp->tfrc_state, uv->curr_time)) { + debug_msg("tfrc rate %f\n", + tfrc_feedback_txrate(cp->tfrc_state, + uv->curr_time)); + } - return 0; + /* Decode and render video... */ + if (pbuf_decode + (cp->playout_buffer, uv->curr_time, frame_buffer, + i)) { + gettimeofday(&uv->curr_time, NULL); + fr = 1; + display_put_frame(uv->display_device, + frame_buffer->data); + i = (i + 1) % 2; + frame_buffer = + display_get_frame(uv->display_device); + } + pbuf_remove(cp->playout_buffer, uv->curr_time); + cp = pdb_iter_next(uv->participants); + } + pdb_iter_done(uv->participants); + } + + return 0; } -static void * -sender_thread(void *arg) +static void *sender_thread(void *arg) { - struct state_uv *uv = (struct state_uv *) arg; + struct state_uv *uv = (struct state_uv *)arg; - struct video_frame *tx_frame; + struct video_frame *tx_frame; - while (!should_exit) { - /* Capture and transmit video... */ - tx_frame = vidcap_grab(uv->capture_device); - if (tx_frame != NULL) { - //TODO: Unghetto this - if(uv->requested_compression) { + while (!should_exit) { + /* Capture and transmit video... */ + tx_frame = vidcap_grab(uv->capture_device); + if (tx_frame != NULL) { + //TODO: Unghetto this + if (uv->requested_compression) { #ifdef HAVE_FASTDXT - compress_data(uv->compression,tx_frame); -#endif /* HAVE_FASTDXT */ - } - tx_send(uv->tx, tx_frame, uv->network_device); - free(tx_frame); - } - } + compress_data(uv->compression, tx_frame); +#endif /* HAVE_FASTDXT */ + } + tx_send(uv->tx, tx_frame, uv->network_device); + free(tx_frame); + } + } - return 0; + return 0; } -int -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { #ifdef HAVE_SCHED_SETSCHEDULER - struct sched_param sp; + struct sched_param sp; #endif - char *cfg=NULL; - struct state_uv *uv; - int ch; - pthread_t receiver_thread_id, sender_thread_id; + char *cfg = NULL; + struct state_uv *uv; + int ch; + pthread_t receiver_thread_id, sender_thread_id; - static struct option getopt_options[] = { - {"display", required_argument, 0, 'd'}, - {"cfg", required_argument, 0, 'g'}, - {"capture", required_argument, 0, 't'}, - {"mtu", required_argument, 0, 'm'}, - {"fps", required_argument, 0, 'f'}, - {"bitdepth", required_argument, 0, 'b'}, - {"version", no_argument, 0, 'v'}, - {"compress", no_argument, 0, 'c'}, - {"progressive", no_argument, 0, 'p'}, - {"ihdtv", no_argument, 0, 'i'}, - {"receive", required_argument, 0, 'r'}, - {"send", required_argument, 0, 's'}, - {0, 0, 0, 0} - }; - int option_index = 0; + static struct option getopt_options[] = { + {"display", required_argument, 0, 'd'}, + {"cfg", required_argument, 0, 'g'}, + {"capture", required_argument, 0, 't'}, + {"mtu", required_argument, 0, 'm'}, + {"fps", required_argument, 0, 'f'}, + {"bitdepth", required_argument, 0, 'b'}, + {"version", no_argument, 0, 'v'}, + {"compress", no_argument, 0, 'c'}, + {"progressive", no_argument, 0, 'p'}, + {"ihdtv", no_argument, 0, 'i'}, + {"receive", required_argument, 0, 'r'}, + {"send", required_argument, 0, 's'}, + {0, 0, 0, 0} + }; + int option_index = 0; - // uv = (struct state_uv *) calloc(1, sizeof(struct state_uv)); - uv = (struct state_uv *) malloc(sizeof(struct state_uv)); + // uv = (struct state_uv *) calloc(1, sizeof(struct state_uv)); + uv = (struct state_uv *)malloc(sizeof(struct state_uv)); - uv->ts = 0; - uv->fps = 60; - uv->display_device = NULL; - uv->compression = NULL; - uv->requested_display = "none"; - uv->requested_capture = "none"; - uv->requested_compression = 0; - uv->requested_mtu = 0; - uv->use_ihdtv_protocol = 0; - uv->audio_capture_device = -2; // no device - uv->audio_playback_device = -2; - uv->audio_participants = NULL; - uv->participants = NULL; + uv->ts = 0; + uv->fps = 60; + uv->display_device = NULL; + uv->compression = NULL; + uv->requested_display = "none"; + uv->requested_capture = "none"; + uv->requested_compression = 0; + uv->requested_mtu = 0; + uv->use_ihdtv_protocol = 0; + uv->audio_capture_device = -2; // no device + uv->audio_playback_device = -2; + uv->audio_participants = NULL; + uv->participants = NULL; #ifdef HAVE_AUDIO - while ((ch = getopt_long(argc, argv, "d:g:t:m:f:b:r:s:vcpi", getopt_options, &option_index)) != -1) { + while ((ch = + getopt_long(argc, argv, "d:g:t:m:f:b:r:s:vcpi", getopt_options, + &option_index)) != -1) { #else - while ((ch = getopt_long(argc, argv, "d:g:t:m:f:b:vcpi", getopt_options, &option_index)) != -1) { -#endif /* HAVE_AUDIO */ - switch (ch) { - case 'd' : - uv->requested_display = optarg; - if(!strcmp(uv->requested_display, "help")) { - list_video_display_devices(); - return 0; - } - if(!strcmp(uv->requested_display,"dxt")) - uv->dxt_display = 1; - break; - case 't' : - uv->requested_capture = optarg; - if(!strcmp(uv->requested_capture, "help")) { - list_video_capture_devices(); - return 0; - } - break; - case 'm' : - uv->requested_mtu = atoi(optarg); - break; - case 'g' : - cfg = strdup(optarg); - break; - case 'f' : - uv->fps = atoi(optarg); - break; - case 'b' : - bitdepth = atoi(optarg); - if (bitdepth != 10 && bitdepth != 8) { - usage(); - return EXIT_FAIL_USAGE; - } - break; - case 'v' : - printf("%s\n", ULTRAGRID_VERSION); - return EXIT_SUCCESS; - case 'c' : - uv->requested_compression=1; - break; - case 'p' : - progressive=1; - break; - case 'i': - uv->use_ihdtv_protocol = 1; - printf("setting ihdtv protocol\n"); - break; + while ((ch = + getopt_long(argc, argv, "d:g:t:m:f:b:vcpi", getopt_options, + &option_index)) != -1) { +#endif /* HAVE_AUDIO */ + switch (ch) { + case 'd': + uv->requested_display = optarg; + if (!strcmp(uv->requested_display, "help")) { + list_video_display_devices(); + return 0; + } + if (!strcmp(uv->requested_display, "dxt")) + uv->dxt_display = 1; + break; + case 't': + uv->requested_capture = optarg; + if (!strcmp(uv->requested_capture, "help")) { + list_video_capture_devices(); + return 0; + } + break; + case 'm': + uv->requested_mtu = atoi(optarg); + break; + case 'g': + cfg = strdup(optarg); + break; + case 'f': + uv->fps = atoi(optarg); + break; + case 'b': + bitdepth = atoi(optarg); + if (bitdepth != 10 && bitdepth != 8) { + usage(); + return EXIT_FAIL_USAGE; + } + break; + case 'v': + printf("%s\n", ULTRAGRID_VERSION); + return EXIT_SUCCESS; + case 'c': + uv->requested_compression = 1; + break; + case 'p': + progressive = 1; + break; + case 'i': + uv->use_ihdtv_protocol = 1; + printf("setting ihdtv protocol\n"); + break; #ifdef HAVE_AUDIO - case 'r': - if(!strcmp("list", optarg)){ - print_available_devices(); - return EXIT_SUCCESS; - } - uv->audio_playback_device = atoi(optarg); - break; - case 's': - if(!strcmp("list", optarg)){ - print_available_devices(); - return EXIT_SUCCESS; - } - uv->audio_capture_device = atoi(optarg); - break; -#endif /* HAVE_AUDIO */ - case '?' : - break; - default : - usage(); - return EXIT_FAIL_USAGE; - } - } + case 'r': + if (!strcmp("list", optarg)) { + print_available_devices(); + return EXIT_SUCCESS; + } + uv->audio_playback_device = atoi(optarg); + break; + case 's': + if (!strcmp("list", optarg)) { + print_available_devices(); + return EXIT_SUCCESS; + } + uv->audio_capture_device = atoi(optarg); + break; +#endif /* HAVE_AUDIO */ + case '?': + break; + default: + usage(); + return EXIT_FAIL_USAGE; + } + } /* if(cfg == NULL) { cfg=malloc(4); snprintf(cfg, 4, "%d", uv->fps); }*/ - argc -= optind; - argv += optind; + argc -= optind; + argv += optind; - if(uv->use_ihdtv_protocol) - { - if((argc != 0) && (argc != 1) && (argc != 2)) - { - usage(); - return EXIT_FAIL_USAGE; - } - } - else if (argc != 1 && strstr(cfg, "help")==0) { - usage(); - return EXIT_FAIL_USAGE; - } + if (uv->use_ihdtv_protocol) { + if ((argc != 0) && (argc != 1) && (argc != 2)) { + usage(); + return EXIT_FAIL_USAGE; + } + } else if (argc != 1 && strstr(cfg, "help") == 0) { + usage(); + return EXIT_FAIL_USAGE; + } - printf("%s\n", ULTRAGRID_VERSION); - printf("Display device: %s\n", uv->requested_display); - printf("Capture device: %s\n", uv->requested_capture); - printf("Frame rate : %d\n", uv->fps); - printf("MTU : %d\n", uv->requested_mtu); - if(uv->requested_compression) - printf("Compression : DXT\n"); - else - printf("Compression : None\n"); + printf("%s\n", ULTRAGRID_VERSION); + printf("Display device: %s\n", uv->requested_display); + printf("Capture device: %s\n", uv->requested_capture); + printf("Frame rate : %d\n", uv->fps); + printf("MTU : %d\n", uv->requested_mtu); + if (uv->requested_compression) + printf("Compression : DXT\n"); + else + printf("Compression : None\n"); - if(uv->use_ihdtv_protocol) - printf("Network protocol: ihdtv\n"); - else - printf("Network protocol: ultragrid rtp\n"); + if (uv->use_ihdtv_protocol) + printf("Network protocol: ihdtv\n"); + else + printf("Network protocol: ultragrid rtp\n"); - gettimeofday(&uv->start_time, NULL); + gettimeofday(&uv->start_time, NULL); - uv->participants = pdb_init(); + uv->participants = pdb_init(); - if ((uv->capture_device = initialize_video_capture(uv->requested_capture, cfg)) == NULL) { - printf("Unable to open capture device: %s\n", uv->requested_capture); - return EXIT_FAIL_CAPTURE; - } - printf("Video capture initialized-%s\n", uv->requested_capture); + if ((uv->capture_device = + initialize_video_capture(uv->requested_capture, cfg)) == NULL) { + printf("Unable to open capture device: %s\n", + uv->requested_capture); + return EXIT_FAIL_CAPTURE; + } + printf("Video capture initialized-%s\n", uv->requested_capture); - if ((uv->display_device = initialize_video_display(uv->requested_display, cfg)) == NULL) { - printf("Unable to open display device: %s\n", uv->requested_display); - return EXIT_FAIL_DISPLAY; - } - printf("Display initialized-%s\n", uv->requested_display); + if ((uv->display_device = + initialize_video_display(uv->requested_display, cfg)) == NULL) { + printf("Unable to open display device: %s\n", + uv->requested_display); + return EXIT_FAIL_DISPLAY; + } + printf("Display initialized-%s\n", uv->requested_display); #ifdef HAVE_FASTDXT - if (uv->requested_compression) { - uv->compression = initialize_video_compression(); - } -#endif /* HAVE_FASTDXT */ + if (uv->requested_compression) { + uv->compression = initialize_video_compression(); + } +#endif /* HAVE_FASTDXT */ #ifndef WIN32 - signal(SIGINT, signal_handler); - signal(SIGTERM, signal_handler); - signal(SIGQUIT, signal_handler); - signal(SIGHUP, signal_handler); - signal(SIGABRT, signal_handler); + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + signal(SIGQUIT, signal_handler); + signal(SIGHUP, signal_handler); + signal(SIGABRT, signal_handler); #endif #ifdef HAVE_SCHED_SETSCHEDULER - sp.sched_priority = sched_get_priority_max(SCHED_FIFO); - if (sched_setscheduler(0, SCHED_FIFO, &sp) != 0) { - printf("WARNING: Unable to set real-time scheduling\n"); - } + sp.sched_priority = sched_get_priority_max(SCHED_FIFO); + if (sched_setscheduler(0, SCHED_FIFO, &sp) != 0) { + printf("WARNING: Unable to set real-time scheduling\n"); + } #else - printf("WARNING: System does not support real-time scheduling\n"); -#endif /* HAVE_SCHED_SETSCHEDULER */ + printf("WARNING: System does not support real-time scheduling\n"); +#endif /* HAVE_SCHED_SETSCHEDULER */ #ifdef HAVE_AUDIO - pthread_t audio_thread_id; - if( (uv->audio_playback_device != -2) || (uv->audio_capture_device != -2)) - { - uv->audio_participants = pdb_init(); - if(( uv->audio_network_device = initialize_audio_network(argv[0], uv->audio_participants)) == NULL) - { - printf("Unable to open audio network\n"); - return EXIT_FAIL_NETWORK; - } + pthread_t audio_thread_id; + if ((uv->audio_playback_device != -2) + || (uv->audio_capture_device != -2)) { + uv->audio_participants = pdb_init(); + if ((uv->audio_network_device = + initialize_audio_network(argv[0], + uv->audio_participants)) == + NULL) { + printf("Unable to open audio network\n"); + return EXIT_FAIL_NETWORK; + } - if(pthread_create(&audio_thread_id, NULL, audio_thread, (void *) uv) != 0) - { - fprintf(stderr, "Error creating audio thread. Quitting\n"); - return EXIT_FAILURE; - } - } -#endif /* HAVE_AUDIO */ + if (pthread_create + (&audio_thread_id, NULL, audio_thread, (void *)uv) != 0) { + fprintf(stderr, + "Error creating audio thread. Quitting\n"); + return EXIT_FAILURE; + } + } +#endif /* HAVE_AUDIO */ - if(uv->use_ihdtv_protocol) { - ihdtv_connection tx_connection, rx_connection; + if (uv->use_ihdtv_protocol) { + ihdtv_connection tx_connection, rx_connection; - printf("Initializing ihdtv protocol\n"); + printf("Initializing ihdtv protocol\n"); - // we cannot act as both together, because parameter parsing whould have to be revamped - if ((strcmp("none", uv->requested_display) != 0) && (strcmp("none", uv->requested_capture) != 0)) - { - printf("Error: cannot act as both sender and reciever together in ihdtv mode\n"); - return -1; - } + // we cannot act as both together, because parameter parsing whould have to be revamped + if ((strcmp("none", uv->requested_display) != 0) + && (strcmp("none", uv->requested_capture) != 0)) { + printf + ("Error: cannot act as both sender and reciever together in ihdtv mode\n"); + return -1; + } - void *rx_connection_and_display[] = {(void*)&rx_connection, (void*)uv->display_device}; - void *tx_connection_and_display[] = {(void*)&tx_connection, (void*)uv->capture_device}; + void *rx_connection_and_display[] = + { (void *)&rx_connection, (void *)uv->display_device }; + void *tx_connection_and_display[] = + { (void *)&tx_connection, (void *)uv->capture_device }; - if(uv->requested_mtu == 0) // mtu not specified on command line - { - uv->requested_mtu = 8112; // not really a mtu, but a video-data payload per packet - } + if (uv->requested_mtu == 0) // mtu not specified on command line + { + uv->requested_mtu = 8112; // not really a mtu, but a video-data payload per packet + } - if (strcmp("none", uv->requested_display) != 0) - { - if(ihdtv_init_rx_session(&rx_connection, (argc==0)?NULL:argv[0], (argc==0)?NULL:( (argc==1)?argv[0]:argv[1] ), 3000, 3001, uv->requested_mtu) != 0 ) - { - fprintf(stderr, "Error initializing reciever session\n"); - return 1; - } + if (strcmp("none", uv->requested_display) != 0) { + if (ihdtv_init_rx_session + (&rx_connection, (argc == 0) ? NULL : argv[0], + (argc == + 0) ? NULL : ((argc == 1) ? argv[0] : argv[1]), + 3000, 3001, uv->requested_mtu) != 0) { + fprintf(stderr, + "Error initializing reciever session\n"); + return 1; + } - if (pthread_create(&receiver_thread_id, NULL, ihdtv_reciever_thread, rx_connection_and_display) != 0) - { - fprintf(stderr, "Error creating reciever thread. Quitting\n"); - return 1; - } - } + if (pthread_create + (&receiver_thread_id, NULL, ihdtv_reciever_thread, + rx_connection_and_display) != 0) { + fprintf(stderr, + "Error creating reciever thread. Quitting\n"); + return 1; + } + } - if (strcmp("none", uv->requested_capture) != 0) - { - if(argc == 0) - { - fprintf(stderr, "Error: specify the destination address\n"); - usage(); - return EXIT_FAIL_USAGE; - } + if (strcmp("none", uv->requested_capture) != 0) { + if (argc == 0) { + fprintf(stderr, + "Error: specify the destination address\n"); + usage(); + return EXIT_FAIL_USAGE; + } - if(ihdtv_init_tx_session(&tx_connection, argv[0], (argc==2)?argv[1]:argv[0], uv->requested_mtu) != 0) - { - fprintf(stderr, "Error initializing sender session\n"); - return 1; - } + if (ihdtv_init_tx_session + (&tx_connection, argv[0], + (argc == 2) ? argv[1] : argv[0], + uv->requested_mtu) != 0) { + fprintf(stderr, + "Error initializing sender session\n"); + return 1; + } - if (pthread_create(&sender_thread_id, NULL, ihdtv_sender_thread, tx_connection_and_display) != 0) - { - fprintf(stderr, "Error creating sender thread. Quitting\n"); - return 1; - } - } + if (pthread_create + (&sender_thread_id, NULL, ihdtv_sender_thread, + tx_connection_and_display) != 0) { + fprintf(stderr, + "Error creating sender thread. Quitting\n"); + return 1; + } + } - while(!should_exit) - sleep(1); + while (!should_exit) + sleep(1); - } - else { - if ((uv->network_device = initialize_network(argv[0], uv->participants)) == NULL) { - printf("Unable to open network\n"); - return EXIT_FAIL_NETWORK; - } + } else { + if ((uv->network_device = + initialize_network(argv[0], uv->participants)) == NULL) { + printf("Unable to open network\n"); + return EXIT_FAIL_NETWORK; + } - if(uv->requested_mtu == 0) // mtu wasn't specified on the command line - { - uv->requested_mtu = 1500; // the default value for rpt - } + if (uv->requested_mtu == 0) // mtu wasn't specified on the command line + { + uv->requested_mtu = 1500; // the default value for rpt + } - if ((uv->tx = initialize_transmit(uv->requested_mtu)) == NULL) { - printf("Unable to initialize transmitter\n"); - return EXIT_FAIL_TRANSMIT; - } + if ((uv->tx = initialize_transmit(uv->requested_mtu)) == NULL) { + printf("Unable to initialize transmitter\n"); + return EXIT_FAIL_TRANSMIT; + } - if (strcmp("none", uv->requested_display) != 0) { - if(pthread_create(&receiver_thread_id, NULL, receiver_thread, (void *) uv) != 0) { - perror("Unable to create display thread!\n"); - should_exit = TRUE; - } - } - if (strcmp("none", uv->requested_capture) != 0) { - if(pthread_create(&sender_thread_id, NULL, sender_thread, (void *) uv) != 0) { - perror("Unable to create capture thread!\n"); - should_exit = TRUE; - } - } + if (strcmp("none", uv->requested_display) != 0) { + if (pthread_create + (&receiver_thread_id, NULL, receiver_thread, + (void *)uv) != 0) { + perror("Unable to create display thread!\n"); + should_exit = TRUE; + } + } + if (strcmp("none", uv->requested_capture) != 0) { + if (pthread_create + (&sender_thread_id, NULL, sender_thread, + (void *)uv) != 0) { + perror("Unable to create capture thread!\n"); + should_exit = TRUE; + } + } - while (!should_exit) { -#ifndef X_DISPLAY_MISSING + while (!should_exit) { +#ifndef X_DISPLAY_MISSING #ifdef HAVE_SDL - if (strcmp(uv->requested_display, "sdl") == 0) { - display_sdl_handle_events(uv->display_device); - } -#endif /* HAVE_SDL */ -#endif /* X_DISPLAY_MISSING */ - usleep(500000); + if (strcmp(uv->requested_display, "sdl") == 0) { + display_sdl_handle_events(uv->display_device); + } +#endif /* HAVE_SDL */ +#endif /* X_DISPLAY_MISSING */ + usleep(500000); - } - } + } + } - if(strcmp("none", uv->requested_display) != 0) - pthread_join(receiver_thread_id, NULL); + if (strcmp("none", uv->requested_display) != 0) + pthread_join(receiver_thread_id, NULL); - if(strcmp("none", uv->requested_capture) != 0) - pthread_join(sender_thread_id, NULL); + if (strcmp("none", uv->requested_capture) != 0) + pthread_join(sender_thread_id, NULL); #ifdef HAVE_AUDIO - if((uv->audio_playback_device != -2) || (uv->audio_capture_device != -2)) - pthread_join(audio_thread_id, NULL); -#endif /* HAVE_AUDIO */ + if ((uv->audio_playback_device != -2) + || (uv->audio_capture_device != -2)) + pthread_join(audio_thread_id, NULL); +#endif /* HAVE_AUDIO */ - tx_done(uv->tx); - rtp_done(uv->network_device); - vidcap_done(uv->capture_device); - display_done(uv->display_device); - if(uv->participants != NULL) - pdb_destroy(&uv->participants); - if(uv->audio_participants != NULL) - pdb_destroy(&uv->audio_participants); - printf("Exit\n"); - return EXIT_SUCCESS; + tx_done(uv->tx); + rtp_done(uv->network_device); + vidcap_done(uv->capture_device); + display_done(uv->display_device); + if (uv->participants != NULL) + pdb_destroy(&uv->participants); + if (uv->audio_participants != NULL) + pdb_destroy(&uv->audio_participants); + printf("Exit\n"); + return EXIT_SUCCESS; } diff --git a/ultragrid/src/ntp.c b/ultragrid/src/ntp.c index 54d7a2d32..94cd52e4a 100644 --- a/ultragrid/src/ntp.c +++ b/ultragrid/src/ntp.c @@ -22,17 +22,15 @@ #define SECS_BETWEEN_1900_1970 2208988800u -void -ntp64_time(uint32_t *ntp_sec, uint32_t *ntp_frac) +void ntp64_time(uint32_t * ntp_sec, uint32_t * ntp_frac) { struct timeval now; - uint32_t tmp; /* now.tv_usec is signed on many platforms; compensate */ + uint32_t tmp; /* now.tv_usec is signed on many platforms; compensate */ gettimeofday(&now, NULL); /* NB ntp_frac is in units of 1 / (2^32 - 1) secs. */ - *ntp_sec = now.tv_sec + SECS_BETWEEN_1900_1970; - tmp = now.tv_usec; + *ntp_sec = now.tv_sec + SECS_BETWEEN_1900_1970; + tmp = now.tv_usec; *ntp_frac = (tmp << 12) + (tmp << 8) - ((tmp * 3650) >> 6); } - diff --git a/ultragrid/src/pdb.c b/ultragrid/src/pdb.c index 3f05aff85..097211d37 100644 --- a/ultragrid/src/pdb.c +++ b/ultragrid/src/pdb.c @@ -64,7 +64,7 @@ #include "config_unix.h" #include "config_win32.h" #include "debug.h" -#include "rtp/rtp.h" /* Needed by pbuf.h */ +#include "rtp/rtp.h" /* Needed by pbuf.h */ #include "rtp/pbuf.h" #include "tfrc.h" #include "pdb.h" @@ -73,19 +73,19 @@ #define PDB_NODE_MAGIC 0x01010101 typedef struct s_pdb_node { - uint32_t key; - void *data; + uint32_t key; + void *data; struct s_pdb_node *parent; struct s_pdb_node *left; struct s_pdb_node *right; - uint32_t magic; + uint32_t magic; } pdb_node_t; -struct pdb { +struct pdb { pdb_node_t *root; - pdb_node_t *iter; - uint32_t magic; - int count; + pdb_node_t *iter; + uint32_t magic; + int count; }; /*****************************************************************************/ @@ -97,10 +97,9 @@ struct pdb { static int pdb_count; -static void -pdb_validate_node(pdb_node_t *node, pdb_node_t *parent) +static void pdb_validate_node(pdb_node_t * node, pdb_node_t * parent) { - assert(node->magic == BTREE_NODE_MAGIC); + assert(node->magic == BTREE_NODE_MAGIC); assert(node->parent == parent); pdb_count++; if (node->left != NULL) { @@ -111,8 +110,7 @@ pdb_validate_node(pdb_node_t *node, pdb_node_t *parent) } } -static void -pdb_validate(struct pdb *t) +static void pdb_validate(struct pdb *t) { assert(t->magic == BTREE_MAGIC); #ifdef DEBUG @@ -124,25 +122,22 @@ pdb_validate(struct pdb *t) #endif } - /*****************************************************************************/ /* Utility functions */ /*****************************************************************************/ -static pdb_node_t* -pdb_min(pdb_node_t *x) +static pdb_node_t *pdb_min(pdb_node_t * x) { if (x == NULL) { return NULL; } - while(x->left) { + while (x->left) { x = x->left; } return x; } -static pdb_node_t* -pdb_successor(pdb_node_t *x) +static pdb_node_t *pdb_successor(pdb_node_t * x) { pdb_node_t *y; @@ -159,8 +154,7 @@ pdb_successor(pdb_node_t *x) return y; } -static pdb_node_t* -pdb_search(pdb_node_t *x, uint32_t key) +static pdb_node_t *pdb_search(pdb_node_t * x, uint32_t key) { while (x != NULL && key != x->key) { if (key < x->key) { @@ -169,14 +163,14 @@ pdb_search(pdb_node_t *x, uint32_t key) x = x->right; } } - return x; + return x; } -static void -pdb_insert_node(struct pdb *tree, pdb_node_t *z) { +static void pdb_insert_node(struct pdb *tree, pdb_node_t * z) +{ pdb_node_t *x, *y; - pdb_validate(tree); + pdb_validate(tree); y = NULL; x = tree->root; while (x != NULL) { @@ -197,16 +191,15 @@ pdb_insert_node(struct pdb *tree, pdb_node_t *z) { } else { y->right = z; } - tree->count++; - pdb_validate(tree); + tree->count++; + pdb_validate(tree); } -static pdb_node_t* -pdb_delete_node(struct pdb *tree, pdb_node_t *z) +static pdb_node_t *pdb_delete_node(struct pdb *tree, pdb_node_t * z) { pdb_node_t *x, *y; - pdb_validate(tree); + pdb_validate(tree); if (z->left == NULL || z->right == NULL) { y = z; } else { @@ -231,109 +224,105 @@ pdb_delete_node(struct pdb *tree, pdb_node_t *z) y->parent->right = x; } - z->key = y->key; + z->key = y->key; z->data = y->data; - tree->count--; + tree->count--; - pdb_validate(tree); + pdb_validate(tree); return y; } /*****************************************************************************/ -struct pdb * -pdb_init(void) +struct pdb *pdb_init(void) { - struct pdb *db = malloc(sizeof(struct pdb)); - if (db != NULL) { - db->magic = PDB_MAGIC; - db->count = 0; - db->root = NULL; - db->iter = NULL; - } - return db; + struct pdb *db = malloc(sizeof(struct pdb)); + if (db != NULL) { + db->magic = PDB_MAGIC; + db->count = 0; + db->root = NULL; + db->iter = NULL; + } + return db; } -void -pdb_destroy(struct pdb **db_p) +void pdb_destroy(struct pdb **db_p) { - struct pdb *db = *db_p; + struct pdb *db = *db_p; - pdb_validate(db); - if (db->root != NULL) { - printf("WARNING: participant database not empty - cannot destroy\n"); - // TODO: participants should be removed using pdb_remove() - } + pdb_validate(db); + if (db->root != NULL) { + printf + ("WARNING: participant database not empty - cannot destroy\n"); + // TODO: participants should be removed using pdb_remove() + } - free(db); - *db_p = NULL; + free(db); + *db_p = NULL; } -static struct pdb_e * -pdb_create_item(uint32_t ssrc) +static struct pdb_e *pdb_create_item(uint32_t ssrc) { - struct pdb_e *p = malloc(sizeof(struct pdb_e)); - if (p != NULL) { - gettimeofday(&(p->creation_time), NULL); - p->ssrc = ssrc; - p->sdes_cname = NULL; - p->sdes_name = NULL; - p->sdes_email = NULL; - p->sdes_phone = NULL; - p->sdes_loc = NULL; - p->sdes_tool = NULL; - p->sdes_note = NULL; - p->video_decoder_state = NULL; - p->pt = 255; - p->playout_buffer = pbuf_init(); - p->tfrc_state = tfrc_init(p->creation_time); - } - return p; + struct pdb_e *p = malloc(sizeof(struct pdb_e)); + if (p != NULL) { + gettimeofday(&(p->creation_time), NULL); + p->ssrc = ssrc; + p->sdes_cname = NULL; + p->sdes_name = NULL; + p->sdes_email = NULL; + p->sdes_phone = NULL; + p->sdes_loc = NULL; + p->sdes_tool = NULL; + p->sdes_note = NULL; + p->video_decoder_state = NULL; + p->pt = 255; + p->playout_buffer = pbuf_init(); + p->tfrc_state = tfrc_init(p->creation_time); + } + return p; } -int -pdb_add(struct pdb *db, uint32_t ssrc) +int pdb_add(struct pdb *db, uint32_t ssrc) { - /* Add an item to the participant database, indexed by ssrc. */ - /* Returns 0 on success, 1 if the participant is already in */ - /* the database, 2 for other failures. */ - pdb_node_t *x; - struct pdb_e *i; + /* Add an item to the participant database, indexed by ssrc. */ + /* Returns 0 on success, 1 if the participant is already in */ + /* the database, 2 for other failures. */ + pdb_node_t *x; + struct pdb_e *i; - pdb_validate(db); + pdb_validate(db); x = pdb_search(db->root, ssrc); if (x != NULL) { debug_msg("Item already exists - ssrc %x\n", ssrc); return 1; } - i = pdb_create_item(ssrc); - if (i == NULL) { - debug_msg("Unable to create database entry - ssrc %x\n", ssrc); - return 2; - } + i = pdb_create_item(ssrc); + if (i == NULL) { + debug_msg("Unable to create database entry - ssrc %x\n", ssrc); + return 2; + } x = (pdb_node_t *) malloc(sizeof(pdb_node_t)); - x->key = ssrc; - x->data = i; + x->key = ssrc; + x->data = i; x->parent = NULL; - x->left = NULL; - x->right = NULL; - x->magic = BTREE_NODE_MAGIC; + x->left = NULL; + x->right = NULL; + x->magic = BTREE_NODE_MAGIC; pdb_insert_node(db, x); - debug_msg("Added participant %x\n", ssrc); + debug_msg("Added participant %x\n", ssrc); return 0; } -struct pdb_e * -pdb_get(struct pdb *db, uint32_t ssrc) +struct pdb_e *pdb_get(struct pdb *db, uint32_t ssrc) { - /* Return a pointer to the item indexed by ssrc, or NULL if */ - /* the item is not present in the database. */ + /* Return a pointer to the item indexed by ssrc, or NULL if */ + /* the item is not present in the database. */ pdb_node_t *x; - pdb_validate(db); + pdb_validate(db); x = pdb_search(db->root, ssrc); if (x != NULL) { return x->data; @@ -341,13 +330,12 @@ pdb_get(struct pdb *db, uint32_t ssrc) return NULL; } -int -pdb_remove(struct pdb *db, uint32_t ssrc, struct pdb_e **item) +int pdb_remove(struct pdb *db, uint32_t ssrc, struct pdb_e **item) { - /* Remove the item indexed by ssrc. Return zero on success. */ + /* Remove the item indexed by ssrc. Return zero on success. */ pdb_node_t *x; - pdb_validate(db); + pdb_validate(db); x = pdb_search(db->root, ssrc); if (x == NULL) { debug_msg("Item not on tree - ssrc %ul\n", ssrc); @@ -355,10 +343,10 @@ pdb_remove(struct pdb *db, uint32_t ssrc, struct pdb_e **item) return 1; } - /* Note value that gets freed is not necessarily the the same as node - * that gets removed from tree since there is an optimization to avoid - * pointer updates in tree which means sometimes we just copy key and - * data from one node to another. + /* Note value that gets freed is not necessarily the the same as node + * that gets removed from tree since there is an optimization to avoid + * pointer updates in tree which means sometimes we just copy key and + * data from one node to another. */ *item = x->data; x = pdb_delete_node(db, x); @@ -366,35 +354,30 @@ pdb_remove(struct pdb *db, uint32_t ssrc, struct pdb_e **item) return 0; } - /* * Iterator functions */ -struct pdb_e * -pdb_iter_init(struct pdb *db) +struct pdb_e *pdb_iter_init(struct pdb *db) { - if (db->root == NULL) { - return NULL; /* The database is empty */ - } - db->iter = pdb_min(db->root); - return db->iter->data; + if (db->root == NULL) { + return NULL; /* The database is empty */ + } + db->iter = pdb_min(db->root); + return db->iter->data; } -struct pdb_e * -pdb_iter_next(struct pdb *db) +struct pdb_e *pdb_iter_next(struct pdb *db) { - assert(db->iter != NULL); - db->iter = pdb_successor(db->iter); - if (db->iter == NULL) { - return NULL; - } - return db->iter->data; + assert(db->iter != NULL); + db->iter = pdb_successor(db->iter); + if (db->iter == NULL) { + return NULL; + } + return db->iter->data; } -void -pdb_iter_done(struct pdb *db) +void pdb_iter_done(struct pdb *db) { - db->iter = NULL; + db->iter = NULL; } - diff --git a/ultragrid/src/rtp/decoders.c b/ultragrid/src/rtp/decoders.c index 686d8a793..1b16b3130 100644 --- a/ultragrid/src/rtp/decoders.c +++ b/ultragrid/src/rtp/decoders.c @@ -55,24 +55,23 @@ //#define DEBUG 1 //#define DEBUG_TIMING 1 -void -decode_frame(struct coded_data *cdata, struct video_frame *frame) +void decode_frame(struct coded_data *cdata, struct video_frame *frame) { uint32_t width; uint32_t height; uint32_t offset; - int len; + int len; codec_t color_spec; rtp_packet *pckt; unsigned char *source; - payload_hdr_t *hdr; + payload_hdr_t *hdr; uint32_t data_pos; #ifdef DEBUG_TIMING - struct timeval tv,tv1; - int packets=0; + struct timeval tv, tv1; + int packets = 0; #endif #ifdef DEBUG - long pos=0; + long pos = 0; #endif #ifdef DEBUG_TIMING gettimeofday(&tv, NULL); @@ -83,7 +82,7 @@ decode_frame(struct coded_data *cdata, struct video_frame *frame) packets++; #endif pckt = cdata->data; - hdr = (payload_hdr_t *)pckt->data; + hdr = (payload_hdr_t *) pckt->data; width = ntohs(hdr->width); height = ntohs(hdr->height); color_spec = hdr->colorspc; @@ -93,44 +92,53 @@ decode_frame(struct coded_data *cdata, struct video_frame *frame) /* Critical section * each thread *MUST* wait here if this condition is true */ - if(!(frame->width == width && - frame->height == height && - frame->color_spec == color_spec)) { - frame->reconfigure(frame->state, width, height, color_spec); - frame->src_linesize = vc_getsrc_linesize(width, color_spec); + if (!(frame->width == width && + frame->height == height && + frame->color_spec == color_spec)) { + frame->reconfigure(frame->state, width, height, + color_spec); + frame->src_linesize = + vc_getsrc_linesize(width, color_spec); } /* End of critical section */ - + #ifdef DEBUG - fprintf(stdout, "Setup: src line size: %d, dst line size %d, pitch %d\n", - frame->src_linesize, frame->dst_linesize, frame->dst_pitch); - int b=0; + fprintf(stdout, + "Setup: src line size: %d, dst line size %d, pitch %d\n", + frame->src_linesize, frame->dst_linesize, + frame->dst_pitch); + int b = 0; #endif /* MAGIC, don't touch it, you definitely break it */ - int y = (data_pos / frame->src_linesize)*frame->dst_pitch; + int y = (data_pos / frame->src_linesize) * frame->dst_pitch; int s_x = data_pos % frame->src_linesize; - int d_x = ((int)((s_x)/frame->src_bpp))*frame->dst_bpp; + int d_x = ((int)((s_x) / frame->src_bpp)) * frame->dst_bpp; source = pckt->data + sizeof(payload_hdr_t); #ifdef DEBUG - fprintf(stdout, "Computed start x %d, %d (%d %d), start y %d\n", s_x, d_x, (int)(s_x/frame->src_bpp), - (int)(d_x/frame->dst_bpp), y/frame->dst_linesize); + fprintf(stdout, "Computed start x %d, %d (%d %d), start y %d\n", + s_x, d_x, (int)(s_x / frame->src_bpp), + (int)(d_x / frame->dst_bpp), y / frame->dst_linesize); #endif - while(len > 0){ - int l = ((int)(len/frame->src_bpp))*frame->dst_bpp; - if(l + d_x > frame->dst_linesize) { + while (len > 0) { + int l = ((int)(len / frame->src_bpp)) * frame->dst_bpp; + if (l + d_x > frame->dst_linesize) { l = frame->dst_linesize - d_x; } offset = y + d_x; - if(l + offset < frame->data_len) { + if (l + offset < frame->data_len) { #ifdef DEBUG - if(b < 5) { - fprintf(stdout, "Computed offset: %d, original offset %d, memcpy length %d (pixels %d), original length %d, stored length %d, next line %d\n", - offset, data_pos, l, (int)(l/frame->dst_bpp), len, pos, offset + l); + if (b < 5) { + fprintf(stdout, + "Computed offset: %d, original offset %d, memcpy length %d (pixels %d), original length %d, stored length %d, next line %d\n", + offset, data_pos, l, + (int)(l / frame->dst_bpp), len, + pos, offset + l); b++; - } + } #endif - frame->decoder(frame->data+offset, source, l, - frame->rshift, frame->gshift, frame->bshift); + frame->decoder(frame->data + offset, source, l, + frame->rshift, frame->gshift, + frame->bshift); len -= frame->src_linesize - s_x; source += frame->src_linesize - s_x; #ifdef DEBUG @@ -139,23 +147,24 @@ decode_frame(struct coded_data *cdata, struct video_frame *frame) #endif } else { #ifdef DEBUG - fprintf(stderr, "Discarding data, framebuffer too small.\n"); + fprintf(stderr, + "Discarding data, framebuffer too small.\n"); #endif len = 0; } - d_x = 0; /* next line from beginning */ + d_x = 0; /* next line from beginning */ s_x = 0; - y += frame->dst_pitch; /* next line */ + y += frame->dst_pitch; /* next line */ } - cdata = cdata->nxt; - } + cdata = cdata->nxt; + } #ifdef DEBUG_TIMING - gettimeofday(&tv1, NULL); - fprintf(stdout, "Frame encoded in %fms, %d packets\n", (tv1.tv_usec - tv.tv_usec)/1000.0, packets); + gettimeofday(&tv1, NULL); + fprintf(stdout, "Frame encoded in %fms, %d packets\n", + (tv1.tv_usec - tv.tv_usec) / 1000.0, packets); #endif #ifdef DEBUG - fprintf(stdout, "Frame end\n"); + fprintf(stdout, "Frame end\n"); #endif } - diff --git a/ultragrid/src/rtp/net_udp.c b/ultragrid/src/rtp/net_udp.c index e9a76972d..d27f62d63 100644 --- a/ultragrid/src/rtp/net_udp.c +++ b/ultragrid/src/rtp/net_udp.c @@ -63,7 +63,7 @@ #define IPv6 6 #ifdef WIN2K_IPV6 -const struct in6_addr in6addr_any = {IN6ADDR_ANY_INIT}; +const struct in6_addr in6addr_any = { IN6ADDR_ANY_INIT }; #endif /* This is pretty nasty but it's the simplest way to get round */ @@ -72,7 +72,7 @@ const struct in6_addr in6addr_any = {IN6ADDR_ANY_INIT}; /* We also need to define in6addr_any */ #ifdef MUSICA_IPV6 #define IPPROTO_IPV6 IPPROTO_IP -struct in6_addr in6addr_any = {IN6ADDR_ANY_INIT}; +struct in6_addr in6addr_any = { IN6ADDR_ANY_INIT }; /* These DEF's are required as MUSICA's winsock6.h causes a clash with some of the * standard ws2tcpip.h definitions (eg struct in_addr6). @@ -80,20 +80,20 @@ struct in6_addr in6addr_any = {IN6ADDR_ANY_INIT}; * set to the MUSICA value as this is used in some of their function calls. */ //#define AF_INET6 23 -#define IP_MULTICAST_LOOP 11 /*set/get IP multicast loopback */ -#define IP_MULTICAST_IF 9 /* set/get IP multicast i/f */ -#define IP_MULTICAST_TTL 10 /* set/get IP multicast ttl */ -#define IP_MULTICAST_LOOP 11 /*set/get IP multicast loopback */ -#define IP_ADD_MEMBERSHIP 12 /* add an IP group membership */ -#define IP_DROP_MEMBERSHIP 13/* drop an IP group membership */ +#define IP_MULTICAST_LOOP 11 /*set/get IP multicast loopback */ +#define IP_MULTICAST_IF 9 /* set/get IP multicast i/f */ +#define IP_MULTICAST_TTL 10 /* set/get IP multicast ttl */ +#define IP_MULTICAST_LOOP 11 /*set/get IP multicast loopback */ +#define IP_ADD_MEMBERSHIP 12 /* add an IP group membership */ +#define IP_DROP_MEMBERSHIP 13 /* drop an IP group membership */ #define IN6_IS_ADDR_UNSPECIFIED(a) (((a)->s6_addr32[0] == 0) && \ ((a)->s6_addr32[1] == 0) && \ ((a)->s6_addr32[2] == 0) && \ ((a)->s6_addr32[3] == 0)) struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ }; #endif @@ -102,16 +102,16 @@ struct ip_mreq { #endif struct _socket_udp { - int mode; /* IPv4 or IPv6 */ - char *addr; - uint16_t rx_port; - uint16_t tx_port; - ttl_t ttl; - fd_t fd; - struct in_addr addr4; + int mode; /* IPv4 or IPv6 */ + char *addr; + uint16_t rx_port; + uint16_t tx_port; + ttl_t ttl; + fd_t fd; + struct in_addr addr4; #ifdef HAVE_IPv6 - struct in6_addr addr6; -#endif /* HAVE_IPv6 */ + struct in6_addr addr6; +#endif /* HAVE_IPv6 */ }; #ifdef WIN32 @@ -122,50 +122,51 @@ struct _socket_udp { #define SETSOCKOPT winsock_versions_setsockopt #else #define SETSOCKOPT setsockopt -#endif /* WIN32 */ +#endif /* WIN32 */ /*****************************************************************************/ /* Support functions... */ /*****************************************************************************/ -static void -socket_error(const char *msg, ...) +static void socket_error(const char *msg, ...) { - char buffer[255]; - uint32_t blen = sizeof(buffer) / sizeof(buffer[0]); - va_list ap; + char buffer[255]; + uint32_t blen = sizeof(buffer) / sizeof(buffer[0]); + va_list ap; #ifdef WIN32 #define WSERR(x) {#x,x} - struct wse { - char errname[20]; - int errno; - }; - struct wse ws_errs[] = { - WSERR(WSANOTINITIALISED), WSERR(WSAENETDOWN), WSERR(WSAEACCES), - WSERR(WSAEINVAL), WSERR(WSAEINTR), WSERR(WSAEINPROGRESS), - WSERR(WSAEFAULT), WSERR(WSAENETRESET), WSERR(WSAENOBUFS), - WSERR(WSAENOTCONN), WSERR(WSAENOTSOCK), WSERR(WSAEOPNOTSUPP), - WSERR(WSAESHUTDOWN), WSERR(WSAEWOULDBLOCK), WSERR(WSAEMSGSIZE), - WSERR(WSAEHOSTUNREACH), WSERR(WSAECONNABORTED), WSERR(WSAECONNRESET), - WSERR(WSAEADDRNOTAVAIL), WSERR(WSAEAFNOSUPPORT), WSERR(WSAEDESTADDRREQ), - WSERR(WSAENETUNREACH), WSERR(WSAETIMEDOUT), WSERR(0) - }; - - int i, e = WSAGetLastError(); - i = 0; - while(ws_errs[i].errno && ws_errs[i].errno != e) { - i++; - } - va_start(ap, msg); - _vsnprintf(buffer, blen, msg, ap); - va_end(ap); - printf("ERROR: %s, (%d - %s)\n", msg, e, ws_errs[i].errname); + struct wse { + char errname[20]; + int errno; + }; + struct wse ws_errs[] = { + WSERR(WSANOTINITIALISED), WSERR(WSAENETDOWN), WSERR(WSAEACCES), + WSERR(WSAEINVAL), WSERR(WSAEINTR), WSERR(WSAEINPROGRESS), + WSERR(WSAEFAULT), WSERR(WSAENETRESET), WSERR(WSAENOBUFS), + WSERR(WSAENOTCONN), WSERR(WSAENOTSOCK), WSERR(WSAEOPNOTSUPP), + WSERR(WSAESHUTDOWN), WSERR(WSAEWOULDBLOCK), WSERR(WSAEMSGSIZE), + WSERR(WSAEHOSTUNREACH), WSERR(WSAECONNABORTED), + WSERR(WSAECONNRESET), + WSERR(WSAEADDRNOTAVAIL), WSERR(WSAEAFNOSUPPORT), + WSERR(WSAEDESTADDRREQ), + WSERR(WSAENETUNREACH), WSERR(WSAETIMEDOUT), WSERR(0) + }; + + int i, e = WSAGetLastError(); + i = 0; + while (ws_errs[i].errno && ws_errs[i].errno != e) { + i++; + } + va_start(ap, msg); + _vsnprintf(buffer, blen, msg, ap); + va_end(ap); + printf("ERROR: %s, (%d - %s)\n", msg, e, ws_errs[i].errname); #else - va_start(ap, msg); - vsnprintf(buffer, blen, msg, ap); - va_end(ap); - perror(buffer); + va_start(ap, msg); + vsnprintf(buffer, blen, msg, ap); + va_end(ap); + perror(buffer); #endif } @@ -175,52 +176,59 @@ socket_error(const char *msg, ...) * winsock 1 fail. So what was the motivation in changing the * constants ? */ -#define WS1_IP_MULTICAST_IF 2 /* set/get IP multicast interface */ -#define WS1_IP_MULTICAST_TTL 3 /* set/get IP multicast timetolive */ -#define WS1_IP_MULTICAST_LOOP 4 /* set/get IP multicast loopback */ -#define WS1_IP_ADD_MEMBERSHIP 5 /* add an IP group membership */ -#define WS1_IP_DROP_MEMBERSHIP 6 /* drop an IP group membership */ +#define WS1_IP_MULTICAST_IF 2 /* set/get IP multicast interface */ +#define WS1_IP_MULTICAST_TTL 3 /* set/get IP multicast timetolive */ +#define WS1_IP_MULTICAST_LOOP 4 /* set/get IP multicast loopback */ +#define WS1_IP_ADD_MEMBERSHIP 5 /* add an IP group membership */ +#define WS1_IP_DROP_MEMBERSHIP 6 /* drop an IP group membership */ /* winsock_versions_setsockopt tries 1 winsock version of option * optname and then winsock 2 version if that failed. */ static int -winsock_versions_setsockopt(SOCKET s, int level, int optname, const char FAR * optval, int optlen) +winsock_versions_setsockopt(SOCKET s, int level, int optname, + const char FAR * optval, int optlen) { - int success = -1; - switch (optname) { - case IP_MULTICAST_IF: - success = setsockopt(s, level, WS1_IP_MULTICAST_IF, optval, optlen); - break; - case IP_MULTICAST_TTL: - success = setsockopt(s, level, WS1_IP_MULTICAST_TTL, optval, optlen); - break; - case IP_MULTICAST_LOOP: - success = setsockopt(s, level, WS1_IP_MULTICAST_LOOP, optval, optlen); - break; - case IP_ADD_MEMBERSHIP: - success = setsockopt(s, level, WS1_IP_ADD_MEMBERSHIP, optval, optlen); - break; - case IP_DROP_MEMBERSHIP: - success = setsockopt(s, level, WS1_IP_DROP_MEMBERSHIP, optval, optlen); - break; - } - if (success != -1) { - return success; - } - return setsockopt(s, level, optname, optval, optlen); + int success = -1; + switch (optname) { + case IP_MULTICAST_IF: + success = + setsockopt(s, level, WS1_IP_MULTICAST_IF, optval, optlen); + break; + case IP_MULTICAST_TTL: + success = + setsockopt(s, level, WS1_IP_MULTICAST_TTL, optval, optlen); + break; + case IP_MULTICAST_LOOP: + success = + setsockopt(s, level, WS1_IP_MULTICAST_LOOP, optval, optlen); + break; + case IP_ADD_MEMBERSHIP: + success = + setsockopt(s, level, WS1_IP_ADD_MEMBERSHIP, optval, optlen); + break; + case IP_DROP_MEMBERSHIP: + success = + setsockopt(s, level, WS1_IP_DROP_MEMBERSHIP, optval, + optlen); + break; + } + if (success != -1) { + return success; + } + return setsockopt(s, level, optname, optval, optlen); } #endif #ifdef NEED_INET_ATON #ifdef NEED_INET_ATON_STATIC -static +static #endif int inet_aton(const char *name, struct in_addr *addr) { - addr->s_addr = inet_addr(name); - return (addr->s_addr != (in_addr_t) INADDR_NONE); + addr->s_addr = inet_addr(name); + return (addr->s_addr != (in_addr_t) INADDR_NONE); } #endif @@ -232,8 +240,6 @@ int inet_aton(const char *name, struct in_addr *addr) #define IN6_IS_ADDR_UNSPECIFIED(addr) IS_UNSPEC_IN6_ADDR(*addr) #endif - - /*****************************************************************************/ /* IPv4 specific functions... */ /*****************************************************************************/ @@ -241,188 +247,206 @@ int inet_aton(const char *name, struct in_addr *addr) static int udp_addr_valid4(const char *dst) { struct in_addr addr4; - struct hostent *h; + struct hostent *h; - if (inet_pton(AF_INET, dst, &addr4)) { - return TRUE; - } + if (inet_pton(AF_INET, dst, &addr4)) { + return TRUE; + } - h = gethostbyname(dst); - if (h != NULL) { - return TRUE; - } - socket_error("Can't resolve IP address for %s", dst); + h = gethostbyname(dst); + if (h != NULL) { + return TRUE; + } + socket_error("Can't resolve IP address for %s", dst); return FALSE; } -static socket_udp *udp_init4(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) +static socket_udp *udp_init4(const char *addr, const char *iface, + uint16_t rx_port, uint16_t tx_port, int ttl) { - int reuse = 1; - int udpbufsize = 16 * 1024 * 1024; - struct sockaddr_in s_in; - struct in_addr iface_addr; - socket_udp *s = (socket_udp *)malloc(sizeof(socket_udp)); - s->mode = IPv4; - s->addr = NULL; - s->rx_port = rx_port; - s->tx_port = tx_port; - s->ttl = ttl; - if (inet_pton(AF_INET, addr, &s->addr4) != 1) { - struct hostent *h = gethostbyname(addr); - if (h == NULL) { - socket_error("Can't resolve IP address for %s", addr); + int reuse = 1; + int udpbufsize = 16 * 1024 * 1024; + struct sockaddr_in s_in; + struct in_addr iface_addr; + socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp)); + s->mode = IPv4; + s->addr = NULL; + s->rx_port = rx_port; + s->tx_port = tx_port; + s->ttl = ttl; + if (inet_pton(AF_INET, addr, &s->addr4) != 1) { + struct hostent *h = gethostbyname(addr); + if (h == NULL) { + socket_error("Can't resolve IP address for %s", addr); free(s); - return NULL; - } - memcpy(&(s->addr4), h->h_addr_list[0], sizeof(s->addr4)); - } - if (iface != NULL) { - if (inet_pton(AF_INET, iface, &iface_addr) != 1) { - debug_msg("Illegal interface specification\n"); + return NULL; + } + memcpy(&(s->addr4), h->h_addr_list[0], sizeof(s->addr4)); + } + if (iface != NULL) { + if (inet_pton(AF_INET, iface, &iface_addr) != 1) { + debug_msg("Illegal interface specification\n"); free(s); - return NULL; - } - } else { - iface_addr.s_addr = 0; - } - s->fd = socket(AF_INET, SOCK_DGRAM, 0); - if (s->fd < 0) { - socket_error("Unable to initialize socket"); - return NULL; - } - if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_SNDBUF, (char *) &udpbufsize, sizeof(udpbufsize)) != 0) { - debug_msg("WARNING: Unable to increase UDP sendbuffer\n"); - } - if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_RCVBUF, (char *) &udpbufsize, sizeof(udpbufsize)) != 0) { - debug_msg("WARNING: Unable to increase UDP recvbuffer\n"); - } - if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) { - socket_error("setsockopt SO_REUSEADDR"); - return NULL; - } + return NULL; + } + } else { + iface_addr.s_addr = 0; + } + s->fd = socket(AF_INET, SOCK_DGRAM, 0); + if (s->fd < 0) { + socket_error("Unable to initialize socket"); + return NULL; + } + if (SETSOCKOPT + (s->fd, SOL_SOCKET, SO_SNDBUF, (char *)&udpbufsize, + sizeof(udpbufsize)) != 0) { + debug_msg("WARNING: Unable to increase UDP sendbuffer\n"); + } + if (SETSOCKOPT + (s->fd, SOL_SOCKET, SO_RCVBUF, (char *)&udpbufsize, + sizeof(udpbufsize)) != 0) { + debug_msg("WARNING: Unable to increase UDP recvbuffer\n"); + } + if (SETSOCKOPT + (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, + sizeof(reuse)) != 0) { + socket_error("setsockopt SO_REUSEADDR"); + return NULL; + } #ifdef SO_REUSEPORT - if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) { - socket_error("setsockopt SO_REUSEPORT"); - return NULL; - } + if (SETSOCKOPT + (s->fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse, + sizeof(reuse)) != 0) { + socket_error("setsockopt SO_REUSEPORT"); + return NULL; + } #endif - s_in.sin_family = AF_INET; - s_in.sin_addr.s_addr = INADDR_ANY; - s_in.sin_port = htons(rx_port); - if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) { - socket_error("bind"); - return NULL; - } - if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { - char loop = 1; - struct ip_mreq imr; - - imr.imr_multiaddr.s_addr = s->addr4.s_addr; - imr.imr_interface.s_addr = iface_addr.s_addr; - - if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &imr, sizeof(struct ip_mreq)) != 0) { - socket_error("setsockopt IP_ADD_MEMBERSHIP"); - return NULL; - } + s_in.sin_family = AF_INET; + s_in.sin_addr.s_addr = INADDR_ANY; + s_in.sin_port = htons(rx_port); + if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) { + socket_error("bind"); + return NULL; + } + if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { + char loop = 1; + struct ip_mreq imr; + + imr.imr_multiaddr.s_addr = s->addr4.s_addr; + imr.imr_interface.s_addr = iface_addr.s_addr; + + if (SETSOCKOPT + (s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr, + sizeof(struct ip_mreq)) != 0) { + socket_error("setsockopt IP_ADD_MEMBERSHIP"); + return NULL; + } #ifndef WIN32 - if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) { - socket_error("setsockopt IP_MULTICAST_LOOP"); - return NULL; - } + if (SETSOCKOPT + (s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, + sizeof(loop)) != 0) { + socket_error("setsockopt IP_MULTICAST_LOOP"); + return NULL; + } #endif - if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &s->ttl, sizeof(s->ttl)) != 0) { - socket_error("setsockopt IP_MULTICAST_TTL"); - return NULL; - } - if (iface_addr.s_addr != 0) { - if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_IF, (char *) &iface_addr, sizeof(iface_addr)) != 0) { - socket_error("setsockopt IP_MULTICAST_IF"); - return NULL; - } - } - } + if (SETSOCKOPT + (s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&s->ttl, + sizeof(s->ttl)) != 0) { + socket_error("setsockopt IP_MULTICAST_TTL"); + return NULL; + } + if (iface_addr.s_addr != 0) { + if (SETSOCKOPT + (s->fd, IPPROTO_IP, IP_MULTICAST_IF, + (char *)&iface_addr, sizeof(iface_addr)) != 0) { + socket_error("setsockopt IP_MULTICAST_IF"); + return NULL; + } + } + } s->addr = strdup(addr); - return s; + return s; } -static void udp_exit4(socket_udp *s) +static void udp_exit4(socket_udp * s) { - if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { - struct ip_mreq imr; - imr.imr_multiaddr.s_addr = s->addr4.s_addr; - imr.imr_interface.s_addr = INADDR_ANY; - if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *) &imr, sizeof(struct ip_mreq)) != 0) { - socket_error("setsockopt IP_DROP_MEMBERSHIP"); - abort(); - } - debug_msg("Dropped membership of multicast group\n"); - } - close(s->fd); + if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { + struct ip_mreq imr; + imr.imr_multiaddr.s_addr = s->addr4.s_addr; + imr.imr_interface.s_addr = INADDR_ANY; + if (SETSOCKOPT + (s->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&imr, + sizeof(struct ip_mreq)) != 0) { + socket_error("setsockopt IP_DROP_MEMBERSHIP"); + abort(); + } + debug_msg("Dropped membership of multicast group\n"); + } + close(s->fd); free(s->addr); - free(s); + free(s); } -static inline int -udp_send4(socket_udp *s, char *buffer, int buflen) +static inline int udp_send4(socket_udp * s, char *buffer, int buflen) { - struct sockaddr_in s_in; - - assert(s != NULL); - assert(s->mode == IPv4); - assert(buffer != NULL); - assert(buflen > 0); - - s_in.sin_family = AF_INET; - s_in.sin_addr.s_addr = s->addr4.s_addr; - s_in.sin_port = htons(s->tx_port); - return sendto(s->fd, buffer, buflen, 0, (struct sockaddr *) &s_in, sizeof(s_in)); + struct sockaddr_in s_in; + + assert(s != NULL); + assert(s->mode == IPv4); + assert(buffer != NULL); + assert(buflen > 0); + + s_in.sin_family = AF_INET; + s_in.sin_addr.s_addr = s->addr4.s_addr; + s_in.sin_port = htons(s->tx_port); + return sendto(s->fd, buffer, buflen, 0, (struct sockaddr *)&s_in, + sizeof(s_in)); } -static inline int -udp_sendv4(socket_udp *s, struct iovec *vector, int count) +static inline int udp_sendv4(socket_udp * s, struct iovec *vector, int count) { - struct msghdr msg; - struct sockaddr_in s_in; - - assert(s != NULL); - assert(s->mode == IPv4); - - s_in.sin_family = AF_INET; - s_in.sin_addr.s_addr = s->addr4.s_addr; - s_in.sin_port = htons(s->tx_port); + struct msghdr msg; + struct sockaddr_in s_in; - msg.msg_name = (caddr_t) &s_in; - msg.msg_namelen = sizeof(s_in); - msg.msg_iov = vector; - msg.msg_iovlen = count; - /* Linux needs these... solaris does something different... */ - msg.msg_control = 0; - msg.msg_controllen = 0; - msg.msg_flags = 0; + assert(s != NULL); + assert(s->mode == IPv4); - return sendmsg(s->fd, &msg, 0); + s_in.sin_family = AF_INET; + s_in.sin_addr.s_addr = s->addr4.s_addr; + s_in.sin_port = htons(s->tx_port); + + msg.msg_name = (caddr_t) & s_in; + msg.msg_namelen = sizeof(s_in); + msg.msg_iov = vector; + msg.msg_iovlen = count; + /* Linux needs these... solaris does something different... */ + msg.msg_control = 0; + msg.msg_controllen = 0; + msg.msg_flags = 0; + + return sendmsg(s->fd, &msg, 0); } static const char *udp_host_addr4(void) { - static char hname[MAXHOSTNAMELEN]; - struct hostent *hent; - struct in_addr iaddr; - - if (gethostname(hname, MAXHOSTNAMELEN) != 0) { - debug_msg("Cannot get hostname!"); - abort(); - } - hent = gethostbyname(hname); - if (hent == NULL) { - socket_error("Can't resolve IP address for %s", hname); - return NULL; - } - assert(hent->h_addrtype == AF_INET); - memcpy(&iaddr.s_addr, hent->h_addr, sizeof(iaddr.s_addr)); - strncpy(hname, inet_ntoa(iaddr), MAXHOSTNAMELEN); - return (const char*)hname; + static char hname[MAXHOSTNAMELEN]; + struct hostent *hent; + struct in_addr iaddr; + + if (gethostname(hname, MAXHOSTNAMELEN) != 0) { + debug_msg("Cannot get hostname!"); + abort(); + } + hent = gethostbyname(hname); + if (hent == NULL) { + socket_error("Can't resolve IP address for %s", hname); + return NULL; + } + assert(hent->h_addrtype == AF_INET); + memcpy(&iaddr.s_addr, hent->h_addr, sizeof(iaddr.s_addr)); + strncpy(hname, inet_ntoa(iaddr), MAXHOSTNAMELEN); + return (const char *)hname; } /*****************************************************************************/ @@ -433,266 +457,286 @@ static int udp_addr_valid6(const char *dst) { #ifdef HAVE_IPv6 struct in6_addr addr6; - switch (inet_pton(AF_INET6, dst, &addr6)) { - case 1: + switch (inet_pton(AF_INET6, dst, &addr6)) { + case 1: return TRUE; break; - case 0: + case 0: return FALSE; break; - case -1: + case -1: debug_msg("inet_pton failed\n"); errno = 0; } -#endif /* HAVE_IPv6 */ +#endif /* HAVE_IPv6 */ UNUSED(dst); return FALSE; } -static socket_udp *udp_init6(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) +static socket_udp *udp_init6(const char *addr, const char *iface, + uint16_t rx_port, uint16_t tx_port, int ttl) { #ifdef HAVE_IPv6 - int reuse = 1; - struct sockaddr_in6 s_in; - socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp)); - s->mode = IPv6; - s->addr = NULL; - s->rx_port = rx_port; - s->tx_port = tx_port; - s->ttl = ttl; - - if (iface != NULL) { - debug_msg("Not yet implemented\n"); - abort(); - } + int reuse = 1; + struct sockaddr_in6 s_in; + socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp)); + s->mode = IPv6; + s->addr = NULL; + s->rx_port = rx_port; + s->tx_port = tx_port; + s->ttl = ttl; - if (inet_pton(AF_INET6, addr, &s->addr6) != 1) { - /* We should probably try to do a DNS lookup on the name */ - /* here, but I'm trying to get the basics going first... */ - debug_msg("IPv6 address conversion failed\n"); + if (iface != NULL) { + debug_msg("Not yet implemented\n"); + abort(); + } + + if (inet_pton(AF_INET6, addr, &s->addr6) != 1) { + /* We should probably try to do a DNS lookup on the name */ + /* here, but I'm trying to get the basics going first... */ + debug_msg("IPv6 address conversion failed\n"); free(s); - return NULL; - } - s->fd = socket(AF_INET6, SOCK_DGRAM, 0); - if (s->fd < 0) { - socket_error("socket"); - return NULL; - } - if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) { - socket_error("setsockopt SO_REUSEADDR"); - return NULL; - } + return NULL; + } + s->fd = socket(AF_INET6, SOCK_DGRAM, 0); + if (s->fd < 0) { + socket_error("socket"); + return NULL; + } + if (SETSOCKOPT + (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, + sizeof(reuse)) != 0) { + socket_error("setsockopt SO_REUSEADDR"); + return NULL; + } #ifdef SO_REUSEPORT - if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) { - socket_error("setsockopt SO_REUSEPORT"); - return NULL; - } + if (SETSOCKOPT + (s->fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse, + sizeof(reuse)) != 0) { + socket_error("setsockopt SO_REUSEPORT"); + return NULL; + } #endif - - memset((char *)&s_in, 0, sizeof(s_in)); - s_in.sin6_family = AF_INET6; - s_in.sin6_port = htons(rx_port); -#ifdef HAVE_SIN6_LEN - s_in.sin6_len = sizeof(s_in); -#endif - s_in.sin6_addr = in6addr_any; - if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) { - socket_error("bind"); - return NULL; - } - - if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) { - unsigned int loop = 1; - struct ipv6_mreq imr; -#ifdef MUSICA_IPV6 - imr.i6mr_interface = 1; - imr.i6mr_multiaddr = s->addr6; -#else - imr.ipv6mr_multiaddr = s->addr6; - imr.ipv6mr_interface = 0; -#endif - - if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *) &imr, sizeof(struct ipv6_mreq)) != 0) { - socket_error("setsockopt IPV6_ADD_MEMBERSHIP"); - return NULL; - } - - if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *) &loop, sizeof(loop)) != 0) { - socket_error("setsockopt IPV6_MULTICAST_LOOP"); - return NULL; - } - if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *) &ttl, sizeof(ttl)) != 0) { - socket_error("setsockopt IPV6_MULTICAST_HOPS"); - return NULL; - } - } - assert(s != NULL); + memset((char *)&s_in, 0, sizeof(s_in)); + s_in.sin6_family = AF_INET6; + s_in.sin6_port = htons(rx_port); +#ifdef HAVE_SIN6_LEN + s_in.sin6_len = sizeof(s_in); +#endif + s_in.sin6_addr = in6addr_any; + if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) { + socket_error("bind"); + return NULL; + } + + if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) { + unsigned int loop = 1; + struct ipv6_mreq imr; +#ifdef MUSICA_IPV6 + imr.i6mr_interface = 1; + imr.i6mr_multiaddr = s->addr6; +#else + imr.ipv6mr_multiaddr = s->addr6; + imr.ipv6mr_interface = 0; +#endif + + if (SETSOCKOPT + (s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&imr, + sizeof(struct ipv6_mreq)) != 0) { + socket_error("setsockopt IPV6_ADD_MEMBERSHIP"); + return NULL; + } + + if (SETSOCKOPT + (s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&loop, + sizeof(loop)) != 0) { + socket_error("setsockopt IPV6_MULTICAST_LOOP"); + return NULL; + } + if (SETSOCKOPT + (s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl, + sizeof(ttl)) != 0) { + socket_error("setsockopt IPV6_MULTICAST_HOPS"); + return NULL; + } + } + + assert(s != NULL); s->addr = strdup(addr); - return s; + return s; #else - UNUSED(addr); - UNUSED(iface); - UNUSED(rx_port); - UNUSED(tx_port); - UNUSED(ttl); - return NULL; + UNUSED(addr); + UNUSED(iface); + UNUSED(rx_port); + UNUSED(tx_port); + UNUSED(ttl); + return NULL; #endif } -static void udp_exit6(socket_udp *s) +static void udp_exit6(socket_udp * s) { #ifdef HAVE_IPv6 - if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) { - struct ipv6_mreq imr; + if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) { + struct ipv6_mreq imr; #ifdef MUSICA_IPV6 - imr.i6mr_interface = 1; - imr.i6mr_multiaddr = s->addr6; + imr.i6mr_interface = 1; + imr.i6mr_multiaddr = s->addr6; #else - imr.ipv6mr_multiaddr = s->addr6; - imr.ipv6mr_interface = 0; + imr.ipv6mr_multiaddr = s->addr6; + imr.ipv6mr_interface = 0; #endif - - if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (char *) &imr, sizeof(struct ipv6_mreq)) != 0) { - socket_error("setsockopt IPV6_DROP_MEMBERSHIP"); - abort(); - } - } - close(s->fd); + + if (SETSOCKOPT + (s->fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (char *)&imr, + sizeof(struct ipv6_mreq)) != 0) { + socket_error("setsockopt IPV6_DROP_MEMBERSHIP"); + abort(); + } + } + close(s->fd); free(s->addr); - free(s); + free(s); #else - UNUSED(s); -#endif /* HAVE_IPv6 */ + UNUSED(s); +#endif /* HAVE_IPv6 */ } -static int udp_send6(socket_udp *s, char *buffer, int buflen) +static int udp_send6(socket_udp * s, char *buffer, int buflen) { #ifdef HAVE_IPv6 - struct sockaddr_in6 s_in; - - assert(s != NULL); - assert(s->mode == IPv6); - assert(buffer != NULL); - assert(buflen > 0); - - memset((char *)&s_in, 0, sizeof(s_in)); - s_in.sin6_family = AF_INET6; - s_in.sin6_addr = s->addr6; - s_in.sin6_port = htons(s->tx_port); + struct sockaddr_in6 s_in; + + assert(s != NULL); + assert(s->mode == IPv6); + assert(buffer != NULL); + assert(buflen > 0); + + memset((char *)&s_in, 0, sizeof(s_in)); + s_in.sin6_family = AF_INET6; + s_in.sin6_addr = s->addr6; + s_in.sin6_port = htons(s->tx_port); #ifdef HAVE_SIN6_LEN - s_in.sin6_len = sizeof(s_in); + s_in.sin6_len = sizeof(s_in); #endif - return sendto(s->fd, buffer, buflen, 0, (struct sockaddr *) &s_in, sizeof(s_in)); + return sendto(s->fd, buffer, buflen, 0, (struct sockaddr *)&s_in, + sizeof(s_in)); #else - UNUSED(s); - UNUSED(buffer); - UNUSED(buflen); - return -1; + UNUSED(s); + UNUSED(buffer); + UNUSED(buflen); + return -1; #endif } -static int -udp_sendv6(socket_udp *s, struct iovec *vector, int count) +static int udp_sendv6(socket_udp * s, struct iovec *vector, int count) { #ifdef HAVE_IPv6 - struct msghdr msg; - struct sockaddr_in6 s_in; + struct msghdr msg; + struct sockaddr_in6 s_in; - assert(s != NULL); - assert(s->mode == IPv6); + assert(s != NULL); + assert(s->mode == IPv6); - memset((char *)&s_in, 0, sizeof(s_in)); - s_in.sin6_family = AF_INET6; - s_in.sin6_addr = s->addr6; - s_in.sin6_port = htons(s->tx_port); + memset((char *)&s_in, 0, sizeof(s_in)); + s_in.sin6_family = AF_INET6; + s_in.sin6_addr = s->addr6; + s_in.sin6_port = htons(s->tx_port); #ifdef HAVE_SIN6_LEN - s_in.sin6_len = sizeof(s_in); + s_in.sin6_len = sizeof(s_in); #endif - msg.msg_name = (void *) &s_in; - msg.msg_namelen = sizeof(s_in); - msg.msg_iov = vector; - msg.msg_iovlen = count; - msg.msg_control = 0; - msg.msg_controllen = 0; - msg.msg_flags = 0; - return sendmsg(s->fd, &msg, 0); + msg.msg_name = (void *)&s_in; + msg.msg_namelen = sizeof(s_in); + msg.msg_iov = vector; + msg.msg_iovlen = count; + msg.msg_control = 0; + msg.msg_controllen = 0; + msg.msg_flags = 0; + return sendmsg(s->fd, &msg, 0); #else - UNUSED(s); - UNUSED(vector); - UNUSED(count); - return -1; + UNUSED(s); + UNUSED(vector); + UNUSED(count); + return -1; #endif } -static const char *udp_host_addr6(socket_udp *s) +static const char *udp_host_addr6(socket_udp * s) { #ifdef HAVE_IPv6 - static char hname[MAXHOSTNAMELEN]; - int gai_err, newsock; - struct addrinfo hints, *ai; - struct sockaddr_in6 local, addr6; - int len = sizeof(local), result = 0; + static char hname[MAXHOSTNAMELEN]; + int gai_err, newsock; + struct addrinfo hints, *ai; + struct sockaddr_in6 local, addr6; + int len = sizeof(local), result = 0; - newsock=socket(AF_INET6, SOCK_DGRAM,0); - memset ((char *)&addr6, 0, len); - addr6.sin6_family = AF_INET6; + newsock = socket(AF_INET6, SOCK_DGRAM, 0); + memset((char *)&addr6, 0, len); + addr6.sin6_family = AF_INET6; #ifdef HAVE_SIN6_LEN - addr6.sin6_len = len; + addr6.sin6_len = len; #endif - bind (newsock, (struct sockaddr *) &addr6, len); - addr6.sin6_addr = s->addr6; - addr6.sin6_port = htons (s->rx_port); - connect (newsock, (struct sockaddr *) &addr6, len); + bind(newsock, (struct sockaddr *)&addr6, len); + addr6.sin6_addr = s->addr6; + addr6.sin6_port = htons(s->rx_port); + connect(newsock, (struct sockaddr *)&addr6, len); - memset ((char *)&local, 0, len); - if ((result = getsockname(newsock,(struct sockaddr *)&local, &len)) < 0){ - local.sin6_addr = in6addr_any; - local.sin6_port = 0; - debug_msg("getsockname failed\n"); - } + memset((char *)&local, 0, len); + if ((result = + getsockname(newsock, (struct sockaddr *)&local, &len)) < 0) { + local.sin6_addr = in6addr_any; + local.sin6_port = 0; + debug_msg("getsockname failed\n"); + } - close (newsock); + close(newsock); - if (IN6_IS_ADDR_UNSPECIFIED(&local.sin6_addr) || IN6_IS_ADDR_MULTICAST(&local.sin6_addr)) { - if (gethostname(hname, MAXHOSTNAMELEN) != 0) { - debug_msg("gethostname failed\n"); - abort(); - } - - hints.ai_protocol = 0; - hints.ai_flags = 0; - hints.ai_family = AF_INET6; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_addrlen = 0; - hints.ai_canonname = NULL; - hints.ai_addr = NULL; - hints.ai_next = NULL; + if (IN6_IS_ADDR_UNSPECIFIED(&local.sin6_addr) + || IN6_IS_ADDR_MULTICAST(&local.sin6_addr)) { + if (gethostname(hname, MAXHOSTNAMELEN) != 0) { + debug_msg("gethostname failed\n"); + abort(); + } - if ((gai_err = getaddrinfo(hname, NULL, &hints, &ai))) { - debug_msg("getaddrinfo: %s: %s\n", hname, gai_strerror(gai_err)); - abort(); - } - - if (inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)(ai->ai_addr))->sin6_addr), hname, MAXHOSTNAMELEN) == NULL) { - debug_msg("inet_ntop: %s: \n", hname); - abort(); - } - freeaddrinfo(ai); - return (const char*)hname; - } - if (inet_ntop(AF_INET6, &local.sin6_addr, hname, MAXHOSTNAMELEN) == NULL) { - debug_msg("inet_ntop: %s: \n", hname); - abort(); - } - return (const char*)hname; -#else /* HAVE_IPv6 */ - UNUSED(s); - return "::"; /* The unspecified address... */ -#endif /* HAVE_IPv6 */ + hints.ai_protocol = 0; + hints.ai_flags = 0; + hints.ai_family = AF_INET6; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_addrlen = 0; + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + + if ((gai_err = getaddrinfo(hname, NULL, &hints, &ai))) { + debug_msg("getaddrinfo: %s: %s\n", hname, + gai_strerror(gai_err)); + abort(); + } + + if (inet_ntop + (AF_INET6, + &(((struct sockaddr_in6 *)(ai->ai_addr))->sin6_addr), + hname, MAXHOSTNAMELEN) == NULL) { + debug_msg("inet_ntop: %s: \n", hname); + abort(); + } + freeaddrinfo(ai); + return (const char *)hname; + } + if (inet_ntop(AF_INET6, &local.sin6_addr, hname, MAXHOSTNAMELEN) == + NULL) { + debug_msg("inet_ntop: %s: \n", hname); + abort(); + } + return (const char *)hname; +#else /* HAVE_IPv6 */ + UNUSED(s); + return "::"; /* The unspecified address... */ +#endif /* HAVE_IPv6 */ } - + /*****************************************************************************/ /* Generic functions, which call the appropriate protocol specific routines. */ /*****************************************************************************/ @@ -721,9 +765,10 @@ int udp_addr_valid(const char *addr) * * Returns: a pointer to a valid socket_udp structure on success, NULL otherwise. **/ -socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, int ttl) +socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, + int ttl) { - return udp_init_if(addr, NULL, rx_port, tx_port, ttl); + return udp_init_if(addr, NULL, rx_port, tx_port, ttl); } /** @@ -740,20 +785,21 @@ socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, int t * * Return value: a pointer to a socket_udp structure on success, NULL otherwise. **/ -socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) +socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port, + uint16_t tx_port, int ttl) { - socket_udp *res; - - if (strchr(addr, ':') == NULL) { - res = udp_init4(addr, iface, rx_port, tx_port, ttl); - } else { - res = udp_init6(addr, iface, rx_port, tx_port, ttl); - } - return res; + socket_udp *res; + + if (strchr(addr, ':') == NULL) { + res = udp_init4(addr, iface, rx_port, tx_port, ttl); + } else { + res = udp_init6(addr, iface, rx_port, tx_port, ttl); + } + return res; } static fd_set rfd; -static fd_t max_fd; +static fd_t max_fd; /** * udp_fd_zero: @@ -763,8 +809,8 @@ static fd_t max_fd; **/ void udp_fd_zero(void) { - FD_ZERO(&rfd); - max_fd = 0; + FD_ZERO(&rfd); + max_fd = 0; } /** @@ -774,13 +820,18 @@ void udp_fd_zero(void) * Closes UDP session. * **/ -void udp_exit(socket_udp *s) +void udp_exit(socket_udp * s) { - switch(s->mode) { - case IPv4 : udp_exit4(s); break; - case IPv6 : udp_exit6(s); break; - default : abort(); - } + switch (s->mode) { + case IPv4: + udp_exit4(s); + break; + case IPv6: + udp_exit6(s); + break; + default: + abort(); + } } /** @@ -793,47 +844,51 @@ void udp_exit(socket_udp *s) * * Return value: 0 on success, -1 on failure. **/ -int udp_send(socket_udp *s, char *buffer, int buflen) +int udp_send(socket_udp * s, char *buffer, int buflen) { - switch (s->mode) { - case IPv4 : return udp_send4(s, buffer, buflen); - case IPv6 : return udp_send6(s, buffer, buflen); - default : abort(); /* Yuk! */ - } - return -1; + switch (s->mode) { + case IPv4: + return udp_send4(s, buffer, buflen); + case IPv6: + return udp_send6(s, buffer, buflen); + default: + abort(); /* Yuk! */ + } + return -1; } -int -udp_sendv(socket_udp *s, struct iovec *vector, int count) +int udp_sendv(socket_udp * s, struct iovec *vector, int count) { - switch (s->mode) { - case IPv4 : return udp_sendv4(s, vector, count); - case IPv6 : return udp_sendv6(s, vector, count); - default : abort(); /* Yuk! */ - } - return -1; + switch (s->mode) { + case IPv4: + return udp_sendv4(s, vector, count); + case IPv6: + return udp_sendv6(s, vector, count); + default: + abort(); /* Yuk! */ + } + return -1; } -static int -udp_do_recv(socket_udp *s, char *buffer, int buflen, int flags) +static int udp_do_recv(socket_udp * s, char *buffer, int buflen, int flags) { - /* Reads data into the buffer, returning the number of bytes read. */ - /* If no data is available, this returns the value zero immediately. */ - /* Note: since we don't care about the source address of the packet */ - /* we receive, this function becomes protocol independent. */ - int len; + /* Reads data into the buffer, returning the number of bytes read. */ + /* If no data is available, this returns the value zero immediately. */ + /* Note: since we don't care about the source address of the packet */ + /* we receive, this function becomes protocol independent. */ + int len; - assert(buffer != NULL); - assert(buflen > 0); + assert(buffer != NULL); + assert(buflen > 0); - len = recvfrom(s->fd, buffer, buflen, flags, 0, 0); - if (len > 0) { - return len; - } - if (errno != ECONNREFUSED) { - socket_error("recvfrom"); - } - return 0; + len = recvfrom(s->fd, buffer, buflen, flags, 0, 0); + if (len > 0) { + return len; + } + if (errno != ECONNREFUSED) { + socket_error("recvfrom"); + } + return 0; } /** @@ -847,10 +902,9 @@ udp_do_recv(socket_udp *s, char *buffer, int buflen, int flags) * * Return value: number of bytes read, returns 0 if no data is available. **/ -int -udp_peek(socket_udp *s, char *buffer, int buflen) +int udp_peek(socket_udp * s, char *buffer, int buflen) { - return udp_do_recv(s, buffer, buflen, MSG_PEEK); + return udp_do_recv(s, buffer, buflen, MSG_PEEK); } /** @@ -863,24 +917,22 @@ udp_peek(socket_udp *s, char *buffer, int buflen) * * Return value: number of bytes read, returns 0 if no data is available. **/ -int -udp_recv(socket_udp *s, char *buffer, int buflen) +int udp_recv(socket_udp * s, char *buffer, int buflen) { - /* Reads data into the buffer, returning the number of bytes read. */ - /* If no data is available, this returns the value zero immediately. */ - /* Note: since we don't care about the source address of the packet */ - /* we receive, this function becomes protocol independent. */ - return udp_do_recv(s, buffer, buflen, 0); + /* Reads data into the buffer, returning the number of bytes read. */ + /* If no data is available, this returns the value zero immediately. */ + /* Note: since we don't care about the source address of the packet */ + /* we receive, this function becomes protocol independent. */ + return udp_do_recv(s, buffer, buflen, 0); } -int -udp_recvv(socket_udp *s, struct msghdr *m) +int udp_recvv(socket_udp * s, struct msghdr *m) { - if (recvmsg(s->fd, m, 0) == -1) { - perror("recvmsg"); - return 1; - } - return 0; + if (recvmsg(s->fd, m, 0) == -1) { + perror("recvmsg"); + return 1; + } + return 0; } /** @@ -889,12 +941,12 @@ udp_recvv(socket_udp *s, struct msghdr *m) * * Adds file descriptor associated of @s to set associated with UDP sessions. **/ -void udp_fd_set(socket_udp *s) +void udp_fd_set(socket_udp * s) { - FD_SET(s->fd, &rfd); - if (s->fd > (fd_t)max_fd) { - max_fd = s->fd; - } + FD_SET(s->fd, &rfd); + if (s->fd > (fd_t) max_fd) { + max_fd = s->fd; + } } /** @@ -906,9 +958,9 @@ void udp_fd_set(socket_udp *s) * * Returns: non-zero if set, zero otherwise. **/ -int udp_fd_isset(socket_udp *s) +int udp_fd_isset(socket_udp * s) { - return FD_ISSET(s->fd, &rfd); + return FD_ISSET(s->fd, &rfd); } /** @@ -921,7 +973,7 @@ int udp_fd_isset(socket_udp *s) **/ int udp_select(struct timeval *timeout) { - return select(max_fd + 1, &rfd, NULL, NULL, timeout); + return select(max_fd + 1, &rfd, NULL, NULL, timeout); } /** @@ -931,14 +983,17 @@ int udp_select(struct timeval *timeout) * Return value: character string containing network address * associated with session @s. **/ -const char *udp_host_addr(socket_udp *s) +const char *udp_host_addr(socket_udp * s) { - switch (s->mode) { - case IPv4 : return udp_host_addr4(); - case IPv6 : return udp_host_addr6(s); - default : abort(); - } - return NULL; + switch (s->mode) { + case IPv4: + return udp_host_addr4(); + case IPv6: + return udp_host_addr6(s); + default: + abort(); + } + return NULL; } /** @@ -950,11 +1005,10 @@ const char *udp_host_addr(socket_udp *s) * * Return value: file descriptor of socket used by session @s. **/ -int udp_fd(socket_udp *s) +int udp_fd(socket_udp * s) { - if (s && s->fd > 0) { - return s->fd; - } - return 0; + if (s && s->fd > 0) { + return s->fd; + } + return 0; } - diff --git a/ultragrid/src/rtp/pbuf.c b/ultragrid/src/rtp/pbuf.c index 4aba18a08..df48bb7a6 100644 --- a/ultragrid/src/rtp/pbuf.c +++ b/ultragrid/src/rtp/pbuf.c @@ -73,316 +73,314 @@ extern long frame_begin[2]; struct pbuf_node { - struct pbuf_node *nxt; - struct pbuf_node *prv; - uint32_t rtp_timestamp; /* RTP timestamp for the frame */ - struct timeval arrival_time; /* Arrival time of first packet in frame */ - struct timeval playout_time; /* Playout time for the frame */ - struct coded_data *cdata; /* */ - int decoded; /* Non-zero if we've decoded this frame */ - int mbit; /* determines if mbit of frame had been seen */ - uint32_t magic; /* For debugging */ + struct pbuf_node *nxt; + struct pbuf_node *prv; + uint32_t rtp_timestamp; /* RTP timestamp for the frame */ + struct timeval arrival_time; /* Arrival time of first packet in frame */ + struct timeval playout_time; /* Playout time for the frame */ + struct coded_data *cdata; /* */ + int decoded; /* Non-zero if we've decoded this frame */ + int mbit; /* determines if mbit of frame had been seen */ + uint32_t magic; /* For debugging */ }; struct pbuf { - struct pbuf_node *frst; - struct pbuf_node *last; + struct pbuf_node *frst; + struct pbuf_node *last; }; /*********************************************************************************/ -static void -pbuf_validate(struct pbuf *playout_buf) +static void pbuf_validate(struct pbuf *playout_buf) { - /* Run through the entire playout buffer, checking pointers, etc. */ - /* Only used in debugging mode, since it's a lot of overhead [csp] */ + /* Run through the entire playout buffer, checking pointers, etc. */ + /* Only used in debugging mode, since it's a lot of overhead [csp] */ #ifdef NDEF - struct pbuf_node *cpb, *ppb; - struct coded_data *ccd, *pcd; + struct pbuf_node *cpb, *ppb; + struct coded_data *ccd, *pcd; - cpb = playout_buf->frst; - ppb = NULL; - while (cpb != NULL) { - assert(cpb->magic == PBUF_MAGIC); - assert(cpb->prv == ppb); - if (cpb->prv != NULL) { - assert(cpb->prv->nxt == cpb); - /* stored in RTP timestamp order */ - assert(cpb->rtp_timestamp > ppb->rtp_timestamp); - /* stored in playout time order */ - /* TODO: eventually check why is this assert always failng */ - // assert(tv_gt(cpb->ptime, ppb->ptime)); - } - if (cpb->nxt != NULL) { - assert(cpb->nxt->prv == cpb); - } else { - assert(cpb = playout_buf->last); - } - if (cpb->cdata != NULL) { - /* We have coded data... check all the pointers on that list too */ - ccd = cpb->cdata; - pcd = NULL; - while (ccd != NULL) { - assert(ccd->prv == pcd); - if (ccd->prv != NULL) { - assert(ccd->prv->nxt == ccd); - /* list is descending - cant really check this now*/ - //assert(ccd->seqno < pcd->seqno); - assert(ccd->data != NULL); - } - if (ccd->nxt != NULL) { - assert(ccd->nxt->prv == ccd); - } - pcd = ccd; - ccd = ccd->nxt; - } - } - ppb = cpb; - cpb = cpb->nxt; - } + cpb = playout_buf->frst; + ppb = NULL; + while (cpb != NULL) { + assert(cpb->magic == PBUF_MAGIC); + assert(cpb->prv == ppb); + if (cpb->prv != NULL) { + assert(cpb->prv->nxt == cpb); + /* stored in RTP timestamp order */ + assert(cpb->rtp_timestamp > ppb->rtp_timestamp); + /* stored in playout time order */ + /* TODO: eventually check why is this assert always failng */ + // assert(tv_gt(cpb->ptime, ppb->ptime)); + } + if (cpb->nxt != NULL) { + assert(cpb->nxt->prv == cpb); + } else { + assert(cpb = playout_buf->last); + } + if (cpb->cdata != NULL) { + /* We have coded data... check all the pointers on that list too */ + ccd = cpb->cdata; + pcd = NULL; + while (ccd != NULL) { + assert(ccd->prv == pcd); + if (ccd->prv != NULL) { + assert(ccd->prv->nxt == ccd); + /* list is descending - cant really check this now */ + //assert(ccd->seqno < pcd->seqno); + assert(ccd->data != NULL); + } + if (ccd->nxt != NULL) { + assert(ccd->nxt->prv == ccd); + } + pcd = ccd; + ccd = ccd->nxt; + } + } + ppb = cpb; + cpb = cpb->nxt; + } #else - UNUSED(playout_buf); + UNUSED(playout_buf); #endif } -struct pbuf * -pbuf_init(void) -{ - struct pbuf *playout_buf = NULL; +struct pbuf *pbuf_init(void) +{ + struct pbuf *playout_buf = NULL; - playout_buf = malloc(sizeof(struct pbuf)); - if (playout_buf != NULL) { - playout_buf->frst=NULL; - playout_buf->last=NULL; - } else { - debug_msg("Failed to allocate memory for playout buffer\n"); - } - return playout_buf; + playout_buf = malloc(sizeof(struct pbuf)); + if (playout_buf != NULL) { + playout_buf->frst = NULL; + playout_buf->last = NULL; + } else { + debug_msg("Failed to allocate memory for playout buffer\n"); + } + return playout_buf; } -static void -add_coded_unit(struct pbuf_node *node, rtp_packet *pkt) +static void add_coded_unit(struct pbuf_node *node, rtp_packet * pkt) { - /* Add "pkt" to the frame represented by "node". The "node" has */ - /* previously been created, and has some coded data already... */ + /* Add "pkt" to the frame represented by "node". The "node" has */ + /* previously been created, and has some coded data already... */ - /* New arrivals are added at the head of the list, which is stored */ - /* in descending order of packets as they arrive (NOT necessarily */ - /* descending sequence number order, as the network might reorder) */ + /* New arrivals are added at the head of the list, which is stored */ + /* in descending order of packets as they arrive (NOT necessarily */ + /* descending sequence number order, as the network might reorder) */ - struct coded_data *tmp; + struct coded_data *tmp; - assert(node->rtp_timestamp == pkt->ts); - assert(node->cdata != NULL); + assert(node->rtp_timestamp == pkt->ts); + assert(node->cdata != NULL); - tmp = malloc(sizeof(struct coded_data)); - if (tmp != NULL) { - tmp->seqno = pkt->seq; - tmp->data = pkt; - tmp->prv = NULL; - tmp->nxt = node->cdata; - node->cdata->prv = tmp; - node->cdata = tmp; - node->mbit |= pkt->m; - } else { - /* this is bad, out of memory, drop the packet... */ - free(pkt); - } + tmp = malloc(sizeof(struct coded_data)); + if (tmp != NULL) { + tmp->seqno = pkt->seq; + tmp->data = pkt; + tmp->prv = NULL; + tmp->nxt = node->cdata; + node->cdata->prv = tmp; + node->cdata = tmp; + node->mbit |= pkt->m; + } else { + /* this is bad, out of memory, drop the packet... */ + free(pkt); + } } -static struct pbuf_node * -create_new_pnode(rtp_packet *pkt) +static struct pbuf_node *create_new_pnode(rtp_packet * pkt) { - struct pbuf_node *tmp; + struct pbuf_node *tmp; - tmp = malloc(sizeof(struct pbuf_node)); - if (tmp != NULL) { - tmp->magic = PBUF_MAGIC; - tmp->nxt = NULL; - tmp->prv = NULL; - tmp->decoded = 0; - tmp->rtp_timestamp = pkt->ts; - tmp->mbit = pkt->m; - gettimeofday(&(tmp->arrival_time), NULL); - gettimeofday(&(tmp->playout_time), NULL); - /* Playout delay... should really be adaptive, based on the */ - /* jitter, but we use a (conservative) fixed 32ms delay for */ - /* now (2 video frames at 60fps). */ - tv_add(&(tmp->playout_time), 0.032); + tmp = malloc(sizeof(struct pbuf_node)); + if (tmp != NULL) { + tmp->magic = PBUF_MAGIC; + tmp->nxt = NULL; + tmp->prv = NULL; + tmp->decoded = 0; + tmp->rtp_timestamp = pkt->ts; + tmp->mbit = pkt->m; + gettimeofday(&(tmp->arrival_time), NULL); + gettimeofday(&(tmp->playout_time), NULL); + /* Playout delay... should really be adaptive, based on the */ + /* jitter, but we use a (conservative) fixed 32ms delay for */ + /* now (2 video frames at 60fps). */ + tv_add(&(tmp->playout_time), 0.032); - tmp->cdata = malloc(sizeof(struct coded_data)); - if (tmp->cdata != NULL) { - tmp->cdata->nxt = NULL; - tmp->cdata->prv = NULL; - tmp->cdata->seqno = pkt->seq; - tmp->cdata->data = pkt; - } else { - free(pkt); - free(tmp); - return NULL; - } - } else { - free(pkt); - } - return tmp; + tmp->cdata = malloc(sizeof(struct coded_data)); + if (tmp->cdata != NULL) { + tmp->cdata->nxt = NULL; + tmp->cdata->prv = NULL; + tmp->cdata->seqno = pkt->seq; + tmp->cdata->data = pkt; + } else { + free(pkt); + free(tmp); + return NULL; + } + } else { + free(pkt); + } + return tmp; } - -void -pbuf_insert(struct pbuf *playout_buf, rtp_packet *pkt) +void pbuf_insert(struct pbuf *playout_buf, rtp_packet * pkt) { - struct pbuf_node *tmp; + struct pbuf_node *tmp; - pbuf_validate(playout_buf); + pbuf_validate(playout_buf); - if (playout_buf->frst==NULL && playout_buf->last==NULL) { - /* playout buffer is empty - add new frame */ - playout_buf->frst = create_new_pnode(pkt); - playout_buf->last = playout_buf->frst; - return; - } - - if (playout_buf->last->rtp_timestamp == pkt->ts) { - /* Packet belongs to last frame in playout_buf this is the */ - /* most likely scenario - although... */ - add_coded_unit(playout_buf->last, pkt); - } else { - if (playout_buf->last->rtp_timestamp < pkt->ts) { - /* Packet belongs to a new frame... */ - tmp = create_new_pnode (pkt); - playout_buf->last->nxt = tmp; - tmp->prv = playout_buf->last; - playout_buf->last = tmp; - } else { - /* Packet belongs to a previous frame... */ - if (playout_buf->frst->rtp_timestamp > pkt->ts) { - debug_msg("A very old packet - discarded\n"); - } else { - debug_msg("A packet for a previous frame, but might still be useful\n"); - /* Should probably insert this into the playout buffer here... */ - } - if (pkt->m) { - debug_msg("Oops... dropped packet with M bit set\n"); - } - free(pkt); - } - } - pbuf_validate(playout_buf); -} - -static void -free_cdata(struct coded_data *head) -{ - struct coded_data *tmp; - - while (head != NULL) { - free(head->data); - tmp = head; - head = head->nxt; - free(tmp); - } -} - -void -pbuf_remove(struct pbuf *playout_buf, struct timeval curr_time) -{ - /* Remove previously decoded frames that have passed their playout */ - /* time from the playout buffer. Incomplete frames that have passed */ - /* their playout time are also discarded. */ - - struct pbuf_node *curr, *temp; - - pbuf_validate(playout_buf); - - curr=playout_buf->frst; - while (curr != NULL) { - temp = curr->nxt; - if (tv_gt(curr_time, curr->playout_time)) { - if (curr == playout_buf->frst) { - playout_buf->frst = curr->nxt; - } - if (curr == playout_buf->last) { - playout_buf->last = curr->prv; - } - if (curr->nxt != NULL) { - curr->nxt->prv = curr->prv; - } - if (curr->prv != NULL) { - curr->prv->nxt = curr->nxt; - } - free_cdata(curr->cdata); - free (curr); - } else { - /* The playout buffer is stored in order, so once */ - /* we see one packet that has not yet reached it's */ - /* playout time, we can be sure none of the others */ - /* will have done so... */ - break; - } - curr = temp; + if (playout_buf->frst == NULL && playout_buf->last == NULL) { + /* playout buffer is empty - add new frame */ + playout_buf->frst = create_new_pnode(pkt); + playout_buf->last = playout_buf->frst; + return; } - pbuf_validate(playout_buf); - return; + if (playout_buf->last->rtp_timestamp == pkt->ts) { + /* Packet belongs to last frame in playout_buf this is the */ + /* most likely scenario - although... */ + add_coded_unit(playout_buf->last, pkt); + } else { + if (playout_buf->last->rtp_timestamp < pkt->ts) { + /* Packet belongs to a new frame... */ + tmp = create_new_pnode(pkt); + playout_buf->last->nxt = tmp; + tmp->prv = playout_buf->last; + playout_buf->last = tmp; + } else { + /* Packet belongs to a previous frame... */ + if (playout_buf->frst->rtp_timestamp > pkt->ts) { + debug_msg("A very old packet - discarded\n"); + } else { + debug_msg + ("A packet for a previous frame, but might still be useful\n"); + /* Should probably insert this into the playout buffer here... */ + } + if (pkt->m) { + debug_msg + ("Oops... dropped packet with M bit set\n"); + } + free(pkt); + } + } + pbuf_validate(playout_buf); } -static int -frame_complete(struct pbuf_node *frame) +static void free_cdata(struct coded_data *head) { - /* Return non-zero if the list of coded_data represents a */ - /* complete frame of video. This might have to be passed the */ - /* seqnum of the last packet in the previous frame, too? */ - /* i dont think that would reflect correctly of weather this */ - /* frame is complete or not - however we should check for all*/ - /* the packtes of a frame being present - perhaps we should */ - /* keep a bit vector in pbuf_node? LG. */ - - return (frame->mbit==1); + struct coded_data *tmp; + + while (head != NULL) { + free(head->data); + tmp = head; + head = head->nxt; + free(tmp); + } } -int -pbuf_decode(struct pbuf *playout_buf, struct timeval curr_time, struct video_frame *framebuffer, int i) +void pbuf_remove(struct pbuf *playout_buf, struct timeval curr_time) { - /* Find the first complete frame that has reached it's playout */ - /* time, and decode it into the framebuffer. Mark the frame as */ - /* decoded, but otherwise leave it in the playout buffer. */ - struct pbuf_node *curr; + /* Remove previously decoded frames that have passed their playout */ + /* time from the playout buffer. Incomplete frames that have passed */ + /* their playout time are also discarded. */ - pbuf_validate(playout_buf); + struct pbuf_node *curr, *temp; + + pbuf_validate(playout_buf); curr = playout_buf->frst; while (curr != NULL) { - if (!curr->decoded && tv_gt(curr_time, curr->playout_time)) { - if (frame_complete(curr)) { - decode_frame(curr->cdata, framebuffer); - curr->decoded = 1; - return 1; - } else { - debug_msg("Unable to decode frame due to missing data (RTP TS=%u)\n", curr->rtp_timestamp); - } - } + temp = curr->nxt; + if (tv_gt(curr_time, curr->playout_time)) { + if (curr == playout_buf->frst) { + playout_buf->frst = curr->nxt; + } + if (curr == playout_buf->last) { + playout_buf->last = curr->prv; + } + if (curr->nxt != NULL) { + curr->nxt->prv = curr->prv; + } + if (curr->prv != NULL) { + curr->prv->nxt = curr->nxt; + } + free_cdata(curr->cdata); + free(curr); + } else { + /* The playout buffer is stored in order, so once */ + /* we see one packet that has not yet reached it's */ + /* playout time, we can be sure none of the others */ + /* will have done so... */ + break; + } + curr = temp; + } + + pbuf_validate(playout_buf); + return; +} + +static int frame_complete(struct pbuf_node *frame) +{ + /* Return non-zero if the list of coded_data represents a */ + /* complete frame of video. This might have to be passed the */ + /* seqnum of the last packet in the previous frame, too? */ + /* i dont think that would reflect correctly of weather this */ + /* frame is complete or not - however we should check for all */ + /* the packtes of a frame being present - perhaps we should */ + /* keep a bit vector in pbuf_node? LG. */ + + return (frame->mbit == 1); +} + +int +pbuf_decode(struct pbuf *playout_buf, struct timeval curr_time, + struct video_frame *framebuffer, int i) +{ + /* Find the first complete frame that has reached it's playout */ + /* time, and decode it into the framebuffer. Mark the frame as */ + /* decoded, but otherwise leave it in the playout buffer. */ + struct pbuf_node *curr; + + pbuf_validate(playout_buf); + + curr = playout_buf->frst; + while (curr != NULL) { + if (!curr->decoded && tv_gt(curr_time, curr->playout_time)) { + if (frame_complete(curr)) { + decode_frame(curr->cdata, framebuffer); + curr->decoded = 1; + return 1; + } else { + debug_msg + ("Unable to decode frame due to missing data (RTP TS=%u)\n", + curr->rtp_timestamp); + } + } curr = curr->nxt; } - return 0; + return 0; } #ifdef HAVE_AUDIO int -audio_pbuf_decode(struct pbuf *playout_buf, struct timeval curr_time, audio_frame *buffer) +audio_pbuf_decode(struct pbuf *playout_buf, struct timeval curr_time, + audio_frame * buffer) { - struct pbuf_node *curr; + struct pbuf_node *curr; - pbuf_validate(playout_buf); // should be run in debug mode + pbuf_validate(playout_buf); // should be run in debug mode - curr = playout_buf->frst; - while (curr != NULL){ - if (!curr->decoded) { // FIXME: in the original function (pbuf_decode) is some time comparison - network_buffer_to_audio_frame(buffer, curr->cdata->data->data); - curr->decoded = 1; - return 1; - } - curr = curr->nxt; - } - return 0; + curr = playout_buf->frst; + while (curr != NULL) { + if (!curr->decoded) { // FIXME: in the original function (pbuf_decode) is some time comparison + network_buffer_to_audio_frame(buffer, + curr->cdata->data->data); + curr->decoded = 1; + return 1; + } + curr = curr->nxt; + } + return 0; } -#endif /* HAVE_AUDIO */ +#endif /* HAVE_AUDIO */ diff --git a/ultragrid/src/rtp/ptime.c b/ultragrid/src/rtp/ptime.c index b15a6aa2b..6ed17dac8 100644 --- a/ultragrid/src/rtp/ptime.c +++ b/ultragrid/src/rtp/ptime.c @@ -56,82 +56,77 @@ #include "rtp/ptime.h" #define SKEW_THRESHOLD 1500 -#define W 10 /* Window size for mapping to local timeline. */ - +#define W 10 /* Window size for mapping to local timeline. */ #ifdef NDEF /* Colin's book pg. 178 */ -static uint32_t -adjustment_due_to_skew(uint32_t ts, uint32_t curr_time){ +static uint32_t adjustment_due_to_skew(uint32_t ts, uint32_t curr_time) +{ - static int first_time = 1; - static uint32_t delay_estimate; - static uint32_t active_delay; - int adjustment = 0; - uint32_t d_n = ts - curr_time; + static int first_time = 1; + static uint32_t delay_estimate; + static uint32_t active_delay; + int adjustment = 0; + uint32_t d_n = ts - curr_time; - if (first_time){ + if (first_time) { - first_time = 0; - delay_estimate = d_n; - active_delay = d_n; - }else{ - delay_estimate = (31 * delay_estimate + d_n) / 32.0; - } + first_time = 0; + delay_estimate = d_n; + active_delay = d_n; + } else { + delay_estimate = (31 * delay_estimate + d_n) / 32.0; + } - if (active_delay - delay_estimate > SKEW_THRESHOLD){ - - adjustment = SKEW_THRESHOLD; - active_delay = delay_estimate; - } - if ((double) active_delay - (double) delay_estimate < -SKEW_THRESHOLD){ - adjustment = -SKEW_THRESHOLD; - active_delay = delay_estimate; - } + if (active_delay - delay_estimate > SKEW_THRESHOLD) { - return (uint32_t)((double) active_delay + (double) adjustment); + adjustment = SKEW_THRESHOLD; + active_delay = delay_estimate; + } + if ((double)active_delay - (double)delay_estimate < -SKEW_THRESHOLD) { + adjustment = -SKEW_THRESHOLD; + active_delay = delay_estimate; + } + + return (uint32_t) ((double)active_delay + (double)adjustment); } #endif #ifdef NDEF -static uint32_t -map_local_timeline(uint32_t ts, uint32_t curr_time) -{ - - - static uint32_t d[W]; - static int w = 0; - static int FULL = 0; - uint32_t min; - uint32_t new_difference = ts - curr_time; - int i; - - - d[w++] = new_difference; - - /* Do we have enough records? If so, begin to rewrite oldest first. */ - if (w >= W - 1){ - - FULL = 1; - w = 0; - - } - - min = d[0]; - - if (!FULL){ - for (i = 1 ; i= W - 1) { + + FULL = 1; + w = 0; + + } + + min = d[0]; + + if (!FULL) { + for (i = 1; i < w; i++) + if (d[i] < min) + //if (((d[i] - min) & (1<<15)) != 0) + min = d[i]; + } else + for (i = 1; i < W; i++) + if (d[i] < min) + //if (((d[i] - min) & (1<<15)) != 0) + min = d[i]; + + return (min); } #endif diff --git a/ultragrid/src/rtp/rtp.c b/ultragrid/src/rtp/rtp.c index d24b9fc05..8f2e2ee33 100644 --- a/ultragrid/src/rtp/rtp.c +++ b/ultragrid/src/rtp/rtp.c @@ -83,17 +83,18 @@ */ #define MAX_ENCRYPTION_PAD 16 -static int rijndael_initialize(struct rtp *session, u_char *hash, int hash_len); +static int rijndael_initialize(struct rtp *session, u_char * hash, + int hash_len); static int rijndael_decrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec); + unsigned int size, unsigned char *initVec); static int rijndael_encrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec); + unsigned int size, unsigned char *initVec); -static int des_initialize(struct rtp *session, u_char *hash, int hash_len); +static int des_initialize(struct rtp *session, u_char * hash, int hash_len); static int des_decrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec); + unsigned int size, unsigned char *initVec); static int des_encrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec); + unsigned int size, unsigned char *initVec); #define MAX_DROPOUT 3000 #define MAX_MISORDER 100 @@ -106,7 +107,7 @@ static int des_encrypt(struct rtp *session, unsigned char *data, #define RTP_SEQ_MOD 0x10000 #define RTP_MAX_SDES_LEN 256 -#define RTP_LOWER_LAYER_OVERHEAD 28 /* IPv4 + UDP */ +#define RTP_LOWER_LAYER_OVERHEAD 28 /* IPv4 + UDP */ #define RTCP_SR 200 #define RTCP_RR 201 @@ -117,58 +118,58 @@ static int des_encrypt(struct rtp *session, unsigned char *data, typedef struct { #ifdef WORDS_BIGENDIAN - unsigned short version:2; /* packet type */ - unsigned short p:1; /* padding flag */ - unsigned short count:5; /* varies by payload type */ - unsigned short pt:8; /* payload type */ + unsigned short version:2; /* packet type */ + unsigned short p:1; /* padding flag */ + unsigned short count:5; /* varies by payload type */ + unsigned short pt:8; /* payload type */ #else - unsigned short count:5; /* varies by payload type */ - unsigned short p:1; /* padding flag */ - unsigned short version:2; /* packet type */ - unsigned short pt:8; /* payload type */ + unsigned short count:5; /* varies by payload type */ + unsigned short p:1; /* padding flag */ + unsigned short version:2; /* packet type */ + unsigned short pt:8; /* payload type */ #endif - uint16_t length; /* packet length */ + uint16_t length; /* packet length */ } rtcp_common; typedef struct { - rtcp_common common; - union { - struct { - rtcp_sr sr; - rtcp_rr rr[1]; /* variable-length list */ - } sr; - struct { - uint32_t ssrc; /* source this RTCP packet is coming from */ - rtcp_rr rr[1]; /* variable-length list */ - } rr; - struct { - uint32_t ssrc; /* source this RTCP packet is coming from */ - rtcp_rr rr[1]; /* variable-length list */ - rtcp_rx rx[1]; + rtcp_common common; + union { + struct { + rtcp_sr sr; + rtcp_rr rr[1]; /* variable-length list */ + } sr; + struct { + uint32_t ssrc; /* source this RTCP packet is coming from */ + rtcp_rr rr[1]; /* variable-length list */ + } rr; + struct { + uint32_t ssrc; /* source this RTCP packet is coming from */ + rtcp_rr rr[1]; /* variable-length list */ + rtcp_rx rx[1]; } rx; - struct rtcp_sdes_t { - uint32_t ssrc; - rtcp_sdes_item item[1]; /* list of SDES */ - } sdes; - struct { - uint32_t ssrc[1]; /* list of sources */ - /* can't express the trailing text... */ - } bye; - struct { - uint32_t ssrc; - uint8_t name[4]; - uint8_t data[1]; - } app; - } r; + struct rtcp_sdes_t { + uint32_t ssrc; + rtcp_sdes_item item[1]; /* list of SDES */ + } sdes; + struct { + uint32_t ssrc[1]; /* list of sources */ + /* can't express the trailing text... */ + } bye; + struct { + uint32_t ssrc; + uint8_t name[4]; + uint8_t data[1]; + } app; + } r; } rtcp_t; typedef struct _rtcp_rr_wrapper { - struct _rtcp_rr_wrapper *next; - struct _rtcp_rr_wrapper *prev; - uint32_t reporter_ssrc; - rtcp_rr *rr; - rtcp_rx *rx; - struct timeval *ts; /* Arrival time of this RR */ + struct _rtcp_rr_wrapper *next; + struct _rtcp_rr_wrapper *prev; + uint32_t reporter_ssrc; + rtcp_rr *rr; + rtcp_rx *rx; + struct timeval *ts; /* Arrival time of this RR */ } rtcp_rr_wrapper; /* @@ -176,39 +177,39 @@ typedef struct _rtcp_rr_wrapper { * to make it all work. */ -uint32_t tmp_sec; -uint32_t tmp_frac; +uint32_t tmp_sec; +uint32_t tmp_frac; typedef struct _source { - struct _source *next; - struct _source *prev; - uint32_t ssrc; - char *sdes_cname; - char *sdes_name; - char *sdes_email; - char *sdes_phone; - char *sdes_loc; - char *sdes_tool; - char *sdes_note; - char *sdes_priv; - rtcp_sr *sr; - uint32_t last_sr_sec; - uint32_t last_sr_frac; - struct timeval last_active; - int should_advertise_sdes; /* TRUE if this source is a CSRC which we need to advertise SDES for */ - int sender; - int got_bye; /* TRUE if we've received an RTCP bye from this source */ - uint32_t base_seq; - uint16_t max_seq; - uint32_t bad_seq; - uint32_t cycles; - int received; - int received_prior; - int expected_prior; - int probation; - uint32_t jitter; - uint32_t transit; - uint32_t magic; /* For debugging... */ + struct _source *next; + struct _source *prev; + uint32_t ssrc; + char *sdes_cname; + char *sdes_name; + char *sdes_email; + char *sdes_phone; + char *sdes_loc; + char *sdes_tool; + char *sdes_note; + char *sdes_priv; + rtcp_sr *sr; + uint32_t last_sr_sec; + uint32_t last_sr_frac; + struct timeval last_active; + int should_advertise_sdes; /* TRUE if this source is a CSRC which we need to advertise SDES for */ + int sender; + int got_bye; /* TRUE if we've received an RTCP bye from this source */ + uint32_t base_seq; + uint16_t max_seq; + uint32_t bad_seq; + uint32_t cycles; + int received; + int received_prior; + int expected_prior; + int probation; + uint32_t jitter; + uint32_t transit; + uint32_t magic; /* For debugging... */ } source; /* The size of the hash table used to hold the source database. */ @@ -219,7 +220,7 @@ typedef struct _source { /* of entries that we expect to have in the database and should */ /* be a prime number. Everything continues to work if this is */ /* too low, it just goes slower... for now we assume around 100 */ -/* participants is a sensible limit so we set this to 11. */ +/* participants is a sensible limit so we set this to 11. */ #define RTP_DB_SIZE 11 /* @@ -227,201 +228,206 @@ typedef struct _source { */ typedef struct { - int promiscuous_mode; - int wait_for_rtcp; - int filter_my_packets; - int reuse_bufs; + int promiscuous_mode; + int wait_for_rtcp; + int filter_my_packets; + int reuse_bufs; } options; /* * Encryption function types */ -typedef int (*rtp_encrypt_func)(struct rtp *, unsigned char *data, - unsigned int size, unsigned char *initvec); -typedef int (*rtp_decrypt_func)(struct rtp *, unsigned char *data, - unsigned int size, unsigned char *initvec); +typedef int (*rtp_encrypt_func) (struct rtp *, unsigned char *data, + unsigned int size, unsigned char *initvec); +typedef int (*rtp_decrypt_func) (struct rtp *, unsigned char *data, + unsigned int size, unsigned char *initvec); /* * The "struct rtp" defines an RTP session. */ struct rtp { - socket_udp *rtp_socket; - socket_udp *rtcp_socket; - char *addr; - uint16_t rx_port; - uint16_t tx_port; - int ttl; - uint32_t my_ssrc; - int last_advertised_csrc; - source *db[RTP_DB_SIZE]; - rtcp_rr_wrapper rr[RTP_DB_SIZE][RTP_DB_SIZE]; /* Indexed by [hash(reporter)][hash(reportee)] */ - options *opt; - uint8_t *userdata; - int invalid_rtp_count; - int invalid_rtcp_count; - int bye_count; - int csrc_count; - int ssrc_count; - int ssrc_count_prev; /* ssrc_count at the time we last recalculated our RTCP interval */ - int sender_count; - int initial_rtcp; - int sending_bye; /* TRUE if we're in the process of sending a BYE packet */ - double avg_rtcp_size; - int we_sent; - double rtcp_bw; /* RTCP bandwidth fraction, in octets per second. */ - struct timeval last_update; - struct timeval last_rtp_send_time; - struct timeval last_rtcp_send_time; - struct timeval next_rtcp_send_time; - double rtcp_interval; - int sdes_count_pri; - int sdes_count_sec; - int sdes_count_ter; - uint16_t rtp_seq; - uint32_t rtp_pcount; - uint32_t rtp_bcount; - int tfrc_on; /* indicates TFRC congestion control */ - /* tfrc sender variables */ - uint32_t cmp_rtt; /* rtt as computed by the sender */ - uint16_t new_rtt; /* flag change in value of the RTT */ - /* tfrc recevier variables */ - uint32_t rcv_rtt; /* rtt receiver extracts from rtp packets */ + socket_udp *rtp_socket; + socket_udp *rtcp_socket; + char *addr; + uint16_t rx_port; + uint16_t tx_port; + int ttl; + uint32_t my_ssrc; + int last_advertised_csrc; + source *db[RTP_DB_SIZE]; + rtcp_rr_wrapper rr[RTP_DB_SIZE][RTP_DB_SIZE]; /* Indexed by [hash(reporter)][hash(reportee)] */ + options *opt; + uint8_t *userdata; + int invalid_rtp_count; + int invalid_rtcp_count; + int bye_count; + int csrc_count; + int ssrc_count; + int ssrc_count_prev; /* ssrc_count at the time we last recalculated our RTCP interval */ + int sender_count; + int initial_rtcp; + int sending_bye; /* TRUE if we're in the process of sending a BYE packet */ + double avg_rtcp_size; + int we_sent; + double rtcp_bw; /* RTCP bandwidth fraction, in octets per second. */ + struct timeval last_update; + struct timeval last_rtp_send_time; + struct timeval last_rtcp_send_time; + struct timeval next_rtcp_send_time; + double rtcp_interval; + int sdes_count_pri; + int sdes_count_sec; + int sdes_count_ter; + uint16_t rtp_seq; + uint32_t rtp_pcount; + uint32_t rtp_bcount; + int tfrc_on; /* indicates TFRC congestion control */ + /* tfrc sender variables */ + uint32_t cmp_rtt; /* rtt as computed by the sender */ + uint16_t new_rtt; /* flag change in value of the RTT */ + /* tfrc recevier variables */ + uint32_t rcv_rtt; /* rtt receiver extracts from rtp packets */ - char *encryption_algorithm; - int encryption_enabled; - rtp_encrypt_func encrypt_func; - rtp_decrypt_func decrypt_func; - int encryption_pad_length; - union { - struct { - keyInstance keyInstEncrypt; - keyInstance keyInstDecrypt; - cipherInstance cipherInst; - } rijndael; - struct { - char *encryption_key; - } des; - } crypto_state; - rtp_callback callback; - struct msghdr *mhdr; - uint32_t magic; /* For debugging... */ + char *encryption_algorithm; + int encryption_enabled; + rtp_encrypt_func encrypt_func; + rtp_decrypt_func decrypt_func; + int encryption_pad_length; + union { + struct { + keyInstance keyInstEncrypt; + keyInstance keyInstDecrypt; + cipherInstance cipherInst; + } rijndael; + struct { + char *encryption_key; + } des; + } crypto_state; + rtp_callback callback; + struct msghdr *mhdr; + uint32_t magic; /* For debugging... */ }; -static inline int -filter_event(struct rtp *session, uint32_t ssrc) +static inline int filter_event(struct rtp *session, uint32_t ssrc) { - return session->opt->filter_my_packets && (ssrc == rtp_my_ssrc(session)); + return session->opt->filter_my_packets + && (ssrc == rtp_my_ssrc(session)); } static uint32_t next_csrc(struct rtp *session) { - /* This returns each source marked "should_advertise_sdes" in turn. */ - int chain, cc; - source *s; + /* This returns each source marked "should_advertise_sdes" in turn. */ + int chain, cc; + source *s; - cc = 0; - for (chain = 0; chain < RTP_DB_SIZE; chain++) { - /* Check that the linked lists making up the chains in */ - /* the hash table are correctly linked together... */ - for (s = session->db[chain]; s != NULL; s = s->next) { - if (s->should_advertise_sdes) { - if (cc == session->last_advertised_csrc) { + cc = 0; + for (chain = 0; chain < RTP_DB_SIZE; chain++) { + /* Check that the linked lists making up the chains in */ + /* the hash table are correctly linked together... */ + for (s = session->db[chain]; s != NULL; s = s->next) { + if (s->should_advertise_sdes) { + if (cc == session->last_advertised_csrc) { session->last_advertised_csrc++; - if (session->last_advertised_csrc == session->csrc_count) { - session->last_advertised_csrc = 0; + if (session->last_advertised_csrc == + session->csrc_count) { + session->last_advertised_csrc = + 0; } - return s->ssrc; - } else { - cc++; - } - } - } - } - /* We should never get here... */ - abort(); + return s->ssrc; + } else { + cc++; + } + } + } + } + /* We should never get here... */ + abort(); } -static inline int -ssrc_hash(uint32_t ssrc) +static inline int ssrc_hash(uint32_t ssrc) { - /* Hash from an ssrc to a position in the source database. */ - /* Assumes that ssrc values are uniformly distributed, which */ - /* should be true but probably isn't (Rosenberg has reported */ - /* that many implementations generate ssrc values which are */ - /* not uniformly distributed over the space, and the H.323 */ - /* spec requires that they are non-uniformly distributed). */ - /* This routine is written as a function rather than inline */ - /* code to allow it to be made smart in future: probably we */ - /* should run MD5 on the ssrc and derive a hash value from */ - /* that, to ensure it's more uniformly distributed? */ - return ssrc % RTP_DB_SIZE; + /* Hash from an ssrc to a position in the source database. */ + /* Assumes that ssrc values are uniformly distributed, which */ + /* should be true but probably isn't (Rosenberg has reported */ + /* that many implementations generate ssrc values which are */ + /* not uniformly distributed over the space, and the H.323 */ + /* spec requires that they are non-uniformly distributed). */ + /* This routine is written as a function rather than inline */ + /* code to allow it to be made smart in future: probably we */ + /* should run MD5 on the ssrc and derive a hash value from */ + /* that, to ensure it's more uniformly distributed? */ + return ssrc % RTP_DB_SIZE; } -static void insert_rr(struct rtp *session, uint32_t reporter_ssrc, rtcp_rr *rr, rtcp_rx *rx) +static void insert_rr(struct rtp *session, uint32_t reporter_ssrc, rtcp_rr * rr, + rtcp_rx * rx) { /* Insert the reception report into the receiver report */ /* database. This database is a two dimensional table of */ /* rr_wrappers indexed by hashes of reporter_ssrc and */ /* reportee_src. The rr_wrappers in the database are */ /* sentinels to reduce conditions in list operations. */ - /* The ts is used to determine when to timeout this rr. */ + /* The ts is used to determine when to timeout this rr. */ rtcp_rr_wrapper *cur, *start; start = &session->rr[ssrc_hash(reporter_ssrc)][ssrc_hash(rr->ssrc)]; - cur = start->next; + cur = start->next; while (cur != start) { - if (cur->reporter_ssrc == reporter_ssrc && cur->rr->ssrc == rr->ssrc) { + if (cur->reporter_ssrc == reporter_ssrc + && cur->rr->ssrc == rr->ssrc) { /* Replace existing entry in the database */ free(cur->rr); - free(cur->ts); - if (cur->rx) free (cur->rx); + free(cur->ts); + if (cur->rx) + free(cur->rx); cur->rr = rr; - cur->rx = rx; - cur->ts = malloc(sizeof(struct timeval)); - gettimeofday(cur->ts, NULL); + cur->rx = rx; + cur->ts = malloc(sizeof(struct timeval)); + gettimeofday(cur->ts, NULL); return; } cur = cur->next; } - + /* No entry in the database so create one now. */ - cur = (rtcp_rr_wrapper*)malloc(sizeof(rtcp_rr_wrapper)); + cur = (rtcp_rr_wrapper *) malloc(sizeof(rtcp_rr_wrapper)); cur->reporter_ssrc = reporter_ssrc; cur->rr = rr; - cur->rx = rx; - cur->ts = malloc(sizeof(struct timeval)); - gettimeofday(cur->ts, NULL); + cur->rx = rx; + cur->ts = malloc(sizeof(struct timeval)); + gettimeofday(cur->ts, NULL); /* Fix links */ - cur->next = start->next; + cur->next = start->next; cur->next->prev = cur; - cur->prev = start; + cur->prev = start; cur->prev->next = cur; - debug_msg("Created new rr entry for 0x%08lx from source 0x%08lx\n", rr->ssrc, reporter_ssrc); + debug_msg("Created new rr entry for 0x%08lx from source 0x%08lx\n", + rr->ssrc, reporter_ssrc); return; } static void remove_rr(struct rtp *session, uint32_t ssrc) { - /* Remove any RRs from "s" which refer to "ssrc" as either */ + /* Remove any RRs from "s" which refer to "ssrc" as either */ /* reporter or reportee. */ rtcp_rr_wrapper *start, *cur, *tmp; int i; /* Remove rows, i.e. ssrc == reporter_ssrc */ - for(i = 0; i < RTP_DB_SIZE; i++) { + for (i = 0; i < RTP_DB_SIZE; i++) { start = &session->rr[ssrc_hash(ssrc)][i]; - cur = start->next; + cur = start->next; while (cur != start) { if (cur->reporter_ssrc == ssrc) { tmp = cur; cur = cur->prev; tmp->prev->next = tmp->next; tmp->next->prev = tmp->prev; - free(tmp->ts); + free(tmp->ts); free(tmp->rr); free(tmp); } @@ -430,16 +436,16 @@ static void remove_rr(struct rtp *session, uint32_t ssrc) } /* Remove columns, i.e. ssrc == reporter_ssrc */ - for(i = 0; i < RTP_DB_SIZE; i++) { + for (i = 0; i < RTP_DB_SIZE; i++) { start = &session->rr[i][ssrc_hash(ssrc)]; - cur = start->next; + cur = start->next; while (cur != start) { if (cur->rr->ssrc == ssrc) { tmp = cur; cur = cur->prev; tmp->prev->next = tmp->next; tmp->next->prev = tmp->prev; - free(tmp->ts); + free(tmp->ts); free(tmp->rr); free(tmp); } @@ -450,49 +456,54 @@ static void remove_rr(struct rtp *session, uint32_t ssrc) static void timeout_rr(struct rtp *session, struct timeval *curr_ts) { - /* Timeout any reception reports which have been in the database for more than 3 */ - /* times the RTCP reporting interval without refresh. */ + /* Timeout any reception reports which have been in the database for more than 3 */ + /* times the RTCP reporting interval without refresh. */ rtcp_rr_wrapper *start, *cur, *tmp; - rtp_event event; - int i, j; + rtp_event event; + int i, j; - for(i = 0; i < RTP_DB_SIZE; i++) { - for(j = 0; j < RTP_DB_SIZE; j++) { - start = &session->rr[i][j]; - cur = start->next; - while (cur != start) { - if (tv_diff(*curr_ts, *(cur->ts)) > (session->rtcp_interval * 3)) { - /* Signal the application... */ - if (!filter_event(session, cur->reporter_ssrc)) { - event.ssrc = cur->reporter_ssrc; - event.type = RR_TIMEOUT; - event.data = cur->rr; - session->callback(session, &event); - } - /* Delete this reception report... */ - tmp = cur; - cur = cur->prev; - tmp->prev->next = tmp->next; - tmp->next->prev = tmp->prev; - free(tmp->ts); - free(tmp->rr); - free(tmp); - } - cur = cur->next; - } - } - } + for (i = 0; i < RTP_DB_SIZE; i++) { + for (j = 0; j < RTP_DB_SIZE; j++) { + start = &session->rr[i][j]; + cur = start->next; + while (cur != start) { + if (tv_diff(*curr_ts, *(cur->ts)) > + (session->rtcp_interval * 3)) { + /* Signal the application... */ + if (!filter_event + (session, cur->reporter_ssrc)) { + event.ssrc = cur->reporter_ssrc; + event.type = RR_TIMEOUT; + event.data = cur->rr; + session->callback(session, + &event); + } + /* Delete this reception report... */ + tmp = cur; + cur = cur->prev; + tmp->prev->next = tmp->next; + tmp->next->prev = tmp->prev; + free(tmp->ts); + free(tmp->rr); + free(tmp); + } + cur = cur->next; + } + } + } } -static const rtcp_rr* get_rr(struct rtp *session, uint32_t reporter_ssrc, uint32_t reportee_ssrc) +static const rtcp_rr *get_rr(struct rtp *session, uint32_t reporter_ssrc, + uint32_t reportee_ssrc) { rtcp_rr_wrapper *cur, *start; - start = &session->rr[ssrc_hash(reporter_ssrc)][ssrc_hash(reportee_ssrc)]; - cur = start->next; + start = + &session->rr[ssrc_hash(reporter_ssrc)][ssrc_hash(reportee_ssrc)]; + cur = start->next; while (cur != start) { if (cur->reporter_ssrc == reporter_ssrc && - cur->rr->ssrc == reportee_ssrc) { + cur->rr->ssrc == reportee_ssrc) { return cur->rr; } cur = cur->next; @@ -500,390 +511,398 @@ static const rtcp_rr* get_rr(struct rtp *session, uint32_t reporter_ssrc, uint32 return NULL; } -static inline void -check_source(source *s) +static inline void check_source(source * s) { #ifdef DEBUG - assert(s != NULL); - assert(s->magic == 0xc001feed); + assert(s != NULL); + assert(s->magic == 0xc001feed); #else - UNUSED(s); + UNUSED(s); #endif } -static inline void -check_database(struct rtp *session) +static inline void check_database(struct rtp *session) { - /* This routine performs a sanity check on the database. */ - /* This should not call any of the other routines which */ - /* manipulate the database, to avoid common failures. */ + /* This routine performs a sanity check on the database. */ + /* This should not call any of the other routines which */ + /* manipulate the database, to avoid common failures. */ #ifdef DEBUG - source *s; - int source_count; - int chain; + source *s; + int source_count; + int chain; - assert(session != NULL); - assert(session->magic == 0xfeedface); - /* Check that we have a database entry for our ssrc... */ - /* We only do this check if ssrc_count > 0 since it is */ - /* performed during initialisation whilst creating the */ - /* source entry for my_ssrc. */ - if (session->ssrc_count > 0) { - for (s = session->db[ssrc_hash(session->my_ssrc)]; s != NULL; s = s->next) { - if (s->ssrc == session->my_ssrc) { - break; - } - } - assert(s != NULL); - } + assert(session != NULL); + assert(session->magic == 0xfeedface); + /* Check that we have a database entry for our ssrc... */ + /* We only do this check if ssrc_count > 0 since it is */ + /* performed during initialisation whilst creating the */ + /* source entry for my_ssrc. */ + if (session->ssrc_count > 0) { + for (s = session->db[ssrc_hash(session->my_ssrc)]; s != NULL; + s = s->next) { + if (s->ssrc == session->my_ssrc) { + break; + } + } + assert(s != NULL); + } - source_count = 0; - for (chain = 0; chain < RTP_DB_SIZE; chain++) { - /* Check that the linked lists making up the chains in */ - /* the hash table are correctly linked together... */ - for (s = session->db[chain]; s != NULL; s = s->next) { - check_source(s); - source_count++; - if (s->prev == NULL) { - assert(s == session->db[chain]); - } else { - assert(s->prev->next == s); - } - if (s->next != NULL) { - assert(s->next->prev == s); - } - /* Check that the SR is for this source... */ - if (s->sr != NULL) { - assert(s->sr->ssrc == s->ssrc); - } - } - } - /* Check that the number of entries in the hash table */ - /* matches session->ssrc_count */ - assert(source_count == session->ssrc_count); -#else - UNUSED(session); + source_count = 0; + for (chain = 0; chain < RTP_DB_SIZE; chain++) { + /* Check that the linked lists making up the chains in */ + /* the hash table are correctly linked together... */ + for (s = session->db[chain]; s != NULL; s = s->next) { + check_source(s); + source_count++; + if (s->prev == NULL) { + assert(s == session->db[chain]); + } else { + assert(s->prev->next == s); + } + if (s->next != NULL) { + assert(s->next->prev == s); + } + /* Check that the SR is for this source... */ + if (s->sr != NULL) { + assert(s->sr->ssrc == s->ssrc); + } + } + } + /* Check that the number of entries in the hash table */ + /* matches session->ssrc_count */ + assert(source_count == session->ssrc_count); +#else + UNUSED(session); #endif } -static inline source * -get_source(struct rtp *session, uint32_t ssrc) +static inline source *get_source(struct rtp *session, uint32_t ssrc) { - source *s; + source *s; - check_database(session); - for (s = session->db[ssrc_hash(ssrc)]; s != NULL; s = s->next) { - if (s->ssrc == ssrc) { - check_source(s); - return s; - } - } - return NULL; + check_database(session); + for (s = session->db[ssrc_hash(ssrc)]; s != NULL; s = s->next) { + if (s->ssrc == ssrc) { + check_source(s); + return s; + } + } + return NULL; } -static source * -really_create_source(struct rtp *session, uint32_t ssrc, int probation, source *s) +static source *really_create_source(struct rtp *session, uint32_t ssrc, + int probation, source * s) { - /* Create a new source entry, and add it to the database. */ - /* The database is a hash table, using the separate chaining */ - /* algorithm. */ - rtp_event event; - int h; + /* Create a new source entry, and add it to the database. */ + /* The database is a hash table, using the separate chaining */ + /* algorithm. */ + rtp_event event; + int h; - check_database(session); - /* This is a new source, we have to create it... */ - h = ssrc_hash(ssrc); - s = (source *) malloc(sizeof(source)); - memset(s, 0, sizeof(source)); - s->magic = 0xc001feed; - s->next = session->db[h]; - s->ssrc = ssrc; - if (probation) { - /* This is a probationary source, which only counts as */ - /* valid once several consecutive packets are received */ - s->probation = -1; - } else { - s->probation = 0; - } + check_database(session); + /* This is a new source, we have to create it... */ + h = ssrc_hash(ssrc); + s = (source *) malloc(sizeof(source)); + memset(s, 0, sizeof(source)); + s->magic = 0xc001feed; + s->next = session->db[h]; + s->ssrc = ssrc; + if (probation) { + /* This is a probationary source, which only counts as */ + /* valid once several consecutive packets are received */ + s->probation = -1; + } else { + s->probation = 0; + } - gettimeofday(&(s->last_active), NULL); - /* Now, add it to the database... */ - if (session->db[h] != NULL) { - session->db[h]->prev = s; - } - session->db[ssrc_hash(ssrc)] = s; - session->ssrc_count++; - check_database(session); + gettimeofday(&(s->last_active), NULL); + /* Now, add it to the database... */ + if (session->db[h] != NULL) { + session->db[h]->prev = s; + } + session->db[ssrc_hash(ssrc)] = s; + session->ssrc_count++; + check_database(session); - debug_msg("Created database entry 0x%08x (%d sources)\n", ssrc, session->ssrc_count); + debug_msg("Created database entry 0x%08x (%d sources)\n", ssrc, + session->ssrc_count); if (ssrc != session->my_ssrc) { /* Do not send during rtp_init since application cannot map the address */ /* of the rtp session to anything since rtp_init has not returned yet. */ - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = SOURCE_CREATED; - event.data = NULL; - session->callback(session, &event); - } + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = SOURCE_CREATED; + event.data = NULL; + session->callback(session, &event); + } } - return s; + return s; } -static inline source * -create_source(struct rtp *session, uint32_t ssrc, int probation) +static inline source *create_source(struct rtp *session, uint32_t ssrc, + int probation) { - source *s = get_source(session, ssrc); - if (s == NULL) { - return really_create_source(session, ssrc, probation, s); - } - /* Source is already in the database... Mark it as */ - /* active and exit (this is the common case...) */ - gettimeofday(&(s->last_active), NULL); - return s; + source *s = get_source(session, ssrc); + if (s == NULL) { + return really_create_source(session, ssrc, probation, s); + } + /* Source is already in the database... Mark it as */ + /* active and exit (this is the common case...) */ + gettimeofday(&(s->last_active), NULL); + return s; } static void delete_source(struct rtp *session, uint32_t ssrc) { - /* Remove a source from the RTP database... */ - source *s = get_source(session, ssrc); - int h = ssrc_hash(ssrc); - rtp_event event; - struct timeval event_ts; + /* Remove a source from the RTP database... */ + source *s = get_source(session, ssrc); + int h = ssrc_hash(ssrc); + rtp_event event; + struct timeval event_ts; - assert(s != NULL); /* Deleting a source which doesn't exist is an error... */ + assert(s != NULL); /* Deleting a source which doesn't exist is an error... */ - gettimeofday(&event_ts, NULL); + gettimeofday(&event_ts, NULL); - check_source(s); - check_database(session); - if (session->db[h] == s) { - /* It's the first entry in this chain... */ - session->db[h] = s->next; - if (s->next != NULL) { - s->next->prev = NULL; - } - } else { - assert(s->prev != NULL); /* Else it would be the first in the chain... */ - s->prev->next = s->next; - if (s->next != NULL) { - s->next->prev = s->prev; - } - } - /* Free the memory allocated to a source... */ - if (s->sdes_cname != NULL) free(s->sdes_cname); - if (s->sdes_name != NULL) free(s->sdes_name); - if (s->sdes_email != NULL) free(s->sdes_email); - if (s->sdes_phone != NULL) free(s->sdes_phone); - if (s->sdes_loc != NULL) free(s->sdes_loc); - if (s->sdes_tool != NULL) free(s->sdes_tool); - if (s->sdes_note != NULL) free(s->sdes_note); - if (s->sdes_priv != NULL) free(s->sdes_priv); - if (s->sr != NULL) free(s->sr); + check_source(s); + check_database(session); + if (session->db[h] == s) { + /* It's the first entry in this chain... */ + session->db[h] = s->next; + if (s->next != NULL) { + s->next->prev = NULL; + } + } else { + assert(s->prev != NULL); /* Else it would be the first in the chain... */ + s->prev->next = s->next; + if (s->next != NULL) { + s->next->prev = s->prev; + } + } + /* Free the memory allocated to a source... */ + if (s->sdes_cname != NULL) + free(s->sdes_cname); + if (s->sdes_name != NULL) + free(s->sdes_name); + if (s->sdes_email != NULL) + free(s->sdes_email); + if (s->sdes_phone != NULL) + free(s->sdes_phone); + if (s->sdes_loc != NULL) + free(s->sdes_loc); + if (s->sdes_tool != NULL) + free(s->sdes_tool); + if (s->sdes_note != NULL) + free(s->sdes_note); + if (s->sdes_priv != NULL) + free(s->sdes_priv); + if (s->sr != NULL) + free(s->sr); - remove_rr(session, ssrc); + remove_rr(session, ssrc); - /* Reduce our SSRC count, and perform reverse reconsideration on the RTCP */ - /* reporting interval (draft-ietf-avt-rtp-new-05.txt, section 6.3.4). To */ - /* make the transmission rate of RTCP packets more adaptive to changes in */ - /* group membership, the following "reverse reconsideration" algorithm */ - /* SHOULD be executed when a BYE packet is received that reduces members */ - /* to a value less than pmembers: */ - /* o The value for tn is updated according to the following formula: */ - /* tn = tc + (members/pmembers)(tn - tc) */ - /* o The value for tp is updated according the following formula: */ - /* tp = tc - (members/pmembers)(tc - tp). */ - /* o The next RTCP packet is rescheduled for transmission at time tn, */ - /* which is now earlier. */ - /* o The value of pmembers is set equal to members. */ - session->ssrc_count--; - if (session->ssrc_count < session->ssrc_count_prev) { - gettimeofday(&(session->next_rtcp_send_time), NULL); - gettimeofday(&(session->last_rtcp_send_time), NULL); - tv_add(&(session->next_rtcp_send_time), (session->ssrc_count / session->ssrc_count_prev) - * tv_diff(session->next_rtcp_send_time, event_ts)); - tv_add(&(session->last_rtcp_send_time), - ((session->ssrc_count / session->ssrc_count_prev) - * tv_diff(event_ts, session->last_rtcp_send_time))); - session->ssrc_count_prev = session->ssrc_count; - } + /* Reduce our SSRC count, and perform reverse reconsideration on the RTCP */ + /* reporting interval (draft-ietf-avt-rtp-new-05.txt, section 6.3.4). To */ + /* make the transmission rate of RTCP packets more adaptive to changes in */ + /* group membership, the following "reverse reconsideration" algorithm */ + /* SHOULD be executed when a BYE packet is received that reduces members */ + /* to a value less than pmembers: */ + /* o The value for tn is updated according to the following formula: */ + /* tn = tc + (members/pmembers)(tn - tc) */ + /* o The value for tp is updated according the following formula: */ + /* tp = tc - (members/pmembers)(tc - tp). */ + /* o The next RTCP packet is rescheduled for transmission at time tn, */ + /* which is now earlier. */ + /* o The value of pmembers is set equal to members. */ + session->ssrc_count--; + if (session->ssrc_count < session->ssrc_count_prev) { + gettimeofday(&(session->next_rtcp_send_time), NULL); + gettimeofday(&(session->last_rtcp_send_time), NULL); + tv_add(&(session->next_rtcp_send_time), + (session->ssrc_count / session->ssrc_count_prev) + * tv_diff(session->next_rtcp_send_time, event_ts)); + tv_add(&(session->last_rtcp_send_time), + -((session->ssrc_count / session->ssrc_count_prev) + * tv_diff(event_ts, session->last_rtcp_send_time))); + session->ssrc_count_prev = session->ssrc_count; + } - /* Reduce our csrc count... */ - if (s->should_advertise_sdes == TRUE) { - session->csrc_count--; - } - if (session->last_advertised_csrc == session->csrc_count) { - session->last_advertised_csrc = 0; - } + /* Reduce our csrc count... */ + if (s->should_advertise_sdes == TRUE) { + session->csrc_count--; + } + if (session->last_advertised_csrc == session->csrc_count) { + session->last_advertised_csrc = 0; + } - /* Signal to the application that this source is dead... */ - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = SOURCE_DELETED; - event.data = NULL; - session->callback(session, &event); - } + /* Signal to the application that this source is dead... */ + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = SOURCE_DELETED; + event.data = NULL; + session->callback(session, &event); + } free(s); - check_database(session); + check_database(session); } -static inline void -init_seq(source *s, uint16_t seq) +static inline void init_seq(source * s, uint16_t seq) { - /* Taken from draft-ietf-avt-rtp-new-01.txt */ - check_source(s); - s->base_seq = seq; - s->max_seq = seq; - s->bad_seq = RTP_SEQ_MOD + 1; - s->cycles = 0; - s->received = 0; - s->received_prior = 0; - s->expected_prior = 0; + /* Taken from draft-ietf-avt-rtp-new-01.txt */ + check_source(s); + s->base_seq = seq; + s->max_seq = seq; + s->bad_seq = RTP_SEQ_MOD + 1; + s->cycles = 0; + s->received = 0; + s->received_prior = 0; + s->expected_prior = 0; } -static int -update_seq(source *s, uint16_t seq) +static int update_seq(source * s, uint16_t seq) { - /* Taken from draft-ietf-avt-rtp-new-01.txt */ - uint16_t udelta = seq - s->max_seq; + /* Taken from draft-ietf-avt-rtp-new-01.txt */ + uint16_t udelta = seq - s->max_seq; - /* - * Source is not valid until MIN_SEQUENTIAL packets with - * sequential sequence numbers have been received. - */ - check_source(s); - if (s->probation) { - /* packet is in sequence */ - if (seq == s->max_seq + 1) { - s->probation--; - s->max_seq = seq; - if (s->probation == 0) { - init_seq(s, seq); - s->received++; - return 1; - } - } else { - s->probation = MIN_SEQUENTIAL - 1; - s->max_seq = seq; - } - return 0; - } else if (udelta < MAX_DROPOUT) { - /* in order, with permissible gap */ - if (seq < s->max_seq) { - /* - * Sequence number wrapped - count another 64K cycle. - */ - s->cycles += RTP_SEQ_MOD; - } - s->max_seq = seq; - } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { - /* the sequence number made a very large jump */ - if (seq == s->bad_seq) { - /* - * Two sequential packets -- assume that the other side - * restarted without telling us so just re-sync - * (i.e., pretend this was the first packet). - */ - init_seq(s, seq); - } else { - s->bad_seq = (seq + 1) & (RTP_SEQ_MOD-1); - return 0; - } - } else { - /* duplicate or reordered packet */ - } - s->received++; - return 1; + /* + * Source is not valid until MIN_SEQUENTIAL packets with + * sequential sequence numbers have been received. + */ + check_source(s); + if (s->probation) { + /* packet is in sequence */ + if (seq == s->max_seq + 1) { + s->probation--; + s->max_seq = seq; + if (s->probation == 0) { + init_seq(s, seq); + s->received++; + return 1; + } + } else { + s->probation = MIN_SEQUENTIAL - 1; + s->max_seq = seq; + } + return 0; + } else if (udelta < MAX_DROPOUT) { + /* in order, with permissible gap */ + if (seq < s->max_seq) { + /* + * Sequence number wrapped - count another 64K cycle. + */ + s->cycles += RTP_SEQ_MOD; + } + s->max_seq = seq; + } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { + /* the sequence number made a very large jump */ + if (seq == s->bad_seq) { + /* + * Two sequential packets -- assume that the other side + * restarted without telling us so just re-sync + * (i.e., pretend this was the first packet). + */ + init_seq(s, seq); + } else { + s->bad_seq = (seq + 1) & (RTP_SEQ_MOD - 1); + return 0; + } + } else { + /* duplicate or reordered packet */ + } + s->received++; + return 1; } -static double -rtcp_interval(struct rtp *session) +static double rtcp_interval(struct rtp *session) { - /* Minimum average time between RTCP packets from this site (in */ - /* seconds). This time prevents the reports from `clumping' when */ - /* sessions are small and the law of large numbers isn't helping */ - /* to smooth out the traffic. It also keeps the report interval */ - /* from becoming ridiculously small during transient outages like */ - /* a network partition. */ - double const RTCP_MIN_TIME = 5.0; - /* Fraction of the RTCP bandwidth to be shared among active */ - /* senders. (This fraction was chosen so that in a typical */ - /* session with one or two active senders, the computed report */ - /* time would be roughly equal to the minimum report time so that */ - /* we don't unnecessarily slow down receiver reports.) The */ - /* receiver fraction must be 1 - the sender fraction. */ - double const RTCP_SENDER_BW_FRACTION = 0.25; - double const RTCP_RCVR_BW_FRACTION = (1-RTCP_SENDER_BW_FRACTION); - /* To compensate for "unconditional reconsideration" converging */ - /* to a value below the intended average. */ - double const COMPENSATION = 2.71828 - 1.5; + /* Minimum average time between RTCP packets from this site (in */ + /* seconds). This time prevents the reports from `clumping' when */ + /* sessions are small and the law of large numbers isn't helping */ + /* to smooth out the traffic. It also keeps the report interval */ + /* from becoming ridiculously small during transient outages like */ + /* a network partition. */ + double const RTCP_MIN_TIME = 5.0; + /* Fraction of the RTCP bandwidth to be shared among active */ + /* senders. (This fraction was chosen so that in a typical */ + /* session with one or two active senders, the computed report */ + /* time would be roughly equal to the minimum report time so that */ + /* we don't unnecessarily slow down receiver reports.) The */ + /* receiver fraction must be 1 - the sender fraction. */ + double const RTCP_SENDER_BW_FRACTION = 0.25; + double const RTCP_RCVR_BW_FRACTION = (1 - RTCP_SENDER_BW_FRACTION); + /* To compensate for "unconditional reconsideration" converging */ + /* to a value below the intended average. */ + double const COMPENSATION = 2.71828 - 1.5; - double t; /* interval */ - double rtcp_min_time = RTCP_MIN_TIME; - int n; /* no. of members for computation */ - double rtcp_bw = session->rtcp_bw; + double t; /* interval */ + double rtcp_min_time = RTCP_MIN_TIME; + int n; /* no. of members for computation */ + double rtcp_bw = session->rtcp_bw; - /* Very first call at application start-up uses half the min */ - /* delay for quicker notification while still allowing some time */ - /* before reporting for randomization and to learn about other */ - /* sources so the report interval will converge to the correct */ - /* interval more quickly. */ - if (session->initial_rtcp) { - rtcp_min_time /= 2; - } + /* Very first call at application start-up uses half the min */ + /* delay for quicker notification while still allowing some time */ + /* before reporting for randomization and to learn about other */ + /* sources so the report interval will converge to the correct */ + /* interval more quickly. */ + if (session->initial_rtcp) { + rtcp_min_time /= 2; + } - /* If there were active senders, give them at least a minimum */ - /* share of the RTCP bandwidth. Otherwise all participants share */ - /* the RTCP bandwidth equally. */ - if (session->sending_bye) { - n = session->bye_count; - } else { - n = session->ssrc_count; - } - if (session->sender_count > 0 && session->sender_count < n * RTCP_SENDER_BW_FRACTION) { - if (session->we_sent) { - rtcp_bw *= RTCP_SENDER_BW_FRACTION; - n = session->sender_count; - } else { - rtcp_bw *= RTCP_RCVR_BW_FRACTION; - n -= session->sender_count; - } - } + /* If there were active senders, give them at least a minimum */ + /* share of the RTCP bandwidth. Otherwise all participants share */ + /* the RTCP bandwidth equally. */ + if (session->sending_bye) { + n = session->bye_count; + } else { + n = session->ssrc_count; + } + if (session->sender_count > 0 + && session->sender_count < n * RTCP_SENDER_BW_FRACTION) { + if (session->we_sent) { + rtcp_bw *= RTCP_SENDER_BW_FRACTION; + n = session->sender_count; + } else { + rtcp_bw *= RTCP_RCVR_BW_FRACTION; + n -= session->sender_count; + } + } - /* The effective number of sites times the average packet size is */ - /* the total number of octets sent when each site sends a report. */ - /* Dividing this by the effective bandwidth gives the time */ - /* interval over which those packets must be sent in order to */ - /* meet the bandwidth target, with a minimum enforced. In that */ - /* time interval we send one report so this time is also our */ - /* average time between reports. */ - t = session->avg_rtcp_size * n / rtcp_bw; - if (t < rtcp_min_time) { - t = rtcp_min_time; - } - session->rtcp_interval = t; + /* The effective number of sites times the average packet size is */ + /* the total number of octets sent when each site sends a report. */ + /* Dividing this by the effective bandwidth gives the time */ + /* interval over which those packets must be sent in order to */ + /* meet the bandwidth target, with a minimum enforced. In that */ + /* time interval we send one report so this time is also our */ + /* average time between reports. */ + t = session->avg_rtcp_size * n / rtcp_bw; + if (t < rtcp_min_time) { + t = rtcp_min_time; + } + session->rtcp_interval = t; - /* To avoid traffic bursts from unintended synchronization with */ - /* other sites, we then pick our actual next report interval as a */ - /* random number uniformly distributed between 0.5*t and 1.5*t. */ - return (t * (drand48() + 0.5)) / COMPENSATION; + /* To avoid traffic bursts from unintended synchronization with */ + /* other sites, we then pick our actual next report interval as a */ + /* random number uniformly distributed between 0.5*t and 1.5*t. */ + return (t * (drand48() + 0.5)) / COMPENSATION; } #define MAXCNAMELEN 255 -static char *get_cname(socket_udp *s) +static char *get_cname(socket_udp * s) { /* Set the CNAME. This is "user@hostname" or just "hostname" if the username cannot be found. */ - const char *hname; - char *uname; - char *cname; + const char *hname; + char *uname; + char *cname; #ifndef WIN32 - struct passwd *pwent; + struct passwd *pwent; #else char *name; - int namelen; + int namelen; #endif - cname = (char *) malloc(MAXCNAMELEN + 1); + cname = (char *)malloc(MAXCNAMELEN + 1); cname[0] = '\0'; /* First, fill in the username... */ @@ -892,7 +911,7 @@ static char *get_cname(socket_udp *s) namelen = 0; GetUserName(NULL, &namelen); if (namelen > 0) { - name = (char*)malloc(namelen+1); + name = (char *)malloc(namelen + 1); GetUserName(name, &namelen); } else { uname = getenv("USER"); @@ -906,36 +925,35 @@ static char *get_cname(socket_udp *s) free(name); } #else - uname = NULL; + uname = NULL; pwent = getpwuid(getuid()); - if (pwent != NULL) { - uname = pwent->pw_name; - } + if (pwent != NULL) { + uname = pwent->pw_name; + } if (uname != NULL) { strncpy(cname, uname, MAXCNAMELEN - 1); strcat(cname, "@"); } - #endif - + /* Now the hostname. Must be dotted-quad IP address. */ hname = udp_host_addr(s); - if (hname == NULL) { - /* If we can't get our IP address we use the loopback address... */ - /* This is horrible, but it stops the code from failing. */ - hname = "127.0.0.1"; - } + if (hname == NULL) { + /* If we can't get our IP address we use the loopback address... */ + /* This is horrible, but it stops the code from failing. */ + hname = "127.0.0.1"; + } strncpy(cname + strlen(cname), hname, MAXCNAMELEN - strlen(cname)); return cname; } static void init_opt(struct rtp *session) { - /* Default option settings. */ - rtp_set_option(session, RTP_OPT_PROMISC, FALSE); - rtp_set_option(session, RTP_OPT_WEAK_VALIDATION, FALSE); - rtp_set_option(session, RTP_OPT_FILTER_MY_PACKETS, FALSE); - rtp_set_option(session, RTP_OPT_REUSE_PACKET_BUFS, FALSE); + /* Default option settings. */ + rtp_set_option(session, RTP_OPT_PROMISC, FALSE); + rtp_set_option(session, RTP_OPT_WEAK_VALIDATION, FALSE); + rtp_set_option(session, RTP_OPT_FILTER_MY_PACKETS, FALSE); + rtp_set_option(session, RTP_OPT_REUSE_PACKET_BUFS, FALSE); } static void init_rng(const char *s) @@ -945,25 +963,25 @@ static void init_rng(const char *s) pid_t p = getpid(); #ifdef WIN32 - int32_t i, n; -#endif /* WIN32 */ + int32_t i, n; +#endif /* WIN32 */ while (*s) { - seed += (uint32_t)*s++; + seed += (uint32_t) * s++; seed = seed * 31 + 1; } - seed = 1 + seed * 31 + (uint32_t)p; + seed = 1 + seed * 31 + (uint32_t) p; srand48(seed); - /* At time of writing we use srand48 -> srand on Win32 + /* At time of writing we use srand48 -> srand on Win32 which is only 16 bit. lrand48 -> rand which is only 15 bits, step a int way through table seq */ #ifdef WIN32 - n = (seed >> 16) & 0xffff; - for(i = 0; i < n; i++) { - seed = lrand48(); - } -#endif /* WIN32 */ - } + n = (seed >> 16) & 0xffff; + for (i = 0; i < n; i++) { + seed = lrand48(); + } +#endif /* WIN32 */ + } } /* See rtp_init_if(); calling rtp_init() is just like calling @@ -988,14 +1006,13 @@ static void init_rng(const char *s) * Returns: An opaque session identifier to be used in future calls to * the RTP library functions, or NULL on failure. */ -struct rtp *rtp_init(const char *addr, - uint16_t rx_port, uint16_t tx_port, - int ttl, double rtcp_bw, - int tfrc_on, - rtp_callback callback, - uint8_t *userdata) +struct rtp *rtp_init(const char *addr, + uint16_t rx_port, uint16_t tx_port, + int ttl, double rtcp_bw, + int tfrc_on, rtp_callback callback, uint8_t * userdata) { - return rtp_init_if(addr, NULL, rx_port, tx_port, ttl, rtcp_bw, tfrc_on, callback, userdata); + return rtp_init_if(addr, NULL, rx_port, tx_port, ttl, rtcp_bw, tfrc_on, + callback, userdata); } /** @@ -1021,16 +1038,14 @@ struct rtp *rtp_init(const char *addr, * Returns: An opaque session identifier to be used in future calls to * the RTP library functions, or NULL on failure. */ -struct rtp *rtp_init_if(const char *addr, char *iface, - uint16_t rx_port, uint16_t tx_port, - int ttl, double rtcp_bw, - int tfrc_on, - rtp_callback callback, - uint8_t *userdata) +struct rtp *rtp_init_if(const char *addr, char *iface, + uint16_t rx_port, uint16_t tx_port, + int ttl, double rtcp_bw, + int tfrc_on, rtp_callback callback, uint8_t * userdata) { - struct rtp *session; - int i, j; - char *cname; + struct rtp *session; + int i, j; + char *cname; if (ttl < 0) { debug_msg("ttl must be greater than zero\n"); @@ -1045,65 +1060,67 @@ struct rtp *rtp_init_if(const char *addr, char *iface, return NULL; } - session = (struct rtp *) malloc(sizeof(struct rtp)); - memset (session, 0, sizeof(struct rtp)); + session = (struct rtp *)malloc(sizeof(struct rtp)); + memset(session, 0, sizeof(struct rtp)); - session->magic = 0xfeedface; - session->opt = (options *) malloc(sizeof(options)); - session->userdata = userdata; - session->addr = strdup(addr); - session->rx_port = rx_port; - session->tx_port = tx_port; - session->ttl = min(ttl, 127); - session->rtp_socket = udp_init_if(addr, iface, rx_port, tx_port, ttl); - session->rtcp_socket = udp_init_if(addr, iface, (uint16_t) (rx_port+1), (uint16_t) (tx_port+1), ttl); + session->magic = 0xfeedface; + session->opt = (options *) malloc(sizeof(options)); + session->userdata = userdata; + session->addr = strdup(addr); + session->rx_port = rx_port; + session->tx_port = tx_port; + session->ttl = min(ttl, 127); + session->rtp_socket = udp_init_if(addr, iface, rx_port, tx_port, ttl); + session->rtcp_socket = + udp_init_if(addr, iface, (uint16_t) (rx_port + 1), + (uint16_t) (tx_port + 1), ttl); - init_opt(session); + init_opt(session); - if (session->rtp_socket == NULL || session->rtcp_socket == NULL) { - printf("Unable to open network\n"); - free(session); - return NULL; - } + if (session->rtp_socket == NULL || session->rtcp_socket == NULL) { + printf("Unable to open network\n"); + free(session); + return NULL; + } init_rng(udp_host_addr(session->rtp_socket)); - session->my_ssrc = (uint32_t) lrand48(); - session->callback = callback; - session->invalid_rtp_count = 0; - session->invalid_rtcp_count = 0; - session->bye_count = 0; - session->csrc_count = 0; - session->ssrc_count = 0; - session->ssrc_count_prev = 0; - session->sender_count = 0; - session->initial_rtcp = TRUE; - session->sending_bye = FALSE; - session->avg_rtcp_size = -1; /* Sentinal value: reception of first packet starts initial value... */ - session->we_sent = FALSE; - session->rtcp_bw = rtcp_bw; - session->sdes_count_pri = 0; - session->sdes_count_sec = 0; - session->sdes_count_ter = 0; - session->rtp_seq = (uint16_t) lrand48(); - session->rtp_pcount = 0; - session->mhdr = NULL; - session->tfrc_on = tfrc_on; - session->rtp_bcount = 0; - gettimeofday(&(session->last_update), NULL); - gettimeofday(&(session->last_rtcp_send_time), NULL); - gettimeofday(&(session->next_rtcp_send_time), NULL); + session->my_ssrc = (uint32_t) lrand48(); + session->callback = callback; + session->invalid_rtp_count = 0; + session->invalid_rtcp_count = 0; + session->bye_count = 0; + session->csrc_count = 0; + session->ssrc_count = 0; + session->ssrc_count_prev = 0; + session->sender_count = 0; + session->initial_rtcp = TRUE; + session->sending_bye = FALSE; + session->avg_rtcp_size = -1; /* Sentinal value: reception of first packet starts initial value... */ + session->we_sent = FALSE; + session->rtcp_bw = rtcp_bw; + session->sdes_count_pri = 0; + session->sdes_count_sec = 0; + session->sdes_count_ter = 0; + session->rtp_seq = (uint16_t) lrand48(); + session->rtp_pcount = 0; + session->mhdr = NULL; + session->tfrc_on = tfrc_on; + session->rtp_bcount = 0; + gettimeofday(&(session->last_update), NULL); + gettimeofday(&(session->last_rtcp_send_time), NULL); + gettimeofday(&(session->next_rtcp_send_time), NULL); session->encryption_enabled = 0; - session->encryption_algorithm = NULL; + session->encryption_algorithm = NULL; - /* Calculate when we're supposed to send our first RTCP packet... */ - tv_add(&(session->next_rtcp_send_time), rtcp_interval(session)); + /* Calculate when we're supposed to send our first RTCP packet... */ + tv_add(&(session->next_rtcp_send_time), rtcp_interval(session)); - /* Initialise the source database... */ - for (i = 0; i < RTP_DB_SIZE; i++) { - session->db[i] = NULL; - } - session->last_advertised_csrc = 0; + /* Initialise the source database... */ + for (i = 0; i < RTP_DB_SIZE; i++) { + session->db[i] = NULL; + } + session->last_advertised_csrc = 0; /* Initialize sentinels in rr table */ for (i = 0; i < RTP_DB_SIZE; i++) { @@ -1113,13 +1130,14 @@ struct rtp *rtp_init_if(const char *addr, char *iface, } } - /* Create a database entry for ourselves... */ - create_source(session, session->my_ssrc, FALSE); - cname = get_cname(session->rtp_socket); - rtp_set_sdes(session, session->my_ssrc, RTCP_SDES_CNAME, cname, strlen(cname)); - free(cname); /* cname is copied by rtp_set_sdes()... */ + /* Create a database entry for ourselves... */ + create_source(session, session->my_ssrc, FALSE); + cname = get_cname(session->rtp_socket); + rtp_set_sdes(session, session->my_ssrc, RTCP_SDES_CNAME, cname, + strlen(cname)); + free(cname); /* cname is copied by rtp_set_sdes()... */ - return session; + return session; } /** @@ -1149,10 +1167,10 @@ int rtp_set_my_ssrc(struct rtp *session, uint32_t ssrc) session->db[h] = NULL; /* Fill in new ssrc */ session->my_ssrc = ssrc; - s->ssrc = ssrc; - h = ssrc_hash(ssrc); + s->ssrc = ssrc; + h = ssrc_hash(ssrc); /* Put source back */ - session->db[h] = s; + session->db[h] = s; return TRUE; } @@ -1169,23 +1187,25 @@ int rtp_set_my_ssrc(struct rtp *session, uint32_t ssrc) */ int rtp_set_option(struct rtp *session, rtp_option optname, int optval) { - switch (optname) { - case RTP_OPT_WEAK_VALIDATION: - session->opt->wait_for_rtcp = optval; - break; - case RTP_OPT_PROMISC: - session->opt->promiscuous_mode = optval; - break; - case RTP_OPT_FILTER_MY_PACKETS: - session->opt->filter_my_packets = optval; - break; - case RTP_OPT_REUSE_PACKET_BUFS: - session->opt->reuse_bufs = optval; - break; - default: - debug_msg("Ignoring unknown option (%d) in call to rtp_set_option().\n", optname); - return FALSE; - } + switch (optname) { + case RTP_OPT_WEAK_VALIDATION: + session->opt->wait_for_rtcp = optval; + break; + case RTP_OPT_PROMISC: + session->opt->promiscuous_mode = optval; + break; + case RTP_OPT_FILTER_MY_PACKETS: + session->opt->filter_my_packets = optval; + break; + case RTP_OPT_REUSE_PACKET_BUFS: + session->opt->reuse_bufs = optval; + break; + default: + debug_msg + ("Ignoring unknown option (%d) in call to rtp_set_option().\n", + optname); + return FALSE; + } return TRUE; } @@ -1200,27 +1220,28 @@ int rtp_set_option(struct rtp *session, rtp_option optname, int optval) * * Returns: TRUE and the value of the option in optval on success, else FALSE. */ -int -rtp_get_option(struct rtp *session, rtp_option optname, int *optval) +int rtp_get_option(struct rtp *session, rtp_option optname, int *optval) { - switch (optname) { - case RTP_OPT_WEAK_VALIDATION: - *optval = session->opt->wait_for_rtcp; - break; - case RTP_OPT_PROMISC: - *optval = session->opt->promiscuous_mode; - break; - case RTP_OPT_FILTER_MY_PACKETS: - *optval = session->opt->filter_my_packets; - break; - case RTP_OPT_REUSE_PACKET_BUFS: - *optval = session->opt->reuse_bufs; - break; - default: - *optval = 0; - debug_msg("Ignoring unknown option (%d) in call to rtp_get_option().\n", optname); - return FALSE; - } + switch (optname) { + case RTP_OPT_WEAK_VALIDATION: + *optval = session->opt->wait_for_rtcp; + break; + case RTP_OPT_PROMISC: + *optval = session->opt->promiscuous_mode; + break; + case RTP_OPT_FILTER_MY_PACKETS: + *optval = session->opt->filter_my_packets; + break; + case RTP_OPT_REUSE_PACKET_BUFS: + *optval = session->opt->reuse_bufs; + break; + default: + *optval = 0; + debug_msg + ("Ignoring unknown option (%d) in call to rtp_get_option().\n", + optname); + return FALSE; + } return TRUE; } @@ -1233,10 +1254,10 @@ rtp_get_option(struct rtp *session, rtp_option optname, int *optval) * * Returns: pointer to userdata. */ -uint8_t *rtp_get_userdata(struct rtp *session) +uint8_t *rtp_get_userdata(struct rtp * session) { - check_database(session); - return session->userdata; + check_database(session); + return session->userdata; } /** @@ -1248,239 +1269,244 @@ uint8_t *rtp_get_userdata(struct rtp *session) * store the value returned, but rather should call this function each time * they need it. */ -uint32_t rtp_my_ssrc(struct rtp *session) +uint32_t rtp_my_ssrc(struct rtp * session) { - check_database(session); - return session->my_ssrc; + check_database(session); + return session->my_ssrc; } -static int -validate_rtp2(rtp_packet *packet, int len, int vlen) +static int validate_rtp2(rtp_packet * packet, int len, int vlen) { - /* Check for valid payload types..... 72-76 are RTCP payload type numbers, with */ - /* the high bit missing so we report that someone is running on the wrong port. */ - if (packet->pt >= 72 && packet->pt <= 76) { - debug_msg("rtp_header_validation: payload-type invalid"); - if (packet->m) { - debug_msg(" (RTCP packet on RTP port?)"); - } - debug_msg("\n"); - return FALSE; - } - /* Check that the length of the packet is sensible... */ - if (len < (vlen + (4 * packet->cc))) { - debug_msg("rtp_header_validation: packet length is smaller than the header\n"); - return FALSE; - } - /* Check that the amount of padding specified is sensible. */ - /* Note: have to include the size of any extension header! */ - if (packet->p) { - int payload_len = len - vlen - (packet->cc * 4); + /* Check for valid payload types..... 72-76 are RTCP payload type numbers, with */ + /* the high bit missing so we report that someone is running on the wrong port. */ + if (packet->pt >= 72 && packet->pt <= 76) { + debug_msg("rtp_header_validation: payload-type invalid"); + if (packet->m) { + debug_msg(" (RTCP packet on RTP port?)"); + } + debug_msg("\n"); + return FALSE; + } + /* Check that the length of the packet is sensible... */ + if (len < (vlen + (4 * packet->cc))) { + debug_msg + ("rtp_header_validation: packet length is smaller than the header\n"); + return FALSE; + } + /* Check that the amount of padding specified is sensible. */ + /* Note: have to include the size of any extension header! */ + if (packet->p) { + int payload_len = len - vlen - (packet->cc * 4); if (packet->x) { /* extension header and data */ payload_len -= 4 * (1 + packet->extn_len); } if (packet->data[packet->data_len - 1] > payload_len) { - debug_msg("rtp_header_validation: padding greater than payload length\n"); + debug_msg + ("rtp_header_validation: padding greater than payload length\n"); return FALSE; } if (packet->data[packet->data_len - 1] < 1) { - debug_msg("rtp_header_validation: padding zero\n"); - return FALSE; - } + debug_msg("rtp_header_validation: padding zero\n"); + return FALSE; + } } - return TRUE; + return TRUE; } -static inline int -validate_rtp(struct rtp *session, rtp_packet *packet, int len, int vlen) +static inline int +validate_rtp(struct rtp *session, rtp_packet * packet, int len, int vlen) { - /* This function checks the header info to make sure that the packet */ - /* is valid. We return TRUE if the packet is valid, FALSE otherwise. */ - /* See Appendix A.1 of the RTP specification. */ + /* This function checks the header info to make sure that the packet */ + /* is valid. We return TRUE if the packet is valid, FALSE otherwise. */ + /* See Appendix A.1 of the RTP specification. */ - /* We only accept RTPv2 packets... */ - if (packet->v != 2) { - debug_msg("rtp_header_validation: v != 2\n"); - return FALSE; - } + /* We only accept RTPv2 packets... */ + if (packet->v != 2) { + debug_msg("rtp_header_validation: v != 2\n"); + return FALSE; + } + + if (!session->opt->wait_for_rtcp) { + /* We prefer speed over accuracy... */ + return TRUE; + } + return validate_rtp2(packet, len, vlen); +} + +static void compute_loss_intervals(struct rtp *session, rtp_packet * packet) +{ + UNUSED(session); + UNUSED(packet); - if (!session->opt->wait_for_rtcp) { - /* We prefer speed over accuracy... */ - return TRUE; - } - return validate_rtp2(packet, len, vlen); } static void -compute_loss_intervals (struct rtp *session, rtp_packet *packet) +process_rtp(struct rtp *session, uint32_t curr_rtp_ts, rtp_packet * packet, + source * s) { - UNUSED (session); - UNUSED (packet); + int i, d, transit; + rtp_event event; + if (packet->cc > 0) { + for (i = 0; i < packet->cc; i++) { + create_source(session, packet->csrc[i], FALSE); + } + } + /* Update the source database... */ + if (s->sender == FALSE) { + s->sender = TRUE; + session->sender_count++; + } + + if (session->tfrc_on) + compute_loss_intervals(session, packet); + + transit = curr_rtp_ts - packet->ts; + d = transit - s->transit; + s->transit = transit; + if (d < 0) { + d = -d; + } + s->jitter += d - ((s->jitter + 8) / 16); + + /* Callback to the application to process the packet... */ + if (!filter_event(session, packet->ssrc)) { + event.ssrc = packet->ssrc; + event.type = RX_RTP; + + // printf("This packet is going to have size %d\n",sizeof(packet)); + event.data = (void *)packet; /* The callback function MUST free this! */ + session->callback(session, &event); + } } -static void -process_rtp(struct rtp *session, uint32_t curr_rtp_ts, rtp_packet *packet, source *s) +void rtp_set_recv_iov(struct rtp *session, struct msghdr *m) { - int i, d, transit; - rtp_event event; - - - if (packet->cc > 0) { - for (i = 0; i < packet->cc; i++) { - create_source(session, packet->csrc[i], FALSE); - } - } - /* Update the source database... */ - if (s->sender == FALSE) { - s->sender = TRUE; - session->sender_count++; - } - - if (session->tfrc_on) - compute_loss_intervals (session, packet ); - - transit = curr_rtp_ts - packet->ts; - d = transit - s->transit; - s->transit = transit; - if (d < 0) { - d = -d; - } - s->jitter += d - ((s->jitter + 8) / 16); - - /* Callback to the application to process the packet... */ - if (!filter_event(session, packet->ssrc)) { - event.ssrc = packet->ssrc; - event.type = RX_RTP; - - // printf("This packet is going to have size %d\n",sizeof(packet)); - event.data = (void *) packet; /* The callback function MUST free this! */ - session->callback(session, &event); - } + session->mhdr = m; } -void -rtp_set_recv_iov(struct rtp *session, struct msghdr *m) +static void rtp_recv_data(struct rtp *session, uint32_t curr_rtp_ts) { - session->mhdr = m; -} + /* This routine preprocesses an incoming RTP packet, deciding whether to process it. */ + rtp_packet *packet = NULL; + uint8_t *buffer = NULL; + uint8_t *buffer_vlen = NULL; + int vlen = 12; /* vlen = 12 | 16 | 20 */ + int buflen; + source *s; -static void -rtp_recv_data(struct rtp *session, uint32_t curr_rtp_ts) -{ - /* This routine preprocesses an incoming RTP packet, deciding whether to process it. */ - rtp_packet *packet = NULL; - uint8_t *buffer = NULL; - uint8_t *buffer_vlen = NULL; - int vlen = 12; /* vlen = 12 | 16 | 20 */ - int buflen; - source *s; + if (!session->opt->reuse_bufs || (packet == NULL)) { + packet = (rtp_packet *) malloc(RTP_MAX_PACKET_LEN); + buffer = ((uint8_t *) packet) + RTP_PACKET_HEADER_SIZE; + } - if (!session->opt->reuse_bufs || (packet == NULL)) { - packet = (rtp_packet *) malloc(RTP_MAX_PACKET_LEN); - buffer = ((uint8_t *) packet) + RTP_PACKET_HEADER_SIZE; - } + buflen = + udp_recv(session->rtp_socket, (char *)buffer, + RTP_MAX_PACKET_LEN - RTP_PACKET_HEADER_SIZE); + if (buflen > 0) { + if (session->encryption_enabled) { + uint8_t initVec[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + (session->decrypt_func) (session, buffer, buflen, + initVec); + } - buflen = udp_recv(session->rtp_socket, (char *)buffer, RTP_MAX_PACKET_LEN - RTP_PACKET_HEADER_SIZE); - if (buflen > 0) { - if (session->encryption_enabled) { - uint8_t initVec[8] = {0,0,0,0,0,0,0,0}; - (session->decrypt_func)(session, buffer, buflen, initVec); - } - - /* figure out header lenght based on tfrc_on */ - /* might as well extract rtt and send_ts */ - vlen = 12; + /* figure out header lenght based on tfrc_on */ + /* might as well extract rtt and send_ts */ + vlen = 12; if (session->tfrc_on) { - vlen+=4; - packet->send_ts = ntohl(packet->send_ts); - /* rtt is present in RTP packet - XXX*/ - if (packet->pt & 64) { - /* rtt is present in RTP packet - XXX*/ - vlen += 4; - packet->rtt = ntohl(packet->rtt); - //printf ("\n%8d %8d %8d", packet->send_ts, ntohl(packet->ts), packet->rtt ); - } - } - buffer_vlen = buffer + vlen; + vlen += 4; + packet->send_ts = ntohl(packet->send_ts); + /* rtt is present in RTP packet - XXX */ + if (packet->pt & 64) { + /* rtt is present in RTP packet - XXX */ + vlen += 4; + packet->rtt = ntohl(packet->rtt); + //printf ("\n%8d %8d %8d", packet->send_ts, ntohl(packet->ts), packet->rtt ); + } + } + buffer_vlen = buffer + vlen; - /* Convert header fields to host byte order... */ - packet->seq = ntohs(packet->seq); - packet->ts = ntohl(packet->ts); - packet->ssrc = ntohl(packet->ssrc); - /* Setup internal pointers, etc... */ - if (packet->cc) { - int i; - packet->csrc = (uint32_t *)(buffer_vlen); - for (i = 0; i < packet->cc; i++) { - packet->csrc[i] = ntohl(packet->csrc[i]); - } - } else { - packet->csrc = NULL; - } - if (packet->x) { - packet->extn = buffer_vlen + (packet->cc * 4); - packet->extn_len = (packet->extn[2] << 8) | packet->extn[3]; - packet->extn_type = (packet->extn[0] << 8) | packet->extn[1]; - } else { - packet->extn = NULL; - packet->extn_len = 0; - packet->extn_type = 0; - } - packet->data = (char *)(buffer_vlen + (packet->cc * 4)); - packet->data_len = buflen - (packet->cc * 4) - vlen; - if (packet->extn != NULL) { - packet->data += ((packet->extn_len + 1) * 4); - packet->data_len -= ((packet->extn_len + 1) * 4); - } - if (validate_rtp(session, packet, buflen, vlen)) { - if (session->opt->wait_for_rtcp) { - s = create_source(session, packet->ssrc, TRUE); - } else { - s = get_source(session, packet->ssrc); - } - if (session->opt->promiscuous_mode) { - if (s == NULL) { - create_source(session, packet->ssrc, FALSE); - s = get_source(session, packet->ssrc); - } - process_rtp(session, curr_rtp_ts, packet, s); - return; /* We don't free "packet", that's done by the callback function... */ - } - if (s != NULL) { - if (s->probation == -1) { - s->probation = MIN_SEQUENTIAL; - s->max_seq = packet->seq - 1; - } - if (update_seq(s, packet->seq)) { - process_rtp(session, curr_rtp_ts, packet, s); - return; /* we don't free "packet", that's done by the callback function... */ - } else { - /* This source is still on probation... */ - debug_msg("RTP packet from probationary source ignored...\n"); - } - } else { - /* debug_msg("RTP packet from unknown source ignored\n"); */ - } - } else { - session->invalid_rtp_count++; - debug_msg("Invalid RTP packet discarded\n"); - } + /* Convert header fields to host byte order... */ + packet->seq = ntohs(packet->seq); + packet->ts = ntohl(packet->ts); + packet->ssrc = ntohl(packet->ssrc); + /* Setup internal pointers, etc... */ + if (packet->cc) { + int i; + packet->csrc = (uint32_t *) (buffer_vlen); + for (i = 0; i < packet->cc; i++) { + packet->csrc[i] = ntohl(packet->csrc[i]); + } + } else { + packet->csrc = NULL; + } + if (packet->x) { + packet->extn = buffer_vlen + (packet->cc * 4); + packet->extn_len = + (packet->extn[2] << 8) | packet->extn[3]; + packet->extn_type = + (packet->extn[0] << 8) | packet->extn[1]; + } else { + packet->extn = NULL; + packet->extn_len = 0; + packet->extn_type = 0; + } + packet->data = (char *)(buffer_vlen + (packet->cc * 4)); + packet->data_len = buflen - (packet->cc * 4) - vlen; + if (packet->extn != NULL) { + packet->data += ((packet->extn_len + 1) * 4); + packet->data_len -= ((packet->extn_len + 1) * 4); + } + if (validate_rtp(session, packet, buflen, vlen)) { + if (session->opt->wait_for_rtcp) { + s = create_source(session, packet->ssrc, TRUE); + } else { + s = get_source(session, packet->ssrc); + } + if (session->opt->promiscuous_mode) { + if (s == NULL) { + create_source(session, packet->ssrc, + FALSE); + s = get_source(session, packet->ssrc); + } + process_rtp(session, curr_rtp_ts, packet, s); + return; /* We don't free "packet", that's done by the callback function... */ + } + if (s != NULL) { + if (s->probation == -1) { + s->probation = MIN_SEQUENTIAL; + s->max_seq = packet->seq - 1; + } + if (update_seq(s, packet->seq)) { + process_rtp(session, curr_rtp_ts, + packet, s); + return; /* we don't free "packet", that's done by the callback function... */ + } else { + /* This source is still on probation... */ + debug_msg + ("RTP packet from probationary source ignored...\n"); + } + } else { + /* debug_msg("RTP packet from unknown source ignored\n"); */ + } + } else { + session->invalid_rtp_count++; + debug_msg("Invalid RTP packet discarded\n"); + } - if (!session->opt->reuse_bufs) { - free(packet); - } - } + if (!session->opt->reuse_bufs) { + free(packet); + } + } } -static int -validate_rtcp(uint8_t *packet, int len) +static int validate_rtcp(uint8_t * packet, int len) { - /* Validity check for a compound RTCP packet. This function returns */ - /* TRUE if the packet is okay, FALSE if the validity check fails. */ + /* Validity check for a compound RTCP packet. This function returns */ + /* TRUE if the packet is okay, FALSE if the validity check fails. */ /* */ - /* The following checks can be applied to RTCP packets [RFC1889]: */ + /* The following checks can be applied to RTCP packets [RFC1889]: */ /* o RTP version field must equal 2. */ /* o The payload type field of the first RTCP packet in a compound */ /* packet must be equal to SR or RR. */ @@ -1490,261 +1516,296 @@ validate_rtcp(uint8_t *packet, int len) /* o The length fields of the individual RTCP packets must total to */ /* the overall length of the compound RTCP packet as received. */ - rtcp_t *pkt = (rtcp_t *) packet; - rtcp_t *end = (rtcp_t *) (((char *) pkt) + len); - rtcp_t *r = pkt; - int l = 0; - int pc = 1; - int p = 0; - int is_okay = TRUE; + rtcp_t *pkt = (rtcp_t *) packet; + rtcp_t *end = (rtcp_t *) (((char *)pkt) + len); + rtcp_t *r = pkt; + int l = 0; + int pc = 1; + int p = 0; + int is_okay = TRUE; - /* All RTCP packets must be compound packets (RFC1889, section 6.1) */ - if (((ntohs(pkt->common.length) + 1) * 4) == len) { - debug_msg("Bogus RTCP packet: not a compound packet\n"); - is_okay = FALSE; - } + /* All RTCP packets must be compound packets (RFC1889, section 6.1) */ + if (((ntohs(pkt->common.length) + 1) * 4) == len) { + debug_msg("Bogus RTCP packet: not a compound packet\n"); + is_okay = FALSE; + } - /* The RTCP packet must not be larger than the surrounding UDP packet */ - if (((ntohs(pkt->common.length) + 1) * 4) > len) { - debug_msg("Bogus RTCP packet: length exceeds length of container UDP packet\n"); - return FALSE; - } + /* The RTCP packet must not be larger than the surrounding UDP packet */ + if (((ntohs(pkt->common.length) + 1) * 4) > len) { + debug_msg + ("Bogus RTCP packet: length exceeds length of container UDP packet\n"); + return FALSE; + } - /* Check the RTCP version, payload type and padding of the first in */ - /* the compund RTCP packet... */ - if (pkt->common.version != 2) { - debug_msg("Bogus RTCP packet: version number != 2 in the first sub-packet\n"); - is_okay = FALSE; - } - if (pkt->common.p != 0) { - debug_msg("Bogus RTCP packet: padding bit is set on first packet in compound\n"); - is_okay = FALSE; - } - if ((pkt->common.pt != RTCP_SR) && (pkt->common.pt != RTCP_RR)) { - if (pkt->common.pt == RTCP_SDES) { - debug_msg("Bogus RTCP packet: compound packet starts with SDES not SR or RR\n"); - } else if (pkt->common.pt == RTCP_APP) { - debug_msg("Bogus RTCP packet: compound packet starts with APP not SR or RR\n"); - } else if (pkt->common.pt == RTCP_BYE) { - debug_msg("Bogus RTCP packet: compound packet starts with BYE not SR or RR\n"); - } else { - debug_msg("Bogus RTCP packet: compound packet starts with packet type %d not SR or RR\n", pkt->common.pt); - } - is_okay = FALSE; - } + /* Check the RTCP version, payload type and padding of the first in */ + /* the compund RTCP packet... */ + if (pkt->common.version != 2) { + debug_msg + ("Bogus RTCP packet: version number != 2 in the first sub-packet\n"); + is_okay = FALSE; + } + if (pkt->common.p != 0) { + debug_msg + ("Bogus RTCP packet: padding bit is set on first packet in compound\n"); + is_okay = FALSE; + } + if ((pkt->common.pt != RTCP_SR) && (pkt->common.pt != RTCP_RR)) { + if (pkt->common.pt == RTCP_SDES) { + debug_msg + ("Bogus RTCP packet: compound packet starts with SDES not SR or RR\n"); + } else if (pkt->common.pt == RTCP_APP) { + debug_msg + ("Bogus RTCP packet: compound packet starts with APP not SR or RR\n"); + } else if (pkt->common.pt == RTCP_BYE) { + debug_msg + ("Bogus RTCP packet: compound packet starts with BYE not SR or RR\n"); + } else { + debug_msg + ("Bogus RTCP packet: compound packet starts with packet type %d not SR or RR\n", + pkt->common.pt); + } + is_okay = FALSE; + } - /* Check all following parts of the compund RTCP packet. The RTP version */ - /* number must be 2, and the padding bit must be zero on all apart from */ - /* the last packet. Try to validate the format of each sub-packet. */ - do { - if (p == 1) { - debug_msg("Bogus RTCP packet: padding bit set in sub-packet %d which is not final sub-packet\n", pc); - is_okay = FALSE; - } - if (r->common.p) { - p = 1; - } - if (r->common.version != 2) { - debug_msg("Bogus RTCP packet: version number != 2 in sub-packet %d\n", pc); - is_okay = FALSE; - } + /* Check all following parts of the compund RTCP packet. The RTP version */ + /* number must be 2, and the padding bit must be zero on all apart from */ + /* the last packet. Try to validate the format of each sub-packet. */ + do { + if (p == 1) { + debug_msg + ("Bogus RTCP packet: padding bit set in sub-packet %d which is not final sub-packet\n", + pc); + is_okay = FALSE; + } + if (r->common.p) { + p = 1; + } + if (r->common.version != 2) { + debug_msg + ("Bogus RTCP packet: version number != 2 in sub-packet %d\n", + pc); + is_okay = FALSE; + } - if (pkt->common.pt == RTCP_SR) { - if (((ntohs(pkt->common.length) + 1) * 4) < (28 + (pkt->common.count * 24))) { - debug_msg("Bogus RTCP packet: SR packet is too short (length=%d)\n", ntohs(pkt->common.length)); - is_okay = FALSE; - } - } else if (pkt->common.pt == RTCP_RR) { - if (((ntohs(pkt->common.length) + 1) * 4) < (8 + (pkt->common.count * 24))) { - debug_msg("Bogus RTCP packet: RR packet is too short (length=%d)\n", ntohs(pkt->common.length)); - is_okay = FALSE; - } - } else if (pkt->common.pt == RTCP_SDES) { - /* Parse and validate the SDES packet */ - int count = pkt->common.count; - struct rtcp_sdes_t *sd = &pkt->r.sdes; - rtcp_sdes_item *rsp; - rtcp_sdes_item *rspn; - rtcp_sdes_item *sdes_end = (rtcp_sdes_item *) ((uint32_t *)pkt + pkt->common.length + 1); + if (pkt->common.pt == RTCP_SR) { + if (((ntohs(pkt->common.length) + 1) * 4) < + (28 + (pkt->common.count * 24))) { + debug_msg + ("Bogus RTCP packet: SR packet is too short (length=%d)\n", + ntohs(pkt->common.length)); + is_okay = FALSE; + } + } else if (pkt->common.pt == RTCP_RR) { + if (((ntohs(pkt->common.length) + 1) * 4) < + (8 + (pkt->common.count * 24))) { + debug_msg + ("Bogus RTCP packet: RR packet is too short (length=%d)\n", + ntohs(pkt->common.length)); + is_okay = FALSE; + } + } else if (pkt->common.pt == RTCP_SDES) { + /* Parse and validate the SDES packet */ + int count = pkt->common.count; + struct rtcp_sdes_t *sd = &pkt->r.sdes; + rtcp_sdes_item *rsp; + rtcp_sdes_item *rspn; + rtcp_sdes_item *sdes_end = + (rtcp_sdes_item *) ((uint32_t *) pkt + + pkt->common.length + 1); - while (--count >= 0) { - rsp = &sd->item[0]; - if ((char *) rsp > (char *) end) { - debug_msg("Bogus RTCP packet: SDES longer than UDP packet: no terminating null item?\n"); - is_okay = FALSE; - break; - } - if (rsp >= sdes_end) { - debug_msg("Bogus RTCP packet: too many SDES items for packet length\n"); - is_okay = FALSE; - break; - } - for (; rsp->type; rsp = rspn ) { - rspn = (rtcp_sdes_item *)((char*)rsp+rsp->length+2); - if (rspn == sdes_end) { - break; - } - } - sd = (struct rtcp_sdes_t *) ((uint32_t *)sd + (((char *)rsp - (char *)sd) >> 2)+1); - } - if (count >= 0) { - debug_msg("Bogus RTCP packet: malformed SDES packet\n"); - } - } else if (pkt->common.pt == RTCP_APP) { - /* No way to validate these? */ - } else if (pkt->common.pt == RTCP_BYE) { - /* No way to validate these? */ - } - l += (ntohs(r->common.length) + 1) * 4; - r = (rtcp_t *) (((uint32_t *) r) + ntohs(r->common.length) + 1); - pc++; /* count of sub-packets, for debugging... */ - } while (r < end); + while (--count >= 0) { + rsp = &sd->item[0]; + if ((char *)rsp > (char *)end) { + debug_msg + ("Bogus RTCP packet: SDES longer than UDP packet: no terminating null item?\n"); + is_okay = FALSE; + break; + } + if (rsp >= sdes_end) { + debug_msg + ("Bogus RTCP packet: too many SDES items for packet length\n"); + is_okay = FALSE; + break; + } + for (; rsp->type; rsp = rspn) { + rspn = + (rtcp_sdes_item *) ((char *)rsp + + rsp->length + + 2); + if (rspn == sdes_end) { + break; + } + } + sd = (struct rtcp_sdes_t *)((uint32_t *) sd + + (((char *)rsp - + (char *)sd) >> 2) + + 1); + } + if (count >= 0) { + debug_msg + ("Bogus RTCP packet: malformed SDES packet\n"); + } + } else if (pkt->common.pt == RTCP_APP) { + /* No way to validate these? */ + } else if (pkt->common.pt == RTCP_BYE) { + /* No way to validate these? */ + } + l += (ntohs(r->common.length) + 1) * 4; + r = (rtcp_t *) (((uint32_t *) r) + ntohs(r->common.length) + 1); + pc++; /* count of sub-packets, for debugging... */ + } while (r < end); - /* Check that the length of the packets matches the length of the UDP */ - /* packet in which they were received... */ - if (l != len) { - debug_msg("Bogus RTCP packet: RTCP packet length does not match UDP packet length (%d != %d)\n", l, len); - is_okay = FALSE; - } - if (r != end) { - debug_msg("Bogus RTCP packet: RTCP packet length does not match UDP packet length (%p != %p)\n", r, end); - is_okay = FALSE; - } + /* Check that the length of the packets matches the length of the UDP */ + /* packet in which they were received... */ + if (l != len) { + debug_msg + ("Bogus RTCP packet: RTCP packet length does not match UDP packet length (%d != %d)\n", + l, len); + is_okay = FALSE; + } + if (r != end) { + debug_msg + ("Bogus RTCP packet: RTCP packet length does not match UDP packet length (%p != %p)\n", + r, end); + is_okay = FALSE; + } - if (!is_okay) { - debug_dump(packet, len); - } + if (!is_okay) { + debug_dump(packet, len); + } - return is_okay; + return is_okay; } -static void process_report_blocks(struct rtp *session, rtcp_t *packet, uint32_t ssrc, rtcp_rr *rrp, rtcp_rx *rrx) +static void process_report_blocks(struct rtp *session, rtcp_t * packet, + uint32_t ssrc, rtcp_rr * rrp, rtcp_rx * rrx) { - int i; - rtp_event event; - rtcp_rr *rr; - rtcp_rx *rx=NULL; + int i; + rtp_event event; + rtcp_rr *rr; + rtcp_rx *rx = NULL; - /* ...process RRs... */ - if (packet->common.count == 0) { - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = RX_RR_EMPTY; - event.data = NULL; - session->callback(session, &event); - } - } else { - for (i = 0; i < packet->common.count; i++, rrp++) { - rr = (rtcp_rr *) malloc(sizeof(rtcp_rr)); - rr->ssrc = ntohl(rrp->ssrc); - rr->fract_lost = rrp->fract_lost; /* Endian conversion handled in the */ - rr->total_lost = rrp->total_lost; /* definition of the rtcp_rr type. */ - rr->last_seq = ntohl(rrp->last_seq); - rr->jitter = ntohl(rrp->jitter); - rr->lsr = ntohl(rrp->lsr); - rr->dlsr = ntohl(rrp->dlsr); + /* ...process RRs... */ + if (packet->common.count == 0) { + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = RX_RR_EMPTY; + event.data = NULL; + session->callback(session, &event); + } + } else { + for (i = 0; i < packet->common.count; i++, rrp++) { + rr = (rtcp_rr *) malloc(sizeof(rtcp_rr)); + rr->ssrc = ntohl(rrp->ssrc); + rr->fract_lost = rrp->fract_lost; /* Endian conversion handled in the */ + rr->total_lost = rrp->total_lost; /* definition of the rtcp_rr type. */ + rr->last_seq = ntohl(rrp->last_seq); + rr->jitter = ntohl(rrp->jitter); + rr->lsr = ntohl(rrp->lsr); + rr->dlsr = ntohl(rrp->dlsr); - if (rrx) { - rx = (rtcp_rx *) malloc(sizeof(rtcp_rx)); - rx->ts = ntohl(rrx->ts); - rx->tdelay = ntohl(rrx->tdelay); - rx->x_recv = ntohl(rrx->x_recv); - rx->p = ntohl(rrx->p); - } + if (rrx) { + rx = (rtcp_rx *) malloc(sizeof(rtcp_rx)); + rx->ts = ntohl(rrx->ts); + rx->tdelay = ntohl(rrx->tdelay); + rx->x_recv = ntohl(rrx->x_recv); + rx->p = ntohl(rrx->p); + } - /* Create a database entry for this SSRC, if one doesn't already exist... */ - create_source(session, rr->ssrc, FALSE); + /* Create a database entry for this SSRC, if one doesn't already exist... */ + create_source(session, rr->ssrc, FALSE); - /* Store the RR for later use... */ - insert_rr(session, ssrc, rr, rx); + /* Store the RR for later use... */ + insert_rr(session, ssrc, rr, rx); - /* Call the event handler... */ - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = RX_RR; - event.data = (void *) rr; - session->callback(session, &event); - } - } - } + /* Call the event handler... */ + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = RX_RR; + event.data = (void *)rr; + session->callback(session, &event); + } + } + } } -static void process_rtcp_sr(struct rtp *session, rtcp_t *packet) +static void process_rtcp_sr(struct rtp *session, rtcp_t * packet) { - uint32_t ssrc; - rtp_event event; - rtcp_sr *sr; - source *s; + uint32_t ssrc; + rtp_event event; + rtcp_sr *sr; + source *s; - ssrc = ntohl(packet->r.sr.sr.ssrc); - s = create_source(session, ssrc, FALSE); - if (s == NULL) { - debug_msg("Source 0x%08x invalid, skipping...\n", ssrc); - return; - } + ssrc = ntohl(packet->r.sr.sr.ssrc); + s = create_source(session, ssrc, FALSE); + if (s == NULL) { + debug_msg("Source 0x%08x invalid, skipping...\n", ssrc); + return; + } - /* Mark as an active sender, if we get a sender report... */ - if (s->sender == FALSE) { - s->sender = TRUE; - session->sender_count++; - } + /* Mark as an active sender, if we get a sender report... */ + if (s->sender == FALSE) { + s->sender = TRUE; + session->sender_count++; + } - /* Process the SR... */ - sr = (rtcp_sr *) malloc(sizeof(rtcp_sr)); - sr->ssrc = ssrc; - sr->ntp_sec = ntohl(packet->r.sr.sr.ntp_sec); - sr->ntp_frac = ntohl(packet->r.sr.sr.ntp_frac); - sr->rtp_ts = ntohl(packet->r.sr.sr.rtp_ts); - sr->sender_pcount = ntohl(packet->r.sr.sr.sender_pcount); - sr->sender_bcount = ntohl(packet->r.sr.sr.sender_bcount); + /* Process the SR... */ + sr = (rtcp_sr *) malloc(sizeof(rtcp_sr)); + sr->ssrc = ssrc; + sr->ntp_sec = ntohl(packet->r.sr.sr.ntp_sec); + sr->ntp_frac = ntohl(packet->r.sr.sr.ntp_frac); + sr->rtp_ts = ntohl(packet->r.sr.sr.rtp_ts); + sr->sender_pcount = ntohl(packet->r.sr.sr.sender_pcount); + sr->sender_bcount = ntohl(packet->r.sr.sr.sender_bcount); - /* Store the SR for later retrieval... */ - if (s->sr != NULL) { - free(s->sr); - } - s->sr = sr; - ntp64_time(&s->last_sr_sec, &s->last_sr_frac); - s->last_sr_sec = tmp_sec; - s->last_sr_frac = tmp_frac; + /* Store the SR for later retrieval... */ + if (s->sr != NULL) { + free(s->sr); + } + s->sr = sr; + ntp64_time(&s->last_sr_sec, &s->last_sr_frac); + s->last_sr_sec = tmp_sec; + s->last_sr_frac = tmp_frac; - /* Call the event handler... */ - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = RX_SR; - event.data = (void *) sr; - session->callback(session, &event); - } + /* Call the event handler... */ + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = RX_SR; + event.data = (void *)sr; + session->callback(session, &event); + } - process_report_blocks(session, packet, ssrc, packet->r.sr.rr, NULL); + process_report_blocks(session, packet, ssrc, packet->r.sr.rr, NULL); - if (((packet->common.count * 6) + 1) < (ntohs(packet->common.length) - 5)) { - debug_msg("Profile specific SR extension ignored\n"); - } + if (((packet->common.count * 6) + 1) < + (ntohs(packet->common.length) - 5)) { + debug_msg("Profile specific SR extension ignored\n"); + } } -static void process_rtcp_rr(struct rtp *session, rtcp_t *packet) +static void process_rtcp_rr(struct rtp *session, rtcp_t * packet) { - uint32_t ssrc; - source *s; + uint32_t ssrc; + source *s; - ssrc = ntohl(packet->r.rr.ssrc); - s = create_source(session, ssrc, FALSE); - if (s == NULL) { - debug_msg("Source 0x%08x invalid, skipping...\n", ssrc); - return; - } + ssrc = ntohl(packet->r.rr.ssrc); + s = create_source(session, ssrc, FALSE); + if (s == NULL) { + debug_msg("Source 0x%08x invalid, skipping...\n", ssrc); + return; + } - process_report_blocks(session, packet, ssrc, packet->r.rr.rr, NULL); + process_report_blocks(session, packet, ssrc, packet->r.rr.rr, NULL); - if (((packet->common.count * 6) + 1) < ntohs(packet->common.length)) { - debug_msg("Profile specific RR extension ignored\n"); - } + if (((packet->common.count * 6) + 1) < ntohs(packet->common.length)) { + debug_msg("Profile specific RR extension ignored\n"); + } } -static void process_rtcp_rx(struct rtp *session, rtcp_t *packet) +static void process_rtcp_rx(struct rtp *session, rtcp_t * packet) { - uint32_t ssrc; - source *s; + uint32_t ssrc; + source *s; ssrc = ntohl(packet->r.rx.ssrc); s = create_source(session, ssrc, FALSE); @@ -1753,252 +1814,308 @@ static void process_rtcp_rx(struct rtp *session, rtcp_t *packet) return; } - process_report_blocks(session, packet, ssrc, packet->r.rx.rr, packet->r.rx.rx); + process_report_blocks(session, packet, ssrc, packet->r.rx.rr, + packet->r.rx.rx); if (((packet->common.count * 6) + 1) < ntohs(packet->common.length)) { debug_msg("Profile specific RR/RX extension ignored\n"); } } - -static void process_rtcp_sdes(struct rtp *session, rtcp_t *packet) +static void process_rtcp_sdes(struct rtp *session, rtcp_t * packet) { - int count = packet->common.count; - struct rtcp_sdes_t *sd = &packet->r.sdes; - rtcp_sdes_item *rsp; - rtcp_sdes_item *rspn; - rtcp_sdes_item *end = (rtcp_sdes_item *) ((uint32_t *)packet + packet->common.length + 1); - source *s; - rtp_event event; + int count = packet->common.count; + struct rtcp_sdes_t *sd = &packet->r.sdes; + rtcp_sdes_item *rsp; + rtcp_sdes_item *rspn; + rtcp_sdes_item *end = + (rtcp_sdes_item *) ((uint32_t *) packet + packet->common.length + + 1); + source *s; + rtp_event event; - while (--count >= 0) { - rsp = &sd->item[0]; - if (rsp >= end) { - break; - } - sd->ssrc = ntohl(sd->ssrc); - s = create_source(session, sd->ssrc, FALSE); - if (s == NULL) { - debug_msg("Can't get valid source entry for 0x%08x, skipping...\n", sd->ssrc); - } else { - for (; rsp->type; rsp = rspn ) { - rspn = (rtcp_sdes_item *)((char*)rsp+rsp->length+2); - if (rspn >= end) { - rsp = rspn; - break; - } - if (rtp_set_sdes(session, sd->ssrc, rsp->type, rsp->data, rsp->length)) { - if (!filter_event(session, sd->ssrc)) { - event.ssrc = sd->ssrc; - event.type = RX_SDES; - event.data = (void *) rsp; - session->callback(session, &event); - } - } else { - debug_msg("Invalid sdes item for source 0x%08x, skipping...\n", sd->ssrc); - } - } - } - sd = (struct rtcp_sdes_t *) ((uint32_t *)sd + (((char *)rsp - (char *)sd) >> 2)+1); - } - if (count >= 0) { - debug_msg("Invalid RTCP SDES packet, some items ignored.\n"); - } + while (--count >= 0) { + rsp = &sd->item[0]; + if (rsp >= end) { + break; + } + sd->ssrc = ntohl(sd->ssrc); + s = create_source(session, sd->ssrc, FALSE); + if (s == NULL) { + debug_msg + ("Can't get valid source entry for 0x%08x, skipping...\n", + sd->ssrc); + } else { + for (; rsp->type; rsp = rspn) { + rspn = + (rtcp_sdes_item *) ((char *)rsp + + rsp->length + 2); + if (rspn >= end) { + rsp = rspn; + break; + } + if (rtp_set_sdes + (session, sd->ssrc, rsp->type, rsp->data, + rsp->length)) { + if (!filter_event(session, sd->ssrc)) { + event.ssrc = sd->ssrc; + event.type = RX_SDES; + event.data = (void *)rsp; + session->callback(session, + &event); + } + } else { + debug_msg + ("Invalid sdes item for source 0x%08x, skipping...\n", + sd->ssrc); + } + } + } + sd = (struct rtcp_sdes_t *)((uint32_t *) sd + + (((char *)rsp - (char *)sd) >> 2) + + 1); + } + if (count >= 0) { + debug_msg("Invalid RTCP SDES packet, some items ignored.\n"); + } } -static void process_rtcp_bye(struct rtp *session, rtcp_t *packet) +static void process_rtcp_bye(struct rtp *session, rtcp_t * packet) { - int i; - uint32_t ssrc; - rtp_event event; - source *s; + int i; + uint32_t ssrc; + rtp_event event; + source *s; - for (i = 0; i < packet->common.count; i++) { - ssrc = ntohl(packet->r.bye.ssrc[i]); - /* This is kind-of strange, since we create a source we are about to delete. */ - /* This is done to ensure that the source mentioned in the event which is */ - /* passed to the user of the RTP library is valid, and simplify client code. */ - create_source(session, ssrc, FALSE); - /* Call the event handler... */ - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = RX_BYE; - event.data = NULL; - session->callback(session, &event); - } - /* Mark the source as ready for deletion. Sources are not deleted immediately */ - /* since some packets may be delayed and arrive after the BYE... */ - s = get_source(session, ssrc); - s->got_bye = TRUE; - check_source(s); - session->bye_count++; - } + for (i = 0; i < packet->common.count; i++) { + ssrc = ntohl(packet->r.bye.ssrc[i]); + /* This is kind-of strange, since we create a source we are about to delete. */ + /* This is done to ensure that the source mentioned in the event which is */ + /* passed to the user of the RTP library is valid, and simplify client code. */ + create_source(session, ssrc, FALSE); + /* Call the event handler... */ + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = RX_BYE; + event.data = NULL; + session->callback(session, &event); + } + /* Mark the source as ready for deletion. Sources are not deleted immediately */ + /* since some packets may be delayed and arrive after the BYE... */ + s = get_source(session, ssrc); + s->got_bye = TRUE; + check_source(s); + session->bye_count++; + } } -static void process_rtcp_app(struct rtp *session, rtcp_t *packet) +static void process_rtcp_app(struct rtp *session, rtcp_t * packet) { - uint32_t ssrc; - rtp_event event; - rtcp_app *app; - source *s; - int data_len; + uint32_t ssrc; + rtp_event event; + rtcp_app *app; + source *s; + int data_len; - /* Update the database for this source. */ - ssrc = ntohl(packet->r.app.ssrc); - create_source(session, ssrc, FALSE); - s = get_source(session, ssrc); - if (s == NULL) { - /* This should only occur in the event of database malfunction. */ - debug_msg("Source 0x%08x invalid, skipping...\n", ssrc); - return; - } - check_source(s); + /* Update the database for this source. */ + ssrc = ntohl(packet->r.app.ssrc); + create_source(session, ssrc, FALSE); + s = get_source(session, ssrc); + if (s == NULL) { + /* This should only occur in the event of database malfunction. */ + debug_msg("Source 0x%08x invalid, skipping...\n", ssrc); + return; + } + check_source(s); - /* Copy the entire packet, converting the header (only) into host byte order. */ - app = (rtcp_app *) malloc(RTP_MAX_PACKET_LEN); - app->version = packet->common.version; - app->p = packet->common.p; - app->subtype = packet->common.count; - app->pt = packet->common.pt; - app->length = ntohs(packet->common.length); - app->ssrc = ssrc; - app->name[0] = packet->r.app.name[0]; - app->name[1] = packet->r.app.name[1]; - app->name[2] = packet->r.app.name[2]; - app->name[3] = packet->r.app.name[3]; - data_len = (app->length - 2) * 4; - memcpy(app->data, packet->r.app.data, data_len); + /* Copy the entire packet, converting the header (only) into host byte order. */ + app = (rtcp_app *) malloc(RTP_MAX_PACKET_LEN); + app->version = packet->common.version; + app->p = packet->common.p; + app->subtype = packet->common.count; + app->pt = packet->common.pt; + app->length = ntohs(packet->common.length); + app->ssrc = ssrc; + app->name[0] = packet->r.app.name[0]; + app->name[1] = packet->r.app.name[1]; + app->name[2] = packet->r.app.name[2]; + app->name[3] = packet->r.app.name[3]; + data_len = (app->length - 2) * 4; + memcpy(app->data, packet->r.app.data, data_len); - /* Callback to the application to process the app packet... */ - if (!filter_event(session, ssrc)) { - event.ssrc = ssrc; - event.type = RX_APP; - event.data = (void *) app; /* The callback function MUST free this! */ - session->callback(session, &event); - } + /* Callback to the application to process the app packet... */ + if (!filter_event(session, ssrc)) { + event.ssrc = ssrc; + event.type = RX_APP; + event.data = (void *)app; /* The callback function MUST free this! */ + session->callback(session, &event); + } } -static -uint32_t compute_rtt (struct rtp *session, rtcp_rx *rrx) { - UNUSED (rrx); - UNUSED (session); - return 0; +static +uint32_t compute_rtt(struct rtp *session, rtcp_rx * rrx) +{ + UNUSED(rrx); + UNUSED(session); + return 0; } -static void rtp_process_ctrl(struct rtp *session, uint8_t *buffer, int buflen) +static void rtp_process_ctrl(struct rtp *session, uint8_t * buffer, int buflen) { - /* This routine processes incoming RTCP packets */ - rtp_event event; - rtcp_t *packet; - uint8_t initVec[8] = {0,0,0,0,0,0,0,0}; - int first; - uint32_t packet_ssrc = rtp_my_ssrc(session); + /* This routine processes incoming RTCP packets */ + rtp_event event; + rtcp_t *packet; + uint8_t initVec[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + int first; + uint32_t packet_ssrc = rtp_my_ssrc(session); - if (buflen > 0) { - if (session->encryption_enabled) - { - /* Decrypt the packet... */ - (session->decrypt_func)(session, buffer, buflen, initVec); - buffer += 4; /* Skip the random prefix... */ - buflen -= 4; - } - if (validate_rtcp(buffer, buflen)) { - first = TRUE; - packet = (rtcp_t *) buffer; - while (packet < (rtcp_t *) (buffer + buflen)) { - switch (packet->common.pt) { - case RTCP_SR: - if (first && !filter_event(session, ntohl(packet->r.sr.sr.ssrc))) { - event.ssrc = ntohl(packet->r.sr.sr.ssrc); - event.type = RX_RTCP_START; - event.data = &buflen; - packet_ssrc = event.ssrc; - session->callback(session, &event); - } - process_rtcp_sr(session, packet); - break; - case RTCP_RR: - if (first && !filter_event(session, ntohl(packet->r.rr.ssrc))) { - event.ssrc = ntohl(packet->r.rr.ssrc); - event.type = RX_RTCP_START; - event.data = &buflen; - packet_ssrc = event.ssrc; - session->callback(session, &event); - } - process_rtcp_rr(session, packet); - break; - case RTCP_RX: - /* am not sending up a RX_RTCP_START... */ - process_rtcp_rx (session, packet); - if (session->tfrc_on) { - /* send up TFRC stuff ... */ - event.ssrc = ntohl(packet->r.rx.ssrc); - event.type = RX_TFRC_RX; - event.data = &buflen; - packet_ssrc = event.ssrc; - session->callback(session, &event); - /* compute the rtt time */ - compute_rtt (session, packet->r.rx.rx); - } else - debug_msg("RTCP_RX recieved without congestion control?"); - break; - case RTCP_SDES: - if (first && !filter_event(session, ntohl(packet->r.sdes.ssrc))) { - event.ssrc = ntohl(packet->r.sdes.ssrc); - event.type = RX_RTCP_START; - event.data = &buflen; - packet_ssrc = event.ssrc; - session->callback(session, &event); - } - process_rtcp_sdes(session, packet); - break; - case RTCP_BYE: - if (first && !filter_event(session, ntohl(packet->r.bye.ssrc[0]))) { - event.ssrc = ntohl(packet->r.bye.ssrc[0]); - event.type = RX_RTCP_START; - event.data = &buflen; - packet_ssrc = event.ssrc; - session->callback(session, &event); - } - process_rtcp_bye(session, packet); - break; - case RTCP_APP: - if (first && !filter_event(session, ntohl(packet->r.app.ssrc))) { - event.ssrc = ntohl(packet->r.app.ssrc); - event.type = RX_RTCP_START; - event.data = &buflen; - session->callback(session, &event); - } - process_rtcp_app(session, packet); - break; - default: - debug_msg("RTCP packet with unknown type (%d) ignored.\n", packet->common.pt); - break; - } - packet = (rtcp_t *) ((char *) packet + (4 * (ntohs(packet->common.length) + 1))); - first = FALSE; - } - if (session->avg_rtcp_size < 0) { - /* This is the first RTCP packet we've received, set our initial estimate */ - /* of the average packet size to be the size of this packet. */ - session->avg_rtcp_size = buflen + RTP_LOWER_LAYER_OVERHEAD; - } else { - /* Update our estimate of the average RTCP packet size. The constants are */ - /* 1/16 and 15/16 (section 6.3.3 of draft-ietf-avt-rtp-new-02.txt). */ - session->avg_rtcp_size = (0.0625 * (buflen + RTP_LOWER_LAYER_OVERHEAD)) + (0.9375 * session->avg_rtcp_size); - } - /* Signal that we've finished processing this packet */ - if (!filter_event(session, packet_ssrc)) { - event.ssrc = packet_ssrc; - event.type = RX_RTCP_FINISH; - event.data = NULL; - session->callback(session, &event); - } - } else { - debug_msg("Invalid RTCP packet discarded\n"); - session->invalid_rtcp_count++; - } - } + if (buflen > 0) { + if (session->encryption_enabled) { + /* Decrypt the packet... */ + (session->decrypt_func) (session, buffer, buflen, + initVec); + buffer += 4; /* Skip the random prefix... */ + buflen -= 4; + } + if (validate_rtcp(buffer, buflen)) { + first = TRUE; + packet = (rtcp_t *) buffer; + while (packet < (rtcp_t *) (buffer + buflen)) { + switch (packet->common.pt) { + case RTCP_SR: + if (first + && !filter_event(session, + ntohl(packet->r.sr. + sr.ssrc))) { + event.ssrc = + ntohl(packet->r.sr.sr.ssrc); + event.type = RX_RTCP_START; + event.data = &buflen; + packet_ssrc = event.ssrc; + session->callback(session, + &event); + } + process_rtcp_sr(session, packet); + break; + case RTCP_RR: + if (first + && !filter_event(session, + ntohl(packet->r.rr. + ssrc))) { + event.ssrc = + ntohl(packet->r.rr.ssrc); + event.type = RX_RTCP_START; + event.data = &buflen; + packet_ssrc = event.ssrc; + session->callback(session, + &event); + } + process_rtcp_rr(session, packet); + break; + case RTCP_RX: + /* am not sending up a RX_RTCP_START... */ + process_rtcp_rx(session, packet); + if (session->tfrc_on) { + /* send up TFRC stuff ... */ + event.ssrc = + ntohl(packet->r.rx.ssrc); + event.type = RX_TFRC_RX; + event.data = &buflen; + packet_ssrc = event.ssrc; + session->callback(session, + &event); + /* compute the rtt time */ + compute_rtt(session, + packet->r.rx.rx); + } else + debug_msg + ("RTCP_RX recieved without congestion control?"); + break; + case RTCP_SDES: + if (first + && !filter_event(session, + ntohl(packet->r. + sdes. + ssrc))) { + event.ssrc = + ntohl(packet->r.sdes.ssrc); + event.type = RX_RTCP_START; + event.data = &buflen; + packet_ssrc = event.ssrc; + session->callback(session, + &event); + } + process_rtcp_sdes(session, packet); + break; + case RTCP_BYE: + if (first + && !filter_event(session, + ntohl(packet->r. + bye. + ssrc[0]))) { + event.ssrc = + ntohl(packet->r.bye. + ssrc[0]); + event.type = RX_RTCP_START; + event.data = &buflen; + packet_ssrc = event.ssrc; + session->callback(session, + &event); + } + process_rtcp_bye(session, packet); + break; + case RTCP_APP: + if (first + && !filter_event(session, + ntohl(packet->r. + app.ssrc))) { + event.ssrc = + ntohl(packet->r.app.ssrc); + event.type = RX_RTCP_START; + event.data = &buflen; + session->callback(session, + &event); + } + process_rtcp_app(session, packet); + break; + default: + debug_msg + ("RTCP packet with unknown type (%d) ignored.\n", + packet->common.pt); + break; + } + packet = + (rtcp_t *) ((char *)packet + + (4 * + (ntohs(packet->common.length) + + 1))); + first = FALSE; + } + if (session->avg_rtcp_size < 0) { + /* This is the first RTCP packet we've received, set our initial estimate */ + /* of the average packet size to be the size of this packet. */ + session->avg_rtcp_size = + buflen + RTP_LOWER_LAYER_OVERHEAD; + } else { + /* Update our estimate of the average RTCP packet size. The constants are */ + /* 1/16 and 15/16 (section 6.3.3 of draft-ietf-avt-rtp-new-02.txt). */ + session->avg_rtcp_size = + (0.0625 * + (buflen + RTP_LOWER_LAYER_OVERHEAD)) + + (0.9375 * session->avg_rtcp_size); + } + /* Signal that we've finished processing this packet */ + if (!filter_event(session, packet_ssrc)) { + event.ssrc = packet_ssrc; + event.type = RX_RTCP_FINISH; + event.data = NULL; + session->callback(session, &event); + } + } else { + debug_msg("Invalid RTCP packet discarded\n"); + session->invalid_rtcp_count++; + } + } } /** @@ -2014,30 +2131,30 @@ static void rtp_process_ctrl(struct rtp *session, uint8_t *buffer, int buflen) */ int rtp_recv(struct rtp *session, struct timeval *timeout, uint32_t curr_rtp_ts) { - check_database(session); - udp_fd_zero(); - udp_fd_set(session->rtp_socket); - udp_fd_set(session->rtcp_socket); - if (udp_select(timeout) > 0) { - if (udp_fd_isset(session->rtp_socket)) { - rtp_recv_data(session, curr_rtp_ts); - } - if (udp_fd_isset(session->rtcp_socket)) { - uint8_t buffer[RTP_MAX_PACKET_LEN]; - int buflen; - buflen = udp_recv(session->rtcp_socket, (char *)buffer, RTP_MAX_PACKET_LEN); - ntp64_time(&tmp_sec, &tmp_frac); - rtp_process_ctrl(session, buffer, buflen); - } - check_database(session); + check_database(session); + udp_fd_zero(); + udp_fd_set(session->rtp_socket); + udp_fd_set(session->rtcp_socket); + if (udp_select(timeout) > 0) { + if (udp_fd_isset(session->rtp_socket)) { + rtp_recv_data(session, curr_rtp_ts); + } + if (udp_fd_isset(session->rtcp_socket)) { + uint8_t buffer[RTP_MAX_PACKET_LEN]; + int buflen; + buflen = + udp_recv(session->rtcp_socket, (char *)buffer, + RTP_MAX_PACKET_LEN); + ntp64_time(&tmp_sec, &tmp_frac); + rtp_process_ctrl(session, buffer, buflen); + } + check_database(session); return TRUE; - } - check_database(session); + } + check_database(session); return FALSE; } - - /** * rtp_add_csrc: * @session: the session pointer (returned by rtp_init()) @@ -2050,23 +2167,24 @@ int rtp_recv(struct rtp *session, struct timeval *timeout, uint32_t curr_rtp_ts) **/ int rtp_add_csrc(struct rtp *session, uint32_t csrc) { - /* Mark csrc as something for which we should advertise RTCP SDES items, */ - /* in addition to our own SDES. */ - source *s; + /* Mark csrc as something for which we should advertise RTCP SDES items, */ + /* in addition to our own SDES. */ + source *s; - check_database(session); - s = get_source(session, csrc); - if (s == NULL) { - s = create_source(session, csrc, FALSE); - debug_msg("Created source 0x%08x as CSRC\n", csrc); - } - check_source(s); - if (!s->should_advertise_sdes) { - s->should_advertise_sdes = TRUE; - session->csrc_count++; - debug_msg("Added CSRC 0x%08lx as CSRC %d\n", csrc, session->csrc_count); + check_database(session); + s = get_source(session, csrc); + if (s == NULL) { + s = create_source(session, csrc, FALSE); + debug_msg("Created source 0x%08x as CSRC\n", csrc); } - return TRUE; + check_source(s); + if (!s->should_advertise_sdes) { + s->should_advertise_sdes = TRUE; + session->csrc_count++; + debug_msg("Added CSRC 0x%08lx as CSRC %d\n", csrc, + session->csrc_count); + } + return TRUE; } /** @@ -2081,21 +2199,21 @@ int rtp_add_csrc(struct rtp *session, uint32_t csrc) **/ int rtp_del_csrc(struct rtp *session, uint32_t csrc) { - source *s; + source *s; - check_database(session); - s = get_source(session, csrc); - if (s == NULL) { - debug_msg("Invalid source 0x%08x\n", csrc); - return FALSE; - } - check_source(s); - s->should_advertise_sdes = FALSE; - session->csrc_count--; - if (session->last_advertised_csrc >= session->csrc_count) { + check_database(session); + s = get_source(session, csrc); + if (s == NULL) { + debug_msg("Invalid source 0x%08x\n", csrc); + return FALSE; + } + check_source(s); + s->should_advertise_sdes = FALSE; + session->csrc_count--; + if (session->last_advertised_csrc >= session->csrc_count) { session->last_advertised_csrc = 0; } - return TRUE; + return TRUE; } /** @@ -2115,65 +2233,74 @@ int rtp_del_csrc(struct rtp *session, uint32_t csrc) * * Return value: Returns TRUE if participant exists, FALSE otherwise. **/ -int rtp_set_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type, const char *value, int length) +int rtp_set_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type, + const char *value, int length) { - source *s; - char *v; + source *s; + char *v; - check_database(session); + check_database(session); - s = get_source(session, ssrc); - if (s == NULL) { - debug_msg("Invalid source 0x%08x\n", ssrc); - return FALSE; - } - check_source(s); + s = get_source(session, ssrc); + if (s == NULL) { + debug_msg("Invalid source 0x%08x\n", ssrc); + return FALSE; + } + check_source(s); - v = (char *) malloc(length + 1); - memset(v, '\0', length + 1); - memcpy(v, value, length); + v = (char *)malloc(length + 1); + memset(v, '\0', length + 1); + memcpy(v, value, length); - switch (type) { - case RTCP_SDES_CNAME: - if (s->sdes_cname) free(s->sdes_cname); - s->sdes_cname = v; - break; - case RTCP_SDES_NAME: - if (s->sdes_name) free(s->sdes_name); - s->sdes_name = v; - break; - case RTCP_SDES_EMAIL: - if (s->sdes_email) free(s->sdes_email); - s->sdes_email = v; - break; - case RTCP_SDES_PHONE: - if (s->sdes_phone) free(s->sdes_phone); - s->sdes_phone = v; - break; - case RTCP_SDES_LOC: - if (s->sdes_loc) free(s->sdes_loc); - s->sdes_loc = v; - break; - case RTCP_SDES_TOOL: - if (s->sdes_tool) free(s->sdes_tool); - s->sdes_tool = v; - break; - case RTCP_SDES_NOTE: - if (s->sdes_note) free(s->sdes_note); - s->sdes_note = v; - break; - case RTCP_SDES_PRIV: - if (s->sdes_priv) free(s->sdes_priv); - s->sdes_priv = v; - break; - default : - debug_msg("Unknown SDES item (type=%d, value=%s)\n", type, v); - free(v); - check_database(session); - return FALSE; - } - check_database(session); - return TRUE; + switch (type) { + case RTCP_SDES_CNAME: + if (s->sdes_cname) + free(s->sdes_cname); + s->sdes_cname = v; + break; + case RTCP_SDES_NAME: + if (s->sdes_name) + free(s->sdes_name); + s->sdes_name = v; + break; + case RTCP_SDES_EMAIL: + if (s->sdes_email) + free(s->sdes_email); + s->sdes_email = v; + break; + case RTCP_SDES_PHONE: + if (s->sdes_phone) + free(s->sdes_phone); + s->sdes_phone = v; + break; + case RTCP_SDES_LOC: + if (s->sdes_loc) + free(s->sdes_loc); + s->sdes_loc = v; + break; + case RTCP_SDES_TOOL: + if (s->sdes_tool) + free(s->sdes_tool); + s->sdes_tool = v; + break; + case RTCP_SDES_NOTE: + if (s->sdes_note) + free(s->sdes_note); + s->sdes_note = v; + break; + case RTCP_SDES_PRIV: + if (s->sdes_priv) + free(s->sdes_priv); + s->sdes_priv = v; + break; + default: + debug_msg("Unknown SDES item (type=%d, value=%s)\n", type, v); + free(v); + check_database(session); + return FALSE; + } + check_database(session); + return TRUE; } /** @@ -2191,21 +2318,22 @@ int rtp_set_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type, const * Return value: pointer to string containing SDES description if * received, NULL otherwise. */ -const char *rtp_get_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type) +const char *rtp_get_sdes(struct rtp *session, uint32_t ssrc, + rtcp_sdes_type type) { - source *s; + source *s; - check_database(session); + check_database(session); - s = get_source(session, ssrc); - if (s == NULL) { - debug_msg("Invalid source 0x%08x\n", ssrc); - return NULL; - } - check_source(s); + s = get_source(session, ssrc); + if (s == NULL) { + debug_msg("Invalid source 0x%08x\n", ssrc); + return NULL; + } + check_source(s); - switch (type) { - case RTCP_SDES_CNAME: + switch (type) { + case RTCP_SDES_CNAME: return s->sdes_cname; case RTCP_SDES_NAME: return s->sdes_name; @@ -2219,13 +2347,13 @@ const char *rtp_get_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type return s->sdes_tool; case RTCP_SDES_NOTE: return s->sdes_note; - case RTCP_SDES_PRIV: - return s->sdes_priv; + case RTCP_SDES_PRIV: + return s->sdes_priv; default: /* This includes RTCP_SDES_PRIV and RTCP_SDES_END */ debug_msg("Unknown SDES item (type=%d)\n", type); - } - return NULL; + } + return NULL; } /** @@ -2240,18 +2368,18 @@ const char *rtp_get_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type **/ const rtcp_sr *rtp_get_sr(struct rtp *session, uint32_t ssrc) { - /* Return the last SR received from this ssrc. The */ - /* caller MUST NOT free the memory returned to it. */ - source *s; + /* Return the last SR received from this ssrc. The */ + /* caller MUST NOT free the memory returned to it. */ + source *s; - check_database(session); + check_database(session); - s = get_source(session, ssrc); - if (s == NULL) { - return NULL; - } - check_source(s); - return s->sr; + s = get_source(session, ssrc); + if (s == NULL) { + return NULL; + } + check_source(s); + return s->sr; } /** @@ -2266,9 +2394,10 @@ const rtcp_sr *rtp_get_sr(struct rtp *session, uint32_t ssrc) * Return value: A pointer to a rtcp_rr structure on success, NULL * otherwise. The pointer must not be freed. **/ -const rtcp_rr *rtp_get_rr(struct rtp *session, uint32_t reporter, uint32_t reportee) +const rtcp_rr *rtp_get_rr(struct rtp *session, uint32_t reporter, + uint32_t reportee) { - check_database(session); + check_database(session); return get_rr(session, reporter, reportee); } @@ -2300,307 +2429,335 @@ const rtcp_rr *rtp_get_rr(struct rtp *session, uint32_t reporter, uint32_t repor * * Return value: Number of bytes transmitted. **/ -int rtp_send_data(struct rtp *session, uint32_t rtp_ts, char pt, int m, - int cc, uint32_t* csrc, - char *data, int data_len, - char *extn, uint16_t extn_len, uint16_t extn_type) -{ - return rtp_send_data_hdr(session, rtp_ts, pt, m, cc, csrc, NULL, 0, data, data_len, extn, extn_len, extn_type); -} - -int -rtp_send_data_hdr(struct rtp *session, - uint32_t rtp_ts, char pt, int m, - int cc, uint32_t csrc[], - char *phdr, int phdr_len, - char *data, int data_len, +int rtp_send_data(struct rtp *session, uint32_t rtp_ts, char pt, int m, + int cc, uint32_t * csrc, + char *data, int data_len, char *extn, uint16_t extn_len, uint16_t extn_type) { - int vlen, buffer_len, i, rc, pad, pad_len; - uint8_t *buffer = NULL; - rtp_packet *packet = NULL; - uint8_t initVec[8] = {0,0,0,0,0,0,0,0}; - struct iovec send_vector[3]; - int send_vector_len; + return rtp_send_data_hdr(session, rtp_ts, pt, m, cc, csrc, NULL, 0, + data, data_len, extn, extn_len, extn_type); +} - check_database(session); +int +rtp_send_data_hdr(struct rtp *session, + uint32_t rtp_ts, char pt, int m, + int cc, uint32_t csrc[], + char *phdr, int phdr_len, + char *data, int data_len, + char *extn, uint16_t extn_len, uint16_t extn_type) +{ + int vlen, buffer_len, i, rc, pad, pad_len; + uint8_t *buffer = NULL; + rtp_packet *packet = NULL; + uint8_t initVec[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + struct iovec send_vector[3]; + int send_vector_len; - assert((data == NULL && data_len == 0) || (data != NULL && data_len > 0)); + check_database(session); - vlen=12; + assert((data == NULL && data_len == 0) + || (data != NULL && data_len > 0)); + + vlen = 12; if (session->tfrc_on) { - vlen+=4; - if (session->new_rtt) - vlen+=4; - } - buffer_len = vlen + (4 * cc); + vlen += 4; + if (session->new_rtt) + vlen += 4; + } + buffer_len = vlen + (4 * cc); - if (extn != NULL) { - buffer_len += (extn_len + 1) * 4; - } + if (extn != NULL) { + buffer_len += (extn_len + 1) * 4; + } - /* Do we need to pad this packet to a multiple of 64 bits? */ - /* This is only needed if encryption is enabled, since DES */ - /* only works on multiples of 64 bits. We just calculate */ - /* the amount of padding to add here, so we can reserve */ - /* space - the actual padding is added later. */ + /* Do we need to pad this packet to a multiple of 64 bits? */ + /* This is only needed if encryption is enabled, since DES */ + /* only works on multiples of 64 bits. We just calculate */ + /* the amount of padding to add here, so we can reserve */ + /* space - the actual padding is added later. */ #ifdef NDEF - /* FIXME: This is broken, due to scatter send [csp] */ /* FIXME */ - if ((session->encryption_enabled) && - ((buffer_len % session->encryption_pad_length) != 0)) { - pad = TRUE; - pad_len = session->encryption_pad_length - (buffer_len % session->encryption_pad_length); - buffer_len += pad_len; - assert((buffer_len % session->encryption_pad_length) == 0); - } else { - pad = FALSE; - pad_len = 0; - } + /* FIXME: This is broken, due to scatter send [csp] *//* FIXME */ + if ((session->encryption_enabled) && + ((buffer_len % session->encryption_pad_length) != 0)) { + pad = TRUE; + pad_len = + session->encryption_pad_length - + (buffer_len % session->encryption_pad_length); + buffer_len += pad_len; + assert((buffer_len % session->encryption_pad_length) == 0); + } else { + pad = FALSE; + pad_len = 0; + } #endif - pad = FALSE; /* FIXME */ - pad_len = 0; + pad = FALSE; /* FIXME */ + pad_len = 0; - /* Allocate memory for the packet... */ - if (buffer == NULL) { - assert(buffer_len < RTP_MAX_PACKET_LEN); - /* we dont always need 20 (12|16) but this seems to work. LG */ - buffer = (uint8_t *) malloc(20 + RTP_PACKET_HEADER_SIZE); - packet = (rtp_packet *) buffer; - } - send_vector[0].iov_base = buffer + RTP_PACKET_HEADER_SIZE; - send_vector[0].iov_len = buffer_len; - send_vector_len = 1; + /* Allocate memory for the packet... */ + if (buffer == NULL) { + assert(buffer_len < RTP_MAX_PACKET_LEN); + /* we dont always need 20 (12|16) but this seems to work. LG */ + buffer = (uint8_t *) malloc(20 + RTP_PACKET_HEADER_SIZE); + packet = (rtp_packet *) buffer; + } + send_vector[0].iov_base = buffer + RTP_PACKET_HEADER_SIZE; + send_vector[0].iov_len = buffer_len; + send_vector_len = 1; - /* These are internal pointers into the buffer... */ + /* These are internal pointers into the buffer... */ #ifdef NDEF - packet->csrc = (uint32_t *) (buffer + RTP_PACKET_HEADER_SIZE + vlen); - packet->extn = (uint8_t *) (buffer + RTP_PACKET_HEADER_SIZE + vlen + (4 * cc)); - packet->data = (uint8_t *) (buffer + RTP_PACKET_HEADER_SIZE + vlen + (4 * cc)); - if (extn != NULL) { - packet->data += (extn_len + 1) * 4; - } + packet->csrc = (uint32_t *) (buffer + RTP_PACKET_HEADER_SIZE + vlen); + packet->extn = + (uint8_t *) (buffer + RTP_PACKET_HEADER_SIZE + vlen + (4 * cc)); + packet->data = + (uint8_t *) (buffer + RTP_PACKET_HEADER_SIZE + vlen + (4 * cc)); + if (extn != NULL) { + packet->data += (extn_len + 1) * 4; + } #endif - /* ...and the actual packet header... */ - packet->v = 2; - packet->p = pad; - packet->x = (extn != NULL); - packet->cc = cc; - packet->m = m; - packet->pt = pt; - packet->seq = htons(session->rtp_seq++); - packet->ts = htonl(rtp_ts); - packet->ssrc = htonl(session->my_ssrc); + /* ...and the actual packet header... */ + packet->v = 2; + packet->p = pad; + packet->x = (extn != NULL); + packet->cc = cc; + packet->m = m; + packet->pt = pt; + packet->seq = htons(session->rtp_seq++); + packet->ts = htonl(rtp_ts); + packet->ssrc = htonl(session->my_ssrc); - /* ... do tfrc stuff... */ - if (session->tfrc_on) { - packet->send_ts = htonl(get_local_mediatime()); - if (session->new_rtt) { - packet->rtt = htonl(session->cmp_rtt); - /* hopefully this will set the 7th bit */ - packet->pt = packet->pt | 64; - } - else - packet->pt = packet->pt & 63; /* this should clear the 7th bit */ - } - - /* ...now the CSRC list... */ - for (i = 0; i < cc; i++) { - packet->csrc[i] = htonl(csrc[i]); - } - /* ...a header extension? */ - if (extn != NULL) { - /* We don't use the packet->extn_type field here, that's for receive only... */ - uint16_t *base = (uint16_t *) packet->extn; - base[0] = htons(extn_type); - base[1] = htons(extn_len); - memcpy(packet->extn + 4, extn, extn_len * 4); - } - /* ...the payload header... */ - if (phdr != NULL) { - send_vector[send_vector_len].iov_base = phdr; - send_vector[send_vector_len].iov_len = phdr_len; - send_vector_len++; - } - /* ...and the media data... */ - if (data_len > 0) { - send_vector[send_vector_len].iov_base = data; - send_vector[send_vector_len].iov_len = data_len; - send_vector_len++; - } + /* ... do tfrc stuff... */ + if (session->tfrc_on) { + packet->send_ts = htonl(get_local_mediatime()); + if (session->new_rtt) { + packet->rtt = htonl(session->cmp_rtt); + /* hopefully this will set the 7th bit */ + packet->pt = packet->pt | 64; + } else + packet->pt = packet->pt & 63; /* this should clear the 7th bit */ + } -#ifdef NDEF /* FIXME */ - /* ...and any padding... */ - if (pad) { - for (i = 0; i < pad_len; i++) { - buffer[buffer_len + RTP_PACKET_HEADER_SIZE - pad_len + i] = 0; - } - buffer[buffer_len + RTP_PACKET_HEADER_SIZE - 1] = (char) pad_len; - } + /* ...now the CSRC list... */ + for (i = 0; i < cc; i++) { + packet->csrc[i] = htonl(csrc[i]); + } + /* ...a header extension? */ + if (extn != NULL) { + /* We don't use the packet->extn_type field here, that's for receive only... */ + uint16_t *base = (uint16_t *) packet->extn; + base[0] = htons(extn_type); + base[1] = htons(extn_len); + memcpy(packet->extn + 4, extn, extn_len * 4); + } + /* ...the payload header... */ + if (phdr != NULL) { + send_vector[send_vector_len].iov_base = phdr; + send_vector[send_vector_len].iov_len = phdr_len; + send_vector_len++; + } + /* ...and the media data... */ + if (data_len > 0) { + send_vector[send_vector_len].iov_base = data; + send_vector[send_vector_len].iov_len = data_len; + send_vector_len++; + } +#ifdef NDEF /* FIXME */ + /* ...and any padding... */ + if (pad) { + for (i = 0; i < pad_len; i++) { + buffer[buffer_len + RTP_PACKET_HEADER_SIZE - pad_len + + i] = 0; + } + buffer[buffer_len + RTP_PACKET_HEADER_SIZE - 1] = (char)pad_len; + } #endif - - /* Finally, encrypt if desired... */ - if (session->encryption_enabled) { - assert((buffer_len % session->encryption_pad_length) == 0); - (session->encrypt_func)(session, buffer + RTP_PACKET_HEADER_SIZE, buffer_len, initVec); - } - rc = udp_sendv(session->rtp_socket, send_vector, send_vector_len); - if (rc == -1) { - perror("sending RTP packet"); - } + /* Finally, encrypt if desired... */ + if (session->encryption_enabled) { + assert((buffer_len % session->encryption_pad_length) == 0); + (session->encrypt_func) (session, + buffer + RTP_PACKET_HEADER_SIZE, + buffer_len, initVec); + } - free(buffer); + rc = udp_sendv(session->rtp_socket, send_vector, send_vector_len); + if (rc == -1) { + perror("sending RTP packet"); + } - /* Update the RTCP statistics... */ - session->we_sent = TRUE; - session->rtp_pcount += 1; - session->rtp_bcount += buffer_len; - gettimeofday(&session->last_rtp_send_time, NULL); + free(buffer); - check_database(session); - return rc; + /* Update the RTCP statistics... */ + session->we_sent = TRUE; + session->rtp_pcount += 1; + session->rtp_bcount += buffer_len; + gettimeofday(&session->last_rtp_send_time, NULL); + + check_database(session); + return rc; } -static int format_report_blocks(rtcp_rr *rrp, int remaining_length, struct rtp *session) +static int format_report_blocks(rtcp_rr * rrp, int remaining_length, + struct rtp *session) { - int nblocks = 0; - int h; - source *s; - uint32_t now_sec; - uint32_t now_frac; + int nblocks = 0; + int h; + source *s; + uint32_t now_sec; + uint32_t now_frac; - for (h = 0; h < RTP_DB_SIZE; h++) { - for (s = session->db[h]; s != NULL; s = s->next) { - check_source(s); - if ((nblocks == 31) || (remaining_length < 24)) { - break; /* Insufficient space for more report blocks... */ - } - if (s->sender) { - /* Much of this is taken from A.3 of draft-ietf-avt-rtp-new-01.txt */ - int extended_max = s->cycles + s->max_seq; - int expected = extended_max - s->base_seq + 1; - int lost = expected - s->received; - int expected_interval = expected - s->expected_prior; - int received_interval = s->received - s->received_prior; - int lost_interval = expected_interval - received_interval; - int fraction; - uint32_t lsr; - uint32_t dlsr; + for (h = 0; h < RTP_DB_SIZE; h++) { + for (s = session->db[h]; s != NULL; s = s->next) { + check_source(s); + if ((nblocks == 31) || (remaining_length < 24)) { + break; /* Insufficient space for more report blocks... */ + } + if (s->sender) { + /* Much of this is taken from A.3 of draft-ietf-avt-rtp-new-01.txt */ + int extended_max = s->cycles + s->max_seq; + int expected = extended_max - s->base_seq + 1; + int lost = expected - s->received; + int expected_interval = + expected - s->expected_prior; + int received_interval = + s->received - s->received_prior; + int lost_interval = + expected_interval - received_interval; + int fraction; + uint32_t lsr; + uint32_t dlsr; - //printf("lost_interval %d\n", lost_interval); - s->expected_prior = expected; - s->received_prior = s->received; - if (expected_interval == 0 || lost_interval <= 0) { - fraction = 0; - } else { - fraction = (lost_interval << 8) / expected_interval; - } + //printf("lost_interval %d\n", lost_interval); + s->expected_prior = expected; + s->received_prior = s->received; + if (expected_interval == 0 + || lost_interval <= 0) { + fraction = 0; + } else { + fraction = + (lost_interval << 8) / + expected_interval; + } - if (s->sr == NULL) { - lsr = 0; - dlsr = 0; - } else { - ntp64_time(&now_sec, &now_frac); - lsr = ntp64_to_ntp32(s->sr->ntp_sec, s->sr->ntp_frac); - dlsr = ntp64_to_ntp32(now_sec, now_frac) - ntp64_to_ntp32(s->last_sr_sec, s->last_sr_frac); - } - rrp->ssrc = htonl(s->ssrc); - rrp->fract_lost = fraction; - rrp->total_lost = lost & 0x00ffffff; - rrp->last_seq = htonl(extended_max); - rrp->jitter = htonl(s->jitter / 16); - rrp->lsr = htonl(lsr); - rrp->dlsr = htonl(dlsr); - rrp++; - remaining_length -= 24; - nblocks++; - s->sender = FALSE; - session->sender_count--; - if (session->sender_count == 0) { - break; /* No point continuing, since we've reported on all senders... */ - } - } - } - } - return nblocks; + if (s->sr == NULL) { + lsr = 0; + dlsr = 0; + } else { + ntp64_time(&now_sec, &now_frac); + lsr = + ntp64_to_ntp32(s->sr->ntp_sec, + s->sr->ntp_frac); + dlsr = + ntp64_to_ntp32(now_sec, + now_frac) - + ntp64_to_ntp32(s->last_sr_sec, + s->last_sr_frac); + } + rrp->ssrc = htonl(s->ssrc); + rrp->fract_lost = fraction; + rrp->total_lost = lost & 0x00ffffff; + rrp->last_seq = htonl(extended_max); + rrp->jitter = htonl(s->jitter / 16); + rrp->lsr = htonl(lsr); + rrp->dlsr = htonl(dlsr); + rrp++; + remaining_length -= 24; + nblocks++; + s->sender = FALSE; + session->sender_count--; + if (session->sender_count == 0) { + break; /* No point continuing, since we've reported on all senders... */ + } + } + } + } + return nblocks; } -static uint8_t *format_rtcp_sr(uint8_t *buffer, int buflen, struct rtp *session, uint32_t rtp_ts) +static uint8_t *format_rtcp_sr(uint8_t * buffer, int buflen, + struct rtp *session, uint32_t rtp_ts) { - /* Write an RTCP SR into buffer, returning a pointer to */ - /* the next byte after the header we have just written. */ - rtcp_t *packet = (rtcp_t *) buffer; - int remaining_length; - uint32_t ntp_sec, ntp_frac; + /* Write an RTCP SR into buffer, returning a pointer to */ + /* the next byte after the header we have just written. */ + rtcp_t *packet = (rtcp_t *) buffer; + int remaining_length; + uint32_t ntp_sec, ntp_frac; - assert(buflen >= 28); /* ...else there isn't space for the header and sender report */ + assert(buflen >= 28); /* ...else there isn't space for the header and sender report */ - packet->common.version = 2; - packet->common.p = 0; - packet->common.count = 0; - packet->common.pt = RTCP_SR; - packet->common.length = htons(1); + packet->common.version = 2; + packet->common.p = 0; + packet->common.count = 0; + packet->common.pt = RTCP_SR; + packet->common.length = htons(1); ntp64_time(&ntp_sec, &ntp_frac); - packet->r.sr.sr.ssrc = htonl(rtp_my_ssrc(session)); - packet->r.sr.sr.ntp_sec = htonl(ntp_sec); - packet->r.sr.sr.ntp_frac = htonl(ntp_frac); - packet->r.sr.sr.rtp_ts = htonl(rtp_ts); - packet->r.sr.sr.sender_pcount = htonl(session->rtp_pcount); - packet->r.sr.sr.sender_bcount = htonl(session->rtp_bcount); + packet->r.sr.sr.ssrc = htonl(rtp_my_ssrc(session)); + packet->r.sr.sr.ntp_sec = htonl(ntp_sec); + packet->r.sr.sr.ntp_frac = htonl(ntp_frac); + packet->r.sr.sr.rtp_ts = htonl(rtp_ts); + packet->r.sr.sr.sender_pcount = htonl(session->rtp_pcount); + packet->r.sr.sr.sender_bcount = htonl(session->rtp_bcount); - /* Add report blocks, until we either run out of senders */ - /* to report upon or we run out of space in the buffer. */ - remaining_length = buflen - 28; - packet->common.count = format_report_blocks(packet->r.sr.rr, remaining_length, session); - packet->common.length = htons((uint16_t) (6 + (packet->common.count * 6))); - return buffer + 28 + (24 * packet->common.count); + /* Add report blocks, until we either run out of senders */ + /* to report upon or we run out of space in the buffer. */ + remaining_length = buflen - 28; + packet->common.count = + format_report_blocks(packet->r.sr.rr, remaining_length, session); + packet->common.length = + htons((uint16_t) (6 + (packet->common.count * 6))); + return buffer + 28 + (24 * packet->common.count); } -static uint8_t *format_rtcp_rr(uint8_t *buffer, int buflen, struct rtp *session) +static uint8_t *format_rtcp_rr(uint8_t * buffer, int buflen, + struct rtp *session) { - /* Write an RTCP RR into buffer, returning a pointer to */ - /* the next byte after the header we have just written. */ - rtcp_t *packet = (rtcp_t *) buffer; - int remaining_length; + /* Write an RTCP RR into buffer, returning a pointer to */ + /* the next byte after the header we have just written. */ + rtcp_t *packet = (rtcp_t *) buffer; + int remaining_length; - assert(buflen >= 8); /* ...else there isn't space for the header */ + assert(buflen >= 8); /* ...else there isn't space for the header */ - packet->common.version = 2; - packet->common.p = 0; - packet->common.count = 0; - packet->common.pt = RTCP_RR; - packet->common.length = htons(1); - packet->r.rr.ssrc = htonl(session->my_ssrc); + packet->common.version = 2; + packet->common.p = 0; + packet->common.count = 0; + packet->common.pt = RTCP_RR; + packet->common.length = htons(1); + packet->r.rr.ssrc = htonl(session->my_ssrc); - /* Add report blocks, until we either run out of senders */ - /* to report upon or we run out of space in the buffer. */ - remaining_length = buflen - 8; - packet->common.count = format_report_blocks(packet->r.rr.rr, remaining_length, session); - packet->common.length = htons((uint16_t) (1 + (packet->common.count * 6))); - return buffer + 8 + (24 * packet->common.count); + /* Add report blocks, until we either run out of senders */ + /* to report upon or we run out of space in the buffer. */ + remaining_length = buflen - 8; + packet->common.count = + format_report_blocks(packet->r.rr.rr, remaining_length, session); + packet->common.length = + htons((uint16_t) (1 + (packet->common.count * 6))); + return buffer + 8 + (24 * packet->common.count); } -static int add_sdes_item(uint8_t *buf, int buflen, int type, const char *val) +static int add_sdes_item(uint8_t * buf, int buflen, int type, const char *val) { - /* Fill out an SDES item. It is assumed that the item is a NULL */ - /* terminated string. */ + /* Fill out an SDES item. It is assumed that the item is a NULL */ + /* terminated string. */ rtcp_sdes_item *shdr = (rtcp_sdes_item *) buf; - int namelen; + int namelen; if (val == NULL) { - debug_msg("Cannot format SDES item. type=%d val=%xp\n", type, val); + debug_msg("Cannot format SDES item. type=%d val=%xp\n", type, + val); return 0; } shdr->type = type; namelen = strlen(val); shdr->length = namelen; - strncpy(shdr->data, val, buflen - 2); /* The "-2" accounts for the other shdr fields */ + strncpy(shdr->data, val, buflen - 2); /* The "-2" accounts for the other shdr fields */ return namelen + 2; } -static uint8_t *format_rtcp_sdes(uint8_t *buffer, int buflen, uint32_t ssrc, struct rtp *session) +static uint8_t *format_rtcp_sdes(uint8_t * buffer, int buflen, uint32_t ssrc, + struct rtp *session) { /* From draft-ietf-avt-profile-new-00: */ /* "Applications may use any of the SDES items described in the */ @@ -2612,209 +2769,268 @@ static uint8_t *format_rtcp_sdes(uint8_t *buffer, int buflen, uint32_t ssrc, str /* specification. In other words, NAME is sent in RTCP packets 1, */ /* 4, 7, 10, 13, 16, 19, while, say, EMAIL is used in RTCP packet */ /* 22". */ - uint8_t *packet = buffer; - rtcp_common *common = (rtcp_common *) buffer; - const char *item; - size_t remaining_len; - int pad; + uint8_t *packet = buffer; + rtcp_common *common = (rtcp_common *) buffer; + const char *item; + size_t remaining_len; + int pad; - assert(buflen > (int) sizeof(rtcp_common)); + assert(buflen > (int)sizeof(rtcp_common)); - common->version = 2; - common->p = 0; - common->count = 1; - common->pt = RTCP_SDES; - common->length = 0; - packet += sizeof(rtcp_common); + common->version = 2; + common->p = 0; + common->count = 1; + common->pt = RTCP_SDES; + common->length = 0; + packet += sizeof(rtcp_common); - *((uint32_t *) packet) = htonl(ssrc); - packet += 4; + *((uint32_t *) packet) = htonl(ssrc); + packet += 4; - remaining_len = buflen - (packet - buffer); - item = rtp_get_sdes(session, ssrc, RTCP_SDES_CNAME); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_CNAME, item); - } - - remaining_len = buflen - (packet - buffer); - item = rtp_get_sdes(session, ssrc, RTCP_SDES_NOTE); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_NOTE, item); - } - - remaining_len = buflen - (packet - buffer); - if ((session->sdes_count_pri % 3) == 0) { - session->sdes_count_sec++; - if ((session->sdes_count_sec % 8) == 0) { - /* Note that the following is supposed to fall-through the cases */ - /* until one is found to send... The lack of break statements in */ - /* the switch is not a bug. */ - switch (session->sdes_count_ter % 5) { - case 0: item = rtp_get_sdes(session, ssrc, RTCP_SDES_TOOL); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_TOOL, item); - break; - } - case 1: item = rtp_get_sdes(session, ssrc, RTCP_SDES_EMAIL); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_EMAIL, item); - break; - } - case 2: item = rtp_get_sdes(session, ssrc, RTCP_SDES_PHONE); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_PHONE, item); - break; - } - case 3: item = rtp_get_sdes(session, ssrc, RTCP_SDES_LOC); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_LOC, item); - break; - } - case 4: item = rtp_get_sdes(session, ssrc, RTCP_SDES_PRIV); - if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_PRIV, item); - break; - } - } - session->sdes_count_ter++; - } else { - item = rtp_get_sdes(session, ssrc, RTCP_SDES_NAME); - if (item != NULL) { - packet += add_sdes_item(packet, remaining_len, RTCP_SDES_NAME, item); - } - } - } - session->sdes_count_pri++; - - /* Pad to a multiple of 4 bytes... */ - pad = 4 - ((packet - buffer) & 0x3); - while (pad--) { - *packet++ = RTCP_SDES_END; + remaining_len = buflen - (packet - buffer); + item = rtp_get_sdes(session, ssrc, RTCP_SDES_CNAME); + if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, RTCP_SDES_CNAME, item); } - common->length = htons((uint16_t) (((int) (packet - buffer) / 4) - 1)); + remaining_len = buflen - (packet - buffer); + item = rtp_get_sdes(session, ssrc, RTCP_SDES_NOTE); + if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, RTCP_SDES_NOTE, item); + } - return packet; + remaining_len = buflen - (packet - buffer); + if ((session->sdes_count_pri % 3) == 0) { + session->sdes_count_sec++; + if ((session->sdes_count_sec % 8) == 0) { + /* Note that the following is supposed to fall-through the cases */ + /* until one is found to send... The lack of break statements in */ + /* the switch is not a bug. */ + switch (session->sdes_count_ter % 5) { + case 0: + item = + rtp_get_sdes(session, ssrc, RTCP_SDES_TOOL); + if ((item != NULL) + && ((strlen(item) + (size_t) 2) <= + remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, + RTCP_SDES_TOOL, item); + break; + } + case 1: + item = + rtp_get_sdes(session, ssrc, + RTCP_SDES_EMAIL); + if ((item != NULL) + && ((strlen(item) + (size_t) 2) <= + remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, + RTCP_SDES_EMAIL, + item); + break; + } + case 2: + item = + rtp_get_sdes(session, ssrc, + RTCP_SDES_PHONE); + if ((item != NULL) + && ((strlen(item) + (size_t) 2) <= + remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, + RTCP_SDES_PHONE, + item); + break; + } + case 3: + item = + rtp_get_sdes(session, ssrc, RTCP_SDES_LOC); + if ((item != NULL) + && ((strlen(item) + (size_t) 2) <= + remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, + RTCP_SDES_LOC, item); + break; + } + case 4: + item = + rtp_get_sdes(session, ssrc, RTCP_SDES_PRIV); + if ((item != NULL) + && ((strlen(item) + (size_t) 2) <= + remaining_len)) { + packet += + add_sdes_item(packet, remaining_len, + RTCP_SDES_PRIV, item); + break; + } + } + session->sdes_count_ter++; + } else { + item = rtp_get_sdes(session, ssrc, RTCP_SDES_NAME); + if (item != NULL) { + packet += + add_sdes_item(packet, remaining_len, + RTCP_SDES_NAME, item); + } + } + } + session->sdes_count_pri++; + + /* Pad to a multiple of 4 bytes... */ + pad = 4 - ((packet - buffer) & 0x3); + while (pad--) { + *packet++ = RTCP_SDES_END; + } + + common->length = htons((uint16_t) (((int)(packet - buffer) / 4) - 1)); + + return packet; } -static uint8_t *format_rtcp_app(uint8_t *buffer, int buflen, uint32_t ssrc, rtcp_app *app) +static uint8_t *format_rtcp_app(uint8_t * buffer, int buflen, uint32_t ssrc, + rtcp_app * app) { - /* Write an RTCP APP into the outgoing packet buffer. */ - rtcp_app *packet = (rtcp_app *) buffer; - int pkt_octets = (app->length + 1) * 4; - int data_octets = pkt_octets - 12; + /* Write an RTCP APP into the outgoing packet buffer. */ + rtcp_app *packet = (rtcp_app *) buffer; + int pkt_octets = (app->length + 1) * 4; + int data_octets = pkt_octets - 12; - assert(data_octets >= 0); /* ...else not a legal APP packet. */ - assert(buflen >= pkt_octets); /* ...else there isn't space for the APP packet. */ + assert(data_octets >= 0); /* ...else not a legal APP packet. */ + assert(buflen >= pkt_octets); /* ...else there isn't space for the APP packet. */ - /* Copy one APP packet from "app" to "packet". */ - packet->version = RTP_VERSION; - packet->p = app->p; - packet->subtype = app->subtype; - packet->pt = RTCP_APP; - packet->length = htons(app->length); - packet->ssrc = htonl(ssrc); - memcpy(packet->name, app->name, 4); - memcpy(packet->data, app->data, data_octets); + /* Copy one APP packet from "app" to "packet". */ + packet->version = RTP_VERSION; + packet->p = app->p; + packet->subtype = app->subtype; + packet->pt = RTCP_APP; + packet->length = htons(app->length); + packet->ssrc = htonl(ssrc); + memcpy(packet->name, app->name, 4); + memcpy(packet->data, app->data, data_octets); - /* Return a pointer to the byte that immediately follows the last byte written. */ - return buffer + pkt_octets; + /* Return a pointer to the byte that immediately follows the last byte written. */ + return buffer + pkt_octets; } static void send_rtcp(struct rtp *session, uint32_t rtp_ts, - rtcp_app_callback appcallback) + rtcp_app_callback appcallback) { - /* Construct and send an RTCP packet. The order in which packets are packed into a */ - /* compound packet is defined by section 6.1 of draft-ietf-avt-rtp-new-03.txt and */ - /* we follow the recommended order. */ - uint8_t buffer[RTP_MAX_PACKET_LEN + MAX_ENCRYPTION_PAD]; /* The +8 is to allow for padding when encrypting */ - uint8_t *ptr = buffer; - uint8_t *old_ptr; - uint8_t *lpt; /* the last packet in the compound */ - rtcp_app *app; - uint8_t initVec[8] = {0,0,0,0,0,0,0,0}; - int rc; + /* Construct and send an RTCP packet. The order in which packets are packed into a */ + /* compound packet is defined by section 6.1 of draft-ietf-avt-rtp-new-03.txt and */ + /* we follow the recommended order. */ + uint8_t buffer[RTP_MAX_PACKET_LEN + MAX_ENCRYPTION_PAD]; /* The +8 is to allow for padding when encrypting */ + uint8_t *ptr = buffer; + uint8_t *old_ptr; + uint8_t *lpt; /* the last packet in the compound */ + rtcp_app *app; + uint8_t initVec[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + int rc; - check_database(session); - /* If encryption is enabled, add a 32 bit random prefix to the packet */ - if (session->encryption_enabled) - { - *((uint32_t *) ptr) = lbl_random(); - ptr += 4; - } + check_database(session); + /* If encryption is enabled, add a 32 bit random prefix to the packet */ + if (session->encryption_enabled) { + *((uint32_t *) ptr) = lbl_random(); + ptr += 4; + } - /* The first RTCP packet in the compound packet MUST always be a report packet... */ - if (session->we_sent) { - ptr = format_rtcp_sr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session, rtp_ts); - } else { - ptr = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session); - } - /* Add the appropriate SDES items to the packet... This should really be after the */ - /* insertion of the additional report blocks, but if we do that there are problems */ - /* with us being unable to fit the SDES packet in when we run out of buffer space */ - /* adding RRs. The correct fix would be to calculate the length of the SDES items */ - /* in advance and subtract this from the buffer length but this is non-trivial and */ - /* probably not worth it. */ - lpt = ptr; - ptr = format_rtcp_sdes(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), rtp_my_ssrc(session), session); + /* The first RTCP packet in the compound packet MUST always be a report packet... */ + if (session->we_sent) { + ptr = + format_rtcp_sr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), + session, rtp_ts); + } else { + ptr = + format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), + session); + } + /* Add the appropriate SDES items to the packet... This should really be after the */ + /* insertion of the additional report blocks, but if we do that there are problems */ + /* with us being unable to fit the SDES packet in when we run out of buffer space */ + /* adding RRs. The correct fix would be to calculate the length of the SDES items */ + /* in advance and subtract this from the buffer length but this is non-trivial and */ + /* probably not worth it. */ + lpt = ptr; + ptr = + format_rtcp_sdes(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), + rtp_my_ssrc(session), session); - /* If we have any CSRCs, we include SDES items for each of them in turn... */ - if (session->csrc_count > 0) { - ptr = format_rtcp_sdes(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), next_csrc(session), session); - } + /* If we have any CSRCs, we include SDES items for each of them in turn... */ + if (session->csrc_count > 0) { + ptr = + format_rtcp_sdes(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), + next_csrc(session), session); + } - /* Following that, additional RR packets SHOULD follow if there are more than 31 */ - /* senders, such that the reports do not fit into the initial packet. We give up */ - /* if there is insufficient space in the buffer: this is bad, since we always drop */ - /* the reports from the same sources (those at the end of the hash table). */ - while ((session->sender_count > 0) && ((RTP_MAX_PACKET_LEN - (ptr - buffer)) >= 8)) { - lpt = ptr; - ptr = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session); - } + /* Following that, additional RR packets SHOULD follow if there are more than 31 */ + /* senders, such that the reports do not fit into the initial packet. We give up */ + /* if there is insufficient space in the buffer: this is bad, since we always drop */ + /* the reports from the same sources (those at the end of the hash table). */ + while ((session->sender_count > 0) + && ((RTP_MAX_PACKET_LEN - (ptr - buffer)) >= 8)) { + lpt = ptr; + ptr = + format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), + session); + } - /* Finish with as many APP packets as the application will provide. */ - old_ptr = ptr; - if (appcallback) { - while ((app = (*appcallback)(session, rtp_ts, RTP_MAX_PACKET_LEN - (ptr - buffer)))) { - lpt = ptr; - ptr = format_rtcp_app(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), rtp_my_ssrc(session), app); - assert(ptr > old_ptr); - old_ptr = ptr; - assert(RTP_MAX_PACKET_LEN - (ptr - buffer) >= 0); - } - } + /* Finish with as many APP packets as the application will provide. */ + old_ptr = ptr; + if (appcallback) { + while ((app = + (*appcallback) (session, rtp_ts, + RTP_MAX_PACKET_LEN - (ptr - buffer)))) { + lpt = ptr; + ptr = + format_rtcp_app(ptr, + RTP_MAX_PACKET_LEN - (ptr - buffer), + rtp_my_ssrc(session), app); + assert(ptr > old_ptr); + old_ptr = ptr; + assert(RTP_MAX_PACKET_LEN - (ptr - buffer) >= 0); + } + } - /* And encrypt if desired... */ - if (session->encryption_enabled) - { - if (((ptr - buffer) % session->encryption_pad_length) != 0) { - /* Add padding to the last packet in the compound, if necessary. */ - /* We don't have to worry about overflowing the buffer, since we */ - /* intentionally allocated it 8 bytes longer to allow for this. */ - int padlen = session->encryption_pad_length - ((ptr - buffer) % session->encryption_pad_length); - int i; + /* And encrypt if desired... */ + if (session->encryption_enabled) { + if (((ptr - buffer) % session->encryption_pad_length) != 0) { + /* Add padding to the last packet in the compound, if necessary. */ + /* We don't have to worry about overflowing the buffer, since we */ + /* intentionally allocated it 8 bytes longer to allow for this. */ + int padlen = + session->encryption_pad_length - + ((ptr - buffer) % session->encryption_pad_length); + int i; - for (i = 0; i < padlen-1; i++) { - *(ptr++) = '\0'; - } - *(ptr++) = (uint8_t) padlen; - assert(((ptr - buffer) % session->encryption_pad_length) == 0); + for (i = 0; i < padlen - 1; i++) { + *(ptr++) = '\0'; + } + *(ptr++) = (uint8_t) padlen; + assert(((ptr - + buffer) % session->encryption_pad_length) == + 0); - ((rtcp_t *) lpt)->common.p = TRUE; - ((rtcp_t *) lpt)->common.length = htons((int16_t)(((ptr - lpt) / 4) - 1)); - } - (session->encrypt_func)(session, buffer, ptr - buffer, initVec); - } - rc = udp_send(session->rtcp_socket, (char *)buffer, ptr - buffer); - if (rc == -1) { - perror("sending RTCP packet"); - } + ((rtcp_t *) lpt)->common.p = TRUE; + ((rtcp_t *) lpt)->common.length = + htons((int16_t) (((ptr - lpt) / 4) - 1)); + } + (session->encrypt_func) (session, buffer, ptr - buffer, + initVec); + } + rc = udp_send(session->rtcp_socket, (char *)buffer, ptr - buffer); + if (rc == -1) { + perror("sending RTCP packet"); + } /* Loop the data back to ourselves so local participant can */ /* query own stats when using unicast or multicast with no */ /* loopback. */ rtp_process_ctrl(session, buffer, ptr - buffer); - check_database(session); + check_database(session); } /** @@ -2830,43 +3046,47 @@ static void send_rtcp(struct rtp *session, uint32_t rtp_ts, * called at least once per second, and can be safely called more * frequently. */ -void rtp_send_ctrl(struct rtp *session, uint32_t rtp_ts, rtcp_app_callback appcallback, struct timeval curr_time) +void rtp_send_ctrl(struct rtp *session, uint32_t rtp_ts, + rtcp_app_callback appcallback, struct timeval curr_time) { - /* Send an RTCP packet, if one is due... */ + /* Send an RTCP packet, if one is due... */ - check_database(session); - if (tv_gt(curr_time, session->next_rtcp_send_time)) { - /* The RTCP transmission timer has expired. The following */ - /* implements draft-ietf-avt-rtp-new-02.txt section 6.3.6 */ - int h; - source *s; - struct timeval new_send_time; - double new_interval; + check_database(session); + if (tv_gt(curr_time, session->next_rtcp_send_time)) { + /* The RTCP transmission timer has expired. The following */ + /* implements draft-ietf-avt-rtp-new-02.txt section 6.3.6 */ + int h; + source *s; + struct timeval new_send_time; + double new_interval; - new_interval = rtcp_interval(session) / (session->csrc_count + 1); - new_send_time = session->last_rtcp_send_time; - tv_add(&new_send_time, new_interval); - if (tv_gt(curr_time, new_send_time)) { - send_rtcp(session, rtp_ts, appcallback); - session->initial_rtcp = FALSE; - session->last_rtcp_send_time = curr_time; - session->next_rtcp_send_time = curr_time; - tv_add(&(session->next_rtcp_send_time), rtcp_interval(session) / (session->csrc_count + 1)); - /* We're starting a new RTCP reporting interval, zero out */ - /* the per-interval statistics. */ - session->sender_count = 0; - for (h = 0; h < RTP_DB_SIZE; h++) { - for (s = session->db[h]; s != NULL; s = s->next) { - check_source(s); - s->sender = FALSE; - } - } - } else { - session->next_rtcp_send_time = new_send_time; - } - session->ssrc_count_prev = session->ssrc_count; - } - check_database(session); + new_interval = + rtcp_interval(session) / (session->csrc_count + 1); + new_send_time = session->last_rtcp_send_time; + tv_add(&new_send_time, new_interval); + if (tv_gt(curr_time, new_send_time)) { + send_rtcp(session, rtp_ts, appcallback); + session->initial_rtcp = FALSE; + session->last_rtcp_send_time = curr_time; + session->next_rtcp_send_time = curr_time; + tv_add(&(session->next_rtcp_send_time), + rtcp_interval(session) / (session->csrc_count + + 1)); + /* We're starting a new RTCP reporting interval, zero out */ + /* the per-interval statistics. */ + session->sender_count = 0; + for (h = 0; h < RTP_DB_SIZE; h++) { + for (s = session->db[h]; s != NULL; s = s->next) { + check_source(s); + s->sender = FALSE; + } + } + } else { + session->next_rtcp_send_time = new_send_time; + } + session->ssrc_count_prev = session->ssrc_count; + } + check_database(session); } /** @@ -2881,123 +3101,134 @@ void rtp_send_ctrl(struct rtp *session, uint32_t rtp_ts, rtcp_app_callback appca */ void rtp_update(struct rtp *session, struct timeval curr_time) { - /* Perform housekeeping on the source database... */ - int h; - source *s, *n; - double delay; + /* Perform housekeeping on the source database... */ + int h; + source *s, *n; + double delay; - if (tv_diff(curr_time, session->last_update) < 1.0) { - /* We only perform housekeeping once per second... */ - return; - } - session->last_update = curr_time; + if (tv_diff(curr_time, session->last_update) < 1.0) { + /* We only perform housekeeping once per second... */ + return; + } + session->last_update = curr_time; - /* Update we_sent (section 6.3.8 of RTP spec) */ - delay = tv_diff(curr_time, session->last_rtp_send_time); - if (delay >= 2 * rtcp_interval(session)) { - session->we_sent = FALSE; - } + /* Update we_sent (section 6.3.8 of RTP spec) */ + delay = tv_diff(curr_time, session->last_rtp_send_time); + if (delay >= 2 * rtcp_interval(session)) { + session->we_sent = FALSE; + } - check_database(session); + check_database(session); - for (h = 0; h < RTP_DB_SIZE; h++) { - for (s = session->db[h]; s != NULL; s = n) { - check_source(s); - n = s->next; - /* Expire sources which haven't been heard from for a int time. */ - /* Section 6.2.1 of the RTP specification details the timers used. */ + for (h = 0; h < RTP_DB_SIZE; h++) { + for (s = session->db[h]; s != NULL; s = n) { + check_source(s); + n = s->next; + /* Expire sources which haven't been heard from for a int time. */ + /* Section 6.2.1 of the RTP specification details the timers used. */ - /* How int since we last heard from this source? */ - delay = tv_diff(curr_time, s->last_active); - - /* Check if we've received a BYE packet from this source. */ - /* If we have, and it was received more than 2 seconds ago */ - /* then the source is deleted. The arbitrary 2 second delay */ - /* is to ensure that all delayed packets are received before */ - /* the source is timed out. */ - if (s->got_bye && (delay > 2.0)) { - debug_msg("Deleting source 0x%08lx due to reception of BYE %f seconds ago...\n", s->ssrc, delay); - delete_source(session, s->ssrc); - } + /* How int since we last heard from this source? */ + delay = tv_diff(curr_time, s->last_active); - /* Sources are marked as inactive if they haven't been heard */ - /* from for more than 2 intervals (RTP section 6.3.5) */ - if ((s->ssrc != rtp_my_ssrc(session)) && (delay > (session->rtcp_interval * 2))) { - if (s->sender) { - s->sender = FALSE; - session->sender_count--; - } - } + /* Check if we've received a BYE packet from this source. */ + /* If we have, and it was received more than 2 seconds ago */ + /* then the source is deleted. The arbitrary 2 second delay */ + /* is to ensure that all delayed packets are received before */ + /* the source is timed out. */ + if (s->got_bye && (delay > 2.0)) { + debug_msg + ("Deleting source 0x%08lx due to reception of BYE %f seconds ago...\n", + s->ssrc, delay); + delete_source(session, s->ssrc); + } - /* If a source hasn't been heard from for more than 5 RTCP */ - /* reporting intervals, we delete it from our database... */ - if ((s->ssrc != rtp_my_ssrc(session)) && (delay > (session->rtcp_interval * 5))) { - debug_msg("Deleting source 0x%08lx due to timeout...\n", s->ssrc); - delete_source(session, s->ssrc); - } - } - } + /* Sources are marked as inactive if they haven't been heard */ + /* from for more than 2 intervals (RTP section 6.3.5) */ + if ((s->ssrc != rtp_my_ssrc(session)) + && (delay > (session->rtcp_interval * 2))) { + if (s->sender) { + s->sender = FALSE; + session->sender_count--; + } + } - /* Timeout those reception reports which haven't been refreshed for a int time */ - timeout_rr(session, &curr_time); - check_database(session); + /* If a source hasn't been heard from for more than 5 RTCP */ + /* reporting intervals, we delete it from our database... */ + if ((s->ssrc != rtp_my_ssrc(session)) + && (delay > (session->rtcp_interval * 5))) { + debug_msg + ("Deleting source 0x%08lx due to timeout...\n", + s->ssrc); + delete_source(session, s->ssrc); + } + } + } + + /* Timeout those reception reports which haven't been refreshed for a int time */ + timeout_rr(session, &curr_time); + check_database(session); } static void rtp_send_bye_now(struct rtp *session) { - /* Send a BYE packet immediately. This is an internal function, */ - /* hidden behind the rtp_send_bye() wrapper which implements BYE */ - /* reconsideration for the application. */ - uint8_t buffer[RTP_MAX_PACKET_LEN + MAX_ENCRYPTION_PAD]; /* + 8 to allow for padding when encrypting */ - uint8_t *ptr = buffer; - rtcp_common *common; - uint8_t initVec[8] = {0,0,0,0,0,0,0,0}; + /* Send a BYE packet immediately. This is an internal function, */ + /* hidden behind the rtp_send_bye() wrapper which implements BYE */ + /* reconsideration for the application. */ + uint8_t buffer[RTP_MAX_PACKET_LEN + MAX_ENCRYPTION_PAD]; /* + 8 to allow for padding when encrypting */ + uint8_t *ptr = buffer; + rtcp_common *common; + uint8_t initVec[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - check_database(session); - /* If encryption is enabled, add a 32 bit random prefix to the packet */ - if (session->encryption_enabled) { - *((uint32_t *) ptr) = lbl_random(); - ptr += 4; - } + check_database(session); + /* If encryption is enabled, add a 32 bit random prefix to the packet */ + if (session->encryption_enabled) { + *((uint32_t *) ptr) = lbl_random(); + ptr += 4; + } - ptr = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session); - common = (rtcp_common *) ptr; - - common->version = 2; - common->p = 0; - common->count = 1; - common->pt = RTCP_BYE; - common->length = htons(1); - ptr += sizeof(rtcp_common); - - *((uint32_t *) ptr) = htonl(session->my_ssrc); - ptr += 4; - - if (session->encryption_enabled) { - if (((ptr - buffer) % session->encryption_pad_length) != 0) { - /* Add padding to the last packet in the compound, if necessary. */ - /* We don't have to worry about overflowing the buffer, since we */ - /* intentionally allocated it 8 bytes longer to allow for this. */ - int padlen = session->encryption_pad_length - ((ptr - buffer) % session->encryption_pad_length); - int i; + ptr = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session); + common = (rtcp_common *) ptr; - for (i = 0; i < padlen-1; i++) { - *(ptr++) = '\0'; - } - *(ptr++) = (uint8_t) padlen; + common->version = 2; + common->p = 0; + common->count = 1; + common->pt = RTCP_BYE; + common->length = htons(1); + ptr += sizeof(rtcp_common); - common->p = TRUE; - common->length = htons((int16_t)(((ptr - (uint8_t *) common) / 4) - 1)); - } - assert(((ptr - buffer) % session->encryption_pad_length) == 0); - (session->encrypt_func)(session, buffer, ptr - buffer, initVec); - } - udp_send(session->rtcp_socket, (char *)buffer, ptr - buffer); - /* Loop the data back to ourselves so local participant can */ - /* query own stats when using unicast or multicast with no */ - /* loopback. */ - rtp_process_ctrl(session, buffer, ptr - buffer); - check_database(session); + *((uint32_t *) ptr) = htonl(session->my_ssrc); + ptr += 4; + + if (session->encryption_enabled) { + if (((ptr - buffer) % session->encryption_pad_length) != 0) { + /* Add padding to the last packet in the compound, if necessary. */ + /* We don't have to worry about overflowing the buffer, since we */ + /* intentionally allocated it 8 bytes longer to allow for this. */ + int padlen = + session->encryption_pad_length - + ((ptr - buffer) % session->encryption_pad_length); + int i; + + for (i = 0; i < padlen - 1; i++) { + *(ptr++) = '\0'; + } + *(ptr++) = (uint8_t) padlen; + + common->p = TRUE; + common->length = + htons((int16_t) + (((ptr - (uint8_t *) common) / 4) - 1)); + } + assert(((ptr - buffer) % session->encryption_pad_length) == 0); + (session->encrypt_func) (session, buffer, ptr - buffer, + initVec); + } + udp_send(session->rtcp_socket, (char *)buffer, ptr - buffer); + /* Loop the data back to ourselves so local participant can */ + /* query own stats when using unicast or multicast with no */ + /* loopback. */ + rtp_process_ctrl(session, buffer, ptr - buffer); + check_database(session); } /** @@ -3013,68 +3244,78 @@ static void rtp_send_bye_now(struct rtp *session) */ void rtp_send_bye(struct rtp *session) { - struct timeval curr_time, timeout, new_send_time; - uint8_t buffer[RTP_MAX_PACKET_LEN]; - int buflen; - double new_interval; + struct timeval curr_time, timeout, new_send_time; + uint8_t buffer[RTP_MAX_PACKET_LEN]; + int buflen; + double new_interval; - check_database(session); + check_database(session); - /* "...a participant which never sent an RTP or RTCP packet MUST NOT send */ - /* a BYE packet when they leave the group." (section 6.3.7 of RTP spec) */ - if ((session->we_sent == FALSE) && (session->initial_rtcp == TRUE)) { - debug_msg("Silent BYE\n"); - return; - } + /* "...a participant which never sent an RTP or RTCP packet MUST NOT send */ + /* a BYE packet when they leave the group." (section 6.3.7 of RTP spec) */ + if ((session->we_sent == FALSE) && (session->initial_rtcp == TRUE)) { + debug_msg("Silent BYE\n"); + return; + } - /* If the session is small, send an immediate BYE. Otherwise, we delay and */ - /* perform BYE reconsideration as needed. */ - if (session->ssrc_count < 50) { - rtp_send_bye_now(session); - } else { - gettimeofday(&curr_time, NULL); - session->sending_bye = TRUE; - session->last_rtcp_send_time = curr_time; - session->next_rtcp_send_time = curr_time; - session->bye_count = 1; - session->initial_rtcp = TRUE; - session->we_sent = FALSE; - session->sender_count = 0; - session->avg_rtcp_size = 70.0 + RTP_LOWER_LAYER_OVERHEAD; /* FIXME */ - tv_add(&session->next_rtcp_send_time, rtcp_interval(session) / (session->csrc_count + 1)); + /* If the session is small, send an immediate BYE. Otherwise, we delay and */ + /* perform BYE reconsideration as needed. */ + if (session->ssrc_count < 50) { + rtp_send_bye_now(session); + } else { + gettimeofday(&curr_time, NULL); + session->sending_bye = TRUE; + session->last_rtcp_send_time = curr_time; + session->next_rtcp_send_time = curr_time; + session->bye_count = 1; + session->initial_rtcp = TRUE; + session->we_sent = FALSE; + session->sender_count = 0; + session->avg_rtcp_size = 70.0 + RTP_LOWER_LAYER_OVERHEAD; /* FIXME */ + tv_add(&session->next_rtcp_send_time, + rtcp_interval(session) / (session->csrc_count + 1)); - debug_msg("Preparing to send BYE...\n"); - while (1) { - /* Schedule us to block in udp_select() until the time we are due to send our */ - /* BYE packet. If we receive an RTCP packet from another participant before */ - /* then, we are woken up to handle it... */ - timeout.tv_sec = 0; - timeout.tv_usec = 0; - tv_add(&timeout, tv_diff(session->next_rtcp_send_time, curr_time)); - udp_fd_zero(); - udp_fd_set(session->rtcp_socket); - if ((udp_select(&timeout) > 0) && udp_fd_isset(session->rtcp_socket)) { - /* We woke up because an RTCP packet was received; process it... */ - buflen = udp_recv(session->rtcp_socket, (char *)buffer, RTP_MAX_PACKET_LEN); - rtp_process_ctrl(session, buffer, buflen); - } - /* Is it time to send our BYE? */ - gettimeofday(&curr_time, NULL); - new_interval = rtcp_interval(session) / (session->csrc_count + 1); - new_send_time = session->last_rtcp_send_time; - tv_add(&new_send_time, new_interval); - if (tv_gt(curr_time, new_send_time)) { - debug_msg("Sent BYE...\n"); - rtp_send_bye_now(session); - break; - } - /* No, we reconsider... */ - session->next_rtcp_send_time = new_send_time; - debug_msg("Reconsidered sending BYE... delay = %f\n", tv_diff(session->next_rtcp_send_time, curr_time)); - /* ...and perform housekeeping in the usual manner */ - rtp_update(session, curr_time); - } - } + debug_msg("Preparing to send BYE...\n"); + while (1) { + /* Schedule us to block in udp_select() until the time we are due to send our */ + /* BYE packet. If we receive an RTCP packet from another participant before */ + /* then, we are woken up to handle it... */ + timeout.tv_sec = 0; + timeout.tv_usec = 0; + tv_add(&timeout, + tv_diff(session->next_rtcp_send_time, + curr_time)); + udp_fd_zero(); + udp_fd_set(session->rtcp_socket); + if ((udp_select(&timeout) > 0) + && udp_fd_isset(session->rtcp_socket)) { + /* We woke up because an RTCP packet was received; process it... */ + buflen = + udp_recv(session->rtcp_socket, + (char *)buffer, + RTP_MAX_PACKET_LEN); + rtp_process_ctrl(session, buffer, buflen); + } + /* Is it time to send our BYE? */ + gettimeofday(&curr_time, NULL); + new_interval = + rtcp_interval(session) / (session->csrc_count + 1); + new_send_time = session->last_rtcp_send_time; + tv_add(&new_send_time, new_interval); + if (tv_gt(curr_time, new_send_time)) { + debug_msg("Sent BYE...\n"); + rtp_send_bye_now(session); + break; + } + /* No, we reconsider... */ + session->next_rtcp_send_time = new_send_time; + debug_msg("Reconsidered sending BYE... delay = %f\n", + tv_diff(session->next_rtcp_send_time, + curr_time)); + /* ...and perform housekeeping in the usual manner */ + rtp_update(session, curr_time); + } + } } /** @@ -3087,38 +3328,38 @@ void rtp_send_bye(struct rtp *session) */ void rtp_done(struct rtp *session) { - int i; + int i; source *s, *n; - check_database(session); + check_database(session); /* In delete_source, check database gets called and this assumes */ /* first added and last removed is us. */ - for (i = 0; i < RTP_DB_SIZE; i++) { + for (i = 0; i < RTP_DB_SIZE; i++) { s = session->db[i]; while (s != NULL) { n = s->next; if (s->ssrc != session->my_ssrc) { - delete_source(session,session->db[i]->ssrc); + delete_source(session, session->db[i]->ssrc); } s = n; } - } - - delete_source(session, session->my_ssrc); - - /* - * Introduce a memory leak until we add algorithm-specific - * cleanup functions. - if (session->encryption_key != NULL) { - free(session->encryption_key); } - */ - udp_exit(session->rtp_socket); - udp_exit(session->rtcp_socket); - free(session->addr); - free(session->opt); - free(session); + delete_source(session, session->my_ssrc); + + /* + * Introduce a memory leak until we add algorithm-specific + * cleanup functions. + if (session->encryption_key != NULL) { + free(session->encryption_key); + } + */ + + udp_exit(session->rtp_socket); + udp_exit(session->rtcp_socket); + free(session->addr); + free(session->opt); + free(session); } /** @@ -3154,209 +3395,199 @@ void rtp_done(struct rtp *session) * * Returns: TRUE on success, FALSE on failure. */ -int rtp_set_encryption_key(struct rtp* session, const char *passphrase) +int rtp_set_encryption_key(struct rtp *session, const char *passphrase) { - char *canonical_passphrase; - u_char hash[16]; - MD5_CTX context; - char *slash; + char *canonical_passphrase; + u_char hash[16]; + MD5_CTX context; + char *slash; - check_database(session); + check_database(session); if (session->encryption_algorithm != NULL) { - free(session->encryption_algorithm); - session->encryption_algorithm = NULL; + free(session->encryption_algorithm); + session->encryption_algorithm = NULL; } - if (passphrase == NULL) { - /* A NULL passphrase means disable encryption... */ - session->encryption_enabled = 0; - check_database(session); - return TRUE; - } + if (passphrase == NULL) { + /* A NULL passphrase means disable encryption... */ + session->encryption_enabled = 0; + check_database(session); + return TRUE; + } - debug_msg("Enabling RTP/RTCP encryption\n"); - session->encryption_enabled = 1; + debug_msg("Enabling RTP/RTCP encryption\n"); + session->encryption_enabled = 1; - /* - * Determine which algorithm we're using. - */ - - slash = strchr(passphrase, '/'); - if (slash == 0) - { - session->encryption_algorithm = strdup("DES"); - } - else - { - int l = slash - passphrase; - session->encryption_algorithm = malloc(l + 1); - strncpy(session->encryption_algorithm, passphrase, l); - session->encryption_algorithm[l] = '\0'; - passphrase = slash + 1; - } - - debug_msg("Initializing encryption, algorithm is '%s'\n", - session->encryption_algorithm); - - /* Step 1: convert to canonical form, comprising the following steps: */ - /* a) convert the input string to the ISO 10646 character set, using */ - /* the UTF-8 encoding as specified in Annex P to ISO/IEC */ - /* 10646-1:1993 (ASCII characters require no mapping, but ISO */ - /* 8859-1 characters do); */ - /* b) remove leading and trailing white space characters; */ - /* c) replace one or more contiguous white space characters by a */ - /* single space (ASCII or UTF-8 0x20); */ - /* d) convert all letters to lower case and replace sequences of */ - /* characters and non-spacing accents with a single character, */ - /* where possible. */ - canonical_passphrase = (char *) strdup(passphrase); /* FIXME */ + /* + * Determine which algorithm we're using. + */ - /* Step 2: derive an MD5 hash */ - MD5Init(&context); - MD5Update(&context, (u_char *) canonical_passphrase, strlen(canonical_passphrase)); - MD5Final((u_char *) hash, &context); + slash = strchr(passphrase, '/'); + if (slash == 0) { + session->encryption_algorithm = strdup("DES"); + } else { + int l = slash - passphrase; + session->encryption_algorithm = malloc(l + 1); + strncpy(session->encryption_algorithm, passphrase, l); + session->encryption_algorithm[l] = '\0'; + passphrase = slash + 1; + } - /* Initialize the encryption algorithm we've received */ + debug_msg("Initializing encryption, algorithm is '%s'\n", + session->encryption_algorithm); - if (strcmp(session->encryption_algorithm, "DES") == 0) - { - return des_initialize(session, hash, sizeof(hash)); - } - else if (strcmp(session->encryption_algorithm, "Rijndael") == 0) - { - return rijndael_initialize(session, hash, sizeof(hash)); - } - else - { - debug_msg("Encryption algorithm \"%s\" not found\n", - session->encryption_algorithm); - return FALSE; - } + /* Step 1: convert to canonical form, comprising the following steps: */ + /* a) convert the input string to the ISO 10646 character set, using */ + /* the UTF-8 encoding as specified in Annex P to ISO/IEC */ + /* 10646-1:1993 (ASCII characters require no mapping, but ISO */ + /* 8859-1 characters do); */ + /* b) remove leading and trailing white space characters; */ + /* c) replace one or more contiguous white space characters by a */ + /* single space (ASCII or UTF-8 0x20); */ + /* d) convert all letters to lower case and replace sequences of */ + /* characters and non-spacing accents with a single character, */ + /* where possible. */ + canonical_passphrase = (char *)strdup(passphrase); /* FIXME */ + + /* Step 2: derive an MD5 hash */ + MD5Init(&context); + MD5Update(&context, (u_char *) canonical_passphrase, + strlen(canonical_passphrase)); + MD5Final((u_char *) hash, &context); + + /* Initialize the encryption algorithm we've received */ + + if (strcmp(session->encryption_algorithm, "DES") == 0) { + return des_initialize(session, hash, sizeof(hash)); + } else if (strcmp(session->encryption_algorithm, "Rijndael") == 0) { + return rijndael_initialize(session, hash, sizeof(hash)); + } else { + debug_msg("Encryption algorithm \"%s\" not found\n", + session->encryption_algorithm); + return FALSE; + } } -static int des_initialize(struct rtp *session, u_char *hash, int hashlen) +static int des_initialize(struct rtp *session, u_char * hash, int hashlen) { - char *key; - int i, j, k; - - UNUSED(hashlen); + char *key; + int i, j, k; + + UNUSED(hashlen); + + session->encryption_pad_length = 8; + session->encrypt_func = des_encrypt; + session->decrypt_func = des_decrypt; - session->encryption_pad_length = 8; - session->encrypt_func = des_encrypt; - session->decrypt_func = des_decrypt; - if (session->crypto_state.des.encryption_key != NULL) { free(session->crypto_state.des.encryption_key); } - key = session->crypto_state.des.encryption_key = (char *) malloc(8); + key = session->crypto_state.des.encryption_key = (char *)malloc(8); - /* Step 3: take first 56 bits of the MD5 hash */ - key[0] = hash[0]; - key[1] = hash[0] << 7 | hash[1] >> 1; - key[2] = hash[1] << 6 | hash[2] >> 2; - key[3] = hash[2] << 5 | hash[3] >> 3; - key[4] = hash[3] << 4 | hash[4] >> 4; - key[5] = hash[4] << 3 | hash[5] >> 5; - key[6] = hash[5] << 2 | hash[6] >> 6; - key[7] = hash[6] << 1; + /* Step 3: take first 56 bits of the MD5 hash */ + key[0] = hash[0]; + key[1] = hash[0] << 7 | hash[1] >> 1; + key[2] = hash[1] << 6 | hash[2] >> 2; + key[3] = hash[2] << 5 | hash[3] >> 3; + key[4] = hash[3] << 4 | hash[4] >> 4; + key[5] = hash[4] << 3 | hash[5] >> 5; + key[6] = hash[5] << 2 | hash[6] >> 6; + key[7] = hash[6] << 1; - /* Step 4: add parity bits */ - for (i = 0; i < 8; ++i) { - k = key[i] & 0xfe; - j = k; - j ^= j >> 4; - j ^= j >> 2; - j ^= j >> 1; - j = (j & 1) ^ 1; - key[i] = k | j; - } + /* Step 4: add parity bits */ + for (i = 0; i < 8; ++i) { + k = key[i] & 0xfe; + j = k; + j ^= j >> 4; + j ^= j >> 2; + j ^= j >> 1; + j = (j & 1) ^ 1; + key[i] = k | j; + } - check_database(session); - return TRUE; + check_database(session); + return TRUE; } static int des_encrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec) + unsigned int size, unsigned char *initVec) { - qfDES_CBC_e((unsigned char *)session->crypto_state.des.encryption_key, - data, size, initVec); - return TRUE; + qfDES_CBC_e((unsigned char *)session->crypto_state.des.encryption_key, + data, size, initVec); + return TRUE; } static int des_decrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec) + unsigned int size, unsigned char *initVec) { - qfDES_CBC_d((unsigned char *)session->crypto_state.des.encryption_key, - data, size, initVec); - return TRUE; + qfDES_CBC_d((unsigned char *)session->crypto_state.des.encryption_key, + data, size, initVec); + return TRUE; } -static int rijndael_initialize(struct rtp *session, u_char *hash, int hash_len) +static int rijndael_initialize(struct rtp *session, u_char * hash, int hash_len) { - int rc; - - session->encryption_pad_length = 16; - session->encrypt_func = rijndael_encrypt; - session->decrypt_func = rijndael_decrypt; + int rc; - rc = makeKey(&session->crypto_state.rijndael.keyInstEncrypt, - DIR_ENCRYPT, hash_len * 8, (char *) hash); - if (rc < 0) - { - debug_msg("makeKey failed: %d\n", rc); - return FALSE; - } + session->encryption_pad_length = 16; + session->encrypt_func = rijndael_encrypt; + session->decrypt_func = rijndael_decrypt; - rc = makeKey(&session->crypto_state.rijndael.keyInstDecrypt, - DIR_DECRYPT, hash_len * 8, (char *) hash); - if (rc < 0) - { - debug_msg("makeKey failed: %d\n", rc); - return FALSE; - } + rc = makeKey(&session->crypto_state.rijndael.keyInstEncrypt, + DIR_ENCRYPT, hash_len * 8, (char *)hash); + if (rc < 0) { + debug_msg("makeKey failed: %d\n", rc); + return FALSE; + } - rc = cipherInit(&session->crypto_state.rijndael.cipherInst, - MODE_ECB, NULL); - if (rc < 0) - { - debug_msg("cipherInst failed: %d\n", rc); - return FALSE; - } - return TRUE; + rc = makeKey(&session->crypto_state.rijndael.keyInstDecrypt, + DIR_DECRYPT, hash_len * 8, (char *)hash); + if (rc < 0) { + debug_msg("makeKey failed: %d\n", rc); + return FALSE; + } + + rc = cipherInit(&session->crypto_state.rijndael.cipherInst, + MODE_ECB, NULL); + if (rc < 0) { + debug_msg("cipherInst failed: %d\n", rc); + return FALSE; + } + return TRUE; } static int rijndael_encrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec) + unsigned int size, unsigned char *initVec) { - int rc; + int rc; - UNUSED(initVec); + UNUSED(initVec); - /* - * Try doing this in place. If it doesn't work that way, - * we'll have to allocate a buffer and copy back. - */ - rc = blockEncrypt(&session->crypto_state.rijndael.cipherInst, - &session->crypto_state.rijndael.keyInstEncrypt, - data, size * 8, data); - return rc; + /* + * Try doing this in place. If it doesn't work that way, + * we'll have to allocate a buffer and copy back. + */ + rc = blockEncrypt(&session->crypto_state.rijndael.cipherInst, + &session->crypto_state.rijndael.keyInstEncrypt, + data, size * 8, data); + return rc; } static int rijndael_decrypt(struct rtp *session, unsigned char *data, - unsigned int size, unsigned char *initVec) + unsigned int size, unsigned char *initVec) { - int rc; - UNUSED(initVec); + int rc; + UNUSED(initVec); - /* - * Try doing this in place. If it doesn't work that way, - * we'll have to allocate a buffer and copy back. - */ - rc = blockDecrypt(&session->crypto_state.rijndael.cipherInst, - &session->crypto_state.rijndael.keyInstDecrypt, - data, size * 8, data); - return rc; + /* + * Try doing this in place. If it doesn't work that way, + * we'll have to allocate a buffer and copy back. + */ + rc = blockDecrypt(&session->crypto_state.rijndael.cipherInst, + &session->crypto_state.rijndael.keyInstDecrypt, + data, size * 8, data); + return rc; } /** @@ -3368,8 +3599,8 @@ static int rijndael_decrypt(struct rtp *session, unsigned char *data, */ char *rtp_get_addr(struct rtp *session) { - check_database(session); - return session->addr; + check_database(session); + return session->addr; } /** @@ -3379,10 +3610,10 @@ char *rtp_get_addr(struct rtp *session) * Returns: The UDP port to which this session is bound, as set when * creating the session with rtp_init() or rtp_init_if(). */ -uint16_t rtp_get_rx_port(struct rtp *session) +uint16_t rtp_get_rx_port(struct rtp * session) { - check_database(session); - return session->rx_port; + check_database(session); + return session->rx_port; } /** @@ -3392,10 +3623,10 @@ uint16_t rtp_get_rx_port(struct rtp *session) * Returns: The UDP port to which RTP packets are transmitted, as set * when creating the session with rtp_init() or rtp_init_if(). */ -uint16_t rtp_get_tx_port(struct rtp *session) +uint16_t rtp_get_tx_port(struct rtp * session) { - check_database(session); - return session->tx_port; + check_database(session); + return session->tx_port; } /** @@ -3407,7 +3638,6 @@ uint16_t rtp_get_tx_port(struct rtp *session) */ int rtp_get_ttl(struct rtp *session) { - check_database(session); - return session->ttl; + check_database(session); + return session->ttl; } - diff --git a/ultragrid/src/rtp/rtp_callback.c b/ultragrid/src/rtp/rtp_callback.c index 8bb500d89..5bada0965 100644 --- a/ultragrid/src/rtp/rtp_callback.c +++ b/ultragrid/src/rtp/rtp_callback.c @@ -68,169 +68,180 @@ #include "rtp/rtp_callback.h" #include "tfrc.h" -extern int should_exit; -extern char *frame; +extern int should_exit; +extern char *frame; -char hdr_buf[100]; -struct msghdr msg; -struct iovec iov[10]; +char hdr_buf[100]; +struct msghdr msg; +struct iovec iov[10]; -extern uint32_t RTT; +extern uint32_t RTT; -static void -process_rr(struct rtp *session, rtp_event *e) +static void process_rr(struct rtp *session, rtp_event * e) { - float fract_lost, tmp; - uint32_t ntp_sec, ntp_frac, now; - rtcp_rr *r = (rtcp_rr *) e->data; + float fract_lost, tmp; + uint32_t ntp_sec, ntp_frac, now; + rtcp_rr *r = (rtcp_rr *) e->data; - if (e->ssrc == rtp_my_ssrc(session)) { - /* Filter out loopback reports */ - return; - } + if (e->ssrc == rtp_my_ssrc(session)) { + /* Filter out loopback reports */ + return; + } - if (r->ssrc == rtp_my_ssrc(session)) { - /* Received a reception quality report for data we are sending. */ - /* */ - /* Check for excessive congestion: exit if it occurs, to protect */ - /* other users of the network. */ - fract_lost = (r->fract_lost * 100.0) / 256.0; /* percentage lost packets */ - if (fract_lost > 20) { - printf("Receiver 0x%08x reports excessive congestion\n", e->ssrc); - } + if (r->ssrc == rtp_my_ssrc(session)) { + /* Received a reception quality report for data we are sending. */ + /* */ + /* Check for excessive congestion: exit if it occurs, to protect */ + /* other users of the network. */ + fract_lost = (r->fract_lost * 100.0) / 256.0; /* percentage lost packets */ + if (fract_lost > 20) { + printf("Receiver 0x%08x reports excessive congestion\n", + e->ssrc); + } - /* Compute network round-trip time: */ - if (r->lsr != 0) { - ntp64_time(&ntp_sec, &ntp_frac); - now = ntp64_to_ntp32(ntp_sec, ntp_frac); + /* Compute network round-trip time: */ + if (r->lsr != 0) { + ntp64_time(&ntp_sec, &ntp_frac); + now = ntp64_to_ntp32(ntp_sec, ntp_frac); - if ((now < r->lsr) || (now - r->lsr < r->dlsr)) { - /* Packet arrived before it was sent, ignore. This represents */ - /* a bug in the remote: either our timestamp was incorrectly */ - /* echoed back to us, or the remote miscalculated in time for */ - /* which it held the packet. */ - debug_msg("Bogus RTT from 0x%08x ignored\n", e->ssrc); - } else { - tmp = ((float) (now-r->lsr-r->dlsr))/65536.0; /* RTT in seconds */ - RTT = tmp * 1000000; /* RTT in usec */ - } - debug_msg(" RTT=%d usec\n", RTT); - } - } + if ((now < r->lsr) || (now - r->lsr < r->dlsr)) { + /* Packet arrived before it was sent, ignore. This represents */ + /* a bug in the remote: either our timestamp was incorrectly */ + /* echoed back to us, or the remote miscalculated in time for */ + /* which it held the packet. */ + debug_msg("Bogus RTT from 0x%08x ignored\n", + e->ssrc); + } else { + tmp = ((float)(now - r->lsr - r->dlsr)) / 65536.0; /* RTT in seconds */ + RTT = tmp * 1000000; /* RTT in usec */ + } + debug_msg(" RTT=%d usec\n", RTT); + } + } } static void -process_sdes(struct pdb *participants, uint32_t ssrc, rtcp_sdes_item *d) +process_sdes(struct pdb *participants, uint32_t ssrc, rtcp_sdes_item * d) { - struct pdb_e *e; - char *sdes_item; + struct pdb_e *e; + char *sdes_item; - e = pdb_get(participants, ssrc); - if (e == NULL) { - /* We got an SDES packet for a participant we haven't previously seen. */ - /* This can happen, for example, in a partitioned multicast group. Log */ - /* the event, and add the new participant to the database. */ - debug_msg("Added previously unseen participant 0x%08x due to receipt of SDES\n", ssrc); - pdb_add(participants, ssrc); - e = pdb_get(participants, ssrc); - } + e = pdb_get(participants, ssrc); + if (e == NULL) { + /* We got an SDES packet for a participant we haven't previously seen. */ + /* This can happen, for example, in a partitioned multicast group. Log */ + /* the event, and add the new participant to the database. */ + debug_msg + ("Added previously unseen participant 0x%08x due to receipt of SDES\n", + ssrc); + pdb_add(participants, ssrc); + e = pdb_get(participants, ssrc); + } - sdes_item = calloc(d->length+1, 1); - strncpy(sdes_item, d->data, d->length); + sdes_item = calloc(d->length + 1, 1); + strncpy(sdes_item, d->data, d->length); - switch (d->type) { - case RTCP_SDES_END: - /* This is the end of the SDES list of a packet. */ - /* Nothing for us to deal with. */ - break; - case RTCP_SDES_CNAME: - if (e->sdes_cname != NULL) free(e->sdes_cname); - e->sdes_cname = sdes_item; - break; - case RTCP_SDES_NAME: - if (e->sdes_name != NULL) free(e->sdes_name); - e->sdes_name = sdes_item; - break; - case RTCP_SDES_EMAIL: - if (e->sdes_email != NULL) free(e->sdes_email); - e->sdes_email = sdes_item; - break; - case RTCP_SDES_PHONE: - if (e->sdes_phone != NULL) free(e->sdes_phone); - e->sdes_phone = sdes_item; - break; - case RTCP_SDES_LOC: - if (e->sdes_loc != NULL) free(e->sdes_loc); - e->sdes_loc = sdes_item; - break; - case RTCP_SDES_TOOL: - if (e->sdes_tool != NULL) free(e->sdes_tool); - e->sdes_tool = sdes_item; - break; - case RTCP_SDES_NOTE: - if (e->sdes_note != NULL) free(e->sdes_note); - e->sdes_note = sdes_item; - break; - case RTCP_SDES_PRIV: - break; /* Ignore private extensions */ - default: - debug_msg("Ignored unknown SDES item (type=0x%02x) from 0x%08x\n", ssrc); - } + switch (d->type) { + case RTCP_SDES_END: + /* This is the end of the SDES list of a packet. */ + /* Nothing for us to deal with. */ + break; + case RTCP_SDES_CNAME: + if (e->sdes_cname != NULL) + free(e->sdes_cname); + e->sdes_cname = sdes_item; + break; + case RTCP_SDES_NAME: + if (e->sdes_name != NULL) + free(e->sdes_name); + e->sdes_name = sdes_item; + break; + case RTCP_SDES_EMAIL: + if (e->sdes_email != NULL) + free(e->sdes_email); + e->sdes_email = sdes_item; + break; + case RTCP_SDES_PHONE: + if (e->sdes_phone != NULL) + free(e->sdes_phone); + e->sdes_phone = sdes_item; + break; + case RTCP_SDES_LOC: + if (e->sdes_loc != NULL) + free(e->sdes_loc); + e->sdes_loc = sdes_item; + break; + case RTCP_SDES_TOOL: + if (e->sdes_tool != NULL) + free(e->sdes_tool); + e->sdes_tool = sdes_item; + break; + case RTCP_SDES_NOTE: + if (e->sdes_note != NULL) + free(e->sdes_note); + e->sdes_note = sdes_item; + break; + case RTCP_SDES_PRIV: + break; /* Ignore private extensions */ + default: + debug_msg + ("Ignored unknown SDES item (type=0x%02x) from 0x%08x\n", + ssrc); + } } -void -rtp_recv_callback(struct rtp *session, rtp_event *e) +void rtp_recv_callback(struct rtp *session, rtp_event * e) { - rtcp_app *pckt_app = (rtcp_app *) e->data; - rtp_packet *pckt_rtp = (rtp_packet *) e->data; - struct pdb *participants = (struct pdb *) rtp_get_userdata(session); - struct pdb_e *state = pdb_get(participants, e->ssrc); - struct timeval curr_time; + rtcp_app *pckt_app = (rtcp_app *) e->data; + rtp_packet *pckt_rtp = (rtp_packet *) e->data; + struct pdb *participants = (struct pdb *)rtp_get_userdata(session); + struct pdb_e *state = pdb_get(participants, e->ssrc); + struct timeval curr_time; - switch (e->type) { - case RX_RTP: - if (pckt_rtp->data_len > 0) { /* Only process packets that contain data... */ - pbuf_insert(state->playout_buffer, pckt_rtp); - } - tfrc_recv_data(state->tfrc_state, curr_time, pckt_rtp->seq, pckt_rtp->data_len+40); - break; - case RX_TFRC_RX: - /* compute TCP friendly data rate */ - break; - case RX_RTCP_START: - break; - case RX_RTCP_FINISH: - break; - case RX_SR: - break; - case RX_RR: - process_rr(session, e); - break; - case RX_RR_EMPTY: - break; - case RX_SDES: - process_sdes(participants, e->ssrc, (rtcp_sdes_item *) e->data); - break; - case RX_APP: - pckt_app = (rtcp_app *) e->data; - if (strncmp(pckt_app->name, "RTT_", 4) == 0) { - assert(pckt_app->length = 3); - assert(pckt_app->subtype = 0); - gettimeofday(&curr_time, NULL); -// tfrc_recv_rtt(state->tfrc_state, curr_time, ntohl(*((int *) pckt_app->data))); - } - break; - case RX_BYE: - break; - case SOURCE_DELETED: - break; - case SOURCE_CREATED: - pdb_add(participants, e->ssrc); - break; - case RR_TIMEOUT: - break; - default: - debug_msg("Unknown RTP event (type=%d)\n", e->type); - } + switch (e->type) { + case RX_RTP: + if (pckt_rtp->data_len > 0) { /* Only process packets that contain data... */ + pbuf_insert(state->playout_buffer, pckt_rtp); + } + tfrc_recv_data(state->tfrc_state, curr_time, pckt_rtp->seq, + pckt_rtp->data_len + 40); + break; + case RX_TFRC_RX: + /* compute TCP friendly data rate */ + break; + case RX_RTCP_START: + break; + case RX_RTCP_FINISH: + break; + case RX_SR: + break; + case RX_RR: + process_rr(session, e); + break; + case RX_RR_EMPTY: + break; + case RX_SDES: + process_sdes(participants, e->ssrc, (rtcp_sdes_item *) e->data); + break; + case RX_APP: + pckt_app = (rtcp_app *) e->data; + if (strncmp(pckt_app->name, "RTT_", 4) == 0) { + assert(pckt_app->length = 3); + assert(pckt_app->subtype = 0); + gettimeofday(&curr_time, NULL); +// tfrc_recv_rtt(state->tfrc_state, curr_time, ntohl(*((int *) pckt_app->data))); + } + break; + case RX_BYE: + break; + case SOURCE_DELETED: + break; + case SOURCE_CREATED: + pdb_add(participants, e->ssrc); + break; + case RR_TIMEOUT: + break; + default: + debug_msg("Unknown RTP event (type=%d)\n", e->type); + } } - diff --git a/ultragrid/src/tfrc.c b/ultragrid/src/tfrc.c index 8b62fec07..d57e42000 100644 --- a/ultragrid/src/tfrc.c +++ b/ultragrid/src/tfrc.c @@ -52,10 +52,10 @@ #include "tv.h" #include "tfrc.h" -#define TFRC_MAGIC 0xbaef03b7 /* For debugging */ +#define TFRC_MAGIC 0xbaef03b7 /* For debugging */ #define MAX_HISTORY 1000 -#define N 8 /* number of intervals */ +#define N 8 /* number of intervals */ #define MAX_DROPOUT 100 #define RTP_SEQ_MOD 0x10000 #define MAX_MISORDER 100 @@ -67,300 +67,294 @@ * */ struct tfrc { - int total_pckts; - int ooo; - int cycles; /* number of times seq number cycles 65535 */ - uint32_t RTT; /* received from sender in app packet */ - struct timeval feedback_timer; /* indicates points in time when p should be computed */ - double p, p_prev; - int s; - struct timeval start_time; - int loss_count; - int interval_count; - int gap[20]; - int jj; /* index for arrival -1<=i<=MAX_HISTORY */ - int ii; /* index for loss -1<=ii<=10 */ - double W_tot; - double weight[N+5]; /* Weights for loss event calculation. In the RFC, the numbering is the other way around */ - uint32_t magic; /* For debugging */ + int total_pckts; + int ooo; + int cycles; /* number of times seq number cycles 65535 */ + uint32_t RTT; /* received from sender in app packet */ + struct timeval feedback_timer; /* indicates points in time when p should be computed */ + double p, p_prev; + int s; + struct timeval start_time; + int loss_count; + int interval_count; + int gap[20]; + int jj; /* index for arrival -1<=i<=MAX_HISTORY */ + int ii; /* index for loss -1<=ii<=10 */ + double W_tot; + double weight[N + 5]; /* Weights for loss event calculation. In the RFC, the numbering is the other way around */ + uint32_t magic; /* For debugging */ }; -static void -validate_tfrc_state(struct tfrc *state) +static void validate_tfrc_state(struct tfrc *state) { - /* Debugging routine. Called each time we enter TFRC code, */ - /* to ensure that the state information we've been given */ - /* is valid. */ - assert(state->magic == TFRC_MAGIC); + /* Debugging routine. Called each time we enter TFRC code, */ + /* to ensure that the state information we've been given */ + /* is valid. */ + assert(state->magic == TFRC_MAGIC); #ifdef DEBUG - /* ...do some fancy debugging... */ + /* ...do some fancy debugging... */ #endif } static struct { - uint32_t seq; - uint32_t ts; + uint32_t seq; + uint32_t ts; } arrival[MAX_HISTORY]; static struct { - uint32_t seq; - uint32_t ts; + uint32_t seq; + uint32_t ts; } loss[MAX_HISTORY]; - #ifdef NDEF -static double -transfer_rate(double p) +static double transfer_rate(double p) { - double t, t1, t2, t3, t4, rtt, tRTO; - if (p == 0) { - return 0; - } + double t, t1, t2, t3, t4, rtt, tRTO; + if (p == 0) { + return 0; + } - /* convert RTT from usec to sec */ - rtt = ((double) RTT) / 1000000.0; - tRTO = 4 * rtt; + /* convert RTT from usec to sec */ + rtt = ((double)RTT) / 1000000.0; + tRTO = 4 * rtt; - t1 = rtt * sqrt(2 * p / 3); - t2 = (1 + 32 * p * p); - t3 = 3 * sqrt(3 * p / 8); - t4 = t1 + tRTO * t3 * p * t2; - t = ((double) s) / t4; + t1 = rtt * sqrt(2 * p / 3); + t2 = (1 + 32 * p * p); + t3 = 3 * sqrt(3 * p / 8); + t4 = t1 + tRTO * t3 * p * t2; + t = ((double)s) / t4; - return (t); + return (t); } -static void -compute_transfer_rate(void) +static void compute_transfer_rate(void) { - double t1; - struct timeval now; + double t1; + struct timeval now; - t1 = transfer_rate(p); - gettimeofday(&now, NULL); + t1 = transfer_rate(p); + gettimeofday(&now, NULL); } #endif - -static int -set_zero(int first, int last, uint16_t u) +static int set_zero(int first, int last, uint16_t u) { - int i, count = 0;; + int i, count = 0;; - assert((first >= 0) && (first < MAX_HISTORY)); - assert((last >= 0) && (last < MAX_HISTORY)); + assert((first >= 0) && (first < MAX_HISTORY)); + assert((last >= 0) && (last < MAX_HISTORY)); - if (first == last) - return (0); - if ((first + 1) % MAX_HISTORY == last) - return (1); + if (first == last) + return (0); + if ((first + 1) % MAX_HISTORY == last) + return (1); - if (first < last) { - for (i = first + 1; i < last; i++) { - arrival[i].seq = 0; - arrival[i].ts = 0; - count++; - } - } else { - for (i = first + 1; i < MAX_HISTORY; i++) { - arrival[i].seq = 0; - arrival[i].ts = 0; - count++; - } - for (i = 0; i < last; i++) { - arrival[i].seq = 0; - arrival[i].ts = 0; - count++; - } - } - assert(count == (u - 1)); - return (count); + if (first < last) { + for (i = first + 1; i < last; i++) { + arrival[i].seq = 0; + arrival[i].ts = 0; + count++; + } + } else { + for (i = first + 1; i < MAX_HISTORY; i++) { + arrival[i].seq = 0; + arrival[i].ts = 0; + count++; + } + for (i = 0; i < last; i++) { + arrival[i].seq = 0; + arrival[i].ts = 0; + count++; + } + } + assert(count == (u - 1)); + return (count); } -static int -arrived(int first, int last) +static int arrived(int first, int last) { - int i, count = 0; + int i, count = 0; - assert((first >= 0) && (first < MAX_HISTORY)); - assert((last >= 0) && (last < MAX_HISTORY)); + assert((first >= 0) && (first < MAX_HISTORY)); + assert((last >= 0) && (last < MAX_HISTORY)); - if (first == last) - return (0); - if ((first + 1) % MAX_HISTORY == last) - return (0); + if (first == last) + return (0); + if ((first + 1) % MAX_HISTORY == last) + return (0); - if (first < last) { - for (i = first; i <= last; i++) { - if (arrival[i].seq != 0) - count++; - } - } else { - for (i = first; i < MAX_HISTORY; i++) { - if (arrival[i].seq != 0) - count++; - } - for (i = 0; i <= last; i++) { - if (arrival[i].seq != 0) - count++; - } - } - return (count); + if (first < last) { + for (i = first; i <= last; i++) { + if (arrival[i].seq != 0) + count++; + } + } else { + for (i = first; i < MAX_HISTORY; i++) { + if (arrival[i].seq != 0) + count++; + } + for (i = 0; i <= last; i++) { + if (arrival[i].seq != 0) + count++; + } + } + return (count); } - static void -record_loss(struct tfrc *state, uint32_t s1, uint32_t s2, uint32_t ts1, uint32_t ts2) +record_loss(struct tfrc *state, uint32_t s1, uint32_t s2, uint32_t ts1, + uint32_t ts2) { - /* Mark all packets between s1 (which arrived at time ts1) and */ - /* s2 (which arrived at time ts2) as lost. */ - int i; - uint32_t est; - uint32_t seq = s1 + 1; + /* Mark all packets between s1 (which arrived at time ts1) and */ + /* s2 (which arrived at time ts2) as lost. */ + int i; + uint32_t est; + uint32_t seq = s1 + 1; - est = ts1 + (ts2 - ts1) * ((seq - s1) / (s2 - seq)); + est = ts1 + (ts2 - ts1) * ((seq - s1) / (s2 - seq)); - state->loss_count++; - if (state->ii <= -1) { - /* first loss! */ - state->ii++; - loss[state->ii].seq = seq; - loss[state->ii].ts = est; - return; - } + state->loss_count++; + if (state->ii <= -1) { + /* first loss! */ + state->ii++; + loss[state->ii].seq = seq; + loss[state->ii].ts = est; + return; + } - if (est - loss[state->ii].ts <= state->RTT) { /* not a new event */ - return; - } + if (est - loss[state->ii].ts <= state->RTT) { /* not a new event */ + return; + } - state->interval_count++; - if (state->ii > (N + 1)) { - printf("how did this happen?\n"); - } + state->interval_count++; + if (state->ii > (N + 1)) { + printf("how did this happen?\n"); + } - if (state->ii >= (N + 1)) { /* shift */ - for (i = 0; i < (N + 1); i++) { - loss[i].seq = loss[i + 1].seq; - loss[i].ts = loss[i + 1].ts; - } - state->ii = N; - } + if (state->ii >= (N + 1)) { /* shift */ + for (i = 0; i < (N + 1); i++) { + loss[i].seq = loss[i + 1].seq; + loss[i].ts = loss[i + 1].ts; + } + state->ii = N; + } - state->ii++; - loss[state->ii].seq = seq; - loss[state->ii].ts = est; + state->ii++; + loss[state->ii].seq = seq; + loss[state->ii].ts = est; } static void save_arrival(struct tfrc *state, struct timeval curr_time, uint16_t seq) { - int kk, inc, last_jj; - uint16_t udelta; - uint32_t now; - uint32_t ext_seq; - static uint16_t last_seq; - static uint32_t ext_last_ack; - static int last_ack_jj = 0; + int kk, inc, last_jj; + uint16_t udelta; + uint32_t now; + uint32_t ext_seq; + static uint16_t last_seq; + static uint32_t ext_last_ack; + static int last_ack_jj = 0; - gettimeofday(&curr_time, NULL); - now = tv_diff_usec(curr_time, state->start_time); + gettimeofday(&curr_time, NULL); + now = tv_diff_usec(curr_time, state->start_time); - if (state->jj == -1) { - /* first packet arrival */ - state->jj = 0; - last_seq = seq; - ext_last_ack = seq; - last_ack_jj = 0; - arrival[state->jj].seq = seq; - arrival[state->jj].ts = now; - return; - } + if (state->jj == -1) { + /* first packet arrival */ + state->jj = 0; + last_seq = seq; + ext_last_ack = seq; + last_ack_jj = 0; + arrival[state->jj].seq = seq; + arrival[state->jj].ts = now; + return; + } - udelta = seq - last_seq; + udelta = seq - last_seq; - state->total_pckts++; - if (udelta < MAX_DROPOUT) { - /* in order, with permissible gap */ - if (seq < last_seq) { - state->cycles++; - } - /* record arrival */ - last_jj = state->jj; - state->jj = (state->jj + udelta) % MAX_HISTORY; - set_zero(last_jj, state->jj, udelta); - ext_seq = seq + state->cycles * RTP_SEQ_MOD; - last_seq = seq; - arrival[state->jj].seq = ext_seq; - arrival[state->jj].ts = now; - if (udelta < 10) - state->gap[udelta - 1]++; + state->total_pckts++; + if (udelta < MAX_DROPOUT) { + /* in order, with permissible gap */ + if (seq < last_seq) { + state->cycles++; + } + /* record arrival */ + last_jj = state->jj; + state->jj = (state->jj + udelta) % MAX_HISTORY; + set_zero(last_jj, state->jj, udelta); + ext_seq = seq + state->cycles * RTP_SEQ_MOD; + last_seq = seq; + arrival[state->jj].seq = ext_seq; + arrival[state->jj].ts = now; + if (udelta < 10) + state->gap[udelta - 1]++; - if ((ext_seq - ext_last_ack) == 1) { - /* We got two consecutive packets, no loss */ - ext_last_ack = ext_seq; - last_ack_jj = state->jj; - } else { - /* Sequence number jumped, we've missed a packet for some reason */ - if (arrived(last_ack_jj, state->jj) >= 4) { - record_loss(state, ext_last_ack, ext_seq, - arrival[last_ack_jj].ts, now); - ext_last_ack = ext_seq; - last_ack_jj = state->jj; - } - } - } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { - printf(" -- seq:%u last seq:%u ", seq, arrival[state->jj].seq); - abort(); /* FIXME */ - } else { - /* duplicate or reordered packet */ - ext_seq = seq + state->cycles * RTP_SEQ_MOD; - state->ooo++; - if (ext_seq > ext_last_ack) { - inc = ext_seq - arrival[state->jj].seq; + if ((ext_seq - ext_last_ack) == 1) { + /* We got two consecutive packets, no loss */ + ext_last_ack = ext_seq; + last_ack_jj = state->jj; + } else { + /* Sequence number jumped, we've missed a packet for some reason */ + if (arrived(last_ack_jj, state->jj) >= 4) { + record_loss(state, ext_last_ack, ext_seq, + arrival[last_ack_jj].ts, now); + ext_last_ack = ext_seq; + last_ack_jj = state->jj; + } + } + } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { + printf(" -- seq:%u last seq:%u ", seq, arrival[state->jj].seq); + abort(); /* FIXME */ + } else { + /* duplicate or reordered packet */ + ext_seq = seq + state->cycles * RTP_SEQ_MOD; + state->ooo++; + if (ext_seq > ext_last_ack) { + inc = ext_seq - arrival[state->jj].seq; - kk = (state->jj + inc) % MAX_HISTORY; - if (arrival[kk].seq == 0) { - arrival[kk].seq = ext_seq; - arrival[kk].ts = (arrival[last_ack_jj].ts + now) / 2; /* NOT the best interpolation */ - } - while (arrival[last_ack_jj + 1].seq != 0 - && last_ack_jj < state->jj) { - last_ack_jj = (last_ack_jj + 1) % MAX_HISTORY; - } - ext_last_ack = arrival[last_ack_jj].seq; - } - } + kk = (state->jj + inc) % MAX_HISTORY; + if (arrival[kk].seq == 0) { + arrival[kk].seq = ext_seq; + arrival[kk].ts = (arrival[last_ack_jj].ts + now) / 2; /* NOT the best interpolation */ + } + while (arrival[last_ack_jj + 1].seq != 0 + && last_ack_jj < state->jj) { + last_ack_jj = (last_ack_jj + 1) % MAX_HISTORY; + } + ext_last_ack = arrival[last_ack_jj].seq; + } + } } -static double -compute_loss_event(struct tfrc *state) +static double compute_loss_event(struct tfrc *state) { - int i; - uint32_t t, temp, I_tot0 = 0, I_tot1 = 0, I_tot = 0; - struct timeval now; - double I_mean, p; + int i; + uint32_t t, temp, I_tot0 = 0, I_tot1 = 0, I_tot = 0; + struct timeval now; + double I_mean, p; - if (state->ii < N) { - return 0; - } + if (state->ii < N) { + return 0; + } - for (i = state->ii - N; i < state->ii; i++) { - temp = loss[i + 1].seq - loss[i].seq; - I_tot0 = I_tot0 + temp * state->weight[i]; - if (i >= (state->ii - N + 1)) { - I_tot1 = I_tot1 + temp * state->weight[i - 1]; - } - } - I_tot1 = I_tot1 + (arrival[state->jj].seq - loss[state->ii].seq) * state->weight[N - 1]; + for (i = state->ii - N; i < state->ii; i++) { + temp = loss[i + 1].seq - loss[i].seq; + I_tot0 = I_tot0 + temp * state->weight[i]; + if (i >= (state->ii - N + 1)) { + I_tot1 = I_tot1 + temp * state->weight[i - 1]; + } + } + I_tot1 = + I_tot1 + (arrival[state->jj].seq - + loss[state->ii].seq) * state->weight[N - 1]; - I_tot = (I_tot1 > I_tot0) ? I_tot1 : I_tot0; - I_mean = I_tot / state->W_tot; - p = 1 / I_mean; + I_tot = (I_tot1 > I_tot0) ? I_tot1 : I_tot0; + I_mean = I_tot / state->W_tot; + p = 1 / I_mean; - gettimeofday(&now, NULL); - t = tv_diff_usec(now, state->start_time); + gettimeofday(&now, NULL); + t = tv_diff_usec(now, state->start_time); - return p; + return p; } @@ -369,144 +363,141 @@ compute_loss_event(struct tfrc *state) * */ -struct tfrc * -tfrc_init(struct timeval curr_time) +struct tfrc *tfrc_init(struct timeval curr_time) { - struct tfrc *state; - int i; + struct tfrc *state; + int i; - state = (struct tfrc *) malloc(sizeof(struct tfrc)); - if (state != NULL) { - state->magic = TFRC_MAGIC; - state->total_pckts = 0; - state->ooo = 0; - state->cycles = 0; - state->RTT = 0; - state->feedback_timer = curr_time; - state->p = 0.0; - state->p_prev = 0.0; - state->s = 0; - state->start_time = curr_time; - state->loss_count = 0; - state->interval_count = 0; - state->jj = -1; - state->ii = -1; - state->W_tot = 0; - state->weight[0] = 0.2; - state->weight[1] = 0.4; - state->weight[2] = 0.6; - state->weight[3] = 0.8; - state->weight[4] = 1.0; - state->weight[5] = 1.0; - state->weight[6] = 1.0; - state->weight[7] = 1.0; - state->weight[8] = 1.0; + state = (struct tfrc *)malloc(sizeof(struct tfrc)); + if (state != NULL) { + state->magic = TFRC_MAGIC; + state->total_pckts = 0; + state->ooo = 0; + state->cycles = 0; + state->RTT = 0; + state->feedback_timer = curr_time; + state->p = 0.0; + state->p_prev = 0.0; + state->s = 0; + state->start_time = curr_time; + state->loss_count = 0; + state->interval_count = 0; + state->jj = -1; + state->ii = -1; + state->W_tot = 0; + state->weight[0] = 0.2; + state->weight[1] = 0.4; + state->weight[2] = 0.6; + state->weight[3] = 0.8; + state->weight[4] = 1.0; + state->weight[5] = 1.0; + state->weight[6] = 1.0; + state->weight[7] = 1.0; + state->weight[8] = 1.0; - for (i = 0; i < 20; i++) { - state->gap[i] = 0; - } + for (i = 0; i < 20; i++) { + state->gap[i] = 0; + } - for (i = 0; i < N; i++) { - state->W_tot = state->W_tot + state->weight[i]; - } - } + for (i = 0; i < N; i++) { + state->W_tot = state->W_tot + state->weight[i]; + } + } - for (i = 0; i < MAX_HISTORY; i++) { - arrival[i].seq = 0; - arrival[i].ts = 0; - loss[i].seq = 0; - loss[i].ts = 0; - } - return state; + for (i = 0; i < MAX_HISTORY; i++) { + arrival[i].seq = 0; + arrival[i].ts = 0; + loss[i].seq = 0; + loss[i].ts = 0; + } + return state; } -void -tfrc_done(struct tfrc *state) +void tfrc_done(struct tfrc *state) { - int i; + int i; - validate_tfrc_state(state); + validate_tfrc_state(state); - for (i = 0; i < 10; i++) { - printf("\n%2d %8d", i, state->gap[i]); - } - printf("\n"); - printf("\nLost: %8d", state->loss_count); - printf("\nIntervals: %8d", state->interval_count); - printf("\nTotal: %8d", state->total_pckts); - printf("\nooo: %8d -- %7.5f\n\n", state->ooo, (state->ooo * 100) / (double) state->total_pckts); + for (i = 0; i < 10; i++) { + printf("\n%2d %8d", i, state->gap[i]); + } + printf("\n"); + printf("\nLost: %8d", state->loss_count); + printf("\nIntervals: %8d", state->interval_count); + printf("\nTotal: %8d", state->total_pckts); + printf("\nooo: %8d -- %7.5f\n\n", state->ooo, + (state->ooo * 100) / (double)state->total_pckts); } void -tfrc_recv_data(struct tfrc *state, struct timeval curr_time, uint16_t seqnum, unsigned length) +tfrc_recv_data(struct tfrc *state, struct timeval curr_time, uint16_t seqnum, + unsigned length) { - /* This is called each time an RTP packet is received. Accordingly, */ - /* it needs to be _very_ fast, otherwise we'll drop packets. */ + /* This is called each time an RTP packet is received. Accordingly, */ + /* it needs to be _very_ fast, otherwise we'll drop packets. */ - validate_tfrc_state(state); + validate_tfrc_state(state); - if (state->RTT > 0) { - save_arrival(state, curr_time, seqnum); - state->p_prev = state->p; + if (state->RTT > 0) { + save_arrival(state, curr_time, seqnum); + state->p_prev = state->p; #ifdef NDEF - state->p = compute_loss_event(state); - if (state->p - state->p_prev > 0.00000000001) { - gettimeofday(&(state->feedback_timer), NULL); - tv_add(&(state->feedback_timer), (unsigned int) state->RTT); - compute_transfer_rate(); - } + state->p = compute_loss_event(state); + if (state->p - state->p_prev > 0.00000000001) { + gettimeofday(&(state->feedback_timer), NULL); + tv_add(&(state->feedback_timer), + (unsigned int)state->RTT); + compute_transfer_rate(); + } #endif - } - state->s = length; /* packet size is needed transfer_rate */ + } + state->s = length; /* packet size is needed transfer_rate */ } -void -tfrc_recv_rtt(struct tfrc *state, struct timeval curr_time, uint32_t rtt) +void tfrc_recv_rtt(struct tfrc *state, struct timeval curr_time, uint32_t rtt) { - /* Called whenever the receiver gets an RTCP APP packet telling */ - /* it the RTT to the sender. Not performance critical. */ - /* Note: RTT is in microseconds. */ + /* Called whenever the receiver gets an RTCP APP packet telling */ + /* it the RTT to the sender. Not performance critical. */ + /* Note: RTT is in microseconds. */ - validate_tfrc_state(state); + validate_tfrc_state(state); - if (state->RTT == 0) { - state->feedback_timer = curr_time; - tv_add(&(state->feedback_timer), rtt); - } - state->RTT = rtt; + if (state->RTT == 0) { + state->feedback_timer = curr_time; + tv_add(&(state->feedback_timer), rtt); + } + state->RTT = rtt; } -int -tfrc_feedback_is_due(struct tfrc *state, struct timeval curr_time) +int tfrc_feedback_is_due(struct tfrc *state, struct timeval curr_time) { - /* Determine if it is time to send feedback to the sender */ - validate_tfrc_state(state); + /* Determine if it is time to send feedback to the sender */ + validate_tfrc_state(state); - if ((state->RTT == 0) || tv_gt(state->feedback_timer, curr_time)){ - /* Not yet time to send feedback to the sender... */ - return FALSE; - } - return TRUE; + if ((state->RTT == 0) || tv_gt(state->feedback_timer, curr_time)) { + /* Not yet time to send feedback to the sender... */ + return FALSE; + } + return TRUE; } -double -tfrc_feedback_txrate(struct tfrc *state, struct timeval curr_time) +double tfrc_feedback_txrate(struct tfrc *state, struct timeval curr_time) { - /* Calculate the appropriate transmission rate, to be included */ - /* in a feedback message to the sender. */ + /* Calculate the appropriate transmission rate, to be included */ + /* in a feedback message to the sender. */ - validate_tfrc_state(state); + validate_tfrc_state(state); - assert(tfrc_feedback_is_due(state, curr_time)); + assert(tfrc_feedback_is_due(state, curr_time)); - state->feedback_timer.tv_sec = curr_time.tv_sec; - state->feedback_timer.tv_usec = curr_time.tv_usec; - tv_add(&(state->feedback_timer), state->RTT); - state->p = compute_loss_event(state); - //compute_transfer_rate (); - if (state->ii >= N) { - abort(); /* FIXME */ - } - return 0.0; /* FIXME */ + state->feedback_timer.tv_sec = curr_time.tv_sec; + state->feedback_timer.tv_usec = curr_time.tv_usec; + tv_add(&(state->feedback_timer), state->RTT); + state->p = compute_loss_event(state); + //compute_transfer_rate (); + if (state->ii >= N) { + abort(); /* FIXME */ + } + return 0.0; /* FIXME */ } - diff --git a/ultragrid/src/transmit.c b/ultragrid/src/transmit.c index a62b5763a..a7d0f4829 100644 --- a/ultragrid/src/transmit.c +++ b/ultragrid/src/transmit.c @@ -73,103 +73,101 @@ extern long packet_rate; #define GET_STARTTIME gettimeofday(&start, NULL) #define GET_STOPTIME gettimeofday(&stop, NULL) #define GET_DELTA delta = (stop.tv_usec - start.tv_usec) * 1000L -#else /* HAVE_MACOSX */ +#else /* HAVE_MACOSX */ #define GET_STARTTIME clock_gettime(CLOCK_REALTIME, &start) #define GET_STOPTIME clock_gettime(CLOCK_REALTIME, &stop) #define GET_DELTA delta = stop.tv_nsec - start.tv_nsec -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ struct video_tx { - uint32_t magic; - unsigned mtu; + uint32_t magic; + unsigned mtu; }; -struct video_tx * -tx_init(unsigned mtu) +struct video_tx *tx_init(unsigned mtu) { - struct video_tx *tx; + struct video_tx *tx; - tx = (struct video_tx *) malloc(sizeof(struct video_tx)); - if (tx != NULL) { - tx->magic = TRANSMIT_MAGIC; - tx->mtu = mtu; - } - return tx; + tx = (struct video_tx *)malloc(sizeof(struct video_tx)); + if (tx != NULL) { + tx->magic = TRANSMIT_MAGIC; + tx->mtu = mtu; + } + return tx; } -void -tx_done(struct video_tx *tx) +void tx_done(struct video_tx *tx) { - assert(tx->magic == TRANSMIT_MAGIC); - free(tx); + assert(tx->magic == TRANSMIT_MAGIC); + free(tx); } void tx_send(struct video_tx *tx, struct video_frame *frame, struct rtp *rtp_session) { - int m, data_len; - payload_hdr_t payload_hdr; - int pt = 96; /* A dynamic payload type for the tests... */ - static uint32_t ts = 0; - char *data; - unsigned int pos; + int m, data_len; + payload_hdr_t payload_hdr; + int pt = 96; /* A dynamic payload type for the tests... */ + static uint32_t ts = 0; + char *data; + unsigned int pos; #if HAVE_MACOSX - struct timeval start, stop; -#else /* HAVE_MACOSX */ + struct timeval start, stop; +#else /* HAVE_MACOSX */ struct timespec start, stop; -#endif /* HAVE_MACOSX */ - long delta; +#endif /* HAVE_MACOSX */ + long delta; - assert(tx->magic == TRANSMIT_MAGIC); + assert(tx->magic == TRANSMIT_MAGIC); - m = 0; - ts = get_local_mediatime(); + m = 0; + ts = get_local_mediatime(); pos = 0; payload_hdr.width = htons(frame->width); payload_hdr.height = htons(frame->height); payload_hdr.colorspc = frame->color_spec; - do { - payload_hdr.offset = htonl(pos); - payload_hdr.flags = htons(1<<15); + do { + payload_hdr.offset = htonl(pos); + payload_hdr.flags = htons(1 << 15); - data = frame->data + pos; + data = frame->data + pos; data_len = tx->mtu - 40 - (sizeof(payload_hdr_t)); - if(pos + data_len > frame->data_len) { - m = 1; - data_len = frame->data_len - pos; + if (pos + data_len > frame->data_len) { + m = 1; + data_len = frame->data_len - pos; } pos += data_len; - payload_hdr.length = htons(data_len); - GET_STARTTIME; - rtp_send_data_hdr(rtp_session, ts, pt, m, 0, 0, (char *)&payload_hdr, - sizeof(payload_hdr_t), data, data_len, 0, 0, 0); - do { - GET_STOPTIME; - GET_DELTA; - if(delta < 0) - delta += 1000000000L; - } while(packet_rate - delta > 0); + payload_hdr.length = htons(data_len); + GET_STARTTIME; + rtp_send_data_hdr(rtp_session, ts, pt, m, 0, 0, + (char *)&payload_hdr, sizeof(payload_hdr_t), + data, data_len, 0, 0, 0); + do { + GET_STOPTIME; + GET_DELTA; + if (delta < 0) + delta += 1000000000L; + } while (packet_rate - delta > 0); - } while (pos < frame->data_len); + } while (pos < frame->data_len); } #ifdef HAVE_AUDIO -void -audio_tx_send(struct rtp *rtp_session, audio_frame *buffer) +void audio_tx_send(struct rtp *rtp_session, audio_frame * buffer) { - audio_frame_to_network_buffer(buffer->tmp_buffer, buffer); + audio_frame_to_network_buffer(buffer->tmp_buffer, buffer); - //uint32_t timestamp = get_local_mediatime(); - static uint32_t timestamp; - timestamp++; + //uint32_t timestamp = get_local_mediatime(); + static uint32_t timestamp; + timestamp++; - int marker_bit = 0; // FIXME: probably should define last packet of a frame, but is payload dependand so...think this through - - rtp_send_data(rtp_session, timestamp, audio_payload_type, marker_bit, - 0, /* contributing sources */ - 0, /* contributing sources length*/ - buffer->tmp_buffer, buffer->samples_per_channel * 3 * 8, 0, 0, 0); + int marker_bit = 0; // FIXME: probably should define last packet of a frame, but is payload dependand so...think this through + + rtp_send_data(rtp_session, timestamp, audio_payload_type, marker_bit, 0, /* contributing sources */ + 0, /* contributing sources length */ + buffer->tmp_buffer, buffer->samples_per_channel * 3 * 8, + 0, 0, 0); } -#endif /* HAVE_AUDIO */ +#endif /* HAVE_AUDIO */ diff --git a/ultragrid/src/tv.c b/ultragrid/src/tv.c index 2ae890269..cdbbda306 100644 --- a/ultragrid/src/tv.c +++ b/ultragrid/src/tv.c @@ -51,14 +51,13 @@ #include "crypto/random.h" #include "tv.h" -uint32_t -get_local_mediatime(void) +uint32_t get_local_mediatime(void) { - static struct timeval start_time; - static uint32_t random_offset; - static int first = 0; - - struct timeval curr_time; + static struct timeval start_time; + static uint32_t random_offset; + static int first = 0; + + struct timeval curr_time; if (first == 0) { gettimeofday(&start_time, NULL); @@ -70,41 +69,39 @@ get_local_mediatime(void) return (tv_diff(curr_time, start_time) * 90000) + random_offset; } - -double -tv_diff(struct timeval curr_time, struct timeval prev_time) +double tv_diff(struct timeval curr_time, struct timeval prev_time) { - /* Return (curr_time - prev_time) in seconds */ - double ct, pt; + /* Return (curr_time - prev_time) in seconds */ + double ct, pt; - ct = (double) curr_time.tv_sec + (((double) curr_time.tv_usec) / 1000000.0); - pt = (double) prev_time.tv_sec + (((double) prev_time.tv_usec) / 1000000.0); - return (ct - pt); + ct = (double)curr_time.tv_sec + + (((double)curr_time.tv_usec) / 1000000.0); + pt = (double)prev_time.tv_sec + + (((double)prev_time.tv_usec) / 1000000.0); + return (ct - pt); } -uint32_t -tv_diff_usec (struct timeval curr_time, struct timeval prev_time) -{ - /* Return curr_time - prev_time in usec - i wonder if these numbers will be too big?*/ - uint32_t tmp, tmp1, tmp2; +uint32_t tv_diff_usec(struct timeval curr_time, struct timeval prev_time) +{ + /* Return curr_time - prev_time in usec - i wonder if these numbers will be too big? */ + uint32_t tmp, tmp1, tmp2; - /* We return an unsigned, so fail is prev_time is later than curr_time */ - assert(curr_time.tv_sec >= prev_time.tv_sec); - if (curr_time.tv_sec == prev_time.tv_sec) { - assert(curr_time.tv_usec >= prev_time.tv_usec); - } + /* We return an unsigned, so fail is prev_time is later than curr_time */ + assert(curr_time.tv_sec >= prev_time.tv_sec); + if (curr_time.tv_sec == prev_time.tv_sec) { + assert(curr_time.tv_usec >= prev_time.tv_usec); + } - tmp1 = (curr_time.tv_sec - prev_time.tv_sec)*((uint32_t)1000000); + tmp1 = (curr_time.tv_sec - prev_time.tv_sec) * ((uint32_t) 1000000); tmp2 = curr_time.tv_usec - prev_time.tv_usec; - tmp = tmp1+tmp2; + tmp = tmp1 + tmp2; - return tmp; + return tmp; } -void -tv_add(struct timeval *ts, double offset_secs) +void tv_add(struct timeval *ts, double offset_secs) { - unsigned int offset = (unsigned long) (offset_secs * 1000000.0); + unsigned int offset = (unsigned long)(offset_secs * 1000000.0); ts->tv_usec += offset; while (ts->tv_usec >= 1000000) { @@ -113,8 +110,7 @@ tv_add(struct timeval *ts, double offset_secs) } } -int -tv_gt(struct timeval a, struct timeval b) +int tv_gt(struct timeval a, struct timeval b) { /* Returns (a>b) */ if (a.tv_sec > b.tv_sec) { @@ -126,4 +122,3 @@ tv_gt(struct timeval a, struct timeval b) assert(a.tv_sec == b.tv_sec); return a.tv_usec > b.tv_usec; } - diff --git a/ultragrid/src/video_capture.c b/ultragrid/src/video_capture.c index 28a151e0f..10b67143e 100644 --- a/ultragrid/src/video_capture.c +++ b/ultragrid/src/video_capture.c @@ -68,184 +68,171 @@ #define VIDCAP_MAGIC 0x76ae98f0 struct vidcap { - void *state; - int index; - uint32_t magic; /* For debugging */ + void *state; + int index; + uint32_t magic; /* For debugging */ }; struct vidcap_device_api { - vidcap_id_t id; - struct vidcap_type *(*func_probe)(void); - void *(*func_init)(char *fmt); - void (*func_done)(void *state); - struct video_frame *(*func_grab)(void *state); + vidcap_id_t id; + struct vidcap_type *(*func_probe) (void); + void *(*func_init) (char *fmt); + void (*func_done) (void *state); + struct video_frame *(*func_grab) (void *state); }; struct vidcap_device_api vidcap_device_table[] = { #ifdef HAVE_FIREWIRE_DV_FREEBSD - { - /* A FireWire DV capture card, on FreeBSD */ - 0, - vidcap_dvbsd_probe, - vidcap_dvbsd_init, - vidcap_dvbsd_done, - vidcap_dvbsd_grab - }, -#endif /* HAVE_FIREWIRE_DV_FREEBSD */ -#ifdef HAVE_HDSTATION - { - /* The DVS HDstation capture card */ - 0, - vidcap_hdstation_probe, - vidcap_hdstation_init, - vidcap_hdstation_done, - vidcap_hdstation_grab - }, -#endif /* HAVE_HDSTATION */ -#ifdef HAVE_DECKLINK - { - /* The Blackmagic DeckLink capture card */ - 0, - vidcap_decklink_probe, - vidcap_decklink_init, - vidcap_decklink_done, - vidcap_decklink_grab - }, -#endif /* HAVE_DECKLINK */ -#ifdef HAVE_QUAD { - /* The HD-SDI Master Quad capture card */ - 0, - vidcap_quad_probe, - vidcap_quad_init, - vidcap_quad_done, - vidcap_quad_grab - }, -#endif /* HAVE_QUAD */ + /* A FireWire DV capture card, on FreeBSD */ + 0, + vidcap_dvbsd_probe, + vidcap_dvbsd_init, + vidcap_dvbsd_done, + vidcap_dvbsd_grab}, +#endif /* HAVE_FIREWIRE_DV_FREEBSD */ +#ifdef HAVE_HDSTATION + { + /* The DVS HDstation capture card */ + 0, + vidcap_hdstation_probe, + vidcap_hdstation_init, + vidcap_hdstation_done, + vidcap_hdstation_grab}, +#endif /* HAVE_HDSTATION */ +#ifdef HAVE_DECKLINK + { + /* The Blackmagic DeckLink capture card */ + 0, + vidcap_decklink_probe, + vidcap_decklink_init, + vidcap_decklink_done, + vidcap_decklink_grab}, +#endif /* HAVE_DECKLINK */ +#ifdef HAVE_QUAD + { + /* The HD-SDI Master Quad capture card */ + 0, + vidcap_quad_probe, + vidcap_quad_init, + vidcap_quad_done, + vidcap_quad_grab}, +#endif /* HAVE_QUAD */ #ifdef HAVE_MACOSX - { - /* The QuickTime API */ - 0, - vidcap_quicktime_probe, - vidcap_quicktime_init, - vidcap_quicktime_done, - vidcap_quicktime_grab - }, -#endif /* HAVE_MACOSX */ - { - /* Dummy sender for testing purposes */ - 0, - vidcap_testcard_probe, - vidcap_testcard_init, - vidcap_testcard_done, - vidcap_testcard_grab - }, - { - 0, - vidcap_null_probe, - vidcap_null_init, - vidcap_null_done, - vidcap_null_grab - } + { + /* The QuickTime API */ + 0, + vidcap_quicktime_probe, + vidcap_quicktime_init, + vidcap_quicktime_done, + vidcap_quicktime_grab}, +#endif /* HAVE_MACOSX */ + { + /* Dummy sender for testing purposes */ + 0, + vidcap_testcard_probe, + vidcap_testcard_init, + vidcap_testcard_done, + vidcap_testcard_grab}, + { + 0, + vidcap_null_probe, + vidcap_null_init, + vidcap_null_done, + vidcap_null_grab} }; #define VIDCAP_DEVICE_TABLE_SIZE (sizeof(vidcap_device_table)/sizeof(struct vidcap_device_api)) /* API for probing capture devices ****************************************************************/ -static struct vidcap_type *available_devices[VIDCAP_DEVICE_TABLE_SIZE]; -static int available_device_count = 0; +static struct vidcap_type *available_devices[VIDCAP_DEVICE_TABLE_SIZE]; +static int available_device_count = 0; -int -vidcap_init_devices(void) +int vidcap_init_devices(void) { - unsigned int i; - struct vidcap_type *dt; + unsigned int i; + struct vidcap_type *dt; - assert(available_device_count == 0); + assert(available_device_count == 0); - for (i = 0; i < VIDCAP_DEVICE_TABLE_SIZE; i++) { - //printf("probe: %d\n",i); - dt = vidcap_device_table[i].func_probe(); - if (dt != NULL) { - vidcap_device_table[i].id = dt->id; - available_devices[available_device_count++] = dt; - } - } + for (i = 0; i < VIDCAP_DEVICE_TABLE_SIZE; i++) { + //printf("probe: %d\n",i); + dt = vidcap_device_table[i].func_probe(); + if (dt != NULL) { + vidcap_device_table[i].id = dt->id; + available_devices[available_device_count++] = dt; + } + } - return available_device_count; + return available_device_count; } -void -vidcap_free_devices(void) +void vidcap_free_devices(void) { - int i; + int i; - for (i = 0; i < available_device_count; i++) { - free(available_devices[i]); - available_devices[i] = NULL; - } - available_device_count = 0; + for (i = 0; i < available_device_count; i++) { + free(available_devices[i]); + available_devices[i] = NULL; + } + available_device_count = 0; } -int -vidcap_get_device_count(void) +int vidcap_get_device_count(void) { - return available_device_count; + return available_device_count; } -struct vidcap_type * -vidcap_get_device_details(int index) +struct vidcap_type *vidcap_get_device_details(int index) { - assert(index < available_device_count); - assert(available_devices[index] != NULL); + assert(index < available_device_count); + assert(available_devices[index] != NULL); - return available_devices[index]; + return available_devices[index]; } -vidcap_id_t -vidcap_get_null_device_id(void) +vidcap_id_t vidcap_get_null_device_id(void) { - return VIDCAP_NULL_ID; + return VIDCAP_NULL_ID; } /* API for video capture **************************************************************************/ -struct vidcap * -vidcap_init(vidcap_id_t id, char *fmt) +struct vidcap *vidcap_init(vidcap_id_t id, char *fmt) { - unsigned int i; + unsigned int i; - for (i = 0; i < VIDCAP_DEVICE_TABLE_SIZE; i++) { - if (vidcap_device_table[i].id == id) { - struct vidcap *d = (struct vidcap *) malloc(sizeof(struct vidcap)); - d->magic = VIDCAP_MAGIC; - d->state = vidcap_device_table[i].func_init(fmt); - d->index = i; - if (d->state == NULL) { - debug_msg("Unable to start video capture device 0x%08lx\n", id); - free(d); - return NULL; - } - return d; - } - } - debug_msg("Unknown video capture device: 0x%08x\n", id); - return NULL; + for (i = 0; i < VIDCAP_DEVICE_TABLE_SIZE; i++) { + if (vidcap_device_table[i].id == id) { + struct vidcap *d = + (struct vidcap *)malloc(sizeof(struct vidcap)); + d->magic = VIDCAP_MAGIC; + d->state = vidcap_device_table[i].func_init(fmt); + d->index = i; + if (d->state == NULL) { + debug_msg + ("Unable to start video capture device 0x%08lx\n", + id); + free(d); + return NULL; + } + return d; + } + } + debug_msg("Unknown video capture device: 0x%08x\n", id); + return NULL; } -void -vidcap_done(struct vidcap *state) +void vidcap_done(struct vidcap *state) { - assert(state->magic == VIDCAP_MAGIC); - vidcap_device_table[state->index].func_done(state->state); - free(state); + assert(state->magic == VIDCAP_MAGIC); + vidcap_device_table[state->index].func_done(state->state); + free(state); } -struct video_frame * -vidcap_grab(struct vidcap *state) +struct video_frame *vidcap_grab(struct vidcap *state) { - assert(state->magic == VIDCAP_MAGIC); - return vidcap_device_table[state->index].func_grab(state->state); + assert(state->magic == VIDCAP_MAGIC); + return vidcap_device_table[state->index].func_grab(state->state); } - diff --git a/ultragrid/src/video_capture/firewire_dv_freebsd.c b/ultragrid/src/video_capture/firewire_dv_freebsd.c index ec7058218..8b58165e8 100644 --- a/ultragrid/src/video_capture/firewire_dv_freebsd.c +++ b/ultragrid/src/video_capture/firewire_dv_freebsd.c @@ -56,93 +56,87 @@ #include "video_capture/firewire_dv_freebsd.h" struct vidcap_dvbsd_state { - int fd; /* File descriptor for the device */ -// int fps; + int fd; /* File descriptor for the device */ +// int fps; }; -void * -vidcap_dvbsd_init(char *fmt) +void *vidcap_dvbsd_init(char *fmt) { - int fps = atoi(fmt); //FIXME What is fps good for? - struct vidcap_dvbsd_state *s; - struct fw_isochreq isoreq; - struct fw_isobufreq bufreq; + int fps = atoi(fmt); //FIXME What is fps good for? + struct vidcap_dvbsd_state *s; + struct fw_isochreq isoreq; + struct fw_isobufreq bufreq; - s = malloc(sizeof(struct vidcap_dvbsd_state)); - if (s == NULL) { - return NULL; - } + s = malloc(sizeof(struct vidcap_dvbsd_state)); + if (s == NULL) { + return NULL; + } +// s->fps = fps; -// s->fps = fps; + s->fd = open("/dev/fw0.0", O_RDWR); + if (s->fd < 0) { + perror("Unable to open /dev/fw0.0"); + free(s); + return NULL; + } - s->fd = open("/dev/fw0.0", O_RDWR); - if (s->fd < 0) { - perror("Unable to open /dev/fw0.0"); - free(s); - return NULL; - } + bufreq.rx.nchunk = 8; + bufreq.rx.npacket = 256; + bufreq.rx.psize = 512; + bufreq.tx.nchunk = 0; + bufreq.tx.npacket = 0; + bufreq.tx.psize = 0; + if (ioctl(s->fd, FW_SSTBUF, &bufreq) < 0) { + perror("Unable to configure IEEE-1394 capture device"); + close(s->fd); + free(s); + return NULL; + } - bufreq.rx.nchunk = 8; - bufreq.rx.npacket = 256; - bufreq.rx.psize = 512; - bufreq.tx.nchunk = 0; - bufreq.tx.npacket = 0; - bufreq.tx.psize = 0; - if (ioctl(s->fd, FW_SSTBUF, &bufreq) < 0) { - perror("Unable to configure IEEE-1394 capture device"); - close(s->fd); - free(s); - return NULL; - } + isoreq.ch = 63; + isoreq.tag = 1 << 6; + if (ioctl(s->fd, FW_SRSTREAM, &isoreq) < 0) { + perror("Unable to start IEEE-1394 capture device"); + close(s->fd); + free(s); + return NULL; + } - isoreq.ch = 63; - isoreq.tag = 1<<6; - if (ioctl(s->fd, FW_SRSTREAM, &isoreq) < 0) { - perror("Unable to start IEEE-1394 capture device"); - close(s->fd); - free(s); - return NULL; - } - - return s; + return s; } -void -vidcap_dvbsd_done(void *state) +void vidcap_dvbsd_done(void *state) { - struct vidcap_dvbsd_state *s = (struct vidcap_dvbsd_state *) state; + struct vidcap_dvbsd_state *s = (struct vidcap_dvbsd_state *)state; - assert(s != NULL); - close(s->fd); - free(s); + assert(s != NULL); + close(s->fd); + free(s); } -struct video_frame * -vidcap_dvbsd_grab(void *state) +struct video_frame *vidcap_dvbsd_grab(void *state) { - struct vidcap_dvbsd_state *s = (struct vidcap_dvbsd_state *) state; + struct vidcap_dvbsd_state *s = (struct vidcap_dvbsd_state *)state; - assert(s != NULL); + assert(s != NULL); - return NULL; + return NULL; } -struct vidcap_type * -vidcap_dvbsd_probe(void) +struct vidcap_type *vidcap_dvbsd_probe(void) { - struct vidcap_type *vt; + struct vidcap_type *vt; - vt = (struct vidcap_type *) malloc(sizeof(struct vidcap_type)); + vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); if (vt != NULL) { - vt->id = VIDCAP_DVBSD_ID; - vt->name = "dv"; + vt->id = VIDCAP_DVBSD_ID; + vt->name = "dv"; vt->description = "IEEE-1394/DV"; - vt->width = 720; /* PAL frame size */ - vt->height = 576; + vt->width = 720; /* PAL frame size */ + vt->height = 576; vt->colour_mode = YUV_422; } return vt; } -#endif /* HAVE_FIREWIRE_DV_FREEBSD */ - +#endif /* HAVE_FIREWIRE_DV_FREEBSD */ diff --git a/ultragrid/src/video_capture/hdstation.c b/ultragrid/src/video_capture/hdstation.c index cf87db26c..938567882 100644 --- a/ultragrid/src/video_capture/hdstation.c +++ b/ultragrid/src/video_capture/hdstation.c @@ -57,281 +57,282 @@ #include "config_unix.h" #include "config_win32.h" -#ifdef HAVE_HDSTATION /* From config.h */ +#ifdef HAVE_HDSTATION /* From config.h */ #include "debug.h" #include "video_capture.h" #include "video_capture/hdstation.h" #include "video_codec.h" #include "tv.h" -#include "dvs_clib.h" /* From the DVS SDK */ -#include "dvs_fifo.h" /* From the DVS SDK */ +#include "dvs_clib.h" /* From the DVS SDK */ +#include "dvs_fifo.h" /* From the DVS SDK */ struct vidcap_hdstation_state { - sv_handle *sv; - sv_fifo *fifo; - sv_fifo_buffer *dma_buffer; - char *rtp_buffer; - char *tmp_buffer; - int buffer_size; - pthread_t thread_id; - pthread_mutex_t lock; - pthread_cond_t boss_cv; - pthread_cond_t worker_cv; - int boss_waiting; - int worker_waiting; - int work_to_do; - char *bufs[2]; - int bufs_index; - codec_t codec; - uint32_t hd_video_mode; - double bpp; + sv_handle *sv; + sv_fifo *fifo; + sv_fifo_buffer *dma_buffer; + char *rtp_buffer; + char *tmp_buffer; + int buffer_size; + pthread_t thread_id; + pthread_mutex_t lock; + pthread_cond_t boss_cv; + pthread_cond_t worker_cv; + int boss_waiting; + int worker_waiting; + int work_to_do; + char *bufs[2]; + int bufs_index; + codec_t codec; + uint32_t hd_video_mode; + double bpp; }; -static void * -vidcap_hdstation_grab_thread(void *arg) +static void *vidcap_hdstation_grab_thread(void *arg) { - int res; - struct vidcap_hdstation_state *s = (struct vidcap_hdstation_state *) arg; + int res; + struct vidcap_hdstation_state *s = (struct vidcap_hdstation_state *)arg; - while (1) { - s->dma_buffer = NULL; - res = sv_fifo_vsyncwait(s->sv, s->fifo); + while (1) { + s->dma_buffer = NULL; + res = sv_fifo_vsyncwait(s->sv, s->fifo); - res = sv_fifo_getbuffer(s->sv, s->fifo, &(s->dma_buffer), NULL, SV_FIFO_FLAG_VIDEOONLY|SV_FIFO_FLAG_FLUSH); - if (res != SV_OK) { - printf("Unable to getbuffer %s\n", sv_geterrortext(res)); - continue; - } - s->bufs_index = (s->bufs_index + 1) % 2; - s->dma_buffer->dma.addr = s->bufs[s->bufs_index]; - s->dma_buffer->dma.size = s->buffer_size; + res = + sv_fifo_getbuffer(s->sv, s->fifo, &(s->dma_buffer), NULL, + SV_FIFO_FLAG_VIDEOONLY | + SV_FIFO_FLAG_FLUSH); + if (res != SV_OK) { + printf("Unable to getbuffer %s\n", + sv_geterrortext(res)); + continue; + } + s->bufs_index = (s->bufs_index + 1) % 2; + s->dma_buffer->dma.addr = s->bufs[s->bufs_index]; + s->dma_buffer->dma.size = s->buffer_size; - res = sv_fifo_putbuffer(s->sv, s->fifo, s->dma_buffer, NULL); - if (res != SV_OK) { - printf("Unable to putbuffer %s\n", sv_geterrortext(res)); - } + res = sv_fifo_putbuffer(s->sv, s->fifo, s->dma_buffer, NULL); + if (res != SV_OK) { + printf("Unable to putbuffer %s\n", + sv_geterrortext(res)); + } - pthread_mutex_lock(&(s->lock)); + pthread_mutex_lock(&(s->lock)); - while (s->work_to_do == FALSE) { - s->worker_waiting = TRUE; - pthread_cond_wait(&(s->worker_cv), &(s->lock)); - s->worker_waiting = FALSE; - } + while (s->work_to_do == FALSE) { + s->worker_waiting = TRUE; + pthread_cond_wait(&(s->worker_cv), &(s->lock)); + s->worker_waiting = FALSE; + } - s->tmp_buffer = s->dma_buffer->dma.addr; - s->work_to_do = FALSE; + s->tmp_buffer = s->dma_buffer->dma.addr; + s->work_to_do = FALSE; - if (s->boss_waiting) { - pthread_cond_signal(&(s->boss_cv)); - } - pthread_mutex_unlock(&(s->lock)); - } - return NULL; + if (s->boss_waiting) { + pthread_cond_signal(&(s->boss_cv)); + } + pthread_mutex_unlock(&(s->lock)); + } + return NULL; } /* External API ***********************************************************************************/ -struct vidcap_type * -vidcap_hdstation_probe(void) +struct vidcap_type *vidcap_hdstation_probe(void) { - struct vidcap_type *vt; - sv_handle *sv; + struct vidcap_type *vt; + sv_handle *sv; - sv = sv_open(""); - if (sv == NULL) { - debug_msg("Cannot probe HDTV capture device\n"); - return NULL; - } - sv_close(sv); + sv = sv_open(""); + if (sv == NULL) { + debug_msg("Cannot probe HDTV capture device\n"); + return NULL; + } + sv_close(sv); - hd_size_x = 1920; - hd_size_y = 1080; + hd_size_x = 1920; + hd_size_y = 1080; - vt = (struct vidcap_type *) malloc(sizeof(struct vidcap_type)); - if (vt != NULL) { - vt->id = VIDCAP_HDSTATION_ID; - vt->name = "hdtv"; - vt->description = "DVS HDstation (SMPTE 274M/25i)"; - vt->width = hd_size_x; - vt->height = hd_size_y; - } - return vt; + vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); + if (vt != NULL) { + vt->id = VIDCAP_HDSTATION_ID; + vt->name = "hdtv"; + vt->description = "DVS HDstation (SMPTE 274M/25i)"; + vt->width = hd_size_x; + vt->height = hd_size_y; + } + return vt; } -void * -vidcap_hdstation_init(char *fmt) +void *vidcap_hdstation_init(char *fmt) { - int fps = 29; - struct vidcap_hdstation_state *s; - int i; - int res; + int fps = 29; + struct vidcap_hdstation_state *s; + int i; + int res; + if (fmt != NULL) { + if (strcmp(fmt, "help") == 0) { + printf("hdstation options:\n"); + printf("\tfps:codec\n"); - if (fmt != NULL) { - if (strcmp(fmt, "help") == 0) { - printf("hdstation options:\n"); - printf("\tfps:codec\n"); + return 0; + } - return 0; - } + char *tmp; - char *tmp; - - tmp = strtok(fmt, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - fps = atoi(tmp); - tmp = strtok(NULL, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - s->codec = 0xffffffff; - for(i = 0; codec_info[i].name != NULL; i++) { - if(strcmp(tmp, codec_info[i].name) == 0) { - s->codec = codec_info[i].codec; - s->bpp = codec_info[i].bpp; + tmp = strtok(fmt, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + fps = atoi(tmp); + tmp = strtok(NULL, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + s->codec = 0xffffffff; + for (i = 0; codec_info[i].name != NULL; i++) { + if (strcmp(tmp, codec_info[i].name) == 0) { + s->codec = codec_info[i].codec; + s->bpp = codec_info[i].bpp; + } + } + if (s->codec == 0xffffffff) { + fprintf(stderr, "hdstation: unknown codec: %s\n", tmp); + free(tmp); + return 0; } } - if(s->codec == 0xffffffff) { - fprintf(stderr, "hdstation: unknown codec: %s\n", tmp); - free(tmp); - return 0; + + s->hd_video_mode = SV_MODE_COLOR_YUV422 | SV_MODE_ACTIVE_STREAMER; + + if (s->codec == DVS10) { + s->hd_video_mode |= SV_MODE_NBIT_10BDVS; } - } - - s->hd_video_mode=SV_MODE_COLOR_YUV422 | SV_MODE_ACTIVE_STREAMER; - if (s->codec == DVS10) { - s->hd_video_mode |= SV_MODE_NBIT_10BDVS; - } + if (fps == 25) { + s->hd_video_mode |= SV_MODE_SMPTE274_25P; + } else if (fps == 29) { + s->hd_video_mode |= SV_MODE_SMPTE274_29I; + } else { + fprintf(stderr, "Wrong framerate in config %s\n", fmt); + return 0; + } - if (fps == 25) { - s->hd_video_mode |= SV_MODE_SMPTE274_25P; - } - else if (fps == 29) { - s->hd_video_mode |= SV_MODE_SMPTE274_29I; - } - else { - fprintf(stderr, "Wrong framerate in config %s\n", fmt); - return 0; - } + hd_size_x = 1920; + hd_size_y = 1080; + hd_color_spc = s->codec; - hd_size_x = 1920; - hd_size_y = 1080; - hd_color_spc = s->codec; + s = (struct vidcap_hdstation_state *) + malloc(sizeof(struct vidcap_hdstation_state)); + if (s == NULL) { + debug_msg("Unable to allocate HDstation state\n"); + return NULL; + } - s = (struct vidcap_hdstation_state *) malloc(sizeof(struct vidcap_hdstation_state)); - if (s == NULL) { - debug_msg("Unable to allocate HDstation state\n"); - return NULL; - } + s->sv = sv_open(""); + if (s->sv == NULL) { + printf + ("Unable to open grabber: sv_open() failed (no card present or driver not loaded?)\n"); + free(s); + return NULL; + } - s->sv = sv_open(""); - if (s->sv == NULL) { - printf("Unable to open grabber: sv_open() failed (no card present or driver not loaded?)\n"); - free(s); - return NULL; - } + res = sv_videomode(s->sv, s->hd_video_mode | SV_MODE_AUDIO_NOAUDIO); + if (res != SV_OK) { + goto error; + } + res = sv_black(s->sv); + if (res != SV_OK) { + goto error; + } + res = sv_fifo_init(s->sv, &(s->fifo), 1, 1, 1, 0, 0); + if (res != SV_OK) { + goto error; + } + res = sv_fifo_start(s->sv, s->fifo); + if (res != SV_OK) { + goto error; + } - res = sv_videomode(s->sv, s->hd_video_mode | SV_MODE_AUDIO_NOAUDIO); - if (res != SV_OK) { - goto error; - } - res = sv_black(s->sv); - if (res != SV_OK) { - goto error; - } - res = sv_fifo_init(s->sv, &(s->fifo), 1, 1, 1, 0, 0); - if (res != SV_OK) { - goto error; - } - res = sv_fifo_start(s->sv, s->fifo); - if (res != SV_OK) { - goto error; - } + pthread_mutex_init(&(s->lock), NULL); + pthread_cond_init(&(s->boss_cv), NULL); + pthread_cond_init(&(s->worker_cv), NULL); - pthread_mutex_init(&(s->lock), NULL); - pthread_cond_init(&(s->boss_cv), NULL); - pthread_cond_init(&(s->worker_cv), NULL); + s->buffer_size = s->bpp * hd_size_x * hd_size_y; + s->rtp_buffer = NULL; + s->dma_buffer = NULL; + s->tmp_buffer = NULL; + s->boss_waiting = FALSE; + s->worker_waiting = FALSE; + s->work_to_do = FALSE; + s->bufs[0] = malloc(s->buffer_size); + s->bufs[1] = malloc(s->buffer_size); + s->bufs_index = 0; - s->buffer_size = s->bpp * hd_size_x * hd_size_y; - s->rtp_buffer = NULL; - s->dma_buffer = NULL; - s->tmp_buffer = NULL; - s->boss_waiting = FALSE; - s->worker_waiting = FALSE; - s->work_to_do = FALSE; - s->bufs[0] = malloc(s->buffer_size); - s->bufs[1] = malloc(s->buffer_size); - s->bufs_index = 0; + if (pthread_create + (&(s->thread_id), NULL, vidcap_hdstation_grab_thread, s) != 0) { + perror("Unable to create grabbing thread"); + return NULL; + } - if (pthread_create(&(s->thread_id), NULL, vidcap_hdstation_grab_thread, s) != 0) { - perror("Unable to create grabbing thread"); - return NULL; - } - - debug_msg("HDstation capture device enabled\n"); - return s; -error: - free(s); - printf("Chyba %s\n",sv_geterrortext(res)); - debug_msg("Unable to open grabber: %s\n", sv_geterrortext(res)); - return NULL; + debug_msg("HDstation capture device enabled\n"); + return s; + error: + free(s); + printf("Chyba %s\n", sv_geterrortext(res)); + debug_msg("Unable to open grabber: %s\n", sv_geterrortext(res)); + return NULL; } -void -vidcap_hdstation_done(void *state) +void vidcap_hdstation_done(void *state) { - struct vidcap_hdstation_state *s = (struct vidcap_hdstation_state *) state; + struct vidcap_hdstation_state *s = + (struct vidcap_hdstation_state *)state; - sv_fifo_free(s->sv, s->fifo); - sv_close(s->sv); - free(s); + sv_fifo_free(s->sv, s->fifo); + sv_close(s->sv); + free(s); } -struct video_frame * -vidcap_hdstation_grab(void *state) +struct video_frame *vidcap_hdstation_grab(void *state) { - struct vidcap_hdstation_state *s = (struct vidcap_hdstation_state *) state; - struct video_frame *vf; + struct vidcap_hdstation_state *s = + (struct vidcap_hdstation_state *)state; + struct video_frame *vf; - pthread_mutex_lock(&(s->lock)); + pthread_mutex_lock(&(s->lock)); - /* Wait for the worker to finish... */ - while (s->work_to_do) { - s->boss_waiting = TRUE; - pthread_cond_wait(&(s->boss_cv), &(s->lock)); - s->boss_waiting = FALSE; - } + /* Wait for the worker to finish... */ + while (s->work_to_do) { + s->boss_waiting = TRUE; + pthread_cond_wait(&(s->boss_cv), &(s->lock)); + s->boss_waiting = FALSE; + } - /* ...and give it more to do... */ - s->rtp_buffer = s->tmp_buffer; - s->work_to_do = TRUE; + /* ...and give it more to do... */ + s->rtp_buffer = s->tmp_buffer; + s->work_to_do = TRUE; - /* ...and signal the worker... */ - if (s->worker_waiting) { - pthread_cond_signal(&(s->worker_cv)); - } + /* ...and signal the worker... */ + if (s->worker_waiting) { + pthread_cond_signal(&(s->worker_cv)); + } - pthread_mutex_unlock(&(s->lock)); + pthread_mutex_unlock(&(s->lock)); - if (s->rtp_buffer != NULL) { - vf = (struct video_frame *) malloc(sizeof(struct video_frame)); - if (vf != NULL) { - vf->width = hd_size_x; - vf->height = hd_size_y; - vf->data = s->rtp_buffer; - vf->data_len = hd_size_x * hd_size_y * s->bpp; - } - return vf; - } - return NULL; + if (s->rtp_buffer != NULL) { + vf = (struct video_frame *)malloc(sizeof(struct video_frame)); + if (vf != NULL) { + vf->width = hd_size_x; + vf->height = hd_size_y; + vf->data = s->rtp_buffer; + vf->data_len = hd_size_x * hd_size_y * s->bpp; + } + return vf; + } + return NULL; } -#endif /* HAVE_HDSTATION */ - +#endif /* HAVE_HDSTATION */ diff --git a/ultragrid/src/video_capture/make_testcard.c b/ultragrid/src/video_capture/make_testcard.c index cc9f030e6..d53f7c5fc 100644 --- a/ultragrid/src/video_capture/make_testcard.c +++ b/ultragrid/src/video_capture/make_testcard.c @@ -2,28 +2,28 @@ int main(int argc, char *argv[]) { - FILE *inf, *outf; - int c, i=0; + FILE *inf, *outf; + int c, i = 0; - if (argc != 3) { - printf("Usage: make_testcard \n"); - return 1; - } + if (argc != 3) { + printf("Usage: make_testcard \n"); + return 1; + } - outf = fopen(argv[2], "w"); - fprintf(outf, "/* Automatically generated: DO NOT EDIT! */\n"); - fprintf(outf, "unsigned char testcard_image[] = \""); + outf = fopen(argv[2], "w"); + fprintf(outf, "/* Automatically generated: DO NOT EDIT! */\n"); + fprintf(outf, "unsigned char testcard_image[] = \""); - inf = fopen(argv[1], "r"); - while (!feof(inf)) { - c = fgetc(inf); - if (c != EOF) fprintf(outf, "\\x%02x", c); - } - fclose(inf); + inf = fopen(argv[1], "r"); + while (!feof(inf)) { + c = fgetc(inf); + if (c != EOF) + fprintf(outf, "\\x%02x", c); + } + fclose(inf); - fprintf(outf, "\";\n"); - fclose(outf); + fprintf(outf, "\";\n"); + fclose(outf); - return 0; + return 0; } - diff --git a/ultragrid/src/video_capture/null.c b/ultragrid/src/video_capture/null.c index 8aaea462a..3d0bb0171 100644 --- a/ultragrid/src/video_capture/null.c +++ b/ultragrid/src/video_capture/null.c @@ -56,42 +56,37 @@ #include "video_capture.h" #include "video_capture/null.h" -static int capture_state = 0; +static int capture_state = 0; -void * -vidcap_null_init(char *fmt) +void *vidcap_null_init(char *fmt) { - UNUSED(fmt); - capture_state = 0; - return &capture_state; + UNUSED(fmt); + capture_state = 0; + return &capture_state; } -void -vidcap_null_done(void *state) +void vidcap_null_done(void *state) { - assert(state == &capture_state); + assert(state == &capture_state); } -struct video_frame * -vidcap_null_grab(void *state) +struct video_frame *vidcap_null_grab(void *state) { - assert(state == &capture_state); - return NULL; + assert(state == &capture_state); + return NULL; } -struct vidcap_type * -vidcap_null_probe(void) +struct vidcap_type *vidcap_null_probe(void) { - struct vidcap_type *vt; + struct vidcap_type *vt; - vt = (struct vidcap_type *) malloc(sizeof(struct vidcap_type)); - if (vt != NULL) { - vt->id = VIDCAP_NULL_ID; - vt->name = "null"; - vt->description = "No video capture device"; - vt->width = 0; - vt->height = 0; - } - return vt; + vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); + if (vt != NULL) { + vt->id = VIDCAP_NULL_ID; + vt->name = "null"; + vt->description = "No video capture device"; + vt->width = 0; + vt->height = 0; + } + return vt; } - diff --git a/ultragrid/src/video_capture/quad.c b/ultragrid/src/video_capture/quad.c index 31812fcc0..43e809614 100644 --- a/ultragrid/src/video_capture/quad.c +++ b/ultragrid/src/video_capture/quad.c @@ -50,7 +50,7 @@ #include "config_win32.h" #ifndef HAVE_MACOSX -#ifdef HAVE_QUAD /* From config.h */ +#ifdef HAVE_QUAD /* From config.h */ #include "debug.h" #include "video_types.h" @@ -74,10 +74,10 @@ #define BUFLEN 256 -extern int should_exit; +extern int should_exit; -const char device[] = "/dev/sdirx0"; -const char fmt[] = "/sys/class/sdi/sdirx%i/%s"; +const char device[] = "/dev/sdirx0"; +const char fmt[] = "/sys/class/sdi/sdirx%i/%s"; int fd; ssize_t ret, read_ret, bytes; @@ -88,295 +88,287 @@ unsigned int frames, last_frames, timestamp, last_timestamp; unsigned int val; struct vidcap_quad_state { - char name[BUFLEN]; - unsigned char* data; - unsigned long int bufsize; + char name[BUFLEN]; + unsigned char *data; + unsigned long int bufsize; }; -struct vidcap_type * -vidcap_quad_probe(void) +struct vidcap_type *vidcap_quad_probe(void) { - printf("vidcap_quad_probe\n"); + printf("vidcap_quad_probe\n"); - struct vidcap_type* vt; + struct vidcap_type *vt; - /* CHECK IF QUAD CAN WARK CORRECTLY */ + /* CHECK IF QUAD CAN WARK CORRECTLY */ - + /* END OF CHECK IF QUAD CAN WARK CORRECTLY */ - /* END OF CHECK IF QUAD CAN WARK CORRECTLY */ - - vt = (struct vidcap_type *) malloc(sizeof(struct vidcap_type)); - if (vt != NULL) { - vt->id = VIDCAP_QUAD_ID; - vt->name = "quad"; - vt->description = "HD-SDI Maste Quad/i PCIe card"; - vt->width = hd_size_x; - vt->height = hd_size_y; - vt->colour_mode = YUV_422; - } - return vt; + vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); + if (vt != NULL) { + vt->id = VIDCAP_QUAD_ID; + vt->name = "quad"; + vt->description = "HD-SDI Maste Quad/i PCIe card"; + vt->width = hd_size_x; + vt->height = hd_size_y; + vt->colour_mode = YUV_422; + } + return vt; } -void * -vidcap_quad_init(int fps) +void *vidcap_quad_init(int fps) { - printf("vidcap_quad_init\n"); + printf("vidcap_quad_init\n"); - struct vidcap_quad_state *s; + struct vidcap_quad_state *s; - struct stat buf; - int num; - char str[BUFLEN], *endptr; + struct stat buf; + int num; + char str[BUFLEN], *endptr; - s = (struct vidcap_quad_state *) malloc(sizeof(struct vidcap_quad_state)); - if(s == NULL) { - printf("Unable to allocate Quad state\n"); - return NULL; - } + s = (struct vidcap_quad_state *) + malloc(sizeof(struct vidcap_quad_state)); + if (s == NULL) { + printf("Unable to allocate Quad state\n"); + return NULL; + } - /* Get the sysfs info */ - memset (&buf, 0, sizeof (buf)); - if(stat (device, &buf) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get the file status"); - goto NO_STAT; - } - if(!S_ISCHR (buf.st_mode)) { - fprintf (stderr, "%s: not a character device\n", device); - goto NO_STAT; - } - if(!(buf.st_rdev & 0x0080)) { - fprintf (stderr, "%s: not a receiver\n", device); - goto NO_STAT; - } + /* Get the sysfs info */ + memset(&buf, 0, sizeof(buf)); + if (stat(device, &buf) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get the file status"); + goto NO_STAT; + } + if (!S_ISCHR(buf.st_mode)) { + fprintf(stderr, "%s: not a character device\n", device); + goto NO_STAT; + } + if (!(buf.st_rdev & 0x0080)) { + fprintf(stderr, "%s: not a receiver\n", device); + goto NO_STAT; + } - num = buf.st_rdev & 0x007f; - snprintf (s->name, sizeof (s->name), fmt, num, "dev"); + num = buf.st_rdev & 0x007f; + snprintf(s->name, sizeof(s->name), fmt, num, "dev"); - memset (str, 0, sizeof (str)); - if(util_read (s->name, str, sizeof (str)) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get the device number"); - goto NO_STAT; - } - if(strtoul (str, &endptr, 0) != (buf.st_rdev >> 8)) { - fprintf (stderr, "%s: not a SMPTE 259M-C device\n", device); - goto NO_STAT; - } - if(*endptr != ':') { - fprintf (stderr, "%s: error reading %s\n", device, s->name); - goto NO_STAT; - } + memset(str, 0, sizeof(str)); + if (util_read(s->name, str, sizeof(str)) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get the device number"); + goto NO_STAT; + } + if (strtoul(str, &endptr, 0) != (buf.st_rdev >> 8)) { + fprintf(stderr, "%s: not a SMPTE 259M-C device\n", device); + goto NO_STAT; + } + if (*endptr != ':') { + fprintf(stderr, "%s: error reading %s\n", device, s->name); + goto NO_STAT; + } - /* Open the file */ - if((fd = open (device, O_RDONLY)) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to open file for reading"); - goto NO_STAT; - } + /* Open the file */ + if ((fd = open(device, O_RDONLY)) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to open file for reading"); + goto NO_STAT; + } - /* Get the buffer size */ - snprintf (s->name, sizeof (s->name), fmt, num, "bufsize"); - if(util_strtoul (s->name, &(s->bufsize)) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get the receiver buffer size"); - goto NO_BUFS; - } + /* Get the buffer size */ + snprintf(s->name, sizeof(s->name), fmt, num, "bufsize"); + if (util_strtoul(s->name, &(s->bufsize)) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get the receiver buffer size"); + goto NO_BUFS; + } - /* Allocate some memory */ - if((s->data = (unsigned char *)malloc (s->bufsize)) == NULL) { - fprintf (stderr, "%s: ", device); - fprintf (stderr, "unable to allocate memory\n"); - goto NO_BUFS; - } + /* Allocate some memory */ + if ((s->data = (unsigned char *)malloc(s->bufsize)) == NULL) { + fprintf(stderr, "%s: ", device); + fprintf(stderr, "unable to allocate memory\n"); + goto NO_BUFS; + } - /* SET SOME VARIABLES*/ - pfd.fd = fd; - pfd.events = POLLIN | POLLPRI; - last_frames = 0; - last_timestamp = 0; + /* SET SOME VARIABLES */ + pfd.fd = fd; + pfd.events = POLLIN | POLLPRI; + last_frames = 0; + last_timestamp = 0; - s->data = NULL; + s->data = NULL; - if(gettimeofday (&tv, NULL) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get time"); - return NULL; - } - lasttime = tv.tv_sec + (double)tv.tv_usec / 1000000; + if (gettimeofday(&tv, NULL) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get time"); + return NULL; + } + lasttime = tv.tv_sec + (double)tv.tv_usec / 1000000; - return s; + return s; -NO_STAT: - return NULL; -NO_BUFS: - close(fd); - return NULL; + NO_STAT: + return NULL; + NO_BUFS: + close(fd); + return NULL; } -void -vidcap_quad_done(void *state) +void vidcap_quad_done(void *state) { - struct vidcap_quad_state *s = (struct vidcap_quad_state *) state; + struct vidcap_quad_state *s = (struct vidcap_quad_state *)state; - assert(s != NULL); + assert(s != NULL); - if(s!= NULL) { - free(s->data); - close(fd); - } + if (s != NULL) { + free(s->data); + close(fd); + } } -struct video_frame * -vidcap_quad_grab(void *state) +struct video_frame *vidcap_quad_grab(void *state) { - printf("vidcap_quad_grab\n"); + printf("vidcap_quad_grab\n"); - struct vidcap_quad_state *s = (struct vidcap_quad_state *) state; - struct video_frame *vf; + struct vidcap_quad_state *s = (struct vidcap_quad_state *)state; + struct video_frame *vf; - /* Receive the data and check for errors */ - - if(poll (&pfd, 1, 1000) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to poll device file"); - goto NO_RUN; - } + /* Receive the data and check for errors */ - if(pfd.revents & POLLIN) { - if ((read_ret = read (fd, s->data, s->bufsize)) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to read from device file"); - goto NO_RUN; - } - bytes = 0; + if (poll(&pfd, 1, 1000) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to poll device file"); + goto NO_RUN; + } - /* I DON'T NEED TO WRITE DATA SOMEWHERE, I WILL RETURN THEM THROUGH THIS FUNCTION*/ - /* - while (bytes < read_ret) { - if ((ret = write (STDOUT_FILENO, s->data + bytes, read_ret - bytes)) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to write to output"); - goto NO_RUN; - } - bytes += ret; - } - */ - } + if (pfd.revents & POLLIN) { + if ((read_ret = read(fd, s->data, s->bufsize)) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to read from device file"); + goto NO_RUN; + } + bytes = 0; - if(pfd.revents & POLLPRI) { - if (ioctl (fd, SDI_IOC_RXGETEVENTS, &val) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get receiver event flags"); - goto NO_RUN; - } - if (val & SDI_EVENT_RX_BUFFER) { - fprinttime (stderr, ""); - fprintf (stderr, - "driver receive buffer queue " - "overrun detected\n"); - } - if (val & SDI_EVENT_RX_FIFO) { - fprinttime (stderr, ""); - fprintf (stderr, - "onboard receive FIFO " - "overrun detected\n"); - } - if (val & SDI_EVENT_RX_CARRIER) { - fprinttime (stderr, ""); - fprintf (stderr, - "carrier status " - "change detected\n"); - } - } + /* I DON'T NEED TO WRITE DATA SOMEWHERE, I WILL RETURN THEM THROUGH THIS FUNCTION */ + /* + while (bytes < read_ret) { + if ((ret = write (STDOUT_FILENO, s->data + bytes, read_ret - bytes)) < 0) { + fprintf (stderr, "%s: ", device); + perror ("unable to write to output"); + goto NO_RUN; + } + bytes += ret; + } + */ + } - gettimeofday (&tv, NULL); - time_sec = tv.tv_sec + (double)tv.tv_usec / 1000000; - dt = time_sec - lasttime; - - /* Only for HD-SDI, display timestamp and counter */ + if (pfd.revents & POLLPRI) { + if (ioctl(fd, SDI_IOC_RXGETEVENTS, &val) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get receiver event flags"); + goto NO_RUN; + } + if (val & SDI_EVENT_RX_BUFFER) { + fprinttime(stderr, ""); + fprintf(stderr, + "driver receive buffer queue " + "overrun detected\n"); + } + if (val & SDI_EVENT_RX_FIFO) { + fprinttime(stderr, ""); + fprintf(stderr, + "onboard receive FIFO " "overrun detected\n"); + } + if (val & SDI_EVENT_RX_CARRIER) { + fprinttime(stderr, ""); + fprintf(stderr, "carrier status " "change detected\n"); + } + } - if(dt >= 5) { - if(ioctl (fd, SDI_IOC_RXGET27COUNT, &frames) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get " - "the counter"); - free (s->data); - close (fd); - return NULL; - } + gettimeofday(&tv, NULL); + time_sec = tv.tv_sec + (double)tv.tv_usec / 1000000; + dt = time_sec - lasttime; - if(ioctl (fd, SDI_IOC_RXGETTIMESTAMP, ×tamp) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get " - "the timestamp"); - free (s->data); - close (fd); - return NULL; - } + /* Only for HD-SDI, display timestamp and counter */ - float fps = (frames - last_frames) / (timestamp - last_timestamp); - fprintf(stderr, "%d frames in %g seconds = %g FPS\n", (frames - last_frames), (timestamp - last_timestamp), fps); + if (dt >= 5) { + if (ioctl(fd, SDI_IOC_RXGET27COUNT, &frames) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get " "the counter"); + free(s->data); + close(fd); + return NULL; + } - last_frames = frames; - last_timestamp = timestamp; + if (ioctl(fd, SDI_IOC_RXGETTIMESTAMP, ×tamp) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get " "the timestamp"); + free(s->data); + close(fd); + return NULL; + } - if(ioctl(fd, SDI_IOC_RXGETCARRIER, &val) < 0){ - fprintf (stderr, "%s: ", device); - perror ("unable to get the carrier status"); - }else if (val) { - fprintf (stderr, "Carrier detected, "); - }else { - fprintf (stderr, "No carrier, "); - } + float fps = + (frames - last_frames) / (timestamp - last_timestamp); + fprintf(stderr, "%d frames in %g seconds = %g FPS\n", + (frames - last_frames), (timestamp - last_timestamp), + fps); - if(ioctl (fd, SDI_IOC_RXGETSTATUS, &val) < 0) { - fprintf (stderr, "%s: ", device); - perror ("unable to get the receiver status"); - }else { - fprintf (stderr, "Receiver is "); - if (val) { - //printf ("passing data.\n"); - fprintf (stderr, "passing data\n"); - }else { - //printf ("blocking data.\n"); - fprintf (stderr, "blocking data\n"); - } - } - - lasttime = time_sec; - } + last_frames = frames; + last_timestamp = timestamp; - if(s->data != NULL) { - vf = (struct video_frame *) malloc(sizeof(struct video_frame)); - if (vf != NULL) { - vf->colour_mode = YUV_422; - vf->width = hd_size_x; - vf->height = hd_size_y; - vf->data = (char*) s->data; - vf->data_len = s->bufsize; - //vf->data_len = hd_size_x * hd_size_y * hd_color_bpp; - } + if (ioctl(fd, SDI_IOC_RXGETCARRIER, &val) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get the carrier status"); + } else if (val) { + fprintf(stderr, "Carrier detected, "); + } else { + fprintf(stderr, "No carrier, "); + } - // testing write of frames into the files - /* - char gn[128]; - memset(gn, 0, 128); - sprintf(gn, "_frames/frame%04d.yuv", s->delegate->get_framecount()); - FILE *g=fopen(gn, "w+"); - fwrite(vf->data, 1, vf->data_len, g); - fclose(g); - */ + if (ioctl(fd, SDI_IOC_RXGETSTATUS, &val) < 0) { + fprintf(stderr, "%s: ", device); + perror("unable to get the receiver status"); + } else { + fprintf(stderr, "Receiver is "); + if (val) { + //printf ("passing data.\n"); + fprintf(stderr, "passing data\n"); + } else { + //printf ("blocking data.\n"); + fprintf(stderr, "blocking data\n"); + } + } - return vf; - } + lasttime = time_sec; + } - return NULL; + if (s->data != NULL) { + vf = (struct video_frame *)malloc(sizeof(struct video_frame)); + if (vf != NULL) { + vf->colour_mode = YUV_422; + vf->width = hd_size_x; + vf->height = hd_size_y; + vf->data = (char *)s->data; + vf->data_len = s->bufsize; + //vf->data_len = hd_size_x * hd_size_y * hd_color_bpp; + } + // testing write of frames into the files + /* + char gn[128]; + memset(gn, 0, 128); + sprintf(gn, "_frames/frame%04d.yuv", s->delegate->get_framecount()); + FILE *g=fopen(gn, "w+"); + fwrite(vf->data, 1, vf->data_len, g); + fclose(g); + */ -NO_RUN: - return NULL; + return vf; + } + + return NULL; + + NO_RUN: + return NULL; } -#endif /* HAVE_QUAD */ -#endif /* HAVE_MACOSX */ +#endif /* HAVE_QUAD */ +#endif /* HAVE_MACOSX */ diff --git a/ultragrid/src/video_capture/quicktime.c b/ultragrid/src/video_capture/quicktime.c index 2245ffec0..281c82c0d 100644 --- a/ultragrid/src/video_capture/quicktime.c +++ b/ultragrid/src/video_capture/quicktime.c @@ -71,20 +71,20 @@ #define MAGIC_QT_GRABBER VIDCAP_QUICKTIME_ID struct qt_grabber_state { - uint32_t magic; - SeqGrabComponent grabber; - SGChannel video_channel; - Rect bounds; - GWorldPtr gworld; - ImageSequence seqID; - int sg_idle_enough; - int major; - int minor; - int width; - int height; - int codec; - struct codec_info_t *c_info; - unsigned gui:1; + uint32_t magic; + SeqGrabComponent grabber; + SGChannel video_channel; + Rect bounds; + GWorldPtr gworld; + ImageSequence seqID; + int sg_idle_enough; + int major; + int minor; + int width; + int height; + int codec; + struct codec_info_t *c_info; + unsigned gui:1; }; int frames = 0; @@ -121,420 +121,418 @@ struct timeval t, t0; static pascal OSErr qt_data_proc(SGChannel c, Ptr p, long len, long *offset, long chRefCon, - TimeValue time, short writeType, long refCon) + TimeValue time, short writeType, long refCon) { - struct qt_grabber_state *s = (struct qt_grabber_state *)refCon; + struct qt_grabber_state *s = (struct qt_grabber_state *)refCon; - UNUSED(c); - UNUSED(offset); - UNUSED(chRefCon); - UNUSED(time); - UNUSED(writeType); + UNUSED(c); + UNUSED(offset); + UNUSED(chRefCon); + UNUSED(time); + UNUSED(writeType); - if (s == NULL) { - debug_msg("corrupt state\n"); - return -1; - } + if (s == NULL) { + debug_msg("corrupt state\n"); + return -1; + } - memcpy(GetPixBaseAddr(GetGWorldPixMap(s->gworld)), p, len); - s->sg_idle_enough = 1; + memcpy(GetPixBaseAddr(GetGWorldPixMap(s->gworld)), p, len); + s->sg_idle_enough = 1; - frames++; - gettimeofday(&t, NULL); - double seconds = tv_diff(t, t0); - if (seconds >= 5) { - float fps = frames / seconds; - fprintf(stderr, "%d frames in %g seconds = %g FPS\n", frames, - seconds, fps); - t0 = t; - frames = 0; - } + frames++; + gettimeofday(&t, NULL); + double seconds = tv_diff(t, t0); + if (seconds >= 5) { + float fps = frames / seconds; + fprintf(stderr, "%d frames in %g seconds = %g FPS\n", frames, + seconds, fps); + t0 = t; + frames = 0; + } - return 0; + return 0; } static Boolean SeqGrabberModalFilterProc(DialogPtr theDialog, const EventRecord * theEvent, - short *itemHit, long refCon) + short *itemHit, long refCon) { - UNUSED(theDialog); - UNUSED(itemHit); + UNUSED(theDialog); + UNUSED(itemHit); - // Ordinarily, if we had multiple windows we cared about, we'd handle - // updating them in here, but since we don't, we'll just clear out - // any update events meant for us + // Ordinarily, if we had multiple windows we cared about, we'd handle + // updating them in here, but since we don't, we'll just clear out + // any update events meant for us - Boolean handled = false; + Boolean handled = false; - if ((theEvent->what == updateEvt) && - ((WindowPtr) theEvent->message == (WindowPtr) refCon)) { - BeginUpdate((WindowPtr) refCon); - EndUpdate((WindowPtr) refCon); - handled = true; - } - return (handled); + if ((theEvent->what == updateEvt) && + ((WindowPtr) theEvent->message == (WindowPtr) refCon)) { + BeginUpdate((WindowPtr) refCon); + EndUpdate((WindowPtr) refCon); + handled = true; + } + return (handled); } // SGSettingsDialog with the "Compression" panel removed -static OSErr MinimalSGSettingsDialog(SeqGrabComponent seqGrab, SGChannel sgchanVideo, - WindowPtr gMonitor) +static OSErr MinimalSGSettingsDialog(SeqGrabComponent seqGrab, + SGChannel sgchanVideo, WindowPtr gMonitor) { - OSErr err; - Component *panelListPtr = NULL; - UInt8 numberOfPanels = 0; + OSErr err; + Component *panelListPtr = NULL; + UInt8 numberOfPanels = 0; - ComponentDescription cd = { SeqGrabPanelType, VideoMediaType, 0, 0, 0 }; - Component c = 0; - Component *cPtr = NULL; + ComponentDescription cd = { SeqGrabPanelType, VideoMediaType, 0, 0, 0 }; + Component c = 0; + Component *cPtr = NULL; - numberOfPanels = CountComponents(&cd); - panelListPtr = - (Component *) NewPtr(sizeof(Component) * (numberOfPanels + 1)); + numberOfPanels = CountComponents(&cd); + panelListPtr = + (Component *) NewPtr(sizeof(Component) * (numberOfPanels + 1)); - cPtr = panelListPtr; - numberOfPanels = 0; - CFStringRef compressionCFSTR = CFSTR("Compression"); - do { - ComponentDescription compInfo; - c = FindNextComponent(c, &cd); - if (c) { - Handle hName = NewHandle(0); - GetComponentInfo(c, &compInfo, hName, NULL, NULL); - CFStringRef nameCFSTR = - CFStringCreateWithPascalString(kCFAllocatorDefault, - (unsigned char - *)(*hName), - kCFStringEncodingASCII); - if (CFStringCompare - (nameCFSTR, compressionCFSTR, - kCFCompareCaseInsensitive) != kCFCompareEqualTo) { - *cPtr++ = c; - numberOfPanels++; - } - DisposeHandle(hName); - } - } while (c); + cPtr = panelListPtr; + numberOfPanels = 0; + CFStringRef compressionCFSTR = CFSTR("Compression"); + do { + ComponentDescription compInfo; + c = FindNextComponent(c, &cd); + if (c) { + Handle hName = NewHandle(0); + GetComponentInfo(c, &compInfo, hName, NULL, NULL); + CFStringRef nameCFSTR = + CFStringCreateWithPascalString(kCFAllocatorDefault, + (unsigned char + *)(*hName), + kCFStringEncodingASCII); + if (CFStringCompare + (nameCFSTR, compressionCFSTR, + kCFCompareCaseInsensitive) != kCFCompareEqualTo) { + *cPtr++ = c; + numberOfPanels++; + } + DisposeHandle(hName); + } + } while (c); - if ((err = - SGSettingsDialog(seqGrab, sgchanVideo, numberOfPanels, - panelListPtr, seqGrabSettingsPreviewOnly, - (SGModalFilterUPP) - NewSGModalFilterUPP(SeqGrabberModalFilterProc), - (long)gMonitor))) { - return err; - } + if ((err = + SGSettingsDialog(seqGrab, sgchanVideo, numberOfPanels, + panelListPtr, seqGrabSettingsPreviewOnly, + (SGModalFilterUPP) + NewSGModalFilterUPP(SeqGrabberModalFilterProc), + (long)gMonitor))) { + return err; + } } void nprintf(char *str) { - char tmp[((int)str[0]) + 1]; + char tmp[((int)str[0]) + 1]; - strncpy(tmp, &str[1], str[0]); - tmp[(int)str[0]] = 0; - fprintf(stdout, "%s", tmp); + strncpy(tmp, &str[1], str[0]); + tmp[(int)str[0]] = 0; + fprintf(stdout, "%s", tmp); } /* Initialize the QuickTime grabber */ static int qt_open_grabber(struct qt_grabber_state *s, char *fmt) { - GrafPtr savedPort; - WindowPtr gMonitor; - //SGModalFilterUPP seqGrabModalFilterUPP; + GrafPtr savedPort; + WindowPtr gMonitor; + //SGModalFilterUPP seqGrabModalFilterUPP; - assert(s != NULL); - assert(s->magic == MAGIC_QT_GRABBER); + assert(s != NULL); + assert(s->magic == MAGIC_QT_GRABBER); - /****************************************************************************************/ - /* Step 0: Initialise the QuickTime movie toolbox. */ - InitCursor(); - EnterMovies(); + /****************************************************************************************/ + /* Step 0: Initialise the QuickTime movie toolbox. */ + InitCursor(); + EnterMovies(); - /****************************************************************************************/ - /* Step 1: Create an off-screen graphics world object, into which we can capture video. */ - /* Lock it into position, to prevent QuickTime from messing with it while capturing. */ - OSType pixelFormat; - pixelFormat = FOUR_CHAR_CODE('BGRA'); - /****************************************************************************************/ - /* Step 2: Open and initialise the default sequence grabber. */ - s->grabber = OpenDefaultComponent(SeqGrabComponentType, 0); - if (s->grabber == 0) { - debug_msg("Unable to open grabber\n"); - return 0; - } + /****************************************************************************************/ + /* Step 1: Create an off-screen graphics world object, into which we can capture video. */ + /* Lock it into position, to prevent QuickTime from messing with it while capturing. */ + OSType pixelFormat; + pixelFormat = FOUR_CHAR_CODE('BGRA'); + /****************************************************************************************/ + /* Step 2: Open and initialise the default sequence grabber. */ + s->grabber = OpenDefaultComponent(SeqGrabComponentType, 0); + if (s->grabber == 0) { + debug_msg("Unable to open grabber\n"); + return 0; + } - gMonitor = GetDialogWindow(GetNewDialog(1000, NULL, (WindowPtr) - 1L)); + gMonitor = GetDialogWindow(GetNewDialog(1000, NULL, (WindowPtr) - 1L)); - GetPort(&savedPort); - SetPort(gMonitor); + GetPort(&savedPort); + SetPort(gMonitor); - if (SGInitialize(s->grabber) != noErr) { - debug_msg("Unable to init grabber\n"); - return 0; - } + if (SGInitialize(s->grabber) != noErr) { + debug_msg("Unable to init grabber\n"); + return 0; + } - SGSetGWorld(s->grabber, GetDialogPort(gMonitor), NULL); + SGSetGWorld(s->grabber, GetDialogPort(gMonitor), NULL); - /****************************************************************************************/ - /* Specify the destination data reference for a record operation tell it */ - /* we're not making a movie if the flag seqGrabDontMakeMovie is used, */ - /* the sequence grabber still calls your data function, but does not */ - /* write any data to the movie file writeType will always be set to */ - /* seqGrabWriteAppend */ - if (SGSetDataRef(s->grabber, 0, 0, seqGrabDontMakeMovie) != noErr) { - CloseComponent(s->grabber); - debug_msg("Unable to set data ref\n"); - return 0; - } + /****************************************************************************************/ + /* Specify the destination data reference for a record operation tell it */ + /* we're not making a movie if the flag seqGrabDontMakeMovie is used, */ + /* the sequence grabber still calls your data function, but does not */ + /* write any data to the movie file writeType will always be set to */ + /* seqGrabWriteAppend */ + if (SGSetDataRef(s->grabber, 0, 0, seqGrabDontMakeMovie) != noErr) { + CloseComponent(s->grabber); + debug_msg("Unable to set data ref\n"); + return 0; + } - if (SGSetGWorld(s->grabber, NULL, NULL) != noErr) { - debug_msg("Unable to get gworld from grabber\n"); - return 0; - } + if (SGSetGWorld(s->grabber, NULL, NULL) != noErr) { + debug_msg("Unable to get gworld from grabber\n"); + return 0; + } - if (SGNewChannel(s->grabber, VideoMediaType, &s->video_channel) != - noErr) { - debug_msg("Unable to open video channel\n"); - return 0; - } + if (SGNewChannel(s->grabber, VideoMediaType, &s->video_channel) != + noErr) { + debug_msg("Unable to open video channel\n"); + return 0; + } - /* Print available devices */ - int i; - int j; - SGDeviceInputList inputList; - SGDeviceList deviceList; - if (strcmp(fmt, "help") == 0) { - if (SGGetChannelDeviceList - (s->video_channel, sgDeviceListIncludeInputs, - &deviceList) == noErr) { - fprintf(stdout, "Available capture devices:\n"); - for (i = 0; i < (*deviceList)->count; i++) { - SGDeviceName *deviceEntry = - &(*deviceList)->entry[i]; - fprintf(stdout, " Device %d: ", i); - nprintf((char *)(deviceEntry->name)); - if (deviceEntry-> - flags & sgDeviceNameFlagDeviceUnavailable) { - fprintf(stdout, - " - ### NOT AVAILABLE ###"); - } - if (i == (*deviceList)->selectedIndex) { - fprintf(stdout, " - ### ACTIVE ###"); - } - fprintf(stdout, "\n"); - short activeInputIndex = 0; - inputList = deviceEntry->inputs; - if (inputList && (*inputList)->count >= 1) { - SGGetChannelDeviceAndInputNames(s-> - video_channel, - NULL, - NULL, - &activeInputIndex); - for (j = 0; j < (*inputList)->count; - j++) { - fprintf(stdout, "\t"); - fprintf(stdout, "- %d. ", j); - nprintf((char - *)((&(*inputList)-> - entry[j].name))); - if ((i == - (*deviceList)-> - selectedIndex) - && (j == activeInputIndex)) - fprintf(stdout, - " - ### ACTIVE ###"); - fprintf(stdout, "\n"); - } - } - } - SGDisposeDeviceList(s->grabber, deviceList); - CodecNameSpecListPtr list; - GetCodecNameList(&list, 1); - printf("Compression types:\n"); - for (i = 0; i < list->count; i++) { - int fcc = list->list[i].cType; - printf("\t%d) ", i); - nprintf((char *)list->list[i].typeName); - printf(" - FCC (%c%c%c%c)", - fcc >> 24, - (fcc >> 16) & 0xff, - (fcc >> 8) & 0xff, (fcc) & 0xff); - printf(" - codec id %x", - (unsigned int)(list->list[i].codec)); - printf(" - cType %x", - (unsigned int)list->list[i].cType); - printf("\n"); - } - } - return 0; - } + /* Print available devices */ + int i; + int j; + SGDeviceInputList inputList; + SGDeviceList deviceList; + if (strcmp(fmt, "help") == 0) { + if (SGGetChannelDeviceList + (s->video_channel, sgDeviceListIncludeInputs, + &deviceList) == noErr) { + fprintf(stdout, "Available capture devices:\n"); + for (i = 0; i < (*deviceList)->count; i++) { + SGDeviceName *deviceEntry = + &(*deviceList)->entry[i]; + fprintf(stdout, " Device %d: ", i); + nprintf((char *)(deviceEntry->name)); + if (deviceEntry->flags & + sgDeviceNameFlagDeviceUnavailable) { + fprintf(stdout, + " - ### NOT AVAILABLE ###"); + } + if (i == (*deviceList)->selectedIndex) { + fprintf(stdout, " - ### ACTIVE ###"); + } + fprintf(stdout, "\n"); + short activeInputIndex = 0; + inputList = deviceEntry->inputs; + if (inputList && (*inputList)->count >= 1) { + SGGetChannelDeviceAndInputNames + (s->video_channel, NULL, NULL, + &activeInputIndex); + for (j = 0; j < (*inputList)->count; + j++) { + fprintf(stdout, "\t"); + fprintf(stdout, "- %d. ", j); + nprintf((char + *)((& + (*inputList)->entry + [j].name))); + if ((i == + (*deviceList)->selectedIndex) + && (j == activeInputIndex)) + fprintf(stdout, + " - ### ACTIVE ###"); + fprintf(stdout, "\n"); + } + } + } + SGDisposeDeviceList(s->grabber, deviceList); + CodecNameSpecListPtr list; + GetCodecNameList(&list, 1); + printf("Compression types:\n"); + for (i = 0; i < list->count; i++) { + int fcc = list->list[i].cType; + printf("\t%d) ", i); + nprintf((char *)list->list[i].typeName); + printf(" - FCC (%c%c%c%c)", + fcc >> 24, + (fcc >> 16) & 0xff, + (fcc >> 8) & 0xff, (fcc) & 0xff); + printf(" - codec id %x", + (unsigned int)(list->list[i].codec)); + printf(" - cType %x", + (unsigned int)list->list[i].cType); + printf("\n"); + } + } + return 0; + } - if (SGSetChannelUsage - (s->video_channel, - seqGrabRecord | seqGrabPreview | seqGrabAlwaysUseTimeBase | - seqGrabLowLatencyCapture) != noErr) { - debug_msg("Unable to set channel usage\n"); - return 0; - } + if (SGSetChannelUsage + (s->video_channel, + seqGrabRecord | seqGrabPreview | seqGrabAlwaysUseTimeBase | + seqGrabLowLatencyCapture) != noErr) { + debug_msg("Unable to set channel usage\n"); + return 0; + } - if (SGSetChannelPlayFlags(s->video_channel, channelPlayAllData) != - noErr) { - debug_msg("Unable to set channel flags\n"); - return 0; - } + if (SGSetChannelPlayFlags(s->video_channel, channelPlayAllData) != + noErr) { + debug_msg("Unable to set channel flags\n"); + return 0; + } - SGStartPreview(s->grabber); + SGStartPreview(s->grabber); - /* Select the device */ - if (strcmp(fmt, "gui") == 0) { //Use gui to select input - MinimalSGSettingsDialog(s->grabber, s->video_channel, gMonitor); - } else { // Use input specified on cmd - if (SGGetChannelDeviceList - (s->video_channel, sgDeviceListIncludeInputs, - &deviceList) != noErr) { - debug_msg("Unable to get list of quicktime devices\n"); - return 0; - } + /* Select the device */ + if (strcmp(fmt, "gui") == 0) { //Use gui to select input + MinimalSGSettingsDialog(s->grabber, s->video_channel, gMonitor); + } else { // Use input specified on cmd + if (SGGetChannelDeviceList + (s->video_channel, sgDeviceListIncludeInputs, + &deviceList) != noErr) { + debug_msg("Unable to get list of quicktime devices\n"); + return 0; + } - char *tmp; + char *tmp; - tmp = strtok(fmt, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - s->major = atoi(tmp); - tmp = strtok(NULL, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - s->minor = atoi(tmp); - tmp = strtok(NULL, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - s->codec = atoi(tmp); + tmp = strtok(fmt, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + s->major = atoi(tmp); + tmp = strtok(NULL, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + s->minor = atoi(tmp); + tmp = strtok(NULL, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + s->codec = atoi(tmp); - SGDeviceName *deviceEntry = &(*deviceList)->entry[s->major]; - printf("Quicktime: Setting device: "); - nprintf((char *)deviceEntry->name); - printf("\n"); - if (SGSetChannelDevice(s->video_channel, deviceEntry->name) != - noErr) { - debug_msg("Setting up the selected device failed\n"); - return 0; - } + SGDeviceName *deviceEntry = &(*deviceList)->entry[s->major]; + printf("Quicktime: Setting device: "); + nprintf((char *)deviceEntry->name); + printf("\n"); + if (SGSetChannelDevice(s->video_channel, deviceEntry->name) != + noErr) { + debug_msg("Setting up the selected device failed\n"); + return 0; + } - /* Select input */ - inputList = deviceEntry->inputs; - printf("Quicktime: Setting input: "); - nprintf((char *)(&(*inputList)->entry[s->minor].name)); - printf("\n"); - if (SGSetChannelDeviceInput(s->video_channel, s->minor) != - noErr) { - debug_msg - ("Setting up input on selected device failed\n"); - return 0; - } - } + /* Select input */ + inputList = deviceEntry->inputs; + printf("Quicktime: Setting input: "); + nprintf((char *)(&(*inputList)->entry[s->minor].name)); + printf("\n"); + if (SGSetChannelDeviceInput(s->video_channel, s->minor) != + noErr) { + debug_msg + ("Setting up input on selected device failed\n"); + return 0; + } + } - /* Set video size according to selected video format */ - Rect gActiveVideoRect; - SGGetSrcVideoBounds(s->video_channel, &gActiveVideoRect); + /* Set video size according to selected video format */ + Rect gActiveVideoRect; + SGGetSrcVideoBounds(s->video_channel, &gActiveVideoRect); - hd_size_x = s->bounds.right = - gActiveVideoRect.right - gActiveVideoRect.left; - hd_size_y = s->bounds.bottom = - gActiveVideoRect.bottom - gActiveVideoRect.top; + hd_size_x = s->bounds.right = + gActiveVideoRect.right - gActiveVideoRect.left; + hd_size_y = s->bounds.bottom = + gActiveVideoRect.bottom - gActiveVideoRect.top; - printf("Quicktime: Video size: %dx%d\n", s->bounds.right, - s->bounds.bottom); + printf("Quicktime: Video size: %dx%d\n", s->bounds.right, + s->bounds.bottom); - if (SGSetChannelBounds(s->video_channel, &(s->bounds)) != noErr) { - debug_msg("Unable to set channel bounds\n"); - return 0; - } + if (SGSetChannelBounds(s->video_channel, &(s->bounds)) != noErr) { + debug_msg("Unable to set channel bounds\n"); + return 0; + } - /* Set selected fmt->codec and get pixel format of that codec */ - int pixfmt; - if (s->codec > 0) { - CodecNameSpecListPtr list; - GetCodecNameList(&list, 1); - pixfmt = list->list[s->codec].cType; - printf("Quicktime: SetCompression: %d\n", - (int)SGSetVideoCompressor(s->video_channel, 0, - list->list[s->codec].codec, 0, - 0, 0)); - } else { - int codec; - SGGetVideoCompressor(s->video_channel, NULL, &codec, NULL, NULL, - NULL); - CodecNameSpecListPtr list; - GetCodecNameList(&list, 1); - for (i = 0; i < list->count; i++) { - if ((unsigned)codec == list->list[i].codec) { - pixfmt = list->list[i].cType; - break; - } - } - } + /* Set selected fmt->codec and get pixel format of that codec */ + int pixfmt; + if (s->codec > 0) { + CodecNameSpecListPtr list; + GetCodecNameList(&list, 1); + pixfmt = list->list[s->codec].cType; + printf("Quicktime: SetCompression: %d\n", + (int)SGSetVideoCompressor(s->video_channel, 0, + list->list[s->codec].codec, 0, + 0, 0)); + } else { + int codec; + SGGetVideoCompressor(s->video_channel, NULL, &codec, NULL, NULL, + NULL); + CodecNameSpecListPtr list; + GetCodecNameList(&list, 1); + for (i = 0; i < list->count; i++) { + if ((unsigned)codec == list->list[i].codec) { + pixfmt = list->list[i].cType; + break; + } + } + } - for (i = 0; codec_info[i].name != NULL; i++) { - if ((unsigned)pixfmt == codec_info[i].fcc) { - s->c_info = &codec_info[i]; - } - } + for (i = 0; codec_info[i].name != NULL; i++) { + if ((unsigned)pixfmt == codec_info[i].fcc) { + s->c_info = &codec_info[i]; + } + } - printf("Quicktime: Selected pixel format: %c%c%c%c\n", - pixfmt >> 24, (pixfmt >> 16) & 0xff, (pixfmt >> 8) & 0xff, - (pixfmt) & 0xff); + printf("Quicktime: Selected pixel format: %c%c%c%c\n", + pixfmt >> 24, (pixfmt >> 16) & 0xff, (pixfmt >> 8) & 0xff, + (pixfmt) & 0xff); - hd_color_spc = s->codec; + hd_color_spc = s->codec; - int h_align = s->c_info->h_align; - if (h_align) { - hd_size_x = ((hd_size_x + h_align - 1) / h_align) * h_align; - printf - ("Quicktime: Pixel format 'v210' was selected -> Setting hd_size_x to %d\n", - hd_size_x); - } + int h_align = s->c_info->h_align; + if (h_align) { + hd_size_x = ((hd_size_x + h_align - 1) / h_align) * h_align; + printf + ("Quicktime: Pixel format 'v210' was selected -> Setting hd_size_x to %d\n", + hd_size_x); + } - SetPort(savedPort); + SetPort(savedPort); - if (QTNewGWorld(&(s->gworld), pixelFormat, &(s->bounds), 0, NULL, 0) != - noErr) { - debug_msg("Unable to create GWorld\n"); - return 0; - } + if (QTNewGWorld(&(s->gworld), pixelFormat, &(s->bounds), 0, NULL, 0) != + noErr) { + debug_msg("Unable to create GWorld\n"); + return 0; + } - if (!LockPixels(GetPortPixMap(s->gworld))) { - debug_msg("Unable to lock pixels\n"); - return 0; - } + if (!LockPixels(GetPortPixMap(s->gworld))) { + debug_msg("Unable to lock pixels\n"); + return 0; + } - /*if (SGSetGWorld(s->grabber, s->gworld, GetMainDevice()) != noErr) { - debug_msg("Unable to set graphics world\n"); - return 0; - } */ + /*if (SGSetGWorld(s->grabber, s->gworld, GetMainDevice()) != noErr) { + debug_msg("Unable to set graphics world\n"); + return 0; + } */ - /****************************************************************************************/ - /* Step ?: Set the data procedure, which processes the frames as they're captured. */ - SGSetDataProc(s->grabber, NewSGDataUPP(qt_data_proc), (long)s); + /****************************************************************************************/ + /* Step ?: Set the data procedure, which processes the frames as they're captured. */ + SGSetDataProc(s->grabber, NewSGDataUPP(qt_data_proc), (long)s); - /****************************************************************************************/ - /* Step ?: Start capturing video... */ - if (SGPrepare(s->grabber, FALSE, TRUE) != noErr) { - debug_msg("Unable to prepare capture\n"); - return 0; - } + /****************************************************************************************/ + /* Step ?: Start capturing video... */ + if (SGPrepare(s->grabber, FALSE, TRUE) != noErr) { + debug_msg("Unable to prepare capture\n"); + return 0; + } - if (SGStartRecord(s->grabber) != noErr) { - debug_msg("Unable to start recording\n"); - return 0; - } + if (SGStartRecord(s->grabber) != noErr) { + debug_msg("Unable to start recording\n"); + return 0; + } - return 1; + return 1; } /******************************************************************************* @@ -542,94 +540,94 @@ static int qt_open_grabber(struct qt_grabber_state *s, char *fmt) ******************************************************************************/ struct vidcap_type *vidcap_quicktime_probe(void) { - struct vidcap_type *vt; + struct vidcap_type *vt; - vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); - if (vt != NULL) { - vt->id = VIDCAP_QUICKTIME_ID; - vt->name = "quicktime"; - vt->description = "QuickTime capture device"; - vt->width = hd_size_x; - vt->height = hd_size_y; - } + vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); + if (vt != NULL) { + vt->id = VIDCAP_QUICKTIME_ID; + vt->name = "quicktime"; + vt->description = "QuickTime capture device"; + vt->width = hd_size_x; + vt->height = hd_size_y; + } - return vt; + return vt; } /* Initialize the QuickTime grabbing system */ void *vidcap_quicktime_init(char *fmt) { - struct qt_grabber_state *s; + struct qt_grabber_state *s; - s = (struct qt_grabber_state *)malloc(sizeof(struct qt_grabber_state)); - if (s != NULL) { - s->magic = MAGIC_QT_GRABBER; - s->grabber = 0; - s->video_channel = 0; - s->seqID = 0; - s->bounds.top = 0; - s->bounds.left = 0; - s->bounds.bottom = hd_size_y; - s->bounds.right = hd_size_x; - s->sg_idle_enough = 0; + s = (struct qt_grabber_state *)malloc(sizeof(struct qt_grabber_state)); + if (s != NULL) { + s->magic = MAGIC_QT_GRABBER; + s->grabber = 0; + s->video_channel = 0; + s->seqID = 0; + s->bounds.top = 0; + s->bounds.left = 0; + s->bounds.bottom = hd_size_y; + s->bounds.right = hd_size_x; + s->sg_idle_enough = 0; - if (qt_open_grabber(s, fmt) == 0) { - free(s); - return NULL; - } - } + if (qt_open_grabber(s, fmt) == 0) { + free(s); + return NULL; + } + } - return s; + return s; } /* Finalize the grabbing system */ void vidcap_quicktime_done(void *state) { - struct qt_grabber_state *s = (struct qt_grabber_state *)state; + struct qt_grabber_state *s = (struct qt_grabber_state *)state; - assert(s != NULL); + assert(s != NULL); - if (s != NULL) { - assert(s->magic != MAGIC_QT_GRABBER); - SGStop(s->grabber); - UnlockPixels(GetPortPixMap(s->gworld)); - CloseComponent(s->grabber); - DisposeGWorld(s->gworld); - ExitMovies(); - free(s); - } + if (s != NULL) { + assert(s->magic != MAGIC_QT_GRABBER); + SGStop(s->grabber); + UnlockPixels(GetPortPixMap(s->gworld)); + CloseComponent(s->grabber); + DisposeGWorld(s->gworld); + ExitMovies(); + free(s); + } } /* Grab a frame */ struct video_frame *vidcap_quicktime_grab(void *state) { - struct qt_grabber_state *s = (struct qt_grabber_state *)state; - struct video_frame *vf; + struct qt_grabber_state *s = (struct qt_grabber_state *)state; + struct video_frame *vf; - assert(s != NULL); - assert(s->magic == MAGIC_QT_GRABBER); + assert(s != NULL); + assert(s->magic == MAGIC_QT_GRABBER); - /* Run the QuickTime sequence grabber idle function, which provides */ - /* processor time to out data proc running as a callback. */ + /* Run the QuickTime sequence grabber idle function, which provides */ + /* processor time to out data proc running as a callback. */ - /* The while loop done in this way is also sort of nice bussy waiting */ - /* and synchronizes capturing and sending. */ - s->sg_idle_enough = 0; - while (!s->sg_idle_enough) { - if (SGIdle(s->grabber) != noErr) { - debug_msg("Error in SGIDle\n"); - return NULL; - } - } + /* The while loop done in this way is also sort of nice bussy waiting */ + /* and synchronizes capturing and sending. */ + s->sg_idle_enough = 0; + while (!s->sg_idle_enough) { + if (SGIdle(s->grabber) != noErr) { + debug_msg("Error in SGIDle\n"); + return NULL; + } + } - vf = malloc(sizeof(struct video_frame)); - if (vf != NULL) { - vf->width = hd_size_x; - vf->height = hd_size_y; - vf->data = (char *)GetPixBaseAddr(GetGWorldPixMap(s->gworld)); - vf->data_len = hd_size_x * hd_size_y * s->c_info->bpp; - } - return vf; + vf = malloc(sizeof(struct video_frame)); + if (vf != NULL) { + vf->width = hd_size_x; + vf->height = hd_size_y; + vf->data = (char *)GetPixBaseAddr(GetGWorldPixMap(s->gworld)); + vf->data_len = hd_size_x * hd_size_y * s->c_info->bpp; + } + return vf; } -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ diff --git a/ultragrid/src/video_capture/testcard.c b/ultragrid/src/video_capture/testcard.c index e065598b3..bf4801fed 100644 --- a/ultragrid/src/video_capture/testcard.c +++ b/ultragrid/src/video_capture/testcard.c @@ -68,65 +68,66 @@ #include void rgb2yuv422(unsigned char *in, unsigned int width, unsigned int height); -unsigned char * tov210(unsigned char *in, unsigned int width, unsigned int height, double bpp); +unsigned char *tov210(unsigned char *in, unsigned int width, + unsigned int height, double bpp); void toR10k(unsigned char *in, unsigned int width, unsigned int height); struct testcard_state { - struct timeval last_frame_time; - int fps; - int count; - unsigned int width; - unsigned int height; - int size; - char *frame; - int linesize; - int pan; - SDL_Surface *surface; - struct timeval t0; + struct timeval last_frame_time; + int fps; + int count; + unsigned int width; + unsigned int height; + int size; + char *frame; + int linesize; + int pan; + SDL_Surface *surface; + struct timeval t0; }; const int rect_colors[] = { - 0xff0000ff, - 0xff00ff00, - 0xffff0000, - 0xff00ffff, - 0xffffff00, - 0xffff00ff }; + 0xff0000ff, + 0xff00ff00, + 0xffff0000, + 0xff00ffff, + 0xffffff00, + 0xffff00ff +}; #define COL_NUM 6 -void -rgb2yuv422(unsigned char *in, unsigned int width, unsigned int height) +void rgb2yuv422(unsigned char *in, unsigned int width, unsigned int height) { - unsigned int i,j; - int r,g,b; - int y,u,v,y1,u1,v1; + unsigned int i, j; + int r, g, b; + int y, u, v, y1, u1, v1; unsigned char *dst; dst = in; - for(j = 0; j < height; j++) { - for(i = 0; i < width; i+=2) { + for (j = 0; j < height; j++) { + for (i = 0; i < width; i += 2) { r = *(in++); g = *(in++); b = *(in++); - in++; /*skip alpha*/ + in++; /*skip alpha */ y = r * 0.299 + g * 0.587 + b * 0.114; u = b * 0.5 - r * 0.168736 - g * 0.331264; - v = r * 0.5 - g * 0.418688 -b * 0.081312; + v = r * 0.5 - g * 0.418688 - b * 0.081312; //y -= 16; - if(y > 255) + if (y > 255) y = 255; - if(y < 0) + if (y < 0) y = 0; - if(u < -128) + if (u < -128) u = -128; - if(u > 127) + if (u > 127) u = 127; - if(v < -128) + if (v < -128) v = -128; - if(v > 127) + if (v > 127) v = 127; u += 128; v += 128; @@ -134,58 +135,58 @@ rgb2yuv422(unsigned char *in, unsigned int width, unsigned int height) r = *(in++); g = *(in++); b = *(in++); - in++; /*skip alpha*/ - + in++; /*skip alpha */ + y1 = r * 0.299 + g * 0.587 + b * 0.114; u1 = b * 0.5 - r * 0.168736 - g * 0.331264; - v1 = r * 0.5 - g * 0.418688 -b * 0.081312; - if(y1 > 255) + v1 = r * 0.5 - g * 0.418688 - b * 0.081312; + if (y1 > 255) y1 = 255; - if(y1 < 0) + if (y1 < 0) y1 = 0; - if(u1 < -128) + if (u1 < -128) u1 = -128; - if(u1 > 127) + if (u1 > 127) u1 = 127; - if(v1 < -128) + if (v1 < -128) v1 = -128; - if(v1 > 127) + if (v1 > 127) v1 = 127; u1 += 128; v1 += 128; - - *(dst++) = (u + u1)/2; + + *(dst++) = (u + u1) / 2; *(dst++) = y; - *(dst++) = (v + v1)/2; + *(dst++) = (v + v1) / 2; *(dst++) = y1; } } } -unsigned char * -tov210(unsigned char *in, unsigned int width, unsigned int aligned_x, unsigned int height, double bpp) +unsigned char *tov210(unsigned char *in, unsigned int width, + unsigned int aligned_x, unsigned int height, double bpp) { struct { - unsigned a:10; - unsigned b:10; - unsigned c:10; - unsigned p1:2; + unsigned a:10; + unsigned b:10; + unsigned c:10; + unsigned p1:2; } *p; - unsigned int i,j; + unsigned int i, j; unsigned int linesize = aligned_x * bpp; - unsigned char *dst = (unsigned char*)malloc(aligned_x*height*bpp); + unsigned char *dst = (unsigned char *)malloc(aligned_x * height * bpp); unsigned char *src; unsigned char *ret = dst; - for(j=0; j < height; j++) { - p = (void*)dst; + for (j = 0; j < height; j++) { + p = (void *)dst; dst += linesize; src = in; - in += width*2; - for(i=0; i < width; i+=3) { - unsigned int u,y,v; + in += width * 2; + for (i = 0; i < width; i += 3) { + unsigned int u, y, v; u = *(src++); y = *(src++); @@ -195,7 +196,7 @@ tov210(unsigned char *in, unsigned int width, unsigned int aligned_x, unsigned i p->b = y << 2; p->c = v << 2; p->p1 = 0; - + p++; u = *(src++); @@ -213,32 +214,31 @@ tov210(unsigned char *in, unsigned int width, unsigned int aligned_x, unsigned i return ret; } -void -toR10k(unsigned char *in, unsigned int width, unsigned int height) +void toR10k(unsigned char *in, unsigned int width, unsigned int height) { struct { - unsigned r:8; + unsigned r:8; - unsigned gh:6; - unsigned p1:2; + unsigned gh:6; + unsigned p1:2; - unsigned bh:4; - unsigned p2:2; - unsigned gl:2; + unsigned bh:4; + unsigned p2:2; + unsigned gl:2; - unsigned p3:2; - unsigned p4:2; - unsigned bl:4; + unsigned p3:2; + unsigned p4:2; + unsigned bl:4; } *d; - - unsigned int i,j; - d = (void*)in; + unsigned int i, j; + + d = (void *)in; + + for (j = 0; j < height; j++) { + for (i = 0; i < width; i++) { + unsigned int r, g, b; - for(j = 0; j < height; j++) { - for(i = 0; i < width; i++) { - unsigned int r,g,b; - r = *(in++); g = *(in++); b = *(in++); @@ -256,24 +256,22 @@ toR10k(unsigned char *in, unsigned int width, unsigned int height) d->p4 = 0; d++; - } + } } } - -void * -vidcap_testcard_init(char *fmt) +void *vidcap_testcard_init(char *fmt) { - struct testcard_state *s; - char *filename; - FILE *in; - struct stat sb; - unsigned int i,j; - unsigned int rect_size=COL_NUM; - codec_t codec; - int aligned_x; + struct testcard_state *s; + char *filename; + FILE *in; + struct stat sb; + unsigned int i, j; + unsigned int rect_size = COL_NUM; + codec_t codec; + int aligned_x; - if(strcmp(fmt, "help")==0) { + if (strcmp(fmt, "help") == 0) { printf("testcard options:\n"); printf("\twidth:height:fps:codec[:filename][:p}\n"); printf("\tp - pan with frame\n"); @@ -282,48 +280,48 @@ vidcap_testcard_init(char *fmt) } s = malloc(sizeof(struct testcard_state)); - if(!s) + if (!s) return NULL; char *tmp; tmp = strtok(fmt, ":"); - if(!tmp) { + if (!tmp) { fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); free(s); return NULL; } s->width = atoi(tmp); tmp = strtok(NULL, ":"); - if(!tmp) { + if (!tmp) { fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); free(s); return NULL; } s->height = atoi(tmp); tmp = strtok(NULL, ":"); - if(!tmp) { + if (!tmp) { free(s->frame); free(s); fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); return NULL; } - s->fps = atoi(tmp); + s->fps = atoi(tmp); - tmp=strtok(NULL, ":"); - if(!tmp) { + tmp = strtok(NULL, ":"); + if (!tmp) { free(s->frame); free(s); fprintf(stderr, "Wrong format for testcard '%s'\n", fmt); return NULL; } - int h_align=0; - double bpp=0; + int h_align = 0; + double bpp = 0; - for(i = 0; codec_info[i].name != NULL; i++) { - if(strcmp(tmp, codec_info[i].name) == 0) { + for (i = 0; codec_info[i].name != NULL; i++) { + if (strcmp(tmp, codec_info[i].name) == 0) { h_align = codec_info[i].h_align; bpp = codec_info[i].bpp; codec = codec_info[i].codec; @@ -331,22 +329,21 @@ vidcap_testcard_init(char *fmt) } } - aligned_x = s->width; - if(h_align) { - aligned_x = (aligned_x + h_align - 1)/h_align*h_align; + if (h_align) { + aligned_x = (aligned_x + h_align - 1) / h_align * h_align; } - rect_size = (s->width + rect_size-1) / rect_size; + rect_size = (s->width + rect_size - 1) / rect_size; s->linesize = aligned_x * bpp; - s->size = aligned_x*s->height*bpp; + s->size = aligned_x * s->height * bpp; filename = strtok(NULL, ":"); - if(filename && strcmp(filename, "p") != 0) { + if (filename && strcmp(filename, "p") != 0) { s->frame = malloc(s->size); - if(stat(filename, &sb)) { + if (stat(filename, &sb)) { perror("stat"); free(s); return NULL; @@ -354,17 +351,16 @@ vidcap_testcard_init(char *fmt) in = fopen(filename, "r"); - if(s->size < sb.st_size) { + if (s->size < sb.st_size) { fprintf(stderr, "Error wrong file size for selected " - "resolution and codec. File size %d, " - "computed size %d\n", - (int)sb.st_size, s->size); + "resolution and codec. File size %d, " + "computed size %d\n", (int)sb.st_size, s->size); free(s->frame); free(s); return NULL; } - - if(!in || fread(s->frame, sb.st_size, 1, in) == 0) { + + if (!in || fread(s->frame, sb.st_size, 1, in) == 0) { fprintf(stderr, "Cannot read file %s\n", filename); free(s->frame); free(s); @@ -374,58 +370,64 @@ vidcap_testcard_init(char *fmt) fclose(in); } else { SDL_Rect r; - int col_num=0; - s->surface = SDL_CreateRGBSurface(SDL_SWSURFACE, aligned_x, s->height, - 32, 0xff, 0xff00, 0xff0000, 0xff000000); - if(filename && filename[0] == 'p') { + int col_num = 0; + s->surface = + SDL_CreateRGBSurface(SDL_SWSURFACE, aligned_x, s->height, + 32, 0xff, 0xff00, 0xff0000, + 0xff000000); + if (filename && filename[0] == 'p') { s->pan = 48; } - for(j=0; j < s->height; j+=rect_size) { - int grey=0xff010101; - if(j==rect_size*2) { - r.w= s->width; - r.h = rect_size/4; + for (j = 0; j < s->height; j += rect_size) { + int grey = 0xff010101; + if (j == rect_size * 2) { + r.w = s->width; + r.h = rect_size / 4; r.x = 0; r.y = j; SDL_FillRect(s->surface, &r, 0xffffffff); - r.y = j+rect_size*3/4; + r.y = j + rect_size * 3 / 4; SDL_FillRect(s->surface, &r, 0); } - for(i=0; i < s->width; i+=rect_size) { + for (i = 0; i < s->width; i += rect_size) { r.w = rect_size; r.h = rect_size; r.x = i; r.y = j; - printf("Fill rect at %d,%d\n", r.x, r.y ); - if(j!=rect_size*2) { - SDL_FillRect(s->surface, &r, rect_colors[col_num]); - col_num = (col_num+1)%COL_NUM; + printf("Fill rect at %d,%d\n", r.x, r.y); + if (j != rect_size * 2) { + SDL_FillRect(s->surface, &r, + rect_colors[col_num]); + col_num = (col_num + 1) % COL_NUM; } else { - r.h = rect_size/2; - r.y += rect_size/4; - SDL_FillRect(s->surface, &r, grey); - grey += 0x00010101*(255/COL_NUM); + r.h = rect_size / 2; + r.y += rect_size / 4; + SDL_FillRect(s->surface, &r, grey); + grey += 0x00010101 * (255 / COL_NUM); } } } - s->frame = s->surface->pixels; - if(codec == UYVY || codec == v210 || codec == Vuy2) { - rgb2yuv422((unsigned char*)s->frame, s->width, s->height); - } - - if(codec == v210) { - s->frame = (char*)tov210((unsigned char*)s->frame, s->width, aligned_x, s->height, bpp); + s->frame = s->surface->pixels; + if (codec == UYVY || codec == v210 || codec == Vuy2) { + rgb2yuv422((unsigned char *)s->frame, s->width, + s->height); } - if(codec == R10k) { - toR10k((unsigned char*)s->frame, s->width, s->height); + if (codec == v210) { + s->frame = + (char *)tov210((unsigned char *)s->frame, s->width, + aligned_x, s->height, bpp); + } + + if (codec == R10k) { + toR10k((unsigned char *)s->frame, s->width, s->height); } } tmp = strtok(NULL, ":"); - if(tmp) { - if(tmp[0] == 'p') { + if (tmp) { + if (tmp[0] == 'p') { s->pan = 48; } } @@ -438,80 +440,83 @@ vidcap_testcard_init(char *fmt) return s; } -void -vidcap_testcard_done(void *state) +void vidcap_testcard_done(void *state) { struct testcard_state *s = state; - if(s->frame != s->surface->pixels) + if (s->frame != s->surface->pixels) free(s->frame); - if(s->surface) + if (s->surface) SDL_FreeSurface(s->surface); free(s); } -struct video_frame * -vidcap_testcard_grab(void *arg) +struct video_frame *vidcap_testcard_grab(void *arg) { - struct timeval curr_time; - struct testcard_state *state; - struct video_frame *vf; + struct timeval curr_time; + struct testcard_state *state; + struct video_frame *vf; - state = (struct testcard_state *) arg; + state = (struct testcard_state *)arg; gettimeofday(&curr_time, NULL); - if (tv_diff(curr_time, state->last_frame_time) > 1.0/(double)state->fps) { + if (tv_diff(curr_time, state->last_frame_time) > + 1.0 / (double)state->fps) { state->last_frame_time = curr_time; state->count++; - double seconds = tv_diff(curr_time, state->t0); + double seconds = tv_diff(curr_time, state->t0); if (seconds >= 5) { - float fps = state->count / seconds; - fprintf(stderr, "%d frames in %g seconds = %g FPS\n", state->count, seconds, fps); + float fps = state->count / seconds; + fprintf(stderr, "%d frames in %g seconds = %g FPS\n", + state->count, seconds, fps); state->t0 = curr_time; state->count = 0; } - vf = (struct video_frame *) malloc(sizeof(struct video_frame)); + vf = (struct video_frame *)malloc(sizeof(struct video_frame)); if (vf != NULL) { - char line[state->linesize*2+state->pan]; - unsigned int i; - vf->width = state->width; - vf->height = state->height; - vf->data = state->frame; - vf->data_len = state->size; - memcpy(line, state->frame, state->linesize*2+state->pan); - for(i=0; i < hd_size_y-3; i++) { - memcpy(state->frame+i*state->linesize, - state->frame+(i+2)*state->linesize+state->pan, state->linesize); + char line[state->linesize * 2 + state->pan]; + unsigned int i; + vf->width = state->width; + vf->height = state->height; + vf->data = state->frame; + vf->data_len = state->size; + memcpy(line, state->frame, + state->linesize * 2 + state->pan); + for (i = 0; i < hd_size_y - 3; i++) { + memcpy(state->frame + i * state->linesize, + state->frame + (i + + 2) * state->linesize + + state->pan, state->linesize); } - memcpy(state->frame+i*state->linesize, - state->frame+(i+2)*state->linesize+state->pan, state->linesize-state->pan); - memcpy(state->frame+(hd_size_y-2)*state->linesize-state->pan, - line, state->linesize*2+state->pan); + memcpy(state->frame + i * state->linesize, + state->frame + (i + 2) * state->linesize + + state->pan, state->linesize - state->pan); + memcpy(state->frame + + (hd_size_y - 2) * state->linesize - state->pan, + line, state->linesize * 2 + state->pan); /*if(!(state->count % 2)) { - unsigned int *p = state->frame; - for(i=0; i < state->linesize*hd_size_y/4; i++) { - *p = *p ^ 0x00ffffffL; - p++; - } - }*/ + unsigned int *p = state->frame; + for(i=0; i < state->linesize*hd_size_y/4; i++) { + *p = *p ^ 0x00ffffffL; + p++; + } + } */ } return vf; } return NULL; } -struct vidcap_type * -vidcap_testcard_probe(void) +struct vidcap_type *vidcap_testcard_probe(void) { - struct vidcap_type *vt; + struct vidcap_type *vt; - vt = (struct vidcap_type *) malloc(sizeof(struct vidcap_type)); + vt = (struct vidcap_type *)malloc(sizeof(struct vidcap_type)); if (vt != NULL) { - vt->id = VIDCAP_TESTCARD_ID; - vt->name = "testcard"; + vt->id = VIDCAP_TESTCARD_ID; + vt->name = "testcard"; vt->description = "Video testcard"; } return vt; } - diff --git a/ultragrid/src/video_codec.c b/ultragrid/src/video_codec.c index 81c5196ca..43ad1b9a5 100644 --- a/ultragrid/src/video_codec.c +++ b/ultragrid/src/video_codec.c @@ -60,13 +60,12 @@ const struct codec_info_t codec_info[] = { {Vuy2, "2vuy", '2vuy', 0, 2, 0}, {DVS8, "DVS8", 0, 0, 2, 0}, {R10k, "R10k", 1378955371, 0, 4, 1}, - {v210, "v210", 1983000880, 48, 8.0/3.0, 0}, - {DVS10, "DVS10", 0, 48, 8.0/3.0, 0}, - {0, NULL, 0, 0, 0.0, 0}}; + {v210, "v210", 1983000880, 48, 8.0 / 3.0, 0}, + {DVS10, "DVS10", 0, 48, 8.0 / 3.0, 0}, + {0, NULL, 0, 0, 0.0, 0} +}; - -void -show_codec_help(void) +void show_codec_help(void) { printf("\tSupported codecs:\n"); printf("\t\t8bits\n"); @@ -80,123 +79,119 @@ show_codec_help(void) printf("\t\t\t'DVS10' - Centaurus 10bit YUV 4:2:2\n"); } -double -get_bpp(codec_t codec) +double get_bpp(codec_t codec) { - int i=0; + int i = 0; - while(codec_info[i].name != NULL) { - if(codec == codec_info[i].codec) - return codec_info[i].bpp; - i++; - } - return 0; + while (codec_info[i].name != NULL) { + if (codec == codec_info[i].codec) + return codec_info[i].bpp; + i++; + } + return 0; } - -int -vc_getsrc_linesize(unsigned int width, codec_t codec) +int vc_getsrc_linesize(unsigned int width, codec_t codec) { - if(codec_info[codec].h_align) { - width = ((width + codec_info[codec].h_align - 1) / codec_info[codec].h_align) * codec_info[codec].h_align; + if (codec_info[codec].h_align) { + width = + ((width + codec_info[codec].h_align - + 1) / codec_info[codec].h_align) * + codec_info[codec].h_align; } return width * codec_info[codec].bpp; } /* linear blend deinterlace */ -void -vc_deinterlace(unsigned char *src, long src_linesize, int lines) +void vc_deinterlace(unsigned char *src, long src_linesize, int lines) { - int i,j; + int i, j; long pitch = src_linesize; - register long pitch2 = pitch*2; + register long pitch2 = pitch * 2; unsigned char *bline1, *bline2, *bline3; register unsigned char *line1, *line2, *line3; bline1 = src; bline2 = src + pitch; - bline3 = src + 3*pitch; - for(i=0; i < src_linesize; i+=16) { - /* preload first two lines */ - asm volatile( - "movdqa (%0), %%xmm0\n" - "movdqa (%1), %%xmm1\n" - : - : "r" ((unsigned long *)bline1), - "r" ((unsigned long *)bline2)); - line1 = bline2; - line2 = bline2 + pitch; - line3 = bline3; - for(j=0; j < lines-4; j+=2) { - asm volatile( - "movdqa (%1), %%xmm2\n" - "pavgb %%xmm2, %%xmm0\n" - "pavgb %%xmm1, %%xmm0\n" - "movdqa (%2), %%xmm1\n" - "movdqa %%xmm0, (%0)\n" - "pavgb %%xmm1, %%xmm0\n" - "pavgb %%xmm2, %%xmm0\n" - "movdqa %%xmm0, (%1)\n" - : - :"r" ((unsigned long *)line1), - "r" ((unsigned long *)line2), - "r" ((unsigned long *)line3) - ); - line1 += pitch2; - line2 += pitch2; - line3 += pitch2; + bline3 = src + 3 * pitch; + for (i = 0; i < src_linesize; i += 16) { + /* preload first two lines */ + asm volatile ("movdqa (%0), %%xmm0\n" + "movdqa (%1), %%xmm1\n"::"r" ((unsigned long *) + bline1), + "r"((unsigned long *)bline2)); + line1 = bline2; + line2 = bline2 + pitch; + line3 = bline3; + for (j = 0; j < lines - 4; j += 2) { + asm volatile ("movdqa (%1), %%xmm2\n" + "pavgb %%xmm2, %%xmm0\n" + "pavgb %%xmm1, %%xmm0\n" + "movdqa (%2), %%xmm1\n" + "movdqa %%xmm0, (%0)\n" + "pavgb %%xmm1, %%xmm0\n" + "pavgb %%xmm2, %%xmm0\n" + "movdqa %%xmm0, (%1)\n"::"r" ((unsigned + long *) + line1), + "r"((unsigned long *)line2), + "r"((unsigned long *)line3) + ); + line1 += pitch2; + line2 += pitch2; + line3 += pitch2; + } + bline1 += 16; + bline2 += 16; + bline3 += 16; } - bline1 += 16; - bline2 += 16; - bline3 += 16; - } } - - -void -vc_copylinev210(unsigned char *dst, unsigned char *src, int dst_len) +void vc_copylinev210(unsigned char *dst, unsigned char *src, int dst_len) { struct { - unsigned a:10; - unsigned b:10; - unsigned c:10; - unsigned p1:2; + unsigned a:10; + unsigned b:10; + unsigned c:10; + unsigned p1:2; } *s; register uint32_t *d; register uint32_t tmp; - d = (uint32_t *)dst; - s = (void*)src; + d = (uint32_t *) dst; + s = (void *)src; - while(dst_len >= 12) { + while (dst_len >= 12) { tmp = (s->a >> 2) | (s->b >> 2) << 8 | (((s)->c >> 2) << 16); s++; *(d++) = tmp | ((s->a >> 2) << 24); tmp = (s->b >> 2) | (((s)->c >> 2) << 8); s++; - *(d++) = tmp | ((s->a >> 2) << 16) | ((s->b >> 2)<<24); + *(d++) = tmp | ((s->a >> 2) << 16) | ((s->b >> 2) << 24); tmp = (s->c >> 2); s++; - *(d++) = tmp | ((s->a >> 2) << 8) | ((s->b >> 2) << 16) | ((s->c >> 2) << 24); + *(d++) = + tmp | ((s->a >> 2) << 8) | ((s->b >> 2) << 16) | + ((s->c >> 2) << 24); s++; dst_len -= 12; } - if(dst_len >= 4) { - tmp = (s->a >> 2) | (s->b >> 2) << 8 | (((s)->c >> 2) << 16); - s++; - *(d++) = tmp | ((s->a >> 2) << 24); + if (dst_len >= 4) { + tmp = (s->a >> 2) | (s->b >> 2) << 8 | (((s)->c >> 2) << 16); + s++; + *(d++) = tmp | ((s->a >> 2) << 24); } - if(dst_len >= 8) { - tmp = (s->b >> 2) | (((s)->c >> 2) << 8); - s++; - *(d++) = tmp | ((s->a >> 2) << 16) | ((s->b >> 2)<<24); + if (dst_len >= 8) { + tmp = (s->b >> 2) | (((s)->c >> 2) << 8); + s++; + *(d++) = tmp | ((s->a >> 2) << 16) | ((s->b >> 2) << 24); } } void -vc_copyliner10k(unsigned char *dst, unsigned char *src, int len, int rshift, int gshift, int bshift) +vc_copyliner10k(unsigned char *dst, unsigned char *src, int len, int rshift, + int gshift, int bshift) { struct { unsigned r:8; @@ -215,20 +210,36 @@ vc_copyliner10k(unsigned char *dst, unsigned char *src, int len, int rshift, int register uint32_t *d; register uint32_t tmp; - d = (uint32_t *)dst; - s = (void*)src; + d = (uint32_t *) dst; + s = (void *)src; - while(len > 0) { - tmp = (s->r << rshift) | (((s->gh << 2) | s->gl) << gshift) | (((s->bh << 4) | s->bl) << bshift); + while (len > 0) { + tmp = + (s-> + r << rshift) | (((s->gh << 2) | s-> + gl) << gshift) | (((s->bh << 4) | s-> + bl) << bshift); s++; *(d++) = tmp; - tmp = (s->r << rshift) | (((s->gh << 2) | s->gl) << gshift) | (((s->bh << 4) | s->bl) << bshift); + tmp = + (s-> + r << rshift) | (((s->gh << 2) | s-> + gl) << gshift) | (((s->bh << 4) | s-> + bl) << bshift); s++; *(d++) = tmp; - tmp = (s->r << rshift) | (((s->gh << 2) | s->gl) << gshift) | (((s->bh << 4) | s->bl) << bshift); + tmp = + (s-> + r << rshift) | (((s->gh << 2) | s-> + gl) << gshift) | (((s->bh << 4) | s-> + bl) << bshift); s++; *(d++) = tmp; - tmp = (s->r << rshift) | (((s->gh << 2) | s->gl) << gshift) | (((s->bh << 4) | s->bl) << bshift); + tmp = + (s-> + r << rshift) | (((s->gh << 2) | s-> + gl) << gshift) | (((s->bh << 4) | s-> + bl) << bshift); s++; *(d++) = tmp; len -= 16; @@ -236,17 +247,18 @@ vc_copyliner10k(unsigned char *dst, unsigned char *src, int len, int rshift, int } void -vc_copylineRGBA(unsigned char *dst, unsigned char *src, int len, int rshift, int gshift, int bshift) +vc_copylineRGBA(unsigned char *dst, unsigned char *src, int len, int rshift, + int gshift, int bshift) { - register uint32_t *d=(uint32_t*)dst; - register uint32_t *s=(uint32_t*)src; + register uint32_t *d = (uint32_t *) dst; + register uint32_t *s = (uint32_t *) src; register uint32_t tmp; - if(rshift == 0 && gshift == 8 && bshift == 16) { + if (rshift == 0 && gshift == 8 && bshift == 16) { memcpy(dst, src, len); } else { - while(len > 0) { - register unsigned int r,g,b; + while (len > 0) { + register unsigned int r, g, b; tmp = *(s++); r = tmp & 0xff; g = (tmp >> 8) & 0xff; @@ -280,78 +292,74 @@ vc_copylineRGBA(unsigned char *dst, unsigned char *src, int len, int rshift, int #if !(HAVE_MACOSX || HAVE_32B_LINUX) -void -vc_copylineDVS10(unsigned char *dst, unsigned char *src, int src_len) +void vc_copylineDVS10(unsigned char *dst, unsigned char *src, int src_len) { - register unsigned char *_d=dst,*_s=src; + register unsigned char *_d = dst, *_s = src; - while(len > 0) { + while (len > 0) { - asm ("movd %0, %%xmm4\n": : "r" (0xffffff)); + asm("movd %0, %%xmm4\n": :"r"(0xffffff)); - asm volatile ("movdqa (%0), %%xmm0\n" - "movdqa 16(%0), %%xmm5\n" - "movdqa %%xmm0, %%xmm1\n" - "movdqa %%xmm0, %%xmm2\n" - "movdqa %%xmm0, %%xmm3\n" - "pand %%xmm4, %%xmm0\n" - "movdqa %%xmm5, %%xmm6\n" - "movdqa %%xmm5, %%xmm7\n" - "movdqa %%xmm5, %%xmm8\n" - "pand %%xmm4, %%xmm5\n" - "pslldq $4, %%xmm4\n" - "pand %%xmm4, %%xmm1\n" - "pand %%xmm4, %%xmm6\n" - "pslldq $4, %%xmm4\n" - "psrldq $1, %%xmm1\n" - "psrldq $1, %%xmm6\n" - "pand %%xmm4, %%xmm2\n" - "pand %%xmm4, %%xmm7\n" - "pslldq $4, %%xmm4\n" - "psrldq $2, %%xmm2\n" - "psrldq $2, %%xmm7\n" - "pand %%xmm4, %%xmm3\n" - "pand %%xmm4, %%xmm8\n" - "por %%xmm1, %%xmm0\n" - "psrldq $3, %%xmm3\n" - "psrldq $3, %%xmm8\n" - "por %%xmm2, %%xmm0\n" - "por %%xmm6, %%xmm5\n" - "por %%xmm3, %%xmm0\n" - "por %%xmm7, %%xmm5\n" - "movdq2q %%xmm0, %%mm0\n" - "por %%xmm8, %%xmm5\n" - "movdqa %%xmm5, %%xmm1\n" - "pslldq $12, %%xmm5\n" - "psrldq $4, %%xmm1\n" - "por %%xmm5, %%xmm0\n" - "psrldq $8, %%xmm0\n" - "movq %%mm0, (%1)\n" - "movdq2q %%xmm0, %%mm1\n" - "movdq2q %%xmm1, %%mm2\n" - "movq %%mm1, 8(%1)\n" - "movq %%mm2, 16(%1)\n" - : - : "r" (_s), "r" (_d)); - _s += 32; - _d += 24; - src_len -= 32; - } + asm volatile ("movdqa (%0), %%xmm0\n" + "movdqa 16(%0), %%xmm5\n" + "movdqa %%xmm0, %%xmm1\n" + "movdqa %%xmm0, %%xmm2\n" + "movdqa %%xmm0, %%xmm3\n" + "pand %%xmm4, %%xmm0\n" + "movdqa %%xmm5, %%xmm6\n" + "movdqa %%xmm5, %%xmm7\n" + "movdqa %%xmm5, %%xmm8\n" + "pand %%xmm4, %%xmm5\n" + "pslldq $4, %%xmm4\n" + "pand %%xmm4, %%xmm1\n" + "pand %%xmm4, %%xmm6\n" + "pslldq $4, %%xmm4\n" + "psrldq $1, %%xmm1\n" + "psrldq $1, %%xmm6\n" + "pand %%xmm4, %%xmm2\n" + "pand %%xmm4, %%xmm7\n" + "pslldq $4, %%xmm4\n" + "psrldq $2, %%xmm2\n" + "psrldq $2, %%xmm7\n" + "pand %%xmm4, %%xmm3\n" + "pand %%xmm4, %%xmm8\n" + "por %%xmm1, %%xmm0\n" + "psrldq $3, %%xmm3\n" + "psrldq $3, %%xmm8\n" + "por %%xmm2, %%xmm0\n" + "por %%xmm6, %%xmm5\n" + "por %%xmm3, %%xmm0\n" + "por %%xmm7, %%xmm5\n" + "movdq2q %%xmm0, %%mm0\n" + "por %%xmm8, %%xmm5\n" + "movdqa %%xmm5, %%xmm1\n" + "pslldq $12, %%xmm5\n" + "psrldq $4, %%xmm1\n" + "por %%xmm5, %%xmm0\n" + "psrldq $8, %%xmm0\n" + "movq %%mm0, (%1)\n" + "movdq2q %%xmm0, %%mm1\n" + "movdq2q %%xmm1, %%mm2\n" + "movq %%mm1, 8(%1)\n" + "movq %%mm2, 16(%1)\n"::"r" (_s), "r"(_d)); + _s += 32; + _d += 24; + src_len -= 32; + } } #else -void -vc_copylineDVS10(unsigned char *dst, unsigned char *src, int src_len) +void vc_copylineDVS10(unsigned char *dst, unsigned char *src, int src_len) { register uint64_t *d, *s; - register uint64_t a1,a2,a3,a4; + register uint64_t a1, a2, a3, a4; - d = (uint64_t *)dst; - s = (uint64_t *)src; + d = (uint64_t *) dst; + s = (uint64_t *) src; - while(src_len > 0) { + while (src_len > 0) { a1 = *(s++); a2 = *(s++); a3 = *(s++); @@ -363,11 +371,11 @@ vc_copylineDVS10(unsigned char *dst, unsigned char *src, int src_len) a4 = (a4 & 0xffffff) | ((a4 >> 8) & 0xffffff000000LL); *(d++) = a1 | (a2 << 48); /* 0xa2|a2|a1|a1|a1|a1|a1|a1 */ - *(d++) = (a2 >> 16)|(a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ - *(d++) = (a3 >> 32)|(a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ + *(d++) = (a2 >> 16) | (a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ + *(d++) = (a3 >> 32) | (a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ src_len -= 16; } } -#endif /* !(HAVE_MACOSX || HAVE_32B_LINUX) */ +#endif /* !(HAVE_MACOSX || HAVE_32B_LINUX) */ diff --git a/ultragrid/src/video_compress.c b/ultragrid/src/video_compress.c index b350448ec..82b541720 100644 --- a/ultragrid/src/video_compress.c +++ b/ultragrid/src/video_compress.c @@ -54,9 +54,9 @@ #include #ifdef HAVE_MACOSX #include -#else /* HAVE_MACOSX */ +#else /* HAVE_MACOSX */ #include -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ #include #include #include "video_types.h" @@ -65,7 +65,7 @@ #ifndef HAVE_MACOSX #define uint64_t unsigned long -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ /* NOTE: These threads busy wait, so at *most* set this to one less than the * total number of cores on your system (Also 3 threads will work)! Also, if @@ -85,140 +85,141 @@ */ struct video_compress { - unsigned char *buffer[NUM_THREADS]; - unsigned char *output_data; - unsigned char *out; - pthread_mutex_t lock; - int thread_count,len[NUM_THREADS],go[NUM_THREADS]; - pthread_t thread_ids[NUM_THREADS]; + unsigned char *buffer[NUM_THREADS]; + unsigned char *output_data; + unsigned char *out; + pthread_mutex_t lock; + int thread_count, len[NUM_THREADS], go[NUM_THREADS]; + pthread_t thread_ids[NUM_THREADS]; }; -inline void compress_copyline64(unsigned char *dst, unsigned char *src, int len); +inline void compress_copyline64(unsigned char *dst, unsigned char *src, + int len); inline void compress_copyline128(unsigned char *d, unsigned char *s, int len); void compress_deinterlace(unsigned char *buffer); -void compress_data(void *args, struct video_frame * tx); +void compress_data(void *args, struct video_frame *tx); -struct video_compress * initialize_video_compression(void) +struct video_compress *initialize_video_compression(void) { - /* This function does the following: - * 1. Allocate memory for buffers - * 2. Spawn compressor threads - */ - int x; - struct video_compress *compress; + /* This function does the following: + * 1. Allocate memory for buffers + * 2. Spawn compressor threads + */ + int x; + struct video_compress *compress; - compress=calloc(1,sizeof(struct video_compress)); - for(x=0;xbuffer[x]=(unsigned char*)malloc(1920*1080*4/NUM_THREADS); - } + compress = calloc(1, sizeof(struct video_compress)); + for (x = 0; x < NUM_THREADS; x++) { + compress->buffer[x] = + (unsigned char *)malloc(1920 * 1080 * 4 / NUM_THREADS); + } #ifdef HAVE_MACOSX - compress->output_data=(unsigned char*)malloc(1920*1080*4); - compress->out=(unsigned char*)malloc(1920*1080*4); -#else - /* - * memalign doesn't exist on Mac OS. malloc always returns 16 - * bytes aligned memory - * + compress->output_data = (unsigned char *)malloc(1920 * 1080 * 4); + compress->out = (unsigned char *)malloc(1920 * 1080 * 4); +#else + /* + * memalign doesn't exist on Mac OS. malloc always returns 16 + * bytes aligned memory + * * see: http://www.mythtv.org/pipermail/mythtv-dev/2006-January/044309.html - */ - compress->output_data=(unsigned char*)memalign(16,1920*1080*4); - compress->out=(unsigned char*)memalign(16,1920*1080*4); -#endif /* HAVE_MACOSX */ - memset(compress->output_data,0,1920*1080*4); - memset(compress->out,0,1920*1080*4/8); - compress->thread_count=0; - if(pthread_mutex_init(&(compress->lock),NULL)){ - perror("Error initializing mutex!"); - exit(x); - } + */ + compress->output_data = (unsigned char *)memalign(16, 1920 * 1080 * 4); + compress->out = (unsigned char *)memalign(16, 1920 * 1080 * 4); +#endif /* HAVE_MACOSX */ + memset(compress->output_data, 0, 1920 * 1080 * 4); + memset(compress->out, 0, 1920 * 1080 * 4 / 8); + compress->thread_count = 0; + if (pthread_mutex_init(&(compress->lock), NULL)) { + perror("Error initializing mutex!"); + exit(x); + } - pthread_mutex_lock(&(compress->lock)); + pthread_mutex_lock(&(compress->lock)); - for(x=0;xthread_ids[x]), NULL, (void *)compress_thread, (void *)compress)) { - perror("Unable to create compressor thread!"); - exit(x); - } + for (x = 0; x < NUM_THREADS; x++) { + if (pthread_create + (&(compress->thread_ids[x]), NULL, (void *)compress_thread, + (void *)compress)) { + perror("Unable to create compressor thread!"); + exit(x); + } - compress->go[x]=0; - compress->len[x]=0; - } - pthread_mutex_unlock(&(compress->lock)); - return compress; + compress->go[x] = 0; + compress->len[x] = 0; + } + pthread_mutex_unlock(&(compress->lock)); + return compress; } - #if !(HAVE_MACOSX || HAVE_32B_LINUX) inline void compress_copyline128(unsigned char *d, unsigned char *s, int len) { - register unsigned char *_d=d,*_s=s; + register unsigned char *_d = d, *_s = s; - while(--len >= 0) { + while (--len >= 0) { - asm ("movd %0, %%xmm4\n": : "r" (0xffffff)); + asm("movd %0, %%xmm4\n": :"r"(0xffffff)); asm volatile ("movdqa (%0), %%xmm0\n" - "movdqa 16(%0), %%xmm5\n" - "movdqa %%xmm0, %%xmm1\n" - "movdqa %%xmm0, %%xmm2\n" - "movdqa %%xmm0, %%xmm3\n" - "pand %%xmm4, %%xmm0\n" - "movdqa %%xmm5, %%xmm6\n" - "movdqa %%xmm5, %%xmm7\n" - "movdqa %%xmm5, %%xmm8\n" - "pand %%xmm4, %%xmm5\n" - "pslldq $4, %%xmm4\n" - "pand %%xmm4, %%xmm1\n" - "pand %%xmm4, %%xmm6\n" - "pslldq $4, %%xmm4\n" - "psrldq $1, %%xmm1\n" - "psrldq $1, %%xmm6\n" - "pand %%xmm4, %%xmm2\n" - "pand %%xmm4, %%xmm7\n" - "pslldq $4, %%xmm4\n" - "psrldq $2, %%xmm2\n" - "psrldq $2, %%xmm7\n" - "pand %%xmm4, %%xmm3\n" - "pand %%xmm4, %%xmm8\n" - "por %%xmm1, %%xmm0\n" - "psrldq $3, %%xmm3\n" - "psrldq $3, %%xmm8\n" - "por %%xmm2, %%xmm0\n" - "por %%xmm6, %%xmm5\n" - "por %%xmm3, %%xmm0\n" - "por %%xmm7, %%xmm5\n" - "movdq2q %%xmm0, %%mm0\n" - "por %%xmm8, %%xmm5\n" - "movdqa %%xmm5, %%xmm1\n" - "pslldq $12, %%xmm5\n" - "psrldq $4, %%xmm1\n" - "por %%xmm5, %%xmm0\n" - "psrldq $8, %%xmm0\n" - "movq %%mm0, (%1)\n" - "movdq2q %%xmm0, %%mm1\n" - "movdq2q %%xmm1, %%mm2\n" - "movq %%mm1, 8(%1)\n" - "movq %%mm2, 16(%1)\n" - : - : "r" (_s), "r" (_d)); + "movdqa 16(%0), %%xmm5\n" + "movdqa %%xmm0, %%xmm1\n" + "movdqa %%xmm0, %%xmm2\n" + "movdqa %%xmm0, %%xmm3\n" + "pand %%xmm4, %%xmm0\n" + "movdqa %%xmm5, %%xmm6\n" + "movdqa %%xmm5, %%xmm7\n" + "movdqa %%xmm5, %%xmm8\n" + "pand %%xmm4, %%xmm5\n" + "pslldq $4, %%xmm4\n" + "pand %%xmm4, %%xmm1\n" + "pand %%xmm4, %%xmm6\n" + "pslldq $4, %%xmm4\n" + "psrldq $1, %%xmm1\n" + "psrldq $1, %%xmm6\n" + "pand %%xmm4, %%xmm2\n" + "pand %%xmm4, %%xmm7\n" + "pslldq $4, %%xmm4\n" + "psrldq $2, %%xmm2\n" + "psrldq $2, %%xmm7\n" + "pand %%xmm4, %%xmm3\n" + "pand %%xmm4, %%xmm8\n" + "por %%xmm1, %%xmm0\n" + "psrldq $3, %%xmm3\n" + "psrldq $3, %%xmm8\n" + "por %%xmm2, %%xmm0\n" + "por %%xmm6, %%xmm5\n" + "por %%xmm3, %%xmm0\n" + "por %%xmm7, %%xmm5\n" + "movdq2q %%xmm0, %%mm0\n" + "por %%xmm8, %%xmm5\n" + "movdqa %%xmm5, %%xmm1\n" + "pslldq $12, %%xmm5\n" + "psrldq $4, %%xmm1\n" + "por %%xmm5, %%xmm0\n" + "psrldq $8, %%xmm0\n" + "movq %%mm0, (%1)\n" + "movdq2q %%xmm0, %%mm1\n" + "movdq2q %%xmm1, %%mm2\n" + "movq %%mm1, 8(%1)\n" + "movq %%mm2, 16(%1)\n"::"r" (_s), "r"(_d)); _s += 32; _d += 24; } } -#endif /* !(HAVE_MACOSX || HAVE_32B_LINUX) */ +#endif /* !(HAVE_MACOSX || HAVE_32B_LINUX) */ inline void compress_copyline64(unsigned char *dst, unsigned char *src, int len) { register uint64_t *d, *s; - register uint64_t a1,a2,a3,a4; + register uint64_t a1, a2, a3, a4; - d = (uint64_t *)dst; - s = (uint64_t *)src; + d = (uint64_t *) dst; + s = (uint64_t *) src; - while(len-- > 0) { + while (len-- > 0) { a1 = *(s++); a2 = *(s++); a3 = *(s++); @@ -230,50 +231,46 @@ inline void compress_copyline64(unsigned char *dst, unsigned char *src, int len) a4 = (a4 & 0xffffff) | ((a4 >> 8) & 0xffffff000000); *(d++) = a1 | (a2 << 48); /* 0xa2|a2|a1|a1|a1|a1|a1|a1 */ - *(d++) = (a2 >> 16)|(a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ - *(d++) = (a3 >> 32)|(a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ + *(d++) = (a2 >> 16) | (a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ + *(d++) = (a3 >> 32) | (a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ } } - /* linear blend deinterlace */ void compress_deinterlace(unsigned char *buffer) { - int i,j; - long pitch = 1920*2; - register long pitch2 = pitch*2; + int i, j; + long pitch = 1920 * 2; + register long pitch2 = pitch * 2; unsigned char *bline1, *bline2, *bline3; register unsigned char *line1, *line2, *line3; bline1 = buffer; bline2 = buffer + pitch; - bline3 = buffer + 3*pitch; - for(i=0; i < 1920*2; i+=16) { + bline3 = buffer + 3 * pitch; + for (i = 0; i < 1920 * 2; i += 16) { /* preload first two lines */ - asm volatile( - "movdqa (%0), %%xmm0\n" - "movdqa (%1), %%xmm1\n" - : - : "r" ((unsigned long *)bline1), - "r" ((unsigned long *)bline2)); + asm volatile ("movdqa (%0), %%xmm0\n" + "movdqa (%1), %%xmm1\n"::"r" ((unsigned long *) + bline1), + "r"((unsigned long *)bline2)); line1 = bline2; line2 = bline2 + pitch; line3 = bline3; - for(j=0; j < 1076; j+=2) { - asm volatile( - "movdqa (%1), %%xmm2\n" - "pavgb %%xmm2, %%xmm0\n" - "pavgb %%xmm1, %%xmm0\n" - "movdqa (%2), %%xmm1\n" - "movdqa %%xmm0, (%0)\n" - "pavgb %%xmm1, %%xmm0\n" - "pavgb %%xmm2, %%xmm0\n" - "movdqa %%xmm0, (%1)\n" - : - :"r" ((unsigned long *)line1), - "r" ((unsigned long *)line2), - "r" ((unsigned long *)line3) - ); + for (j = 0; j < 1076; j += 2) { + asm volatile ("movdqa (%1), %%xmm2\n" + "pavgb %%xmm2, %%xmm0\n" + "pavgb %%xmm1, %%xmm0\n" + "movdqa (%2), %%xmm1\n" + "movdqa %%xmm0, (%0)\n" + "pavgb %%xmm1, %%xmm0\n" + "pavgb %%xmm2, %%xmm0\n" + "movdqa %%xmm0, (%1)\n"::"r" ((unsigned + long *) + line1), + "r"((unsigned long *)line2), + "r"((unsigned long *)line3) + ); line1 += pitch2; line2 += pitch2; line3 += pitch2; @@ -284,116 +281,123 @@ void compress_deinterlace(unsigned char *buffer) } } -void compress_data(void *args, struct video_frame * tx) +void compress_data(void *args, struct video_frame *tx) { - /* This thread will be called from main.c and handle the compress_threads */ - struct video_compress * compress= (struct video_compress *)args; - int x,total=0; - int i; - unsigned char *line1,*line2; + /* This thread will be called from main.c and handle the compress_threads */ + struct video_compress *compress = (struct video_compress *)args; + int x, total = 0; + int i; + unsigned char *line1, *line2; - line1=(unsigned char *)tx->data; - line2=compress->output_data; - /* First 10->8 bit conversion */ - if (bitdepth == 10) { - for(x=0;xdata; + line2 = compress->output_data; + /* First 10->8 bit conversion */ + if (bitdepth == 10) { + for (x = 0; x < HD_HEIGHT; x += 2) { #if (HAVE_MACOSX || HAVE_32B_LINUX) - compress_copyline64(line2, line1, 5120/32); - compress_copyline64(line2+3840, line1+5120*540, 5120/32); - -#else /* (HAVE_MACOSX || HAVE_32B_LINUX) */ - compress_copyline128(line2, line1, 5120/32); - compress_copyline128(line2+3840, line1+5120*540, 5120/32); -#endif /* (HAVE_MACOSX || HAVE_32B_LINUX) */ - line1 += 5120; - line2 += 2*3840; - } - } else { - if (progressive == 1) { - memcpy(line2, line1, hd_size_x*hd_size_y*hd_color_bpp); - } else { - for(i=0; i<1080; i+=2) { - memcpy(line2, line1, hd_size_x*hd_color_bpp); - memcpy(line2+hd_size_x*hd_color_bpp, line1+hd_size_x*hd_color_bpp*540, hd_size_x*hd_color_bpp); - line1 += hd_size_x*hd_color_bpp; - line2 += 2*hd_size_x*hd_color_bpp; - } - } - } + compress_copyline64(line2, line1, 5120 / 32); + compress_copyline64(line2 + 3840, line1 + 5120 * 540, + 5120 / 32); - compress_deinterlace(compress->output_data); +#else /* (HAVE_MACOSX || HAVE_32B_LINUX) */ + compress_copyline128(line2, line1, 5120 / 32); + compress_copyline128(line2 + 3840, line1 + 5120 * 540, + 5120 / 32); +#endif /* (HAVE_MACOSX || HAVE_32B_LINUX) */ + line1 += 5120; + line2 += 2 * 3840; + } + } else { + if (progressive == 1) { + memcpy(line2, line1, + hd_size_x * hd_size_y * hd_color_bpp); + } else { + for (i = 0; i < 1080; i += 2) { + memcpy(line2, line1, hd_size_x * hd_color_bpp); + memcpy(line2 + hd_size_x * hd_color_bpp, + line1 + hd_size_x * hd_color_bpp * 540, + hd_size_x * hd_color_bpp); + line1 += hd_size_x * hd_color_bpp; + line2 += 2 * hd_size_x * hd_color_bpp; + } + } + } - for(x=0;xgo[x]=1; - } + compress_deinterlace(compress->output_data); - while(total!=1036800){ - //This is just getting silly... - total=0; - for(x=0;xlen[x]; - } - } + for (x = 0; x < NUM_THREADS; x++) { + compress->go[x] = 1; + } - tx->data=(char *)compress->out; - tx->colour_mode=DXT_1080; - tx->data_len=total; + while (total != 1036800) { + //This is just getting silly... + total = 0; + for (x = 0; x < NUM_THREADS; x++) { + total += compress->len[x]; + } + } + + tx->data = (char *)compress->out; + tx->colour_mode = DXT_1080; + tx->data_len = total; } - static void compress_thread(void *args) { - struct video_compress * compress= (struct video_compress *)args; - int myId,myEnd,myStart,range,x; - unsigned char *retv, *input; + struct video_compress *compress = (struct video_compress *)args; + int myId, myEnd, myStart, range, x; + unsigned char *retv, *input; - pthread_mutex_lock(&(compress->lock)); - myId=compress->thread_count; - compress->thread_count++; - pthread_mutex_unlock(&(compress->lock)); - range=1920*1080/NUM_THREADS; - myStart=myId*range; - myEnd=(myId+1)*range; - fprintf(stderr, "Thread %d online, handling elements %d - %d\n",myId,myStart,myEnd-1); + pthread_mutex_lock(&(compress->lock)); + myId = compress->thread_count; + compress->thread_count++; + pthread_mutex_unlock(&(compress->lock)); + range = 1920 * 1080 / NUM_THREADS; + myStart = myId * range; + myEnd = (myId + 1) * range; + fprintf(stderr, "Thread %d online, handling elements %d - %d\n", myId, + myStart, myEnd - 1); + while (1) { + while (compress->go[myId] == 0) { + //Busywait + } + retv = compress->buffer[myId]; + input = + (compress->output_data) + + (myId * 1920 * 1080 * 2 / NUM_THREADS); + /* Repack the data to YUV 4:4:4 Format */ + for (x = 0; x < range; x += 2) { + retv[4 * x] = input[2 * x + 1]; //Y1 + retv[4 * x + 1] = input[2 * x]; //U1 + retv[4 * x + 2] = input[2 * x + 2]; //V1 + retv[4 * x + 3] = 255; //Alpha - while(1) { - while(compress->go[myId]==0) { - //Busywait - } - retv=compress->buffer[myId]; - input=(compress->output_data)+(myId*1920*1080*2/NUM_THREADS); - /* Repack the data to YUV 4:4:4 Format */ - for(x=0;xlen[myId] = + DirectDXT1(retv, + (compress->out) + myId * 1036800 / (NUM_THREADS), + 1920, 1080 / NUM_THREADS); + compress->go[myId] = 0; - retv[4*x+4]=input[2*x+3]; //Y2 - retv[4*x+5]=input[2*x]; //U1 - retv[4*x+6]=input[2*x+2]; //V1 - retv[4*x+7]=255; //Alpha - } - compress->len[myId]=DirectDXT1(retv,(compress->out)+myId*1036800/(NUM_THREADS),1920,1080/NUM_THREADS); - compress->go[myId]=0; - - } + } } void compress_exit(void *args) { - struct video_compress * compress= (struct video_compress *)args; - int x; + struct video_compress *compress = (struct video_compress *)args; + int x; - for(x=0;xthread_count;x++){ - pthread_kill(compress->thread_ids[x],SIGKILL); - } + for (x = 0; x < compress->thread_count; x++) { + pthread_kill(compress->thread_ids[x], SIGKILL); + } - free(compress->buffer[0]); - free(compress->buffer[1]); - free(compress->buffer[2]); - free(compress->buffer[3]); + free(compress->buffer[0]); + free(compress->buffer[1]); + free(compress->buffer[2]); + free(compress->buffer[3]); } - - diff --git a/ultragrid/src/video_display.c b/ultragrid/src/video_display.c index daa1387a6..860a70b59 100644 --- a/ultragrid/src/video_display.c +++ b/ultragrid/src/video_display.c @@ -73,167 +73,162 @@ */ typedef struct { - display_id_t id; - display_type_t *(*func_probe)(void); - void *(*func_init)(char *fmt); - void (*func_done)(void *state); - char *(*func_getf)(void *state); - int (*func_putf)(void *state, char *frame); - display_colour_t (*func_colour)(void *state); + display_id_t id; + display_type_t *(*func_probe) (void); + void *(*func_init) (char *fmt); + void (*func_done) (void *state); + char *(*func_getf) (void *state); + int (*func_putf) (void *state, char *frame); + display_colour_t(*func_colour) (void *state); } display_table_t; static display_table_t display_device_table[] = { #ifndef X_DISPLAY_MISSING - { - 0, - display_xv_probe, - display_xv_init, - display_xv_done, - display_xv_getf, - display_xv_putf, - display_xv_colour, - }, - { - 0, - display_x11_probe, - display_x11_init, - display_x11_done, - display_x11_getf, - display_x11_putf, - display_x11_colour, - }, + { + 0, + display_xv_probe, + display_xv_init, + display_xv_done, + display_xv_getf, + display_xv_putf, + display_xv_colour, + }, + { + 0, + display_x11_probe, + display_x11_init, + display_x11_done, + display_x11_getf, + display_x11_putf, + display_x11_colour, + }, #ifdef HAVE_SDL - { - 0, - display_sdl_probe, - display_sdl_init, - display_sdl_done, - display_sdl_getf, - display_sdl_putf, - display_sdl_colour, - }, + { + 0, + display_sdl_probe, + display_sdl_init, + display_sdl_done, + display_sdl_getf, + display_sdl_putf, + display_sdl_colour, + }, #ifdef HAVE_GL - { - 0, - display_gl_probe, - display_gl_init, - display_gl_done, - display_gl_getf, - display_gl_putf, - display_gl_colour, - }, + { + 0, + display_gl_probe, + display_gl_init, + display_gl_done, + display_gl_getf, + display_gl_putf, + display_gl_colour, + }, #ifdef HAVE_SAGE - { - 0, - display_sage_probe, - display_sage_init, - display_sage_done, - display_sage_getf, - display_sage_putf, - display_sage_colour, - }, -#endif /* HAVE_SAGE */ + { + 0, + display_sage_probe, + display_sage_init, + display_sage_done, + display_sage_getf, + display_sage_putf, + display_sage_colour, + }, +#endif /* HAVE_SAGE */ #ifdef HAVE_FASTDXT - { - 0, - display_dxt_probe, - display_dxt_init, - display_dxt_done, - display_dxt_getf, - display_dxt_putf, - display_dxt_colour, - }, -#endif /* HAVE_FASTDXT */ -#endif /* HAVE_GL */ -#endif /* HAVE_SDL */ -#endif /* X_DISPLAY_MISSING */ + { + 0, + display_dxt_probe, + display_dxt_init, + display_dxt_done, + display_dxt_getf, + display_dxt_putf, + display_dxt_colour, + }, +#endif /* HAVE_FASTDXT */ +#endif /* HAVE_GL */ +#endif /* HAVE_SDL */ +#endif /* X_DISPLAY_MISSING */ #ifdef HAVE_HDSTATION - { - 0, - display_hdstation_probe, - display_hdstation_init, - display_hdstation_done, - display_hdstation_getf, - display_hdstation_putf, - display_hdstation_colour, - }, -#endif /* HAVE_HDSTATION */ + { + 0, + display_hdstation_probe, + display_hdstation_init, + display_hdstation_done, + display_hdstation_getf, + display_hdstation_putf, + display_hdstation_colour, + }, +#endif /* HAVE_HDSTATION */ #ifdef HAVE_MACOSX - { - 0, - display_quicktime_probe, - display_quicktime_init, - display_quicktime_done, - display_quicktime_getf, - display_quicktime_putf, - display_quicktime_colour, - }, -#endif /* HAVE_MACOSX */ - { - 0, - display_null_probe, - display_null_init, - display_null_done, - display_null_getf, - display_null_putf, - display_null_colour, - } + { + 0, + display_quicktime_probe, + display_quicktime_init, + display_quicktime_done, + display_quicktime_getf, + display_quicktime_putf, + display_quicktime_colour, + }, +#endif /* HAVE_MACOSX */ + { + 0, + display_null_probe, + display_null_init, + display_null_done, + display_null_getf, + display_null_putf, + display_null_colour, + } }; #define DISPLAY_DEVICE_TABLE_SIZE (sizeof(display_device_table) / sizeof(display_table_t)) -static display_type_t *available_devices[DISPLAY_DEVICE_TABLE_SIZE]; -static int available_device_count = 0; +static display_type_t *available_devices[DISPLAY_DEVICE_TABLE_SIZE]; +static int available_device_count = 0; -int -display_init_devices(void) +int display_init_devices(void) { - unsigned int i; - display_type_t *dt; + unsigned int i; + display_type_t *dt; - assert(available_device_count == 0); + assert(available_device_count == 0); - for (i = 0; i < DISPLAY_DEVICE_TABLE_SIZE; i++) { - dt = display_device_table[i].func_probe(); - if (dt != NULL) { - display_device_table[i].id = dt->id; - available_devices[available_device_count++] = dt; - } - } - return 0; + for (i = 0; i < DISPLAY_DEVICE_TABLE_SIZE; i++) { + dt = display_device_table[i].func_probe(); + if (dt != NULL) { + display_device_table[i].id = dt->id; + available_devices[available_device_count++] = dt; + } + } + return 0; } -void -display_free_devices(void) +void display_free_devices(void) { - int i; + int i; - for (i = 0; i < available_device_count; i++) { - free(available_devices[i]); - available_devices[i] = NULL; - } - available_device_count = 0; + for (i = 0; i < available_device_count; i++) { + free(available_devices[i]); + available_devices[i] = NULL; + } + available_device_count = 0; } -int -display_get_device_count(void) +int display_get_device_count(void) { - return available_device_count; + return available_device_count; } -display_type_t * -display_get_device_details(int index) +display_type_t *display_get_device_details(int index) { - assert(index < available_device_count); - assert(available_devices[index] != NULL); + assert(index < available_device_count); + assert(available_devices[index] != NULL); - return available_devices[index]; + return available_devices[index]; } -display_id_t -display_get_null_device_id(void) +display_id_t display_get_null_device_id(void) { - return DISPLAY_NULL_ID; + return DISPLAY_NULL_ID; } /* @@ -243,59 +238,55 @@ display_get_null_device_id(void) #define DISPLAY_MAGIC 0x01ba7ef1 struct display { - uint32_t magic; - int index; - void *state; + uint32_t magic; + int index; + void *state; }; -struct display * -display_init(display_id_t id, char *fmt) +struct display *display_init(display_id_t id, char *fmt) { - unsigned int i; + unsigned int i; - for (i = 0; i < DISPLAY_DEVICE_TABLE_SIZE; i++) { - if (display_device_table[i].id == id) { - struct display *d = (struct display *) malloc(sizeof(struct display)); - d->magic = DISPLAY_MAGIC; - d->state = display_device_table[i].func_init(fmt); - d->index = i; - if (d->state == NULL) { - debug_msg("Unable to start display 0x%08lx\n", id); - free(d); - return NULL; - } - return d; - } - } - debug_msg("Unknown display id: 0x%08x\n", id); - return NULL; + for (i = 0; i < DISPLAY_DEVICE_TABLE_SIZE; i++) { + if (display_device_table[i].id == id) { + struct display *d = + (struct display *)malloc(sizeof(struct display)); + d->magic = DISPLAY_MAGIC; + d->state = display_device_table[i].func_init(fmt); + d->index = i; + if (d->state == NULL) { + debug_msg("Unable to start display 0x%08lx\n", + id); + free(d); + return NULL; + } + return d; + } + } + debug_msg("Unknown display id: 0x%08x\n", id); + return NULL; } -void -display_done(struct display *d) +void display_done(struct display *d) { - assert(d->magic == DISPLAY_MAGIC); - display_device_table[d->index].func_done(d->state); + assert(d->magic == DISPLAY_MAGIC); + display_device_table[d->index].func_done(d->state); } -struct video_frame* -display_get_frame(struct display *d) +struct video_frame *display_get_frame(struct display *d) { - assert(d->magic == DISPLAY_MAGIC); - return display_device_table[d->index].func_getf(d->state); + assert(d->magic == DISPLAY_MAGIC); + return display_device_table[d->index].func_getf(d->state); } -void -display_put_frame(struct display *d, char *frame) +void display_put_frame(struct display *d, char *frame) { - assert(d->magic == DISPLAY_MAGIC); - display_device_table[d->index].func_putf(d->state, frame); + assert(d->magic == DISPLAY_MAGIC); + display_device_table[d->index].func_putf(d->state, frame); } -display_colour_t -display_get_colour_mode(struct display *d) +display_colour_t display_get_colour_mode(struct display *d) { - assert(d->magic == DISPLAY_MAGIC); - return display_device_table[d->index].func_colour(d->state); + assert(d->magic == DISPLAY_MAGIC); + return display_device_table[d->index].func_colour(d->state); } - diff --git a/ultragrid/src/video_display/dxt.c b/ultragrid/src/video_display/dxt.c index 626048fa3..3367963f0 100644 --- a/ultragrid/src/video_display/dxt.c +++ b/ultragrid/src/video_display/dxt.c @@ -54,11 +54,11 @@ #include #include #include -#else /* HAVE_MACOSX */ +#else /* HAVE_MACOSX */ #include #include #include -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ #include #include "compat/platform_semaphore.h" #include @@ -74,7 +74,6 @@ #include "video_display/dxt.h" // #define glGetProcAddress(n) glXGetProcAddressARB((GLubyte *) n) - #define degree_to_radian(x) ( M_PI * x / 180.0f ) #define radian_to_degree(x) ( x * (180.0f / M_PI) ) @@ -83,476 +82,501 @@ #define MAGIC_DXT DISPLAY_DXT_ID #define SIZE 1036800 - struct state_sdl { - Display *display; - unsigned int x_res_x; - unsigned int x_res_y; + Display *display; + unsigned int x_res_x; + unsigned int x_res_y; - int vw_depth; - SDL_Overlay *vw_image; - GLubyte *buffers[2]; - GLubyte *outbuffer; - GLubyte *y, *u, *v; //Guess what this might be... - GLhandleARB VSHandle,FSHandle,PHandle; - int image_display, image_network; - GLuint texture[4]; + int vw_depth; + SDL_Overlay *vw_image; + GLubyte *buffers[2]; + GLubyte *outbuffer; + GLubyte *y, *u, *v; //Guess what this might be... + GLhandleARB VSHandle, FSHandle, PHandle; + int image_display, image_network; + GLuint texture[4]; /* Thread related information follows... */ - pthread_t thread_id; - sem_t semaphore; + pthread_t thread_id; + sem_t semaphore; /* For debugging... */ - uint32_t magic; + uint32_t magic; - SDL_Surface *sdl_screen; - SDL_Rect rect; + SDL_Surface *sdl_screen; + SDL_Rect rect; - char *FProgram,*VProgram; + char *FProgram, *VProgram; }; /* Prototyping */ -static void * display_thread_dxt(void *arg); +static void *display_thread_dxt(void *arg); void dxt_resize_window(int width, int height); void dxt_bind_texture(void *args); void dxt_draw(); -void * display_dxt_init(void); +void *display_dxt_init(void); void dxt_arb_init(void *arg); void glsl_dxt_init(void *arg); void dxt_loadShader(void *arg, char *filename); void dxt_draw(); - + #ifdef DEBUG void dxt_check_error() { - GLenum msg; - int flag=0; - msg=glGetError(); - while(msg!=GL_NO_ERROR) { - flag=1; - switch(msg){ - case GL_INVALID_ENUM: - fprintf(stderr, "GL_INVALID_ENUM\n"); - break; - case GL_INVALID_VALUE: - fprintf(stderr, "GL_INVALID_VALUE\n"); - break; - case GL_INVALID_OPERATION: - fprintf(stderr, "GL_INVALID_OPERATION\n"); - break; - case GL_STACK_OVERFLOW: - fprintf(stderr, "GL_STACK_OVERFLOW\n"); - break; - case GL_STACK_UNDERFLOW: - fprintf(stderr, "GL_STACK_UNDERFLOW\n"); - break; - case GL_OUT_OF_MEMORY: - fprintf(stderr, "GL_OUT_OF_MEMORY\n"); - break; - default: - fprintf(stderr, "wft mate? Unknown GL ERROR: %p\n",msg); - break; - } - msg=glGetError(); - } - if(flag) - exit(1); + GLenum msg; + int flag = 0; + msg = glGetError(); + while (msg != GL_NO_ERROR) { + flag = 1; + switch (msg) { + case GL_INVALID_ENUM: + fprintf(stderr, "GL_INVALID_ENUM\n"); + break; + case GL_INVALID_VALUE: + fprintf(stderr, "GL_INVALID_VALUE\n"); + break; + case GL_INVALID_OPERATION: + fprintf(stderr, "GL_INVALID_OPERATION\n"); + break; + case GL_STACK_OVERFLOW: + fprintf(stderr, "GL_STACK_OVERFLOW\n"); + break; + case GL_STACK_UNDERFLOW: + fprintf(stderr, "GL_STACK_UNDERFLOW\n"); + break; + case GL_OUT_OF_MEMORY: + fprintf(stderr, "GL_OUT_OF_MEMORY\n"); + break; + default: + fprintf(stderr, "wft mate? Unknown GL ERROR: %p\n", + msg); + break; + } + msg = glGetError(); + } + if (flag) + exit(1); } -#endif /* DEBUG */ +#endif /* DEBUG */ -void * display_dxt_init(void) +void *display_dxt_init(void) { - struct state_sdl *s; + struct state_sdl *s; - int ret; - int itemp; - unsigned int utemp; - Window wtemp; + int ret; + int itemp; + unsigned int utemp; + Window wtemp; - s = (struct state_sdl *) calloc(1,sizeof(struct state_sdl)); - s->magic = MAGIC_DXT; + s = (struct state_sdl *)calloc(1, sizeof(struct state_sdl)); + s->magic = MAGIC_DXT; - if (!(s->display = XOpenDisplay(NULL))) { - printf("Unable to open display DXT: XOpenDisplay.\n"); - return NULL; - } + if (!(s->display = XOpenDisplay(NULL))) { + printf("Unable to open display DXT: XOpenDisplay.\n"); + return NULL; + } - /* Get XWindows resolution */ - ret = XGetGeometry(s->display, DefaultRootWindow(s->display), &wtemp, &itemp, &itemp, &(s->x_res_x), &(s->x_res_y), &utemp, &utemp); - - s->rect.w = HD_WIDTH; - s->rect.h =HD_HEIGHT; - if ((s->x_res_x - HD_WIDTH) > 0) { - s->rect.x = (s->x_res_x - HD_WIDTH) / 2; - } else { - s->rect.x = 0; - } - if ((s->x_res_y - HD_HEIGHT) > 0) { - s->rect.y = (s->x_res_y - HD_HEIGHT) / 2; - } else { - s->rect.y = 0; - } + /* Get XWindows resolution */ + ret = + XGetGeometry(s->display, DefaultRootWindow(s->display), &wtemp, + &itemp, &itemp, &(s->x_res_x), &(s->x_res_y), &utemp, + &utemp); - s->buffers[0]=malloc(HD_WIDTH*HD_HEIGHT*3); - s->buffers[1]=malloc(HD_WIDTH*HD_HEIGHT*3); - s->outbuffer=malloc(HD_WIDTH*HD_HEIGHT*4); - s->image_network=0; - s->image_display=1; + s->rect.w = HD_WIDTH; + s->rect.h = HD_HEIGHT; + if ((s->x_res_x - HD_WIDTH) > 0) { + s->rect.x = (s->x_res_x - HD_WIDTH) / 2; + } else { + s->rect.x = 0; + } + if ((s->x_res_y - HD_HEIGHT) > 0) { + s->rect.y = (s->x_res_y - HD_HEIGHT) / 2; + } else { + s->rect.y = 0; + } - asm("emms\n"); + s->buffers[0] = malloc(HD_WIDTH * HD_HEIGHT * 3); + s->buffers[1] = malloc(HD_WIDTH * HD_HEIGHT * 3); + s->outbuffer = malloc(HD_WIDTH * HD_HEIGHT * 4); + s->image_network = 0; + s->image_display = 1; - platform_sem_init(&s->semaphore, 0, 0); - if (pthread_create(&(s->thread_id), NULL, display_thread_dxt, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } + asm("emms\n"); - return (void*)s; + platform_sem_init(&s->semaphore, 0, 0); + if (pthread_create(&(s->thread_id), NULL, display_thread_dxt, (void *)s) + != 0) { + perror("Unable to create display thread\n"); + return NULL; + } + + return (void *)s; } void dxt_loadShader(void *arg, char *filename) { - struct state_sdl *s = (struct state_sdl *) arg; - struct stat file; - s = (struct state_sdl *) calloc(1,sizeof(struct state_sdl)); + struct state_sdl *s = (struct state_sdl *)arg; + struct stat file; + s = (struct state_sdl *)calloc(1, sizeof(struct state_sdl)); - stat(filename,&file); - s->FProgram=calloc(file.st_size+1,sizeof(char)); - FILE *fh; - fh=fopen(filename, "r"); - if(!fh){ - perror(filename); - exit(113); - } - fread(s->FProgram,sizeof(char),file.st_size,fh); - fclose(fh); + stat(filename, &file); + s->FProgram = calloc(file.st_size + 1, sizeof(char)); + FILE *fh; + fh = fopen(filename, "r"); + if (!fh) { + perror(filename); + exit(113); + } + fread(s->FProgram, sizeof(char), file.st_size, fh); + fclose(fh); } void dxt_arb_init(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; - char *log; - /* Set up program objects. */ - s->PHandle=glCreateProgramObjectARB(); - s->FSHandle=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); - s->VSHandle=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); + struct state_sdl *s = (struct state_sdl *)arg; + char *log; + /* Set up program objects. */ + s->PHandle = glCreateProgramObjectARB(); + s->FSHandle = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + s->VSHandle = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); - /* Compile Shader */ - assert(s->FProgram!=NULL); - glShaderSourceARB(s->FSHandle,1,(const GLcharARB**)&(s->FProgram),NULL); - glCompileShaderARB(s->FSHandle); - glShaderSourceARB(s->VSHandle,1,(const GLcharARB**)&(s->VProgram),NULL); - glCompileShaderARB(s->VSHandle); + /* Compile Shader */ + assert(s->FProgram != NULL); + glShaderSourceARB(s->FSHandle, 1, (const GLcharARB **)&(s->FProgram), + NULL); + glCompileShaderARB(s->FSHandle); + glShaderSourceARB(s->VSHandle, 1, (const GLcharARB **)&(s->VProgram), + NULL); + glCompileShaderARB(s->VSHandle); - /* Print compile log */ - log=calloc(32768,sizeof(char)); - glGetInfoLogARB(s->FSHandle,32768,NULL,log); - printf("Compile Log: %s\n", log); - free(log); - log=calloc(32768,sizeof(char)); - glGetInfoLogARB(s->VSHandle,32768,NULL,log); - printf("Compile Log: %s\n", log); - free(log); + /* Print compile log */ + log = calloc(32768, sizeof(char)); + glGetInfoLogARB(s->FSHandle, 32768, NULL, log); + printf("Compile Log: %s\n", log); + free(log); + log = calloc(32768, sizeof(char)); + glGetInfoLogARB(s->VSHandle, 32768, NULL, log); + printf("Compile Log: %s\n", log); + free(log); - /* Attach and link our program */ - glAttachObjectARB(s->PHandle,s->FSHandle); - glAttachObjectARB(s->PHandle,s->VSHandle); - glLinkProgramARB(s->PHandle); + /* Attach and link our program */ + glAttachObjectARB(s->PHandle, s->FSHandle); + glAttachObjectARB(s->PHandle, s->VSHandle); + glLinkProgramARB(s->PHandle); - /* Print link log. */ - log=calloc(32768,sizeof(char)); - glGetInfoLogARB(s->PHandle,32768,NULL,log); - printf("Link Log: %s\n", log); - free(log); + /* Print link log. */ + log = calloc(32768, sizeof(char)); + glGetInfoLogARB(s->PHandle, 32768, NULL, log); + printf("Link Log: %s\n", log); + free(log); - /* Finally, use the program. */ - glUseProgramObjectARB(s->PHandle); + /* Finally, use the program. */ + glUseProgramObjectARB(s->PHandle); } void glsl_dxt_init(void *arg) { - //TODO: Add log - struct state_sdl *s = (struct state_sdl *) arg; + //TODO: Add log + struct state_sdl *s = (struct state_sdl *)arg; - s->PHandle=glCreateProgram(); - s->FSHandle=glCreateShader(GL_FRAGMENT_SHADER); + s->PHandle = glCreateProgram(); + s->FSHandle = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(s->FSHandle,1,(const GLcharARB**)&(s->FProgram),NULL); - glCompileShader(s->FSHandle); + glShaderSource(s->FSHandle, 1, (const GLcharARB **)&(s->FProgram), + NULL); + glCompileShader(s->FSHandle); - glAttachShader(s->PHandle,s->FSHandle); + glAttachShader(s->PHandle, s->FSHandle); - glLinkProgram(s->PHandle); - glUseProgram(s->PHandle); + glLinkProgram(s->PHandle); + glUseProgram(s->PHandle); } void dxt_resize_window(int width, int height) { - /* Height / width ration */ - GLfloat ratio; - GLint y = 0; + /* Height / width ration */ + GLfloat ratio; + GLint y = 0; - /* Protect against a divide by zero */ - if ( height == 0 ) - height = 1; + /* Protect against a divide by zero */ + if (height == 0) + height = 1; + if ((height > HD_HEIGHT) && (width >= HD_WIDTH)) { + y = (height - HD_HEIGHT) / 2; + height = HD_HEIGHT; + } + ratio = + (GLfloat) width / (GLfloat) (((float)(width * HD_HEIGHT)) / + ((float)HD_WIDTH)); - if ((height > HD_HEIGHT) && (width >= HD_WIDTH)) { - y = (height - HD_HEIGHT) / 2; - height = HD_HEIGHT; - } - ratio = ( GLfloat )width / ( GLfloat )(((float)(width * HD_HEIGHT))/((float)HD_WIDTH)); + glViewport(0, y, (GLint) width, (GLint) height); - glViewport( 0, y, ( GLint )width, (GLint)height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity( ); + glScalef(1, + (((float)(width * HD_HEIGHT)) / ((float)HD_WIDTH)) / + ((float)height), 1); + gluPerspective(45.0f, ratio, 0.1f, 100.0f); - glScalef(1, (((float)(width * HD_HEIGHT))/((float)HD_WIDTH))/((float)height), 1); - gluPerspective(45.0f, ratio, 0.1f, 100.0f); - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity( ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); } void dxt_bind_texture(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; - static int i=0; + struct state_sdl *s = (struct state_sdl *)arg; + static int i = 0; - //TODO: does OpenGL use different stuff here? - glActiveTexture(GL_TEXTURE0); - i=glGetUniformLocationARB(s->PHandle,"yuvtex"); - glUniform1iARB(i,0); - glBindTexture(GL_TEXTURE_2D,0); - glCompressedTexImage2D(GL_TEXTURE_2D, 0,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,1920,1080, 0,(1920*1080/16)*8, s->buffers[s->image_display]); + //TODO: does OpenGL use different stuff here? + glActiveTexture(GL_TEXTURE0); + i = glGetUniformLocationARB(s->PHandle, "yuvtex"); + glUniform1iARB(i, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, + GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 1920, 1080, 0, + (1920 * 1080 / 16) * 8, + s->buffers[s->image_display]); -} +} void dxt_draw() { - glLoadIdentity( ); - glTranslatef( 0.0f, 0.0f, -1.35f ); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -1.35f); - glBegin(GL_QUADS); - /* Front Face */ - /* Bottom Left Of The Texture and Quad */ - glTexCoord2f( 0.0f, 1.0f ); glVertex2f( -1.0f, -0.5625f); - /* Bottom Right Of The Texture and Quad */ - glTexCoord2f( 1.0f, 1.0f ); glVertex2f( 1.0f, -0.5625f); - /* Top Right Of The Texture and Quad */ - glTexCoord2f( 1.0f, 0.0f ); glVertex2f( 1.0f, 0.5625f); - /* Top Left Of The Texture and Quad */ - glTexCoord2f( 0.0f, 0.0f ); glVertex2f( -1.0f, 0.5625f); - glEnd( ); + glBegin(GL_QUADS); + /* Front Face */ + /* Bottom Left Of The Texture and Quad */ + glTexCoord2f(0.0f, 1.0f); + glVertex2f(-1.0f, -0.5625f); + /* Bottom Right Of The Texture and Quad */ + glTexCoord2f(1.0f, 1.0f); + glVertex2f(1.0f, -0.5625f); + /* Top Right Of The Texture and Quad */ + glTexCoord2f(1.0f, 0.0f); + glVertex2f(1.0f, 0.5625f); + /* Top Left Of The Texture and Quad */ + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, 0.5625f); + glEnd(); - SDL_GL_SwapBuffers( ); + SDL_GL_SwapBuffers(); } -static void * display_thread_dxt(void *arg) +static void *display_thread_dxt(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; + struct state_sdl *s = (struct state_sdl *)arg; #ifndef HAVE_MACOSX - int i; -#endif /* HAVE_MACOSX */ - const SDL_VideoInfo *videoInfo; - int videoFlags; - /* FPS */ - static GLint T0 = 0; - static GLint Frames = 0; + int i; +#endif /* HAVE_MACOSX */ + const SDL_VideoInfo *videoInfo; + int videoFlags; + /* FPS */ + static GLint T0 = 0; + static GLint Frames = 0; #ifdef HAVE_MACOSX - /* Startup function to call when running Cocoa code from a Carbon application. Whatever the fuck that means. */ - /* Avoids uncaught exception (1002) when creating CGSWindow */ - NSApplicationLoad(); + /* Startup function to call when running Cocoa code from a Carbon application. Whatever the fuck that means. */ + /* Avoids uncaught exception (1002) when creating CGSWindow */ + NSApplicationLoad(); #endif - /* initialize SDL */ - if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { - fprintf( stderr, "Video initialization failed: %s\n",SDL_GetError()); - exit(1); - } + /* initialize SDL */ + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "Video initialization failed: %s\n", + SDL_GetError()); + exit(1); + } - /* Fetch the video info */ - videoInfo = SDL_GetVideoInfo( ); + /* Fetch the video info */ + videoInfo = SDL_GetVideoInfo(); - if ( !videoInfo ) { - fprintf( stderr, "Video query failed: %s\n",SDL_GetError()); - exit(1); - } + if (!videoInfo) { + fprintf(stderr, "Video query failed: %s\n", SDL_GetError()); + exit(1); + } - /* the flags to pass to SDL_SetVideoMode */ - videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ - videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ - videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ - videoFlags |= SDL_FULLSCREEN; /* Fullscreen */ + /* the flags to pass to SDL_SetVideoMode */ + videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ + videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ + videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ + videoFlags |= SDL_FULLSCREEN; /* Fullscreen */ - /* This checks to see if surfaces can be stored in memory */ - if ( videoInfo->hw_available ) - videoFlags |= SDL_HWSURFACE; - else - videoFlags |= SDL_SWSURFACE; + /* This checks to see if surfaces can be stored in memory */ + if (videoInfo->hw_available) + videoFlags |= SDL_HWSURFACE; + else + videoFlags |= SDL_SWSURFACE; - /* This checks if hardware blits can be done */ - if ( videoInfo->blit_hw ) - videoFlags |= SDL_HWACCEL; + /* This checks if hardware blits can be done */ + if (videoInfo->blit_hw) + videoFlags |= SDL_HWACCEL; - /* Sets up OpenGL double buffering */ + /* Sets up OpenGL double buffering */ // SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); #ifdef HAVE_SDL_1210 - SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); -#endif /* HAVE_SDL_1210 */ + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); +#endif /* HAVE_SDL_1210 */ - /* get a SDL surface */ - s->sdl_screen = SDL_SetVideoMode(s->x_res_x, s->x_res_y, 32, videoFlags); - if(!s->sdl_screen){ - fprintf(stderr,"Error setting video mode %dx%d!\n", s->x_res_x, s->x_res_y); - exit(128); - } + /* get a SDL surface */ + s->sdl_screen = + SDL_SetVideoMode(s->x_res_x, s->x_res_y, 32, videoFlags); + if (!s->sdl_screen) { + fprintf(stderr, "Error setting video mode %dx%d!\n", s->x_res_x, + s->x_res_y); + exit(128); + } - SDL_WM_SetCaption("Ultragrid - Form Of DXT!", "Ultragrid"); + SDL_WM_SetCaption("Ultragrid - Form Of DXT!", "Ultragrid"); - SDL_ShowCursor(SDL_DISABLE); + SDL_ShowCursor(SDL_DISABLE); /* OpenGL Setup */ - glEnable( GL_TEXTURE_2D ); - glGenTextures(1, s->texture); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - //glClearColor( 0, 1, 0, 0 ); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - dxt_resize_window(s->x_res_x, s->x_res_y); - glewInit(); - if(glewIsSupported("GL_VERSION_2_0")){ - fprintf(stderr, "OpenGL 2.0 is supported...\n"); - } - /* Load shader */ - //TODO: Need a less breaky way to do this... - struct stat file; - char *filename=strdup("../src/video_display/dxt.frag"); - if (stat(filename,&file) != 0) { - filename=strdup("/usr/share/uv-0.3.1/dxt.frag"); - if (stat(filename,&file) != 0) { - filename=strdup("/usr/local/share/uv-0.3.1/dxt.frag"); - if (stat(filename,&file) != 0) { - fprintf(stderr, "dxt.frag not found. Giving up!\n"); - exit(113); - } - } - } - s->FProgram=calloc(file.st_size+1,sizeof(char)); - + glEnable(GL_TEXTURE_2D); + glGenTextures(1, s->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + //glClearColor( 0, 1, 0, 0 ); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + dxt_resize_window(s->x_res_x, s->x_res_y); + glewInit(); + if (glewIsSupported("GL_VERSION_2_0")) { + fprintf(stderr, "OpenGL 2.0 is supported...\n"); + } + /* Load shader */ + //TODO: Need a less breaky way to do this... + struct stat file; + char *filename = strdup("../src/video_display/dxt.frag"); + if (stat(filename, &file) != 0) { + filename = strdup("/usr/share/uv-0.3.1/dxt.frag"); + if (stat(filename, &file) != 0) { + filename = strdup("/usr/local/share/uv-0.3.1/dxt.frag"); + if (stat(filename, &file) != 0) { + fprintf(stderr, + "dxt.frag not found. Giving up!\n"); + exit(113); + } + } + } + s->FProgram = calloc(file.st_size + 1, sizeof(char)); + FILE *fh; - fh=fopen(filename, "r"); - if(!fh){ + fh = fopen(filename, "r"); + if (!fh) { perror(filename); exit(113); } - fread(s->FProgram,sizeof(char),file.st_size,fh); + fread(s->FProgram, sizeof(char), file.st_size, fh); fclose(fh); - char *filename2=strdup("../src/video_display/dxt.vert"); - if (stat(filename2,&file) != 0) { - filename2=strdup("/usr/share/uv-0.3.1/dxt.vert"); - if (stat(filename2,&file) != 0) { - filename2=strdup("/usr/local/share/uv-0.3.1/dxt.vert"); - if (stat(filename2,&file) != 0) { - fprintf(stderr, "dxt.vert not found. Giving up!\n"); - exit(113); - } - } - - } - s->VProgram=calloc(file.st_size+1,sizeof(char)); - - fh=fopen(filename2, "r"); - if(!fh){ + char *filename2 = strdup("../src/video_display/dxt.vert"); + if (stat(filename2, &file) != 0) { + filename2 = strdup("/usr/share/uv-0.3.1/dxt.vert"); + if (stat(filename2, &file) != 0) { + filename2 = + strdup("/usr/local/share/uv-0.3.1/dxt.vert"); + if (stat(filename2, &file) != 0) { + fprintf(stderr, + "dxt.vert not found. Giving up!\n"); + exit(113); + } + } + + } + s->VProgram = calloc(file.st_size + 1, sizeof(char)); + + fh = fopen(filename2, "r"); + if (!fh) { perror(filename2); exit(113); } - fread(s->VProgram,sizeof(char),file.st_size,fh); + fread(s->VProgram, sizeof(char), file.st_size, fh); fclose(fh); - /* Check to see if OpenGL 2.0 is supported, if not use ARB (if supported) */ - glewInit(); - if(glewIsSupported("GL_VERSION_2_0")){ - fprintf(stderr, "OpenGL 2.0 is supported...\n"); + /* Check to see if OpenGL 2.0 is supported, if not use ARB (if supported) */ + glewInit(); + if (glewIsSupported("GL_VERSION_2_0")) { + fprintf(stderr, "OpenGL 2.0 is supported...\n"); //TODO: Re-enable dxt_init! //glsl_dxt_init(s); - dxt_arb_init(s); - }else if(GLEW_ARB_fragment_shader){ - fprintf(stderr, "OpenGL 2.0 not supported, using ARB extension...\n"); - dxt_arb_init(s); - }else{ - fprintf(stderr, "ERROR: Neither OpenGL 2.0 nor ARB_fragment_shader are supported, try updating your drivers...\n"); - exit(65); - } + dxt_arb_init(s); + } else if (GLEW_ARB_fragment_shader) { + fprintf(stderr, + "OpenGL 2.0 not supported, using ARB extension...\n"); + dxt_arb_init(s); + } else { + fprintf(stderr, + "ERROR: Neither OpenGL 2.0 nor ARB_fragment_shader are supported, try updating your drivers...\n"); + exit(65); + } - /* Check to see if we have data yet, if not, just chillax */ - /* TODO: we need some solution (TM) for sem_getvalue on MacOS X */ + /* Check to see if we have data yet, if not, just chillax */ + /* TODO: we need some solution (TM) for sem_getvalue on MacOS X */ #ifndef HAVE_MACOSX - sem_getvalue(&s->semaphore,&i); - while(i<1) { - display_dxt_handle_events(s); - usleep(1000); - sem_getvalue(&s->semaphore,&i); - } -#endif /* HAVE_MACOSX */ + sem_getvalue(&s->semaphore, &i); + while (i < 1) { + display_dxt_handle_events(s); + usleep(1000); + sem_getvalue(&s->semaphore, &i); + } +#endif /* HAVE_MACOSX */ - while(1) { - display_dxt_handle_events(s); - platform_sem_wait(&s->semaphore); + while (1) { + display_dxt_handle_events(s); + platform_sem_wait(&s->semaphore); - dxt_bind_texture(s); - dxt_draw(s); + dxt_bind_texture(s); + dxt_draw(s); /* FPS Data, this is pretty ghetto though.... */ Frames++; { GLint t = SDL_GetTicks(); if (t - T0 >= 5000) { - GLfloat seconds = (t - T0) / 1000.0; - GLfloat fps = Frames / seconds; - fprintf(stderr, "%d frames in %g seconds = %g FPS\n", (int)Frames, seconds, fps); - T0 = t; - Frames = 0; + GLfloat seconds = (t - T0) / 1000.0; + GLfloat fps = Frames / seconds; + fprintf(stderr, + "%d frames in %g seconds = %g FPS\n", + (int)Frames, seconds, fps); + T0 = t; + Frames = 0; } } - } - return NULL; + } + return NULL; } - display_type_t *display_dxt_probe(void) { - display_type_t *dt; - display_format_t *dformat; - + display_type_t *dt; + display_format_t *dformat; dformat = malloc(4 * sizeof(display_format_t)); - dformat[0].size = DS_176x144; + dformat[0].size = DS_176x144; dformat[0].colour_mode = DC_YUV; - dformat[0].num_images = 1; - dformat[1].size = DS_352x288; + dformat[0].num_images = 1; + dformat[1].size = DS_352x288; dformat[1].colour_mode = DC_YUV; - dformat[1].num_images = 1; - dformat[2].size = DS_702x576; + dformat[1].num_images = 1; + dformat[2].size = DS_702x576; dformat[2].colour_mode = DC_YUV; - dformat[2].num_images = 1; - dformat[3].size = DS_1280x720; + dformat[2].num_images = 1; + dformat[3].size = DS_1280x720; dformat[3].colour_mode = DC_YUV; - dformat[3].num_images = 1; + dformat[3].num_images = 1; dt = malloc(sizeof(display_type_t)); if (dt != NULL) { - dt->id = DISPLAY_DXT_ID; - dt->name = "dxt"; + dt->id = DISPLAY_DXT_ID; + dt->name = "dxt"; dt->description = "OpenGL With DXT Compression"; - dt->formats = dformat; + dt->formats = dformat; dt->num_formats = 4; } return dt; @@ -560,7 +584,7 @@ display_type_t *display_dxt_probe(void) void display_dxt_done(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_DXT); @@ -568,10 +592,10 @@ void display_dxt_done(void *state) SDL_Quit(); } - -char* display_dxt_getf(void *state) + +char *display_dxt_getf(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_DXT); return (char *)s->buffers[s->image_network]; } @@ -579,7 +603,7 @@ char* display_dxt_getf(void *state) int display_dxt_putf(void *state, char *frame) { int tmp; - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_DXT); UNUSED(frame); @@ -592,35 +616,36 @@ int display_dxt_putf(void *state, char *frame) /* ...and signal the worker */ platform_sem_post(&s->semaphore); sem_getvalue(&s->semaphore, &tmp); - if(tmp > 1) + if (tmp > 1) printf("frame drop!\n"); return 0; } display_colour_t display_dxt_colour(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_DXT); return DC_YUV; } int display_dxt_handle_events(void *state) { - SDL_Event sdl_event; + SDL_Event sdl_event; - UNUSED(state); + UNUSED(state); while (SDL_PollEvent(&sdl_event)) { switch (sdl_event.type) { - case SDL_KEYDOWN: - case SDL_KEYUP: - if (!strcmp(SDL_GetKeyName(sdl_event.key.keysym.sym), "q")) { - kill(0, SIGINT); - } - break; + case SDL_KEYDOWN: + case SDL_KEYUP: + if (!strcmp + (SDL_GetKeyName(sdl_event.key.keysym.sym), "q")) { + kill(0, SIGINT); + } + break; - default: - break; + default: + break; } } diff --git a/ultragrid/src/video_display/gl_sdl.c b/ultragrid/src/video_display/gl_sdl.c index 607972024..b5f7730b2 100644 --- a/ultragrid/src/video_display/gl_sdl.c +++ b/ultragrid/src/video_display/gl_sdl.c @@ -53,11 +53,11 @@ #include #include #include -#else /* HAVE_MACOSX */ +#else /* HAVE_MACOSX */ #include #include #include -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ #include #include "compat/platform_semaphore.h" #include @@ -78,506 +78,527 @@ #define HD_HEIGHT 1080 #define MAGIC_GL DISPLAY_GL_ID - struct state_sdl { - Display *display; - unsigned int x_res_x; - unsigned int x_res_y; + Display *display; + unsigned int x_res_x; + unsigned int x_res_y; - int vw_depth; - SDL_Overlay *vw_image; - GLubyte *buffers[2]; - GLubyte *outbuffer; - GLubyte *y, *u, *v; //Guess what this might be... - char* VSHandle,FSHandle,PHandle; - int image_display, image_network; - GLuint texture[4]; + int vw_depth; + SDL_Overlay *vw_image; + GLubyte *buffers[2]; + GLubyte *outbuffer; + GLubyte *y, *u, *v; //Guess what this might be... + char *VSHandle, FSHandle, PHandle; + int image_display, image_network; + GLuint texture[4]; /* Thread related information follows... */ - pthread_t thread_id; - sem_t semaphore; + pthread_t thread_id; + sem_t semaphore; /* For debugging... */ - uint32_t magic; + uint32_t magic; - SDL_Surface *sdl_screen; - SDL_Rect rect; + SDL_Surface *sdl_screen; + SDL_Rect rect; - char *VProgram,*FProgram; + char *VProgram, *FProgram; }; /* Prototyping */ -static void * display_thread_gl(void *arg); -void gl_deinterlace(GLubyte *buffer);//unsigned -void extrapolate(GLubyte *input, GLubyte *output); -inline void getY(GLubyte *input,GLubyte *y, GLubyte *u,GLubyte *v); +static void *display_thread_gl(void *arg); +void gl_deinterlace(GLubyte * buffer); //unsigned +void extrapolate(GLubyte * input, GLubyte * output); +inline void getY(GLubyte * input, GLubyte * y, GLubyte * u, GLubyte * v); void gl_resize_window(int width, int height); void gl_bind_texture(void *args); void gl_draw(); void loadShader(void *arg, char *filename); void glsl_gl_init(void *arg); void glsl_arb_init(void *arg); -inline void gl_copyline64(GLubyte *dst, GLubyte *src, int len); -inline void gl_copyline128(GLubyte *d, GLubyte *s, int len);//unsigned -void * display_gl_init(void); +inline void gl_copyline64(GLubyte * dst, GLubyte * src, int len); +inline void gl_copyline128(GLubyte * d, GLubyte * s, int len); //unsigned +void *display_gl_init(void); void gl_check_error() { - GLenum msg; - int flag=0; - msg=glGetError(); - while(msg!=GL_NO_ERROR) { - flag=1; - switch(msg){ - case GL_INVALID_ENUM: - fprintf(stderr, "GL_INVALID_ENUM\n"); - break; - case GL_INVALID_VALUE: - fprintf(stderr, "GL_INVALID_VALUE\n"); - break; - case GL_INVALID_OPERATION: - fprintf(stderr, "GL_INVALID_OPERATION\n"); - break; - case GL_STACK_OVERFLOW: - fprintf(stderr, "GL_STACK_OVERFLOW\n"); - break; - case GL_STACK_UNDERFLOW: - fprintf(stderr, "GL_STACK_UNDERFLOW\n"); - break; - case GL_OUT_OF_MEMORY: - fprintf(stderr, "GL_OUT_OF_MEMORY\n"); - break; - default: - fprintf(stderr, "wft mate? Unknown GL ERROR: %p\n", (void *)msg); - break; - } - msg=glGetError(); - } - if(flag) - exit(1); + GLenum msg; + int flag = 0; + msg = glGetError(); + while (msg != GL_NO_ERROR) { + flag = 1; + switch (msg) { + case GL_INVALID_ENUM: + fprintf(stderr, "GL_INVALID_ENUM\n"); + break; + case GL_INVALID_VALUE: + fprintf(stderr, "GL_INVALID_VALUE\n"); + break; + case GL_INVALID_OPERATION: + fprintf(stderr, "GL_INVALID_OPERATION\n"); + break; + case GL_STACK_OVERFLOW: + fprintf(stderr, "GL_STACK_OVERFLOW\n"); + break; + case GL_STACK_UNDERFLOW: + fprintf(stderr, "GL_STACK_UNDERFLOW\n"); + break; + case GL_OUT_OF_MEMORY: + fprintf(stderr, "GL_OUT_OF_MEMORY\n"); + break; + default: + fprintf(stderr, "wft mate? Unknown GL ERROR: %p\n", + (void *)msg); + break; + } + msg = glGetError(); + } + if (flag) + exit(1); } -void * display_gl_init(void) +void *display_gl_init(void) { - struct state_sdl *s; + struct state_sdl *s; - int ret; - int itemp; - unsigned int utemp; - Window wtemp; + int ret; + int itemp; + unsigned int utemp; + Window wtemp; - s = (struct state_sdl *) calloc(1,sizeof(struct state_sdl)); - s->magic = MAGIC_GL; + s = (struct state_sdl *)calloc(1, sizeof(struct state_sdl)); + s->magic = MAGIC_GL; - if (!(s->display = XOpenDisplay(NULL))) { - printf("Unable to open display GL: XOpenDisplay.\n"); - return NULL; - } - - /* Get XWindows resolution */ - ret = XGetGeometry(s->display, DefaultRootWindow(s->display), &wtemp, &itemp, &itemp, &(s->x_res_x), &(s->x_res_y), &utemp, &utemp); + if (!(s->display = XOpenDisplay(NULL))) { + printf("Unable to open display GL: XOpenDisplay.\n"); + return NULL; + } - s->rect.w = HD_WIDTH; - s->rect.h = HD_HEIGHT; - if ((s->x_res_x - HD_WIDTH) > 0) { - s->rect.x = (s->x_res_x - HD_WIDTH) / 2; - } else { - s->rect.x = 0; - } - if ((s->x_res_y - HD_HEIGHT) > 0) { - s->rect.y = (s->x_res_y - HD_HEIGHT) / 2; - } else { - s->rect.y = 0; - } + /* Get XWindows resolution */ + ret = + XGetGeometry(s->display, DefaultRootWindow(s->display), &wtemp, + &itemp, &itemp, &(s->x_res_x), &(s->x_res_y), &utemp, + &utemp); - s->buffers[0]=malloc(HD_WIDTH*HD_HEIGHT*3); - s->buffers[1]=malloc(HD_WIDTH*HD_HEIGHT*3); - s->outbuffer=malloc(HD_WIDTH*HD_HEIGHT*4); - s->image_network=0; - s->image_display=1; - s->y=malloc(HD_WIDTH*HD_HEIGHT); - s->u=malloc(HD_WIDTH*HD_HEIGHT); - s->v=malloc(HD_WIDTH*HD_HEIGHT); + s->rect.w = HD_WIDTH; + s->rect.h = HD_HEIGHT; + if ((s->x_res_x - HD_WIDTH) > 0) { + s->rect.x = (s->x_res_x - HD_WIDTH) / 2; + } else { + s->rect.x = 0; + } + if ((s->x_res_y - HD_HEIGHT) > 0) { + s->rect.y = (s->x_res_y - HD_HEIGHT) / 2; + } else { + s->rect.y = 0; + } - asm("emms\n"); + s->buffers[0] = malloc(HD_WIDTH * HD_HEIGHT * 3); + s->buffers[1] = malloc(HD_WIDTH * HD_HEIGHT * 3); + s->outbuffer = malloc(HD_WIDTH * HD_HEIGHT * 4); + s->image_network = 0; + s->image_display = 1; + s->y = malloc(HD_WIDTH * HD_HEIGHT); + s->u = malloc(HD_WIDTH * HD_HEIGHT); + s->v = malloc(HD_WIDTH * HD_HEIGHT); - platform_sem_init(&s->semaphore, 0, 0); - if (pthread_create(&(s->thread_id), NULL, display_thread_gl, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } + asm("emms\n"); - return (void*)s; + platform_sem_init(&s->semaphore, 0, 0); + if (pthread_create(&(s->thread_id), NULL, display_thread_gl, (void *)s) + != 0) { + perror("Unable to create display thread\n"); + return NULL; + } + + return (void *)s; } void loadShader(void *arg, char *filename) { - struct state_sdl *s = (struct state_sdl *) arg; - struct stat file; - - s = (struct state_sdl *) calloc(1,sizeof(struct state_sdl)); + struct state_sdl *s = (struct state_sdl *)arg; + struct stat file; - stat(filename,&file); - s->FProgram=calloc(file.st_size+1,sizeof(char)); - FILE *fh; - fh=fopen(filename, "r"); - if(!fh){ - perror(filename); - exit(113); - } - fread(s->FProgram,sizeof(char),file.st_size,fh); - fclose(fh); + s = (struct state_sdl *)calloc(1, sizeof(struct state_sdl)); + + stat(filename, &file); + s->FProgram = calloc(file.st_size + 1, sizeof(char)); + FILE *fh; + fh = fopen(filename, "r"); + if (!fh) { + perror(filename); + exit(113); + } + fread(s->FProgram, sizeof(char), file.st_size, fh); + fclose(fh); } void glsl_arb_init(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; - char *log; + struct state_sdl *s = (struct state_sdl *)arg; + char *log; - /* Set up program objects. */ - s->PHandle=glCreateProgramObjectARB(); - // s->VSHandle=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); - s->FSHandle=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + /* Set up program objects. */ + s->PHandle = glCreateProgramObjectARB(); + // s->VSHandle=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); + s->FSHandle = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); - /* Compile Shader */ - assert(s->FProgram!=NULL); - // assert(s->VProgram!=NULL); - glShaderSourceARB(s->FSHandle,1,(const GLcharARB**)&(s->FProgram),NULL); - glCompileShaderARB(s->FSHandle); + /* Compile Shader */ + assert(s->FProgram != NULL); + // assert(s->VProgram!=NULL); + glShaderSourceARB(s->FSHandle, 1, (const GLcharARB **)&(s->FProgram), + NULL); + glCompileShaderARB(s->FSHandle); - /* Print compile log */ - log=calloc(32768,sizeof(char)); - glGetInfoLogARB(s->FSHandle,32768,NULL,log); - printf("Compile Log: %s\n", log); - free(log); + /* Print compile log */ + log = calloc(32768, sizeof(char)); + glGetInfoLogARB(s->FSHandle, 32768, NULL, log); + printf("Compile Log: %s\n", log); + free(log); #if 0 - glShaderSourceARB(s->VSHandle,1,&(s->VProgram),NULL); - glCompileShaderARB(s->VSHandle); - log=calloc(32768,sizeof(char)); - glGetInfoLogARB(s->VSHandle,32768,NULL,log); - printf("Compile Log: %s\n", log); - free(log); + glShaderSourceARB(s->VSHandle, 1, &(s->VProgram), NULL); + glCompileShaderARB(s->VSHandle); + log = calloc(32768, sizeof(char)); + glGetInfoLogARB(s->VSHandle, 32768, NULL, log); + printf("Compile Log: %s\n", log); + free(log); #endif - /* Attach and link our program */ - glAttachObjectARB(s->PHandle,s->FSHandle); - // glAttachObjectARB(s->PHandle,s->VSHandle); - glLinkProgramARB(s->PHandle); + /* Attach and link our program */ + glAttachObjectARB(s->PHandle, s->FSHandle); + // glAttachObjectARB(s->PHandle,s->VSHandle); + glLinkProgramARB(s->PHandle); - /* Print link log. */ - log=calloc(32768,sizeof(char)); - glGetInfoLogARB(s->PHandle,32768,NULL,log); - printf("Link Log: %s\n", log); - free(log); + /* Print link log. */ + log = calloc(32768, sizeof(char)); + glGetInfoLogARB(s->PHandle, 32768, NULL, log); + printf("Link Log: %s\n", log); + free(log); - /* Finally, use the program. */ - glUseProgramObjectARB(s->PHandle); + /* Finally, use the program. */ + glUseProgramObjectARB(s->PHandle); } void glsl_gl_init(void *arg) { - //TODO: Add log - struct state_sdl *s = (struct state_sdl *) arg; + //TODO: Add log + struct state_sdl *s = (struct state_sdl *)arg; - s->PHandle=glCreateProgram(); - s->FSHandle=glCreateShader(GL_FRAGMENT_SHADER); + s->PHandle = glCreateProgram(); + s->FSHandle = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(s->FSHandle,1,(const GLcharARB**)&(s->FProgram),NULL); - glCompileShader(s->FSHandle); + glShaderSource(s->FSHandle, 1, (const GLcharARB **)&(s->FProgram), + NULL); + glCompileShader(s->FSHandle); - glAttachShader(s->PHandle,s->FSHandle); + glAttachShader(s->PHandle, s->FSHandle); - glLinkProgram(s->PHandle); - glUseProgram(s->PHandle); + glLinkProgram(s->PHandle); + glUseProgram(s->PHandle); } -void extrapolate(GLubyte *input, GLubyte *output) +void extrapolate(GLubyte * input, GLubyte * output) { - /* A linear non-blending method, kida dumb, but it seems to work, and is somewhat fast :-) */ - register int x; - for(x=0;x<960*1080;x++) { - output[2*x]=input[x]; - output[2*x+1]=input[x]; - } + /* A linear non-blending method, kida dumb, but it seems to work, and is somewhat fast :-) */ + register int x; + for (x = 0; x < 960 * 1080; x++) { + output[2 * x] = input[x]; + output[2 * x + 1] = input[x]; + } } -inline void getY(GLubyte *input,GLubyte *y, GLubyte *u,GLubyte *v) +inline void getY(GLubyte * input, GLubyte * y, GLubyte * u, GLubyte * v) { - //TODO: This should be re-written in assembly - //Note: We assume 1920x1080 UYVY (YUV 4:2:2) - //See http://www.fourcc.org/indexyuv.htm for more info - //0x59565955 - UYVY - 16 bits per pixel (2 bytes per plane) - register int x; - for(x=0;x<1920*1080*2;x+=4) { - *u++=input[x]; //1 5 9 13 - *y++=input[x+1]; //2 6 10 14 - *v++=input[x+2]; //3 7 11 15 - *y++=input[x+3]; //0 4 8 12 - } + //TODO: This should be re-written in assembly + //Note: We assume 1920x1080 UYVY (YUV 4:2:2) + //See http://www.fourcc.org/indexyuv.htm for more info + //0x59565955 - UYVY - 16 bits per pixel (2 bytes per plane) + register int x; + for (x = 0; x < 1920 * 1080 * 2; x += 4) { + *u++ = input[x]; //1 5 9 13 + *y++ = input[x + 1]; //2 6 10 14 + *v++ = input[x + 2]; //3 7 11 15 + *y++ = input[x + 3]; //0 4 8 12 + } } -static void * display_thread_gl(void *arg) +static void *display_thread_gl(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; - int j, i; + struct state_sdl *s = (struct state_sdl *)arg; + int j, i; - const SDL_VideoInfo *videoInfo; - int videoFlags; - /* FPS */ - static GLint T0 = 0; - static GLint Frames = 0; - double bpp; + const SDL_VideoInfo *videoInfo; + int videoFlags; + /* FPS */ + static GLint T0 = 0; + static GLint Frames = 0; + double bpp; #ifdef HAVE_MACOSX - /* Startup function to call when running Cocoa code from a Carbon application. Whatever the fuck that means. */ - /* Avoids uncaught exception (1002) when creating CGSWindow */ - NSApplicationLoad(); + /* Startup function to call when running Cocoa code from a Carbon application. Whatever the fuck that means. */ + /* Avoids uncaught exception (1002) when creating CGSWindow */ + NSApplicationLoad(); #endif - /* initialize SDL */ - if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE ) < 0 ) { - fprintf( stderr, "Video initialization failed: %s\n",SDL_GetError()); - exit(1); - } - - /* Fetch the video info */ - videoInfo = SDL_GetVideoInfo( ); - - if ( !videoInfo ) { - fprintf( stderr, "Video query failed: %s\n",SDL_GetError()); - exit(1); - } - - /* the flags to pass to SDL_SetVideoMode */ - videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ - videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ - videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ - videoFlags |= SDL_FULLSCREEN; /* Fullscreen */ - - /* This checks to see if surfaces can be stored in memory */ - if ( videoInfo->hw_available ) - videoFlags |= SDL_HWSURFACE; - else - videoFlags |= SDL_SWSURFACE; - - /* This checks if hardware blits can be done */ - if ( videoInfo->blit_hw ) - videoFlags |= SDL_HWACCEL; - - /* Sets up OpenGL double buffering */ - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); //TODO: Is this necessary? -#ifdef HAVE_SDL_1210 - SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); -#endif /* HAVE_SDL_1210 */ - - /* get a SDL surface */ - s->sdl_screen = SDL_SetVideoMode(s->x_res_x, s->x_res_y, 32, videoFlags); - if(!s->sdl_screen){ - fprintf(stderr,"Error setting video mode %dx%d!\n", s->x_res_x, s->x_res_y); - exit(128); - } - - SDL_WM_SetCaption("Ultragrid - OpenGL Display", "Ultragrid"); - - SDL_ShowCursor(SDL_DISABLE); - - /* OpenGL Setup */ - glEnable( GL_TEXTURE_2D ); - glClearColor( 1.0f, 1.0f, 1.0f, 0.1f ); - gl_resize_window(s->x_res_x, s->x_res_y); - glGenTextures(4, s->texture); //TODO: Is this necessary? - - /* Display splash screen */ - SDL_Surface *temp; - GLuint texture; // This is a handle to our texture object - temp = SDL_LoadBMP("/usr/share/uv-0.3.1/uv_startup.bmp"); - if (temp == NULL) { - temp = SDL_LoadBMP("/usr/local/share/uv-0.3.1/uv_startup.bmp"); - if (temp == NULL) { - temp = SDL_LoadBMP("uv_startup.bmp"); - if (temp == NULL) { - printf("Unable to load splash bitmap: uv_startup.bmp.\n"); - } + /* initialize SDL */ + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0) { + fprintf(stderr, "Video initialization failed: %s\n", + SDL_GetError()); + exit(1); } - } - if (temp != NULL) { - /* Display the SDL_surface as a OpenGL texture */ - - // Have OpenGL generate a texture object handle for us - glGenTextures(1, &texture); - - // Bind the texture object - glBindTexture(GL_TEXTURE_2D, texture); - - // Set the texture's stretching properties - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - // Edit the texture object's image data using the information SDL_Surface gives us - glTexImage2D(GL_TEXTURE_2D, 0, 3, temp->w, temp->h, 0, - GL_RGB, GL_UNSIGNED_BYTE, temp->pixels); + /* Fetch the video info */ + videoInfo = SDL_GetVideoInfo(); - gl_draw(); + if (!videoInfo) { + fprintf(stderr, "Video query failed: %s\n", SDL_GetError()); + exit(1); + } - glDeleteTextures( 1, &texture ); - } + /* the flags to pass to SDL_SetVideoMode */ + videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ + videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ + videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ + videoFlags |= SDL_FULLSCREEN; /* Fullscreen */ - /* Load shader */ - //TODO: Need a less breaky way to do this... - struct stat file; - char *filename=strdup("../src/video_display/gl_sdl.glsl"); - if ((stat(filename,&file)) == -1) { - filename=strdup("/usr/share/uv-0.3.1/gl_sdl.glsl"); - if ((stat(filename,&file)) == -1) { - filename=strdup("/usr/local/share/uv-0.3.1/gl_sdl.glsl"); - if ((stat(filename,&file)) == -1) { - fprintf(stderr, "gl_sdl.glsl not found. Giving up!\n"); - exit(113); - } - } - } - s->FProgram=calloc(file.st_size+1,sizeof(char)); - FILE *fh; - fh=fopen(filename, "r"); - if(!fh){ - perror(filename); - exit(113); - } - fread(s->FProgram,sizeof(char),file.st_size,fh); - fclose(fh); + /* This checks to see if surfaces can be stored in memory */ + if (videoInfo->hw_available) + videoFlags |= SDL_HWSURFACE; + else + videoFlags |= SDL_SWSURFACE; + + /* This checks if hardware blits can be done */ + if (videoInfo->blit_hw) + videoFlags |= SDL_HWACCEL; + + /* Sets up OpenGL double buffering */ + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); //TODO: Is this necessary? +#ifdef HAVE_SDL_1210 + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); +#endif /* HAVE_SDL_1210 */ + + /* get a SDL surface */ + s->sdl_screen = + SDL_SetVideoMode(s->x_res_x, s->x_res_y, 32, videoFlags); + if (!s->sdl_screen) { + fprintf(stderr, "Error setting video mode %dx%d!\n", s->x_res_x, + s->x_res_y); + exit(128); + } + + SDL_WM_SetCaption("Ultragrid - OpenGL Display", "Ultragrid"); + + SDL_ShowCursor(SDL_DISABLE); + + /* OpenGL Setup */ + glEnable(GL_TEXTURE_2D); + glClearColor(1.0f, 1.0f, 1.0f, 0.1f); + gl_resize_window(s->x_res_x, s->x_res_y); + glGenTextures(4, s->texture); //TODO: Is this necessary? + + /* Display splash screen */ + SDL_Surface *temp; + GLuint texture; // This is a handle to our texture object + temp = SDL_LoadBMP("/usr/share/uv-0.3.1/uv_startup.bmp"); + if (temp == NULL) { + temp = SDL_LoadBMP("/usr/local/share/uv-0.3.1/uv_startup.bmp"); + if (temp == NULL) { + temp = SDL_LoadBMP("uv_startup.bmp"); + if (temp == NULL) { + printf + ("Unable to load splash bitmap: uv_startup.bmp.\n"); + } + } + } + + if (temp != NULL) { + /* Display the SDL_surface as a OpenGL texture */ + + // Have OpenGL generate a texture object handle for us + glGenTextures(1, &texture); + + // Bind the texture object + glBindTexture(GL_TEXTURE_2D, texture); + + // Set the texture's stretching properties + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + GL_LINEAR); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D(GL_TEXTURE_2D, 0, 3, temp->w, temp->h, 0, + GL_RGB, GL_UNSIGNED_BYTE, temp->pixels); + + gl_draw(); + + glDeleteTextures(1, &texture); + } + + /* Load shader */ + //TODO: Need a less breaky way to do this... + struct stat file; + char *filename = strdup("../src/video_display/gl_sdl.glsl"); + if ((stat(filename, &file)) == -1) { + filename = strdup("/usr/share/uv-0.3.1/gl_sdl.glsl"); + if ((stat(filename, &file)) == -1) { + filename = + strdup("/usr/local/share/uv-0.3.1/gl_sdl.glsl"); + if ((stat(filename, &file)) == -1) { + fprintf(stderr, + "gl_sdl.glsl not found. Giving up!\n"); + exit(113); + } + } + } + s->FProgram = calloc(file.st_size + 1, sizeof(char)); + FILE *fh; + fh = fopen(filename, "r"); + if (!fh) { + perror(filename); + exit(113); + } + fread(s->FProgram, sizeof(char), file.st_size, fh); + fclose(fh); #if 0 - char filename2[]="../src/video_display/gl.vert"; - stat(filename2,&file); - s->VProgram=calloc(file.st_size+1,sizeof(char)); - fh=fopen(filename2, "r"); - if(!fh){ - perror(filename2); - exit(113); - } - fread(s->VProgram,sizeof(char),file.st_size,fh); - fclose(fh); + char filename2[] = "../src/video_display/gl.vert"; + stat(filename2, &file); + s->VProgram = calloc(file.st_size + 1, sizeof(char)); + fh = fopen(filename2, "r"); + if (!fh) { + perror(filename2); + exit(113); + } + fread(s->VProgram, sizeof(char), file.st_size, fh); + fclose(fh); #endif - /* Check to see if OpenGL 2.0 is supported, if not use ARB (if supported) */ - glewInit(); - if(glewIsSupported("GL_VERSION_2_0")){ - fprintf(stderr, "OpenGL 2.0 is supported...\n"); - //TODO: Re-enable gl_init! - //glsl_gl_init(s); - glsl_arb_init(s); - }else if(GLEW_ARB_fragment_shader){ - fprintf(stderr, "OpenGL 2.0 not supported, using ARB extension...\n"); - glsl_arb_init(s); - }else{ - fprintf(stderr, "ERROR: Neither OpenGL 2.0 nor ARB_fragment_shader are supported, try updating your drivers...\n"); - exit(65); - } + /* Check to see if OpenGL 2.0 is supported, if not use ARB (if supported) */ + glewInit(); + if (glewIsSupported("GL_VERSION_2_0")) { + fprintf(stderr, "OpenGL 2.0 is supported...\n"); + //TODO: Re-enable gl_init! + //glsl_gl_init(s); + glsl_arb_init(s); + } else if (GLEW_ARB_fragment_shader) { + fprintf(stderr, + "OpenGL 2.0 not supported, using ARB extension...\n"); + glsl_arb_init(s); + } else { + fprintf(stderr, + "ERROR: Neither OpenGL 2.0 nor ARB_fragment_shader are supported, try updating your drivers...\n"); + exit(65); + } - bpp = get_bpp(hd_color_spc); + bpp = get_bpp(hd_color_spc); - /* Check to see if we have data yet, if not, just chillax */ - /* TODO: we need some solution (TM) for sem_getvalue on MacOS X */ + /* Check to see if we have data yet, if not, just chillax */ + /* TODO: we need some solution (TM) for sem_getvalue on MacOS X */ #ifndef HAVE_MACOSX - sem_getvalue(&s->semaphore,&i); - while(i<1) { - display_gl_handle_events(s); - usleep(1000); - sem_getvalue(&s->semaphore,&i); - } -#endif /* HAVE_MACOSX */ + sem_getvalue(&s->semaphore, &i); + while (i < 1) { + display_gl_handle_events(s); + usleep(1000); + sem_getvalue(&s->semaphore, &i); + } +#endif /* HAVE_MACOSX */ - while(1) { - GLubyte *line1, *line2; - display_gl_handle_events(s); - platform_sem_wait(&s->semaphore); + while (1) { + GLubyte *line1, *line2; + display_gl_handle_events(s); + platform_sem_wait(&s->semaphore); - - /* 10-bit YUV ->8 bit YUV [I think...] */ - line1 = s->buffers[s->image_display]; - line2 = s->outbuffer; - if (bitdepth == 10) { - for(j=0;j8 bit YUV [I think...] */ + line1 = s->buffers[s->image_display]; + line2 = s->outbuffer; + if (bitdepth == 10) { + for (j = 0; j < HD_HEIGHT; j += 2) { #if (HAVE_MACOSX || HAVE_32B_LINUX) - gl_copyline64(line2, line1, 5120/32); - gl_copyline64(line2+3840, line1+5120*540, 5120/32); -#else /* (HAVE_MACOSX || HAVE_32B_LINUX) */ - gl_copyline128(line2, line1, 5120/32); - gl_copyline128(line2+3840, line1+5120*540, 5120/32); -#endif /* HAVE_MACOSX || HAVE_32B_LINUX) */ - line1 += 5120; - line2 += 2*3840; - } - } else { - if (progressive == 1) { - memcpy(line2, line1, hd_size_x*hd_size_y*bpp); - } else { - for(i=0; i<1080; i+=2) { - memcpy(line2, line1, (int)hd_size_x*bpp); - memcpy(line2+(int)(hd_size_x*bpp), line1+(int)(hd_size_x*bpp*540), (int)(hd_size_x*bpp)); - line1 += (int)(hd_size_x*bpp); - line2 += (int)(2*hd_size_x*bpp); - } - } - } + gl_copyline64(line2, line1, 5120 / 32); + gl_copyline64(line2 + 3840, line1 + 5120 * 540, + 5120 / 32); +#else /* (HAVE_MACOSX || HAVE_32B_LINUX) */ + gl_copyline128(line2, line1, 5120 / 32); + gl_copyline128(line2 + 3840, line1 + 5120 * 540, + 5120 / 32); +#endif /* HAVE_MACOSX || HAVE_32B_LINUX) */ + line1 += 5120; + line2 += 2 * 3840; + } + } else { + if (progressive == 1) { + memcpy(line2, line1, + hd_size_x * hd_size_y * bpp); + } else { + for (i = 0; i < 1080; i += 2) { + memcpy(line2, line1, + (int)hd_size_x * bpp); + memcpy(line2 + (int)(hd_size_x * bpp), + line1 + + (int)(hd_size_x * bpp * 540), + (int)(hd_size_x * bpp)); + line1 += (int)(hd_size_x * bpp); + line2 += (int)(2 * hd_size_x * bpp); + } + } + } - // gl_deinterlace(s->outbuffer); - getY(s->outbuffer,s->y,s->u,s->v); - gl_bind_texture(s); - gl_draw(s); + // gl_deinterlace(s->outbuffer); + getY(s->outbuffer, s->y, s->u, s->v); + gl_bind_texture(s); + gl_draw(s); - /* FPS Data, this is pretty ghetto though.... */ - Frames++; - { - GLint t = SDL_GetTicks(); - if (t - T0 >= 5000) { - GLfloat seconds = (t - T0) / 1000.0; - GLfloat fps = Frames / seconds; - fprintf(stderr, "%d frames in %g seconds = %g FPS\n", (int)Frames, seconds, fps); - T0 = t; - Frames = 0; - } - } - } - return NULL; + /* FPS Data, this is pretty ghetto though.... */ + Frames++; + { + GLint t = SDL_GetTicks(); + if (t - T0 >= 5000) { + GLfloat seconds = (t - T0) / 1000.0; + GLfloat fps = Frames / seconds; + fprintf(stderr, + "%d frames in %g seconds = %g FPS\n", + (int)Frames, seconds, fps); + T0 = t; + Frames = 0; + } + } + } + return NULL; } /* linear blend deinterlace */ -void gl_deinterlace(GLubyte *buffer) +void gl_deinterlace(GLubyte * buffer) { - int i,j; - long pitch = HD_WIDTH*2; - register long pitch2 = pitch*2; + int i, j; + long pitch = HD_WIDTH * 2; + register long pitch2 = pitch * 2; GLubyte *bline1, *bline2, *bline3; register GLubyte *line1, *line2, *line3; bline1 = buffer; bline2 = buffer + pitch; - bline3 = buffer + 3*pitch; - for(i=0; i < HD_WIDTH*2; i+=16) { + bline3 = buffer + 3 * pitch; + for (i = 0; i < HD_WIDTH * 2; i += 16) { /* preload first two lines */ - asm volatile( - "movdqa (%0), %%xmm0\n" - "movdqa (%1), %%xmm1\n" - : - : "r" ((unsigned long *)bline1), - "r" ((unsigned long *)bline2)); + asm volatile ("movdqa (%0), %%xmm0\n" + "movdqa (%1), %%xmm1\n"::"r" ((unsigned long *) + bline1), + "r"((unsigned long *)bline2)); line1 = bline2; line2 = bline2 + pitch; line3 = bline3; - for(j=0; j < 1076; j+=2) { - asm volatile( - "movdqa (%1), %%xmm2\n" - "pavgb %%xmm2, %%xmm0\n" - "pavgb %%xmm1, %%xmm0\n" - "movdqa (%2), %%xmm1\n" - "movdqa %%xmm0, (%0)\n" - "pavgb %%xmm1, %%xmm0\n" - "pavgb %%xmm2, %%xmm0\n" - "movdqa %%xmm0, (%1)\n" - : - :"r" ((unsigned long *)line1), - "r" ((unsigned long *)line2), - "r" ((unsigned long *)line3) - ); + for (j = 0; j < 1076; j += 2) { + asm volatile ("movdqa (%1), %%xmm2\n" + "pavgb %%xmm2, %%xmm0\n" + "pavgb %%xmm1, %%xmm0\n" + "movdqa (%2), %%xmm1\n" + "movdqa %%xmm0, (%0)\n" + "pavgb %%xmm1, %%xmm0\n" + "pavgb %%xmm2, %%xmm0\n" + "movdqa %%xmm0, (%1)\n"::"r" ((unsigned + long *) + line1), + "r"((unsigned long *)line2), + "r"((unsigned long *)line3) + ); line1 += pitch2; line2 += pitch2; line3 += pitch2; @@ -588,123 +609,135 @@ void gl_deinterlace(GLubyte *buffer) } } -void gl_resize_window(int width,int height) +void gl_resize_window(int width, int height) { - /* Height / width ration */ - GLfloat ratio; - GLint y = 0; + /* Height / width ration */ + GLfloat ratio; + GLint y = 0; - /* Protect against a divide by zero */ - if ( height == 0 ) - height = 1; + /* Protect against a divide by zero */ + if (height == 0) + height = 1; - if (height > HD_HEIGHT) { - y = (height - HD_HEIGHT) / 2; - height = HD_HEIGHT; - } - ratio = ( GLfloat )width / ( GLfloat )(((float)(width * HD_HEIGHT))/((float)HD_WIDTH)); + if (height > HD_HEIGHT) { + y = (height - HD_HEIGHT) / 2; + height = HD_HEIGHT; + } + ratio = + (GLfloat) width / (GLfloat) (((float)(width * HD_HEIGHT)) / + ((float)HD_WIDTH)); - glViewport( 0, y, ( GLint )width, ( GLint )height ); + glViewport(0, y, (GLint) width, (GLint) height); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity( ); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glScalef(1, + (((float)(width * HD_HEIGHT)) / ((float)HD_WIDTH)) / + ((float)height), 1); + gluPerspective(45.0f, ratio, 0.1f, 100.0f); - glScalef(1, (((float)(width * HD_HEIGHT))/((float)HD_WIDTH))/((float)height), 1); - gluPerspective( 45.0f, ratio, 0.1f, 100.0f ); + glMatrixMode(GL_MODELVIEW); - glMatrixMode( GL_MODELVIEW ); - - glLoadIdentity( ); + glLoadIdentity(); } void gl_bind_texture(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; - int i; + struct state_sdl *s = (struct state_sdl *)arg; + int i; - glActiveTexture(GL_TEXTURE1); - i=glGetUniformLocationARB(s->PHandle,"Utex"); - glUniform1iARB(i,1); - glBindTexture(GL_TEXTURE_2D,1); - glTexImage2D(GL_TEXTURE_2D,0,1,HD_WIDTH/2,HD_HEIGHT,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,s->u); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glActiveTexture(GL_TEXTURE1); + i = glGetUniformLocationARB(s->PHandle, "Utex"); + glUniform1iARB(i, 1); + glBindTexture(GL_TEXTURE_2D, 1); + glTexImage2D(GL_TEXTURE_2D, 0, 1, HD_WIDTH / 2, HD_HEIGHT, 0, + GL_LUMINANCE, GL_UNSIGNED_BYTE, s->u); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glActiveTexture(GL_TEXTURE2); - i=glGetUniformLocationARB(s->PHandle,"Vtex"); - glUniform1iARB(i,2); - glBindTexture(GL_TEXTURE_2D,2); - glTexImage2D(GL_TEXTURE_2D,0,1,HD_WIDTH/2,HD_HEIGHT,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,s->v); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glActiveTexture(GL_TEXTURE2); + i = glGetUniformLocationARB(s->PHandle, "Vtex"); + glUniform1iARB(i, 2); + glBindTexture(GL_TEXTURE_2D, 2); + glTexImage2D(GL_TEXTURE_2D, 0, 1, HD_WIDTH / 2, HD_HEIGHT, 0, + GL_LUMINANCE, GL_UNSIGNED_BYTE, s->v); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glActiveTexture(GL_TEXTURE0); - i=glGetUniformLocationARB(s->PHandle,"Ytex"); - glUniform1iARB(i,0); - glBindTexture(GL_TEXTURE_2D,0); - glTexImage2D(GL_TEXTURE_2D,0,1,HD_WIDTH,HD_HEIGHT,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,s->y); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glActiveTexture(GL_TEXTURE0); + i = glGetUniformLocationARB(s->PHandle, "Ytex"); + glUniform1iARB(i, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glTexImage2D(GL_TEXTURE_2D, 0, 1, HD_WIDTH, HD_HEIGHT, 0, GL_LUMINANCE, + GL_UNSIGNED_BYTE, s->y); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); #if 0 - //TODO: does OpenGL use different stuff here? - glActiveTexture(GL_TEXTURE0); - i=glGetUniformLocationARB(s->PHandle,"yuvtex"); - glUniform1iARB(i,0); - glBindTexture(GL_TEXTURE_2D,0); - glTexImage2D(GL_TEXTURE_2D,0,1,HD_WIDTH,HD_HEIGHT,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,s->outbuffer); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - gl_check_error(); + //TODO: does OpenGL use different stuff here? + glActiveTexture(GL_TEXTURE0); + i = glGetUniformLocationARB(s->PHandle, "yuvtex"); + glUniform1iARB(i, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glTexImage2D(GL_TEXTURE_2D, 0, 1, HD_WIDTH, HD_HEIGHT, 0, GL_LUMINANCE, + GL_UNSIGNED_BYTE, s->outbuffer); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + gl_check_error(); - glActiveTexture(GL_TEXTURE1); - i=glGetUniformLocationARB(s->PHandle,"rawtex"); - glUniform1iARB(i,1); - glBindTexture(GL_TEXTURE_2D,1); - glTexImage2D(GL_TEXTURE_2D,0,1,HD_WIDTH,HD_HEIGHT,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,s->outbuffer+1920*1080); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - gl_check_error(); + glActiveTexture(GL_TEXTURE1); + i = glGetUniformLocationARB(s->PHandle, "rawtex"); + glUniform1iARB(i, 1); + glBindTexture(GL_TEXTURE_2D, 1); + glTexImage2D(GL_TEXTURE_2D, 0, 1, HD_WIDTH, HD_HEIGHT, 0, GL_LUMINANCE, + GL_UNSIGNED_BYTE, s->outbuffer + 1920 * 1080); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + gl_check_error(); #endif -} +} void gl_draw() { - /* Clear the screen */ - //glClear(GL_COLOR_BUFFER_BIT); + /* Clear the screen */ + //glClear(GL_COLOR_BUFFER_BIT); - glLoadIdentity( ); - glTranslatef( 0.0f, 0.0f, -1.35f ); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -1.35f); - gl_check_error(); - glBegin(GL_QUADS); - /* Front Face */ - /* Bottom Left Of The Texture and Quad */ - glTexCoord2f( 0.0f, 1.0f ); glVertex2f( -1.0f, -0.5625f); - /* Bottom Right Of The Texture and Quad */ - glTexCoord2f( 1.0f, 1.0f ); glVertex2f( 1.0f, -0.5625f); - /* Top Right Of The Texture and Quad */ - glTexCoord2f( 1.0f, 0.0f ); glVertex2f( 1.0f, 0.5625f); - /* Top Left Of The Texture and Quad */ - glTexCoord2f( 0.0f, 0.0f ); glVertex2f( -1.0f, 0.5625f); - glEnd( ); + gl_check_error(); + glBegin(GL_QUADS); + /* Front Face */ + /* Bottom Left Of The Texture and Quad */ + glTexCoord2f(0.0f, 1.0f); + glVertex2f(-1.0f, -0.5625f); + /* Bottom Right Of The Texture and Quad */ + glTexCoord2f(1.0f, 1.0f); + glVertex2f(1.0f, -0.5625f); + /* Top Right Of The Texture and Quad */ + glTexCoord2f(1.0f, 0.0f); + glVertex2f(1.0f, 0.5625f); + /* Top Left Of The Texture and Quad */ + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, 0.5625f); + glEnd(); - gl_check_error(); - /* Draw it to the screen */ - SDL_GL_SwapBuffers( ); + gl_check_error(); + /* Draw it to the screen */ + SDL_GL_SwapBuffers(); } -inline void gl_copyline64(GLubyte *dst, GLubyte *src, int len) +inline void gl_copyline64(GLubyte * dst, GLubyte * src, int len) { register uint64_t *d, *s; - register uint64_t a1,a2,a3,a4; + register uint64_t a1, a2, a3, a4; - d = (uint64_t *)dst; - s = (uint64_t *)src; + d = (uint64_t *) dst; + s = (uint64_t *) src; - while(len-- > 0) { - a1 = *(s++); + while (len-- > 0) { + a1 = *(s++); a2 = *(s++); a3 = *(s++); a4 = *(s++); @@ -715,98 +748,95 @@ inline void gl_copyline64(GLubyte *dst, GLubyte *src, int len) a4 = (a4 & 0xffffff) | ((a4 >> 8) & 0xffffff000000); *(d++) = a1 | (a2 << 48); /* 0xa2|a2|a1|a1|a1|a1|a1|a1 */ - *(d++) = (a2 >> 16)|(a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ - *(d++) = (a3 >> 32)|(a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ - } + *(d++) = (a2 >> 16) | (a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ + *(d++) = (a3 >> 32) | (a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ + } } #if !(HAVE_MACOSX || HAVE_32B_LINUX) -inline void gl_copyline128(GLubyte *d, GLubyte *s, int len) +inline void gl_copyline128(GLubyte * d, GLubyte * s, int len) { - register GLubyte *_d=d,*_s=s; + register GLubyte *_d = d, *_s = s; - while(--len >= 0) { + while (--len >= 0) { - asm ("movd %0, %%xmm4\n": : "r" (0xffffff)); + asm("movd %0, %%xmm4\n": :"r"(0xffffff)); asm volatile ("movdqa (%0), %%xmm0\n" - "movdqa 16(%0), %%xmm5\n" - "movdqa %%xmm0, %%xmm1\n" - "movdqa %%xmm0, %%xmm2\n" - "movdqa %%xmm0, %%xmm3\n" - "pand %%xmm4, %%xmm0\n" - "movdqa %%xmm5, %%xmm6\n" - "movdqa %%xmm5, %%xmm7\n" - "movdqa %%xmm5, %%xmm8\n" - "pand %%xmm4, %%xmm5\n" - "pslldq $4, %%xmm4\n" - "pand %%xmm4, %%xmm1\n" - "pand %%xmm4, %%xmm6\n" - "pslldq $4, %%xmm4\n" - "psrldq $1, %%xmm1\n" - "psrldq $1, %%xmm6\n" - "pand %%xmm4, %%xmm2\n" - "pand %%xmm4, %%xmm7\n" - "pslldq $4, %%xmm4\n" - "psrldq $2, %%xmm2\n" - "psrldq $2, %%xmm7\n" - "pand %%xmm4, %%xmm3\n" - "pand %%xmm4, %%xmm8\n" - "por %%xmm1, %%xmm0\n" - "psrldq $3, %%xmm3\n" - "psrldq $3, %%xmm8\n" - "por %%xmm2, %%xmm0\n" - "por %%xmm6, %%xmm5\n" - "por %%xmm3, %%xmm0\n" - "por %%xmm7, %%xmm5\n" - "movdq2q %%xmm0, %%mm0\n" - "por %%xmm8, %%xmm5\n" - "movdqa %%xmm5, %%xmm1\n" - "pslldq $12, %%xmm5\n" - "psrldq $4, %%xmm1\n" - "por %%xmm5, %%xmm0\n" - "psrldq $8, %%xmm0\n" - "movq %%mm0, (%1)\n" - "movdq2q %%xmm0, %%mm1\n" - "movdq2q %%xmm1, %%mm2\n" - "movq %%mm1, 8(%1)\n" - "movq %%mm2, 16(%1)\n" - : - : "r" (_s), "r" (_d)); + "movdqa 16(%0), %%xmm5\n" + "movdqa %%xmm0, %%xmm1\n" + "movdqa %%xmm0, %%xmm2\n" + "movdqa %%xmm0, %%xmm3\n" + "pand %%xmm4, %%xmm0\n" + "movdqa %%xmm5, %%xmm6\n" + "movdqa %%xmm5, %%xmm7\n" + "movdqa %%xmm5, %%xmm8\n" + "pand %%xmm4, %%xmm5\n" + "pslldq $4, %%xmm4\n" + "pand %%xmm4, %%xmm1\n" + "pand %%xmm4, %%xmm6\n" + "pslldq $4, %%xmm4\n" + "psrldq $1, %%xmm1\n" + "psrldq $1, %%xmm6\n" + "pand %%xmm4, %%xmm2\n" + "pand %%xmm4, %%xmm7\n" + "pslldq $4, %%xmm4\n" + "psrldq $2, %%xmm2\n" + "psrldq $2, %%xmm7\n" + "pand %%xmm4, %%xmm3\n" + "pand %%xmm4, %%xmm8\n" + "por %%xmm1, %%xmm0\n" + "psrldq $3, %%xmm3\n" + "psrldq $3, %%xmm8\n" + "por %%xmm2, %%xmm0\n" + "por %%xmm6, %%xmm5\n" + "por %%xmm3, %%xmm0\n" + "por %%xmm7, %%xmm5\n" + "movdq2q %%xmm0, %%mm0\n" + "por %%xmm8, %%xmm5\n" + "movdqa %%xmm5, %%xmm1\n" + "pslldq $12, %%xmm5\n" + "psrldq $4, %%xmm1\n" + "por %%xmm5, %%xmm0\n" + "psrldq $8, %%xmm0\n" + "movq %%mm0, (%1)\n" + "movdq2q %%xmm0, %%mm1\n" + "movdq2q %%xmm1, %%mm2\n" + "movq %%mm1, 8(%1)\n" + "movq %%mm2, 16(%1)\n"::"r" (_s), "r"(_d)); _s += 32; _d += 24; } } -#endif /* !(HAVE_MACOSX || HAVE_32B_LINUX) */ +#endif /* !(HAVE_MACOSX || HAVE_32B_LINUX) */ display_type_t *display_gl_probe(void) { - display_type_t *dt; - display_format_t *dformat; - + display_type_t *dt; + display_format_t *dformat; dformat = malloc(4 * sizeof(display_format_t)); - dformat[0].size = DS_176x144; + dformat[0].size = DS_176x144; dformat[0].colour_mode = DC_YUV; - dformat[0].num_images = 1; - dformat[1].size = DS_352x288; + dformat[0].num_images = 1; + dformat[1].size = DS_352x288; dformat[1].colour_mode = DC_YUV; - dformat[1].num_images = 1; - dformat[2].size = DS_702x576; + dformat[1].num_images = 1; + dformat[2].size = DS_702x576; dformat[2].colour_mode = DC_YUV; - dformat[2].num_images = 1; - dformat[3].size = DS_1280x720; + dformat[2].num_images = 1; + dformat[3].size = DS_1280x720; dformat[3].colour_mode = DC_YUV; - dformat[3].num_images = 1; + dformat[3].num_images = 1; dt = malloc(sizeof(display_type_t)); if (dt != NULL) { - dt->id = DISPLAY_GL_ID; - dt->name = "gl"; + dt->id = DISPLAY_GL_ID; + dt->name = "gl"; dt->description = "OpenGL using SDL"; - dt->formats = dformat; + dt->formats = dformat; dt->num_formats = 4; } return dt; @@ -814,7 +844,7 @@ display_type_t *display_gl_probe(void) void display_gl_done(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_GL); @@ -822,10 +852,10 @@ void display_gl_done(void *state) SDL_Quit(); } - -char* display_gl_getf(void *state) + +char *display_gl_getf(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_GL); return (char *)s->buffers[s->image_network]; } @@ -833,7 +863,7 @@ char* display_gl_getf(void *state) int display_gl_putf(void *state, char *frame) { int tmp; - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_GL); UNUSED(frame); @@ -846,35 +876,36 @@ int display_gl_putf(void *state, char *frame) /* ...and signal the worker */ platform_sem_post(&s->semaphore); sem_getvalue(&s->semaphore, &tmp); - if(tmp > 1) + if (tmp > 1) printf("frame drop!\n"); return 0; } display_colour_t display_gl_colour(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_GL); return DC_YUV; } int display_gl_handle_events(void *state) { - SDL_Event sdl_event; - - UNUSED(state); - + SDL_Event sdl_event; + + UNUSED(state); + while (SDL_PollEvent(&sdl_event)) { switch (sdl_event.type) { - case SDL_KEYDOWN: - case SDL_KEYUP: - if (!strcmp(SDL_GetKeyName(sdl_event.key.keysym.sym), "q")) { - kill(0, SIGINT); - } - break; + case SDL_KEYDOWN: + case SDL_KEYUP: + if (!strcmp + (SDL_GetKeyName(sdl_event.key.keysym.sym), "q")) { + kill(0, SIGINT); + } + break; - default: - break; + default: + break; } } diff --git a/ultragrid/src/video_display/hdstation.c b/ultragrid/src/video_display/hdstation.c index e13146552..f119c54ba 100644 --- a/ultragrid/src/video_display/hdstation.c +++ b/ultragrid/src/video_display/hdstation.c @@ -57,7 +57,7 @@ #include "config_win32.h" #include "host.h" -#ifdef HAVE_HDSTATION /* From config.h */ +#ifdef HAVE_HDSTATION /* From config.h */ #include "debug.h" #include "video_display.h" @@ -65,288 +65,285 @@ #include "video_codec.h" #include "tv.h" -#include "dvs_clib.h" /* From the DVS SDK */ -#include "dvs_fifo.h" /* From the DVS SDK */ +#include "dvs_clib.h" /* From the DVS SDK */ +#include "dvs_fifo.h" /* From the DVS SDK */ #define HDSP_MAGIC 0x12345678 struct state_hdsp { - pthread_t thread_id; - sv_handle *sv; - sv_fifo *fifo; - char *frame_buffer; - int frame_size; - sv_fifo_buffer *fifo_buffer; - sv_fifo_buffer *display_buffer; - sv_fifo_buffer *tmp_buffer; - pthread_mutex_t lock; - pthread_cond_t boss_cv; - pthread_cond_t worker_cv; - int work_to_do; - int boss_waiting; - int worker_waiting; - uint32_t magic; - char *bufs[2]; - int bufs_index; - codec_t codec; - int hd_video_mode; - double bpp; + pthread_t thread_id; + sv_handle *sv; + sv_fifo *fifo; + char *frame_buffer; + int frame_size; + sv_fifo_buffer *fifo_buffer; + sv_fifo_buffer *display_buffer; + sv_fifo_buffer *tmp_buffer; + pthread_mutex_t lock; + pthread_cond_t boss_cv; + pthread_cond_t worker_cv; + int work_to_do; + int boss_waiting; + int worker_waiting; + uint32_t magic; + char *bufs[2]; + int bufs_index; + codec_t codec; + int hd_video_mode; + double bpp; }; -static void* -display_thread_hd(void *arg) +static void *display_thread_hd(void *arg) { - struct state_hdsp *s = (struct state_hdsp *) arg; - int res; + struct state_hdsp *s = (struct state_hdsp *)arg; + int res; - while (1) { - pthread_mutex_lock(&s->lock); + while (1) { + pthread_mutex_lock(&s->lock); - while (s->work_to_do == FALSE) { - s->worker_waiting = TRUE; - pthread_cond_wait(&s->worker_cv, &s->lock); - s->worker_waiting = FALSE; - } + while (s->work_to_do == FALSE) { + s->worker_waiting = TRUE; + pthread_cond_wait(&s->worker_cv, &s->lock); + s->worker_waiting = FALSE; + } - s->display_buffer = s->tmp_buffer; - s->work_to_do = FALSE; + s->display_buffer = s->tmp_buffer; + s->work_to_do = FALSE; - if (s->boss_waiting) { - pthread_cond_signal(&s->boss_cv); - } - pthread_mutex_unlock(&s->lock); + if (s->boss_waiting) { + pthread_cond_signal(&s->boss_cv); + } + pthread_mutex_unlock(&s->lock); - res = sv_fifo_putbuffer(s->sv, s->fifo, s->display_buffer, NULL); - if (res != SV_OK) { - debug_msg("Error %s\n", sv_geterrortext(res)); - return NULL; - } - } - return NULL; -} - -char * -display_hdstation_getf(void *state) -{ - struct state_hdsp *s = (struct state_hdsp *) state; - int res; - - assert(s->magic == HDSP_MAGIC); - - /* Prepare the new RTP buffer... */ - res = sv_fifo_getbuffer(s->sv, s->fifo, &s->fifo_buffer, NULL, SV_FIFO_FLAG_VIDEOONLY | SV_FIFO_FLAG_FLUSH); - if (res != SV_OK) { - debug_msg("Error %s\n", sv_geterrortext(res)); - return NULL; - } - s->bufs_index = (s->bufs_index + 1) % 2; - s->frame_buffer = s->bufs[s->bufs_index]; - s->frame_size = hd_size_x * hd_size_y * s->bpp; - s->fifo_buffer->dma.addr = s->frame_buffer; - s->fifo_buffer->dma.size = s->frame_size; - - return s->frame_buffer; -} - -int -display_hdstation_putf(void *state, char *frame) -{ - struct state_hdsp *s = (struct state_hdsp *) state; - - UNUSED(frame); - - assert(s->magic == HDSP_MAGIC); - - pthread_mutex_lock(&s->lock); - /* Wait for the worker to finish... */ - while (s->work_to_do) { - s->boss_waiting = TRUE; - pthread_cond_wait(&s->boss_cv, &s->lock); - s->boss_waiting = FALSE; - } - - /* ...and give it more to do... */ - s->tmp_buffer = s->fifo_buffer; - s->fifo_buffer = NULL; - s->work_to_do = TRUE; - - /* ...and signal the worker */ - if (s->worker_waiting) { - pthread_cond_signal(&s->worker_cv); - } - pthread_mutex_unlock(&s->lock); - - return TRUE; -} - -void * -display_hdstation_init(char *fmt) -{ - struct state_hdsp *s; - int fps; - int i; - int res; - - if (fmt != NULL) { - if (strcmp(fmt, "help") == 0) { - printf("hdstation options:\n"); - printf("\tfps:codec\n"); - - return 0; - } - - char *tmp; - - tmp = strtok(fmt, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - fps = atoi(tmp); - tmp = strtok(NULL, ":"); - if (!tmp) { - fprintf(stderr, "Wrong config %s\n", fmt); - return 0; - } - s->codec = 0xffffffff; - for(i = 0; codec_info[i].name != NULL; i++) { - if(strcmp(tmp, codec_info[i].name) == 0) { - s->codec = codec_info[i].codec; - s->bpp = codec_info[i].bpp; + res = + sv_fifo_putbuffer(s->sv, s->fifo, s->display_buffer, NULL); + if (res != SV_OK) { + debug_msg("Error %s\n", sv_geterrortext(res)); + return NULL; } } - if(s->codec == 0xffffffff) { - fprintf(stderr, "hdstation: unknown codec: %s\n", tmp); - free(s); - free(tmp); - return 0; - } - } - - s->hd_video_mode=SV_MODE_COLOR_YUV422 | SV_MODE_ACTIVE_STREAMER; - - if (s->codec == DVS10) { - s->hd_video_mode |= SV_MODE_NBIT_10BDVS; - } - if (fps == 25) { - s->hd_video_mode |= SV_MODE_SMPTE274_25P; - } - else if (fps == 29) { - s->hd_video_mode |= SV_MODE_SMPTE274_29I; - } - else { - fprintf(stderr, "Wrong framerate in config %s\n", fmt); - return 0; - } - - /* Start the display thread... */ - s = (struct state_hdsp *) malloc(sizeof(struct state_hdsp)); - s->magic = HDSP_MAGIC; - s->frame_size = 0; - s->frame_buffer = 0; - - s->sv = sv_open(""); - if (s->sv == NULL) { - debug_msg("Cannot open HDTV display device\n"); - return NULL; - } - res = sv_videomode(s->sv, s->hd_video_mode | SV_MODE_AUDIO_NOAUDIO); - if (res != SV_OK) { - debug_msg("Cannot set videomode %s\n", sv_geterrortext(res)); - return NULL; - } - res = sv_sync_output(s->sv, SV_SYNCOUT_BILEVEL); - if (res != SV_OK) { - debug_msg("Cannot enable sync-on-green %s\n", sv_geterrortext(res)); - return NULL; - } - - res = sv_fifo_init(s->sv, &s->fifo, 0, 1, 1, 0, 0); - if (res != SV_OK) { - debug_msg("Cannot initialize video display FIFO %s\n", sv_geterrortext(res)); - return NULL; - } - res = sv_fifo_start(s->sv, s->fifo); - if (res != SV_OK) { - debug_msg("Cannot start video display FIFO %s\n", sv_geterrortext(res)); - return NULL; - } - - pthread_mutex_init(&s->lock, NULL); - pthread_cond_init(&s->boss_cv, NULL); - pthread_cond_init(&s->worker_cv, NULL); - s->work_to_do = FALSE; - s->boss_waiting = FALSE; - s->worker_waiting = FALSE; - s->display_buffer = NULL; - - s->bufs[0] = malloc(hd_size_x * hd_size_y * s->bpp); - s->bufs[1] = malloc(hd_size_x * hd_size_y * s->bpp); - s->bufs_index = 0; - memset(s->bufs[0], 0, hd_size_x * hd_size_y * s->bpp); - memset(s->bufs[1], 0, hd_size_x * hd_size_y * s->bpp); - - if (pthread_create(&(s->thread_id), NULL, display_thread_hd, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } - - return (void *) s; + return NULL; } -void -display_hdstation_done(void *state) +char *display_hdstation_getf(void *state) { - struct state_hdsp *s = (struct state_hdsp *) state; + struct state_hdsp *s = (struct state_hdsp *)state; + int res; - sv_fifo_free(s->sv, s->fifo); - sv_close(s->sv); - free(s); + assert(s->magic == HDSP_MAGIC); + + /* Prepare the new RTP buffer... */ + res = + sv_fifo_getbuffer(s->sv, s->fifo, &s->fifo_buffer, NULL, + SV_FIFO_FLAG_VIDEOONLY | SV_FIFO_FLAG_FLUSH); + if (res != SV_OK) { + debug_msg("Error %s\n", sv_geterrortext(res)); + return NULL; + } + s->bufs_index = (s->bufs_index + 1) % 2; + s->frame_buffer = s->bufs[s->bufs_index]; + s->frame_size = hd_size_x * hd_size_y * s->bpp; + s->fifo_buffer->dma.addr = s->frame_buffer; + s->fifo_buffer->dma.size = s->frame_size; + + return s->frame_buffer; } -display_colour_t -display_hdstation_colour(void *state) +int display_hdstation_putf(void *state, char *frame) { - struct state_hdsp *s = (struct state_hdsp *) state; + struct state_hdsp *s = (struct state_hdsp *)state; - assert(s->magic == HDSP_MAGIC); + UNUSED(frame); - return DC_YUV; + assert(s->magic == HDSP_MAGIC); + + pthread_mutex_lock(&s->lock); + /* Wait for the worker to finish... */ + while (s->work_to_do) { + s->boss_waiting = TRUE; + pthread_cond_wait(&s->boss_cv, &s->lock); + s->boss_waiting = FALSE; + } + + /* ...and give it more to do... */ + s->tmp_buffer = s->fifo_buffer; + s->fifo_buffer = NULL; + s->work_to_do = TRUE; + + /* ...and signal the worker */ + if (s->worker_waiting) { + pthread_cond_signal(&s->worker_cv); + } + pthread_mutex_unlock(&s->lock); + + return TRUE; } -display_type_t * -display_hdstation_probe(void) +void *display_hdstation_init(char *fmt) { - display_type_t *dtype; - display_format_t *dformat; - sv_handle *sv; - - /* Probe the hardware... */ - sv = sv_open(""); - if (sv == NULL) { - debug_msg("Cannot probe HDTV display device\n"); - return NULL; - } - sv_close(sv); + struct state_hdsp *s; + int fps; + int i; + int res; - dformat = malloc(sizeof(display_format_t)); - if (dformat == NULL) { - return NULL; - } - dformat->size = DS_1920x1080; - dformat->colour_mode = DC_YUV; - dformat->num_images = 1; + if (fmt != NULL) { + if (strcmp(fmt, "help") == 0) { + printf("hdstation options:\n"); + printf("\tfps:codec\n"); - dtype = malloc(sizeof(display_type_t)); - if (dtype != NULL) { - dtype->id = DISPLAY_HDSTATION_ID; - dtype->name = "hdtv"; - dtype->description = "DVS HDstation (1080i/60 YUV 4:2:2)"; - dtype->formats = dformat; - dtype->num_formats = 1; - } - return dtype; + return 0; + } + + char *tmp; + + tmp = strtok(fmt, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + fps = atoi(tmp); + tmp = strtok(NULL, ":"); + if (!tmp) { + fprintf(stderr, "Wrong config %s\n", fmt); + return 0; + } + s->codec = 0xffffffff; + for (i = 0; codec_info[i].name != NULL; i++) { + if (strcmp(tmp, codec_info[i].name) == 0) { + s->codec = codec_info[i].codec; + s->bpp = codec_info[i].bpp; + } + } + if (s->codec == 0xffffffff) { + fprintf(stderr, "hdstation: unknown codec: %s\n", tmp); + free(s); + free(tmp); + return 0; + } + } + + s->hd_video_mode = SV_MODE_COLOR_YUV422 | SV_MODE_ACTIVE_STREAMER; + + if (s->codec == DVS10) { + s->hd_video_mode |= SV_MODE_NBIT_10BDVS; + } + if (fps == 25) { + s->hd_video_mode |= SV_MODE_SMPTE274_25P; + } else if (fps == 29) { + s->hd_video_mode |= SV_MODE_SMPTE274_29I; + } else { + fprintf(stderr, "Wrong framerate in config %s\n", fmt); + return 0; + } + + /* Start the display thread... */ + s = (struct state_hdsp *)malloc(sizeof(struct state_hdsp)); + s->magic = HDSP_MAGIC; + s->frame_size = 0; + s->frame_buffer = 0; + + s->sv = sv_open(""); + if (s->sv == NULL) { + debug_msg("Cannot open HDTV display device\n"); + return NULL; + } + res = sv_videomode(s->sv, s->hd_video_mode | SV_MODE_AUDIO_NOAUDIO); + if (res != SV_OK) { + debug_msg("Cannot set videomode %s\n", sv_geterrortext(res)); + return NULL; + } + res = sv_sync_output(s->sv, SV_SYNCOUT_BILEVEL); + if (res != SV_OK) { + debug_msg("Cannot enable sync-on-green %s\n", + sv_geterrortext(res)); + return NULL; + } + + res = sv_fifo_init(s->sv, &s->fifo, 0, 1, 1, 0, 0); + if (res != SV_OK) { + debug_msg("Cannot initialize video display FIFO %s\n", + sv_geterrortext(res)); + return NULL; + } + res = sv_fifo_start(s->sv, s->fifo); + if (res != SV_OK) { + debug_msg("Cannot start video display FIFO %s\n", + sv_geterrortext(res)); + return NULL; + } + + pthread_mutex_init(&s->lock, NULL); + pthread_cond_init(&s->boss_cv, NULL); + pthread_cond_init(&s->worker_cv, NULL); + s->work_to_do = FALSE; + s->boss_waiting = FALSE; + s->worker_waiting = FALSE; + s->display_buffer = NULL; + + s->bufs[0] = malloc(hd_size_x * hd_size_y * s->bpp); + s->bufs[1] = malloc(hd_size_x * hd_size_y * s->bpp); + s->bufs_index = 0; + memset(s->bufs[0], 0, hd_size_x * hd_size_y * s->bpp); + memset(s->bufs[1], 0, hd_size_x * hd_size_y * s->bpp); + + if (pthread_create(&(s->thread_id), NULL, display_thread_hd, (void *)s) + != 0) { + perror("Unable to create display thread\n"); + return NULL; + } + + return (void *)s; } -#endif /* HAVE_HDSTATION */ +void display_hdstation_done(void *state) +{ + struct state_hdsp *s = (struct state_hdsp *)state; + sv_fifo_free(s->sv, s->fifo); + sv_close(s->sv); + free(s); +} + +display_colour_t display_hdstation_colour(void *state) +{ + struct state_hdsp *s = (struct state_hdsp *)state; + + assert(s->magic == HDSP_MAGIC); + + return DC_YUV; +} + +display_type_t *display_hdstation_probe(void) +{ + display_type_t *dtype; + display_format_t *dformat; + sv_handle *sv; + + /* Probe the hardware... */ + sv = sv_open(""); + if (sv == NULL) { + debug_msg("Cannot probe HDTV display device\n"); + return NULL; + } + sv_close(sv); + + dformat = malloc(sizeof(display_format_t)); + if (dformat == NULL) { + return NULL; + } + dformat->size = DS_1920x1080; + dformat->colour_mode = DC_YUV; + dformat->num_images = 1; + + dtype = malloc(sizeof(display_type_t)); + if (dtype != NULL) { + dtype->id = DISPLAY_HDSTATION_ID; + dtype->name = "hdtv"; + dtype->description = "DVS HDstation (1080i/60 YUV 4:2:2)"; + dtype->formats = dformat; + dtype->num_formats = 1; + } + return dtype; +} + +#endif /* HAVE_HDSTATION */ diff --git a/ultragrid/src/video_display/null.c b/ultragrid/src/video_display/null.c index 2633c0cff..5ad672f88 100644 --- a/ultragrid/src/video_display/null.c +++ b/ultragrid/src/video_display/null.c @@ -53,76 +53,69 @@ #define MAGIC_NULL 0x17bad83f struct state_null { - uint32_t magic; + uint32_t magic; }; -void * -display_null_init(void) +void *display_null_init(void) { - struct state_null *s; + struct state_null *s; - s = (struct state_null *) malloc(sizeof(struct state_null)); - if (s != NULL) { - s->magic = MAGIC_NULL; - } - return s; + s = (struct state_null *)malloc(sizeof(struct state_null)); + if (s != NULL) { + s->magic = MAGIC_NULL; + } + return s; } -void -display_null_done(void *state) +void display_null_done(void *state) { - struct state_null *s = (struct state_null *) state; - assert(s->magic == MAGIC_NULL); - free(s); + struct state_null *s = (struct state_null *)state; + assert(s->magic == MAGIC_NULL); + free(s); } -char * -display_null_getf(void *state) +char *display_null_getf(void *state) { - struct state_null *s = (struct state_null *) state; - assert(s->magic == MAGIC_NULL); - return NULL; + struct state_null *s = (struct state_null *)state; + assert(s->magic == MAGIC_NULL); + return NULL; } -int -display_null_putf(void *state, char *frame) +int display_null_putf(void *state, char *frame) { - struct state_null *s = (struct state_null *) state; - assert(s->magic == MAGIC_NULL); - UNUSED(frame); - return 0; + struct state_null *s = (struct state_null *)state; + assert(s->magic == MAGIC_NULL); + UNUSED(frame); + return 0; } -display_colour_t -display_null_colour(void *state) +display_colour_t display_null_colour(void *state) { - struct state_null *s = (struct state_null *) state; - assert(s->magic == MAGIC_NULL); - return DC_NONE; + struct state_null *s = (struct state_null *)state; + assert(s->magic == MAGIC_NULL); + return DC_NONE; } -display_type_t * -display_null_probe(void) +display_type_t *display_null_probe(void) { - display_type_t *dt; - display_format_t *df; + display_type_t *dt; + display_format_t *df; - df = malloc(sizeof(display_format_t)); - if (df == NULL) { - return NULL; - } - df->size = DS_NONE; - df->colour_mode = DC_NONE; - df->num_images = 0; + df = malloc(sizeof(display_format_t)); + if (df == NULL) { + return NULL; + } + df->size = DS_NONE; + df->colour_mode = DC_NONE; + df->num_images = 0; - dt = malloc(sizeof(display_type_t)); - if (dt != NULL) { - dt->id = DISPLAY_NULL_ID; - dt->name = "none"; - dt->description = "No display device"; - dt->formats = df; - dt->num_formats = 1; - } - return dt; + dt = malloc(sizeof(display_type_t)); + if (dt != NULL) { + dt->id = DISPLAY_NULL_ID; + dt->name = "none"; + dt->description = "No display device"; + dt->formats = df; + dt->num_formats = 1; + } + return dt; } - diff --git a/ultragrid/src/video_display/quicktime.c b/ultragrid/src/video_display/quicktime.c index 294a4f8b8..48a3c67b9 100644 --- a/ultragrid/src/video_display/quicktime.c +++ b/ultragrid/src/video_display/quicktime.c @@ -68,503 +68,534 @@ #define MAGIC_QT_DISPLAY DISPLAY_QUICKTIME_ID - struct state_quicktime { - ComponentInstance videoDisplayComponentInstance; -// Component videoDisplayComponent; - GWorldPtr gworld; - ImageSequence seqID; + ComponentInstance videoDisplayComponentInstance; +// Component videoDisplayComponent; + GWorldPtr gworld; + ImageSequence seqID; - char *buffers[2]; - char *outBuffer; - int image_display, image_network; + char *buffers[2]; + char *outBuffer; + int image_display, image_network; - int device; - int mode; - char *codec; - const struct codec_info_t *cinfo; - int width; - int height; + int device; + int mode; + char *codec; + const struct codec_info_t *cinfo; + int width; + int height; /* Thread related information follows... */ - pthread_t thread_id; - sem_t semaphore; + pthread_t thread_id; + sem_t semaphore; - uint32_t magic; + uint32_t magic; }; /* Prototyping */ -char * four_char_decode(int format); +char *four_char_decode(int format); void nprintf(char *str); - -char * four_char_decode(int format) +char *four_char_decode(int format) { - static char fbuf0[32]; - static char fbuf1[32]; - static int count = 0; - char *fbuf; + static char fbuf0[32]; + static char fbuf1[32]; + static int count = 0; + char *fbuf; - if (count & 1) - fbuf = fbuf1; - else - fbuf = fbuf0; - count++; + if (count & 1) + fbuf = fbuf1; + else + fbuf = fbuf0; + count++; - if ((unsigned)format < 64) - sprintf(fbuf, "%d", format); - else { - fbuf[0] = (char)(format >> 24); - fbuf[1] = (char)(format >> 16); - fbuf[2] = (char)(format >> 8); - fbuf[3] = (char)(format >> 0); - } - return fbuf; -} - -static void* -display_thread_quicktime(void *arg) -{ - struct state_quicktime *s = (struct state_quicktime *) arg; - - ImageDescriptionHandle imageDesc; - CodecFlags ignore; - int ret; - - char *line1, *line2; - - int frames = 0; - struct timeval t, t0; - - - imageDesc = (ImageDescriptionHandle)NewHandle(sizeof(ImageDescription)); - - platform_sem_wait(&s->semaphore); - - (**(ImageDescriptionHandle)imageDesc).idSize = sizeof(ImageDescription); - (**(ImageDescriptionHandle)imageDesc).cType = s->cinfo->fcc; - (**(ImageDescriptionHandle)imageDesc).dataSize = hd_size_x * hd_size_y * s->cinfo->bpp; // dataSize is specified in bytes and is specified as height*width*bytes_per_luma_instant. v210 sets bytes_per_luma_instant to 8/3. See http://developer.apple.com/quicktime/icefloe/dispatch019.html#v210 - //(**(ImageDescriptionHandle)imageDesc).cType = '2Vuy'; // QuickTime specifies '2vuy' codec, however Kona3 reports it as '2Vuy' - //(**(ImageDescriptionHandle)imageDesc).hRes = 72; // not used actually. Set to 72. See http://developer.apple.com/quicktime/icefloe/dispatch019.html#imagedesc - //(**(ImageDescriptionHandle)imageDesc).vRes = 72; // not used actually. Set to 72. See http://developer.apple.com/quicktime/icefloe/dispatch019.html#imagedesc - (**(ImageDescriptionHandle)imageDesc).width = s->width; // Beware: must be a multiple of horiz_align_pixels which is 2 for 2Vuy and 48 for v210. hd_size_x=1920 is a multiple of both. TODO: needs further investigation for 2K! - (**(ImageDescriptionHandle)imageDesc).height = s->height; - //(**(ImageDescriptionHandle)imageDesc).frameCount = 0; - //(**(ImageDescriptionHandle)imageDesc).depth = 24; // Given by the cType. See http://developer.apple.com/quicktime/icefloe/dispatch019.html - //(**(ImageDescriptionHandle)imageDesc).clutID = -1; // We dont use any custom color table - - ret = DecompressSequenceBeginS(&(s->seqID), - imageDesc, - s->buffers[s->image_display], - hd_size_x * hd_size_y * s->cinfo->bpp, // Size of the buffer, not size of the actual frame data inside - s->gworld, - NULL, - NULL, - NULL, - srcCopy, - NULL, - (CodecFlags)NULL, - codecNormalQuality, - bestSpeedCodec); - if (ret != noErr) { - fprintf(stderr, "Failed DecompressSequenceBeginS\n"); - } - DisposeHandle((Handle)imageDesc); - - //ICMFrameTimeRecord frameTime = {{0}}; - //TimeBase timeBase; - - //timeBase = NewTimeBase(); - //SetTimeBaseRate(timeBase, 0); - - /* TODO frametime probably not needed */ - //memset(&frameTime, 0, sizeof(ICMFrameTimeRecord)); - //frameTime.recordSize = sizeof(frameTime); - //frameTime.scale = 1000; // Units per second - //frameTime.base = timeBase; // Specifying a timeBase means that DecompressSequenceFrameWhen must run asynchronously - //frameTime.duration = 30; // Duration of one frame specified accordingly to the scale specified above - //frameTime.frameNumber = 0; // We don't know the frame number - //frameTime.flags = icmFrameTimeDecodeImmediately; - - while (1) { - platform_sem_wait(&s->semaphore); - - line1 = s->buffers[s->image_display]; - line2 = s->outBuffer; - memcpy(line2, line1, hd_size_x*hd_size_y*s->cinfo->bpp); - - /* TODO: Running DecompressSequenceFrameWhen asynchronously in this way introduces a possible race condition! */ - ret = DecompressSequenceFrameWhen(s->seqID, - s->outBuffer, - hd_size_x * hd_size_y * s->cinfo->bpp, // Size of the buffer, not size of the actual frame data inside - 0, - &ignore, - -1, // If you set asyncCompletionProc to -1, the operation is performed asynchronously but the decompressor does not call the completion function. - NULL); - //&frameTime); - if (ret != noErr) { - fprintf(stderr, "Failed DecompressSequenceFrameWhen: %d\n", ret); - } - - frames++; - gettimeofday(&t, NULL); - double seconds = tv_diff(t, t0); - if (seconds >= 5) { - float fps = frames / seconds; - fprintf(stderr, "%d frames in %g seconds = %g FPS\n", frames, seconds, fps); - t0 = t; - frames = 0; - } - } - - return NULL; -} - -char * -display_quicktime_getf(void *state) -{ - struct state_quicktime *s = (struct state_quicktime *) state; - assert(s->magic == MAGIC_QT_DISPLAY); - return (char *)s->buffers[s->image_network]; -} - -int -display_quicktime_putf(void *state, char *frame) -{ - int tmp; - struct state_quicktime *s = (struct state_quicktime *) state; - - UNUSED(frame); - assert(s->magic == MAGIC_QT_DISPLAY); - - /* ...and give it more to do... */ - tmp = s->image_display; - s->image_display = s->image_network; - s->image_network = tmp; - - /* ...and signal the worker */ - platform_sem_post(&s->semaphore); - return 0; -} - -static void -print_modes(int fullhelp) -{ - ComponentDescription cd; - Component c = 0; - - cd.componentType = QTVideoOutputComponentType; - cd.componentSubType = 0; - cd.componentManufacturer = 0; - cd.componentFlags = 0; - cd.componentFlagsMask = kQTVideoOutputDontDisplayToUser; - - //fprintf(stdout, "Number of Quicktime Vido Display components %d\n", CountComponents (&cd)); - - fprintf(stdout, "Available playback devices:\n"); - /* Print relevant video output components */ - while ((c = FindNextComponent(c, &cd))) { - Handle componentNameHandle = NewHandle(0); - GetComponentInfo(c, &cd, componentNameHandle, NULL, NULL); - HLock(componentNameHandle); - char *cName = *componentNameHandle; - - fprintf(stdout, " Device %d: ", (int)c); - nprintf(cName); - fprintf(stdout, "\n"); - - HUnlock(componentNameHandle); - DisposeHandle(componentNameHandle); - - /* Get display modes of selected video output component */ - QTAtomContainer modeListAtomContainer = NULL; - ComponentInstance videoDisplayComponentInstance; - - videoDisplayComponentInstance = OpenComponent(c); - - int ret = QTVideoOutputGetDisplayModeList(videoDisplayComponentInstance, &modeListAtomContainer); - if (ret != noErr || modeListAtomContainer == NULL) { - fprintf(stdout, "\tNo output modes available\n"); - CloseComponent(videoDisplayComponentInstance); - continue; + if ((unsigned)format < 64) + sprintf(fbuf, "%d", format); + else { + fbuf[0] = (char)(format >> 24); + fbuf[1] = (char)(format >> 16); + fbuf[2] = (char)(format >> 8); + fbuf[3] = (char)(format >> 0); } + return fbuf; +} - int i = 1; - QTAtom atomDisplay = 0, nextAtomDisplay = 0; - QTAtomType type; - QTAtomID id; +static void *display_thread_quicktime(void *arg) +{ + struct state_quicktime *s = (struct state_quicktime *)arg; - /* Print modes of current display component */ - while (i < QTCountChildrenOfType(modeListAtomContainer, kParentAtomIsContainer, kQTVODisplayModeItem)) { + ImageDescriptionHandle imageDesc; + CodecFlags ignore; + int ret; - ret = QTNextChildAnyType(modeListAtomContainer, kParentAtomIsContainer, atomDisplay, &nextAtomDisplay); - // Make sure its a display atom - ret = QTGetAtomTypeAndID(modeListAtomContainer, nextAtomDisplay, &type, &id); - if (type != kQTVODisplayModeItem) continue; + char *line1, *line2; - atomDisplay = nextAtomDisplay; + int frames = 0; + struct timeval t, t0; - QTAtom atom; - long dataSize, *dataPtr; + imageDesc = + (ImageDescriptionHandle) NewHandle(sizeof(ImageDescription)); - /* Print component ID */ - fprintf(stdout, "\t - %ld: ", id); + platform_sem_wait(&s->semaphore); - /* Print component name */ - atom = QTFindChildByID(modeListAtomContainer, atomDisplay, kQTVOName, 1, NULL); - ret = QTGetAtomDataPtr(modeListAtomContainer, atom, &dataSize, (Ptr*)&dataPtr); - fprintf(stdout, " %s; ", (char *)dataPtr); + (**(ImageDescriptionHandle) imageDesc).idSize = + sizeof(ImageDescription); + (**(ImageDescriptionHandle) imageDesc).cType = s->cinfo->fcc; + (**(ImageDescriptionHandle) imageDesc).dataSize = hd_size_x * hd_size_y * s->cinfo->bpp; // dataSize is specified in bytes and is specified as height*width*bytes_per_luma_instant. v210 sets bytes_per_luma_instant to 8/3. See http://developer.apple.com/quicktime/icefloe/dispatch019.html#v210 + //(**(ImageDescriptionHandle)imageDesc).cType = '2Vuy'; // QuickTime specifies '2vuy' codec, however Kona3 reports it as '2Vuy' + //(**(ImageDescriptionHandle)imageDesc).hRes = 72; // not used actually. Set to 72. See http://developer.apple.com/quicktime/icefloe/dispatch019.html#imagedesc + //(**(ImageDescriptionHandle)imageDesc).vRes = 72; // not used actually. Set to 72. See http://developer.apple.com/quicktime/icefloe/dispatch019.html#imagedesc + (**(ImageDescriptionHandle) imageDesc).width = s->width; // Beware: must be a multiple of horiz_align_pixels which is 2 for 2Vuy and 48 for v210. hd_size_x=1920 is a multiple of both. TODO: needs further investigation for 2K! + (**(ImageDescriptionHandle) imageDesc).height = s->height; + //(**(ImageDescriptionHandle)imageDesc).frameCount = 0; + //(**(ImageDescriptionHandle)imageDesc).depth = 24; // Given by the cType. See http://developer.apple.com/quicktime/icefloe/dispatch019.html + //(**(ImageDescriptionHandle)imageDesc).clutID = -1; // We dont use any custom color table - //if (strcmp((char *)dataPtr, mode) == 0) { - // displayMode = id; - //} + ret = DecompressSequenceBeginS(&(s->seqID), imageDesc, s->buffers[s->image_display], hd_size_x * hd_size_y * s->cinfo->bpp, // Size of the buffer, not size of the actual frame data inside + s->gworld, + NULL, + NULL, + NULL, + srcCopy, + NULL, + (CodecFlags) NULL, + codecNormalQuality, bestSpeedCodec); + if (ret != noErr) { + fprintf(stderr, "Failed DecompressSequenceBeginS\n"); + } + DisposeHandle((Handle) imageDesc); - /* Print component other info */ - atom = QTFindChildByID(modeListAtomContainer, atomDisplay, kQTVODimensions, 1, NULL); - ret = QTGetAtomDataPtr(modeListAtomContainer, atom, &dataSize, (Ptr *)&dataPtr); - fprintf(stdout, "%dx%d px\n", (int)EndianS32_BtoN(dataPtr[0]), (int)EndianS32_BtoN(dataPtr[1])); + //ICMFrameTimeRecord frameTime = {{0}}; + //TimeBase timeBase; - /* Do not print codecs */ - if (!fullhelp) { - i++; - continue; - } + //timeBase = NewTimeBase(); + //SetTimeBaseRate(timeBase, 0); - /* Print supported pixel formats */ - fprintf(stdout, "\t\t - Codec: "); - QTAtom decompressorsAtom; - int j = 1; - int codecsPerLine = 0; - while ((decompressorsAtom = QTFindChildByIndex(modeListAtomContainer, atomDisplay, kQTVODecompressors, j, NULL)) != 0) { - atom = QTFindChildByID(modeListAtomContainer, decompressorsAtom, kQTVODecompressorType, 1, NULL); - ret = QTGetAtomDataPtr(modeListAtomContainer, atom, &dataSize, (Ptr *)&dataPtr); - if (!(codecsPerLine % 9)) { - fprintf(stdout, "\n \t\t\t"); - fprintf(stdout, "%s", (char *)dataPtr); - } else { - fprintf(stdout, ", %s", (char *)dataPtr); + /* TODO frametime probably not needed */ + //memset(&frameTime, 0, sizeof(ICMFrameTimeRecord)); + //frameTime.recordSize = sizeof(frameTime); + //frameTime.scale = 1000; // Units per second + //frameTime.base = timeBase; // Specifying a timeBase means that DecompressSequenceFrameWhen must run asynchronously + //frameTime.duration = 30; // Duration of one frame specified accordingly to the scale specified above + //frameTime.frameNumber = 0; // We don't know the frame number + //frameTime.flags = icmFrameTimeDecodeImmediately; + + while (1) { + platform_sem_wait(&s->semaphore); + + line1 = s->buffers[s->image_display]; + line2 = s->outBuffer; + memcpy(line2, line1, hd_size_x * hd_size_y * s->cinfo->bpp); + + /* TODO: Running DecompressSequenceFrameWhen asynchronously in this way introduces a possible race condition! */ + ret = DecompressSequenceFrameWhen(s->seqID, s->outBuffer, hd_size_x * hd_size_y * s->cinfo->bpp, // Size of the buffer, not size of the actual frame data inside + 0, &ignore, -1, // If you set asyncCompletionProc to -1, the operation is performed asynchronously but the decompressor does not call the completion function. + NULL); + //&frameTime); + if (ret != noErr) { + fprintf(stderr, + "Failed DecompressSequenceFrameWhen: %d\n", + ret); } - codecsPerLine++; - //atom = QTFindChildByID(modeListAtomContainer, decompressorsAtom, kQTVODecompressorComponent, 1, NULL); - //ret = QTGetAtomDataPtr(modeListAtomContainer, atom, &dataSize, (Ptr *)&dataPtr); - //fprintf(stdout, "%s\n", (char *)dataPtr); - - j++; - } - fprintf(stdout, "\n\n"); - - i++; - CloseComponent(videoDisplayComponentInstance); - } - fprintf(stdout, "\n"); - - cd.componentType = QTVideoOutputComponentType; - cd.componentSubType = 0; - cd.componentManufacturer = 0; - cd.componentFlags = 0; - cd.componentFlagsMask = kQTVideoOutputDontDisplayToUser; - } -} - -static void -show_help(int full) -{ - printf("Quicktime output options:\n"); - printf("\tdevice:mode:codec | help | fullhelp\n"); - print_modes(full); -} - - -void * -display_quicktime_init(char *fmt) -{ - struct state_quicktime *s; - int ret; - int i; - - /* Parse fmt input */ - s = (struct state_quicktime *) malloc(sizeof(struct state_quicktime)); - s->magic = MAGIC_QT_DISPLAY; - - if(fmt!=NULL) { - if(strcmp(fmt, "help") == 0) { - show_help(0); - free(s); - return NULL; + frames++; + gettimeofday(&t, NULL); + double seconds = tv_diff(t, t0); + if (seconds >= 5) { + float fps = frames / seconds; + fprintf(stderr, "%d frames in %g seconds = %g FPS\n", + frames, seconds, fps); + t0 = t; + frames = 0; + } } - if(strcmp(fmt, "fullhelp") == 0) { - show_help(1); - free(s); - return NULL; - } - char *tmp = strdup(fmt); - char *tok; - tok = strtok(tmp, ":"); - if(tok == NULL) { - show_help(0); - free(s); - free(tmp); - return NULL; - } - s->device = atol(tok); - tok = strtok(NULL, ":"); - if(tok == NULL) { - show_help(0); - free(s); - free(tmp); - return NULL; - } - s->mode = atol(tok); - tok = strtok(NULL, ":"); - if(tok == NULL) { - show_help(0); - free(s); - free(tmp); - return NULL; - } - s->codec = strdup(tok); - } - - for(i = 0; codec_info[i].name != NULL; i++) { - if(strcmp(s->codec, codec_info[i].name) == 0) { - s->cinfo = &codec_info[i]; - } - } - - s->videoDisplayComponentInstance = 0; - s->seqID = 0; - - /* Open device */ - s->videoDisplayComponentInstance = OpenComponent((Component)s->device); - - InitCursor(); - EnterMovies(); - - /* Set the display mode */ - ret = QTVideoOutputSetDisplayMode(s->videoDisplayComponentInstance, s->mode); - if (ret != noErr) { - fprintf(stderr, "Failed to set video output display mode.\n"); - return NULL; - } - - /* We don't want to use the video output component instance echo port*/ - ret = QTVideoOutputSetEchoPort(s->videoDisplayComponentInstance, nil); - if (ret != noErr) { - fprintf(stderr, "Failed to set video output echo port.\n"); - return NULL; - } - - /* Register Ultragrid with instande of the video outpiut */ - ret = QTVideoOutputSetClientName(s->videoDisplayComponentInstance, (ConstStr255Param)"Ultragrid"); - if (ret != noErr) { - fprintf(stderr, "Failed to register Ultragrid with selected video output instance.\n"); - return NULL; - } - - /* Call QTVideoOutputBegin to gain exclusive access to the video output */ - ret = QTVideoOutputBegin(s->videoDisplayComponentInstance); - if (ret != noErr) { - fprintf(stderr, "Failed to get exclusive access to selected video output instance.\n"); - return NULL; - } - - /* Get a pointer to the gworld used by video output component */ - ret = QTVideoOutputGetGWorld(s->videoDisplayComponentInstance, &s->gworld); - if (ret != noErr) { - fprintf(stderr, "Failed to get selected video output instance GWorld.\n"); - return NULL; - } - - ImageDescriptionHandle gWorldImgDesc = NULL; - PixMapHandle gWorldPixmap = (PixMapHandle)GetGWorldPixMap(s->gworld); - - /* Determine width and height */ - ret = MakeImageDescriptionForPixMap(gWorldPixmap, &gWorldImgDesc); - if (ret != noErr) { - fprintf(stderr, "Failed to determine width and height.\n"); return NULL; - } - hd_size_x = s->width = (**gWorldImgDesc).width; - hd_size_y = s->height = (**gWorldImgDesc).height; - - if (s->cinfo->h_align) { - hd_size_x = ((hd_size_x + s->cinfo->h_align -1) / s->cinfo->h_align) * s->cinfo->h_align; - } - - fprintf(stdout, "Selected mode: %d(%d)x%d, %fbpp\n", s->width, hd_size_x, hd_size_y, s->cinfo->bpp); - - platform_sem_init(&s->semaphore, 0, 0); - - s->buffers[0] = malloc(hd_size_x*hd_size_y*s->cinfo->bpp); - s->buffers[1] = malloc(hd_size_x*hd_size_y*s->cinfo->bpp); - - s->image_network = 0; - s->image_display = 1; - - s->outBuffer = malloc(hd_size_x*hd_size_y*s->cinfo->bpp); - - if (pthread_create(&(s->thread_id), NULL, display_thread_quicktime, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } - - return (void *) s; } -void -display_quicktime_done(void *state) +char *display_quicktime_getf(void *state) { - struct state_quicktime *s = (struct state_quicktime *) state; - int ret; - - assert(s->magic == MAGIC_QT_DISPLAY); - ret = QTVideoOutputEnd(s->videoDisplayComponentInstance); - if (ret != noErr) { - fprintf(stderr, "Failed to release the video output component.\n"); - } - - ret = CloseComponent(s->videoDisplayComponentInstance); - if (ret != noErr) { - fprintf(stderr, "Failed to close the video output component.\n"); - } - - DisposeGWorld(s->gworld); + struct state_quicktime *s = (struct state_quicktime *)state; + assert(s->magic == MAGIC_QT_DISPLAY); + return (char *)s->buffers[s->image_network]; } -display_colour_t -display_quicktime_colour(void *state) +int display_quicktime_putf(void *state, char *frame) { - struct state_quicktime *s = (struct state_quicktime *) state; - assert(s->magic == MAGIC_QT_DISPLAY); - return DC_YUV; + int tmp; + struct state_quicktime *s = (struct state_quicktime *)state; + + UNUSED(frame); + assert(s->magic == MAGIC_QT_DISPLAY); + + /* ...and give it more to do... */ + tmp = s->image_display; + s->image_display = s->image_network; + s->image_network = tmp; + + /* ...and signal the worker */ + platform_sem_post(&s->semaphore); + return 0; } -display_type_t * -display_quicktime_probe(void) +static void print_modes(int fullhelp) { - display_type_t *dtype; - display_format_t *dformat; + ComponentDescription cd; + Component c = 0; - dformat = malloc(sizeof(display_format_t)); - if (dformat == NULL) { - return NULL; - } - dformat->size = DS_1920x1080; - dformat->colour_mode = DC_YUV; - dformat->num_images = 1; + cd.componentType = QTVideoOutputComponentType; + cd.componentSubType = 0; + cd.componentManufacturer = 0; + cd.componentFlags = 0; + cd.componentFlagsMask = kQTVideoOutputDontDisplayToUser; - dtype = malloc(sizeof(display_type_t)); - if (dtype != NULL) { - dtype->id = DISPLAY_QUICKTIME_ID; - dtype->name = "quicktime"; - dtype->description = "QuickTime display device"; - dtype->formats = dformat; - dtype->num_formats = 1; - } - return dtype; + //fprintf(stdout, "Number of Quicktime Vido Display components %d\n", CountComponents (&cd)); + + fprintf(stdout, "Available playback devices:\n"); + /* Print relevant video output components */ + while ((c = FindNextComponent(c, &cd))) { + Handle componentNameHandle = NewHandle(0); + GetComponentInfo(c, &cd, componentNameHandle, NULL, NULL); + HLock(componentNameHandle); + char *cName = *componentNameHandle; + + fprintf(stdout, " Device %d: ", (int)c); + nprintf(cName); + fprintf(stdout, "\n"); + + HUnlock(componentNameHandle); + DisposeHandle(componentNameHandle); + + /* Get display modes of selected video output component */ + QTAtomContainer modeListAtomContainer = NULL; + ComponentInstance videoDisplayComponentInstance; + + videoDisplayComponentInstance = OpenComponent(c); + + int ret = + QTVideoOutputGetDisplayModeList + (videoDisplayComponentInstance, &modeListAtomContainer); + if (ret != noErr || modeListAtomContainer == NULL) { + fprintf(stdout, "\tNo output modes available\n"); + CloseComponent(videoDisplayComponentInstance); + continue; + } + + int i = 1; + QTAtom atomDisplay = 0, nextAtomDisplay = 0; + QTAtomType type; + QTAtomID id; + + /* Print modes of current display component */ + while (i < + QTCountChildrenOfType(modeListAtomContainer, + kParentAtomIsContainer, + kQTVODisplayModeItem)) { + + ret = + QTNextChildAnyType(modeListAtomContainer, + kParentAtomIsContainer, + atomDisplay, &nextAtomDisplay); + // Make sure its a display atom + ret = + QTGetAtomTypeAndID(modeListAtomContainer, + nextAtomDisplay, &type, &id); + if (type != kQTVODisplayModeItem) + continue; + + atomDisplay = nextAtomDisplay; + + QTAtom atom; + long dataSize, *dataPtr; + + /* Print component ID */ + fprintf(stdout, "\t - %ld: ", id); + + /* Print component name */ + atom = + QTFindChildByID(modeListAtomContainer, atomDisplay, + kQTVOName, 1, NULL); + ret = + QTGetAtomDataPtr(modeListAtomContainer, atom, + &dataSize, (Ptr *) & dataPtr); + fprintf(stdout, " %s; ", (char *)dataPtr); + + //if (strcmp((char *)dataPtr, mode) == 0) { + // displayMode = id; + //} + + /* Print component other info */ + atom = + QTFindChildByID(modeListAtomContainer, atomDisplay, + kQTVODimensions, 1, NULL); + ret = + QTGetAtomDataPtr(modeListAtomContainer, atom, + &dataSize, (Ptr *) & dataPtr); + fprintf(stdout, "%dx%d px\n", + (int)EndianS32_BtoN(dataPtr[0]), + (int)EndianS32_BtoN(dataPtr[1])); + + /* Do not print codecs */ + if (!fullhelp) { + i++; + continue; + } + + /* Print supported pixel formats */ + fprintf(stdout, "\t\t - Codec: "); + QTAtom decompressorsAtom; + int j = 1; + int codecsPerLine = 0; + while ((decompressorsAtom = + QTFindChildByIndex(modeListAtomContainer, + atomDisplay, + kQTVODecompressors, j, + NULL)) != 0) { + atom = + QTFindChildByID(modeListAtomContainer, + decompressorsAtom, + kQTVODecompressorType, 1, + NULL); + ret = + QTGetAtomDataPtr(modeListAtomContainer, + atom, &dataSize, + (Ptr *) & dataPtr); + if (!(codecsPerLine % 9)) { + fprintf(stdout, "\n \t\t\t"); + fprintf(stdout, "%s", (char *)dataPtr); + } else { + fprintf(stdout, ", %s", + (char *)dataPtr); + } + codecsPerLine++; + + //atom = QTFindChildByID(modeListAtomContainer, decompressorsAtom, kQTVODecompressorComponent, 1, NULL); + //ret = QTGetAtomDataPtr(modeListAtomContainer, atom, &dataSize, (Ptr *)&dataPtr); + //fprintf(stdout, "%s\n", (char *)dataPtr); + + j++; + } + fprintf(stdout, "\n\n"); + + i++; + CloseComponent(videoDisplayComponentInstance); + } + fprintf(stdout, "\n"); + + cd.componentType = QTVideoOutputComponentType; + cd.componentSubType = 0; + cd.componentManufacturer = 0; + cd.componentFlags = 0; + cd.componentFlagsMask = kQTVideoOutputDontDisplayToUser; + } } -#endif /* HAVE_MACOSX */ +static void show_help(int full) +{ + printf("Quicktime output options:\n"); + printf("\tdevice:mode:codec | help | fullhelp\n"); + print_modes(full); +} +void *display_quicktime_init(char *fmt) +{ + struct state_quicktime *s; + int ret; + int i; + + /* Parse fmt input */ + s = (struct state_quicktime *)malloc(sizeof(struct state_quicktime)); + s->magic = MAGIC_QT_DISPLAY; + + if (fmt != NULL) { + if (strcmp(fmt, "help") == 0) { + show_help(0); + free(s); + return NULL; + } + if (strcmp(fmt, "fullhelp") == 0) { + show_help(1); + free(s); + return NULL; + } + char *tmp = strdup(fmt); + char *tok; + + tok = strtok(tmp, ":"); + if (tok == NULL) { + show_help(0); + free(s); + free(tmp); + return NULL; + } + s->device = atol(tok); + tok = strtok(NULL, ":"); + if (tok == NULL) { + show_help(0); + free(s); + free(tmp); + return NULL; + } + s->mode = atol(tok); + tok = strtok(NULL, ":"); + if (tok == NULL) { + show_help(0); + free(s); + free(tmp); + return NULL; + } + s->codec = strdup(tok); + } + + for (i = 0; codec_info[i].name != NULL; i++) { + if (strcmp(s->codec, codec_info[i].name) == 0) { + s->cinfo = &codec_info[i]; + } + } + + s->videoDisplayComponentInstance = 0; + s->seqID = 0; + + /* Open device */ + s->videoDisplayComponentInstance = OpenComponent((Component) s->device); + + InitCursor(); + EnterMovies(); + + /* Set the display mode */ + ret = + QTVideoOutputSetDisplayMode(s->videoDisplayComponentInstance, + s->mode); + if (ret != noErr) { + fprintf(stderr, "Failed to set video output display mode.\n"); + return NULL; + } + + /* We don't want to use the video output component instance echo port */ + ret = QTVideoOutputSetEchoPort(s->videoDisplayComponentInstance, nil); + if (ret != noErr) { + fprintf(stderr, "Failed to set video output echo port.\n"); + return NULL; + } + + /* Register Ultragrid with instande of the video outpiut */ + ret = + QTVideoOutputSetClientName(s->videoDisplayComponentInstance, + (ConstStr255Param) "Ultragrid"); + if (ret != noErr) { + fprintf(stderr, + "Failed to register Ultragrid with selected video output instance.\n"); + return NULL; + } + + /* Call QTVideoOutputBegin to gain exclusive access to the video output */ + ret = QTVideoOutputBegin(s->videoDisplayComponentInstance); + if (ret != noErr) { + fprintf(stderr, + "Failed to get exclusive access to selected video output instance.\n"); + return NULL; + } + + /* Get a pointer to the gworld used by video output component */ + ret = + QTVideoOutputGetGWorld(s->videoDisplayComponentInstance, + &s->gworld); + if (ret != noErr) { + fprintf(stderr, + "Failed to get selected video output instance GWorld.\n"); + return NULL; + } + + ImageDescriptionHandle gWorldImgDesc = NULL; + PixMapHandle gWorldPixmap = (PixMapHandle) GetGWorldPixMap(s->gworld); + + /* Determine width and height */ + ret = MakeImageDescriptionForPixMap(gWorldPixmap, &gWorldImgDesc); + if (ret != noErr) { + fprintf(stderr, "Failed to determine width and height.\n"); + return NULL; + } + hd_size_x = s->width = (**gWorldImgDesc).width; + hd_size_y = s->height = (**gWorldImgDesc).height; + + if (s->cinfo->h_align) { + hd_size_x = + ((hd_size_x + s->cinfo->h_align - + 1) / s->cinfo->h_align) * s->cinfo->h_align; + } + + fprintf(stdout, "Selected mode: %d(%d)x%d, %fbpp\n", s->width, + hd_size_x, hd_size_y, s->cinfo->bpp); + + platform_sem_init(&s->semaphore, 0, 0); + + s->buffers[0] = malloc(hd_size_x * hd_size_y * s->cinfo->bpp); + s->buffers[1] = malloc(hd_size_x * hd_size_y * s->cinfo->bpp); + + s->image_network = 0; + s->image_display = 1; + + s->outBuffer = malloc(hd_size_x * hd_size_y * s->cinfo->bpp); + + if (pthread_create + (&(s->thread_id), NULL, display_thread_quicktime, (void *)s) != 0) { + perror("Unable to create display thread\n"); + return NULL; + } + + return (void *)s; +} + +void display_quicktime_done(void *state) +{ + struct state_quicktime *s = (struct state_quicktime *)state; + int ret; + + assert(s->magic == MAGIC_QT_DISPLAY); + ret = QTVideoOutputEnd(s->videoDisplayComponentInstance); + if (ret != noErr) { + fprintf(stderr, + "Failed to release the video output component.\n"); + } + + ret = CloseComponent(s->videoDisplayComponentInstance); + if (ret != noErr) { + fprintf(stderr, + "Failed to close the video output component.\n"); + } + + DisposeGWorld(s->gworld); +} + +display_colour_t display_quicktime_colour(void *state) +{ + struct state_quicktime *s = (struct state_quicktime *)state; + assert(s->magic == MAGIC_QT_DISPLAY); + return DC_YUV; +} + +display_type_t *display_quicktime_probe(void) +{ + display_type_t *dtype; + display_format_t *dformat; + + dformat = malloc(sizeof(display_format_t)); + if (dformat == NULL) { + return NULL; + } + dformat->size = DS_1920x1080; + dformat->colour_mode = DC_YUV; + dformat->num_images = 1; + + dtype = malloc(sizeof(display_type_t)); + if (dtype != NULL) { + dtype->id = DISPLAY_QUICKTIME_ID; + dtype->name = "quicktime"; + dtype->description = "QuickTime display device"; + dtype->formats = dformat; + dtype->num_formats = 1; + } + return dtype; +} + +#endif /* HAVE_MACOSX */ diff --git a/ultragrid/src/video_display/sage.c b/ultragrid/src/video_display/sage.c index b02b0a072..1998b779e 100644 --- a/ultragrid/src/video_display/sage.c +++ b/ultragrid/src/video_display/sage.c @@ -54,7 +54,6 @@ #include "video_display.h" #include "video_display/sage.h" - #include #include #include @@ -75,17 +74,16 @@ #define HD_HEIGHT 1080 #define MAGIC_SAGE DISPLAY_SAGE_ID - struct state_sdl { - GLubyte *buffers[2]; - GLubyte *outBuffer; - GLubyte *yuvBuffer; - int image_display, image_network; - /* Thread related information follows... */ - pthread_t thread_id; - sem_t semaphore; - /* For debugging... */ - uint32_t magic; + GLubyte *buffers[2]; + GLubyte *outBuffer; + GLubyte *yuvBuffer; + int image_display, image_network; + /* Thread related information follows... */ + pthread_t thread_id; + sem_t semaphore; + /* For debugging... */ + uint32_t magic; }; int *_0080; @@ -93,24 +91,23 @@ int *_00ff; //Cb = U, Cr = V int *_YUV_Coef; -#define RED_v "0*16" //+ 1.596 -#define GREEN_u "1*16" //- 0.391 -#define GREEN_v "2*16" //- 0.813 -#define BLUE_u "3*16" //+ 2.018 -#define Y_COEF "4*16" //+ 1.164 +#define RED_v "0*16" //+ 1.596 +#define GREEN_u "1*16" //- 0.391 +#define GREEN_v "2*16" //- 0.813 +#define BLUE_u "3*16" //+ 2.018 +#define Y_COEF "4*16" //+ 1.164 /** Prototyping */ inline void sage_copyline64(unsigned char *dst, unsigned char *src, int len); inline void sage_copyline128(unsigned char *dst, unsigned char *src, int len); inline void swapBytes(unsigned char *buf, int len); void sage_deinterlace(unsigned char *buffer); -void sage_gl_resize_window(int width,int height); +void sage_gl_resize_window(int width, int height); void yuv2rgba(unsigned char *buffer, unsigned char *rgbBuf); - int display_sage_handle_events(void) { - return 0; + return 0; } /* TODO: @@ -119,203 +116,169 @@ int display_sage_handle_events(void) * vstup i vystup zarovnan na 16 bytu. */ void yuv2rgba(unsigned char *buffer, unsigned char *rgbBuf) { - int i = 0; - int j = 0; - for (i = 0; i < HD_WIDTH*HD_HEIGHT*2; i+=32) - { - if (bitdepth == 8) { - j++; // interlace - if (j == 121) buffer += 2069760; - if (j == 241) { buffer -=2073600; j = 1; } - } + int i = 0; + int j = 0; + for (i = 0; i < HD_WIDTH * HD_HEIGHT * 2; i += 32) { + if (bitdepth == 8) { + j++; // interlace + if (j == 121) + buffer += 2069760; + if (j == 241) { + buffer -= 2073600; + j = 1; + } + } - asm ( - "psubq %%xmm5, %%xmm5\n" - "movdqa (%0), %%xmm0\n" // U0 Y0 V0 Y1 U1 Y2 V1 Y3 U2 Y4 V2 Y5 U3 Y6 V3 Y7 - "movdqa 16(%0), %%xmm1\n" // S0 X0 T0 X1 S1 X2 T1 X3 S2 X4 T2 X5 S3 X6 T3 X7 - "movdqa (%2), %%xmm2\n" + asm("psubq %%xmm5, %%xmm5\n" "movdqa (%0), %%xmm0\n" // U0 Y0 V0 Y1 U1 Y2 V1 Y3 U2 Y4 V2 Y5 U3 Y6 V3 Y7 + "movdqa 16(%0), %%xmm1\n" // S0 X0 T0 X1 S1 X2 T1 X3 S2 X4 T2 X5 S3 X6 T3 X7 + "movdqa (%2), %%xmm2\n" /** prepare Y*/ - "movdqa %%xmm0, %%xmm3\n" //kopie - "movdqa %%xmm1, %%xmm4\n" - "pand %%xmm2, %%xmm3\n" // 00 Y0 00 Y1 00 Y2 00 Y3 00 Y4 00 Y5 00 Y6 00 Y7 - "pand %%xmm2, %%xmm4\n" // 00 X0 00 X1 00 X2 00 X3 00 X4 00 X5 00 X6 00 X7 - "psrldq $1, %%xmm3\n" // Y0 00 Y1 00 Y2 00 Y3 00 Y4 00 Y5 00 Y6 00 Y7 00 - "psrldq $1, %%xmm4\n" // X0 00 X1 00 X2 00 X3 00 X4 00 X5 00 X6 00 X7 00 - "packuswb %%xmm4, %%xmm3\n"// Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 X0 X1 X2 X3 X4 X5 X6 X7 + "movdqa %%xmm0, %%xmm3\n" //kopie + "movdqa %%xmm1, %%xmm4\n" "pand %%xmm2, %%xmm3\n" // 00 Y0 00 Y1 00 Y2 00 Y3 00 Y4 00 Y5 00 Y6 00 Y7 + "pand %%xmm2, %%xmm4\n" // 00 X0 00 X1 00 X2 00 X3 00 X4 00 X5 00 X6 00 X7 + "psrldq $1, %%xmm3\n" // Y0 00 Y1 00 Y2 00 Y3 00 Y4 00 Y5 00 Y6 00 Y7 00 + "psrldq $1, %%xmm4\n" // X0 00 X1 00 X2 00 X3 00 X4 00 X5 00 X6 00 X7 00 + "packuswb %%xmm4, %%xmm3\n" // Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 X0 X1 X2 X3 X4 X5 X6 X7 /** prepare u*/ - "psrldq $1, %%xmm2\n" //prepare U mask - "punpcklwd %%xmm5, %%xmm2\n" //xmm2: 0x000000ff000000ff000000ff000000ff - "movdqa %%xmm0, %%xmm5\n" //kopie puvodnich registru - "movdqa %%xmm1, %%xmm6\n" - "pand %%xmm2, %%xmm5\n" // U0 00 00 00 U1 00 00 00 U2 00 00 00 U3 00 00 00 - "pand %%xmm2, %%xmm6\n" // S0 00 00 00 S1 00 00 00 S2 00 00 00 S3 00 00 00 - "packssdw %%xmm6, %%xmm5\n" // U0 00 U1 00 U2 00 U3 00 S0 00 S1 00 S2 00 S3 00 - "pslldq $1, %%xmm5\n" // 00 U0 00 U1 00 U2 00 U3 00 S0 00 S1 00 S2 00 S3 + "psrldq $1, %%xmm2\n" //prepare U mask + "punpcklwd %%xmm5, %%xmm2\n" //xmm2: 0x000000ff000000ff000000ff000000ff + "movdqa %%xmm0, %%xmm5\n" //kopie puvodnich registru + "movdqa %%xmm1, %%xmm6\n" "pand %%xmm2, %%xmm5\n" // U0 00 00 00 U1 00 00 00 U2 00 00 00 U3 00 00 00 + "pand %%xmm2, %%xmm6\n" // S0 00 00 00 S1 00 00 00 S2 00 00 00 S3 00 00 00 + "packssdw %%xmm6, %%xmm5\n" // U0 00 U1 00 U2 00 U3 00 S0 00 S1 00 S2 00 S3 00 + "pslldq $1, %%xmm5\n" // 00 U0 00 U1 00 U2 00 U3 00 S0 00 S1 00 S2 00 S3 /** prepare v*/ - "pslldq $2, %%xmm2\n" //xmm2: 0x0000ff000000ff000000ff000000ff00 - "movdqa %%xmm0, %%xmm6\n" //kopie puvodnich registru - "movdqa %%xmm1, %%xmm7\n" - "pand %%xmm2, %%xmm6\n" // 00 00 V0 00 00 00 V1 00 00 00 V2 00 00 00 V3 00 - "pand %%xmm2, %%xmm7\n" // 00 00 T0 00 00 00 T1 00 00 00 T2 00 00 00 T3 00 - "psrldq $2, %%xmm6\n" //shift << - "psrldq $2, %%xmm7\n" - "packssdw %%xmm7, %%xmm6\n" // 00 V0 00 V1 00 V2 00 V3 00 T0 00 T1 00 T2 00 T3 - "psllw $8, %%xmm6\n" // V0 00 V1 00 V2 00 V3 00 T0 00 T1 00 T2 00 T3 00 - - "movdqa (%3), %%xmm2\n" - "psubw %%xmm2, %%xmm5\n" /* u -= 128 */ - "psubw %%xmm2, %%xmm6\n" /* v -= 128 */ - "psrlw $3, %%xmm2\n" /* 128 -> 16 (0x8000 -> 0x1000) */ - - "movdqa %%xmm5, %%xmm0\n" //mov u -> xmm0 - "movdqa %%xmm6, %%xmm1\n" //mov v -> xmm1 - - "pmulhw "GREEN_u"(%4), %%xmm0\n" /*Mul Green u coef -> Green u*/ - "pmulhw "GREEN_v"(%4), %%xmm1\n" /*Mul Green v coef -> Green v*/ - - "pmulhw "BLUE_u"(%4), %%xmm5\n" /*Mul Blue u coef -> Blue u*/ - "pmulhw "RED_v"(%4), %%xmm6\n" /*Mul Red v coef -> Red v*/ - - "paddsw %%xmm1, %%xmm0\n" /*Green u + Green v -> CGreen */ - + "pslldq $2, %%xmm2\n" //xmm2: 0x0000ff000000ff000000ff000000ff00 + "movdqa %%xmm0, %%xmm6\n" //kopie puvodnich registru + "movdqa %%xmm1, %%xmm7\n" "pand %%xmm2, %%xmm6\n" // 00 00 V0 00 00 00 V1 00 00 00 V2 00 00 00 V3 00 + "pand %%xmm2, %%xmm7\n" // 00 00 T0 00 00 00 T1 00 00 00 T2 00 00 00 T3 00 + "psrldq $2, %%xmm6\n" //shift << + "psrldq $2, %%xmm7\n" "packssdw %%xmm7, %%xmm6\n" // 00 V0 00 V1 00 V2 00 V3 00 T0 00 T1 00 T2 00 T3 + "psllw $8, %%xmm6\n" // V0 00 V1 00 V2 00 V3 00 T0 00 T1 00 T2 00 T3 00 + "movdqa (%3), %%xmm2\n" "psubw %%xmm2, %%xmm5\n" /* u -= 128 */ + "psubw %%xmm2, %%xmm6\n" /* v -= 128 */ + "psrlw $3, %%xmm2\n" /* 128 -> 16 (0x8000 -> 0x1000) */ + "movdqa %%xmm5, %%xmm0\n" //mov u -> xmm0 + "movdqa %%xmm6, %%xmm1\n" //mov v -> xmm1 + "pmulhw " GREEN_u "(%4), %%xmm0\n" /*Mul Green u coef -> Green u */ + "pmulhw " GREEN_v "(%4), %%xmm1\n" /*Mul Green v coef -> Green v */ + "pmulhw " BLUE_u "(%4), %%xmm5\n" /*Mul Blue u coef -> Blue u */ + "pmulhw " RED_v "(%4), %%xmm6\n" /*Mul Red v coef -> Red v */ + "paddsw %%xmm1, %%xmm0\n" /*Green u + Green v -> CGreen */ /** process luma*/ - "movdqa (%2), %%xmm4\n" //mov 00ff* mask to xmm2 - "movdqa %%xmm3, %%xmm1\n" //copy Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 X0 X1 X2 X3 X4 X5 X6 X7 - "pand %%xmm4, %%xmm3\n" // get Y odd Y1 00 Y3 00 Y5 00 Y7 00 X1 00 X3 00 X5 00 X7 00 - "psrldq $1, %%xmm4\n" - "pand %%xmm4, %%xmm1\n" - "psllw $8, %%xmm1\n" //get Y even Y0 00 Y2 00 Y4 00 Y6 00 X0 00 X2 00 X4 00 X6 00 + "movdqa (%2), %%xmm4\n" //mov 00ff* mask to xmm2 + "movdqa %%xmm3, %%xmm1\n" //copy Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 X0 X1 X2 X3 X4 X5 X6 X7 + "pand %%xmm4, %%xmm3\n" // get Y odd Y1 00 Y3 00 Y5 00 Y7 00 X1 00 X3 00 X5 00 X7 00 + "psrldq $1, %%xmm4\n" "pand %%xmm4, %%xmm1\n" "psllw $8, %%xmm1\n" //get Y even Y0 00 Y2 00 Y4 00 Y6 00 X0 00 X2 00 X4 00 X6 00 + "psubusw %%xmm2, %%xmm1\n" // Y -= 16 + "psubusw %%xmm2, %%xmm3\n" // Y -= 16 + "pmulhuw " Y_COEF "(%4), %%xmm1\n" // Y = (Y-16)*1.164 + "pmulhuw " Y_COEF "(%4), %%xmm3\n" // Y = (Y-16)*1.164 + // xmm0 -> green, xmm5 -> blue, xmm6 -> red + // xmm1 -> Y even, xmm3 -> Y odd + "movdqa %%xmm0, %%xmm2\n" // copy green + "movdqa %%xmm5, %%xmm4\n" // copy blue + "movdqa %%xmm6, %%xmm7\n" // copy red + "paddsw %%xmm1, %%xmm5\n" // Y even + blue + "paddsw %%xmm3, %%xmm4\n" // Y odd + blue + "paddsw %%xmm1, %%xmm6\n" // Y even + red + "paddsw %%xmm3, %%xmm7\n" // Y odd + red + "paddsw %%xmm1, %%xmm0\n" // Y even - green + "paddsw %%xmm3, %%xmm2\n" // Y odd - green + /*Limit RGB even to 0..255 */ + "packuswb %%xmm0, %%xmm0\n" /* B6 B4 B2 B0 B6 B4 B2 B0 */ + "packuswb %%xmm5, %%xmm5\n" /* R6 R4 R2 R0 R6 R4 R2 R0 */ + "packuswb %%xmm6, %%xmm6\n" /* G6 G4 G2 G0 G6 G4 G2 G0 */ + /*Limit RGB odd to 0..255 */ + "packuswb %%xmm2, %%xmm2\n" /* B7 B5 B3 B1 B7 B5 B3 B1 */ + "packuswb %%xmm4, %%xmm4\n" /* R7 R5 R3 R1 R7 R5 R3 R1 */ + "packuswb %%xmm7, %%xmm7\n" /* G7 G5 G3 G1 G7 G5 G3 G1 */ + /*Interleave RGB even and odd */ + "punpcklbw %%xmm7, %%xmm6\n" //RED + "punpcklbw %%xmm2, %%xmm0\n" //GREEN + "punpcklbw %%xmm4, %%xmm5\n" //BLUE + "movdqa %%xmm6, %%xmm1\n" //copy R + "movdqa %%xmm5, %%xmm2\n" //copy B + "pxor %%xmm4, %%xmm4\n" + /*unpack high qword */ + "punpckhbw %%xmm0, %%xmm5\n" //bg + "punpckhbw %%xmm4, %%xmm6\n" //r0 + "movdqa %%xmm5, %%xmm7\n" "punpckhwd %%xmm6, %%xmm5\n" //bgr0 + "punpcklwd %%xmm6, %%xmm7\n" //bgr0 low + /*unpack low qword */ + "punpcklbw %%xmm0, %%xmm2\n" //bg + "punpcklbw %%xmm4, %%xmm1\n" //r0 + "movdqa %%xmm2, %%xmm6\n" "punpckhwd %%xmm1, %%xmm2\n" //bgr0 + "punpcklwd %%xmm1, %%xmm6\n" //bgr0 low + /* save */ + "movdqa %%xmm6, (%1)\n" "movdqa %%xmm2, 16(%1)\n" "movdqa %%xmm7, 32(%1)\n" "movdqa %%xmm5, 48(%1)\n": + : "r"((unsigned long *)buffer), + "r"((unsigned long *)rgbBuf), + "r"((unsigned long *)_00ff), + "r"((unsigned long *)_0080), "r"((unsigned long *)_YUV_Coef) + ); - "psubusw %%xmm2, %%xmm1\n" // Y -= 16 - "psubusw %%xmm2, %%xmm3\n" // Y -= 16 - - "pmulhuw "Y_COEF"(%4), %%xmm1\n" // Y = (Y-16)*1.164 - "pmulhuw "Y_COEF"(%4), %%xmm3\n" // Y = (Y-16)*1.164 - - // xmm0 -> green, xmm5 -> blue, xmm6 -> red - // xmm1 -> Y even, xmm3 -> Y odd - "movdqa %%xmm0, %%xmm2\n" // copy green - "movdqa %%xmm5, %%xmm4\n" // copy blue - "movdqa %%xmm6, %%xmm7\n" // copy red - - "paddsw %%xmm1, %%xmm5\n" // Y even + blue - "paddsw %%xmm3, %%xmm4\n" // Y odd + blue - - "paddsw %%xmm1, %%xmm6\n" // Y even + red - "paddsw %%xmm3, %%xmm7\n" // Y odd + red - - "paddsw %%xmm1, %%xmm0\n" // Y even - green - "paddsw %%xmm3, %%xmm2\n" // Y odd - green - - /*Limit RGB even to 0..255*/ - "packuswb %%xmm0, %%xmm0\n" /* B6 B4 B2 B0 B6 B4 B2 B0 */ - "packuswb %%xmm5, %%xmm5\n" /* R6 R4 R2 R0 R6 R4 R2 R0 */ - "packuswb %%xmm6, %%xmm6\n" /* G6 G4 G2 G0 G6 G4 G2 G0 */ - - /*Limit RGB odd to 0..255*/ - "packuswb %%xmm2, %%xmm2\n" /* B7 B5 B3 B1 B7 B5 B3 B1 */ - "packuswb %%xmm4, %%xmm4\n" /* R7 R5 R3 R1 R7 R5 R3 R1 */ - "packuswb %%xmm7, %%xmm7\n" /* G7 G5 G3 G1 G7 G5 G3 G1 */ - - /*Interleave RGB even and odd */ - "punpcklbw %%xmm7, %%xmm6\n" //RED - "punpcklbw %%xmm2, %%xmm0\n" //GREEN - "punpcklbw %%xmm4, %%xmm5\n" //BLUE - - "movdqa %%xmm6, %%xmm1\n" //copy R - "movdqa %%xmm5, %%xmm2\n" //copy B - "pxor %%xmm4, %%xmm4\n" - /*unpack high qword*/ - "punpckhbw %%xmm0, %%xmm5\n" //bg - "punpckhbw %%xmm4, %%xmm6\n" //r0 - "movdqa %%xmm5, %%xmm7\n" - "punpckhwd %%xmm6, %%xmm5\n" //bgr0 - "punpcklwd %%xmm6, %%xmm7\n" //bgr0 low - /*unpack low qword*/ - "punpcklbw %%xmm0, %%xmm2\n" //bg - "punpcklbw %%xmm4, %%xmm1\n" //r0 - "movdqa %%xmm2, %%xmm6\n" - "punpckhwd %%xmm1, %%xmm2\n" //bgr0 - "punpcklwd %%xmm1, %%xmm6\n" //bgr0 low - - /* save */ - "movdqa %%xmm6, (%1)\n" - "movdqa %%xmm2, 16(%1)\n" - "movdqa %%xmm7, 32(%1)\n" - "movdqa %%xmm5, 48(%1)\n" - - : - : "r" ((unsigned long *) buffer), - "r" ((unsigned long *) rgbBuf), - "r" ((unsigned long *) _00ff), - "r" ((unsigned long *) _0080), - "r" ((unsigned long *) _YUV_Coef) - ); - - buffer += 32; - rgbBuf += 64; - } + buffer += 32; + rgbBuf += 64; + } } /* linear blend sage_deinterlace */ void sage_deinterlace(unsigned char *buffer) { - int i,j; - long pitch = 1920*2; - register long pitch2 = pitch*2; - unsigned char *bline1, *bline2, *bline3; - register unsigned char *line1, *line2, *line3; + int i, j; + long pitch = 1920 * 2; + register long pitch2 = pitch * 2; + unsigned char *bline1, *bline2, *bline3; + register unsigned char *line1, *line2, *line3; - bline1 = buffer; - bline2 = buffer + pitch; - bline3 = buffer + 3*pitch; - for(i=0; i < 1920*2; i+=16) { - /* preload first two lines */ - asm volatile( - "movdqa (%0), %%xmm0\n" - "movdqa (%1), %%xmm1\n" - : - : "r" ((unsigned long *)bline1), - "r" ((unsigned long *)bline2)); - line1 = bline2; - line2 = bline2 + pitch; - line3 = bline3; + bline1 = buffer; + bline2 = buffer + pitch; + bline3 = buffer + 3 * pitch; + for (i = 0; i < 1920 * 2; i += 16) { + /* preload first two lines */ + asm volatile ("movdqa (%0), %%xmm0\n" + "movdqa (%1), %%xmm1\n"::"r" ((unsigned long *) + bline1), + "r"((unsigned long *)bline2)); + line1 = bline2; + line2 = bline2 + pitch; + line3 = bline3; - for(j=0; j < 1076; j+=2) { - asm volatile( - "movdqa (%1), %%xmm2\n" - "pavgb %%xmm2, %%xmm0\n" - "pavgb %%xmm1, %%xmm0\n" - "movdqa (%2), %%xmm1\n" - "movdqa %%xmm0, (%0)\n" - "pavgb %%xmm1, %%xmm0\n" - "pavgb %%xmm2, %%xmm0\n" - "movdqa %%xmm0, (%1)\n" - : - :"r" ((unsigned long *)line1), - "r" ((unsigned long *)line2), - "r" ((unsigned long *)line3) - ); - line1 += pitch2; - line2 += pitch2; - line3 += pitch2; - } - bline1 += 16; - bline2 += 16; - bline3 += 16; - } + for (j = 0; j < 1076; j += 2) { + asm volatile ("movdqa (%1), %%xmm2\n" + "pavgb %%xmm2, %%xmm0\n" + "pavgb %%xmm1, %%xmm0\n" + "movdqa (%2), %%xmm1\n" + "movdqa %%xmm0, (%0)\n" + "pavgb %%xmm1, %%xmm0\n" + "pavgb %%xmm2, %%xmm0\n" + "movdqa %%xmm0, (%1)\n"::"r" ((unsigned + long *) + line1), + "r"((unsigned long *)line2), + "r"((unsigned long *)line3) + ); + line1 += pitch2; + line2 += pitch2; + line3 += pitch2; + } + bline1 += 16; + bline2 += 16; + bline3 += 16; + } } inline void swapBytes(unsigned char *buf, int len) { - register unsigned char b1; - int i =0; + register unsigned char b1; + int i = 0; - do { - b1 = buf[i]; - buf[i] = buf[i+1]; - buf[i+1] = b1; - } while ((i += 2) 0) { - a1 = *(s++); - a2 = *(s++); - a3 = *(s++); - a4 = *(s++); + while (len-- > 0) { + a1 = *(s++); + a2 = *(s++); + a3 = *(s++); + a4 = *(s++); - a1 = (a1 & 0xffffff) | ((a1 >> 8) & 0xffffff000000); - a2 = (a2 & 0xffffff) | ((a2 >> 8) & 0xffffff000000); - a3 = (a3 & 0xffffff) | ((a3 >> 8) & 0xffffff000000); - a4 = (a4 & 0xffffff) | ((a4 >> 8) & 0xffffff000000); + a1 = (a1 & 0xffffff) | ((a1 >> 8) & 0xffffff000000); + a2 = (a2 & 0xffffff) | ((a2 >> 8) & 0xffffff000000); + a3 = (a3 & 0xffffff) | ((a3 >> 8) & 0xffffff000000); + a4 = (a4 & 0xffffff) | ((a4 >> 8) & 0xffffff000000); - *(d++) = a1 | (a2 << 48); /* 0xa2|a2|a1|a1|a1|a1|a1|a1 */ - *(d++) = (a2 >> 16)|(a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ - *(d++) = (a3 >> 32)|(a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ - } + *(d++) = a1 | (a2 << 48); /* 0xa2|a2|a1|a1|a1|a1|a1|a1 */ + *(d++) = (a2 >> 16) | (a3 << 32); /* 0xa3|a3|a3|a3|a2|a2|a2|a2 */ + *(d++) = (a3 >> 32) | (a4 << 16); /* 0xa4|a4|a4|a4|a4|a4|a3|a3 */ + } } /* convert 10bits Cb Y Cr A Y Cb Y A to 8bits Cb Y Cr Y Cb Y */ @@ -353,247 +316,247 @@ inline void sage_copyline64(unsigned char *dst, unsigned char *src, int len) inline void sage_copyline128(unsigned char *d, unsigned char *s, int len) { - register unsigned char *_d=d,*_s=s; + register unsigned char *_d = d, *_s = s; - while(--len >= 0) { - asm ("movd %0, %%xmm4\n": : "r" (0xffffff)); + while (--len >= 0) { + asm("movd %0, %%xmm4\n": :"r"(0xffffff)); - asm volatile ("movdqa (%0), %%xmm0\n" - "movdqa 16(%0), %%xmm5\n" - "movdqa %%xmm0, %%xmm1\n" - "movdqa %%xmm0, %%xmm2\n" - "movdqa %%xmm0, %%xmm3\n" - "pand %%xmm4, %%xmm0\n" - "movdqa %%xmm5, %%xmm6\n" - "movdqa %%xmm5, %%xmm7\n" - "movdqa %%xmm5, %%xmm8\n" - "pand %%xmm4, %%xmm5\n" - "pslldq $4, %%xmm4\n" - "pand %%xmm4, %%xmm1\n" - "pand %%xmm4, %%xmm6\n" - "pslldq $4, %%xmm4\n" - "psrldq $1, %%xmm1\n" - "psrldq $1, %%xmm6\n" - "pand %%xmm4, %%xmm2\n" - "pand %%xmm4, %%xmm7\n" - "pslldq $4, %%xmm4\n" - "psrldq $2, %%xmm2\n" - "psrldq $2, %%xmm7\n" - "pand %%xmm4, %%xmm3\n" - "pand %%xmm4, %%xmm8\n" - "por %%xmm1, %%xmm0\n" - "psrldq $3, %%xmm3\n" - "psrldq $3, %%xmm8\n" - "por %%xmm2, %%xmm0\n" - "por %%xmm6, %%xmm5\n" - "por %%xmm3, %%xmm0\n" - "por %%xmm7, %%xmm5\n" - "movdq2q %%xmm0, %%mm0\n" - "por %%xmm8, %%xmm5\n" - "movdqa %%xmm5, %%xmm1\n" - "pslldq $12, %%xmm5\n" - "psrldq $4, %%xmm1\n" - "por %%xmm5, %%xmm0\n" - "psrldq $8, %%xmm0\n" - "movq %%mm0, (%1)\n" - "movdq2q %%xmm0, %%mm1\n" - "movdq2q %%xmm1, %%mm2\n" - "movq %%mm1, 8(%1)\n" - "movq %%mm2, 16(%1)\n" - : - : "r" (_s), "r" (_d)); + asm volatile ("movdqa (%0), %%xmm0\n" + "movdqa 16(%0), %%xmm5\n" + "movdqa %%xmm0, %%xmm1\n" + "movdqa %%xmm0, %%xmm2\n" + "movdqa %%xmm0, %%xmm3\n" + "pand %%xmm4, %%xmm0\n" + "movdqa %%xmm5, %%xmm6\n" + "movdqa %%xmm5, %%xmm7\n" + "movdqa %%xmm5, %%xmm8\n" + "pand %%xmm4, %%xmm5\n" + "pslldq $4, %%xmm4\n" + "pand %%xmm4, %%xmm1\n" + "pand %%xmm4, %%xmm6\n" + "pslldq $4, %%xmm4\n" + "psrldq $1, %%xmm1\n" + "psrldq $1, %%xmm6\n" + "pand %%xmm4, %%xmm2\n" + "pand %%xmm4, %%xmm7\n" + "pslldq $4, %%xmm4\n" + "psrldq $2, %%xmm2\n" + "psrldq $2, %%xmm7\n" + "pand %%xmm4, %%xmm3\n" + "pand %%xmm4, %%xmm8\n" + "por %%xmm1, %%xmm0\n" + "psrldq $3, %%xmm3\n" + "psrldq $3, %%xmm8\n" + "por %%xmm2, %%xmm0\n" + "por %%xmm6, %%xmm5\n" + "por %%xmm3, %%xmm0\n" + "por %%xmm7, %%xmm5\n" + "movdq2q %%xmm0, %%mm0\n" + "por %%xmm8, %%xmm5\n" + "movdqa %%xmm5, %%xmm1\n" + "pslldq $12, %%xmm5\n" + "psrldq $4, %%xmm1\n" + "por %%xmm5, %%xmm0\n" + "psrldq $8, %%xmm0\n" + "movq %%mm0, (%1)\n" + "movdq2q %%xmm0, %%mm1\n" + "movdq2q %%xmm1, %%mm2\n" + "movq %%mm1, 8(%1)\n" + "movq %%mm2, 16(%1)\n"::"r" (_s), "r"(_d)); - _s += 32; - _d += 24; - } -} - -#endif /* HAVE_MACOSX */ - - -static void* display_thread_sage(void *arg) -{ - struct state_sdl *s = (struct state_sdl *) arg; - int i; - - while (1) { - GLubyte *line1, *line2; - //display_sage_handle_events(); - - sem_wait(&s->semaphore); - - assert(s->outBuffer != NULL); - - if (bitdepth == 10) { - line1 = s->buffers[s->image_display]; -#ifdef SAGE_GLSL_YUV - line2 = s->outBuffer; -#else - line2 = s->yuvBuffer; -#endif - - for(i=0; i<1080; i+=2) { -#ifdef HAVE_MACOSX || HAVE_32B_LINUX - sage_copyline64(line2, line1, 5120/32); - sage_copyline64(line2+3840, line1+5120*540, 5120/32); -#else /* HAVE_MACOSX */ - sage_copyline128(line2, line1, 5120/32); - sage_copyline128(line2+3840, line1+5120*540, 5120/32); -#endif /* HAVE_MACOSX */ - line1 += 5120; - line2 += 2*3840; - } -#ifndef SAGE_GLSL_YUV - yuv2rgba(s->yuvBuffer, s->outBuffer); -#endif - } - else { -#ifdef SAGE_GLSL_YUV - line1 = s->buffers[s->image_display]; - line2 = s->outBuffer; - if (progressive == 1) { - memcpy(line2, line1, hd_size_x*hd_size_y*hd_color_bpp); - } else { - for(i=0; i<1080; i+=2){ - memcpy(line2, line1, HD_WIDTH*2); - memcpy(line2+HD_WIDTH*2, line1+HD_WIDTH*2*540, HD_WIDTH*2); - line1 += HD_WIDTH*2; - line2 += HD_WIDTH*2*2; - } - } -#else - yuv2rgba(s->buffers[s->image_display], s->outBuffer); -#endif + _s += 32; + _d += 24; } -// swapBytes(s->outBuffer, HD_WIDTH*HD_HEIGHT*2); -// int i = open("/tmp/testcard_image.yuv", O_WRONLY|O_CREAT, 0644); -// write(i,s->yuvBuffer, HD_WIDTH*HD_HEIGHT*2); -// close(i); - sage_swapBuffer(); - s->outBuffer = sage_getBuffer(); - } - return NULL; } +#endif /* HAVE_MACOSX */ -void * display_sage_init(void) +static void *display_thread_sage(void *arg) { - struct state_sdl *s; + struct state_sdl *s = (struct state_sdl *)arg; + int i; - s = (struct state_sdl *) malloc(sizeof(struct state_sdl)); - s->magic = MAGIC_SAGE; + while (1) { + GLubyte *line1, *line2; + //display_sage_handle_events(); - //iopl(3); + sem_wait(&s->semaphore); + + assert(s->outBuffer != NULL); + + if (bitdepth == 10) { + line1 = s->buffers[s->image_display]; +#ifdef SAGE_GLSL_YUV + line2 = s->outBuffer; +#else + line2 = s->yuvBuffer; +#endif + + for (i = 0; i < 1080; i += 2) { +#ifdef HAVE_MACOSX || HAVE_32B_LINUX + sage_copyline64(line2, line1, 5120 / 32); + sage_copyline64(line2 + 3840, + line1 + 5120 * 540, 5120 / 32); +#else /* HAVE_MACOSX */ + sage_copyline128(line2, line1, 5120 / 32); + sage_copyline128(line2 + 3840, + line1 + 5120 * 540, 5120 / 32); +#endif /* HAVE_MACOSX */ + line1 += 5120; + line2 += 2 * 3840; + } +#ifndef SAGE_GLSL_YUV + yuv2rgba(s->yuvBuffer, s->outBuffer); +#endif + } else { +#ifdef SAGE_GLSL_YUV + line1 = s->buffers[s->image_display]; + line2 = s->outBuffer; + if (progressive == 1) { + memcpy(line2, line1, + hd_size_x * hd_size_y * hd_color_bpp); + } else { + for (i = 0; i < 1080; i += 2) { + memcpy(line2, line1, HD_WIDTH * 2); + memcpy(line2 + HD_WIDTH * 2, + line1 + HD_WIDTH * 2 * 540, + HD_WIDTH * 2); + line1 += HD_WIDTH * 2; + line2 += HD_WIDTH * 2 * 2; + } + } +#else + yuv2rgba(s->buffers[s->image_display], s->outBuffer); +#endif + } +// swapBytes(s->outBuffer, HD_WIDTH*HD_HEIGHT*2); +// int i = open("/tmp/testcard_image.yuv", O_WRONLY|O_CREAT, 0644); +// write(i,s->yuvBuffer, HD_WIDTH*HD_HEIGHT*2); +// close(i); + sage_swapBuffer(); + s->outBuffer = sage_getBuffer(); + } + return NULL; +} + +void *display_sage_init(void) +{ + struct state_sdl *s; + + s = (struct state_sdl *)malloc(sizeof(struct state_sdl)); + s->magic = MAGIC_SAGE; + + //iopl(3); /** yuv2rgb constants init */ - posix_memalign((void *)&_YUV_Coef, 16, 80+32); - _YUV_Coef[0] = _YUV_Coef[1] = _YUV_Coef[2] = _YUV_Coef[3] = 0x01990199;// RED_v 1.596 - _YUV_Coef[4] = _YUV_Coef[5] = _YUV_Coef[6] = _YUV_Coef[7] = 0xff9cff9c;// GREEN_u 0.391 - _YUV_Coef[8] = _YUV_Coef[9] = _YUV_Coef[10] = _YUV_Coef[11] = 0xff30ff30; // GREEN_v 0.813 - _YUV_Coef[12] = _YUV_Coef[13] = _YUV_Coef[14] = _YUV_Coef[15] = 0x02050205; // BLUE_u 2.018 - _YUV_Coef[16] = _YUV_Coef[17] = _YUV_Coef[18] = _YUV_Coef[19] = 0x012a012a; // Y 1.164 - _00ff = & _YUV_Coef[20]; - _0080 = & _YUV_Coef[24]; - _00ff[0] = _00ff[1] = _00ff[2] = _00ff[3] = 0xff00ff00; - _0080[0] = _0080[1] = _0080[2] = _0080[3] = 0x80008000; + posix_memalign((void *)&_YUV_Coef, 16, 80 + 32); + _YUV_Coef[0] = _YUV_Coef[1] = _YUV_Coef[2] = _YUV_Coef[3] = 0x01990199; // RED_v 1.596 + _YUV_Coef[4] = _YUV_Coef[5] = _YUV_Coef[6] = _YUV_Coef[7] = 0xff9cff9c; // GREEN_u 0.391 + _YUV_Coef[8] = _YUV_Coef[9] = _YUV_Coef[10] = _YUV_Coef[11] = 0xff30ff30; // GREEN_v 0.813 + _YUV_Coef[12] = _YUV_Coef[13] = _YUV_Coef[14] = _YUV_Coef[15] = 0x02050205; // BLUE_u 2.018 + _YUV_Coef[16] = _YUV_Coef[17] = _YUV_Coef[18] = _YUV_Coef[19] = 0x012a012a; // Y 1.164 + _00ff = &_YUV_Coef[20]; + _0080 = &_YUV_Coef[24]; + _00ff[0] = _00ff[1] = _00ff[2] = _00ff[3] = 0xff00ff00; + _0080[0] = _0080[1] = _0080[2] = _0080[3] = 0x80008000; - s->buffers[0] = malloc(HD_WIDTH*HD_HEIGHT*3); - s->buffers[1] = malloc(HD_WIDTH*HD_HEIGHT*3); - s->yuvBuffer = malloc(HD_WIDTH*HD_HEIGHT*2); - s->image_network=0; - s->image_display=1; + s->buffers[0] = malloc(HD_WIDTH * HD_HEIGHT * 3); + s->buffers[1] = malloc(HD_WIDTH * HD_HEIGHT * 3); + s->yuvBuffer = malloc(HD_WIDTH * HD_HEIGHT * 2); + s->image_network = 0; + s->image_display = 1; - asm("emms\n"); + asm("emms\n"); - /* sage init */ - //FIXME sem se musi propasovat ty spravne parametry argc argv - int appID = 0; - int nodeID = 1; - initSage(appID, nodeID); - s->outBuffer = sage_getBuffer(); + /* sage init */ + //FIXME sem se musi propasovat ty spravne parametry argc argv + int appID = 0; + int nodeID = 1; + initSage(appID, nodeID); + s->outBuffer = sage_getBuffer(); + /* thread init */ + sem_init(&s->semaphore, 0, 0); + if (pthread_create + (&(s->thread_id), NULL, display_thread_sage, (void *)s) != 0) { + perror("Unable to create display thread\n"); + return NULL; + } - /* thread init */ - sem_init(&s->semaphore, 0, 0); - if (pthread_create(&(s->thread_id), NULL, display_thread_sage, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } - - debug_msg("Window initialized %p\n", s); - return (void *)s; + debug_msg("Window initialized %p\n", s); + return (void *)s; } void display_sage_done(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; - assert(s->magic == MAGIC_SAGE); - sage_shutdown(); + assert(s->magic == MAGIC_SAGE); + sage_shutdown(); } -char * display_sage_getf(void *state) +char *display_sage_getf(void *state) { - struct state_sdl *s = (struct state_sdl *) state; - assert(s->magic == MAGIC_SAGE); - return (char *)s->buffers[s->image_network]; + struct state_sdl *s = (struct state_sdl *)state; + assert(s->magic == MAGIC_SAGE); + return (char *)s->buffers[s->image_network]; } int display_sage_putf(void *state, char *frame) { - int tmp; - struct state_sdl *s = (struct state_sdl *) state; + int tmp; + struct state_sdl *s = (struct state_sdl *)state; - assert(s->magic == MAGIC_SAGE); - UNUSED(frame); + assert(s->magic == MAGIC_SAGE); + UNUSED(frame); - /* ...and give it more to do... */ - tmp = s->image_display; - s->image_display = s->image_network; - s->image_network = tmp; - //s->work_to_do = TRUE; + /* ...and give it more to do... */ + tmp = s->image_display; + s->image_display = s->image_network; + s->image_network = tmp; + //s->work_to_do = TRUE; - /* ...and signal the worker */ - sem_post(&s->semaphore); - sem_getvalue(&s->semaphore, &tmp); - if(tmp > 1) - printf("frame drop!\n"); - return 0; + /* ...and signal the worker */ + sem_post(&s->semaphore); + sem_getvalue(&s->semaphore, &tmp); + if (tmp > 1) + printf("frame drop!\n"); + return 0; } display_colour_t display_sage_colour(void *state) { - struct state_sdl *s = (struct state_sdl *) state; - assert(s->magic == MAGIC_SAGE); - return DC_YUV; + struct state_sdl *s = (struct state_sdl *)state; + assert(s->magic == MAGIC_SAGE); + return DC_YUV; } -display_type_t * display_sage_probe(void) +display_type_t *display_sage_probe(void) { - display_type_t *dt; - display_format_t *dformat; + display_type_t *dt; + display_format_t *dformat; - dformat = malloc(4 * sizeof(display_format_t)); - dformat[0].size = DS_176x144; - dformat[0].colour_mode = DC_YUV; - dformat[0].num_images = 1; - dformat[1].size = DS_352x288; - dformat[1].colour_mode = DC_YUV; - dformat[1].num_images = 1; - dformat[2].size = DS_702x576; - dformat[2].colour_mode = DC_YUV; - dformat[2].num_images = 1; - dformat[3].size = DS_1280x720; - dformat[3].colour_mode = DC_YUV; - dformat[3].num_images = 1; + dformat = malloc(4 * sizeof(display_format_t)); + dformat[0].size = DS_176x144; + dformat[0].colour_mode = DC_YUV; + dformat[0].num_images = 1; + dformat[1].size = DS_352x288; + dformat[1].colour_mode = DC_YUV; + dformat[1].num_images = 1; + dformat[2].size = DS_702x576; + dformat[2].colour_mode = DC_YUV; + dformat[2].num_images = 1; + dformat[3].size = DS_1280x720; + dformat[3].colour_mode = DC_YUV; + dformat[3].num_images = 1; - dt = malloc(sizeof(display_type_t)); - if (dt != NULL) { - dt->id = DISPLAY_SAGE_ID; - dt->name = "sage"; - dt->description = "SAGE"; - dt->formats = dformat; - dt->num_formats = 4; - } - return dt; + dt = malloc(sizeof(display_type_t)); + if (dt != NULL) { + dt->id = DISPLAY_SAGE_ID; + dt->name = "sage"; + dt->description = "SAGE"; + dt->formats = dformat; + dt->num_formats = 4; + } + return dt; } diff --git a/ultragrid/src/video_display/sdl.c b/ultragrid/src/video_display/sdl.c index 499dad59c..83ed40c6b 100644 --- a/ultragrid/src/video_display/sdl.c +++ b/ultragrid/src/video_display/sdl.c @@ -53,7 +53,7 @@ #include "config_unix.h" #include "config_win32.h" -#ifndef X_DISPLAY_MISSING /* Don't try to compile if X is not present */ +#ifndef X_DISPLAY_MISSING /* Don't try to compile if X is not present */ #include "debug.h" #include "video_display.h" @@ -74,9 +74,9 @@ #ifdef HAVE_MACOSX #include void NSApplicationLoad(); -#else /* HAVE_MACOSX */ +#else /* HAVE_MACOSX */ #include -#endif /* HAVE_MACOSX */ +#endif /* HAVE_MACOSX */ #include #include @@ -89,126 +89,130 @@ void NSApplicationLoad(); #define FOURCC_UYVY 0x59565955 struct state_sdl { - Display *display; - Window window; - GC gc; - int vw_depth; - Visual *vw_visual; - SDL_Overlay *yuv_image; - SDL_Surface *rgb_image; - struct video_frame frame; - XShmSegmentInfo vw_shm_segment[2]; - int image_display, image_network; - XvAdaptorInfo *ai; - int xv_port; - /* Thread related information follows... */ - pthread_t thread_id; - SDL_sem *semaphore; - /* For debugging... */ - uint32_t magic; + Display *display; + Window window; + GC gc; + int vw_depth; + Visual *vw_visual; + SDL_Overlay *yuv_image; + SDL_Surface *rgb_image; + struct video_frame frame; + XShmSegmentInfo vw_shm_segment[2]; + int image_display, image_network; + XvAdaptorInfo *ai; + int xv_port; + /* Thread related information follows... */ + pthread_t thread_id; + SDL_sem *semaphore; + /* For debugging... */ + uint32_t magic; - struct timeval tv; - int frames; + struct timeval tv; + int frames; - SDL_Surface *sdl_screen; - SDL_Rect src_rect; - SDL_Rect dst_rect; + SDL_Surface *sdl_screen; + SDL_Rect src_rect; + SDL_Rect dst_rect; - int width; - int height; - double bpp; - int src_linesize; - int dst_linesize; + int width; + int height; + double bpp; + int src_linesize; + int dst_linesize; - codec_t codec; - const struct codec_info_t *c_info; - unsigned rgb:1; - unsigned interlaced:1; - unsigned deinterlace:1; - unsigned fs:1; + codec_t codec; + const struct codec_info_t *c_info; + unsigned rgb:1; + unsigned interlaced:1; + unsigned deinterlace:1; + unsigned fs:1; }; void show_help(void); void cleanup_screen(struct state_sdl *s); -void reconfigure_screen(void *s, unsigned int width, unsigned int height, codec_t codec); +void reconfigure_screen(void *s, unsigned int width, unsigned int height, + codec_t codec); extern int should_exit; -int -display_sdl_handle_events(void *arg) +int display_sdl_handle_events(void *arg) { - SDL_Event sdl_event; - struct state_sdl *s = arg; - while (SDL_PollEvent(&sdl_event)) { - switch (sdl_event.type) { - case SDL_KEYDOWN: - case SDL_KEYUP: - if (!strcmp(SDL_GetKeyName(sdl_event.key.keysym.sym), "q")) { - should_exit = 1; - SDL_SemPost(s->semaphore); + SDL_Event sdl_event; + struct state_sdl *s = arg; + while (SDL_PollEvent(&sdl_event)) { + switch (sdl_event.type) { + case SDL_KEYDOWN: + case SDL_KEYUP: + if (!strcmp + (SDL_GetKeyName(sdl_event.key.keysym.sym), "q")) { + should_exit = 1; + SDL_SemPost(s->semaphore); + } + break; + + default: + break; } - break; - - default: - break; } - } - return 0; + return 0; } -static void* -display_thread_sdl(void *arg) +static void *display_thread_sdl(void *arg) { - struct state_sdl *s = (struct state_sdl *) arg; - struct timeval tv,tv1; - int i; - unsigned char *buff = NULL; - unsigned char *line1=NULL, *line2; - int linesize=0; - int height=0; + struct state_sdl *s = (struct state_sdl *)arg; + struct timeval tv, tv1; + int i; + unsigned char *buff = NULL; + unsigned char *line1 = NULL, *line2; + int linesize = 0; + int height = 0; - gettimeofday(&s->tv, NULL); + gettimeofday(&s->tv, NULL); - while (!should_exit) { - display_sdl_handle_events(s); - SDL_SemWait(s->semaphore); + while (!should_exit) { + display_sdl_handle_events(s); + SDL_SemWait(s->semaphore); - if(s->deinterlace) { - if(s->rgb) { - /*FIXME: this will not work! Should not deinterlace whole screen, just subwindow*/ - vc_deinterlace(s->rgb_image->pixels, s->dst_linesize, s->height); + if (s->deinterlace) { + if (s->rgb) { + /*FIXME: this will not work! Should not deinterlace whole screen, just subwindow */ + vc_deinterlace(s->rgb_image->pixels, + s->dst_linesize, s->height); + } else { + vc_deinterlace(*s->yuv_image->pixels, + s->dst_linesize, s->height); + } + } + + if (s->rgb) { + SDL_Flip(s->sdl_screen); + s->frame.data = s->sdl_screen->pixels + + s->sdl_screen->pitch * s->dst_rect.y + + s->dst_rect.x * + s->sdl_screen->format->BytesPerPixel; } else { - vc_deinterlace(*s->yuv_image->pixels, s->dst_linesize, s->height); + SDL_UnlockYUVOverlay(s->yuv_image); + SDL_DisplayYUVOverlay(s->yuv_image, &(s->dst_rect)); + s->frame.data = (unsigned char *)*s->yuv_image->pixels; + } + + s->frames++; + gettimeofday(&tv, NULL); + double seconds = tv_diff(tv, s->tv); + if (seconds > 5) { + double fps = s->frames / seconds; + fprintf(stdout, "%d frames in %g seconds = %g FPS\n", + s->frames, seconds, fps); + s->tv = tv; + s->frames = 0; } } - - if(s->rgb) { - SDL_Flip(s->sdl_screen); - s->frame.data = s->sdl_screen->pixels + - s->sdl_screen->pitch * s->dst_rect.y + s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; - } else { - SDL_UnlockYUVOverlay(s->yuv_image); - SDL_DisplayYUVOverlay(s->yuv_image, &(s->dst_rect)); - s->frame.data = (unsigned char*)*s->yuv_image->pixels; - } - - s->frames++; - gettimeofday(&tv, NULL); - double seconds = tv_diff(tv, s->tv); - if(seconds > 5) { - double fps = s->frames / seconds; - fprintf(stdout, "%d frames in %g seconds = %g FPS\n", s->frames, seconds, fps); - s->tv = tv; - s->frames = 0; - } - } - return NULL; + return NULL; } -void -show_help(void) +void show_help(void) { printf("SDL options:\n"); printf("\twidth:height:codec[:fs][:i][:d][:f:filename] | help\n"); @@ -219,128 +223,142 @@ show_help(void) show_codec_help(); } -void -cleanup_screen(struct state_sdl *s) +void cleanup_screen(struct state_sdl *s) { - if(s->rgb == 0) { - SDL_FreeYUVOverlay(s->yuv_image); - } + if (s->rgb == 0) { + SDL_FreeYUVOverlay(s->yuv_image); + } } void -reconfigure_screen(void *state, unsigned int width, unsigned int height, codec_t color_spec) +reconfigure_screen(void *state, unsigned int width, unsigned int height, + codec_t color_spec) { - struct state_sdl *s = (struct state_sdl *) state; - int itemp; - unsigned int utemp; - Window wtemp; + struct state_sdl *s = (struct state_sdl *)state; + int itemp; + unsigned int utemp; + Window wtemp; - unsigned int x_res_x; - unsigned int x_res_y; + unsigned int x_res_x; + unsigned int x_res_y; - int ret, i; + int ret, i; - cleanup_screen(s); + cleanup_screen(s); - fprintf(stdout, "Reconfigure to size %dx%d\n", width, height); + fprintf(stdout, "Reconfigure to size %dx%d\n", width, height); - s->width = width; - s->height = height; + s->width = width; + s->height = height; - ret = XGetGeometry(s->display, DefaultRootWindow(s->display), &wtemp, &itemp, - &itemp, &x_res_x, &x_res_y, &utemp, &utemp); + ret = + XGetGeometry(s->display, DefaultRootWindow(s->display), &wtemp, + &itemp, &itemp, &x_res_x, &x_res_y, &utemp, &utemp); - fprintf(stdout,"Setting video mode %dx%d.\n", x_res_x, x_res_y); - if(s->fs) - s->sdl_screen = SDL_SetVideoMode(x_res_x, x_res_y, 0, SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF); - else { - x_res_x = s->width; - x_res_y = s->height; - s->sdl_screen = SDL_SetVideoMode(x_res_x, x_res_y, 0, SDL_HWSURFACE | SDL_DOUBLEBUF); - } - if(s->sdl_screen == NULL){ - fprintf(stderr,"Error setting video mode %dx%d!\n", x_res_x, x_res_y); - free(s); - exit(128); - } - SDL_WM_SetCaption("Ultragrid - SDL Display", "Ultragrid"); - - SDL_ShowCursor(SDL_DISABLE); - - for(i = 0; codec_info[i].name != NULL; i++) { - if(color_spec == codec_info[i].codec) { - s->c_info = &codec_info[i]; - s->rgb = codec_info[i].rgb; - s->bpp = codec_info[i].bpp; + fprintf(stdout, "Setting video mode %dx%d.\n", x_res_x, x_res_y); + if (s->fs) + s->sdl_screen = + SDL_SetVideoMode(x_res_x, x_res_y, 0, + SDL_FULLSCREEN | SDL_HWSURFACE | + SDL_DOUBLEBUF); + else { + x_res_x = s->width; + x_res_y = s->height; + s->sdl_screen = + SDL_SetVideoMode(x_res_x, x_res_y, 0, + SDL_HWSURFACE | SDL_DOUBLEBUF); } - } - - if(s->rgb == 0) { - s->yuv_image = SDL_CreateYUVOverlay(s->width, s->height, FOURCC_UYVY, s->sdl_screen); - if (s->yuv_image == NULL) { - printf("SDL_overlay initialization failed.\n"); + if (s->sdl_screen == NULL) { + fprintf(stderr, "Error setting video mode %dx%d!\n", x_res_x, + x_res_y); free(s); - exit(127); - } - } + exit(128); + } + SDL_WM_SetCaption("Ultragrid - SDL Display", "Ultragrid"); - int w = s->width; + SDL_ShowCursor(SDL_DISABLE); - if(s->c_info->h_align) { - w = ((w+s->c_info->h_align-1)/s->c_info->h_align)*s->c_info->h_align; - } + for (i = 0; codec_info[i].name != NULL; i++) { + if (color_spec == codec_info[i].codec) { + s->c_info = &codec_info[i]; + s->rgb = codec_info[i].rgb; + s->bpp = codec_info[i].bpp; + } + } - s->src_linesize = w*s->bpp; - if(s->rgb) - s->dst_linesize = s->width*4; - else - s->dst_linesize = s->width*2; + if (s->rgb == 0) { + s->yuv_image = + SDL_CreateYUVOverlay(s->width, s->height, FOURCC_UYVY, + s->sdl_screen); + if (s->yuv_image == NULL) { + printf("SDL_overlay initialization failed.\n"); + free(s); + exit(127); + } + } - s->dst_rect.w = s->width; - s->dst_rect.h = s->height; + int w = s->width; - if ((int)x_res_x > s->width) { - s->dst_rect.x = (x_res_x - s->width) / 2; - } else if((int)x_res_x < s->width){ - s->dst_rect.w = x_res_x; - } - if ((int)x_res_y > s->height) { - s->dst_rect.y = (x_res_y - s->height) / 2; - } else if((int)x_res_y < s->height) { - s->dst_rect.h = x_res_y; - } + if (s->c_info->h_align) { + w = ((w + s->c_info->h_align - + 1) / s->c_info->h_align) * s->c_info->h_align; + } - s->src_rect.w = s->width; - s->src_rect.h = s->height; + s->src_linesize = w * s->bpp; + if (s->rgb) + s->dst_linesize = s->width * 4; + else + s->dst_linesize = s->width * 2; - fprintf(stdout,"Setting SDL rect %dx%d - %d,%d.\n", s->dst_rect.w, s->dst_rect.h, s->dst_rect.x, - s->dst_rect.y); + s->dst_rect.w = s->width; + s->dst_rect.h = s->height; - s->frame.rshift = s->sdl_screen->format->Rshift; - s->frame.gshift = s->sdl_screen->format->Gshift; - s->frame.bshift = s->sdl_screen->format->Bshift; - s->frame.color_spec = s->c_info->codec; - s->frame.width = s->width; - s->frame.height = s->height; - s->frame.src_bpp = s->bpp; - s->frame.dst_linesize = s->dst_linesize; + if ((int)x_res_x > s->width) { + s->dst_rect.x = (x_res_x - s->width) / 2; + } else if ((int)x_res_x < s->width) { + s->dst_rect.w = x_res_x; + } + if ((int)x_res_y > s->height) { + s->dst_rect.y = (x_res_y - s->height) / 2; + } else if ((int)x_res_y < s->height) { + s->dst_rect.h = x_res_y; + } - if(s->rgb) { - s->frame.data = s->sdl_screen->pixels + - s->sdl_screen->pitch * s->dst_rect.y + s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; - s->frame.data_len = s->sdl_screen->pitch * x_res_y - - s->sdl_screen->pitch * s->dst_rect.y + s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; - s->frame.dst_x_offset = s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; - s->frame.dst_bpp = s->sdl_screen->format->BytesPerPixel; - s->frame.dst_pitch = s->sdl_screen->pitch; - } else { - s->frame.data = (unsigned char*)*s->yuv_image->pixels; - s->frame.data_len = s->width * s->height * 2; - s->frame.dst_bpp = 2; - s->frame.dst_pitch = s->dst_linesize; - } + s->src_rect.w = s->width; + s->src_rect.h = s->height; - switch(color_spec) { + fprintf(stdout, "Setting SDL rect %dx%d - %d,%d.\n", s->dst_rect.w, + s->dst_rect.h, s->dst_rect.x, s->dst_rect.y); + + s->frame.rshift = s->sdl_screen->format->Rshift; + s->frame.gshift = s->sdl_screen->format->Gshift; + s->frame.bshift = s->sdl_screen->format->Bshift; + s->frame.color_spec = s->c_info->codec; + s->frame.width = s->width; + s->frame.height = s->height; + s->frame.src_bpp = s->bpp; + s->frame.dst_linesize = s->dst_linesize; + + if (s->rgb) { + s->frame.data = s->sdl_screen->pixels + + s->sdl_screen->pitch * s->dst_rect.y + + s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; + s->frame.data_len = + s->sdl_screen->pitch * x_res_y - + s->sdl_screen->pitch * s->dst_rect.y + + s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; + s->frame.dst_x_offset = + s->dst_rect.x * s->sdl_screen->format->BytesPerPixel; + s->frame.dst_bpp = s->sdl_screen->format->BytesPerPixel; + s->frame.dst_pitch = s->sdl_screen->pitch; + } else { + s->frame.data = (unsigned char *)*s->yuv_image->pixels; + s->frame.data_len = s->width * s->height * 2; + s->frame.dst_bpp = 2; + s->frame.dst_pitch = s->dst_linesize; + } + + switch (color_spec) { case R10k: s->frame.decoder = vc_copyliner10k; break; @@ -359,251 +377,255 @@ reconfigure_screen(void *state, unsigned int width, unsigned int height, codec_t s->frame.decoder = vc_copylineRGBA; break; - } + } } -void * -display_sdl_init(char *fmt) +void *display_sdl_init(char *fmt) { - struct state_sdl *s; - int ret; + struct state_sdl *s; + int ret; - SDL_Surface *image; - SDL_Surface *temp; - SDL_Rect splash_src; - SDL_Rect splash_dest; + SDL_Surface *image; + SDL_Surface *temp; + SDL_Rect splash_src; + SDL_Rect splash_dest; - unsigned int i; + unsigned int i; - s = (struct state_sdl *) calloc(sizeof(struct state_sdl),1); - s->magic = MAGIC_SDL; + s = (struct state_sdl *)calloc(sizeof(struct state_sdl), 1); + s->magic = MAGIC_SDL; - if(fmt != NULL) { - if(strcmp(fmt, "help") == 0) { - show_help(); - free(s); - return NULL; - } - - if(strcmp(fmt, "fs") == 0) { - s->fs = 1; - fmt = NULL; - } else { - - char *tmp = strdup(fmt); - char *tok; - - tok = strtok(tmp, ":"); - if(tok == NULL) { + if (fmt != NULL) { + if (strcmp(fmt, "help") == 0) { show_help(); free(s); - free(tmp); return NULL; } - s->width = atol(tok); - tok = strtok(NULL, ":"); - if(tok == NULL) { - show_help(); - free(s); - free(tmp); - return NULL; - } - s->height = atol(tok); - tok = strtok(NULL, ":"); - if(tok == NULL) { - show_help(); - free(s); - free(tmp); - return NULL; - } - s->codec = 0xffffffff; - for(i = 0; codec_info[i].name != NULL; i++) { - if(strcmp(tok, codec_info[i].name) == 0) { - s->codec = codec_info[i].codec; - s->c_info = &codec_info[i]; - s->rgb = codec_info[i].rgb; + + if (strcmp(fmt, "fs") == 0) { + s->fs = 1; + fmt = NULL; + } else { + + char *tmp = strdup(fmt); + char *tok; + + tok = strtok(tmp, ":"); + if (tok == NULL) { + show_help(); + free(s); + free(tmp); + return NULL; } - } - if(s->codec == 0xffffffff) { - fprintf(stderr, "SDL: unknown codec: %s\n", tok); - free(s); - free(tmp); - return NULL; - } - tok = strtok(NULL, ":"); - while(tok != NULL) { - if(tok[0] == 'f' && tok[1] == 's') { - s->fs=1; - } else if(tok[0] == 'i') { - s->interlaced = 1; - } else if(tok[0] == 'd') { - s->deinterlace = 1; + s->width = atol(tok); + tok = strtok(NULL, ":"); + if (tok == NULL) { + show_help(); + free(s); + free(tmp); + return NULL; + } + s->height = atol(tok); + tok = strtok(NULL, ":"); + if (tok == NULL) { + show_help(); + free(s); + free(tmp); + return NULL; + } + s->codec = 0xffffffff; + for (i = 0; codec_info[i].name != NULL; i++) { + if (strcmp(tok, codec_info[i].name) == 0) { + s->codec = codec_info[i].codec; + s->c_info = &codec_info[i]; + s->rgb = codec_info[i].rgb; + } + } + if (s->codec == 0xffffffff) { + fprintf(stderr, "SDL: unknown codec: %s\n", + tok); + free(s); + free(tmp); + return NULL; } tok = strtok(NULL, ":"); - } - free(tmp); + while (tok != NULL) { + if (tok[0] == 'f' && tok[1] == 's') { + s->fs = 1; + } else if (tok[0] == 'i') { + s->interlaced = 1; + } else if (tok[0] == 'd') { + s->deinterlace = 1; + } + tok = strtok(NULL, ":"); + } + free(tmp); - if(s->width <= 0 || s->height <= 0) { - printf("SDL: failed to parse config options: '%s'\n", fmt); - free(s); - return NULL; + if (s->width <= 0 || s->height <= 0) { + printf + ("SDL: failed to parse config options: '%s'\n", + fmt); + free(s); + return NULL; + } + s->bpp = s->c_info->bpp; + printf("SDL setup: %dx%d codec %s\n", s->width, + s->height, s->c_info->name); } - s->bpp = s->c_info->bpp; - printf("SDL setup: %dx%d codec %s\n", s->width, s->height, s->c_info->name); } - } - asm("emms\n"); + asm("emms\n"); - s->semaphore = SDL_CreateSemaphore(0); + s->semaphore = SDL_CreateSemaphore(0); - if (!(s->display = XOpenDisplay(NULL))) { + if (!(s->display = XOpenDisplay(NULL))) { printf("Unable to open display.\n"); return NULL; - } - + } #ifdef HAVE_MACOSX - /* Startup function to call when running Cocoa code from a Carbon application. - * Whatever the fuck that means. - * Avoids uncaught exception (1002) when creating CGSWindow */ - NSApplicationLoad(); + /* Startup function to call when running Cocoa code from a Carbon application. + * Whatever the fuck that means. + * Avoids uncaught exception (1002) when creating CGSWindow */ + NSApplicationLoad(); #endif - ret = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); - if (ret < 0) { - printf("Unable to initialize SDL.\n"); - return NULL; - } - - if(fmt != NULL) { - /*FIXME: kill hd_size at all, use another approach avoiding globals */ - int w = s->width; - - if(s->c_info->h_align) { - w = ((w+s->c_info->h_align-1)/s->c_info->h_align)*s->c_info->h_align; + ret = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); + if (ret < 0) { + printf("Unable to initialize SDL.\n"); + return NULL; } - hd_size_x = w; - hd_size_y = s->height; - reconfigure_screen(s, w, s->height, s->c_info->codec); - temp = SDL_LoadBMP("/usr/share/uv-0.3.1/uv_startup.bmp"); - if (temp == NULL) { - temp = SDL_LoadBMP("/usr/local/share/uv-0.3.1/uv_startup.bmp"); - if (temp == NULL) { - temp = SDL_LoadBMP("uv_startup.bmp"); - if (temp == NULL) { - printf("Unable to load splash bitmap: uv_startup.bmp.\n"); + if (fmt != NULL) { + /*FIXME: kill hd_size at all, use another approach avoiding globals */ + int w = s->width; + + if (s->c_info->h_align) { + w = ((w + s->c_info->h_align - + 1) / s->c_info->h_align) * s->c_info->h_align; + } + + hd_size_x = w; + hd_size_y = s->height; + reconfigure_screen(s, w, s->height, s->c_info->codec); + temp = SDL_LoadBMP("/usr/share/uv-0.3.1/uv_startup.bmp"); + if (temp == NULL) { + temp = + SDL_LoadBMP + ("/usr/local/share/uv-0.3.1/uv_startup.bmp"); + if (temp == NULL) { + temp = SDL_LoadBMP("uv_startup.bmp"); + if (temp == NULL) { + printf + ("Unable to load splash bitmap: uv_startup.bmp.\n"); + } + } + } + + if (temp != NULL) { + image = SDL_DisplayFormat(temp); + SDL_FreeSurface(temp); + + splash_src.x = 0; + splash_src.y = 0; + splash_src.w = image->w; + splash_src.h = image->h; + + splash_dest.x = (int)((s->width - splash_src.w) / 2); + splash_dest.y = + (int)((s->height - splash_src.h) / 2) + 60; + splash_dest.w = image->w; + splash_dest.h = image->h; + + SDL_BlitSurface(image, &splash_src, s->sdl_screen, + &splash_dest); + SDL_Flip(s->sdl_screen); } - } - } - - if (temp != NULL) { - image = SDL_DisplayFormat(temp); - SDL_FreeSurface(temp); - - splash_src.x = 0; - splash_src.y = 0; - splash_src.w = image->w; - splash_src.h = image->h; - - splash_dest.x = (int)((s->width - splash_src.w) / 2); - splash_dest.y = (int)((s->height - splash_src.h) / 2) + 60; - splash_dest.w = image->w; - splash_dest.h = image->h; - - SDL_BlitSurface(image, &splash_src, s->sdl_screen, &splash_dest); - SDL_Flip(s->sdl_screen); } - } - s->frame.width = 0; - s->frame.height = 0; - s->frame.color_spec = 0; - s->frame.state = s; - s->frame.reconfigure = reconfigure_screen; + s->frame.width = 0; + s->frame.height = 0; + s->frame.color_spec = 0; + s->frame.state = s; + s->frame.reconfigure = reconfigure_screen; - if (pthread_create(&(s->thread_id), NULL, display_thread_sdl, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } + if (pthread_create(&(s->thread_id), NULL, display_thread_sdl, (void *)s) + != 0) { + perror("Unable to create display thread\n"); + return NULL; + } - return (void *)s; + return (void *)s; } -void -display_sdl_done(void *state) +void display_sdl_done(void *state) { - struct state_sdl *s = (struct state_sdl *) state; + struct state_sdl *s = (struct state_sdl *)state; - assert(s->magic == MAGIC_SDL); + assert(s->magic == MAGIC_SDL); - /*FIXME: free all the stuff */ - SDL_ShowCursor(SDL_ENABLE); + /*FIXME: free all the stuff */ + SDL_ShowCursor(SDL_ENABLE); - SDL_Quit(); + SDL_Quit(); } -struct video_frame * -display_sdl_getf(void *state) +struct video_frame *display_sdl_getf(void *state) { - struct state_sdl *s = (struct state_sdl *) state; - assert(s->magic == MAGIC_SDL); - return &s->frame; + struct state_sdl *s = (struct state_sdl *)state; + assert(s->magic == MAGIC_SDL); + return &s->frame; } -int -display_sdl_putf(void *state, char *frame) +int display_sdl_putf(void *state, char *frame) { - int tmp; - struct state_sdl *s = (struct state_sdl *) state; + int tmp; + struct state_sdl *s = (struct state_sdl *)state; - assert(s->magic == MAGIC_SDL); - assert(frame != NULL); + assert(s->magic == MAGIC_SDL); + assert(frame != NULL); - SDL_SemPost(s->semaphore); - tmp = SDL_SemValue(s->semaphore); - if(tmp > 1) - printf("%d frame(s) dropped!\n", tmp); - return 0; + SDL_SemPost(s->semaphore); + tmp = SDL_SemValue(s->semaphore); + if (tmp > 1) + printf("%d frame(s) dropped!\n", tmp); + return 0; } -display_colour_t -display_sdl_colour(void *state) +display_colour_t display_sdl_colour(void *state) { - struct state_sdl *s = (struct state_sdl *) state; - assert(s->magic == MAGIC_SDL); - return DC_YUV; + struct state_sdl *s = (struct state_sdl *)state; + assert(s->magic == MAGIC_SDL); + return DC_YUV; } -display_type_t * -display_sdl_probe(void) +display_type_t *display_sdl_probe(void) { - display_type_t *dt; - display_format_t *dformat; + display_type_t *dt; + display_format_t *dformat; - dformat = malloc(4 * sizeof(display_format_t)); - dformat[0].size = DS_176x144; - dformat[0].colour_mode = DC_YUV; - dformat[0].num_images = 1; - dformat[1].size = DS_352x288; - dformat[1].colour_mode = DC_YUV; - dformat[1].num_images = 1; - dformat[2].size = DS_702x576; - dformat[2].colour_mode = DC_YUV; - dformat[2].num_images = 1; - dformat[3].size = DS_1280x720; - dformat[3].colour_mode = DC_YUV; - dformat[3].num_images = 1; + dformat = malloc(4 * sizeof(display_format_t)); + dformat[0].size = DS_176x144; + dformat[0].colour_mode = DC_YUV; + dformat[0].num_images = 1; + dformat[1].size = DS_352x288; + dformat[1].colour_mode = DC_YUV; + dformat[1].num_images = 1; + dformat[2].size = DS_702x576; + dformat[2].colour_mode = DC_YUV; + dformat[2].num_images = 1; + dformat[3].size = DS_1280x720; + dformat[3].colour_mode = DC_YUV; + dformat[3].num_images = 1; - dt = malloc(sizeof(display_type_t)); - if (dt != NULL) { - dt->id = DISPLAY_SDL_ID; - dt->name = "sdl"; - dt->description = "SDL with Xvideo extension"; - dt->formats = dformat; - dt->num_formats = 4; - } - return dt; + dt = malloc(sizeof(display_type_t)); + if (dt != NULL) { + dt->id = DISPLAY_SDL_ID; + dt->name = "sdl"; + dt->description = "SDL with Xvideo extension"; + dt->formats = dformat; + dt->num_formats = 4; + } + return dt; } -#endif /* X_DISPLAY_MISSING */ +#endif /* X_DISPLAY_MISSING */ diff --git a/ultragrid/src/video_display/sdl.h b/ultragrid/src/video_display/sdl.h index 5257709b1..25c8db336 100644 --- a/ultragrid/src/video_display/sdl.h +++ b/ultragrid/src/video_display/sdl.h @@ -51,11 +51,10 @@ #define DISPLAY_SDL_ID 0xba370a2b -display_type_t *display_sdl_probe(void); -void *display_sdl_init(char *fmt); -void display_sdl_done(void *state); -struct video_frame *display_sdl_getf(void *state); -int display_sdl_putf(void *state, char *frame); -display_colour_t display_sdl_colour(void *state); -int display_sdl_handle_events(void *s); - +display_type_t *display_sdl_probe (void); +void *display_sdl_init (char *fmt); +void display_sdl_done (void *state); +struct video_frame *display_sdl_getf (void *state); +int display_sdl_putf (void *state, char *frame); +display_colour_t display_sdl_colour (void *state); +int display_sdl_handle_events (void *s); diff --git a/ultragrid/src/video_display/x11.c b/ultragrid/src/video_display/x11.c index ccd4313df..7e02335ed 100644 --- a/ultragrid/src/video_display/x11.c +++ b/ultragrid/src/video_display/x11.c @@ -53,7 +53,7 @@ #include "config_unix.h" #include "config_win32.h" -#ifndef X_DISPLAY_MISSING /* Don't try to compile if X is not present */ +#ifndef X_DISPLAY_MISSING /* Don't try to compile if X is not present */ #include "debug.h" #include "video_display.h" @@ -75,155 +75,166 @@ #define MAGIC_X11 0xcafebabe struct state_x11 { - Display *display; - Window window; - GC gc; - int vw_depth; - Visual *vw_visual; - XImage *vw_image; - XShmSegmentInfo vw_shm_segment; - int xv_port; - uint32_t magic; /* For debugging */ + Display *display; + Window window; + GC gc; + int vw_depth; + Visual *vw_visual; + XImage *vw_image; + XShmSegmentInfo vw_shm_segment; + int xv_port; + uint32_t magic; /* For debugging */ }; -void * -display_x11_init(void) +void *display_x11_init(void) { - struct state_x11 *s; + struct state_x11 *s; - s = (struct state_x11 *) malloc(sizeof(struct state_x11)); - s->magic = MAGIC_X11; + s = (struct state_x11 *)malloc(sizeof(struct state_x11)); + s->magic = MAGIC_X11; - /* Create a bare window to draw into... */ + /* Create a bare window to draw into... */ if (!(s->display = XOpenDisplay(NULL))) { printf("Unable to open display.\n"); abort(); } - s->window = XCreateSimpleWindow(s->display, DefaultRootWindow(s->display), 0, 0, HD_WIDTH, HD_HEIGHT, 0, BlackPixel(s->display, DefaultScreen(s->display)), BlackPixel(s->display, DefaultScreen(s->display))); + s->window = + XCreateSimpleWindow(s->display, DefaultRootWindow(s->display), 0, 0, + HD_WIDTH, HD_HEIGHT, 0, BlackPixel(s->display, + DefaultScreen + (s-> + display)), + BlackPixel(s->display, + DefaultScreen(s->display))); if (s->window == 0) { - abort(); - }; + abort(); + }; XMapWindow(s->display, s->window); - XStoreName(s->display, s->window, "UltraGrid"); + XStoreName(s->display, s->window, "UltraGrid"); - s->vw_depth = DefaultDepth(s->display, DefaultScreen(s->display)); + s->vw_depth = DefaultDepth(s->display, DefaultScreen(s->display)); s->vw_visual = DefaultVisual(s->display, DefaultScreen(s->display)); - /* For now, we only support 24-bit TrueColor displays... */ - if (s->vw_depth != 24) { - printf("Unable to open display: not 24 bit colour\n"); - return NULL; - } - if (s->vw_visual->class != TrueColor) { - printf("Unable to open display: not TrueColor visual\n"); - return NULL; - } + /* For now, we only support 24-bit TrueColor displays... */ + if (s->vw_depth != 24) { + printf("Unable to open display: not 24 bit colour\n"); + return NULL; + } + if (s->vw_visual->class != TrueColor) { + printf("Unable to open display: not TrueColor visual\n"); + return NULL; + } - /* Do the shared memory magic... */ - s->vw_image = XShmCreateImage(s->display, s->vw_visual, s->vw_depth, ZPixmap, NULL, &s->vw_shm_segment, HD_WIDTH, HD_HEIGHT); - debug_msg("vw_image = %p\n", s->vw_image); - debug_msg("vw_image->width = %d\n", s->vw_image->width); - debug_msg("vw_image->height = %d\n", s->vw_image->height); - if (s->vw_image->width != (int)HD_WIDTH) { - printf("Display does not support %d pixel wide shared memory images\n", HD_WIDTH); - abort(); - } - if (s->vw_image->height != (int)HD_HEIGHT) { - printf("Display does not support %d pixel tall shared memory images\n", HD_WIDTH); - abort(); - } + /* Do the shared memory magic... */ + s->vw_image = + XShmCreateImage(s->display, s->vw_visual, s->vw_depth, ZPixmap, + NULL, &s->vw_shm_segment, HD_WIDTH, HD_HEIGHT); + debug_msg("vw_image = %p\n", s->vw_image); + debug_msg("vw_image->width = %d\n", s->vw_image->width); + debug_msg("vw_image->height = %d\n", s->vw_image->height); + if (s->vw_image->width != (int)HD_WIDTH) { + printf + ("Display does not support %d pixel wide shared memory images\n", + HD_WIDTH); + abort(); + } + if (s->vw_image->height != (int)HD_HEIGHT) { + printf + ("Display does not support %d pixel tall shared memory images\n", + HD_WIDTH); + abort(); + } - s->vw_shm_segment.shmid = shmget(IPC_PRIVATE, s->vw_image->bytes_per_line * s->vw_image->height, IPC_CREAT|0777); - s->vw_shm_segment.shmaddr = shmat(s->vw_shm_segment.shmid, 0, 0); - s->vw_shm_segment.readOnly = False; - debug_msg("vw_shm_segment.shmid = %d\n", s->vw_shm_segment.shmid); - debug_msg("vw_shm_segment.shmaddr = %d\n", s->vw_shm_segment.shmaddr); + s->vw_shm_segment.shmid = + shmget(IPC_PRIVATE, + s->vw_image->bytes_per_line * s->vw_image->height, + IPC_CREAT | 0777); + s->vw_shm_segment.shmaddr = shmat(s->vw_shm_segment.shmid, 0, 0); + s->vw_shm_segment.readOnly = False; + debug_msg("vw_shm_segment.shmid = %d\n", s->vw_shm_segment.shmid); + debug_msg("vw_shm_segment.shmaddr = %d\n", + s->vw_shm_segment.shmaddr); - s->vw_image->data = s->vw_shm_segment.shmaddr; + s->vw_image->data = s->vw_shm_segment.shmaddr; if (XShmAttach(s->display, &s->vw_shm_segment) == 0) { - printf("Cannot attach shared memory segment\n"); - abort(); - } + printf("Cannot attach shared memory segment\n"); + abort(); + } - /* Get our window onto the screen... */ - XFlush(s->display); + /* Get our window onto the screen... */ + XFlush(s->display); - s->gc = XCreateGC(s->display, s->window, 0, NULL); + s->gc = XCreateGC(s->display, s->window, 0, NULL); - printf ("X11 init done\n"); - return (void *) s; - return NULL; + printf("X11 init done\n"); + return (void *)s; + return NULL; } -void -display_x11_done(void *state) +void display_x11_done(void *state) { - struct state_x11 *s = (struct state_x11 *) state; + struct state_x11 *s = (struct state_x11 *)state; - assert(s->magic == MAGIC_X11); + assert(s->magic == MAGIC_X11); - XShmDetach(s->display, &(s->vw_shm_segment)); - XDestroyImage(s->vw_image); - shmdt(s->vw_shm_segment.shmaddr); - shmctl(s->vw_shm_segment.shmid, IPC_RMID, 0); + XShmDetach(s->display, &(s->vw_shm_segment)); + XDestroyImage(s->vw_image); + shmdt(s->vw_shm_segment.shmaddr); + shmctl(s->vw_shm_segment.shmid, IPC_RMID, 0); } -char * -display_x11_getf(void *state) +char *display_x11_getf(void *state) { - struct state_x11 *s = (struct state_x11 *) state; - assert(s->magic == MAGIC_X11); - return s->vw_image->data; + struct state_x11 *s = (struct state_x11 *)state; + assert(s->magic == MAGIC_X11); + return s->vw_image->data; } -int -display_x11_putf(void *state, char *frame) +int display_x11_putf(void *state, char *frame) { - struct state_x11 *s = (struct state_x11 *) state; + struct state_x11 *s = (struct state_x11 *)state; - assert(s->magic == MAGIC_X11); - assert(frame == s->vw_image->data); - XShmPutImage(s->display, s->window, s->gc, s->vw_image, 0, 0, 0, 0, s->vw_image->width, s->vw_image->height, True); - XFlush(s->display); - return 0; + assert(s->magic == MAGIC_X11); + assert(frame == s->vw_image->data); + XShmPutImage(s->display, s->window, s->gc, s->vw_image, 0, 0, 0, 0, + s->vw_image->width, s->vw_image->height, True); + XFlush(s->display); + return 0; } -display_colour_t -display_x11_colour(void *state) +display_colour_t display_x11_colour(void *state) { - struct state_x11 *s = (struct state_x11 *) state; - assert(s->magic == MAGIC_X11); - return DC_YUV; + struct state_x11 *s = (struct state_x11 *)state; + assert(s->magic == MAGIC_X11); + return DC_YUV; } -display_type_t * -display_x11_probe(void) +display_type_t *display_x11_probe(void) { - display_type_t *dt; - display_format_t *dformat; + display_type_t *dt; + display_format_t *dformat; - dformat = malloc(3 * sizeof(display_format_t)); - dformat[0].size = DS_176x144; - dformat[0].colour_mode = DC_RGB; - dformat[0].num_images = -1; - dformat[1].size = DS_352x288; - dformat[1].colour_mode = DC_RGB; - dformat[1].num_images = -1; - dformat[2].size = DS_702x576; - dformat[2].colour_mode = DC_RGB; - dformat[2].num_images = -1; + dformat = malloc(3 * sizeof(display_format_t)); + dformat[0].size = DS_176x144; + dformat[0].colour_mode = DC_RGB; + dformat[0].num_images = -1; + dformat[1].size = DS_352x288; + dformat[1].colour_mode = DC_RGB; + dformat[1].num_images = -1; + dformat[2].size = DS_702x576; + dformat[2].colour_mode = DC_RGB; + dformat[2].num_images = -1; - dt = malloc(sizeof(display_type_t)); - if (dt != NULL) { - dt->id = DISPLAY_X11_ID; - dt->name = "x11"; - dt->description = "X Window System"; - dt->formats = dformat; - dt->num_formats = 3; - } - return dt; + dt = malloc(sizeof(display_type_t)); + if (dt != NULL) { + dt->id = DISPLAY_X11_ID; + dt->name = "x11"; + dt->description = "X Window System"; + dt->formats = dformat; + dt->num_formats = 3; + } + return dt; } -#endif /* X_DISPLAY_MISSING */ - +#endif /* X_DISPLAY_MISSING */ diff --git a/ultragrid/src/video_display/xv.c b/ultragrid/src/video_display/xv.c index bb43fd8fb..fedb4af9f 100644 --- a/ultragrid/src/video_display/xv.c +++ b/ultragrid/src/video_display/xv.c @@ -53,7 +53,7 @@ #include "config_unix.h" #include "config_win32.h" -#ifndef X_DISPLAY_MISSING /* Don't try to compile if X is not present */ +#ifndef X_DISPLAY_MISSING /* Don't try to compile if X is not present */ #include "debug.h" #include "video_display.h" @@ -73,296 +73,325 @@ #include #include -extern int XShmQueryExtension(Display*); -extern int XShmGetEventBase(Display*); -extern XvImage *XvShmCreateImage(Display*, XvPortID, int, char*, int, int, XShmSegmentInfo*); +extern int XShmQueryExtension(Display *); +extern int XShmGetEventBase(Display *); +extern XvImage *XvShmCreateImage(Display *, XvPortID, int, char *, int, int, + XShmSegmentInfo *); #define HD_WIDTH hd_size_x #define HD_HEIGHT hd_size_y #define MAGIC_XV DISPLAY_XV_ID - struct state_xv { - Display *display; - Window window; - GC gc; - int vw_depth; - Visual *vw_visual; - XvImage *vw_image[3]; - XShmSegmentInfo vw_shm_segment[2]; - int image_display, image_network; - XvAdaptorInfo *ai; - int xv_port; - /* Thread related information follows... */ - pthread_t thread_id; - pthread_mutex_t lock; - pthread_cond_t boss_cv; - pthread_cond_t worker_cv; - int work_to_do; - int boss_waiting; - int worker_waiting; - /* For debugging... */ - uint32_t magic; + Display *display; + Window window; + GC gc; + int vw_depth; + Visual *vw_visual; + XvImage *vw_image[3]; + XShmSegmentInfo vw_shm_segment[2]; + int image_display, image_network; + XvAdaptorInfo *ai; + int xv_port; + /* Thread related information follows... */ + pthread_t thread_id; + pthread_mutex_t lock; + pthread_cond_t boss_cv; + pthread_cond_t worker_cv; + int work_to_do; + int boss_waiting; + int worker_waiting; + /* For debugging... */ + uint32_t magic; }; -static void* -display_thread_xv(void *arg) +static void *display_thread_xv(void *arg) { - struct state_xv *s = (struct state_xv *) arg; + struct state_xv *s = (struct state_xv *)arg; - while (1) { - pthread_mutex_lock(&s->lock); + while (1) { + pthread_mutex_lock(&s->lock); - while (s->work_to_do == FALSE) { - s->worker_waiting = TRUE; - pthread_cond_wait(&s->worker_cv, &s->lock); - s->worker_waiting = FALSE; - } + while (s->work_to_do == FALSE) { + s->worker_waiting = TRUE; + pthread_cond_wait(&s->worker_cv, &s->lock); + s->worker_waiting = FALSE; + } - s->work_to_do = FALSE; + s->work_to_do = FALSE; - if (s->boss_waiting) { - pthread_cond_signal(&s->boss_cv); - } - pthread_mutex_unlock(&s->lock); + if (s->boss_waiting) { + pthread_cond_signal(&s->boss_cv); + } + pthread_mutex_unlock(&s->lock); - XvShmPutImage(s->display, s->xv_port, s->window, s->gc, s->vw_image[s->image_display], 0, 0, - s->vw_image[s->image_display]->width, s->vw_image[s->image_display]->height, 0, 0, HD_WIDTH, HD_HEIGHT, False); + XvShmPutImage(s->display, s->xv_port, s->window, s->gc, + s->vw_image[s->image_display], 0, 0, + s->vw_image[s->image_display]->width, + s->vw_image[s->image_display]->height, 0, 0, + HD_WIDTH, HD_HEIGHT, False); - XFlush(s->display); - } - return NULL; + XFlush(s->display); + } + return NULL; } - -void * -display_xv_init(void) +void *display_xv_init(void) { - struct state_xv *s; - unsigned int p_version, p_release, p_request_base, p_event_base, p_error_base, p; - unsigned int p_num_adaptors, i, j; + struct state_xv *s; + unsigned int p_version, p_release, p_request_base, p_event_base, + p_error_base, p; + unsigned int p_num_adaptors, i, j; - s = (struct state_xv *) malloc(sizeof(struct state_xv)); - s->magic = MAGIC_XV; - s->xv_port = -1; + s = (struct state_xv *)malloc(sizeof(struct state_xv)); + s->magic = MAGIC_XV; + s->xv_port = -1; - if (!(s->display = XOpenDisplay(NULL))) { - printf("Unable to open display.\n"); - return NULL; - } + if (!(s->display = XOpenDisplay(NULL))) { + printf("Unable to open display.\n"); + return NULL; + } - /* Do we support the Xv extension? */ - if (XvQueryExtension(s->display, &p_version, &p_release, &p_request_base, &p_event_base, &p_error_base) != Success) { - printf("Cannot activate Xv extension\n"); - abort(); - } - debug_msg("Xv version = %u.%u\n", p_version, p_release); - debug_msg("Xv request base = %u\n", p_request_base); - debug_msg("Xv event base = %u\n", p_event_base); - debug_msg("Xv error base = %u\n", p_error_base); - if (XvQueryAdaptors(s->display, DefaultRootWindow(s->display), &p_num_adaptors, &s->ai) != Success) { - printf("Cannot query Xv adaptors\n"); - abort(); - } - s->xv_port = 0; - debug_msg("Xv adaptor count = %d\n", p_num_adaptors); - for (i = 0; i < p_num_adaptors && s->xv_port == 0; i++) { - debug_msg("Xv adaptor %d name = %s\n", i, s->ai[i].name); - debug_msg("Xv adaptor %d type = %s%s%s%s%s\n", i, (s->ai[i].type & XvInputMask) ? "[input] " : "", - (s->ai[i].type & XvOutputMask) ? "[output] " : "", - (s->ai[i].type & XvVideoMask) ? "[video] " : "", - (s->ai[i].type & XvStillMask) ? "[still] " : "", - (s->ai[i].type & XvImageMask) ? "[image] " : ""); - for (p = s->ai[i].base_id; p < s->ai[i].base_id + s->ai[i].num_ports; p++) { - unsigned int encodings; - int formats; - int k; - XvEncodingInfo *ei; - XvImageFormatValues *fo; + /* Do we support the Xv extension? */ + if (XvQueryExtension + (s->display, &p_version, &p_release, &p_request_base, &p_event_base, + &p_error_base) != Success) { + printf("Cannot activate Xv extension\n"); + abort(); + } + debug_msg("Xv version = %u.%u\n", p_version, p_release); + debug_msg("Xv request base = %u\n", p_request_base); + debug_msg("Xv event base = %u\n", p_event_base); + debug_msg("Xv error base = %u\n", p_error_base); + if (XvQueryAdaptors + (s->display, DefaultRootWindow(s->display), &p_num_adaptors, + &s->ai) != Success) { + printf("Cannot query Xv adaptors\n"); + abort(); + } + s->xv_port = 0; + debug_msg("Xv adaptor count = %d\n", p_num_adaptors); + for (i = 0; i < p_num_adaptors && s->xv_port == 0; i++) { + debug_msg("Xv adaptor %d name = %s\n", i, s->ai[i].name); + debug_msg("Xv adaptor %d type = %s%s%s%s%s\n", i, + (s->ai[i].type & XvInputMask) ? "[input] " : "", + (s->ai[i].type & XvOutputMask) ? "[output] " : "", + (s->ai[i].type & XvVideoMask) ? "[video] " : "", + (s->ai[i].type & XvStillMask) ? "[still] " : "", + (s->ai[i].type & XvImageMask) ? "[image] " : ""); + for (p = s->ai[i].base_id; + p < s->ai[i].base_id + s->ai[i].num_ports; p++) { + unsigned int encodings; + int formats; + int k; + XvEncodingInfo *ei; + XvImageFormatValues *fo; - if(!XvGrabPort(s->display, p, CurrentTime)) { - debug_msg("Grabed port: %d\n", p); - s->xv_port = p; - } else { - debug_msg("Cannot grab port: %d\n", p); - abort(); - } + if (!XvGrabPort(s->display, p, CurrentTime)) { + debug_msg("Grabed port: %d\n", p); + s->xv_port = p; + } else { + debug_msg("Cannot grab port: %d\n", p); + abort(); + } - if (XvQueryEncodings(s->display, p, &encodings, &ei) != Success) { - printf("Cannot query Xv encodings\n"); - abort(); - } - for (j = 0; j < encodings; j++) { - debug_msg("Xv adaptor %d port %d coding %d = %s\n", i, p - s->ai[i].base_id, j, ei[j].name); - } - XvFreeEncodingInfo(ei); - fo = XvListImageFormats(s->display, p, &formats); - for (k = 0; k < formats; k++) { - debug_msg("Xv adaptor %d port %d format %d = 0x%08lx %s\n", i, p - s->ai[i].base_id, k, fo[k].id, fo[k].guid); - } - if (fo != NULL) { - XFree(fo); - } - } - } + if (XvQueryEncodings(s->display, p, &encodings, &ei) != + Success) { + printf("Cannot query Xv encodings\n"); + abort(); + } + for (j = 0; j < encodings; j++) { + debug_msg + ("Xv adaptor %d port %d coding %d = %s\n", + i, p - s->ai[i].base_id, j, ei[j].name); + } + XvFreeEncodingInfo(ei); + fo = XvListImageFormats(s->display, p, &formats); + for (k = 0; k < formats; k++) { + debug_msg + ("Xv adaptor %d port %d format %d = 0x%08lx %s\n", + i, p - s->ai[i].base_id, k, fo[k].id, + fo[k].guid); + } + if (fo != NULL) { + XFree(fo); + } + } + } - - s->window = XCreateSimpleWindow(s->display, DefaultRootWindow(s->display), 0, 0, HD_WIDTH, HD_HEIGHT, 0, XWhitePixel(s->display, DefaultScreen(s->display)), XBlackPixel(s->display, DefaultScreen(s->display))); + s->window = + XCreateSimpleWindow(s->display, DefaultRootWindow(s->display), 0, 0, + HD_WIDTH, HD_HEIGHT, 0, XWhitePixel(s->display, + DefaultScreen + (s-> + display)), + XBlackPixel(s->display, + DefaultScreen(s->display))); - s->gc = XCreateGC(s->display, s->window, 0, 0); + s->gc = XCreateGC(s->display, s->window, 0, 0); - XMapWindow(s->display, s->window); + XMapWindow(s->display, s->window); - XStoreName(s->display, s->window, "UltraGrid"); + XStoreName(s->display, s->window, "UltraGrid"); - /* Create the image buffer, shared with the X server... */ - for (i = 0; i < 2; i++) { - s->vw_image[i] = XvShmCreateImage(s->display, s->xv_port, 0x59565955, 0, HD_WIDTH, HD_HEIGHT, &s->vw_shm_segment[i]); - if (s->vw_image[i] == NULL) { - printf("Cannot create XV shared memory image\n"); - abort(); - } - debug_msg("vw_image = %p\n", s->vw_image[i]); - debug_msg("vw_image->width = %d\n", s->vw_image[i]->width); - debug_msg("vw_image->height = %d\n", s->vw_image[i]->height); - debug_msg("vw_image->data_size = %d\n", s->vw_image[i]->data_size); - if (s->vw_image[i]->width != (int)HD_WIDTH) { - printf("Display does not support %d pixel wide Xvideo shared memory images\n", HD_WIDTH); - abort(); - } - if (s->vw_image[i]->height != (int)HD_HEIGHT) { - printf("Display does not support %d pixel tall Xvideo shared memory images\n", HD_WIDTH); - abort(); - } + /* Create the image buffer, shared with the X server... */ + for (i = 0; i < 2; i++) { + s->vw_image[i] = + XvShmCreateImage(s->display, s->xv_port, 0x59565955, 0, + HD_WIDTH, HD_HEIGHT, + &s->vw_shm_segment[i]); + if (s->vw_image[i] == NULL) { + printf("Cannot create XV shared memory image\n"); + abort(); + } + debug_msg("vw_image = %p\n", s->vw_image[i]); + debug_msg("vw_image->width = %d\n", + s->vw_image[i]->width); + debug_msg("vw_image->height = %d\n", + s->vw_image[i]->height); + debug_msg("vw_image->data_size = %d\n", + s->vw_image[i]->data_size); + if (s->vw_image[i]->width != (int)HD_WIDTH) { + printf + ("Display does not support %d pixel wide Xvideo shared memory images\n", + HD_WIDTH); + abort(); + } + if (s->vw_image[i]->height != (int)HD_HEIGHT) { + printf + ("Display does not support %d pixel tall Xvideo shared memory images\n", + HD_WIDTH); + abort(); + } - s->vw_shm_segment[i].shmid = shmget(IPC_PRIVATE, s->vw_image[i]->data_size, IPC_CREAT|0777); - s->vw_shm_segment[i].shmaddr = shmat(s->vw_shm_segment[i].shmid, 0, 0); - s->vw_shm_segment[i].readOnly = False; - debug_msg("vw_shm_segment.shmid = %d\n", s->vw_shm_segment[i].shmid); - debug_msg("vw_shm_segment.shmaddr = %d\n", s->vw_shm_segment[i].shmaddr); + s->vw_shm_segment[i].shmid = + shmget(IPC_PRIVATE, s->vw_image[i]->data_size, + IPC_CREAT | 0777); + s->vw_shm_segment[i].shmaddr = + shmat(s->vw_shm_segment[i].shmid, 0, 0); + s->vw_shm_segment[i].readOnly = False; + debug_msg("vw_shm_segment.shmid = %d\n", + s->vw_shm_segment[i].shmid); + debug_msg("vw_shm_segment.shmaddr = %d\n", + s->vw_shm_segment[i].shmaddr); - s->vw_image[i]->data = s->vw_shm_segment[i].shmaddr; + s->vw_image[i]->data = s->vw_shm_segment[i].shmaddr; - if (XShmAttach(s->display, &s->vw_shm_segment[i]) == 0) { - printf("Cannot attach shared memory segment\n"); - abort(); - } - } - s->image_network = 0; - s->image_display = 1; + if (XShmAttach(s->display, &s->vw_shm_segment[i]) == 0) { + printf("Cannot attach shared memory segment\n"); + abort(); + } + } + s->image_network = 0; + s->image_display = 1; - /* Get our window onto the screen... */ - XFlush(s->display); + /* Get our window onto the screen... */ + XFlush(s->display); - pthread_mutex_init(&s->lock, NULL); - pthread_cond_init(&s->boss_cv, NULL); - pthread_cond_init(&s->worker_cv, NULL); - s->work_to_do = FALSE; - s->boss_waiting = FALSE; - s->worker_waiting = TRUE; - if (pthread_create(&(s->thread_id), NULL, display_thread_xv, (void *) s) != 0) { - perror("Unable to create display thread\n"); - return NULL; - } + pthread_mutex_init(&s->lock, NULL); + pthread_cond_init(&s->boss_cv, NULL); + pthread_cond_init(&s->worker_cv, NULL); + s->work_to_do = FALSE; + s->boss_waiting = FALSE; + s->worker_waiting = TRUE; + if (pthread_create(&(s->thread_id), NULL, display_thread_xv, (void *)s) + != 0) { + perror("Unable to create display thread\n"); + return NULL; + } - debug_msg("Window initialized %p\n", s); - return (void *) s; + debug_msg("Window initialized %p\n", s); + return (void *)s; } -void -display_xv_done(void *state) +void display_xv_done(void *state) { - int i; - struct state_xv *s = (struct state_xv *) state; + int i; + struct state_xv *s = (struct state_xv *)state; - assert(s->magic == MAGIC_XV); + assert(s->magic == MAGIC_XV); - for (i = 0; i < 2; i++) { - XShmDetach(s->display, &(s->vw_shm_segment[i])); - shmdt(s->vw_shm_segment[i].shmaddr); - shmctl(s->vw_shm_segment[i].shmid, IPC_RMID, 0); - //XDestroyImage(s->vw_image[i]); - } - XvFreeAdaptorInfo(s->ai); + for (i = 0; i < 2; i++) { + XShmDetach(s->display, &(s->vw_shm_segment[i])); + shmdt(s->vw_shm_segment[i].shmaddr); + shmctl(s->vw_shm_segment[i].shmid, IPC_RMID, 0); + //XDestroyImage(s->vw_image[i]); + } + XvFreeAdaptorInfo(s->ai); } -char * -display_xv_getf(void *state) +char *display_xv_getf(void *state) { - struct state_xv *s = (struct state_xv *) state; - assert(s->magic == MAGIC_XV); - return s->vw_image[s->image_network]->data; + struct state_xv *s = (struct state_xv *)state; + assert(s->magic == MAGIC_XV); + return s->vw_image[s->image_network]->data; } -int -display_xv_putf(void *state, char *frame) +int display_xv_putf(void *state, char *frame) { - int tmp; - struct state_xv *s = (struct state_xv *) state; + int tmp; + struct state_xv *s = (struct state_xv *)state; - assert(s->magic == MAGIC_XV); - assert(frame == s->vw_image[s->image_network]->data); + assert(s->magic == MAGIC_XV); + assert(frame == s->vw_image[s->image_network]->data); - pthread_mutex_lock(&s->lock); - /* Wait for the worker to finish... */ - while (s->work_to_do) { - s->boss_waiting = TRUE; - pthread_cond_wait(&s->boss_cv, &s->lock); - s->boss_waiting = FALSE; - } + pthread_mutex_lock(&s->lock); + /* Wait for the worker to finish... */ + while (s->work_to_do) { + s->boss_waiting = TRUE; + pthread_cond_wait(&s->boss_cv, &s->lock); + s->boss_waiting = FALSE; + } - /* ...and give it more to do... */ - tmp = s->image_display; - s->image_display = s->image_network; - s->image_network = tmp; - s->work_to_do = TRUE; + /* ...and give it more to do... */ + tmp = s->image_display; + s->image_display = s->image_network; + s->image_network = tmp; + s->work_to_do = TRUE; - /* ...and signal the worker */ - if (s->worker_waiting) { - pthread_cond_signal(&s->worker_cv); - } - pthread_mutex_unlock(&s->lock); - return 0; + /* ...and signal the worker */ + if (s->worker_waiting) { + pthread_cond_signal(&s->worker_cv); + } + pthread_mutex_unlock(&s->lock); + return 0; } -display_colour_t -display_xv_colour(void *state) +display_colour_t display_xv_colour(void *state) { - struct state_xv *s = (struct state_xv *) state; - assert(s->magic == MAGIC_XV); - return DC_YUV; + struct state_xv *s = (struct state_xv *)state; + assert(s->magic == MAGIC_XV); + return DC_YUV; } -display_type_t * -display_xv_probe(void) +display_type_t *display_xv_probe(void) { - display_type_t *dt; - display_format_t *dformat; + display_type_t *dt; + display_format_t *dformat; - dformat = malloc(4 * sizeof(display_format_t)); - dformat[0].size = DS_176x144; + dformat = malloc(4 * sizeof(display_format_t)); + dformat[0].size = DS_176x144; dformat[0].colour_mode = DC_YUV; - dformat[0].num_images = 1; - dformat[1].size = DS_352x288; + dformat[0].num_images = 1; + dformat[1].size = DS_352x288; dformat[1].colour_mode = DC_YUV; - dformat[1].num_images = 1; - dformat[2].size = DS_702x576; + dformat[1].num_images = 1; + dformat[2].size = DS_702x576; dformat[2].colour_mode = DC_YUV; - dformat[2].num_images = 1; - dformat[3].size = DS_1280x720; + dformat[2].num_images = 1; + dformat[3].size = DS_1280x720; dformat[3].colour_mode = DC_YUV; - dformat[3].num_images = 1; + dformat[3].num_images = 1; dt = malloc(sizeof(display_type_t)); if (dt != NULL) { - dt->id = DISPLAY_XV_ID; - dt->name = "xv"; - dt->description = "X Window System with Xvideo extension"; - dt->formats = dformat; + dt->id = DISPLAY_XV_ID; + dt->name = "xv"; + dt->description = "X Window System with Xvideo extension"; + dt->formats = dformat; dt->num_formats = 4; } return dt; } -#endif /* X_DISPLAY_MISSING */ - +#endif /* X_DISPLAY_MISSING */ diff --git a/ultragrid/test/run_tests.c b/ultragrid/test/run_tests.c index 0de71961f..be07100ec 100644 --- a/ultragrid/test/run_tests.c +++ b/ultragrid/test/run_tests.c @@ -61,45 +61,61 @@ #include "test_video_capture.h" #include "test_video_display.h" -uint32_t RTT; /* FIXME: will be removed once the global in main.c is removed */ +uint32_t RTT; /* FIXME: will be removed once the global in main.c is removed */ /* These globals should be fixed in the future as well */ -uint32_t hd_size_x=1920; -uint32_t hd_size_y=1080; -uint32_t hd_color_bpp=3; -uint32_t bitdepth = 10; -uint32_t progressive = 0; -uint32_t hd_video_mode; +uint32_t hd_size_x = 1920; +uint32_t hd_size_y = 1080; +uint32_t hd_color_bpp = 3; +uint32_t bitdepth = 10; +uint32_t progressive = 0; +uint32_t hd_video_mode; -long packet_rate = 13600; +long packet_rate = 13600; -int -main() +int main() { - if (test_bitstream() != 0) return 1; - if (test_codec_dvi() != 0) return 1; - if (test_codec_g711() != 0) return 1; - if (test_codec_g726() != 0) return 1; - if (test_codec_gsm() != 0) return 1; - if (test_codec_l16() != 0) return 1; - if (test_codec_l8() != 0) return 1; - if (test_codec_lpc() != 0) return 1; - if (test_codec_vdvi() != 0) return 1; - if (test_des() != 0) return 1; - if (test_aes() != 0) return 1; - if (test_md5() != 0) return 1; - if (test_random() != 0) return 1; - if (test_tv() != 0) return 1; - if (test_net_udp() != 0) return 1; - if (test_rtp() != 0) return 1; + if (test_bitstream() != 0) + return 1; + if (test_codec_dvi() != 0) + return 1; + if (test_codec_g711() != 0) + return 1; + if (test_codec_g726() != 0) + return 1; + if (test_codec_gsm() != 0) + return 1; + if (test_codec_l16() != 0) + return 1; + if (test_codec_l8() != 0) + return 1; + if (test_codec_lpc() != 0) + return 1; + if (test_codec_vdvi() != 0) + return 1; + if (test_des() != 0) + return 1; + if (test_aes() != 0) + return 1; + if (test_md5() != 0) + return 1; + if (test_random() != 0) + return 1; + if (test_tv() != 0) + return 1; + if (test_net_udp() != 0) + return 1; + if (test_rtp() != 0) + return 1; #ifdef TEST_AV_HW - if (test_audio_hw() != 0) return 1; - if (test_video_capture() != 0) return 1; - if (test_video_display() != 0) return 1; + if (test_audio_hw() != 0) + return 1; + if (test_video_capture() != 0) + return 1; + if (test_video_display() != 0) + return 1; #endif - return 0; + return 0; } - - diff --git a/ultragrid/test/test_aes.c b/ultragrid/test/test_aes.c index 6e9b7a823..2ab1bdf31 100644 --- a/ultragrid/test/test_aes.c +++ b/ultragrid/test/test_aes.c @@ -45,754 +45,723 @@ #include "crypto/crypt_aes.h" #include "test_aes.h" - #define SUBMITTER "Joan Daemen" -static void blockPrint(FILE *fp, const BYTE *block, const char *tag) { - int i; - fprintf (fp, "%s=", tag); - for (i = 0; i < 16; i++) { - fprintf (fp, "%02X", block[i]); - } - fprintf (fp, "\n"); - fflush (fp); -} /* blockPrint */ - -static void rijndaelVKKAT(FILE *fp, int keyLength) { - int i, j, r; - BYTE block[4*4]; - BYTE keyMaterial[320]; - BYTE byteVal = (BYTE)'8'; - keyInstance keyInst; - cipherInstance cipherInst; - -#ifdef TRACE_KAT_MCT - printf("Executing Variable-Key KAT (key %d): ", keyLength); - fflush(stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf(fp, - "\n" - "==========\n" - "\n" - "KEYSIZE=%d\n" - "\n", keyLength); - fflush(fp); - memset(block, 0, 16); - blockPrint(fp, block, "PT"); - memset(keyMaterial, 0, sizeof (keyMaterial)); - memset(keyMaterial, '0', keyLength/4); - for (i = 0; i < keyLength; i++) { - keyMaterial[i/4] = byteVal; /* set only the i-th bit of the i-th test key */ - r = makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); - if (TRUE != r) { - fprintf(stderr,"makeKey error %d\n",r); - exit(-1); - } - fprintf(fp, "\nI=%d\n", i+1); - fprintf(fp, "KEY=%s\n", keyMaterial); - memset(block, 0, 16); - r = cipherInit(&cipherInst, MODE_ECB, NULL); - if (TRUE != r) { - fprintf(stderr,"cipherInit error %d\n",r); - exit(-1); - } - r = blockEncrypt(&cipherInst, &keyInst, block, 128, block); - if (128 != r) { - fprintf(stderr,"blockEncrypt error %d\n",r); - exit(-1); - } - blockPrint(fp, block, "CT"); - /* now check decryption: */ - makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); - blockDecrypt(&cipherInst, &keyInst, block, 128, block); - for (j = 0; j < 16; j++) { - assert(block[j] == 0); - } - /* undo changes for the next iteration: */ - keyMaterial[i/4] = (BYTE)'0'; - byteVal = - (byteVal == '8') ? '4' : - (byteVal == '4') ? '2' : - (byteVal == '2') ? '1' : - /* (byteVal == '1') */ '8'; - } - assert(byteVal == (BYTE)'8'); - -#ifdef TRACE_KAT_MCT - printf(" done.\n"); -#endif /* ?TRACE_KAT_MCT */ -} /* rijndaelVKKAT */ - - -static void rijndaelVTKAT(FILE *fp, int keyLength) { - int i; - BYTE block[4*4]; - BYTE keyMaterial[320]; - keyInstance keyInst; - cipherInstance cipherInst; - -#ifdef TRACE_KAT_MCT - printf("Executing Variable-Text KAT (key %d): ", keyLength); - fflush(stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf(fp, - "\n" - "==========\n" - "\n" - "KEYSIZE=%d\n" - "\n", keyLength); - fflush(fp); - memset(keyMaterial, 0, sizeof (keyMaterial)); - memset(keyMaterial, '0', keyLength/4); - makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); - fprintf(fp, "KEY=%s\n", keyMaterial); - for (i = 0; i < 128; i++) { - memset(block, 0, 16); - block[i/8] |= 1 << (7 - i%8); /* set only the i-th bit of the i-th test block */ - fprintf (fp, "\nI=%d\n", i+1); - blockPrint(fp, block, "PT"); - cipherInit(&cipherInst, MODE_ECB, NULL); - blockEncrypt(&cipherInst, &keyInst, block, 128, block); - blockPrint(fp, block, "CT"); - } -#ifdef TRACE_KAT_MCT - printf(" done.\n"); -#endif /* ?TRACE_KAT_MCT */ -} - - -static void rijndaelTKAT(FILE *fp, int keyLength, FILE *in) { - int i, j; - unsigned int s; - BYTE block[4*4], block2[4*4]; - BYTE keyMaterial[320]; - keyInstance keyInst; - cipherInstance cipherInst; - -#ifdef TRACE_KAT_MCT - printf("Executing Tables KAT (key %d): ", keyLength); - fflush(stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf(fp, - "\n" - "==========\n" - "\n" - "KEYSIZE=%d\n" - "\n", keyLength); - fflush(fp); - - memset(keyMaterial, 0, sizeof (keyMaterial)); - - for (i = 0; i < 64; i++) { - fprintf(fp, "\nI=%d\n", i+1); - for(j = 0; j < keyLength/4; j++) { - fscanf(in, "%c", &keyMaterial[j]); - } - makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); - - fprintf(fp, "KEY=%s\n", keyMaterial); - - for (j = 0; j < 16; j++) { - fscanf(in, "%02x", &s); - block[j] = s; - } - fscanf(in, "%c", (char *)&s); - fscanf(in, "%c", (char *)&s); - blockPrint(fp, block, "PT"); - cipherInit(&cipherInst, MODE_ECB, NULL); - blockEncrypt(&cipherInst, &keyInst, block, 128, block2); - blockPrint(fp, block2, "CT"); - } - for (i = 64; i < 128; i++) { - fprintf(fp, "\nI=%d\n", i+1); - for(j = 0; j < keyLength/4; j++) { - fscanf(in, "%c", &keyMaterial[j]); - } - makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); - - fprintf(fp, "KEY=%s\n", keyMaterial); - - for (j = 0; j < 16; j++) { - fscanf(in, "%02x", &s); - block[j] = s; - } - fscanf(in, "%c", (char *)&s); - fscanf(in, "%c", (char *)&s); - cipherInit(&cipherInst, MODE_ECB, NULL); - blockDecrypt(&cipherInst, &keyInst, block, 128, block2); - blockPrint(fp, block2, "PT"); - blockPrint(fp, block, "CT"); - } - -#ifdef TRACE_KAT_MCT - printf(" done.\n"); -#endif /* ?TRACE_KAT_MCT */ -} - -static void rijndaelIVKAT (FILE *fp, int keyLength) { - int i; - BYTE pt[4*4], ct[4*4]; - BYTE keyMaterial[320]; - keyInstance keyInst; - cipherInstance cipherInst; - char format[10]; -#ifdef TRACE_KAT_MCT - printf ("Executing Intermediate value KAT (key %d): ", keyLength); - fflush (stdout); -#endif /* ?TRACE_KAT_MCT */ - - fprintf(fp, - "\n" - "==========\n" - "\n" - "KEYSIZE=%d\n", - keyLength); - fflush(fp); - memset(keyMaterial, 0, sizeof (keyMaterial)); - for (i = 0; i < keyLength/8; i++) { - sprintf(&keyMaterial[2*i], "%02X", i); - } - fprintf(fp, "KEY=%s\n", keyMaterial); - - for (i = 0; i < 16; i++) { - pt[i] = i; - } - - fprintf(fp, "\nIntermediate Ciphertext Values (Encryption)\n\n"); - makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); - blockPrint(fp, pt, "PT"); - cipherInit(&cipherInst, MODE_ECB, NULL); - for(i = 1; i < keyInst.Nr; i++) { - cipherUpdateRounds(&cipherInst, &keyInst, pt, 16, ct, i); - sprintf(format, "CT%d", i); - blockPrint(fp, ct, format); - } - cipherUpdateRounds(&cipherInst, &keyInst, pt, 16, ct, keyInst.Nr); - blockPrint(fp, ct, "CT"); - - fprintf(fp, "\nIntermediate Ciphertext Values (Decryption)\n\n"); - makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); - blockPrint(fp, ct, "CT"); - cipherInit(&cipherInst, MODE_ECB, NULL); - for(i = 1; i < keyInst.Nr; i++) { - cipherUpdateRounds(&cipherInst, &keyInst, ct, 16, pt, i); - sprintf(format, "PT%d", i); - blockPrint(fp, pt, format); - } - cipherUpdateRounds(&cipherInst, &keyInst, ct, 16, pt, keyInst.Nr); - blockPrint(fp, pt, "PT"); - -#ifdef TRACE_KAT_MCT - printf(" done.\n"); -#endif -} - -static void makeKATs(const char *vkFile, const char *vtFile, const char *tblFile, const char *ivFile) { - FILE *fp, *fp2; - - /* prepare Variable Key Known Answer Tests: */ - fp = fopen(vkFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Electronic Codebook (ECB) Mode\n" - "Variable Key Known Answer Tests\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - vkFile, SUBMITTER); - fflush(fp); - - rijndaelVKKAT(fp, 128); - rijndaelVKKAT(fp, 192); - rijndaelVKKAT(fp, 256); - - fprintf(fp, - "\n" - "=========="); - fclose(fp); - - /* prepare Variable Text Known Answer Tests: */ - fp = fopen(vtFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Electronic Codebook (ECB) Mode\n" - "Variable Text Known Answer Tests\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - vtFile, SUBMITTER); - fflush(fp); - - rijndaelVTKAT(fp, 128); - rijndaelVTKAT(fp, 192); - rijndaelVTKAT(fp, 256); - - fprintf(fp, - "\n" - "=========="); - fclose(fp); - - /* prepare Tables Known Answer Tests: */ - fp = fopen(tblFile, "w"); - fprintf(fp, - "/* Description of what tables are tested:\n" - " The provided implementations each use a different set of tables\n" - " - Java implementation: uses no tables\n" - " - reference C implementation: uses Logtable, Alogtable, S, Si, rcon\n" - " - fast C implementation: uses Logtable, Alogtable, rcon\n" - " and additionally, T1, T2, T3, T4, T5, T6, T7, T8\n" - " and (for the inverse key schedule only) U1, U2, U3, U4.\n" - " All these tables are tested.\n" - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Electronic Codebook (ECB) Mode\n" - "Tables Known Answer Tests\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - tblFile, SUBMITTER); - fflush(fp); - - if (NULL != (fp2 = fopen("test/test_aes.table.128", "r"))) { - rijndaelTKAT(fp, 128, fp2); - fclose(fp2); - } else { - printf("Table Known Answer test expects file test/test_aes.table.128\n"); - fclose(fp); - exit(EXIT_FAILURE); - } - if (NULL != (fp2 = fopen("test/test_aes.table.192", "r"))) { - rijndaelTKAT(fp, 192, fp2); - fclose(fp2); - } else { - printf("Table Known Answer test expects file test/test_aes.table.192\n"); - fclose(fp); - exit(EXIT_FAILURE); - } - if (NULL != (fp2 = fopen("test/test_aes.table.256", "r"))) { - rijndaelTKAT(fp, 256, fp2); - fclose(fp2); - } else { - printf("Table Known Answer test expects file test/test_aes.table.192\n"); - fclose(fp); - exit(EXIT_FAILURE); - } - - fprintf(fp, - "\n" - "=========="); - fclose(fp); - - /* prepare Intermediate Values Known Answer Tests: */ - fp = fopen(ivFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Electronic Codebook (ECB) Mode\n" - "Intermediate Value Known Answer Tests\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - ivFile, SUBMITTER); - fflush(fp); - - rijndaelIVKAT(fp, 128); - rijndaelIVKAT(fp, 192); - rijndaelIVKAT(fp, 256); - - fprintf(fp, - "\n" - "=========="); - fclose(fp); -} - -static void rijndaelECB_MCT(FILE *fp, int keyLength, BYTE direction) { - int i, j; - BYTE inBlock[4*4], outBlock[4*4], binKey[4*MAXKC]; - BYTE keyMaterial[320]; - keyInstance keyInst; - cipherInstance cipherInst; - - printf("."); fflush(stdout); -#ifdef TRACE_KAT_MCT - int width = 0; - clock_t elapsed = -clock(); - printf("Executing ECB MCT (%s, key %d): ", - direction == DIR_ENCRYPT ? "ENCRYPT" : "DECRYPT", keyLength); - fflush(stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf(fp, - "\n" - "=========================\n" - "\n" - "KEYSIZE=%d\n", keyLength); - fflush(fp); - memset(outBlock, 0, 16); - memset(binKey, 0, keyLength/8); - for (i = 0; i < 400; i++) { -#ifdef TRACE_KAT_MCT - while (width-- > 0) { - putchar('\b'); - } - width = printf("%d", i); - fflush(stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf(fp, "\nI=%d\n", i); - /* prepare key: */ - for (j = 0; j < keyLength/8; j++) { - sprintf(&keyMaterial[2*j], "%02X", binKey[j]); - } - keyMaterial[keyLength/4] = 0; - fprintf(fp, "KEY=%s\n", keyMaterial); - makeKey(&keyInst, direction, keyLength, keyMaterial); - /* do encryption/decryption: */ - blockPrint(fp, outBlock, direction == DIR_ENCRYPT ? "PT" : "CT"); - cipherInit(&cipherInst, MODE_ECB, NULL); - if (direction == DIR_ENCRYPT) { - for (j = 0; j < 10000; j++) { - memcpy(inBlock, outBlock, 16); - blockEncrypt(&cipherInst, &keyInst, inBlock, 128, outBlock); - } - } else { - for (j = 0; j < 10000; j++) { - memcpy(inBlock, outBlock, 16); - blockDecrypt(&cipherInst, &keyInst, inBlock, 128, outBlock); - } - } - blockPrint(fp, outBlock, direction == DIR_ENCRYPT ? "CT" : "PT"); - /* prepare new key: */ - switch (keyLength) { - case 128: - for (j = 0; j < 128/8; j++) { - binKey[j] ^= outBlock[j]; - } - break; - case 192: - for (j = 0; j < 64/8; j++) { - binKey[j] ^= inBlock[j + 64/8]; - } - for (j = 0; j < 128/8; j++) { - binKey[j + 64/8] ^= outBlock[j]; - } - break; - case 256: - for (j = 0; j < 128/8; j++) { - binKey[j] ^= inBlock[j]; - } - for (j = 0; j < 128/8; j++) { - binKey[j + 128/8] ^= outBlock[j]; - } - break; - } - } -#ifdef TRACE_KAT_MCT - elapsed += clock(); - while (width-- > 0) { - putchar('\b'); - } - printf("%d done (%.1f s).\n", i, (float)elapsed/CLOCKS_PER_SEC); -#endif /* ?TRACE_KAT_MCT */ -} /* rijndaelECB_MCT */ - - -static void rijndaelCBC_MCT(FILE *fp, int keyLength, BYTE direction) { - int i, j, r, t; - BYTE inBlock[256/8], outBlock[256/8], binKey[256/8], cv[256/8]; - BYTE keyMaterial[320]; - keyInstance keyInst; - cipherInstance cipherInst; - - printf("."); fflush(stdout); -#ifdef TRACE_KAT_MCT - int width = 0; - clock_t elapsed = -clock(); - printf("Executing CBC MCT (%s, key %d): ", - direction == DIR_ENCRYPT ? "ENCRYPT" : "DECRYPT", keyLength); - fflush (stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf (fp, - "\n" - "==========\n" - "\n" - "KEYSIZE=%d\n", keyLength); - fflush(fp); - memset(cv, 0, 16); - memset(inBlock, 0, 16); - memset(binKey, 0, keyLength/8); - for (i = 0; i < 400; i++) { -#ifdef TRACE_KAT_MCT - while (width-- > 0) { - putchar('\b'); - } - width = printf("%d", i); - fflush(stdout); -#endif /* ?TRACE_KAT_MCT */ - fprintf (fp, "\nI=%d\n", i); - /* prepare key: */ - for (j = 0; j < keyLength/8; j++) { - sprintf (&keyMaterial[2*j], "%02X", binKey[j]); - } - keyMaterial[keyLength/4] = 0; - fprintf(fp, "KEY=%s\n", keyMaterial); - r = makeKey(&keyInst, direction, keyLength, keyMaterial); - if (TRUE != r) { - fprintf(stderr,"makeKey error %d\n",r); - exit(-1); - } - r = cipherInit(&cipherInst, MODE_ECB, NULL); - if (TRUE != r) { - fprintf(stderr,"cipherInit error %d\n",r); - exit(-1); - } - /* do encryption/decryption: */ - blockPrint(fp, cv, "IV"); - blockPrint(fp, inBlock, direction == DIR_ENCRYPT ? "PT" : "CT"); - if (direction == DIR_ENCRYPT) { - for (j = 0; j < 10000; j++) { - for (t = 0; t < 16; t++) { - inBlock[t] ^= cv[t]; - } - r = blockEncrypt(&cipherInst, &keyInst, inBlock, 128, outBlock); - if (128 != r) { - fprintf(stderr,"blockEncrypt error %d\n",r); - exit(-1); - } - memcpy(inBlock, cv, 16); - memcpy(cv, outBlock, 16); - } - } else { - for (j = 0; j < 10000; j++) { - blockDecrypt(&cipherInst, &keyInst, inBlock, 128, outBlock); - for (t = 0; t < 16; t++) { - outBlock[t] ^= cv[t]; - } - memcpy(cv, inBlock, 16); - memcpy(inBlock, outBlock, 16); - } - } - blockPrint(fp, outBlock, direction == DIR_ENCRYPT ? "CT" : "PT"); - /* prepare new key: */ - switch (keyLength) { - case 128: - for (j = 0; j < 128/8; j++) { - binKey[j] ^= outBlock[j]; - } - break; - case 192: - for (j = 0; j < 64/8; j++) { - if (direction == DIR_ENCRYPT) { - binKey[j] ^= inBlock[j + 64/8]; - } else { - binKey[j] ^= cv[j + 64/8]; - } - } - for (j = 0; j < 128/8; j++) { - binKey[j + 64/8] ^= outBlock[j]; - } - break; - case 256: - for (j = 0; j < 128/8; j++) { - if (direction == DIR_ENCRYPT) { - binKey[j] ^= inBlock[j]; - } else { - binKey[j] ^= cv[j]; - } - } - for (j = 0; j < 128/8; j++) { - binKey[j + 128/8] ^= outBlock[j]; - } - break; - } - } -#ifdef TRACE_KAT_MCT - elapsed += clock(); - while (width-- > 0) { - putchar('\b'); - } - printf("%d done (%.1f s).\n", i, (float)elapsed/CLOCKS_PER_SEC); -#endif /* ?TRACE_KAT_MCT */ -} /* rijndaelCBC_MCT */ - - -static void makeMCTs(const char *ecbEncryptionFile, const char *ecbDecryptionFile, - const char *cbcEncryptionFile, const char *cbcDecryptionFile) { - FILE *fp; - - /* prepare ECB Encryption Monte Carlo Tests: */ - fp = fopen(ecbEncryptionFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Electronic Codebook (ECB) Mode - ENCRYPTION\n" - "Monte Carlo Test\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - ecbEncryptionFile, SUBMITTER); - fflush(fp); - - rijndaelECB_MCT(fp, 128, DIR_ENCRYPT); - rijndaelECB_MCT(fp, 192, DIR_ENCRYPT); - rijndaelECB_MCT(fp, 256, DIR_ENCRYPT); - - fprintf(fp, - "\n" - "==========="); - fclose(fp); - - /* prepare ECB Decryption Monte Carlo Tests: */ - fp = fopen(ecbDecryptionFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Electronic Codebook (ECB) Mode - DECRYPTION\n" - "Monte Carlo Test\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - ecbDecryptionFile, SUBMITTER); - fflush(fp); - - rijndaelECB_MCT(fp, 128, DIR_DECRYPT); - rijndaelECB_MCT(fp, 192, DIR_DECRYPT); - rijndaelECB_MCT(fp, 256, DIR_DECRYPT); - - fprintf(fp, - "\n" - "==========="); - fclose(fp); - - /* prepare CBC Encryption Monte Carlo Tests: */ - fp = fopen (cbcEncryptionFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Cipher Block Chaining (CBC) Mode - ENCRYPTION\n" - "Monte Carlo Test\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - cbcEncryptionFile, SUBMITTER); - fflush(fp); - - rijndaelCBC_MCT(fp, 128, DIR_ENCRYPT); - rijndaelCBC_MCT(fp, 192, DIR_ENCRYPT); - rijndaelCBC_MCT(fp, 256, DIR_ENCRYPT); - - fprintf(fp, - "\n" - "==========="); - fclose(fp); - - /* prepare CBC Decryption Monte Carlo Tests: */ - fp = fopen(cbcDecryptionFile, "w"); - fprintf(fp, - "\n" - "=========================\n" - "\n" - "FILENAME: \"%s\"\n" - "\n" - "Cipher Block Chaining (CBC) Mode - DECRYPTION\n" - "Monte Carlo Test\n" - "\n" - "Algorithm Name: Rijndael\n" - "Principal Submitter: %s\n", - cbcDecryptionFile, SUBMITTER); - fflush(fp); - - rijndaelCBC_MCT(fp, 128, DIR_DECRYPT); - rijndaelCBC_MCT(fp, 192, DIR_DECRYPT); - rijndaelCBC_MCT(fp, 256, DIR_DECRYPT); - - fprintf(fp, - "\n" - "==========="); - fclose(fp); -} /* makeMCTs */ - -static void -compare_files(char *nfile_n, char *ofile_n) +static void blockPrint(FILE * fp, const BYTE * block, const char *tag) { - int cn, co; - FILE *nfile = fopen(nfile_n, "r"); - FILE *ofile = fopen(ofile_n, "r"); + int i; + fprintf(fp, "%s=", tag); + for (i = 0; i < 16; i++) { + fprintf(fp, "%02X", block[i]); + } + fprintf(fp, "\n"); + fflush(fp); +} /* blockPrint */ - if ((nfile == NULL) || (ofile == NULL)) { - printf("FAIL\n"); - printf(" Unable to open test file for reading!\n"); - exit(1); - } - - while (1) { - cn = fgetc(nfile); - co = fgetc(ofile); - if (feof(nfile)) { - if (!feof(ofile)) { - printf("FAIL\n"); - printf(" Short result file!\n"); - exit(1); - } - break; - } - if (cn != co) { - printf("FAIL\n"); - printf(" Test results %s and %s differ!\n", nfile_n, ofile_n); - exit(1); - } - } - fclose(nfile); - fclose(ofile); - if (unlink(nfile_n) != 0) { - printf("Ok\n"); - printf(" Unable to remove %s: ", nfile_n); - perror(""); - exit(1); - } -} - -int -test_aes(void) +static void rijndaelVKKAT(FILE * fp, int keyLength) { - printf("Testing AES (Known answer tests) ......................................... "); - fflush(stdout); - makeKATs ("ecb_vk.txt", "ecb_vt.txt", "ecb_tbl.txt", "ecb_iv.txt"); - compare_files("ecb_vk.txt", "test/test_aes.results.ecb_vk.txt"); - compare_files("ecb_vt.txt", "test/test_aes.results.ecb_vt.txt"); - compare_files("ecb_tbl.txt", "test/test_aes.results.ecb_tbl.txt"); - compare_files("ecb_iv.txt", "test/test_aes.results.ecb_iv.txt"); - printf("Ok\n"); + int i, j, r; + BYTE block[4 * 4]; + BYTE keyMaterial[320]; + BYTE byteVal = (BYTE) '8'; + keyInstance keyInst; + cipherInstance cipherInst; - printf("Testing AES (Monte Carlo tests) .............................."); - fflush(stdout); - makeMCTs ("ecb_e_m.txt", "ecb_d_m.txt", "cbc_e_m.txt", "cbc_d_m.txt"); - compare_files("ecb_e_m.txt", "test/test_aes.results.ecb_e_m.txt"); - compare_files("ecb_d_m.txt", "test/test_aes.results.ecb_d_m.txt"); - compare_files("cbc_e_m.txt", "test/test_aes.results.cbc_e_m.txt"); - compare_files("cbc_d_m.txt", "test/test_aes.results.cbc_d_m.txt"); - printf(" Ok\n"); - return 0; +#ifdef TRACE_KAT_MCT + printf("Executing Variable-Key KAT (key %d): ", keyLength); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n" "\n", keyLength); + fflush(fp); + memset(block, 0, 16); + blockPrint(fp, block, "PT"); + memset(keyMaterial, 0, sizeof(keyMaterial)); + memset(keyMaterial, '0', keyLength / 4); + for (i = 0; i < keyLength; i++) { + keyMaterial[i / 4] = byteVal; /* set only the i-th bit of the i-th test key */ + r = makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); + if (TRUE != r) { + fprintf(stderr, "makeKey error %d\n", r); + exit(-1); + } + fprintf(fp, "\nI=%d\n", i + 1); + fprintf(fp, "KEY=%s\n", keyMaterial); + memset(block, 0, 16); + r = cipherInit(&cipherInst, MODE_ECB, NULL); + if (TRUE != r) { + fprintf(stderr, "cipherInit error %d\n", r); + exit(-1); + } + r = blockEncrypt(&cipherInst, &keyInst, block, 128, block); + if (128 != r) { + fprintf(stderr, "blockEncrypt error %d\n", r); + exit(-1); + } + blockPrint(fp, block, "CT"); + /* now check decryption: */ + makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); + blockDecrypt(&cipherInst, &keyInst, block, 128, block); + for (j = 0; j < 16; j++) { + assert(block[j] == 0); + } + /* undo changes for the next iteration: */ + keyMaterial[i / 4] = (BYTE) '0'; + byteVal = + (byteVal == '8') ? '4' : + (byteVal == '4') ? '2' : (byteVal == '2') ? '1' : + /* (byteVal == '1') */ '8'; + } + assert(byteVal == (BYTE) '8'); + +#ifdef TRACE_KAT_MCT + printf(" done.\n"); +#endif /* ?TRACE_KAT_MCT */ +} /* rijndaelVKKAT */ + +static void rijndaelVTKAT(FILE * fp, int keyLength) +{ + int i; + BYTE block[4 * 4]; + BYTE keyMaterial[320]; + keyInstance keyInst; + cipherInstance cipherInst; + +#ifdef TRACE_KAT_MCT + printf("Executing Variable-Text KAT (key %d): ", keyLength); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n" "\n", keyLength); + fflush(fp); + memset(keyMaterial, 0, sizeof(keyMaterial)); + memset(keyMaterial, '0', keyLength / 4); + makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); + fprintf(fp, "KEY=%s\n", keyMaterial); + for (i = 0; i < 128; i++) { + memset(block, 0, 16); + block[i / 8] |= 1 << (7 - i % 8); /* set only the i-th bit of the i-th test block */ + fprintf(fp, "\nI=%d\n", i + 1); + blockPrint(fp, block, "PT"); + cipherInit(&cipherInst, MODE_ECB, NULL); + blockEncrypt(&cipherInst, &keyInst, block, 128, block); + blockPrint(fp, block, "CT"); + } +#ifdef TRACE_KAT_MCT + printf(" done.\n"); +#endif /* ?TRACE_KAT_MCT */ } +static void rijndaelTKAT(FILE * fp, int keyLength, FILE * in) +{ + int i, j; + unsigned int s; + BYTE block[4 * 4], block2[4 * 4]; + BYTE keyMaterial[320]; + keyInstance keyInst; + cipherInstance cipherInst; + +#ifdef TRACE_KAT_MCT + printf("Executing Tables KAT (key %d): ", keyLength); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n" "\n", keyLength); + fflush(fp); + + memset(keyMaterial, 0, sizeof(keyMaterial)); + + for (i = 0; i < 64; i++) { + fprintf(fp, "\nI=%d\n", i + 1); + for (j = 0; j < keyLength / 4; j++) { + fscanf(in, "%c", &keyMaterial[j]); + } + makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); + + fprintf(fp, "KEY=%s\n", keyMaterial); + + for (j = 0; j < 16; j++) { + fscanf(in, "%02x", &s); + block[j] = s; + } + fscanf(in, "%c", (char *)&s); + fscanf(in, "%c", (char *)&s); + blockPrint(fp, block, "PT"); + cipherInit(&cipherInst, MODE_ECB, NULL); + blockEncrypt(&cipherInst, &keyInst, block, 128, block2); + blockPrint(fp, block2, "CT"); + } + for (i = 64; i < 128; i++) { + fprintf(fp, "\nI=%d\n", i + 1); + for (j = 0; j < keyLength / 4; j++) { + fscanf(in, "%c", &keyMaterial[j]); + } + makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); + + fprintf(fp, "KEY=%s\n", keyMaterial); + + for (j = 0; j < 16; j++) { + fscanf(in, "%02x", &s); + block[j] = s; + } + fscanf(in, "%c", (char *)&s); + fscanf(in, "%c", (char *)&s); + cipherInit(&cipherInst, MODE_ECB, NULL); + blockDecrypt(&cipherInst, &keyInst, block, 128, block2); + blockPrint(fp, block2, "PT"); + blockPrint(fp, block, "CT"); + } + +#ifdef TRACE_KAT_MCT + printf(" done.\n"); +#endif /* ?TRACE_KAT_MCT */ +} + +static void rijndaelIVKAT(FILE * fp, int keyLength) +{ + int i; + BYTE pt[4 * 4], ct[4 * 4]; + BYTE keyMaterial[320]; + keyInstance keyInst; + cipherInstance cipherInst; + char format[10]; +#ifdef TRACE_KAT_MCT + printf("Executing Intermediate value KAT (key %d): ", keyLength); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + + fprintf(fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n", keyLength); + fflush(fp); + memset(keyMaterial, 0, sizeof(keyMaterial)); + for (i = 0; i < keyLength / 8; i++) { + sprintf(&keyMaterial[2 * i], "%02X", i); + } + fprintf(fp, "KEY=%s\n", keyMaterial); + + for (i = 0; i < 16; i++) { + pt[i] = i; + } + + fprintf(fp, "\nIntermediate Ciphertext Values (Encryption)\n\n"); + makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); + blockPrint(fp, pt, "PT"); + cipherInit(&cipherInst, MODE_ECB, NULL); + for (i = 1; i < keyInst.Nr; i++) { + cipherUpdateRounds(&cipherInst, &keyInst, pt, 16, ct, i); + sprintf(format, "CT%d", i); + blockPrint(fp, ct, format); + } + cipherUpdateRounds(&cipherInst, &keyInst, pt, 16, ct, keyInst.Nr); + blockPrint(fp, ct, "CT"); + + fprintf(fp, "\nIntermediate Ciphertext Values (Decryption)\n\n"); + makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); + blockPrint(fp, ct, "CT"); + cipherInit(&cipherInst, MODE_ECB, NULL); + for (i = 1; i < keyInst.Nr; i++) { + cipherUpdateRounds(&cipherInst, &keyInst, ct, 16, pt, i); + sprintf(format, "PT%d", i); + blockPrint(fp, pt, format); + } + cipherUpdateRounds(&cipherInst, &keyInst, ct, 16, pt, keyInst.Nr); + blockPrint(fp, pt, "PT"); + +#ifdef TRACE_KAT_MCT + printf(" done.\n"); +#endif +} + +static void makeKATs(const char *vkFile, const char *vtFile, + const char *tblFile, const char *ivFile) +{ + FILE *fp, *fp2; + + /* prepare Variable Key Known Answer Tests: */ + fp = fopen(vkFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Electronic Codebook (ECB) Mode\n" + "Variable Key Known Answer Tests\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", vkFile, SUBMITTER); + fflush(fp); + + rijndaelVKKAT(fp, 128); + rijndaelVKKAT(fp, 192); + rijndaelVKKAT(fp, 256); + + fprintf(fp, "\n" "=========="); + fclose(fp); + + /* prepare Variable Text Known Answer Tests: */ + fp = fopen(vtFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Electronic Codebook (ECB) Mode\n" + "Variable Text Known Answer Tests\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", vtFile, SUBMITTER); + fflush(fp); + + rijndaelVTKAT(fp, 128); + rijndaelVTKAT(fp, 192); + rijndaelVTKAT(fp, 256); + + fprintf(fp, "\n" "=========="); + fclose(fp); + + /* prepare Tables Known Answer Tests: */ + fp = fopen(tblFile, "w"); + fprintf(fp, + "/* Description of what tables are tested:\n" + " The provided implementations each use a different set of tables\n" + " - Java implementation: uses no tables\n" + " - reference C implementation: uses Logtable, Alogtable, S, Si, rcon\n" + " - fast C implementation: uses Logtable, Alogtable, rcon\n" + " and additionally, T1, T2, T3, T4, T5, T6, T7, T8\n" + " and (for the inverse key schedule only) U1, U2, U3, U4.\n" + " All these tables are tested.\n" + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Electronic Codebook (ECB) Mode\n" + "Tables Known Answer Tests\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", tblFile, SUBMITTER); + fflush(fp); + + if (NULL != (fp2 = fopen("test/test_aes.table.128", "r"))) { + rijndaelTKAT(fp, 128, fp2); + fclose(fp2); + } else { + printf + ("Table Known Answer test expects file test/test_aes.table.128\n"); + fclose(fp); + exit(EXIT_FAILURE); + } + if (NULL != (fp2 = fopen("test/test_aes.table.192", "r"))) { + rijndaelTKAT(fp, 192, fp2); + fclose(fp2); + } else { + printf + ("Table Known Answer test expects file test/test_aes.table.192\n"); + fclose(fp); + exit(EXIT_FAILURE); + } + if (NULL != (fp2 = fopen("test/test_aes.table.256", "r"))) { + rijndaelTKAT(fp, 256, fp2); + fclose(fp2); + } else { + printf + ("Table Known Answer test expects file test/test_aes.table.192\n"); + fclose(fp); + exit(EXIT_FAILURE); + } + + fprintf(fp, "\n" "=========="); + fclose(fp); + + /* prepare Intermediate Values Known Answer Tests: */ + fp = fopen(ivFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Electronic Codebook (ECB) Mode\n" + "Intermediate Value Known Answer Tests\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", ivFile, SUBMITTER); + fflush(fp); + + rijndaelIVKAT(fp, 128); + rijndaelIVKAT(fp, 192); + rijndaelIVKAT(fp, 256); + + fprintf(fp, "\n" "=========="); + fclose(fp); +} + +static void rijndaelECB_MCT(FILE * fp, int keyLength, BYTE direction) +{ + int i, j; + BYTE inBlock[4 * 4], outBlock[4 * 4], binKey[4 * MAXKC]; + BYTE keyMaterial[320]; + keyInstance keyInst; + cipherInstance cipherInst; + + printf("."); + fflush(stdout); +#ifdef TRACE_KAT_MCT + int width = 0; + clock_t elapsed = -clock(); + printf("Executing ECB MCT (%s, key %d): ", + direction == DIR_ENCRYPT ? "ENCRYPT" : "DECRYPT", keyLength); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, + "\n" + "=========================\n" "\n" "KEYSIZE=%d\n", keyLength); + fflush(fp); + memset(outBlock, 0, 16); + memset(binKey, 0, keyLength / 8); + for (i = 0; i < 400; i++) { +#ifdef TRACE_KAT_MCT + while (width-- > 0) { + putchar('\b'); + } + width = printf("%d", i); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, "\nI=%d\n", i); + /* prepare key: */ + for (j = 0; j < keyLength / 8; j++) { + sprintf(&keyMaterial[2 * j], "%02X", binKey[j]); + } + keyMaterial[keyLength / 4] = 0; + fprintf(fp, "KEY=%s\n", keyMaterial); + makeKey(&keyInst, direction, keyLength, keyMaterial); + /* do encryption/decryption: */ + blockPrint(fp, outBlock, + direction == DIR_ENCRYPT ? "PT" : "CT"); + cipherInit(&cipherInst, MODE_ECB, NULL); + if (direction == DIR_ENCRYPT) { + for (j = 0; j < 10000; j++) { + memcpy(inBlock, outBlock, 16); + blockEncrypt(&cipherInst, &keyInst, inBlock, + 128, outBlock); + } + } else { + for (j = 0; j < 10000; j++) { + memcpy(inBlock, outBlock, 16); + blockDecrypt(&cipherInst, &keyInst, inBlock, + 128, outBlock); + } + } + blockPrint(fp, outBlock, + direction == DIR_ENCRYPT ? "CT" : "PT"); + /* prepare new key: */ + switch (keyLength) { + case 128: + for (j = 0; j < 128 / 8; j++) { + binKey[j] ^= outBlock[j]; + } + break; + case 192: + for (j = 0; j < 64 / 8; j++) { + binKey[j] ^= inBlock[j + 64 / 8]; + } + for (j = 0; j < 128 / 8; j++) { + binKey[j + 64 / 8] ^= outBlock[j]; + } + break; + case 256: + for (j = 0; j < 128 / 8; j++) { + binKey[j] ^= inBlock[j]; + } + for (j = 0; j < 128 / 8; j++) { + binKey[j + 128 / 8] ^= outBlock[j]; + } + break; + } + } +#ifdef TRACE_KAT_MCT + elapsed += clock(); + while (width-- > 0) { + putchar('\b'); + } + printf("%d done (%.1f s).\n", i, (float)elapsed / CLOCKS_PER_SEC); +#endif /* ?TRACE_KAT_MCT */ +} /* rijndaelECB_MCT */ + +static void rijndaelCBC_MCT(FILE * fp, int keyLength, BYTE direction) +{ + int i, j, r, t; + BYTE inBlock[256 / 8], outBlock[256 / 8], binKey[256 / 8], cv[256 / 8]; + BYTE keyMaterial[320]; + keyInstance keyInst; + cipherInstance cipherInst; + + printf("."); + fflush(stdout); +#ifdef TRACE_KAT_MCT + int width = 0; + clock_t elapsed = -clock(); + printf("Executing CBC MCT (%s, key %d): ", + direction == DIR_ENCRYPT ? "ENCRYPT" : "DECRYPT", keyLength); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n", keyLength); + fflush(fp); + memset(cv, 0, 16); + memset(inBlock, 0, 16); + memset(binKey, 0, keyLength / 8); + for (i = 0; i < 400; i++) { +#ifdef TRACE_KAT_MCT + while (width-- > 0) { + putchar('\b'); + } + width = printf("%d", i); + fflush(stdout); +#endif /* ?TRACE_KAT_MCT */ + fprintf(fp, "\nI=%d\n", i); + /* prepare key: */ + for (j = 0; j < keyLength / 8; j++) { + sprintf(&keyMaterial[2 * j], "%02X", binKey[j]); + } + keyMaterial[keyLength / 4] = 0; + fprintf(fp, "KEY=%s\n", keyMaterial); + r = makeKey(&keyInst, direction, keyLength, keyMaterial); + if (TRUE != r) { + fprintf(stderr, "makeKey error %d\n", r); + exit(-1); + } + r = cipherInit(&cipherInst, MODE_ECB, NULL); + if (TRUE != r) { + fprintf(stderr, "cipherInit error %d\n", r); + exit(-1); + } + /* do encryption/decryption: */ + blockPrint(fp, cv, "IV"); + blockPrint(fp, inBlock, direction == DIR_ENCRYPT ? "PT" : "CT"); + if (direction == DIR_ENCRYPT) { + for (j = 0; j < 10000; j++) { + for (t = 0; t < 16; t++) { + inBlock[t] ^= cv[t]; + } + r = blockEncrypt(&cipherInst, &keyInst, inBlock, + 128, outBlock); + if (128 != r) { + fprintf(stderr, + "blockEncrypt error %d\n", r); + exit(-1); + } + memcpy(inBlock, cv, 16); + memcpy(cv, outBlock, 16); + } + } else { + for (j = 0; j < 10000; j++) { + blockDecrypt(&cipherInst, &keyInst, inBlock, + 128, outBlock); + for (t = 0; t < 16; t++) { + outBlock[t] ^= cv[t]; + } + memcpy(cv, inBlock, 16); + memcpy(inBlock, outBlock, 16); + } + } + blockPrint(fp, outBlock, + direction == DIR_ENCRYPT ? "CT" : "PT"); + /* prepare new key: */ + switch (keyLength) { + case 128: + for (j = 0; j < 128 / 8; j++) { + binKey[j] ^= outBlock[j]; + } + break; + case 192: + for (j = 0; j < 64 / 8; j++) { + if (direction == DIR_ENCRYPT) { + binKey[j] ^= inBlock[j + 64 / 8]; + } else { + binKey[j] ^= cv[j + 64 / 8]; + } + } + for (j = 0; j < 128 / 8; j++) { + binKey[j + 64 / 8] ^= outBlock[j]; + } + break; + case 256: + for (j = 0; j < 128 / 8; j++) { + if (direction == DIR_ENCRYPT) { + binKey[j] ^= inBlock[j]; + } else { + binKey[j] ^= cv[j]; + } + } + for (j = 0; j < 128 / 8; j++) { + binKey[j + 128 / 8] ^= outBlock[j]; + } + break; + } + } +#ifdef TRACE_KAT_MCT + elapsed += clock(); + while (width-- > 0) { + putchar('\b'); + } + printf("%d done (%.1f s).\n", i, (float)elapsed / CLOCKS_PER_SEC); +#endif /* ?TRACE_KAT_MCT */ +} /* rijndaelCBC_MCT */ + +static void makeMCTs(const char *ecbEncryptionFile, + const char *ecbDecryptionFile, + const char *cbcEncryptionFile, + const char *cbcDecryptionFile) +{ + FILE *fp; + + /* prepare ECB Encryption Monte Carlo Tests: */ + fp = fopen(ecbEncryptionFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Electronic Codebook (ECB) Mode - ENCRYPTION\n" + "Monte Carlo Test\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", ecbEncryptionFile, SUBMITTER); + fflush(fp); + + rijndaelECB_MCT(fp, 128, DIR_ENCRYPT); + rijndaelECB_MCT(fp, 192, DIR_ENCRYPT); + rijndaelECB_MCT(fp, 256, DIR_ENCRYPT); + + fprintf(fp, "\n" "==========="); + fclose(fp); + + /* prepare ECB Decryption Monte Carlo Tests: */ + fp = fopen(ecbDecryptionFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Electronic Codebook (ECB) Mode - DECRYPTION\n" + "Monte Carlo Test\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", ecbDecryptionFile, SUBMITTER); + fflush(fp); + + rijndaelECB_MCT(fp, 128, DIR_DECRYPT); + rijndaelECB_MCT(fp, 192, DIR_DECRYPT); + rijndaelECB_MCT(fp, 256, DIR_DECRYPT); + + fprintf(fp, "\n" "==========="); + fclose(fp); + + /* prepare CBC Encryption Monte Carlo Tests: */ + fp = fopen(cbcEncryptionFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Cipher Block Chaining (CBC) Mode - ENCRYPTION\n" + "Monte Carlo Test\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", cbcEncryptionFile, SUBMITTER); + fflush(fp); + + rijndaelCBC_MCT(fp, 128, DIR_ENCRYPT); + rijndaelCBC_MCT(fp, 192, DIR_ENCRYPT); + rijndaelCBC_MCT(fp, 256, DIR_ENCRYPT); + + fprintf(fp, "\n" "==========="); + fclose(fp); + + /* prepare CBC Decryption Monte Carlo Tests: */ + fp = fopen(cbcDecryptionFile, "w"); + fprintf(fp, + "\n" + "=========================\n" + "\n" + "FILENAME: \"%s\"\n" + "\n" + "Cipher Block Chaining (CBC) Mode - DECRYPTION\n" + "Monte Carlo Test\n" + "\n" + "Algorithm Name: Rijndael\n" + "Principal Submitter: %s\n", cbcDecryptionFile, SUBMITTER); + fflush(fp); + + rijndaelCBC_MCT(fp, 128, DIR_DECRYPT); + rijndaelCBC_MCT(fp, 192, DIR_DECRYPT); + rijndaelCBC_MCT(fp, 256, DIR_DECRYPT); + + fprintf(fp, "\n" "==========="); + fclose(fp); +} /* makeMCTs */ + +static void compare_files(char *nfile_n, char *ofile_n) +{ + int cn, co; + FILE *nfile = fopen(nfile_n, "r"); + FILE *ofile = fopen(ofile_n, "r"); + + if ((nfile == NULL) || (ofile == NULL)) { + printf("FAIL\n"); + printf(" Unable to open test file for reading!\n"); + exit(1); + } + + while (1) { + cn = fgetc(nfile); + co = fgetc(ofile); + if (feof(nfile)) { + if (!feof(ofile)) { + printf("FAIL\n"); + printf(" Short result file!\n"); + exit(1); + } + break; + } + if (cn != co) { + printf("FAIL\n"); + printf(" Test results %s and %s differ!\n", nfile_n, + ofile_n); + exit(1); + } + } + fclose(nfile); + fclose(ofile); + if (unlink(nfile_n) != 0) { + printf("Ok\n"); + printf(" Unable to remove %s: ", nfile_n); + perror(""); + exit(1); + } +} + +int test_aes(void) +{ + printf + ("Testing AES (Known answer tests) ......................................... "); + fflush(stdout); + makeKATs("ecb_vk.txt", "ecb_vt.txt", "ecb_tbl.txt", "ecb_iv.txt"); + compare_files("ecb_vk.txt", "test/test_aes.results.ecb_vk.txt"); + compare_files("ecb_vt.txt", "test/test_aes.results.ecb_vt.txt"); + compare_files("ecb_tbl.txt", "test/test_aes.results.ecb_tbl.txt"); + compare_files("ecb_iv.txt", "test/test_aes.results.ecb_iv.txt"); + printf("Ok\n"); + + printf + ("Testing AES (Monte Carlo tests) .............................."); + fflush(stdout); + makeMCTs("ecb_e_m.txt", "ecb_d_m.txt", "cbc_e_m.txt", "cbc_d_m.txt"); + compare_files("ecb_e_m.txt", "test/test_aes.results.ecb_e_m.txt"); + compare_files("ecb_d_m.txt", "test/test_aes.results.ecb_d_m.txt"); + compare_files("cbc_e_m.txt", "test/test_aes.results.cbc_e_m.txt"); + compare_files("cbc_d_m.txt", "test/test_aes.results.cbc_d_m.txt"); + printf(" Ok\n"); + return 0; +} diff --git a/ultragrid/test/test_bitstream.c b/ultragrid/test/test_bitstream.c index 127335608..9dee777d3 100644 --- a/ultragrid/test/test_bitstream.c +++ b/ultragrid/test/test_bitstream.c @@ -43,54 +43,54 @@ #define BUFSIZE 10 -int -test_bitstream(void) +int test_bitstream(void) { - bitstream_t *bs; - u_char *buffer; - int buflen; + bitstream_t *bs; + u_char *buffer; + int buflen; - printf("Testing bitstreams ....................................................... "); fflush(stdout); + printf + ("Testing bitstreams ....................................................... "); + fflush(stdout); - buffer = malloc(BUFSIZE); - if (buffer == NULL) { - printf("FAIL\n"); - return 1; - } - buflen = BUFSIZE; + buffer = malloc(BUFSIZE); + if (buffer == NULL) { + printf("FAIL\n"); + return 1; + } + buflen = BUFSIZE; - bs_create(&bs); - bs_attach(bs, buffer, buflen); - bs_put(bs, 0x0f, 4); - bs_put(bs, 0x01, 1); - bs_put(bs, 0x02, 3); - bs_put(bs, 0xa8, 8); - bs_put(bs, 0xff, 1); - if (buffer[0] != 0xfa) { - printf("FAIL\n"); - printf(" buffer[0] = 0x%02x\n", buffer[0]); - return 1; - } - if (buffer[1] != 0xa8) { - printf("FAIL\n"); - printf(" buffer[1] = 0x%02x\n", buffer[1]); - return 1; - } - if (buffer[2] != 0x80) { - printf("FAIL\n"); - printf(" buffer[2] = 0x%02x\n", buffer[2]); - return 1; - } - bs_put(bs, 0x01, 7); - if (buffer[2] != 0x81) { - printf("FAIL\n"); - printf(" buffer[2] = 0x%02x\n", buffer[2]); - return 1; - } + bs_create(&bs); + bs_attach(bs, buffer, buflen); + bs_put(bs, 0x0f, 4); + bs_put(bs, 0x01, 1); + bs_put(bs, 0x02, 3); + bs_put(bs, 0xa8, 8); + bs_put(bs, 0xff, 1); + if (buffer[0] != 0xfa) { + printf("FAIL\n"); + printf(" buffer[0] = 0x%02x\n", buffer[0]); + return 1; + } + if (buffer[1] != 0xa8) { + printf("FAIL\n"); + printf(" buffer[1] = 0x%02x\n", buffer[1]); + return 1; + } + if (buffer[2] != 0x80) { + printf("FAIL\n"); + printf(" buffer[2] = 0x%02x\n", buffer[2]); + return 1; + } + bs_put(bs, 0x01, 7); + if (buffer[2] != 0x81) { + printf("FAIL\n"); + printf(" buffer[2] = 0x%02x\n", buffer[2]); + return 1; + } - bs_destroy(&bs); + bs_destroy(&bs); - printf("Ok\n"); - return 0; + printf("Ok\n"); + return 0; } - diff --git a/ultragrid/test/test_des.c b/ultragrid/test/test_des.c index 1f823eda6..e61d70503 100644 --- a/ultragrid/test/test_des.c +++ b/ultragrid/test/test_des.c @@ -47,180 +47,188 @@ #define NUM_TESTS 36 -static unsigned char key_data[NUM_TESTS][8]={ - {0x12,0x34,0x57,0x79,0x9b,0xbc,0xdf,0xf1}, - {0x0e,0x32,0x92,0x32,0xea,0x6d,0x0d,0x72}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, - {0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10}, - {0x7C,0xA1,0x10,0x45,0x4A,0x1A,0x6E,0x57}, - {0x01,0x31,0xD9,0x61,0x9D,0xC1,0x37,0x6E}, - {0x07,0xA1,0x13,0x3E,0x4A,0x0B,0x26,0x86}, - {0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E}, - {0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6}, - {0x01,0x13,0xB9,0x70,0xFD,0x34,0xF2,0xCE}, - {0x01,0x70,0xF1,0x75,0x46,0x8F,0xB5,0xE6}, - {0x43,0x29,0x7F,0xAD,0x38,0xE3,0x73,0xFE}, - {0x07,0xA7,0x13,0x70,0x45,0xDA,0x2A,0x16}, - {0x04,0x68,0x91,0x04,0xC2,0xFD,0x3B,0x2F}, - {0x37,0xD0,0x6B,0xB5,0x16,0xCB,0x75,0x46}, - {0x1F,0x08,0x26,0x0D,0x1A,0xC2,0x46,0x5E}, - {0x58,0x40,0x23,0x64,0x1A,0xBA,0x61,0x76}, - {0x02,0x58,0x16,0x16,0x46,0x29,0xB0,0x07}, - {0x49,0x79,0x3E,0xBC,0x79,0xB3,0x25,0x8F}, - {0x4F,0xB0,0x5E,0x15,0x15,0xAB,0x73,0xA7}, - {0x49,0xE9,0x5D,0x6D,0x4C,0xA2,0x29,0xBF}, - {0x01,0x83,0x10,0xDC,0x40,0x9B,0x26,0xD6}, - {0x1C,0x58,0x7F,0x1C,0x13,0x92,0x4F,0xEF}, - {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, - {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E}, - {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10}}; +static unsigned char key_data[NUM_TESTS][8] = { + {0x12, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1}, + {0x0e, 0x32, 0x92, 0x32, 0xea, 0x6d, 0x0d, 0x72}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}, + {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57}, + {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E}, + {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86}, + {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E}, + {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6}, + {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE}, + {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6}, + {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE}, + {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16}, + {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F}, + {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46}, + {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E}, + {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76}, + {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07}, + {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F}, + {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7}, + {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, + {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6}, + {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF}, + {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, + {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E}, + {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10} +}; -static unsigned char plain_data[NUM_TESTS][8]={ - {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, - {0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, - {0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, - {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11}, - {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0x01,0xA1,0xD6,0xD0,0x39,0x77,0x67,0x42}, - {0x5C,0xD5,0x4C,0xA8,0x3D,0xEF,0x57,0xDA}, - {0x02,0x48,0xD4,0x38,0x06,0xF6,0x71,0x72}, - {0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A}, - {0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2}, - {0x05,0x9B,0x5E,0x08,0x51,0xCF,0x14,0x3A}, - {0x07,0x56,0xD8,0xE0,0x77,0x47,0x61,0xD2}, - {0x76,0x25,0x14,0xB8,0x29,0xBF,0x48,0x6A}, - {0x3B,0xDD,0x11,0x90,0x49,0x37,0x28,0x02}, - {0x26,0x95,0x5F,0x68,0x35,0xAF,0x60,0x9A}, - {0x16,0x4D,0x5E,0x40,0x4F,0x27,0x52,0x32}, - {0x6B,0x05,0x6E,0x18,0x75,0x9F,0x5C,0xCA}, - {0x00,0x4B,0xD6,0xEF,0x09,0x17,0x60,0x62}, - {0x48,0x0D,0x39,0x00,0x6E,0xE7,0x62,0xF2}, - {0x43,0x75,0x40,0xC8,0x69,0x8F,0x3C,0xFA}, - {0x07,0x2D,0x43,0xA0,0x77,0x07,0x52,0x92}, - {0x02,0xFE,0x55,0x77,0x81,0x17,0xF1,0x2A}, - {0x1D,0x9D,0x5C,0x50,0x18,0xF7,0x28,0xC2}, - {0x30,0x55,0x32,0x28,0x6D,0x6F,0x29,0x5A}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}, - {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}; +static unsigned char plain_data[NUM_TESTS][8] = { + {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, + {0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, + {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42}, + {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA}, + {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72}, + {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A}, + {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2}, + {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A}, + {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2}, + {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A}, + {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02}, + {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A}, + {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32}, + {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA}, + {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62}, + {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2}, + {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA}, + {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92}, + {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A}, + {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2}, + {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; -static unsigned char crypt_data[NUM_TESTS][8]={ - {0x85,0xe8,0x13,0x54,0x0f,0x0a,0xb4,0x05}, - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7}, - {0x73,0x59,0xB2,0x16,0x3E,0x4E,0xDC,0x58}, - {0x95,0x8E,0x6E,0x62,0x7A,0x05,0x55,0x7B}, - {0xF4,0x03,0x79,0xAB,0x9E,0x0E,0xC5,0x33}, - {0x17,0x66,0x8D,0xFC,0x72,0x92,0x53,0x2D}, - {0x8A,0x5A,0xE1,0xF8,0x1A,0xB8,0xF2,0xDD}, - {0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7}, - {0xED,0x39,0xD9,0x50,0xFA,0x74,0xBC,0xC4}, - {0x69,0x0F,0x5B,0x0D,0x9A,0x26,0x93,0x9B}, - {0x7A,0x38,0x9D,0x10,0x35,0x4B,0xD2,0x71}, - {0x86,0x8E,0xBB,0x51,0xCA,0xB4,0x59,0x9A}, - {0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A}, - {0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95}, - {0x86,0xA5,0x60,0xF1,0x0E,0xC6,0xD8,0x5B}, - {0x0C,0xD3,0xDA,0x02,0x00,0x21,0xDC,0x09}, - {0xEA,0x67,0x6B,0x2C,0xB7,0xDB,0x2B,0x7A}, - {0xDF,0xD6,0x4A,0x81,0x5C,0xAF,0x1A,0x0F}, - {0x5C,0x51,0x3C,0x9C,0x48,0x86,0xC0,0x88}, - {0x0A,0x2A,0xEE,0xAE,0x3F,0xF4,0xAB,0x77}, - {0xEF,0x1B,0xF0,0x3E,0x5D,0xFA,0x57,0x5A}, - {0x88,0xBF,0x0D,0xB6,0xD7,0x0D,0xEE,0x56}, - {0xA1,0xF9,0x91,0x55,0x41,0x02,0x0B,0x56}, - {0x6F,0xBF,0x1C,0xAF,0xCF,0xFD,0x05,0x56}, - {0x2F,0x22,0xE4,0x9B,0xAB,0x7C,0xA1,0xAC}, - {0x5A,0x6B,0x61,0x2C,0xC2,0x6C,0xCE,0x4A}, - {0x5F,0x4C,0x03,0x8E,0xD1,0x2B,0x2E,0x41}, - {0x63,0xFA,0xC0,0xD0,0x34,0xD9,0xF7,0x93}, - {0x61,0x7B,0x3A,0x0C,0xE8,0xF0,0x71,0x00}, - {0xDB,0x95,0x86,0x05,0xF8,0xC8,0xC6,0x06}, - {0xED,0xBF,0xD1,0xC6,0x6C,0x29,0xCC,0xC7}, - {0x35,0x55,0x50,0xB2,0x15,0x0E,0x24,0x51}, - {0xCA,0xAA,0xAF,0x4D,0xEA,0xF1,0xDB,0xAE}, - {0xD5,0xD4,0x4F,0xF7,0x20,0x68,0x3D,0x0D}, - {0x2A,0x2B,0xB0,0x08,0xDF,0x97,0xC2,0xF2}}; +static unsigned char crypt_data[NUM_TESTS][8] = { + {0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7}, + {0x73, 0x59, 0xB2, 0x16, 0x3E, 0x4E, 0xDC, 0x58}, + {0x95, 0x8E, 0x6E, 0x62, 0x7A, 0x05, 0x55, 0x7B}, + {0xF4, 0x03, 0x79, 0xAB, 0x9E, 0x0E, 0xC5, 0x33}, + {0x17, 0x66, 0x8D, 0xFC, 0x72, 0x92, 0x53, 0x2D}, + {0x8A, 0x5A, 0xE1, 0xF8, 0x1A, 0xB8, 0xF2, 0xDD}, + {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7}, + {0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4}, + {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B}, + {0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71}, + {0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A}, + {0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A}, + {0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95}, + {0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B}, + {0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09}, + {0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A}, + {0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F}, + {0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88}, + {0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77}, + {0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A}, + {0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56}, + {0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56}, + {0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56}, + {0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC}, + {0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A}, + {0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41}, + {0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93}, + {0x61, 0x7B, 0x3A, 0x0C, 0xE8, 0xF0, 0x71, 0x00}, + {0xDB, 0x95, 0x86, 0x05, 0xF8, 0xC8, 0xC6, 0x06}, + {0xED, 0xBF, 0xD1, 0xC6, 0x6C, 0x29, 0xCC, 0xC7}, + {0x35, 0x55, 0x50, 0xB2, 0x15, 0x0E, 0x24, 0x51}, + {0xCA, 0xAA, 0xAF, 0x4D, 0xEA, 0xF1, 0xDB, 0xAE}, + {0xD5, 0xD4, 0x4F, 0xF7, 0x20, 0x68, 0x3D, 0x0D}, + {0x2A, 0x2B, 0xB0, 0x08, 0xDF, 0x97, 0xC2, 0xF2} +}; -static unsigned char cbc_key[8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; -static unsigned char cbc_iv[8]={0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10}; -static unsigned char cbc_data[32]="7654321 Now is the time for "; +static unsigned char cbc_key[8] = + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; +static unsigned char cbc_iv[8] = + { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }; +static unsigned char cbc_data[32] = "7654321 Now is the time for "; -static unsigned char cbc_ok[32]={ - 0xcc,0xd1,0x73,0xff,0xab,0x20,0x39,0xf4, - 0xac,0xd8,0xae,0xfd,0xdf,0xd8,0xa1,0xeb, - 0x46,0x8e,0x91,0x15,0x78,0x88,0xba,0x68, - 0x1d,0x26,0x93,0x97,0xf7,0xfe,0x62,0xb4}; +static unsigned char cbc_ok[32] = { + 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, + 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, + 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68, + 0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 +}; -int -test_des(void) +int test_des(void) { - int i, j; - unsigned char key[8], plain[8], crypt[8], buffer[8]; - unsigned char cbc_buffer[32], cbc_iv_buf[8]; + int i, j; + unsigned char key[8], plain[8], crypt[8], buffer[8]; + unsigned char cbc_buffer[32], cbc_iv_buf[8]; - printf("Testing DES in ECB mode .................................................. "); fflush(stdout); - for (i = 0; i < NUM_TESTS; i++) { - for (j = 0; j < 8; j++) { - key[j] = key_data[i][j]; - plain[j] = plain_data[i][j]; - crypt[j] = crypt_data[i][j]; - } - memcpy(buffer, crypt, 8); - qfDES_ECB_d(key, buffer, 8); - if (memcmp(buffer, plain, 8) != 0) { - printf("FAIL\n"); - goto abort_ecb; - } - memcpy(buffer, plain, 8); - qfDES_ECB_e(key, buffer, 8); - if (memcmp(buffer, crypt, 8) != 0) { - printf("FAIL\n"); - goto abort_ecb; - } - qfDES_ECB_d(key, buffer, 8); - if (memcmp(buffer, plain, 8) != 0) { - printf("FAIL\n"); - goto abort_ecb; - } - } - printf("Ok\n"); -abort_ecb: + printf + ("Testing DES in ECB mode .................................................. "); + fflush(stdout); + for (i = 0; i < NUM_TESTS; i++) { + for (j = 0; j < 8; j++) { + key[j] = key_data[i][j]; + plain[j] = plain_data[i][j]; + crypt[j] = crypt_data[i][j]; + } + memcpy(buffer, crypt, 8); + qfDES_ECB_d(key, buffer, 8); + if (memcmp(buffer, plain, 8) != 0) { + printf("FAIL\n"); + goto abort_ecb; + } + memcpy(buffer, plain, 8); + qfDES_ECB_e(key, buffer, 8); + if (memcmp(buffer, crypt, 8) != 0) { + printf("FAIL\n"); + goto abort_ecb; + } + qfDES_ECB_d(key, buffer, 8); + if (memcmp(buffer, plain, 8) != 0) { + printf("FAIL\n"); + goto abort_ecb; + } + } + printf("Ok\n"); + abort_ecb: - printf("Testing DES in CBC mode .................................................. "); fflush(stdout); - memcpy(cbc_buffer, cbc_data, 32); - memcpy(cbc_iv_buf, cbc_iv, 8); - qfDES_CBC_e(cbc_key, cbc_buffer, 32, cbc_iv_buf); - if (memcmp(cbc_buffer, cbc_ok, 32) != 0) { - printf("FAIL\n"); - return 1; - } - memcpy(cbc_iv_buf, cbc_iv, 8); - qfDES_CBC_d(cbc_key, cbc_buffer, 32, cbc_iv_buf); - if (memcmp(cbc_buffer, cbc_data, 32) != 0) { - printf("FAIL\n"); - return 1; - } - printf("Ok\n"); - return 0; + printf + ("Testing DES in CBC mode .................................................. "); + fflush(stdout); + memcpy(cbc_buffer, cbc_data, 32); + memcpy(cbc_iv_buf, cbc_iv, 8); + qfDES_CBC_e(cbc_key, cbc_buffer, 32, cbc_iv_buf); + if (memcmp(cbc_buffer, cbc_ok, 32) != 0) { + printf("FAIL\n"); + return 1; + } + memcpy(cbc_iv_buf, cbc_iv, 8); + qfDES_CBC_d(cbc_key, cbc_buffer, 32, cbc_iv_buf); + if (memcmp(cbc_buffer, cbc_data, 32) != 0) { + printf("FAIL\n"); + return 1; + } + printf("Ok\n"); + return 0; } - diff --git a/ultragrid/test/test_md5.c b/ultragrid/test/test_md5.c index 084f29c24..05c491f2d 100644 --- a/ultragrid/test/test_md5.c +++ b/ultragrid/test/test_md5.c @@ -43,85 +43,100 @@ #include "crypto/md5.h" #include "test_md5.h" -int -test_md5(void) +int test_md5(void) { - MD5_CTX context; - unsigned char digest[16]; - unsigned char i1[] = ""; - unsigned char o1[] = {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e}; - unsigned char i2[] = "a"; - unsigned char o2[] = {0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8, 0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61}; - unsigned char i3[] = "abc"; - unsigned char o3[] = {0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72}; - unsigned char i4[] = "message digest"; - unsigned char o4[] = {0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d, 0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0}; - unsigned char i5[] = "abcdefghijklmnopqrstuvwxyz"; - unsigned char o5[] = {0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00, 0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b}; - unsigned char i6[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - unsigned char o6[] = {0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5, 0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f}; - unsigned char i7[] = "12345678901234567890123456789012345678901234567890123456789012345678901234567890"; - unsigned char o7[] = {0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55, 0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a}; + MD5_CTX context; + unsigned char digest[16]; + unsigned char i1[] = ""; + unsigned char o1[] = + { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, + 0x98, 0xec, 0xf8, 0x42, 0x7e }; + unsigned char i2[] = "a"; + unsigned char o2[] = + { 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8, 0x31, 0xc3, 0x99, + 0xe2, 0x69, 0x77, 0x26, 0x61 }; + unsigned char i3[] = "abc"; + unsigned char o3[] = + { 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, + 0x7d, 0x28, 0xe1, 0x7f, 0x72 }; + unsigned char i4[] = "message digest"; + unsigned char o4[] = + { 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d, 0x52, 0x5a, 0x2f, + 0x31, 0xaa, 0xf1, 0x61, 0xd0 }; + unsigned char i5[] = "abcdefghijklmnopqrstuvwxyz"; + unsigned char o5[] = + { 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00, 0x7d, 0xfb, 0x49, + 0x6c, 0xca, 0x67, 0xe1, 0x3b }; + unsigned char i6[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + unsigned char o6[] = + { 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5, 0xa5, 0x61, 0x1c, + 0x2c, 0x9f, 0x41, 0x9d, 0x9f }; + unsigned char i7[] = + "12345678901234567890123456789012345678901234567890123456789012345678901234567890"; + unsigned char o7[] = + { 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55, 0xac, 0x49, 0xda, + 0x2e, 0x21, 0x07, 0xb6, 0x7a }; + printf + ("Testing MD5 .............................................................. "); + fflush(stdout); - printf("Testing MD5 .............................................................. "); fflush(stdout); + MD5Init(&context); + MD5Update(&context, i1, strlen(i1)); + MD5Final(digest, &context); + if (strncmp(digest, o1, 16) != 0) { + printf("FAIL\n"); + return 1; + } - MD5Init(&context); - MD5Update(&context, i1, strlen(i1)); - MD5Final(digest, &context); - if (strncmp(digest, o1, 16) != 0) { - printf("FAIL\n"); - return 1; - } + MD5Init(&context); + MD5Update(&context, i2, strlen(i2)); + MD5Final(digest, &context); + if (strncmp(digest, o2, 16) != 0) { + printf("FAIL\n"); + return 1; + } - MD5Init(&context); - MD5Update(&context, i2, strlen(i2)); - MD5Final(digest, &context); - if (strncmp(digest, o2, 16) != 0) { - printf("FAIL\n"); - return 1; - } + MD5Init(&context); + MD5Update(&context, i3, strlen(i3)); + MD5Final(digest, &context); + if (strncmp(digest, o3, 16) != 0) { + printf("FAIL\n"); + return 1; + } - MD5Init(&context); - MD5Update(&context, i3, strlen(i3)); - MD5Final(digest, &context); - if (strncmp(digest, o3, 16) != 0) { - printf("FAIL\n"); - return 1; - } + MD5Init(&context); + MD5Update(&context, i4, strlen(i4)); + MD5Final(digest, &context); + if (strncmp(digest, o4, 16) != 0) { + printf("FAIL\n"); + return 1; + } - MD5Init(&context); - MD5Update(&context, i4, strlen(i4)); - MD5Final(digest, &context); - if (strncmp(digest, o4, 16) != 0) { - printf("FAIL\n"); - return 1; - } + MD5Init(&context); + MD5Update(&context, i5, strlen(i5)); + MD5Final(digest, &context); + if (strncmp(digest, o5, 16) != 0) { + printf("FAIL\n"); + return 1; + } - MD5Init(&context); - MD5Update(&context, i5, strlen(i5)); - MD5Final(digest, &context); - if (strncmp(digest, o5, 16) != 0) { - printf("FAIL\n"); - return 1; - } + MD5Init(&context); + MD5Update(&context, i6, strlen(i6)); + MD5Final(digest, &context); + if (strncmp(digest, o6, 16) != 0) { + printf("FAIL\n"); + return 1; + } - MD5Init(&context); - MD5Update(&context, i6, strlen(i6)); - MD5Final(digest, &context); - if (strncmp(digest, o6, 16) != 0) { - printf("FAIL\n"); - return 1; - } - - MD5Init(&context); - MD5Update(&context, i7, strlen(i7)); - MD5Final(digest, &context); - if (strncmp(digest, o7, 16) != 0) { - printf("FAIL\n"); - return 1; - } - printf("Ok\n"); - return 0; + MD5Init(&context); + MD5Update(&context, i7, strlen(i7)); + MD5Final(digest, &context); + if (strncmp(digest, o7, 16) != 0) { + printf("FAIL\n"); + return 1; + } + printf("Ok\n"); + return 0; } - diff --git a/ultragrid/test/test_net_udp.c b/ultragrid/test/test_net_udp.c index 973792cba..9e9fb53d7 100644 --- a/ultragrid/test/test_net_udp.c +++ b/ultragrid/test/test_net_udp.c @@ -45,481 +45,493 @@ static void randomize(char buf[], int buflen) { - int i; + int i; - for (i = 0; i < buflen; i++) { - buf[i] = (lrand48() && 0xff00) >> 8; - } + for (i = 0; i < buflen; i++) { + buf[i] = (lrand48() && 0xff00) >> 8; + } } -int -test_net_udp(void) +int test_net_udp(void) { - struct timeval timeout; - socket_udp *s1, *s2; - char buf1[BUFSIZE], buf2[BUFSIZE]; - const char *hname; - int rc, i; - + struct timeval timeout; + socket_udp *s1, *s2; + char buf1[BUFSIZE], buf2[BUFSIZE]; + const char *hname; + int rc, i; + #ifndef WIN32 - /* "BSD" bug test that appears in this function uses fork and - * exec, that are not present on WIN32. Since the original - * bug has not been seen on Win32 it's probably not worth - * converting to use CreateProcess() */ + /* "BSD" bug test that appears in this function uses fork and + * exec, that are not present on WIN32. Since the original + * bug has not been seen on Win32 it's probably not worth + * converting to use CreateProcess() */ - int status_parent, status_child; + int status_parent, status_child; -#endif /* WIN32 */ +#endif /* WIN32 */ - srand48(time(NULL)); + srand48(time(NULL)); - /**********************************************************************/ - /* The first test is to loopback a packet to ourselves... */ - printf("Testing UDP/IP networking (IPv4 loopback) ................................ "); - fflush(stdout); - s1 = udp_init("127.0.0.1", 5004, 5004, 1); - if (s1 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - randomize(buf1, BUFSIZE); - randomize(buf2, BUFSIZE); - if (udp_send(s1, buf1, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot send packet"); - goto abort_loopback; - } - timeout.tv_sec = 1; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s1); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Select failed"); - goto abort_loopback; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" No data waiting\n"); - goto abort_loopback; - } - if (!udp_fd_isset(s1)) { - printf("FAIL\n"); - printf(" No data on file descriptor\n"); - goto abort_loopback; - } - if (udp_recv(s1, buf2, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Receive failed"); - goto abort_loopback; - } - if (memcmp(buf1, buf2, BUFSIZE) != 0) { - printf("FAIL\n"); - printf(" Buffer corrupt\n"); - goto abort_loopback; - } - printf("Ok\n"); -abort_loopback: - hname = udp_host_addr(s1); /* we need this for the unicast test... */ - udp_exit(s1); - - /**********************************************************************/ - /* Now we send a packet to ourselves via our real network address... */ - printf("Testing UDP/IP networking (IPv4 unicast) ................................. "); - fflush(stdout); - s1 = udp_init(hname, 5004, 5005, 1); - if (s1 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - - s2 = udp_init(hname, 5005, 5004, 1); - if (s2 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - - randomize(buf1, BUFSIZE); - randomize(buf2, BUFSIZE); - if (udp_send(s1, buf1, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot send"); - goto abort_unicast; - } - timeout.tv_sec = 1; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s1); - udp_fd_set(s2); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Select failed"); - goto abort_unicast; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" No data waiting (no route to %s?)\n", hname); - goto abort_unicast; - } - if (!udp_fd_isset(s2)) { - printf("FAIL\n"); - printf(" No data on file descriptor\n"); - goto abort_unicast; - } - if (udp_recv(s2, buf2, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot receive"); - goto abort_unicast; - } - if (memcmp(buf1, buf2, BUFSIZE) != 0) { - printf("FAIL\n"); - printf(" Buffer corrupt\n"); - goto abort_unicast; - } - printf("Ok\n"); -abort_unicast: - udp_exit(s1); - udp_exit(s2); - - /**********************************************************************/ - /* Loopback a packet to ourselves via multicast... */ - printf("Testing UDP/IP networking (IPv4 multicast) ............................... "); - fflush(stdout); - s1 = udp_init("224.2.0.1", 5004, 5004, 1); - if (s1 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - randomize(buf1, BUFSIZE); - randomize(buf2, BUFSIZE); - if (udp_send(s1, buf1, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot send"); - goto abort_multicast; - } - timeout.tv_sec = 1; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s1); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Select failed"); - goto abort_multicast; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" No data waiting (no multicast loopback route?)\n"); - goto abort_multicast; - } - if (!udp_fd_isset(s1)) { - printf("FAIL\n"); - printf(" No data on file descriptor\n"); - goto abort_multicast; - } - if (udp_recv(s1, buf2, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot receive"); - goto abort_multicast; - } - if (memcmp(buf1, buf2, BUFSIZE) != 0) { - printf("FAIL\n"); - printf(" Buffer corrupt\n"); - goto abort_multicast; - } - printf("Ok\n"); -abort_multicast: - udp_exit(s1); - - /**********************************************************************/ - /* Loopback a packet to ourselves via multicast, checking lengths... */ - printf("Testing UDP/IP networking (IPv4 length check) ............................ "); - fflush(stdout); - s1 = udp_init("224.2.0.1", 5004, 5004, 1); - if (s1 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - for (i = 1; i < BUFSIZE; i++) { - randomize(buf1, i); - randomize(buf2, i); - if (udp_send(s1, buf1, i) < 0) { - printf("FAIL\n"); - perror(" Cannot send"); - goto abort_length; - } - timeout.tv_sec = 1; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s1); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Select failed"); - goto abort_length; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" No data waiting (no multicast loopback route?)\n"); - goto abort_length; - } - if (!udp_fd_isset(s1)) { - printf("FAIL\n"); - printf(" No data on file descriptor\n"); - goto abort_length; - } - if (udp_recv(s1, buf2, BUFSIZE) != i) { - printf("FAIL\n"); - perror(" Cannot receive"); - goto abort_length; - } - if (memcmp(buf1, buf2, i) != 0) { - printf("FAIL\n"); - printf(" Buffer corrupt\n"); - goto abort_length; - } - } + /**********************************************************************/ + /* The first test is to loopback a packet to ourselves... */ + printf + ("Testing UDP/IP networking (IPv4 loopback) ................................ "); + fflush(stdout); + s1 = udp_init("127.0.0.1", 5004, 5004, 1); + if (s1 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } + randomize(buf1, BUFSIZE); + randomize(buf2, BUFSIZE); + if (udp_send(s1, buf1, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot send packet"); + goto abort_loopback; + } + timeout.tv_sec = 1; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s1); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Select failed"); + goto abort_loopback; + } + if (rc == 0) { + printf("FAIL\n"); + printf(" No data waiting\n"); + goto abort_loopback; + } + if (!udp_fd_isset(s1)) { + printf("FAIL\n"); + printf(" No data on file descriptor\n"); + goto abort_loopback; + } + if (udp_recv(s1, buf2, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Receive failed"); + goto abort_loopback; + } + if (memcmp(buf1, buf2, BUFSIZE) != 0) { + printf("FAIL\n"); + printf(" Buffer corrupt\n"); + goto abort_loopback; + } printf("Ok\n"); -abort_length: + abort_loopback: + hname = udp_host_addr(s1); /* we need this for the unicast test... */ udp_exit(s1); + /**********************************************************************/ + /* Now we send a packet to ourselves via our real network address... */ + printf + ("Testing UDP/IP networking (IPv4 unicast) ................................. "); + fflush(stdout); + s1 = udp_init(hname, 5004, 5005, 1); + if (s1 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } + s2 = udp_init(hname, 5005, 5004, 1); + if (s2 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } -#ifdef HAVE_IPv6 - /**********************************************************************/ - /* The first test is to loopback a packet to ourselves... */ - printf("Testing UDP/IP networking (IPv6 loopback) ................................ "); - fflush(stdout); - s1 = udp_init("::1", 5004, 5004, 1); - if (s1 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - randomize(buf1, BUFSIZE); - randomize(buf2, BUFSIZE); - if (udp_send(s1, buf1, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot send"); - goto abort_loopback_ipv6; - } - timeout.tv_sec = 1; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s1); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Select failed"); - goto abort_loopback_ipv6; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" No data waiting\n"); - goto abort_loopback_ipv6; - } - if (!udp_fd_isset(s1)) { - printf("FAIL\n"); - printf(" No data on file descriptor\n"); - goto abort_loopback_ipv6; - } - if (udp_recv(s1, buf2, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot receive"); - goto abort_loopback_ipv6; - } - if (memcmp(buf1, buf2, BUFSIZE) != 0) { - printf("FAIL\n"); - printf(" Buffer corrupt\n"); - goto abort_loopback_ipv6; - } - printf("Ok\n"); -abort_loopback_ipv6: - udp_exit(s1); + randomize(buf1, BUFSIZE); + randomize(buf2, BUFSIZE); + if (udp_send(s1, buf1, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot send"); + goto abort_unicast; + } + timeout.tv_sec = 1; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s1); + udp_fd_set(s2); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Select failed"); + goto abort_unicast; + } + if (rc == 0) { + printf("FAIL\n"); + printf(" No data waiting (no route to %s?)\n", hname); + goto abort_unicast; + } + if (!udp_fd_isset(s2)) { + printf("FAIL\n"); + printf(" No data on file descriptor\n"); + goto abort_unicast; + } + if (udp_recv(s2, buf2, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot receive"); + goto abort_unicast; + } + if (memcmp(buf1, buf2, BUFSIZE) != 0) { + printf("FAIL\n"); + printf(" Buffer corrupt\n"); + goto abort_unicast; + } + printf("Ok\n"); + abort_unicast: + udp_exit(s1); + udp_exit(s2); - /**********************************************************************/ - /* Loopback a packet to ourselves via multicast. The address is the */ - /* SAP address, but we use a different port. */ - printf("Testing UDP/IP networking (IPv6 multicast) ............................... "); - fflush(stdout); - s1 = udp_init("ff01::2:7ffe", 5004, 5004, 1); - if (s1 == NULL) { - printf("FAIL\n"); - printf(" Cannot initialize socket\n"); - return 1; - } - randomize(buf1, BUFSIZE); - randomize(buf2, BUFSIZE); - if (udp_send(s1, buf1, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot send"); - goto abort_multicast_ipv6; - } - timeout.tv_sec = 1; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s1); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Select failed"); - goto abort_multicast_ipv6; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" No data waiting (no multicast loopback route?)\n"); - goto abort_multicast_ipv6; - } - if (!udp_fd_isset(s1)) { - printf("FAIL\n"); - printf(" No data on file descriptor\n"); - goto abort_multicast_ipv6; - } - if (udp_recv(s1, buf2, BUFSIZE) < 0) { - printf("FAIL\n"); - perror(" Cannot receive"); - goto abort_multicast_ipv6; - } - if (memcmp(buf1, buf2, BUFSIZE) != 0) { - printf("FAIL\n"); - printf(" Buffer corrupt\n"); - goto abort_multicast_ipv6; - } - hname = udp_host_addr(s1); /* we need this for the unicast test... */ - printf("Ok\n"); -abort_multicast_ipv6: - udp_exit(s1); -#else - printf("Testing UDP/IP networking (IPv6 loopback) ................................ --\n"); - printf("Testing UDP/IP networking (IPv6 unicast) ................................. --\n"); - printf("Testing UDP/IP networking (IPv6 multicast) ............................... --\n"); -#endif + /**********************************************************************/ + /* Loopback a packet to ourselves via multicast... */ + printf + ("Testing UDP/IP networking (IPv4 multicast) ............................... "); + fflush(stdout); + s1 = udp_init("224.2.0.1", 5004, 5004, 1); + if (s1 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } + randomize(buf1, BUFSIZE); + randomize(buf2, BUFSIZE); + if (udp_send(s1, buf1, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot send"); + goto abort_multicast; + } + timeout.tv_sec = 1; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s1); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Select failed"); + goto abort_multicast; + } + if (rc == 0) { + printf("FAIL\n"); + printf(" No data waiting (no multicast loopback route?)\n"); + goto abort_multicast; + } + if (!udp_fd_isset(s1)) { + printf("FAIL\n"); + printf(" No data on file descriptor\n"); + goto abort_multicast; + } + if (udp_recv(s1, buf2, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot receive"); + goto abort_multicast; + } + if (memcmp(buf1, buf2, BUFSIZE) != 0) { + printf("FAIL\n"); + printf(" Buffer corrupt\n"); + goto abort_multicast; + } + printf("Ok\n"); + abort_multicast: + udp_exit(s1); - /**********************************************************************/ - -#ifdef WIN32 - printf("Testing UDP/IP networking (FreeBSD bug) .................................. --\n"); -#else - printf("Testing UDP/IP networking (FreeBSD bug) .................................. "); - fflush(stdout); - status_parent = 0; - randomize(buf1, 64); - s1 = udp_init("224.2.0.1", 5004, 5004, 1); - if (s1 == NULL) { - printf("fail (parent): cannot initialize socket\n"); - return 1; - } - rc = fork(); - if (rc == -1) { - printf("fail: cannot fork\n"); - goto abort_bsd; - } else if (rc == 0) { - /* child */ - s2 = udp_init("224.2.0.1", 5004, 5004, 1); - if (s2 == NULL) { - printf("FAIL\n"); - printf(" Child cannot initialize socket\n"); - exit(0); - } - if (udp_send(s2, buf1, 64) < 0) { - printf("FAIL\n"); - perror(" Child cannot send"); - exit(0); - } - timeout.tv_sec = 10; - timeout.tv_usec = 0; - udp_fd_zero(); - udp_fd_set(s2); - rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Child select"); - exit(0); - } - if (rc == 0) { - printf("FAIL\n"); - printf(" Child: no data waiting (no multicast loopback route?)\n"); - exit(0); - } - if (!udp_fd_isset(s2)) { - printf("FAIL\n"); - printf(" Child: no data on file descriptor\n"); - exit(0); - } - rc = udp_recv(s2, buf2, BUFSIZE); - if (rc < 0) { - printf("FAIL\n"); - perror(" Child cannot receive"); - exit(0); - } - if (rc != 64) { - printf("FAIL\n"); - printf(" Child: read size incorrect (%d != %d)\n", rc, 64); - exit(0); - } - if (memcmp(buf1, buf2, 64) != 0) { - printf("FAIL\n"); - printf(" Child: buffer corrupt\n"); - exit(0); - } - udp_exit(s2); - exit(1); - } else { - /* parent */ - timeout.tv_sec = 10; + /**********************************************************************/ + /* Loopback a packet to ourselves via multicast, checking lengths... */ + printf + ("Testing UDP/IP networking (IPv4 length check) ............................ "); + fflush(stdout); + s1 = udp_init("224.2.0.1", 5004, 5004, 1); + if (s1 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } + for (i = 1; i < BUFSIZE; i++) { + randomize(buf1, i); + randomize(buf2, i); + if (udp_send(s1, buf1, i) < 0) { + printf("FAIL\n"); + perror(" Cannot send"); + goto abort_length; + } + timeout.tv_sec = 1; timeout.tv_usec = 0; udp_fd_zero(); udp_fd_set(s1); rc = udp_select(&timeout); - if (rc < 0) { - printf("FAIL\n"); - perror(" Parent select"); - goto abort_bsd; - } - if (rc == 0) { - printf("FAIL\n"); - printf(" Parent: no data waiting (no multicast loopback route?)\n"); - goto abort_bsd; - } - if (!udp_fd_isset(s1)) { - printf("FAIL\n"); - printf(" Parent: no data on file descriptor\n"); - goto abort_bsd; - } - rc = udp_recv(s1, buf2, BUFSIZE); if (rc < 0) { - printf("FAIL\n"); - perror(" Parent cannot receive"); - goto abort_bsd; + printf("FAIL\n"); + perror(" Select failed"); + goto abort_length; + } + if (rc == 0) { + printf("FAIL\n"); + printf + (" No data waiting (no multicast loopback route?)\n"); + goto abort_length; + } + if (!udp_fd_isset(s1)) { + printf("FAIL\n"); + printf(" No data on file descriptor\n"); + goto abort_length; + } + if (udp_recv(s1, buf2, BUFSIZE) != i) { + printf("FAIL\n"); + perror(" Cannot receive"); + goto abort_length; + } + if (memcmp(buf1, buf2, i) != 0) { + printf("FAIL\n"); + printf(" Buffer corrupt\n"); + goto abort_length; + } + } + printf("Ok\n"); + abort_length: + udp_exit(s1); + +#ifdef HAVE_IPv6 + /**********************************************************************/ + /* The first test is to loopback a packet to ourselves... */ + printf + ("Testing UDP/IP networking (IPv6 loopback) ................................ "); + fflush(stdout); + s1 = udp_init("::1", 5004, 5004, 1); + if (s1 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } + randomize(buf1, BUFSIZE); + randomize(buf2, BUFSIZE); + if (udp_send(s1, buf1, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot send"); + goto abort_loopback_ipv6; + } + timeout.tv_sec = 1; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s1); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Select failed"); + goto abort_loopback_ipv6; + } + if (rc == 0) { + printf("FAIL\n"); + printf(" No data waiting\n"); + goto abort_loopback_ipv6; + } + if (!udp_fd_isset(s1)) { + printf("FAIL\n"); + printf(" No data on file descriptor\n"); + goto abort_loopback_ipv6; + } + if (udp_recv(s1, buf2, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot receive"); + goto abort_loopback_ipv6; + } + if (memcmp(buf1, buf2, BUFSIZE) != 0) { + printf("FAIL\n"); + printf(" Buffer corrupt\n"); + goto abort_loopback_ipv6; + } + printf("Ok\n"); + abort_loopback_ipv6: + udp_exit(s1); + + /**********************************************************************/ + /* Loopback a packet to ourselves via multicast. The address is the */ + /* SAP address, but we use a different port. */ + printf + ("Testing UDP/IP networking (IPv6 multicast) ............................... "); + fflush(stdout); + s1 = udp_init("ff01::2:7ffe", 5004, 5004, 1); + if (s1 == NULL) { + printf("FAIL\n"); + printf(" Cannot initialize socket\n"); + return 1; + } + randomize(buf1, BUFSIZE); + randomize(buf2, BUFSIZE); + if (udp_send(s1, buf1, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot send"); + goto abort_multicast_ipv6; + } + timeout.tv_sec = 1; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s1); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Select failed"); + goto abort_multicast_ipv6; + } + if (rc == 0) { + printf("FAIL\n"); + printf(" No data waiting (no multicast loopback route?)\n"); + goto abort_multicast_ipv6; + } + if (!udp_fd_isset(s1)) { + printf("FAIL\n"); + printf(" No data on file descriptor\n"); + goto abort_multicast_ipv6; + } + if (udp_recv(s1, buf2, BUFSIZE) < 0) { + printf("FAIL\n"); + perror(" Cannot receive"); + goto abort_multicast_ipv6; + } + if (memcmp(buf1, buf2, BUFSIZE) != 0) { + printf("FAIL\n"); + printf(" Buffer corrupt\n"); + goto abort_multicast_ipv6; + } + hname = udp_host_addr(s1); /* we need this for the unicast test... */ + printf("Ok\n"); + abort_multicast_ipv6: + udp_exit(s1); +#else + printf + ("Testing UDP/IP networking (IPv6 loopback) ................................ --\n"); + printf + ("Testing UDP/IP networking (IPv6 unicast) ................................. --\n"); + printf + ("Testing UDP/IP networking (IPv6 multicast) ............................... --\n"); +#endif + + /**********************************************************************/ + +#ifdef WIN32 + printf + ("Testing UDP/IP networking (FreeBSD bug) .................................. --\n"); +#else + printf + ("Testing UDP/IP networking (FreeBSD bug) .................................. "); + fflush(stdout); + status_parent = 0; + randomize(buf1, 64); + s1 = udp_init("224.2.0.1", 5004, 5004, 1); + if (s1 == NULL) { + printf("fail (parent): cannot initialize socket\n"); + return 1; + } + rc = fork(); + if (rc == -1) { + printf("fail: cannot fork\n"); + goto abort_bsd; + } else if (rc == 0) { + /* child */ + s2 = udp_init("224.2.0.1", 5004, 5004, 1); + if (s2 == NULL) { + printf("FAIL\n"); + printf(" Child cannot initialize socket\n"); + exit(0); + } + if (udp_send(s2, buf1, 64) < 0) { + printf("FAIL\n"); + perror(" Child cannot send"); + exit(0); + } + timeout.tv_sec = 10; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s2); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Child select"); + exit(0); + } + if (rc == 0) { + printf("FAIL\n"); + printf + (" Child: no data waiting (no multicast loopback route?)\n"); + exit(0); + } + if (!udp_fd_isset(s2)) { + printf("FAIL\n"); + printf(" Child: no data on file descriptor\n"); + exit(0); + } + rc = udp_recv(s2, buf2, BUFSIZE); + if (rc < 0) { + printf("FAIL\n"); + perror(" Child cannot receive"); + exit(0); } if (rc != 64) { - printf("FAIL\n"); - printf(" Parent: read size incorrect (%d != %d)\n", rc, 64); - goto abort_bsd; + printf("FAIL\n"); + printf(" Child: read size incorrect (%d != %d)\n", rc, + 64); + exit(0); } - if (memcmp(buf1, buf2, 64) != 0) { - printf("FAIL\n"); - printf(" Parent: buffer corrupt\n"); - goto abort_bsd; - } - status_parent = 1; - } -abort_bsd: - wait(&status_child); - if (status_parent && status_child) { - printf("Ok\n"); - } - udp_exit(s1); -#endif /* WIN32 */ + if (memcmp(buf1, buf2, 64) != 0) { + printf("FAIL\n"); + printf(" Child: buffer corrupt\n"); + exit(0); + } + udp_exit(s2); + exit(1); + } else { + /* parent */ + timeout.tv_sec = 10; + timeout.tv_usec = 0; + udp_fd_zero(); + udp_fd_set(s1); + rc = udp_select(&timeout); + if (rc < 0) { + printf("FAIL\n"); + perror(" Parent select"); + goto abort_bsd; + } + if (rc == 0) { + printf("FAIL\n"); + printf + (" Parent: no data waiting (no multicast loopback route?)\n"); + goto abort_bsd; + } + if (!udp_fd_isset(s1)) { + printf("FAIL\n"); + printf(" Parent: no data on file descriptor\n"); + goto abort_bsd; + } + rc = udp_recv(s1, buf2, BUFSIZE); + if (rc < 0) { + printf("FAIL\n"); + perror(" Parent cannot receive"); + goto abort_bsd; + } + if (rc != 64) { + printf("FAIL\n"); + printf(" Parent: read size incorrect (%d != %d)\n", rc, + 64); + goto abort_bsd; + } + if (memcmp(buf1, buf2, 64) != 0) { + printf("FAIL\n"); + printf(" Parent: buffer corrupt\n"); + goto abort_bsd; + } + status_parent = 1; + } + abort_bsd: + wait(&status_child); + if (status_parent && status_child) { + printf("Ok\n"); + } + udp_exit(s1); +#endif /* WIN32 */ - return 0; + return 0; } - diff --git a/ultragrid/test/test_random.c b/ultragrid/test/test_random.c index 1bea20b44..f29a8346b 100644 --- a/ultragrid/test/test_random.c +++ b/ultragrid/test/test_random.c @@ -43,10 +43,9 @@ #include "crypto/random.h" #include "test_random.h" -int -test_random(void) +int test_random(void) { - printf("Testing random number generator .......................................... --\n"); - return 0; + printf + ("Testing random number generator .......................................... --\n"); + return 0; } - diff --git a/ultragrid/test/test_rtp.c b/ultragrid/test/test_rtp.c index f92328016..23a5b69a9 100644 --- a/ultragrid/test/test_rtp.c +++ b/ultragrid/test/test_rtp.c @@ -36,14 +36,12 @@ #include "rtp/rtp.h" #include "test_rtp.h" -int -test_rtp(void) +int test_rtp(void) { - printf("Testing RTP .............................................................. "); - fflush(stdout); + printf + ("Testing RTP .............................................................. "); + fflush(stdout); - - printf("--\n"); - return 0; + printf("--\n"); + return 0; } - diff --git a/ultragrid/test/test_tv.c b/ultragrid/test/test_tv.c index 1969c3a4f..851db1ce9 100644 --- a/ultragrid/test/test_tv.c +++ b/ultragrid/test/test_tv.c @@ -39,135 +39,134 @@ #include "tv.h" #include "test_tv.h" -int -test_tv(void) +int test_tv(void) { - struct timeval t1, t2; - double d; - double e = 0.0000001; /* epsilon for double comparisons. this is evil. */ - uint32_t m1, m2, m3; + struct timeval t1, t2; + double d; + double e = 0.0000001; /* epsilon for double comparisons. this is evil. */ + uint32_t m1, m2, m3; - printf("Testing time conversion functions ........................................ "); + printf + ("Testing time conversion functions ........................................ "); - /* Test 1: check that tv_add() works... */ - /* 1A) Normal operation */ - t1.tv_sec = 1; - t1.tv_usec = 0; - tv_add(&t1, 0.8); - if ((t1.tv_sec != 1) && (t1.tv_usec != 800000)) { - printf("FAIL\n"); - printf(" tv_add() part A\n"); - return 1; - } - /* 1B) Wraparound of tv_usec during the addition */ - tv_add(&t1, 0.5); - if ((t1.tv_sec != 2) && (t1.tv_usec != 300000)) { - printf("FAIL\n"); - printf(" tv_add() part B\n"); - return 1; - } - /* 1C) Wraparound when the offset is greater than one second */ - tv_add(&t1, 4.2); - if ((t1.tv_sec != 6) && (t1.tv_usec != 500000)) { - printf("FAIL\n"); - printf(" tv_add() part C\n"); - return 1; - } + /* Test 1: check that tv_add() works... */ + /* 1A) Normal operation */ + t1.tv_sec = 1; + t1.tv_usec = 0; + tv_add(&t1, 0.8); + if ((t1.tv_sec != 1) && (t1.tv_usec != 800000)) { + printf("FAIL\n"); + printf(" tv_add() part A\n"); + return 1; + } + /* 1B) Wraparound of tv_usec during the addition */ + tv_add(&t1, 0.5); + if ((t1.tv_sec != 2) && (t1.tv_usec != 300000)) { + printf("FAIL\n"); + printf(" tv_add() part B\n"); + return 1; + } + /* 1C) Wraparound when the offset is greater than one second */ + tv_add(&t1, 4.2); + if ((t1.tv_sec != 6) && (t1.tv_usec != 500000)) { + printf("FAIL\n"); + printf(" tv_add() part C\n"); + return 1; + } - /* Test 2: check that tv_gt() works... */ - /* 2A) Normal operation */ - t1.tv_sec = 8143; - t1.tv_usec = 500000; - t2.tv_sec = 4294; - t2.tv_usec = 345678; - if (tv_gt(t2, t1) || !tv_gt(t1, t2)) { - printf("FAIL\n"); - printf(" tv_gt() part A\n"); - return 1; - } + /* Test 2: check that tv_gt() works... */ + /* 2A) Normal operation */ + t1.tv_sec = 8143; + t1.tv_usec = 500000; + t2.tv_sec = 4294; + t2.tv_usec = 345678; + if (tv_gt(t2, t1) || !tv_gt(t1, t2)) { + printf("FAIL\n"); + printf(" tv_gt() part A\n"); + return 1; + } - /* 2B) See if it works when tv_sec values are the same */ - t1.tv_sec = 8147; - t1.tv_usec = 500000; - t2.tv_sec = 8147; - t2.tv_usec = 345678; - if (tv_gt(t2, t1) || !tv_gt(t1, t2)) { - printf("FAIL\n"); - printf(" tv_gt() part B\n"); - return 1; - } + /* 2B) See if it works when tv_sec values are the same */ + t1.tv_sec = 8147; + t1.tv_usec = 500000; + t2.tv_sec = 8147; + t2.tv_usec = 345678; + if (tv_gt(t2, t1) || !tv_gt(t1, t2)) { + printf("FAIL\n"); + printf(" tv_gt() part B\n"); + return 1; + } - /* Test 3: check that tv_diff() works... */ - /* 3A) normal operation. comparing floats is tricky :( */ - t1.tv_sec = 1065356371; /* Sunday afternoon, 5th October 2003 */ - t1.tv_usec = 234947; - t2.tv_sec = 1065356528; /* ...a few minutes later, see how */ - t2.tv_usec = 864316; /* fast I type :) */ - d = tv_diff(t2, t1); - if ((d <= 157.629369 - e) || (d >= 157.629369 + e)) { - printf("FAIL\n"); - printf(" tv_diff: %f != 157.629369\n", d); - return 1; - } - /* 3B) when prev_time is newer than curr_time? Not what we */ - /* expect to work, but may as well make sure it gives a */ - /* sensible answer, rather than crashing out. */ - d = tv_diff(t1, t2); - if ((d <= -157.629369 - e) || (d >= -157.629369 + e)) { - printf("FAIL\n"); - printf(" tv_diff: %f != -157.629369\n", d); - return 1; - } + /* Test 3: check that tv_diff() works... */ + /* 3A) normal operation. comparing floats is tricky :( */ + t1.tv_sec = 1065356371; /* Sunday afternoon, 5th October 2003 */ + t1.tv_usec = 234947; + t2.tv_sec = 1065356528; /* ...a few minutes later, see how */ + t2.tv_usec = 864316; /* fast I type :) */ + d = tv_diff(t2, t1); + if ((d <= 157.629369 - e) || (d >= 157.629369 + e)) { + printf("FAIL\n"); + printf(" tv_diff: %f != 157.629369\n", d); + return 1; + } + /* 3B) when prev_time is newer than curr_time? Not what we */ + /* expect to work, but may as well make sure it gives a */ + /* sensible answer, rather than crashing out. */ + d = tv_diff(t1, t2); + if ((d <= -157.629369 - e) || (d >= -157.629369 + e)) { + printf("FAIL\n"); + printf(" tv_diff: %f != -157.629369\n", d); + return 1; + } - /* Test 4: check that tv_diff_usec() works... */ - /* 4A) normal operation */ - t1.tv_sec = 1065356371; - t1.tv_usec = 234947; - t2.tv_sec = 1065356528; - t2.tv_usec = 864316; - if (tv_diff_usec(t2, t1) != 157629369) { - printf("FAIL\n"); - printf(" tv_diff_usec: A\n"); - return 1; - } - /* 4B) see what happens if the tv_sec values are the same */ - t1.tv_sec = 1065356371; - t1.tv_usec = 234947; - t2.tv_sec = 1065356371; - t2.tv_usec = 864316; - if (tv_diff_usec(t2, t1) != 629369) { - printf("FAIL\n"); - printf(" tv_diff_usec: B\n"); - return 1; - } - /* 4C) close values on a second boundary */ - t1.tv_sec = 1065356371; - t1.tv_usec = 999999; - t2.tv_sec = 1065356372; - t2.tv_usec = 000000; - if (tv_diff_usec(t2, t1) != 1) { - printf("FAIL\n"); - printf(" tv_diff_usec: B\n"); - return 1; - } + /* Test 4: check that tv_diff_usec() works... */ + /* 4A) normal operation */ + t1.tv_sec = 1065356371; + t1.tv_usec = 234947; + t2.tv_sec = 1065356528; + t2.tv_usec = 864316; + if (tv_diff_usec(t2, t1) != 157629369) { + printf("FAIL\n"); + printf(" tv_diff_usec: A\n"); + return 1; + } + /* 4B) see what happens if the tv_sec values are the same */ + t1.tv_sec = 1065356371; + t1.tv_usec = 234947; + t2.tv_sec = 1065356371; + t2.tv_usec = 864316; + if (tv_diff_usec(t2, t1) != 629369) { + printf("FAIL\n"); + printf(" tv_diff_usec: B\n"); + return 1; + } + /* 4C) close values on a second boundary */ + t1.tv_sec = 1065356371; + t1.tv_usec = 999999; + t2.tv_sec = 1065356372; + t2.tv_usec = 000000; + if (tv_diff_usec(t2, t1) != 1) { + printf("FAIL\n"); + printf(" tv_diff_usec: B\n"); + return 1; + } - /* Test 5: check that get_local_mediatime() works... */ - m1 = get_local_mediatime(); - usleep(250000); /* Sleep for a minimum of 250ms */ - m2 = get_local_mediatime(); - if (m2 - m1 < 22500) { - printf("FAIL\n"); - printf(" get_local_mediatime() runs fast\n"); - return 1; - } - m3 = get_local_mediatime(); - if (m3 < m2) { - printf("FAIL\n"); - printf(" get_local_mediatime() time runs backwards\n"); - return 1; - } + /* Test 5: check that get_local_mediatime() works... */ + m1 = get_local_mediatime(); + usleep(250000); /* Sleep for a minimum of 250ms */ + m2 = get_local_mediatime(); + if (m2 - m1 < 22500) { + printf("FAIL\n"); + printf(" get_local_mediatime() runs fast\n"); + return 1; + } + m3 = get_local_mediatime(); + if (m3 < m2) { + printf("FAIL\n"); + printf(" get_local_mediatime() time runs backwards\n"); + return 1; + } - printf("Ok\n"); - return 0; + printf("Ok\n"); + return 0; } - diff --git a/ultragrid/test/test_video_capture.c b/ultragrid/test/test_video_capture.c index 1a820fabe..8c6b077b7 100644 --- a/ultragrid/test/test_video_capture.c +++ b/ultragrid/test/test_video_capture.c @@ -44,27 +44,26 @@ #include "video_capture.h" #include "test_video_capture.h" -int -test_video_capture(void) +int test_video_capture(void) { - struct vidcap_type *vt; - int i; - - printf("Testing video capture device detection ................................... "); - if (vidcap_init_devices() != 0) { - printf("FAIL\n"); - printf(" Cannot probe video capture devices\n"); - return 1; - } - printf("Ok\n"); + struct vidcap_type *vt; + int i; - for (i = 0; i < vidcap_get_device_count(); i++) { - vt = vidcap_get_device_details(i); - printf(" \"%s\"\n", vt->name); - printf(" description: %s\n", vt->description); - printf(" image size : %dx%d\n", vt->width, vt->height); - } - vidcap_free_devices(); - return 0; + printf + ("Testing video capture device detection ................................... "); + if (vidcap_init_devices() != 0) { + printf("FAIL\n"); + printf(" Cannot probe video capture devices\n"); + return 1; + } + printf("Ok\n"); + + for (i = 0; i < vidcap_get_device_count(); i++) { + vt = vidcap_get_device_details(i); + printf(" \"%s\"\n", vt->name); + printf(" description: %s\n", vt->description); + printf(" image size : %dx%d\n", vt->width, vt->height); + } + vidcap_free_devices(); + return 0; } - diff --git a/ultragrid/test/test_video_display.c b/ultragrid/test/test_video_display.c index 2a06396b3..f366d49cf 100644 --- a/ultragrid/test/test_video_display.c +++ b/ultragrid/test/test_video_display.c @@ -44,60 +44,68 @@ #include "video_display.h" #include "test_video_display.h" -int -test_video_display(void) +int test_video_display(void) { - display_type_t *dt; - int i; - unsigned int j; - int argc = 0; - char *argv[1]; + display_type_t *dt; + int i; + unsigned int j; + int argc = 0; + char *argv[1]; - argv[0] = "run_tests"; - - printf("Testing video hardware detection ......................................... "); - if (display_init_devices() != 0) { - printf("FAIL\n"); - printf(" Cannot probe video devices\n"); - return 1; - } - printf("Ok\n"); + argv[0] = "run_tests"; - for (i = 0; i < display_get_device_count(); i++) { - dt = display_get_device_details(i); - printf(" \"%s\"\n", dt->name); - printf(" description: %s\n", dt->description); - printf(" formats :"); - for (j = 0; j < dt->num_formats; j++) { - switch (dt->formats[j].size) { - case DS_176x144 : printf(" QCIF"); - break; - case DS_352x288 : printf(" CIF"); - break; - case DS_702x576 : printf(" SCIF"); - break; - case DS_1920x1080 : printf(" 1080i"); - break; - case DS_1280x720 : printf(" 720p"); - break; - case DS_NONE : printf(" NONE"); - continue; - } - switch (dt->formats[j].colour_mode) { - case DC_YUV : printf("/YUV"); - break; - case DC_RGB : printf("/RGB"); - break; - case DC_NONE : printf("/NONE"); - break; - } - if (dt->formats[j].num_images != -1) { - printf("/%d", dt->formats[j].num_images); - } - } - printf("\n"); - } - display_free_devices(); - return 0; + printf + ("Testing video hardware detection ......................................... "); + if (display_init_devices() != 0) { + printf("FAIL\n"); + printf(" Cannot probe video devices\n"); + return 1; + } + printf("Ok\n"); + + for (i = 0; i < display_get_device_count(); i++) { + dt = display_get_device_details(i); + printf(" \"%s\"\n", dt->name); + printf(" description: %s\n", dt->description); + printf(" formats :"); + for (j = 0; j < dt->num_formats; j++) { + switch (dt->formats[j].size) { + case DS_176x144: + printf(" QCIF"); + break; + case DS_352x288: + printf(" CIF"); + break; + case DS_702x576: + printf(" SCIF"); + break; + case DS_1920x1080: + printf(" 1080i"); + break; + case DS_1280x720: + printf(" 720p"); + break; + case DS_NONE: + printf(" NONE"); + continue; + } + switch (dt->formats[j].colour_mode) { + case DC_YUV: + printf("/YUV"); + break; + case DC_RGB: + printf("/RGB"); + break; + case DC_NONE: + printf("/NONE"); + break; + } + if (dt->formats[j].num_images != -1) { + printf("/%d", dt->formats[j].num_images); + } + } + printf("\n"); + } + display_free_devices(); + return 0; } -