diff options
Diffstat (limited to 'recordmydesktop/src/skeleton.c')
-rw-r--r-- | recordmydesktop/src/skeleton.c | 296 |
1 files changed, 0 insertions, 296 deletions
diff --git a/recordmydesktop/src/skeleton.c b/recordmydesktop/src/skeleton.c deleted file mode 100644 index 77567db..0000000 --- a/recordmydesktop/src/skeleton.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * skeleton.c - * author: Tahseen Mohammad - */ - -/* This file depends on WORDS_BIGENDIAN being defined to 1 if the host - * processor stores words with the most significant byte first (like Motorola - * and SPARC, unlike Intel and VAX). - * On little endian systems, WORDS_BIGENDIAN should be undefined. - * - * When using GNU Autotools, the correct value will be written into config.h - * if the autoconf macro AC_C_BIGENDIAN is called in configure.ac. - */ -#include "config.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include <ogg/ogg.h> - -#include "skeleton.h" - -#ifdef WIN32 -#define snprintf _snprintf -#endif - -static unsigned short -_le_16 (unsigned short s) -{ - unsigned short ret=s; -#ifdef WORDS_BIGENDIAN - ret = (s>>8) & 0x00ffU; - ret += (s<<8) & 0xff00U; -#endif - return ret; -} - -static ogg_uint32_t -_le_32 (ogg_uint32_t i) -{ - ogg_uint32_t ret=i; -#ifdef WORDS_BIGENDIAN - ret = (i>>24); - ret += (i>>8) & 0x0000ff00; - ret += (i<<8) & 0x00ff0000; - ret += (i<<24); -#endif - return ret; -} - -static ogg_int64_t -_le_64 (ogg_int64_t l) -{ - ogg_int64_t ret=l; - unsigned char *ucptr = (unsigned char *)&ret; -#ifdef WORDS_BIGENDIAN - unsigned char temp; - - temp = ucptr [0] ; - ucptr [0] = ucptr [7] ; - ucptr [7] = temp ; - - temp = ucptr [1] ; - ucptr [1] = ucptr [6] ; - ucptr [6] = temp ; - - temp = ucptr [2] ; - ucptr [2] = ucptr [5] ; - ucptr [5] = temp ; - - temp = ucptr [3] ; - ucptr [3] = ucptr [4] ; - ucptr [4] = temp ; - -#endif - return (*(ogg_int64_t *)ucptr); -} - -/* write an ogg_page to a file pointer */ -int write_ogg_page_to_file(ogg_page *og, FILE *out) { - int written; - - written = fwrite(og->header,1, og->header_len, out); - if (written > 0) - written += fwrite(og->body,1, og->body_len, out); - - return written; -} - -int add_message_header_field(fisbone_packet *fp, - char *header_key, - char *header_value) { - - /* size of both key and value + ': ' + CRLF */ - int this_message_size = strlen(header_key) + strlen(header_value) + 4; - if (fp->message_header_fields == NULL) { - fp->message_header_fields = _ogg_calloc(this_message_size+1, sizeof(char)); - } else { - int new_size = (fp->current_header_size + this_message_size+1) * sizeof(char); - fp->message_header_fields = _ogg_realloc(fp->message_header_fields, new_size); - } - snprintf(fp->message_header_fields + fp->current_header_size, - this_message_size+1, - "%s: %s\r\n", - header_key, - header_value); - fp->current_header_size += this_message_size; - - return 0; -} - -/* create a ogg_packet from a fishead_packet structure */ -int ogg_from_fishead(fishead_packet *fp,ogg_packet *op) { - - if (!fp || !op) return -1; - - memset(op, 0, sizeof(*op)); - op->packet = _ogg_calloc(FISHEAD_SIZE, sizeof(unsigned char)); - if (!op->packet) return -1; - - memset(op->packet, 0, FISHEAD_SIZE); - - memcpy (op->packet, FISHEAD_IDENTIFIER, 8); /* identifier */ - *((ogg_uint16_t*)(op->packet+8)) = _le_16 (SKELETON_VERSION_MAJOR); /* version major */ - *((ogg_uint16_t*)(op->packet+10)) = _le_16 (SKELETON_VERSION_MINOR); /* version minor */ - *((ogg_int64_t*)(op->packet+12)) = _le_64 (fp->ptime_n); /* presentationtime numerator */ - *((ogg_int64_t*)(op->packet+20)) = _le_64 (fp->ptime_d); /* presentationtime denominator */ - *((ogg_int64_t*)(op->packet+28)) = _le_64 (fp->btime_n); /* basetime numerator */ - *((ogg_int64_t*)(op->packet+36)) = _le_64 (fp->btime_d); /* basetime denominator */ - /* TODO: UTC time, set to zero for now */ - - op->b_o_s = 1; /* its the first packet of the stream */ - op->e_o_s = 0; /* its not the last packet of the stream */ - op->bytes = FISHEAD_SIZE; /* length of the packet in bytes */ - - return 0; -} - -/* create a ogg_packet from a fisbone_packet structure. - * call this method after the fisbone_packet is filled and all message header fields are added - * by calling add_message_header_field method. - */ -int ogg_from_fisbone(fisbone_packet *fp,ogg_packet *op) { - - int packet_size; - - if (!fp || !op) return -1; - - packet_size = FISBONE_SIZE + fp->current_header_size; - - memset (op, 0, sizeof (*op)); - op->packet = _ogg_calloc (packet_size, sizeof(unsigned char)); - if (!op->packet) return -1; - - memset (op->packet, 0, packet_size); - memcpy (op->packet, FISBONE_IDENTIFIER, 8); /* identifier */ - *((ogg_uint32_t*)(op->packet+8)) = _le_32 (FISBONE_MESSAGE_HEADER_OFFSET); /* offset of the message header fields */ - *((ogg_uint32_t*)(op->packet+12)) = _le_32 (fp->serial_no); /* serialno of the respective stream */ - *((ogg_uint32_t*)(op->packet+16)) = _le_32 (fp->nr_header_packet); /* number of header packets */ - *((ogg_int64_t*)(op->packet+20)) = _le_64 (fp->granule_rate_n); /* granulrate numerator */ - *((ogg_int64_t*)(op->packet+28)) = _le_64 (fp->granule_rate_d); /* granulrate denominator */ - *((ogg_int64_t*)(op->packet+36)) = _le_64 (fp->start_granule); /* start granule */ - *((ogg_uint32_t*)(op->packet+44)) = _le_32 (fp->preroll); /* preroll, for theora its 0 */ - *(op->packet+48) = fp->granule_shift; /* granule shift */ - if (fp->message_header_fields) - memcpy((op->packet+FISBONE_SIZE), fp->message_header_fields, fp->current_header_size); - - - op->b_o_s = 0; - op->e_o_s = 0; - op->bytes = packet_size; /* size of the packet in bytes */ - - return 0; -} - -/* fills up a fishead_packet from memory */ -static int fishead_from_data (const unsigned char * data, int len, fishead_packet *fp) { - if (!data) return -1; - - if (memcmp(data, FISHEAD_IDENTIFIER, 8)) - return -1; - - fp->version_major = _le_16 (*((ogg_uint16_t*)(data+8))); /* version major */ - fp->version_minor = _le_16 (*((ogg_uint16_t*)(data+10))); /* version minor */ - fp->ptime_n = _le_64 (*((ogg_int64_t*)(data+12))); /* presentationtime numerator */ - fp->ptime_d = _le_64 (*((ogg_int64_t*)(data+20))); /* presentationtime denominator */ - fp->btime_n = _le_64 (*((ogg_int64_t*)(data+28))); /* basetime numerator */ - fp->btime_d = _le_64 (*((ogg_int64_t*)(data+36))); /* basetime denominator */ - memcpy(fp->UTC, data+44, 20); - - return 0; -} - -/* fills up a fishead_packet from a fishead ogg_packet of a skeleton bistream */ -int fishead_from_ogg (ogg_packet *op, fishead_packet *fp) { - return fishead_from_data (op->packet, op->bytes, fp); -} - -/* fills up a fishead_packet from a fishead ogg_page of a skeleton bistream */ -int fishead_from_ogg_page (const ogg_page *og, fishead_packet *fp) { - return fishead_from_data (og->body, og->body_len, fp); -} - -/* fills up a fisbone_packet from memory */ -static int fisbone_from_data (const unsigned char * data, int len, fisbone_packet *fp) { - - if (!fp) return -1; - - if (memcmp(data, FISBONE_IDENTIFIER, 8)) - return -1; - - fp->serial_no = _le_32 (*((ogg_uint32_t*)(data+12))); /* serialno of the stream represented by this fisbone packet */ - fp->nr_header_packet = _le_32 (*((ogg_uint32_t*)(data+16))); /* number of header packets */ - fp->granule_rate_n = _le_64 (*((ogg_int64_t*)(data+20))); /* granulrate numerator */ - fp->granule_rate_d = _le_64 (*((ogg_int64_t*)(data+28))); /* granulrate denominator */ - fp->start_granule = _le_64 (*((ogg_int64_t*)(data+36))); /* start granule */ - fp->preroll = _le_32 (*((ogg_uint32_t*)(data+44))); /* preroll, for theora its 0 */ - fp->granule_shift = *(data+48); /* granule shift */ - fp->current_header_size = len - FISBONE_SIZE; - fp->message_header_fields = _ogg_calloc(fp->current_header_size+1, sizeof(char)); - if (!fp->message_header_fields) return -1; - memcpy(fp->message_header_fields, data+FISBONE_SIZE, fp->current_header_size); - - return 0; -} - -/* fills up a fisbone_packet from a fisbone ogg_packet of a skeleton bitstream */ -int fisbone_from_ogg (ogg_packet *op, fisbone_packet *fp) { - return fisbone_from_data (op->packet, op->bytes, fp); -} - -/* fills up a fisbone_packet from a fisbone ogg_page of a skeleton bistream */ -int fisbone_from_ogg_page (const ogg_page *og, fisbone_packet *fp) { - return fisbone_from_data (og->body, og->body_len, fp); -} - -int fisbone_clear(fisbone_packet *fp) -{ - if (!fp) return -1; - _ogg_free(fp->message_header_fields); - return 0; -} - -int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp) { - - ogg_packet op; - int ret; - - ret = ogg_from_fishead(fp, &op); - if (ret<0) return ret; - ogg_stream_packetin(os, &op); - _ogg_free(op.packet); - - return 0; -} - -int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp) { - - ogg_packet op; - int ret; - - ret = ogg_from_fisbone(fp, &op); - if (ret<0) return ret; - ogg_stream_packetin(os, &op); - _ogg_free(op.packet); - - return 0; -} - -int add_eos_packet_to_stream(ogg_stream_state *os) { - - ogg_packet op; - - memset (&op, 0, sizeof(op)); - op.e_o_s = 1; - ogg_stream_packetin(os, &op); - - return 0; -} - -int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out) { - - ogg_page og; - int result; - - while((result = ogg_stream_flush(os, &og))) - { - if(!result) break; - result = write_ogg_page_to_file(&og, out); - if(result != og.header_len + og.body_len) - return 1; - } - - return 0; -} |