summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/liblame_wrapper.cc127
-rw-r--r--src/liblame_wrapper.h6
-rw-r--r--src/mov_encoder.cc16
-rw-r--r--src/mov_encoder_writer.cc153
-rw-r--r--src/mov_encoder_writer.h7
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();
};