From 48b768db44cb9e00adfead71b973074685cec417 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 20 Sep 2005 19:39:49 +0000 Subject: *** empty log message *** --- src/Makefile.am | 2 + src/audio_encoder.cc | 127 ++++++++++++++++++++++++++++++++++++++++++++++ src/audio_encoder.h | 69 +++++++++++++++++++++++++ src/dvfile.cc | 9 +++- src/file.cc | 116 ++++++++++++++++++++++++++++++++++++++++++ src/file.h | 10 ++++ src/info_simple.cc | 94 ++++++++++++++++++++++++++++++++++ src/info_simple.h | 45 ++++++++++++++++ src/iso11172-1.h | 12 +++++ src/liblame_wrapper.cc | 19 ++++--- src/liblame_wrapper.h | 2 +- src/mov_encoder.cc | 7 +-- src/mov_encoder_thread.cc | 65 +++++------------------- src/multiplexer.cc | 115 ++++++++--------------------------------- src/server.cc | 4 +- src/util.cc | 11 ++++ src/util.h | 2 +- 17 files changed, 542 insertions(+), 167 deletions(-) create mode 100644 src/audio_encoder.cc create mode 100644 src/audio_encoder.h create mode 100644 src/info_simple.cc create mode 100644 src/info_simple.h diff --git a/src/Makefile.am b/src/Makefile.am index 38bc2d5..c7e6a7d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,6 +22,7 @@ miav_SOURCES = $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; fi ) \ info.cc \ info_console.cc \ info_gui.cc \ + info_simple.cc \ jpeg_mem_dest.cc \ libfame_wrapper.cc \ liblame_wrapper.cc \ @@ -63,6 +64,7 @@ EXTRA_DIST = \ info.h \ info_console.h \ info_gui.h \ + info_simple.h \ iso11172-1.h \ iso11172-2.h \ iso11172-3.h \ diff --git a/src/audio_encoder.cc b/src/audio_encoder.cc new file mode 100644 index 0000000..6bebe0c --- /dev/null +++ b/src/audio_encoder.cc @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * audio_encoder.cc + * + * Sat Sep 17 18:38:45 CEST 2005 + * Copyright 2005 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of MIaV. + * + * MIaV is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MIaV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MIaV; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "config.h" +#include "audio_encoder.h" +#include "util.h" + +AudioEncoder::AudioEncoder(FramePriorityQueue *in, pthread_mutex_t *in_mutex, sem_t *in_sem, + FramePriorityQueue *out, pthread_mutex_t *out_mutex, sem_t *out_sem, + Info *i) +{ + info = i; + info->info("AudioEncoder"); + + running = true; + + // Queues + inputqueue = in; + outputqueue = out; + + // Queue mutexes + input_mutex = in_mutex; + output_mutex = out_mutex; + + input_sem = in_sem; + output_sem = out_sem; + + frame_number = 0; +} + +AudioEncoder::~AudioEncoder() +{ +} + +void AudioEncoder::thread_main() +{ + info->info("AudioEncoder::run"); + + unsigned int queuesize = 0; + + // Run with slightly lower priority than MovEncoderWriter + nice(2); + + Frame *in_frame = NULL; + Frame *out_frame = NULL; + Frame *tmpframe; + + LibLAMEWrapper lame(info); + + while(running) { + sem_wait(input_sem); + + // If no frame is in the buffer, get one from the queue + while( in_frame == NULL ) { + + // sem_wait(input_sem); + + // Lock output mutex + pthread_mutex_lock( input_mutex ); + tmpframe = inputqueue->top(); + + if(tmpframe && tmpframe->number == frame_number) { + inputqueue->pop(); + queuesize = inputqueue->size(); + in_frame = tmpframe; + frame_number++; + } + + pthread_mutex_unlock( input_mutex ); + // Unlock output mutex + + sleep_1_frame(); + } + + // Check for end of stream + if(in_frame->endOfFrameStream == true) { + info->info("endOfFrameStream in AudioEncoder"); + running = false; + out_frame = lame.close(); + } else { + // Encode audio + out_frame = lame.encode(in_frame); + } + out_frame->number = in_frame->number; + out_frame->endOfFrameStream = in_frame->endOfFrameStream; + + delete in_frame; + in_frame = NULL; + + // Lock output mutex + pthread_mutex_lock(output_mutex); + outputqueue->push(out_frame); + pthread_mutex_unlock(output_mutex); + // Unlock output mutex + + // Kick multiplexer (audio) + sem_post(output_sem); + } + + // Kick multiplexer (audio) + sem_post(output_sem); + + info->info("AudioEncoder::stop"); +} diff --git a/src/audio_encoder.h b/src/audio_encoder.h new file mode 100644 index 0000000..b15ce45 --- /dev/null +++ b/src/audio_encoder.h @@ -0,0 +1,69 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * audio_encoder.h + * + * Sat Sep 17 18:38:45 CEST 2005 + * Copyright 2005 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of MIaV. + * + * MIaV is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MIaV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MIaV; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "config.h" +#ifndef __MIAV_AUDIO_ENCODER_H__ +#define __MIAV_AUDIO_ENCODER_H__ + +#include "frame.h" +#include "util.h" + +#include "thread.h" +#include + +#include "info.h" + +#include "liblame_wrapper.h" + +class AudioEncoder : public Thread { +public: + AudioEncoder(FramePriorityQueue *in, pthread_mutex_t *in_mutex, sem_t *in_sem, + FramePriorityQueue *out, pthread_mutex_t *out_mutex, sem_t *out_sem, + Info *info); + ~AudioEncoder(); + + void thread_main(); + + volatile bool running; + +private: + unsigned int frame_number; + + Info *info; + + // Input/Output queues + FramePriorityQueue *inputqueue; + FramePriorityQueue *outputqueue; + pthread_mutex_t *input_mutex; + pthread_mutex_t *output_mutex; + + //thread stuff + sem_t *input_sem; + sem_t *output_sem; +}; + + +#endif/*__MIAV_AUDIO_ENCODER_H__*/ diff --git a/src/dvfile.cc b/src/dvfile.cc index a0dccf3..7eab867 100644 --- a/src/dvfile.cc +++ b/src/dvfile.cc @@ -35,6 +35,7 @@ dvfile::dvfile(Info* i) { info = i; fp = fopen(TEST_MOVIE, "r"); + if(!fp) info->error("Couldn't open %s for reading.", TEST_MOVIE); } dvfile::~dvfile() @@ -51,8 +52,12 @@ unsigned char *dvfile::readFrame() ts.tv_nsec = 1000000000L / 25L; // 1/25s nanosleep(&ts, NULL); - while(fread(frame, DVPACKAGE_SIZE, 1, fp) == 0) { - fseek(fp, 0L, SEEK_SET); + if(fp) { + while(fread(frame, DVPACKAGE_SIZE, 1, fp) == 0) { + fseek(fp, 0L, SEEK_SET); + } + } else { + memset(frame, 0, sizeof(frame)); } return frame; diff --git a/src/file.cc b/src/file.cc index 50ed3f9..9188e6e 100644 --- a/src/file.cc +++ b/src/file.cc @@ -33,6 +33,9 @@ #include #include +// For ntoh* +#include + #include File::File(char *fn, char* ext, Info *i) @@ -124,6 +127,99 @@ int File::Write(void* data, int size) return w; } +int File::Write(char* data, int size) +{ + return Write((void*)data, size); +} + +int File::Write(unsigned long long int val) +{ + int res; + int written = 0; + unsigned long int *h_u = (unsigned long int *)&val; + unsigned long int *h_l = (unsigned long int *)(((char*)&val) + sizeof(unsigned long int)); + + *h_u = htonl(*h_u); + *h_l = htonl(*h_l); + + if((res = Write((void*)h_l, sizeof(*h_l))) < 0) { + return res; + } + written += res; + + if((res = Write((void*)h_u, sizeof(*h_u))) < 0) { + return res; + } + written += res; + + return written; +} + +int File::Write(long long int val) +{ + int res; + int written = 0; + unsigned long int *h_u = (unsigned long int *)&val; + unsigned long int *h_l = (unsigned long int *)(((char*)&val) + sizeof(unsigned long int)); + + *h_u = htonl(*h_u); + *h_l = htonl(*h_l); + + if((res = Write((void*)h_l, sizeof(*h_l))) < 0) { + return res; + } + written += res; + + if((res = Write((void*)h_u, sizeof(*h_u))) < 0) { + return res; + } + written += res; + + return written; +} + +int File::Write(long int val) +{ + val = htonl(val); + + return Write((char*)&val, sizeof(val)); +} + +int File::Write(unsigned long int val) +{ + val = htonl(val); + + return Write((char*)&val, sizeof(val)); +} + +int File::Write(int val) +{ + val = htonl(val); + + return Write((char*)&val, sizeof(val)); +} + +int File::Write(unsigned int val) +{ + val = htonl(val); + + return Write((char*)&val, sizeof(val)); +} + +int File::Write(short int val) +{ + val = htons(val); + + return Write((char*)&val, sizeof(val)); +} + +int File::Write(unsigned short int val) +{ + val = htons(val); + + return Write((char*)&val, sizeof(val)); +} + int File::createPath(char* path) { // struct stat stats; @@ -148,3 +244,23 @@ int File::createPath(char* path) return 0; } + +#ifdef __TEST_FILE +#include "info_simple.h" + +int main(int argc, char *argv[]) { + if(argc < 3) { + fprintf(stderr, "usage:\n\ttest_file [filename] [extension]\n"); + return 1; + } + + + InfoSimple info; + File file(argv[1], argv[2], &info); + + unsigned int val = 0x01234567; + file.Write(val); + +} + +#endif/* __TEST_FILE*/ diff --git a/src/file.h b/src/file.h index c7f01c0..561a39f 100644 --- a/src/file.h +++ b/src/file.h @@ -40,6 +40,16 @@ public: ~File(); int Write(void* data, int size); + int Write(char* data, int size); + + int Write(unsigned long long int val); + int Write(long long int val); + int Write(long int val); + int Write(unsigned long int val); + int Write(int val); + int Write(unsigned int val); + int Write(short int val); + int Write(unsigned short int val); private: Info* info; diff --git a/src/info_simple.cc b/src/info_simple.cc new file mode 100644 index 0000000..a3db393 --- /dev/null +++ b/src/info_simple.cc @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * info_simple.cc + * + * Tue Sep 20 17:00:25 CEST 2005 + * Copyright 2005 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of MIaV. + * + * MIaV is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MIaV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MIaV; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "config.h" +#include "info_simple.h" + +#include +#include + +InfoSimple::InfoSimple(): Info() +{ +} + +InfoSimple::~InfoSimple() +{ + pthread_mutex_destroy(&mutex); +} + +void InfoSimple::error(char *fmt, ...) +{ + char buf[1024]; + + pthread_mutex_lock(&mutex); + // Beginning of safezone + + va_list argp; + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + + // End of safezone + pthread_mutex_unlock(&mutex); + + fprintf(stderr, "Error: %s\n", buf); +} + +void InfoSimple::warn(char *fmt, ...) +{ + char buf[1024]; + + pthread_mutex_lock(&mutex); + // Beginning of safezone + + va_list argp; + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + + // End of safezone + pthread_mutex_unlock(&mutex); + + fprintf(stderr, "Warning: %s\n", buf); +} + +void InfoSimple::info(char *fmt, ...) +{ + char buf[1024]; + + pthread_mutex_lock(&mutex); + // Beginning of safezone + + va_list argp; + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + + // End of safezone + pthread_mutex_unlock(&mutex); + + fprintf(stderr, "Info: %s\n", buf); +} diff --git a/src/info_simple.h b/src/info_simple.h new file mode 100644 index 0000000..302a371 --- /dev/null +++ b/src/info_simple.h @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * info_simple.h + * + * Tue Sep 20 17:00:25 CEST 2005 + * Copyright 2005 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of MIaV. + * + * MIaV is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MIaV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MIaV; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "config.h" +#ifndef __MIAV_INFO_SIMPLE_H__ +#define __MIAV_INFO_SIMPLE_H__ + +#include "info.h" + +class InfoSimple: public Info { +public: + InfoSimple(); + ~InfoSimple(); + + void error(char* fmt, ...); + void warn(char* fmt, ...); + void info(char* fmt, ...); + +private: +}; + +#endif/*__MIAV_INFO_SIMPLE_H__*/ diff --git a/src/iso11172-1.h b/src/iso11172-1.h index 6dda687..ee8f408 100644 --- a/src/iso11172-1.h +++ b/src/iso11172-1.h @@ -41,6 +41,18 @@ namespace ISO11172_1 { // Types //////////////////////////////////////////////////// // 64 bits (8 bytes) + typedef struct { + unsigned long long int marker_bit3:1; + unsigned long long int system_clock_reference3:15; + unsigned long long int marker_bit2:1; + unsigned long long int system_clock_reference2:15; + unsigned long long int marker_bit1:1; + unsigned long long int system_clock_reference1:3; + unsigned long long int padding:4; + unsigned long long int stuffing_byte:8; + unsigned long long int packet_length:16; + } packet_header; + typedef struct { unsigned long long int marker_bit5:1; unsigned long long int mux_rate:22; diff --git a/src/liblame_wrapper.cc b/src/liblame_wrapper.cc index c72c2dc..b29acf9 100644 --- a/src/liblame_wrapper.cc +++ b/src/liblame_wrapper.cc @@ -94,22 +94,27 @@ LibLAMEWrapper::~LibLAMEWrapper() Frame *LibLAMEWrapper::close(Frame *oldframe) { - Frame *frame = new Frame(NULL, oldframe->size + 7200); - frame->number = oldframe->number; + Frame *frame; + unsigned int offset = 0; - memcpy(frame->data, oldframe->data, oldframe->size); + frame = new Frame(NULL, (int)(1.25 * SAMPLES + 7200) * 2); // Big enough to hold two frames + + if(oldframe) { + offset = oldframe->size; + frame->number = oldframe->number; + memcpy(frame->data, oldframe->data, oldframe->size); + delete oldframe; + } int flush; - flush = lame_encode_finish(gfp, frame->data + oldframe->size, 7200); + flush = lame_encode_finish(gfp, frame->data + offset, 7200); - frame->size = oldframe->size + flush; + frame->size = offset + flush; calc_bitrate += flush; frame->bitrate = (unsigned int)((double)calc_bitrate / (double)(frame_number)) * 25; - delete oldframe; - return frame; } diff --git a/src/liblame_wrapper.h b/src/liblame_wrapper.h index cf8e688..43518c8 100644 --- a/src/liblame_wrapper.h +++ b/src/liblame_wrapper.h @@ -52,7 +52,7 @@ public: Frame *encode(Frame *dvframe); - Frame *close(Frame *dvframe); + Frame *close(Frame *dvframe = NULL); private: unsigned long long calc_bitrate; diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index 3d30bbb..209362b 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -154,12 +154,7 @@ void MovEncoder::thread_main() delete item; item = NULL; - /* - test++; - if(test % (25 * 24) == 0) - info->info("Input pool size: %d, video output pool size: %d, audio output pool size: %d", - insize, v_outsize, a_outsize); - */ + // Kick reader sem_post(read_sem); } diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc index 59e3c84..dab308d 100644 --- a/src/mov_encoder_thread.cc +++ b/src/mov_encoder_thread.cc @@ -93,7 +93,7 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) frame_number = 0; } -#include +//#include MovEncoderThread::~MovEncoderThread() { info->info("~MovEncoderThread"); @@ -123,56 +123,6 @@ MovEncoderThread::~MovEncoderThread() info->info("Deleted the writer"); - /* - // These should not be deleted here... its done elsewhere. - // inputqueue = NULL; - - // sem_post(&video_out_sem); - // sem_post(&audio_out_sem); - - // Tell the encoding threads to stop. - for(int cnt = 0; cnt < threads; cnt++) { - encs[cnt]->running = false; - } - - // Kick them to initiate the exit. - for(int cnt = 0; cnt < threads; cnt++) { - sem_post(&in_sem); - } - - // They should be exited now, so we can delete them. - for(int cnt = 0; cnt < threads; cnt++) { - // Wait for it to stop - encs[cnt]->wait_stop(); - // Delete it - delete encs[cnt]; - } - - // Tell the audio encoder to stop - audioenc->running = false; - - // Kick it to make it stop. - sem_post(&audio_in_sem); - - // Wait for it to stop. - audioenc->wait_stop(); - - // delete the audio encoder - delete audioenc; - - // Tell the writer to stop - writer->running = false; - - // Kick it to make it stop. - sem_post(&video_out_sem); - sem_post(&audio_out_sem); - - // Wait for it to stop. - writer->wait_stop(); - - // delete the writer (end thereby close the file) - delete writer; - */ // Destroy the semaphores. sem_destroy(&in_sem); sem_destroy(&video_out_sem); @@ -180,12 +130,21 @@ MovEncoderThread::~MovEncoderThread() sem_destroy(&audio_out_sem); sem_destroy(&read_sem); - - info->info("MovEncoderThread done deinitializing."); + info->info("~MovEncoderThread::done"); } +static int output = 0; void MovEncoderThread::encode(Frame* frame) { + if(output % 250 == 0) // 25 * 24 + info->info("inputqueue: %d\tvideo_outputqueue: %d\taudio_inputqueue: %d\taudio_outputqueue: %d.", + inputqueue->size(), + video_outputqueue->size(), + audio_inputqueue->size(), + audio_outputqueue->size()); + output++; + + if(frame == NULL) { info->info("MovEncoderThread::encode - NULL frame detected."); // Terminate diff --git a/src/multiplexer.cc b/src/multiplexer.cc index 7f80345..d2aecfc 100644 --- a/src/multiplexer.cc +++ b/src/multiplexer.cc @@ -35,6 +35,12 @@ #define SIZEOF(x) (sizeof(x)-1) +#define MASK3 0x7 +#define MASK15 0x7FFF +#define TIMECODE32_30(x) ((x >> 30) & MASK3 ) +#define TIMECODE29_15(x) ((x >> 15) & MASK15) +#define TIMECODE14_0(x) ((x >> 0) & MASK15) + // Audio index lists /* static unsigned int frequency_index[4] = {44100, 48000, 32000, 0}; @@ -109,7 +115,6 @@ Frame *Multiplexer::getFrame(StreamType type) Frame *frame = NULL; sem_wait(sem[type]); - //if(*running) sem_wait(sem[type]); while( frame == NULL ) { // Lock output mutex @@ -126,7 +131,7 @@ Frame *Multiplexer::getFrame(StreamType type) pthread_mutex_unlock( mutex[type] ); // Unlock output mutex - sleep_1_frame(); + sleep_0_2_frame(); } return frame; } @@ -188,12 +193,15 @@ bool Multiplexer::packet(StreamType type) break; } - unsigned short int hton_framesize = framesize + 1; // Need space for dims too! - hton_framesize = htons(hton_framesize); - file->Write((char*)&hton_framesize, sizeof(hton_framesize)); - - char dims[] = "\x0F"; - file->Write(dims, 1); + ISO11172_1::packet_header header; + header.marker_bit1 = header.marker_bit2 = header.marker_bit3 = 1; + header.padding = 0x2; // Must be 2 + header.stuffing_byte = 0xFF; + header.packet_length = framesize + sizeof(ISO11172_1::packet_header) - sizeof(short); + header.system_clock_reference1 = TIMECODE32_30(SCR); + header.system_clock_reference2 = TIMECODE29_15(SCR); + header.system_clock_reference3 = TIMECODE14_0(SCR); + file->Write(*((unsigned long long int*)&header)); file->Write(buf, framesize); @@ -252,8 +260,6 @@ void Multiplexer::system_header() file->Write((void*)ISO11172_1::system_header_start_code, SIZEOF(ISO11172_1::system_header_start_code)); ISO11172_1::system_header header; - unsigned long int *h_u = (unsigned long int *)&header; - unsigned long int *h_l = (unsigned long int *)(((char*)&header) + sizeof(unsigned int)); header.marker_bit1 = header.marker_bit2 = header.marker_bit3 = 1; @@ -268,97 +274,23 @@ void Multiplexer::system_header() header.system_video_clock_flag = 1; // FIXME: What excactly is this?? header.video_bound = 1; // Only 1 video stream header.reserved_byte = 0xFF; // Must be 0xFF - - *h_u = htonl(*h_u); - *h_l = htonl(*h_l); - - file->Write((char*)h_l, sizeof(*h_l)); - file->Write((char*)h_u, sizeof(*h_u)); + file->Write(*((unsigned long long int*)&header)); - unsigned int *d; - ISO11172_1::stream_description audio_stream_description; audio_stream_description.stream_id = 0xC0; audio_stream_description.market_bits = 0x3; audio_stream_description.STD_buffer_bound_scale = 0; // Must be 0 for audio streams audio_stream_description.STD_buffer_size_bound = 32; // Buffer must be 32 * 128 bytes - - d = (unsigned int*)&audio_stream_description; - *d = htonl(*d); - file->Write((char*)d, sizeof(*d)); + file->Write(*((unsigned long int*)&audio_stream_description)); ISO11172_1::stream_description video_stream_description; video_stream_description.stream_id = 0xE3; video_stream_description.market_bits = 0x3; video_stream_description.STD_buffer_bound_scale = 1; // Must be 1 for video streams video_stream_description.STD_buffer_size_bound = 46; // Buffer must be 32 * 1024 bytes - - d = (unsigned int*)&video_stream_description; - *d = htonl(*d); - file->Write((char*)d, sizeof(*d)); - - /* // old code! - // header_length (16 bits) - char system_header_length[] = "\x00\x0C"; - file->Write(system_header_length, SIZEOF(system_header_length)); - - // marker_bit (1 bit) \. - // rate_bound (22 bits) ) (24 bits) - // marker_bit (1 bit) / - char rate_bound[] = "\x80\x1B\x83"; - file->Write(rate_bound, SIZEOF(rate_bound)); - - // audio_bound (6 bits) \. - // fixed_flag (1 bit) ) (8 bits) - // CSPS_flag (1 bit) / - char audio_bound[] = "\x06"; // One audio stream, fixed bitrate and not iso costraint compliant - file->Write(audio_bound, SIZEOF(audio_bound)); - - // system_audio_lock_flag (1 bit) \. - // system_video_lock_flag (1 bit) \. - // marker_bit (1 bit) ) (8 bits) - // video_bound (5 bits) _/ - char video_bound[] = "\x21"; // Audio and Video are not locked and there are only one video stream - file->Write(video_bound, SIZEOF(video_bound)); - - // reserved_byte (8 bit) - char reserved_byte[] = "\xFF"; - file->Write(reserved_byte, SIZEOF(reserved_byte)); - */ - - /* - { // Audio - // stream_id (8 bit) - char stream_id[] = "\xC0"; - file->Write(stream_id, SIZEOF(stream_id)); - - // '11' (2 bits) \. - // STD_buffer_bound_scale (1 bit) ) (24 bits) - // STD_buffer_size_bound (13 bits) / - char reserved_byte[] = "\xC0\x20"; - file->Write(reserved_byte, SIZEOF(reserved_byte)); - } - - { // Video - // stream_id (8 bit) - char stream_id[] = "\xE3"; - file->Write(stream_id, SIZEOF(stream_id)); - - // '11' (2 bits) \. - // STD_buffer_bound_scale (1 bit) ) (24 bits) - // STD_buffer_size_bound (13 bits) / - char reserved_byte[] = "\xE0\x2E"; - file->Write(reserved_byte, SIZEOF(reserved_byte)); - } - */ + file->Write(*((unsigned long int*)&video_stream_description)); } -#define MASK3 0x7 -#define MASK15 0x7FFF -#define TIMECODE32_30(x) ((x >> 30) & MASK3 ) -#define TIMECODE29_15(x) ((x >> 15) & MASK15) -#define TIMECODE14_0(x) ((x >> 0) & MASK15) - /** * Create and write a pack */ @@ -416,14 +348,7 @@ bool Multiplexer::pack() (unsigned long long int)header.system_clock_reference3 ); */ - unsigned int *hton_header_u = (unsigned int *)&header; - unsigned int *hton_header_l = (unsigned int *)(((char*)&header) + sizeof(unsigned int)); - - *hton_header_l = htonl(*hton_header_l); - *hton_header_u = htonl(*hton_header_u); - - file->Write((char*)hton_header_u, sizeof(*hton_header_u)); - file->Write((char*)hton_header_l, sizeof(*hton_header_l)); + file->Write(*((unsigned long long int*)&header)); if(write_system_header % SYSTEM_HEADER_FREQUENCY == 0) system_header(); // Count this up here, we want a system header in pack 0, 5, ... NOT 4, 9, ... diff --git a/src/server.cc b/src/server.cc index 6d4d26b..4d556fc 100644 --- a/src/server.cc +++ b/src/server.cc @@ -68,6 +68,7 @@ void newConnection(Socket *socket, Info *info) frame = new Frame(NULL, DVPACKAGE_SIZE); + info->info("CONNECTION OPENED"); info->info("New connection (%s)", inet_ntoa(socket->socketaddr.sin_addr)); Network network = Network(socket, info); @@ -125,6 +126,5 @@ void newConnection(Socket *socket, Info *info) if(enc) delete enc; - info->info("Connection closed"); - + info->info("CONNECTION CLOSED"); } diff --git a/src/util.cc b/src/util.cc index b9d57ad..11f1402 100644 --- a/src/util.cc +++ b/src/util.cc @@ -82,3 +82,14 @@ void sleep_1_frame() ts.tv_nsec = 1000000000L / 25L; // 1000ms / 25 nanosleep(&ts, NULL); } + +void sleep_0_2_frame() +{ + // Sleep 1/25th of a second + + struct timespec ts; + + ts.tv_sec = 0; + ts.tv_nsec = 8000000L;//1000000000L / 25L * 0.2; // 1000ms / 25 + nanosleep(&ts, NULL); +} diff --git a/src/util.h b/src/util.h index 39ded7f..ef21e06 100644 --- a/src/util.h +++ b/src/util.h @@ -46,7 +46,7 @@ void *xmalloc(size_t s); void *xrealloc(void *b, size_t s); void sleep_1_frame(); - +void sleep_0_2_frame(); //#ifdef __cplusplus //} //#endif -- cgit v1.2.3