All pastes #905764 Raw Edit

AAC/AC3

public diff v1 · immutable
#905764 ·published 2008-02-16 00:34 UTC
rendered paste body
Index: libhb/deca52.c===================================================================--- libhb/deca52.c	(revision 1265)+++ libhb/deca52.c	(working copy)@@ -215,7 +215,8 @@     hb_list_getbytes( pv->list, pv->frame, pv->size, &pts, &pos );      /* AC3 passthrough: don't decode the AC3 frame */-    if( pv->job->acodec & HB_ACODEC_AC3 )+    if( pv->job->acodec & HB_ACODEC_AC3 ||+        w->amixdown == HB_AMIXDOWN_AC3 )     {         buf = hb_buffer_init( pv->size );         memcpy( buf->data, pv->frame, pv->size );Index: libhb/muxmp4.c===================================================================--- libhb/muxmp4.c	(revision 1265)+++ libhb/muxmp4.c	(working copy)@@ -303,7 +303,8 @@         mux_data = malloc( sizeof( hb_mux_data_t ) );         audio->mux_data = mux_data; -        if( job->acodec & HB_ACODEC_AC3 )+        if( job->acodec & HB_ACODEC_AC3 ||+            job->audio_mixdowns[i] == HB_AMIXDOWN_AC3 )         {             mux_data->track = MP4AddAC3AudioTrack(                  m->file,Index: libhb/sync.c===================================================================--- libhb/sync.c	(revision 1265)+++ libhb/sync.c	(working copy)@@ -144,7 +144,8 @@      for( i = 0; i < hb_list_count( title->list_audio ); i++ )     {-        if( job->acodec & HB_ACODEC_AC3 )+        if( job->acodec & HB_ACODEC_AC3 ||+            job->audio_mixdowns[i] == HB_AMIXDOWN_AC3 )         {             free( pv->sync_audio[i].ac3_buf );         }@@ -206,7 +207,8 @@     sync        = &pv->sync_audio[i];     sync->audio = hb_list_item( title->list_audio, i ); -    if( job->acodec & HB_ACODEC_AC3 )+    if( job->acodec & HB_ACODEC_AC3 ||+        job->audio_mixdowns[i] == HB_AMIXDOWN_AC3 )     {         /* Have a silent AC-3 frame ready in case we have to fill a            gap */@@ -637,7 +639,8 @@     sync   = &pv->sync_audio[i];     audio  = sync->audio; -    if( job->acodec & HB_ACODEC_AC3 )+    if( job->acodec & HB_ACODEC_AC3 ||+        job->audio_mixdowns[i] == HB_AMIXDOWN_AC3 )     {         fifo = audio->fifo_out;         rate = audio->rate;@@ -799,7 +802,8 @@             }         } -        if( job->acodec & HB_ACODEC_AC3 )+        if( job->acodec & HB_ACODEC_AC3 ||+            job->audio_mixdowns[i] == HB_AMIXDOWN_AC3 )         {             buf        = hb_fifo_get( audio->fifo_raw );             buf->start = start;@@ -915,7 +919,8 @@     job    = pv->job;     sync   = &pv->sync_audio[i]; -    if( job->acodec & HB_ACODEC_AC3 )+    if( job->acodec & HB_ACODEC_AC3 ||+        job->audio_mixdowns[i] == HB_AMIXDOWN_AC3 )     {         buf        = hb_buffer_init( sync->ac3_size );         buf->start = sync->count_frames * 90000 / sync->audio->rate;Index: libhb/work.c===================================================================--- libhb/work.c	(revision 1265)+++ libhb/work.c	(working copy)@@ -351,7 +351,8 @@     if ( job->dynamic_range_compression )         hb_log(" + dynamic range compression: %f", job->dynamic_range_compression); -    /* if we are doing AC3 passthru, then remove any non-AC3 audios from the job */+    /* if we are doing AC3 passthru (at the codec level, not pass-through), +     * then remove any non-AC3 audios from the job */     /* otherwise, Bad Things will happen */     for( i = 0; i < hb_list_count( title->list_audio ); )     {@@ -389,6 +390,8 @@         int audioCodecsSupport6Ch =  ((audio->codec == HB_ACODEC_AC3 ||             audio->codec == HB_ACODEC_DCA) && (job->acodec == HB_ACODEC_FAAC || job->acodec == HB_ACODEC_VORBIS)); +        if( job->audio_mixdowns[i] != HB_AMIXDOWN_AC3 )+        {         /* find out what the format of our source audio is */         switch (audio->input_channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK) {         @@ -481,6 +484,7 @@                 }          }+        }  		/* log the output mixdown */ 		for (j = 0; j < hb_audio_mixdowns_count; j++) {@@ -496,12 +500,16 @@          audio->config.vorbis.language = audio->lang_simple; -		/* set up the audio work structures */+        /* set up the audio work structures */         audio->fifo_in   = hb_fifo_init( 2048 );         audio->fifo_raw  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );         audio->fifo_sync = hb_fifo_init( FIFO_CPU_MULT * cpu_count );         audio->fifo_out  = hb_fifo_init( FIFO_CPU_MULT * cpu_count ); ++        /*+         * Audio Decoder Thread+         */         switch( audio->codec )         {             case HB_ACODEC_AC3:@@ -529,8 +537,13 @@                  hb_list_add( job->list_work, audio_w ); -        switch( job->acodec )+        /*+         * Audio Encoder Thread+         */+        if( job->audio_mixdowns[i] != HB_AMIXDOWN_AC3 )         {+            switch( job->acodec )+            {             case HB_ACODEC_FAAC:                 w = getWork( WORK_ENCFAAC );                 break;@@ -540,10 +553,15 @@             case HB_ACODEC_VORBIS:                 w = getWork( WORK_ENCVORBIS );                 break;+            }         } -        if( job->acodec != HB_ACODEC_AC3 )+        if( job->acodec != HB_ACODEC_AC3 &&+            job->audio_mixdowns[i] != HB_AMIXDOWN_AC3)         {+            /*+             * Add the encoder thread if not doing AC-3 pass through+             */             w->fifo_in       = audio->fifo_sync;             w->fifo_out      = audio->fifo_out;             w->config        = &audio->config;Index: libhb/common.c===================================================================--- libhb/common.c	(revision 1265)+++ libhb/common.c	(working copy)@@ -43,7 +43,9 @@   { "Stereo",             "HB_AMIXDOWN_STEREO",    "stereo", HB_AMIXDOWN_STEREO    },   { "Dolby Surround",     "HB_AMIXDOWN_DOLBY",     "dpl1",   HB_AMIXDOWN_DOLBY     },   { "Dolby Pro Logic II", "HB_AMIXDOWN_DOLBYPLII", "dpl2",   HB_AMIXDOWN_DOLBYPLII },-  { "6-channel discrete", "HB_AMIXDOWN_6CH",       "6ch",    HB_AMIXDOWN_6CH       } };+  { "6-channel discrete", "HB_AMIXDOWN_6CH",       "6ch",    HB_AMIXDOWN_6CH       },+  { "AC-3 Pass-through",  "HB_AMIXDOWN_AC3",       "ac-3",   HB_AMIXDOWN_AC3       },+}; int hb_audio_mixdowns_count = sizeof( hb_audio_mixdowns ) /                               sizeof( hb_mixdown_t ); @@ -224,13 +226,22 @@     {         /* Audio data */         int abitrate;-        if( job->acodec & HB_ACODEC_AC3 )+        if( job->acodec & HB_ACODEC_AC3 ||+            job->audio_mixdowns[i] == HB_AMIXDOWN_AC3)         {+            /*+             * For AC-3 we take the bitrate from the input audio+             * bitrate as we are simply passing it through.+             */             audio = hb_list_item( title->list_audio, job->audios[i] );             abitrate = audio->bitrate / 8;         }         else         {+            /*+             * Where we are transcoding the audio we use the destination+             * bitrate.+             */             abitrate = job->abitrate * 1000 / 8;         }         avail -= length * abitrate;Index: libhb/common.h===================================================================--- libhb/common.h	(revision 1265)+++ libhb/common.h	(working copy)@@ -211,6 +211,8 @@ // A52_FORMAT of A52_3F2R | A52_LFE        = 23   = 0x17 // discrete channel count of 6 +#define HB_AMIXDOWN_AC3                         0x20000000+ /* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */ #define HB_AMIXDOWN_GET_DCA_FORMAT( a ) ( ( a & HB_AMIXDOWN_DCA_FORMAT_MASK ) >> 12 ) #define HB_AMIXDOWN_GET_A52_FORMAT( a ) ( ( a & HB_AMIXDOWN_A52_FORMAT_MASK ) >> 4 )Index: macosx/Controller.mm===================================================================--- macosx/Controller.mm	(revision 1266)+++ macosx/Controller.mm	(working copy)@@ -2922,6 +2922,16 @@                     maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[4].amixdown);                 } +                /* do we want to add an AC-3 passthrough option? */+                if (audio->codec == HB_ACODEC_AC3) {+                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:+                        [NSString stringWithCString: hb_audio_mixdowns[5].human_readable_name]+                        action: NULL keyEquivalent: @""];+                    [menuItem setTag: hb_audio_mixdowns[5].amixdown];+                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[5].amixdown;+                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[5].amixdown);+                }+                 /* auto-select the best mixdown based on our saved mixdown preference */                                  /* for now, this is hard-coded to a "best" mixdown of HB_AMIXDOWN_DOLBYPLII */@@ -2975,7 +2985,10 @@     {         case HB_ACODEC_FAAC:             /* check if we have a 6ch discrete conversion in either audio track */-            if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)+            if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || +                [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || +                [[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_AC3 || +                [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_AC3)             {                 /* FAAC is happy using our min bitrate of 32 kbps, even for 6ch */                 minbitrate = 32;@@ -3041,7 +3054,10 @@     }      /* select the default bitrate (but use 384 for 6-ch AAC) */-    if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)+    if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || +        [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH ||+        [[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_AC3 || +        [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_AC3)     {         [fAudBitratePopUp selectItemWithTag: 384];     }