diff options
| author | deva <deva> | 2005-07-07 12:42:19 +0000 | 
|---|---|---|
| committer | deva <deva> | 2005-07-07 12:42:19 +0000 | 
| commit | 88a21aa4560d0a1bfef3e706e3b460d6745b3977 (patch) | |
| tree | 02003cd3e45bb82d96db39389dff96a49ba48076 | |
| parent | 26f488caef0e88e1995b6141e17e3595a6cf34dc (diff) | |
*** empty log message ***
| -rw-r--r-- | src/liblame_wrapper.cc | 127 | ||||
| -rw-r--r-- | src/liblame_wrapper.h | 6 | ||||
| -rw-r--r-- | src/mov_encoder.cc | 16 | ||||
| -rw-r--r-- | src/mov_encoder_writer.cc | 153 | ||||
| -rw-r--r-- | src/mov_encoder_writer.h | 7 | 
5 files changed, 113 insertions, 196 deletions
| diff --git a/src/liblame_wrapper.cc b/src/liblame_wrapper.cc index 7af9b68..90b8824 100644 --- a/src/liblame_wrapper.cc +++ b/src/liblame_wrapper.cc @@ -31,6 +31,9 @@  /*   * $Log$ + * Revision 1.3  2005/07/07 12:42:19  deva + * *** empty log message *** + *   * Revision 1.2  2005/07/05 23:15:16  deva   * *** empty log message ***   * @@ -62,6 +65,18 @@ LibLAMEWrapper::LibLAMEWrapper(Info *i)  	lame_set_mode(gfp, STEREO);  	lame_set_brate(gfp, 192);    lame_set_strict_ISO(gfp, 1); +  lame_set_num_samples(gfp, SAMPLES); + +  lame_set_copyright(gfp, 0);       // is there a copyright on the encoded data? +  lame_set_original(gfp, 1);        // is the encoded data on the original media? +  lame_set_error_protection(gfp, 0);// add 2 byte CRC protection to each frame? +  lame_set_padding_type(gfp, PAD_NO); // PAD_NO, PAD_ALL, PAD_ADJUST, PAD_MAX_INDICATOR  +                                    // 0 = do not pad frames +                                    // 1 = always pad frames +                                    // 2 = adjust padding to satisfy bit rate +  lame_set_extension(gfp, 0);       // private extension bit + +  info->info("Lame version %d", lame_get_version(gfp));  	if (lame_init_params(gfp) < 0) {      info->error("LAME parameter initialization failed."); @@ -72,8 +87,6 @@ LibLAMEWrapper::LibLAMEWrapper(Info *i)    audio_buffer[0] = new int16_t[AUDIO_BUFFER_SIZE];    audio_buffer[1] = new int16_t[AUDIO_BUFFER_SIZE]; -  audio_buffer[2] = new int16_t[AUDIO_BUFFER_SIZE]; -  audio_buffer[3] = new int16_t[AUDIO_BUFFER_SIZE];    // And now for the dv decoder!    decoder = NULL; @@ -85,8 +98,6 @@ LibLAMEWrapper::~LibLAMEWrapper()    delete audio_buffer[0];    delete audio_buffer[1]; -  delete audio_buffer[2]; -  delete audio_buffer[3];  }  Frame *LibLAMEWrapper::encode(Frame *dvframe) @@ -104,66 +115,53 @@ Frame *LibLAMEWrapper::encode(Frame *dvframe)      decoder->num_dif_seqs = 12;    } -  // See -  // http://www.koders.com/cpp/fidE614E999154E2B4A813DA272C4421633063C78CA.aspx -  // line 769 -    /**     * Decode audio using libdv     */ -  //  int n, i; -  //  int16_t* s = ( int16_t * ) sound; -    dv_decode_full_audio( decoder, dvframe->data, audio_buffer ); -  /* -  memset(audio_buffer[0], 0, sizeof(audio_buffer[0])); -  memset(audio_buffer[1], 0, sizeof(audio_buffer[1])); -  */ -  /* -    for ( n = 0; n < SAMPLES; ++n ) -      for ( i = 0; i < CHANNELS; i++ ) -        *s++ = audio_buffer[ i ][ n ]; -    */ - -/* - * input pcm data, output (maybe) mp3 frames. - * This routine handles all buffering, resampling and filtering for you. - *  - * The required mp3buf_size can be computed from num_samples,  - * samplerate and encoding rate, but here is a worst case estimate: - * - * return code     number of bytes output in mp3buffer.  can be 0  - *                 if return code = -1:  mp3buffer was too small - * - * mp3buf_size in bytes = 1.25*num_samples + 7200 - * - * I think a tighter bound could be:  (mt, March 2000) - * MPEG1: - *    num_samples*(bitrate/8)/samplerate + 4*1152*(bitrate/8)/samplerate + 512 - * MPEG2: - *    num_samples*(bitrate/8)/samplerate + 4*576*(bitrate/8)/samplerate + 256 - * - * but test first if you use that! - * - * set mp3buf_size = 0 and LAME will not check if mp3buf_size is - * large enough. - * - * NOTE: - * if gfp->num_channels=2, but gfp->mode = 3 (mono), the L & R channels - * will be averaged into the L channel before encoding only the L channel - * This will overwrite the data in buffer_l[] and buffer_r[]. - *  -*/ +  /** +   * input pcm data, output (maybe) mp3 frames. +   * This routine handles all buffering, resampling and filtering for you. +   *  +   * The required mp3buf_size can be computed from num_samples,  +   * samplerate and encoding rate, but here is a worst case estimate: +   * +   * return code     number of bytes output in mp3buffer.  can be 0  +   *                 if return code = -1:  mp3buffer was too small +   * +   * mp3buf_size in bytes = 1.25*num_samples + 7200 +   * +   * I think a tighter bound could be:  (mt, March 2000) +   * MPEG1: +   *    num_samples*(bitrate/8)/samplerate + 4*1152*(bitrate/8)/samplerate + 512 +   * MPEG2: +   *    num_samples*(bitrate/8)/samplerate + 4*576*(bitrate/8)/samplerate + 256 +   * +   * but test first if you use that! +   * +   * set mp3buf_size = 0 and LAME will not check if mp3buf_size is +   * large enough. +   * +   * NOTE: +   * if gfp->num_channels=2, but gfp->mode = 3 (mono), the L & R channels +   * will be averaged into the L channel before encoding only the L channel +   * This will overwrite the data in buffer_l[] and buffer_r[]. +   *  +   */    Frame* audio_frame = new Frame(NULL, (int)(1.25 * SAMPLES + 7200)); -  const short int     *buffer_l = audio_buffer[0];   // PCM data for left channel -  const short int     *buffer_r = audio_buffer[1];   // PCM data for right channel +  const short int    *buffer_l = audio_buffer[0];   // PCM data for left channel +  const short int    *buffer_r = audio_buffer[1];   // PCM data for right channel    const int           nsamples = SAMPLES;      // number of samples per channel    unsigned char*      mp3buf = audio_frame->data;        // pointer to encoded MP3 stream    const int           mp3buf_size = audio_frame->size;   // number of valid octets in this -  int val = lame_encode_buffer(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3buf_size); +  int val; +  val = lame_encode_buffer(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3buf_size); +  // val = lame_encode_mp3_frame(gfp, buffer_l, buffer_r, mp3buf, mp3buf_size); +   +  info->info("Framenr: %d", lame_get_frameNum(gfp));    if(val < 0) {      switch(val) { @@ -185,29 +183,6 @@ Frame *LibLAMEWrapper::encode(Frame *dvframe)      }    } -  /* -  val = lame_encode_flush(gfp, mp3buf, val); - -  if(val < 0) { -    switch(val) { -    case -1:  // mp3buf was too small -      info->error("Lame encoding failed (during flush), mp3buf was too small."); -      break; -    case -2:  // malloc() problem -      info->error("Lame encoding failed (during flush), due to malloc() problem."); -      break; -    case -3:  // lame_init_params() not called -      info->error("Lame encoding failed (during flush), lame_init_params() not called."); -      break; -    case -4:  // psycho acoustic problems  -      info->error("Lame encoding failed (during flush), due to psycho acoustic problems."); -      break; -    default: -      info->error("Lame encoding failed (during flush), due to unknown error."); -      break; -    } -  } -  */    audio_frame->size = val;    return audio_frame; diff --git a/src/liblame_wrapper.h b/src/liblame_wrapper.h index f30cb9c..37af54c 100644 --- a/src/liblame_wrapper.h +++ b/src/liblame_wrapper.h @@ -31,6 +31,9 @@  /*   * $Log$ + * Revision 1.3  2005/07/07 12:42:19  deva + * *** empty log message *** + *   * Revision 1.2  2005/07/05 23:15:16  deva   * *** empty log message ***   * @@ -74,8 +77,7 @@ private:    // libdv stuff    dv_decoder_t *decoder; -  int16_t *audio_buffer[4]; - +  int16_t *audio_buffer[2];  };  #endif/*__MIAV_LIBLAME_WRAPPER_H__*/ diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index fa83830..f21cc3a 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -39,6 +39,9 @@  /*   * $Log$ + * Revision 1.35  2005/07/07 12:42:19  deva + * *** empty log message *** + *   * Revision 1.34  2005/07/05 23:15:16  deva   * *** empty log message ***   * @@ -189,12 +192,11 @@ void MovEncoder::thread_main()    Frame *out_a_frame;    LibFAMEWrapper fame(info); +  LibLAMEWrapper lame(info);    while(running) {      sem_wait(input_sem); -    LibLAMEWrapper lame(info); -      // Lock inout mutex      pthread_mutex_lock(input_mutex);      item = inputqueue->front(); @@ -211,17 +213,19 @@ void MovEncoder::thread_main()          // Encode video          out_v_frame = fame.encode(in_frame); -        out_v_frame->number = in_frame->number+1; -         +        out_v_frame->number = in_frame->number; +          // Encode audio          out_a_frame = lame.encode(in_frame); -        out_a_frame->number = in_frame->number; - +        out_a_frame->number = in_frame->number + 1; +                  delete in_frame;          // Lock output mutex          pthread_mutex_lock(output_mutex); +          outputqueue->push(out_v_frame); +          outputqueue->push(out_a_frame);          outsize = outputqueue->size(); diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc index 7f982de..6e251f8 100644 --- a/src/mov_encoder_writer.cc +++ b/src/mov_encoder_writer.cc @@ -31,6 +31,9 @@  /*   * $Log$ + * Revision 1.10  2005/07/07 12:42:19  deva + * *** empty log message *** + *   * Revision 1.9  2005/07/05 23:15:16  deva   * *** empty log message ***   * @@ -155,7 +158,13 @@ void MovEncoderWriter::thread_main()        int ret = 0; -      ret = file->Write(frame->data, frame->size); +      /* +      if(frame->number%2 == 1) write_video_header((unsigned short int)frame->size); +      else write_audio_header((unsigned short int)frame->size); +      */ +      //      if(frame->number%2 == 1) write_audio_header((unsigned short int)frame->size); + +      if(frame->number%2 == 1) ret = file->Write(frame->data, frame->size);        frame_number++;        wrote ++; @@ -165,7 +174,7 @@ void MovEncoderWriter::thread_main()          info->error("File write returned -1.");          return;        } -       +        // Lock output mutex        pthread_mutex_lock(mutex);        frame = queue->top(); @@ -179,124 +188,48 @@ void MovEncoderWriter::thread_main()    info->info("MovEncoderWriter::stop");  } - -/** - *  Byte#      Data                Details - *  =================================================================== - *  1-4        Sequence header     In Hex 000001B3 - *             code - *  12 bits    Horizontal size     In pixels - *  12 bits    Vertical size       In pixels - *   4 bits    Pel aspect ratio    See below - *  18 bits    Frame rate          See below - *   1 bit     Marker bit          Always 1 - *  10 bits    VBV buffer size     Minimum buffer needed to decode this - *                                 sequence of pictures; in 16KB units - *   1 bit     Constrained - *             parameter flag - *   1 bit     Load intra          0: false; 1: true (matrix follows) - *             quantizer matrix - *  64 bytes   Intra quantizer     Optional - *             matrix - *   1 bit     Load nonintra       0: false; 1: true (matrix follows) - *             quantizer matrix - *  64 bytes   Nonintra quantizer  Optional - *             matrix - *   -         Squence extension   Optional - *             Data - *   -         User data           Optional application-dependent data - *  =================================================================== - */ -/** - *  Pel aspect ratio: - *  The actual height of a 12 pixels wide area (normal is 12 = square) - *   Aspect Ratio (from http://homepage.mac.com/rnc/EditMpegHeaderIFO.html) - *   1 = 1:1 - *   2 = 4:3 - *   3 = 16:9 - *   4 = 2.211 (not used in dvd) - *  12 = unknown (or undefined!) - */ - -/** - *  Frame rates: - *  1 = 23.976 frames/sec - *  2 = 24 - *  3 = 25 - *  4 = 29.97 - *  5 = 30 - *  6 = 50 - *  7 = 59.94 - *  8 = 60 - */ -void MovEncoderWriter::write_video_header() +void MovEncoderWriter::write_video_header(unsigned short int psize)  { -  char header[] = { -    0x00, 0x00, 0x01, 0xB3, // Header -    0x2D, 0x02, 0x40, // 12 bits width, 12 bits height - 720 (hex: 2D0) x 576 (hex: 240) -    0x23, // 4 bits aspect (12 (hex C) works!) 4 bits frameratecode - 3 := 25fps (hex: 3) -    0x00, 0x00, // Bitrate - 0 (hex : 0) -    0x20, 0xA5, 0x10, 0x12, 0x12, 0x14, -    0x14, 0x14, 0x16, 0x16, 0x16, 0x16, 0x18, 0x18, 0x19, 0x18, 0x18, 0x1A, 0x1B, 0x1B, 0x1B, 0x1B, -    0x1A, 0x1C, 0x1D, 0x1E, 0x1E, 0x1E, 0x1D, 0x1C, 0x1E, 0x1F, 0x20, 0x21, 0x21, 0x20, 0x1F, 0x1E, -    0x21, 0x23, 0x23, 0x24, 0x23, 0x23, 0x21, 0x25, 0x26, 0x27, 0x27, 0x26, 0x25, 0x29, 0x2A, 0x2A, -    0x2A, 0x29, 0x2D, 0x2D, 0x2D, 0x2D, 0x30, 0x31, 0x30, 0x34, 0x34, 0x38, 0x16, 0x00, 0xF0, 0xC4, -    0x00, 0x00, 0x01, 0xB8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0A, 0x72, 0x00, -    0x00, 0x00, 0x01, 0x01, 0x13, 0xF9, 0x50, 0x02, 0xBC, 0xB2, 0xB8, 0xBE, 0x68, 0x8B, 0xA4, 0x9F, -    0xC5, 0xB5, 0xCA, 0x00, 0x56, 0x76, 0x39, 0x65, 0xF2, 0x30, 0x8B, 0xA6, 0x9D, 0x50, 0x69, 0xE7, -    0xDA, 0xFE, 0x13, 0xCF, 0xB7, 0xFF, 0x8F, 0xF4, 0xCE, 0x7B, 0xFA, 0x0E, 0xF0, 0x66, 0xAE, 0x1C, -    0x5D, 0xE7, 0x00, 0xC8, 0x0A, 0x92, 0xB9, 0x29, 0x3C, 0x21, 0x23, 0xF1, 0xD6, 0x40, 0x13, 0x06, -    0xF0, 0x10, 0x10, 0xC6, 0x27, 0x80, 0xA0, 0x34, 0xE1, 0xC8, 0xE4, 0x0F, 0x74, 0x91, 0xDA, 0xC4, -    0x03, 0xA0, 0xDC, 0x03, 0x12, 0x60, 0x18, 0x49, 0x27, 0x1D, 0xD4, 0xBC, 0x67, 0x0E, 0x54, 0x8C, -    0x96, 0xFC, 0x5D, 0xC0, 0x06, 0xE0, 0x1A, 0x72, 0x11, 0x7C, 0x9A, 0x8D, 0xC9, 0x45, 0x89, 0x6D, -    0xCD, 0xC4, 0x0B, 0x63, 0xDC, 0x90, 0x18, 0x24, 0x00, 0xEC, 0x84, 0x90, 0x18, 0x10, 0xC9, 0x3B, -    0x1E, 0xA7, 0x60, 0x3C, 0x9D, 0x74, 0x80, 0x76, 0x05, 0x0B, 0x02, 0x81, 0xA9, 0x29, 0x39, 0x68, -    0x53, 0x8F, 0x59, 0xF1, 0xBF, 0x93, 0xFB, 0xA0, 0x04, 0x01, 0xBC, 0xB0, 0xCE, 0x18, 0xE1, 0x25 +  // PES Header startcode +  char startcode[] = { +    0x00, 0x00, 0x01    }; -  file->Write(header, sizeof(header)); +  // Audio stream, index = 1 +  char streamID[] = { +    0xE0 +  }; + +  char packetsize[] = { 0x00, 0x00 }; +  packetsize[0] = ((char*)&psize)[0]; +  packetsize[1] = ((char*)&psize)[1]; -   +  file->Write(startcode, sizeof(startcode)); +  file->Write(streamID, sizeof(streamID)); +  file->Write(packetsize, sizeof(packetsize));  } -/* -4449 0433 0000 0000 -*/ -void MovEncoderWriter::write_audio_header() + +void MovEncoderWriter::write_audio_header(unsigned short int psize)  { -  char header[] = { -    0x44, 0x49, 0x04, 0x33,  -    0x00, 0x00, 0x00, 0x00 +  // PES Header startcode +  char startcode[] = { +    0x00, 0x00, 0x01    }; -  file->Write(header, sizeof(header)); +  // Audio stream, index = 1 +  char streamID[] = {  +    0xC0 +  }; + +  char packetsize[] = { 0x00, 0x00 }; +  //  packetsize[0] = ((char*)&psize)[1]; +  //  packetsize[1] = ((char*)&psize)[0]; + +  file->Write(startcode, sizeof(startcode)); +  file->Write(streamID, sizeof(streamID)); +  file->Write(packetsize, sizeof(packetsize));  }  void MovEncoderWriter::write_multiplex_header()  { -  char header[] = { -    0x00, 0x00, 0xba, 0x01,  -    0x00,  -    0x21, 0x00, 0x01, 0x80, 0x19, 0x8d, 0x0a,  -    0x00, 0x00, 0xbb, 0x01, -    0x0c, 0x00, 0x0a, 0x80, 0x06, 0x8d, 0xff, 0xe1, 0xe0, 0xe0, 0xc0, 0x25, 0x20, 0xc0a, 0x00, 0x00, -    0xba, 0x01, 0x00, 0x21, 0x15, 0x01, 0x80, 0x6d, 0x8d, 0x0a -    /* -    0x00, 0x00, 0xe0, 0x01a, 0x3d, 0x04, -    0x25, 0x60, 0x00, 0x31, 0xd7, 0x03, 0x11, 0x8f, 0x03, 0x00, 0x19, 0xc0, 0x00, 0x00a, 0xb3, 0x01, -    0x00, 0x16, 0xc4, 0xf0, 0x38, 0x01, 0x85, 0xa0, 0x11, 0x10, 0x12, 0x11, 0x12, 0x12a, 0x13, 0x13, -    0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x15, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x15a, 0x16, 0x16, -    0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18a, 0x19, 0x18, -    0x18, 0x18, 0x19, 0x18, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x19, 0x1b, 0x1b, 0x1b, 0x1ba, 0x1c, 0x1c, -    0x1c, 0x1c, 0x1e, 0x1e, 0x1f, 0x1e, 0x21, 0x1f, 0x00, 0x00, 0xb2, 0x01, 0x87, 0x00a, 0x00, 0x81, -    0x65, 0x26, 0x63, 0x6e, 0x64, 0x6f, 0x64, 0x65, 0x62, 0x20, 0x20, 0x79, 0x4d, 0x54a, 0x47, 0x50, -    0x6e, 0x45, 0x20, 0x63, 0x76, 0x28, 0x72, 0x65, 0x20, 0x2e, 0x2e, 0x32, 0x32, 0x35a, 0x2e, 0x31, -    0x38, 0x35, 0x31, 0x2e, 0x39, 0x36, 0x00, 0x29, 0x00, 0x00, 0xb8, 0x01, 0xab, 0x00a, 0x20, 0x22, -    0x00, 0x00, 0x00, 0x01, 0x8d, 0x00, 0x78, 0x09, 0x00, 0x00, 0x01, 0x01, 0xf9, 0x1ba, 0x20, 0xf8, -    0x02, 0x5e, 0xa1, 0x18, 0x11, 0x30, 0x70, 0xfe, 0xd3, 0x00, 0x4c, 0xdf, 0x84, 0x02a, 0x30, 0xd0, -    0x9e, 0x5b, 0x77, 0x81, 0x41, 0xcc, 0xf4, 0x02, 0xc5, 0x10, 0x40, 0x08, 0xf3, 0x8fa, 0x06, 0x80, -    0xfa, 0x9e, 0xe7, 0x95, 0x3c, 0x80, 0x09, 0xc1, 0x20, 0xbd, 0xbf, 0x07, 0xd0, 0xe2a, 0xaa, 0x62 -    */ -  }; - -  file->Write(header, sizeof(header));  } diff --git a/src/mov_encoder_writer.h b/src/mov_encoder_writer.h index 63ddec4..7f9a893 100644 --- a/src/mov_encoder_writer.h +++ b/src/mov_encoder_writer.h @@ -31,6 +31,9 @@  /*   * $Log$ + * Revision 1.6  2005/07/07 12:42:19  deva + * *** empty log message *** + *   * Revision 1.5  2005/07/05 23:15:16  deva   * *** empty log message ***   * @@ -87,8 +90,8 @@ private:    unsigned int frame_number; -  void write_audio_header(); -  void write_video_header(); +  void write_audio_header(unsigned short int packetsize); +  void write_video_header(unsigned short int packetsize);    void write_multiplex_header();  }; | 
