OSDN Git Service

HandBrake 0.2
authorroot <root@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sat, 14 Jan 2006 12:49:29 +0000 (12:49 +0000)
committerroot <root@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sat, 14 Jan 2006 12:49:29 +0000 (12:49 +0000)
git-svn-id: svn://localhost/HandBrake/trunk@3 b64f7644-9d1e-0410-96f1-a4d463321fa5

HBAc3Decoder.cpp
HBAc3Decoder.h
HBAviMuxer.cpp
HBFifo.cpp
HBMp3Encoder.cpp
HBMp3Encoder.h
HBPictureWin.cpp
HBWindow.cpp
Jamfile
NEWS

index 81753d8..b780977 100644 (file)
@@ -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;
index 75e7553..f9d6ad6 100644 (file)
@@ -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
index 8c5d421..cbe2f95 100644 (file)
@@ -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;
index fd79f73..b85361c 100644 (file)
@@ -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 )
     {
index 8cddd76..cff6d6d 100644 (file)
@@ -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"
 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 ) );
index 02e3852..d8f6ce3 100644 (file)
@@ -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
index 9849af0..8fd9e84 100644 (file)
@@ -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"
 
 #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 );
index 0d665ae..9a6fcaa 100644 (file)
@@ -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 d9f72cc..aa84b1e 100644 (file)
--- 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 3fe178b..75542b9 100644 (file)
--- 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