diff options
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/audio_encoder.cc | 127 | ||||
| -rw-r--r-- | src/audio_encoder.h | 69 | ||||
| -rw-r--r-- | src/dvfile.cc | 9 | ||||
| -rw-r--r-- | src/file.cc | 116 | ||||
| -rw-r--r-- | src/file.h | 10 | ||||
| -rw-r--r-- | src/info_simple.cc | 94 | ||||
| -rw-r--r-- | src/info_simple.h | 45 | ||||
| -rw-r--r-- | src/iso11172-1.h | 12 | ||||
| -rw-r--r-- | src/liblame_wrapper.cc | 19 | ||||
| -rw-r--r-- | src/liblame_wrapper.h | 2 | ||||
| -rw-r--r-- | src/mov_encoder.cc | 7 | ||||
| -rw-r--r-- | src/mov_encoder_thread.cc | 65 | ||||
| -rw-r--r-- | src/multiplexer.cc | 115 | ||||
| -rw-r--r-- | src/server.cc | 4 | ||||
| -rw-r--r-- | src/util.cc | 11 | ||||
| -rw-r--r-- | src/util.h | 2 | 
17 files changed, 542 insertions, 167 deletions
| 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 <pthread.h> + +#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 <string.h>  #include <unistd.h> +// For ntoh* +#include <netinet/in.h> +  #include <stdlib.h>  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*/ @@ -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 <stdio.h> +#include <stdarg.h> + +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 @@ -42,6 +42,18 @@ namespace ISO11172_1 {    ////////////////////////////////////////////////////    // 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;      unsigned long long int marker_bit4:1; 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 <unistd.h> +//#include <unistd.h>  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); +} @@ -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 | 
