summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--HBAc3Decoder.cpp22
-rw-r--r--HBAc3Decoder.h6
-rw-r--r--HBAviMuxer.cpp12
-rw-r--r--HBFifo.cpp4
-rw-r--r--HBMp3Encoder.cpp52
-rw-r--r--HBMp3Encoder.h14
-rw-r--r--HBPictureWin.cpp88
-rw-r--r--HBWindow.cpp5
-rw-r--r--Jamfile4
-rw-r--r--NEWS6
10 files changed, 123 insertions, 90 deletions
diff --git a/HBAc3Decoder.cpp b/HBAc3Decoder.cpp
index 81753d899..b78097746 100644
--- a/HBAc3Decoder.cpp
+++ b/HBAc3Decoder.cpp
@@ -1,4 +1,4 @@
-/* $Id: HBAc3Decoder.cpp,v 1.6 2003/08/24 15:03:41 titer Exp $ */
+/* $Id: HBAc3Decoder.cpp,v 1.7 2003/08/25 19:47:14 titer Exp $ */
#include "HBCommon.h"
#include "HBAc3Decoder.h"
@@ -12,12 +12,12 @@ extern "C" {
HBAc3Decoder::HBAc3Decoder( HBManager * manager, HBAudioInfo * audioInfo )
: HBThread( "ac3decoder" )
{
- fManager = manager;
- fAudioInfo = audioInfo;
+ fManager = manager;
+ fAudioInfo = audioInfo;
- fAc3Buffer = NULL;
- fAc3Frame = NULL;
- fPosInAc3Buffer = 0;
+ fAc3Buffer = NULL;
+ fAc3Frame = NULL;
+ fPosInBuffer = 0;
}
void HBAc3Decoder::DoWork()
@@ -108,18 +108,18 @@ bool HBAc3Decoder::GetBytes( uint32_t size )
{
return false;
}
- fPosInAc3Buffer = 0;
+ fPosInBuffer = 0;
}
int willCopy = MIN( size - fAc3Frame->fSize,
- fAc3Buffer->fSize - fPosInAc3Buffer );
+ fAc3Buffer->fSize - fPosInBuffer );
memcpy( fAc3Frame->fData + fAc3Frame->fSize,
- fAc3Buffer->fData + fPosInAc3Buffer,
+ fAc3Buffer->fData + fPosInBuffer,
willCopy );
fAc3Frame->fSize += willCopy;
- fPosInAc3Buffer += willCopy;
+ fPosInBuffer += willCopy;
- if( fAc3Buffer->fSize == fPosInAc3Buffer )
+ if( fAc3Buffer->fSize == fPosInBuffer )
{
delete fAc3Buffer;
fAc3Buffer = NULL;
diff --git a/HBAc3Decoder.h b/HBAc3Decoder.h
index 75e7553da..f9d6ad678 100644
--- a/HBAc3Decoder.h
+++ b/HBAc3Decoder.h
@@ -1,4 +1,4 @@
-/* $Id: HBAc3Decoder.h,v 1.5 2003/08/24 15:03:41 titer Exp $ */
+/* $Id: HBAc3Decoder.h,v 1.6 2003/08/25 19:47:14 titer Exp $ */
#ifndef HB_AC3_DECODER_H
#define HB_AC3_DECODER_H
@@ -21,9 +21,9 @@ class HBAc3Decoder : public HBThread
HBManager * fManager;
HBAudioInfo * fAudioInfo;
- HBBuffer * fAc3Buffer;
HBBuffer * fAc3Frame;
- uint32_t fPosInAc3Buffer;
+ HBBuffer * fAc3Buffer;
+ uint32_t fPosInBuffer;
};
#endif
diff --git a/HBAviMuxer.cpp b/HBAviMuxer.cpp
index 8c5d42176..cbe2f9578 100644
--- a/HBAviMuxer.cpp
+++ b/HBAviMuxer.cpp
@@ -1,4 +1,4 @@
-/* $Id: HBAviMuxer.cpp,v 1.21 2003/08/24 13:34:18 titer Exp $ */
+/* $Id: HBAviMuxer.cpp,v 1.24 2003/08/26 18:44:06 titer Exp $ */
#include "HBCommon.h"
#include "HBAviMuxer.h"
@@ -136,7 +136,10 @@ bool HBAviMuxer::AddVideoChunk()
if( fIndex->fSize + 16 > fIndex->fAllocSize )
{
/* Realloc if needed */
- fIndex->ReAlloc( fIndex->fSize + 1024 * 1024 );
+ Log( "HBAviMuxer::AddVideoChunk() : reallocing index (%d -> %d MB)",
+ fIndex->fAllocSize / ( 1024 * 1024 ),
+ 1 + fIndex->fAllocSize / ( 1024 * 1024 ) );
+ fIndex->ReAlloc( fIndex->fAllocSize + 1024 * 1024 );
}
uint32_t flags = buffer->fKeyFrame ? AVIIF_KEYFRAME : 0;
@@ -226,7 +229,10 @@ bool HBAviMuxer::AddAudioChunk( int which )
if( fIndex->fSize + 16 > fIndex->fAllocSize )
{
/* Realloc if needed */
- fIndex->ReAlloc( fIndex->fSize + 1024 * 1024 );
+ Log( "HBAviMuxer::AddAudioChunk() : reallocing index (%d -> %d MB)",
+ fIndex->fAllocSize / ( 1024 * 1024 ),
+ 1 + fIndex->fAllocSize / ( 1024 * 1024 ) );
+ fIndex->ReAlloc( fIndex->fAllocSize + 1024 * 1024 );
}
uint32_t flags = buffer->fKeyFrame ? AVIIF_KEYFRAME : 0;
diff --git a/HBFifo.cpp b/HBFifo.cpp
index fd79f734a..b85361c56 100644
--- a/HBFifo.cpp
+++ b/HBFifo.cpp
@@ -1,4 +1,4 @@
-/* $Id: HBFifo.cpp,v 1.10 2003/08/24 13:27:41 titer Exp $ */
+/* $Id: HBFifo.cpp,v 1.11 2003/08/26 07:48:36 titer Exp $ */
#include "HBCommon.h"
#include "HBFifo.h"
@@ -25,7 +25,7 @@ HBBuffer::~HBBuffer()
void HBBuffer::ReAlloc( int size )
{
- realloc( fData, size );
+ fData = (uint8_t*) realloc( fData, size );
if( !fData )
{
diff --git a/HBMp3Encoder.cpp b/HBMp3Encoder.cpp
index 8cddd7615..cff6d6d66 100644
--- a/HBMp3Encoder.cpp
+++ b/HBMp3Encoder.cpp
@@ -1,4 +1,4 @@
-/* $Id: HBMp3Encoder.cpp,v 1.5 2003/08/24 20:50:49 titer Exp $ */
+/* $Id: HBMp3Encoder.cpp,v 1.6 2003/08/25 20:41:51 titer Exp $ */
#include "HBCommon.h"
#include "HBMp3Encoder.h"
@@ -10,15 +10,20 @@
HBMp3Encoder::HBMp3Encoder( HBManager * manager, HBAudioInfo * audioInfo )
: HBThread( "mp3encoder" )
{
- fManager = manager;
- fAudioInfo = audioInfo;
+ fManager = manager;
+ fAudioInfo = audioInfo;
- fRawBuffer = NULL;
+ fRawBuffer = NULL;
+ fPosInBuffer = 0;
+ fLeftSamples = NULL;
+ fRightSamples = NULL;
}
void HBMp3Encoder::DoWork()
{
- while( !fAudioInfo->fRawFifo->Size() )
+ /* Wait a first buffer so we are sure that
+ fAudioInfo->fInSampleRate (set the AC3 decoder) is not garbage */
+ while( !fDie && !fAudioInfo->fRawFifo->Size() )
{
snooze( 5000 );
}
@@ -30,27 +35,33 @@ void HBMp3Encoder::DoWork()
never get more than 1 frame at a time */
uint32_t count = ( 1152 * fAudioInfo->fInSampleRate ) /
( 2 * fAudioInfo->fOutSampleRate );
- fLeftSamples = (float*) malloc( count * sizeof( float ) );
- fRightSamples = (float*) malloc( count * sizeof( float ) );
/* Init libmp3lame */
lame_global_flags * globalFlags = lame_init();
lame_set_in_samplerate( globalFlags, fAudioInfo->fInSampleRate );
lame_set_out_samplerate( globalFlags, fAudioInfo->fOutSampleRate );
lame_set_brate( globalFlags, fAudioInfo->fOutBitrate );
- lame_init_params( globalFlags );
+
+ if( lame_init_params( globalFlags ) == -1 )
+ {
+ Log( "HBMp3Encoder::DoWork() : lame_init_params() failed" );
+ fManager->Error();
+ return;
+ }
- HBBuffer * mp3Buffer;
+ fLeftSamples = (float*) malloc( count * sizeof( float ) );
+ fRightSamples = (float*) malloc( count * sizeof( float ) );
+
+ HBBuffer * mp3Buffer = new HBBuffer( LAME_MAXMP3BUFFER );
int ret;
while( !fDie )
{
/* Get new samples */
if( !GetSamples( count ) )
{
- break;
+ continue;
}
- mp3Buffer = new HBBuffer( LAME_MAXMP3BUFFER );
ret = lame_encode_buffer_float( globalFlags,
fLeftSamples, fRightSamples,
count, mp3Buffer->fData,
@@ -60,22 +71,25 @@ void HBMp3Encoder::DoWork()
{
/* Something wrong happened */
Log( "HBMp3Encoder : lame_encode_buffer_float() failed (%d)", ret );
- delete mp3Buffer;
fManager->Error();
break;
}
- else if( !ret )
- {
- delete mp3Buffer;
- }
else if( ret > 0 )
{
/* We got something, send it to the muxer */
mp3Buffer->fSize = ret;
mp3Buffer->fKeyFrame = true;
fAudioInfo->fMp3Fifo->Push( mp3Buffer );
+ mp3Buffer = new HBBuffer( LAME_MAXMP3BUFFER );
}
}
+
+ /* Clean up */
+ delete mp3Buffer;
+ free( fLeftSamples );
+ free( fRightSamples );
+
+ lame_close( globalFlags );
}
bool HBMp3Encoder::GetSamples( uint32_t count )
@@ -86,14 +100,18 @@ bool HBMp3Encoder::GetSamples( uint32_t count )
{
if( !fRawBuffer )
{
- if( !( fRawBuffer = fAudioInfo->fRawFifo->Pop() ) )
+ fRawBuffer = fAudioInfo->fRawFifo->Pop();
+
+ if( !fRawBuffer )
{
return false;
}
+
fPosInBuffer = 0;
}
int willCopy = MIN( count - samplesNb, 6 * 256 - fPosInBuffer );
+
memcpy( fLeftSamples + samplesNb,
(float*) fRawBuffer->fData + fPosInBuffer,
willCopy * sizeof( float ) );
diff --git a/HBMp3Encoder.h b/HBMp3Encoder.h
index 02e385224..d8f6ce3f9 100644
--- a/HBMp3Encoder.h
+++ b/HBMp3Encoder.h
@@ -1,4 +1,4 @@
-/* $Id: HBMp3Encoder.h,v 1.3 2003/08/23 19:22:59 titer Exp $ */
+/* $Id: HBMp3Encoder.h,v 1.4 2003/08/25 20:41:51 titer Exp $ */
#ifndef HB_MP3_ENCODER_H
#define HB_MP3_ENCODER_H
@@ -18,13 +18,13 @@ class HBMp3Encoder : public HBThread
void DoWork();
bool GetSamples( uint32_t count );
- HBManager * fManager;
- HBAudioInfo * fAudioInfo;
+ HBManager * fManager;
+ HBAudioInfo * fAudioInfo;
- HBBuffer * fRawBuffer;
- uint32_t fPosInBuffer; /* in samples */
- float * fLeftSamples;
- float * fRightSamples;
+ HBBuffer * fRawBuffer;
+ uint32_t fPosInBuffer; /* in samples */
+ float * fLeftSamples;
+ float * fRightSamples;
};
#endif
diff --git a/HBPictureWin.cpp b/HBPictureWin.cpp
index 9849af010..8fd9e8405 100644
--- a/HBPictureWin.cpp
+++ b/HBPictureWin.cpp
@@ -1,4 +1,4 @@
-/* $Id: HBPictureWin.cpp,v 1.14 2003/08/24 20:50:49 titer Exp $ */
+/* $Id: HBPictureWin.cpp,v 1.15 2003/08/25 21:50:48 titer Exp $ */
#include "HBCommon.h"
#include "HBPictureWin.h"
@@ -13,6 +13,20 @@
#define UPDATE_BITMAP 'upbi'
+/* Handy way to access HBTitleInfo members */
+#define fInWidth fTitleInfo->fInWidth
+#define fInHeight fTitleInfo->fInHeight
+#define fPixelWidth fTitleInfo->fPixelWidth
+#define fPixelHeight fTitleInfo->fPixelHeight
+#define fDeinterlace fTitleInfo->fDeinterlace
+#define fOutWidth fTitleInfo->fOutWidth
+#define fOutHeight fTitleInfo->fOutHeight
+#define fTopCrop fTitleInfo->fTopCrop
+#define fBottomCrop fTitleInfo->fBottomCrop
+#define fLeftCrop fTitleInfo->fLeftCrop
+#define fRightCrop fTitleInfo->fRightCrop
+#define fPictures fTitleInfo->fPictures
+
HBPictureView::HBPictureView( BRect rect, BBitmap * bitmap )
: BView( rect, NULL, B_FOLLOW_ALL, B_WILL_DRAW )
{
@@ -28,7 +42,7 @@ void HBPictureView::Draw( BRect rect )
}
else
{
- Log( "HBPictureView::Draw : LockLooper() failed" );
+ Log( "HBPictureView::Draw() : LockLooper() failed" );
}
BView::Draw( rect );
@@ -42,13 +56,14 @@ HBPictureWin::HBPictureWin( HBTitleInfo * titleInfo )
{
fTitleInfo = titleInfo;
- fMaxOutWidth = fTitleInfo->fInWidth;
- fMaxOutHeight = MULTIPLE_16( fTitleInfo->fInHeight * fTitleInfo->fPixelHeight /
- fTitleInfo->fPixelWidth );
- fBitmap = new BBitmap( BRect( 0, 0, fMaxOutWidth, fMaxOutHeight ),
+ fMaxOutWidth = MULTIPLE_16( fInWidth );
+ fMaxOutHeight = MULTIPLE_16( fInHeight * fPixelHeight / fPixelWidth );
+
+ /* Leave a one-pixel margin to draw the white line around the picture */
+ fBitmap = new BBitmap( BRect( 0, 0, fMaxOutWidth + 1, fMaxOutHeight + 1 ),
0, B_RGB32 );
- ResizeTo( fMaxOutWidth + 40, fMaxOutHeight + 330 );
+ ResizeTo( fMaxOutWidth + 40, fMaxOutHeight + 331 );
BRect r;
@@ -59,25 +74,25 @@ HBPictureWin::HBPictureWin( HBTitleInfo * titleInfo )
AddChild( view );
/* First box : picture + slider */
- r = BRect( 10, 10, fMaxOutWidth + 30, fMaxOutHeight + 65 );
+ r = BRect( 10, 10, fMaxOutWidth + 31, fMaxOutHeight + 68 );
BBox * pictureBox;
pictureBox = new BBox( r, NULL );
pictureBox->SetLabel( "Preview" );
/* Picture view */
- r = BRect( 10, 15, fMaxOutWidth + 10, fMaxOutHeight + 15 );
+ r = BRect( 10, 15, fMaxOutWidth + 11, fMaxOutHeight + 16 );
fPictureView = new HBPictureView( r, fBitmap );
pictureBox->AddChild( fPictureView );
/* Slider */
- r = BRect( 10, fMaxOutHeight + 25, fMaxOutWidth + 10, fMaxOutHeight + 55 );
+ r = BRect( 10, fMaxOutHeight + 26, fMaxOutWidth + 10, fMaxOutHeight + 56 );
fPictureSlider = new BSlider( r, NULL, NULL, new BMessage( UPDATE_BITMAP ), 0, 9 );
pictureBox->AddChild( fPictureSlider );
view->AddChild( pictureBox );
/* Second box : resize & crop settings */
- r = BRect( 10, fMaxOutHeight + 75, fMaxOutWidth + 30, fMaxOutHeight + 320 );
+ r = BRect( 10, fMaxOutHeight + 76, fMaxOutWidth + 30, fMaxOutHeight + 321 );
BBox * settingsBox;
settingsBox = new BBox( r, NULL );
settingsBox->SetLabel( "Settings" );
@@ -93,28 +108,28 @@ HBPictureWin::HBPictureWin( HBTitleInfo * titleInfo )
r = BRect( 10, 55, fMaxOutWidth + 10, 85 );
fTopCropSlider = new BSlider( r, NULL, "Top cropping",
new BMessage( UPDATE_BITMAP ),
- 0, fTitleInfo->fInHeight / 4,
+ 0, fInHeight / 4,
B_TRIANGLE_THUMB );
settingsBox->AddChild( fTopCropSlider );
r = BRect( 10, 95, fMaxOutWidth + 10, 125 );
fBottomCropSlider = new BSlider( r, NULL, "Bottom cropping",
new BMessage( UPDATE_BITMAP ),
- 0, fTitleInfo->fInHeight / 4,
+ 0, fInHeight / 4,
B_TRIANGLE_THUMB );
settingsBox->AddChild( fBottomCropSlider );
r = BRect( 10, 135, fMaxOutWidth + 10, 165 );
fLeftCropSlider = new BSlider( r, NULL, "Left cropping",
new BMessage( UPDATE_BITMAP ),
- 0, fTitleInfo->fInWidth / 4,
+ 0, fInWidth / 4,
B_TRIANGLE_THUMB );
settingsBox->AddChild( fLeftCropSlider );
r = BRect( 10, 175, fMaxOutWidth + 10, 205 );
fRightCropSlider = new BSlider( r, NULL, "Right cropping",
new BMessage( UPDATE_BITMAP ),
- 0, fTitleInfo->fInWidth / 4,
+ 0, fInWidth / 4,
B_TRIANGLE_THUMB );
settingsBox->AddChild( fRightCropSlider );
@@ -164,19 +179,6 @@ void HBPictureWin::MessageReceived( BMessage * message )
void HBPictureWin::UpdateBitmap( int which )
{
-#define fInWidth fTitleInfo->fInWidth
-#define fInHeight fTitleInfo->fInHeight
-#define fPixelWidth fTitleInfo->fPixelWidth
-#define fPixelHeight fTitleInfo->fPixelHeight
-#define fDeinterlace fTitleInfo->fDeinterlace
-#define fOutWidth fTitleInfo->fOutWidth
-#define fOutHeight fTitleInfo->fOutHeight
-#define fTopCrop fTitleInfo->fTopCrop
-#define fBottomCrop fTitleInfo->fBottomCrop
-#define fLeftCrop fTitleInfo->fLeftCrop
-#define fRightCrop fTitleInfo->fRightCrop
-#define fPictures fTitleInfo->fPictures
-
fTopCrop = 2 * fTopCropSlider->Value();
fBottomCrop = 2 * fBottomCropSlider->Value();
fLeftCrop = 2 * fLeftCropSlider->Value();
@@ -222,15 +224,15 @@ void HBPictureWin::UpdateBitmap( int which )
img_convert( &pic4, PIX_FMT_RGBA32, &pic3, PIX_FMT_YUV420P, fOutWidth, fOutHeight );
/* Blank the bitmap */
- for( uint32_t i = 0; i < fMaxOutHeight; i++ )
+ for( uint32_t i = 0; i < fMaxOutHeight + 2; i++ )
{
memset( (uint8_t*) fBitmap->Bits() + i * fBitmap->BytesPerRow(),
- 0, fMaxOutWidth * 4 );
+ 0, ( fMaxOutWidth + 2 ) * 4 );
}
/* Draw the picture (centered) */
- uint32_t leftOffset = ( fMaxOutWidth - fOutWidth ) / 2;
- uint32_t topOffset = ( fMaxOutHeight - fOutHeight ) / 2;
+ uint32_t leftOffset = 1 + ( fMaxOutWidth - fOutWidth ) / 2;
+ uint32_t topOffset = 1 + ( fMaxOutHeight - fOutHeight ) / 2;
for( uint32_t i = 0; i < fOutHeight; i++ )
{
memcpy( (uint8_t*) fBitmap->Bits() +
@@ -242,30 +244,30 @@ void HBPictureWin::UpdateBitmap( int which )
/* Draw the cropping zone */
memset( (uint8_t*) fBitmap->Bits() +
- topOffset * fBitmap->BytesPerRow() +
- leftOffset * 4,
+ ( topOffset - 1 ) * fBitmap->BytesPerRow() +
+ ( leftOffset - 1 ) * 4,
0xFF,
- fOutWidth * 4 );
+ ( fOutWidth + 2 ) * 4 );
- for( uint32_t i = 0; i < fOutHeight; i++ )
+ for( uint32_t i = 0; i < fOutHeight + 2; i++ )
{
memset( (uint8_t*) fBitmap->Bits() +
- ( i + topOffset ) * fBitmap->BytesPerRow() +
- leftOffset * 4,
+ ( i + ( topOffset - 1 ) ) * fBitmap->BytesPerRow() +
+ ( leftOffset - 1 ) * 4,
0xFF,
4 );
memset( (uint8_t*) fBitmap->Bits() +
- ( i + topOffset ) * fBitmap->BytesPerRow() +
- ( leftOffset + fOutWidth - 1 ) * 4,
+ ( i + ( topOffset - 1 ) ) * fBitmap->BytesPerRow() +
+ ( leftOffset + fOutWidth ) * 4,
0xFF,
4 );
}
memset( (uint8_t*) fBitmap->Bits() +
- ( topOffset + fOutHeight - 1 ) * fBitmap->BytesPerRow() +
- leftOffset * 4,
+ ( topOffset + fOutHeight ) * fBitmap->BytesPerRow() +
+ ( leftOffset - 1 ) * 4,
0xFF,
- fOutWidth * 4 );
+ ( fOutWidth + 2 ) * 4 );
/* Clean up */
free( buf2 );
diff --git a/HBWindow.cpp b/HBWindow.cpp
index 0d665ae45..9a6fcaa1d 100644
--- a/HBWindow.cpp
+++ b/HBWindow.cpp
@@ -1,4 +1,4 @@
-/* $Id: HBWindow.cpp,v 1.20 2003/08/24 20:50:49 titer Exp $ */
+/* $Id: HBWindow.cpp,v 1.21 2003/08/25 22:04:22 titer Exp $ */
#include "HBCommon.h"
#include "HBWindow.h"
@@ -399,6 +399,9 @@ void HBWindow::MessageReceived( BMessage * message )
fStatusBar->Update( pos - fStatusBar->CurrentValue(), text );
Enable( mode );
Unlock();
+
+ free( text );
+
break;
}
diff --git a/Jamfile b/Jamfile
index d9f72cc79..aa84b1ea4 100644
--- a/Jamfile
+++ b/Jamfile
@@ -1,6 +1,6 @@
-# $Id: Jamfile,v 1.15 2003/08/24 22:25:21 titer Exp $
+# $Id: Jamfile,v 1.17 2003/08/26 18:54:06 titer Exp $
-HB_VERSION = 0.1.1 ;
+HB_VERSION = 0.2 ;
C++FLAGS = $(CPPFLAGS) ;
C++FLAGS += -g -Wall -Werror -Wno-multichar -O3 -funroll-loops ;
diff --git a/NEWS b/NEWS
index 3fe178b46..75542b955 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,8 @@
-$Id: NEWS,v 1.5 2003/08/24 22:25:21 titer Exp $
+$Id: NEWS,v 1.6 2003/08/26 18:54:06 titer Exp $
+
+Changes between 0.1.1 and 0.2
+ - Fixed a major bug that made HandBrake probably crash after ~ 15 minutes encoded
+ - Fixed a few minor memory leaks
Changes between 0.1 and 0.1.1
- Fixed a stupid bug that prevented to scan volumes correctly if