All pastes #1431652 Raw Edit

dani

public text v1 · immutable
#1431652 ·published 2009-05-23 02:29 UTC
rendered paste body
Index: test/test.c===================================================================--- test/test.c	(revision 2440)+++ test/test.c	(working copy)@@ -2747,6 +2747,12 @@     {         return HB_ACODEC_VORBIS;     }+#ifdef __APPLE__+    else if( !strcasecmp( codec, "ca_aac") )+    {+        return HB_ACODEC_CA_AAC;+    }+#endif     else     {         return -1;Index: test/module.defs===================================================================--- test/module.defs	(revision 2440)+++ test/module.defs	(working copy)@@ -36,7 +36,7 @@ TEST.GCC.I += $(LIBHB.GCC.I) ifeq ($(BUILD.system),darwin)-    TEST.GCC.f += IOKit CoreServices+    TEST.GCC.f += IOKit CoreServices AudioToolbox     TEST.GCC.l += bz2 z else ifeq ($(BUILD.system),linux)     TEST.GCC.l += bz2 z pthread dl mIndex: libhb/platform/macosx/encca_aac.c===================================================================--- libhb/platform/macosx/encca_aac.c	(revision 0)+++ libhb/platform/macosx/encca_aac.c	(revision 0)@@ -0,0 +1,279 @@+/* This file is part of the HandBrake source code.+ Homepage: <http://handbrake.fr/>.+ It may be used under the terms of the GNU General Public License. */++#include "hb.h"+#include <AudioToolbox/AudioToolbox.h>+#include <CoreAudio/CoreAudio.h>++int     encCoreAudioInit( hb_work_object_t *, hb_job_t * );+int     encCoreAudioWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );+void    encCoreAudioClose( hb_work_object_t * );++hb_work_object_t hb_encca_aac =+{+    WORK_ENC_CA_AAC,+    "AAC encoder (Apple)",+    encCoreAudioInit,+    encCoreAudioWork,+    encCoreAudioClose+};++struct hb_work_private_s+{+    hb_job_t *job;++    AudioConverterRef converter;+    uint8_t  *obuf;+    uint8_t  *buf;+    hb_list_t *list;+    unsigned long isamples, isamplesiz, omaxpacket, nchannels;+    uint64_t pts, ibytes;+};++/***********************************************************************+ * hb_work_encCoreAudio_init+ ***********************************************************************+ *+ **********************************************************************/+int encCoreAudioInit( hb_work_object_t * w, hb_job_t * job )+{+    hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );+    hb_audio_t * audio = w->audio;+    AudioStreamBasicDescription input, output;+    UInt32 tmp, tmpsiz = sizeof( tmp );+    OSStatus err;++    w->private_data = pv;+    pv->job = job;++    // pass the number of channels used into the private work data+    pv->nchannels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT( audio->config.out.mixdown );++    bzero( &input, sizeof( AudioStreamBasicDescription ) );+    input.mSampleRate = ( Float64 ) audio->config.out.samplerate;+    input.mFormatID = kAudioFormatLinearPCM;+    input.mFormatFlags = kLinearPCMFormatFlagIsFloat | kAudioFormatFlagsNativeEndian;+    input.mBytesPerPacket = 4 * pv->nchannels;+    input.mFramesPerPacket = 1;+    input.mBytesPerFrame = input.mBytesPerPacket * input.mFramesPerPacket;+    input.mChannelsPerFrame = pv->nchannels;+    input.mBitsPerChannel = 32;++    bzero( &output, sizeof( AudioStreamBasicDescription ) );+    output.mSampleRate = ( Float64 ) audio->config.out.samplerate;+    output.mFormatID = kAudioFormatMPEG4AAC;+    output.mChannelsPerFrame = pv->nchannels;+    // let CoreAudio decide the rest...++    // initialise encoder+    err = AudioConverterNew( &input, &output, &pv->converter );+    if( err != noErr)+    {+        hb_log( "Error creating an AudioConverter %x %d", err, output.mBytesPerFrame );+        *job->die = 1;+        return 0;+    }++    if( audio->config.out.mixdown == HB_AMIXDOWN_6CH && audio->config.in.codec == HB_ACODEC_AC3 )+    {+        SInt32 channelMap[6] = { 2, 1, 3, 4, 5, 0 };+        AudioConverterSetProperty( pv->converter, kAudioConverterChannelMap,+                                   sizeof( channelMap ), channelMap );+    }++    // set encoder quality to maximum+    tmp = kAudioConverterQuality_Max;+    AudioConverterSetProperty( pv->converter, kAudioConverterCodecQuality,+                               sizeof( tmp ), &tmp );++    // set encoder bitrate control mode to constrained variable+    tmp = kAudioCodecBitRateControlMode_VariableConstrained;+    AudioConverterSetProperty( pv->converter, kAudioCodecPropertyBitRateControlMode,+                              sizeof( tmp ), &tmp );++    // get available bitrates+    AudioValueRange *bitrates;+    ssize_t bitrateCounts, n;+    err = AudioConverterGetPropertyInfo( pv->converter, kAudioConverterApplicableEncodeBitRates,+                                         &tmpsiz, NULL);+    bitrates = malloc( tmpsiz );+    err = AudioConverterGetProperty( pv->converter, kAudioConverterApplicableEncodeBitRates,+                                     &tmpsiz, bitrates);+    bitrateCounts = tmpsiz / sizeof( AudioValueRange );++    // set bitrate+    tmp = audio->config.out.bitrate * 1000;+    if( tmp < bitrates[0].mMinimum )+        tmp = bitrates[0].mMinimum;+    if( tmp > bitrates[bitrateCounts-1].mMinimum )+        tmp = bitrates[bitrateCounts-1].mMinimum;+    free( bitrates );+    AudioConverterSetProperty( pv->converter, kAudioConverterEncodeBitRate,+                              sizeof( tmp ), &tmp );++    // get real input+    tmpsiz = sizeof( input );+    AudioConverterGetProperty( pv->converter,+                               kAudioConverterCurrentInputStreamDescription,+                               &tmpsiz, &input );+    // get real output+    tmpsiz = sizeof( output );+    AudioConverterGetProperty( pv->converter,+                               kAudioConverterCurrentOutputStreamDescription,+                               &tmpsiz, &output );++    // set sizes+    pv->isamplesiz = input.mBytesPerPacket;+    pv->isamples   = output.mFramesPerPacket;++    // get maximum output size+    AudioConverterGetProperty( pv->converter,+                               kAudioConverterPropertyMaximumOutputPacketSize,+                               &tmpsiz, &tmp );+    pv->omaxpacket = tmp;++    // get magic cookie (elementary stream descriptor)+    tmp = HB_CONFIG_MAX_SIZE;+    AudioConverterGetProperty( pv->converter,+                               kAudioConverterCompressionMagicCookie,+                               &tmp, w->config->aac.bytes );+    // CoreAudio returns a complete ESDS, but we only need+    // the DecoderSpecific info.+    w->config->aac.length = 2;+    memmove( w->config->aac.bytes, w->config->aac.bytes + 31,+             w->config->aac.length );++    pv->list = hb_list_init();+    pv->buf = NULL;++    return 0;+}++/***********************************************************************+ * Close+ ***********************************************************************+ *+ **********************************************************************/+void encCoreAudioClose( hb_work_object_t * w )+{+    hb_work_private_t * pv = w->private_data;++    if( pv->converter )+    {+        AudioConverterDispose( pv->converter );+        hb_list_empty( &pv->list );+        free( pv->obuf );+        free( pv->buf );+        free( pv );+        w->private_data = NULL;+    }+}++/* Called whenever necessary by AudioConverterFillComplexBuffer */+static OSStatus inInputDataProc( AudioConverterRef converter, UInt32 *npackets,+                          AudioBufferList *buffers,+                          AudioStreamPacketDescription** ignored,+                          void *userdata )+{+    hb_work_private_t *pv = userdata;+    pv->ibytes = hb_list_bytes( pv->list );++    if( pv->ibytes == 0 ) {+        *npackets = 0;+        return noErr;+    }++    if( pv->buf != NULL )+        free( pv->buf );++    uint64_t pts, pos;+    pv->ibytes = buffers->mBuffers[0].mDataByteSize = MIN( *npackets * pv->isamplesiz, pv->ibytes );+    buffers->mBuffers[0].mData = pv->buf = malloc( buffers->mBuffers[0].mDataByteSize );++    hb_list_getbytes( pv->list, buffers->mBuffers[0].mData,+                      buffers->mBuffers[0].mDataByteSize, &pts, &pos );++    *npackets = buffers->mBuffers[0].mDataByteSize / pv->isamplesiz;++    /* transform data from [-32768,32767] to [-1.0,1.0] */+    float *fdata = buffers->mBuffers[0].mData;+    int i;++    for( i = 0; i < *npackets * pv->nchannels; i++ )+        fdata[i] = fdata[i] / 32768.f;++    return noErr;+}++/***********************************************************************+ * Encode+ ***********************************************************************+ *+ **********************************************************************/+static hb_buffer_t * Encode( hb_work_object_t * w )+{+    hb_work_private_t * pv = w->private_data;+    UInt32 npackets = 1;++    /* check if we need more data */+    if( hb_list_bytes( pv->list ) < pv->isamples * pv->isamplesiz )+        return NULL;++    hb_buffer_t * obuf;+    AudioStreamPacketDescription odesc = { 0 };+    AudioBufferList obuflist = { .mNumberBuffers = 1,+                                 .mBuffers = { { .mNumberChannels = pv->nchannels } },+                               };++    obuf = hb_buffer_init( pv->omaxpacket );+    obuflist.mBuffers[0].mDataByteSize = obuf->size;+    obuflist.mBuffers[0].mData = obuf->data;++    AudioConverterFillComplexBuffer( pv->converter, inInputDataProc, pv,+                                     &npackets, &obuflist, &odesc );++    if( odesc.mDataByteSize == 0 )+        return NULL;++    obuf->start = pv->pts;+    pv->pts += 90000LL * pv->isamples / w->audio->config.out.samplerate;+    obuf->stop  = pv->pts;+    obuf->size  = odesc.mDataByteSize;+    obuf->frametype = HB_FRAME_AUDIO;++    return obuf;+}++/***********************************************************************+ * Work+ ***********************************************************************+ *+ **********************************************************************/+int encCoreAudioWork( hb_work_object_t * w, hb_buffer_t ** buf_in,+                  hb_buffer_t ** buf_out )+{+    hb_work_private_t * pv = w->private_data;+    hb_buffer_t * buf;++    if( (*buf_in)->size <= 0 )+    {+        // EOF on input - send it downstream & say we're done+        *buf_out = *buf_in;+        *buf_in = NULL;+        return HB_WORK_DONE;+    }++    hb_list_add( pv->list, *buf_in );+    *buf_in = NULL;++    *buf_out = buf = Encode( w );++    while( buf )+    {+        buf->next = Encode( w );+        buf       = buf->next;+    }++    return HB_WORK_OK;+}Index: libhb/hb.c===================================================================--- libhb/hb.c	(revision 2440)+++ libhb/hb.c	(working copy)@@ -86,7 +86,7 @@  * @param update_check signals libhb to check for updated version from HandBrake website.  * @return Handle to hb_handle_t for use on all subsequent calls to libhb.  */-hb_handle_t * hb_init_real( int verbose, int update_check )+hb_handle_t * hb_init( int verbose, int update_check ) {     hb_handle_t * h = calloc( sizeof( hb_handle_t ), 1 );     uint64_t      date;@@ -150,11 +150,29 @@     h->die         = 0;     h->main_thread = hb_thread_init( "libhb", thread_func, h,                                      HB_NORMAL_PRIORITY );+    hb_register( &hb_sync );+    hb_register( &hb_decmpeg2 );+    hb_register( &hb_decvobsub );+    hb_register( &hb_render );+    hb_register( &hb_encavcodec );+    hb_register( &hb_encxvid );+    hb_register( &hb_encx264 );+    hb_register( &hb_enctheora );+    hb_register( &hb_deca52 );+    hb_register( &hb_decdca );+    hb_register( &hb_decavcodec );+    hb_register( &hb_decavcodecv );+    hb_register( &hb_decavcodecvi );+    hb_register( &hb_decavcodecai );+    hb_register( &hb_declpcm );+    hb_register( &hb_encfaac );+    hb_register( &hb_enclame );+    hb_register( &hb_encvorbis );+#ifdef __APPLE__+	hb_register( &hb_encca_aac );+#endif     return h;--	/* Set the scan count to start at 0 */-	//scan_count = 0; } /**@@ -1301,7 +1319,7 @@  } /**- * Closes access to libhb by freeing the hb_handle_t handle ontained in hb_init_real.+ * Closes access to libhb by freeing the hb_handle_t handle ontained in hb_init.  * @param _h Pointer to handle to hb_handle_t.  */ void hb_close( hb_handle_t ** _h )Index: libhb/hb.h===================================================================--- libhb/hb.h	(revision 2440)+++ libhb/hb.h	(working copy)@@ -14,51 +14,9 @@ #define HB_DEBUG_NONE 0 #define HB_DEBUG_ALL  1 void          hb_register( hb_work_object_t * );-hb_handle_t * hb_init_real( int verbose, int update_check );+hb_handle_t * hb_init( int verbose, int update_check ); hb_handle_t * hb_init_dl ( int verbose, int update_check ); // hb_init for use with dylib-#define hb_init(v,u) \-hb_init_real( v, u ); \-hb_register( &hb_sync ); \-hb_register( &hb_decmpeg2 ); \-hb_register( &hb_decvobsub ); \-hb_register( &hb_encvobsub ); \-hb_register( &hb_deccc608 ); \-hb_register( &hb_render ); \-hb_register( &hb_encavcodec ); \-hb_register( &hb_encxvid ); \-hb_register( &hb_encx264 ); \-hb_register( &hb_enctheora ); \-hb_register( &hb_deca52 ); \-hb_register( &hb_decdca ); \-hb_register( &hb_decavcodec ); \-hb_register( &hb_decavcodecv ); \-hb_register( &hb_decavcodecvi ); \-hb_register( &hb_decavcodecai ); \-hb_register( &hb_declpcm ); \-hb_register( &hb_encfaac ); \-hb_register( &hb_enclame ); \-hb_register( &hb_encvorbis ); \--#define hb_init_express(v,u) \-hb_init_real( v, u ); \-hb_register( &hb_sync ); \-hb_register( &hb_decmpeg2 ); \-hb_register( &hb_decvobsub ); \-hb_register( &hb_encvobsub ); \-hb_register( &hb_deccc608 ); \-hb_register( &hb_render ); \-hb_register( &hb_encavcodec ); \-hb_register( &hb_encx264 ); \-hb_register( &hb_deca52 ); \-hb_register( &hb_decdca ); \-hb_register( &hb_decavcodec ); \-hb_register( &hb_decavcodecv ); \-hb_register( &hb_decavcodecvi ); \-hb_register( &hb_decavcodecai ); \-hb_register( &hb_declpcm ); \-hb_register( &hb_encfaac ); \- /* hb_get_version() */ char        * hb_get_version( hb_handle_t * ); int           hb_get_build( hb_handle_t * );Index: libhb/internal.h===================================================================--- libhb/internal.h	(revision 2440)+++ libhb/internal.h	(working copy)@@ -271,7 +271,8 @@     WORK_DECLPCM,     WORK_ENCFAAC,     WORK_ENCLAME,-    WORK_ENCVORBIS+    WORK_ENCVORBIS,+    WORK_ENC_CA_AAC }; enumIndex: libhb/work.c===================================================================--- libhb/work.c	(revision 2440)+++ libhb/work.c	(working copy)@@ -106,6 +106,7 @@         case HB_ACODEC_FAAC:   return hb_get_work( WORK_ENCFAAC );         case HB_ACODEC_LAME:   return hb_get_work( WORK_ENCLAME );         case HB_ACODEC_VORBIS: return hb_get_work( WORK_ENCVORBIS );+        case HB_ACODEC_CA_AAC:  return hb_get_work( WORK_ENC_CA_AAC );     }     return NULL; }@@ -329,8 +330,9 @@             else             {                 hb_log( "   + encoder: %s", ( audio->config.out.codec == HB_ACODEC_FAAC ) ?-                    "faac" : ( ( audio->config.out.codec == HB_ACODEC_LAME ) ? "lame" :-                    "vorbis" ) );+                    "faac" : ( ( audio->config.out.codec == HB_ACODEC_LAME ) ?+                    "lame" : ( ( audio->config.out.codec == HB_ACODEC_CA_AAC ) ?+                            "ca_aac" : "vorbis"  ) ) );                 hb_log( "     + bitrate: %d kbps, samplerate: %d Hz", audio->config.out.bitrate, audio->config.out.samplerate );             }         }Index: libhb/module.defs===================================================================--- libhb/module.defs	(revision 2440)+++ libhb/module.defs	(working copy)@@ -41,6 +41,7 @@     LIBHB.GCC.D += SYS_CYGWIN else ifeq ($(BUILD.system),darwin)     LIBHB.GCC.D += SYS_DARWIN+    LIBHB.c += $(wildcard $(LIBHB.src/)platform/macosx/*.c) else ifeq ($(BUILD.system),linux)     LIBHB.GCC.D += SYS_LINUX _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64 else ifeq ($(BUILD.system),mingw)Index: libhb/muxmkv.c===================================================================--- libhb/muxmkv.c	(revision 2440)+++ libhb/muxmkv.c	(working copy)@@ -226,6 +226,7 @@                 }                 break;             case HB_ACODEC_FAAC:+            case HB_ACODEC_CA_AAC:                 track->codecPrivate = audio->priv.config.aac.bytes;                 track->codecPrivateSize = audio->priv.config.aac.length;                 track->codecID = MK_ACODEC_AAC;Index: libhb/common.c===================================================================--- libhb/common.c	(revision 2440)+++ libhb/common.c	(working copy)@@ -31,7 +31,7 @@ { {  "32",  32 }, {  "40",  40 }, {  "48",  48 }, {  "56",  56 },   {  "64",  64 }, {  "80",  80 }, {  "96",  96 }, { "112", 112 },   { "128", 128 }, { "160", 160 }, { "192", 192 }, { "224", 224 },-  { "256", 256 }, { "320", 320 }, { "384", 384 } };+  { "256", 256 }, { "320", 320 }, { "384", 384 }, { "448", 448 } }; int hb_audio_bitrates_count = sizeof( hb_audio_bitrates ) /                               sizeof( hb_rate_t ); int hb_audio_bitrates_default = 8; /* 128 kbps */@@ -227,6 +227,7 @@         switch( audio->config.out.codec )         {             case HB_ACODEC_FAAC:+            case HB_ACODEC_CA_AAC:             case HB_ACODEC_VORBIS:                 samples_per_frame = 1024;                 break;Index: libhb/common.h===================================================================--- libhb/common.h	(revision 2440)+++ libhb/common.h	(working copy)@@ -286,6 +286,7 @@ #define HB_ACODEC_LPCM   0x002000 #define HB_ACODEC_DCA    0x004000 #define HB_ACODEC_FFMPEG 0x008000+#define HB_ACODEC_CA_AAC 0x010000 /* Audio Mixdown */ /* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */@@ -675,6 +676,7 @@ extern hb_work_object_t hb_encfaac; extern hb_work_object_t hb_enclame; extern hb_work_object_t hb_encvorbis;+extern hb_work_object_t hb_encca_aac; #define FILTER_OK      0 #define FILTER_DELAY   1Index: macosx/Controller.mm===================================================================--- macosx/Controller.mm	(revision 2440)+++ macosx/Controller.mm	(working copy)@@ -4787,10 +4787,14 @@         {             case 0:                 /* MP4 */-                // AAC+                // FAAC                 menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AAC (faac)" action: NULL keyEquivalent: @""];                 [menuItem setTag: HB_ACODEC_FAAC];+                // CA_AAC+                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AAC (CoreAudio)" action: NULL keyEquivalent: @""];+                [menuItem setTag: HB_ACODEC_CA_AAC];+                 // AC3 Passthru                 menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AC3 Passthru" action: NULL keyEquivalent: @""];                 [menuItem setTag: HB_ACODEC_AC3];@@ -5230,6 +5234,21 @@                 break;             }+        case HB_ACODEC_CA_AAC:+            /* check if we have a 6ch discrete conversion in either audio track */+            if ([[mixdownPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)+            {+                minbitrate = 128;+                maxbitrate = 768;+                break;+            }+            else+            {+                minbitrate = 64;+                maxbitrate = 320;+                break;+            }+             case HB_ACODEC_LAME:             /* Lame is happy using our min bitrate of 32 kbps */             minbitrate = 32;Index: macosx/HandBrake.xcodeproj/project.pbxproj===================================================================--- macosx/HandBrake.xcodeproj/project.pbxproj	(revision 2440)+++ macosx/HandBrake.xcodeproj/project.pbxproj	(working copy)@@ -57,6 +57,8 @@ 		A2D7AD6D0C998AD30082CA33 /* pref-picture.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A2D7AD640C998AD30082CA33 /* pref-picture.tiff */; }; 		A2D7AD6E0C998AD30082CA33 /* Queue.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A2D7AD650C998AD30082CA33 /* Queue.tiff */; }; 		A2D7AD6F0C998AD30082CA33 /* Source.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A2D7AD660C998AD30082CA33 /* Source.tiff */; };+		A906A0510F7A7B210007A827 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A906A0500F7A7B210007A827 /* AudioToolbox.framework */; };+		A906A0520F7A7B210007A827 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A906A0500F7A7B210007A827 /* AudioToolbox.framework */; }; 		A9AC41DF0C918DB500DDF9B8 /* HBAdvancedController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AC41DD0C918DB500DDF9B8 /* HBAdvancedController.m */; }; 		A9AC41E00C918DB500DDF9B8 /* HBAdvancedController.h in Headers */ = {isa = PBXBuildFile; fileRef = A9AC41DE0C918DB500DDF9B8 /* HBAdvancedController.h */; }; 		D289A9F30DBBE7AC00CE614B /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D289A9F20DBBE7AC00CE614B /* CoreServices.framework */; };@@ -177,6 +179,7 @@ 		A2D7AD640C998AD30082CA33 /* pref-picture.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "pref-picture.tiff"; sourceTree = "<group>"; }; 		A2D7AD650C998AD30082CA33 /* Queue.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Queue.tiff; sourceTree = "<group>"; }; 		A2D7AD660C998AD30082CA33 /* Source.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Source.tiff; sourceTree = "<group>"; };+		A906A0500F7A7B210007A827 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; }; 		A9AC41DD0C918DB500DDF9B8 /* HBAdvancedController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = HBAdvancedController.m; sourceTree = "<group>"; }; 		A9AC41DE0C918DB500DDF9B8 /* HBAdvancedController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HBAdvancedController.h; sourceTree = "<group>"; }; 		D289A9F20DBBE7AC00CE614B /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };@@ -224,6 +227,7 @@ 				2713E6300F676510002E0A01 /* libhb.a in Frameworks */, 				2774BE900F66F47100B65FC6 /* libbz2.dylib in Frameworks */, 				2774BE920F66F48200B65FC6 /* libz.dylib in Frameworks */,+				A906A0520F7A7B210007A827 /* AudioToolbox.framework in Frameworks */, 			); 			runOnlyForDeploymentPostprocessing = 0; 		};@@ -241,6 +245,7 @@ 				2713E6420F676526002E0A01 /* libhb.a in Frameworks */, 				2774BEC70F66F61A00B65FC6 /* libbz2.dylib in Frameworks */, 				2774BEC80F66F61A00B65FC6 /* libz.dylib in Frameworks */,+				A906A0510F7A7B210007A827 /* AudioToolbox.framework in Frameworks */, 			); 			runOnlyForDeploymentPostprocessing = 0; 		};@@ -288,6 +293,7 @@ 		29B97323FDCFA39411CA2CEA /* Frameworks */ = { 			isa = PBXGroup; 			children = (+				A906A0500F7A7B210007A827 /* AudioToolbox.framework */, 				A25962E00F15077500B3BF4E /* Quartz.framework */, 				A20F47000EBB5EC2005B861B /* QTKit.framework */, 				A20F46DB0EBB5E7A005B861B /* QuickTime.framework */,