]> granicus.if.org Git - handbrake/commitdiff
Minor amendments to 5.1 audio support:
authormaurj <handbrake@maurj.com>
Tue, 13 Feb 2007 14:45:03 +0000 (14:45 +0000)
committermaurj <handbrake@maurj.com>
Tue, 13 Feb 2007 14:45:03 +0000 (14:45 +0000)
* ensuring that non-AAC audio formats always use a stereo mix (rather than mono)
* ensuring that Dolby Surround (Pro Logic) source is passed through as Dolby Surround (Pro Logic), and not mixed down to Stereo
* storing the ac3 flags with the job for later reference

Note: this is still using the settings for the last selected soundtrack for *all* soundtracks.  This needs improving, as they may not be of the same format!

Tested with mono, stereo, pro logic and 5.1 AC3 sources, to all output audio formats, with success all round :)

git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/0.8.0_beta2_5.1@319 b64f7644-9d1e-0410-96f1-a4d463321fa5

libmediafork/common.h
libmediafork/deca52.c
libmediafork/scan.c
libmediafork/work.c

index 20aab4def5256e9c5809fb6769c71feeb76c2089..082b1300c4dcd1fa2ec16fe733424e2bfe1f8b19 100644 (file)
@@ -144,11 +144,13 @@ struct hb_job_s
                 channelsused:   The # of channels we will actually use for this job -
                                 calculated based on surround, channels and lfechannels
                                                 in work.c
+         ac3flags:       stores the flags from the AC3 source, as found in scan.c
             surround:       1 if 5.1 should be preserved for AAC, 0 otherwise */
     int             audios[8];
     int             channels;
     int             lfechannels;
     int             channelsused;
+       int             ac3flags;
        int             surround;
 
     /* Audio settings:
@@ -222,6 +224,8 @@ struct hb_audio_s
     int  channels;
        /* indicates the number of lfe channels the source audio has */
        int  lfechannels;
+       /* stores the flags from the AC3 source, as found in scan.c */
+       int  ac3flags;
 
 #ifdef __LIBMEDIAFORK__
     /* Internal data */
index 9e11ec5e60cda1925fd6c5086d0094006916cd89..f2a52aa218b32259308244f413a873855902f788 100644 (file)
@@ -66,18 +66,25 @@ int deca52Init( hb_work_object_t * w, hb_job_t * job )
     pv->list      = hb_list_init();
     pv->state     = a52_init( 0 );
 
+       /* Decide what format we want out of a52dec
+       work.c has already done some of this deduction for us in do_job() */
+       
        if (job->channelsused == 6) {
                /* we're going to be encoding to AAC,
                and have turned on the "preserve 5.1" flag */
                pv->flags_out = A52_3F2R | A52_LFE;
        } else if (job->channelsused == 1) {
-               /* keep the mono-ness of the source audio */
+               /* we're going to be encoding to AAC,
+               /* and want to keep the mono-ness of the source audio */
                pv->flags_out = A52_MONO;
        } else if (job->channelsused == 2 && job->channels == 5 && job->lfechannels == 1) {
                /* we are mixing a 5.1 source down to stereo, so use dolby surround */
                pv->flags_out = A52_DOLBY;
+       } else if (job->channelsused == 2 && ((job->ac3flags & A52_CHANNEL_MASK) == A52_DOLBY)) {
+               /* we have a dolby stereo surround source, so preserve it */
+               pv->flags_out = A52_DOLBY;
        } else {
-               /* mix everything else down to stereo */
+               /* mix everything else down to plain stereo */
                pv->flags_out = A52_STEREO;
        }
 
index a32ddf61d9f68325fb15fd05682995c4c75e459b..3d24f28fcf20be18e145cbdd16ed37873574ce43 100644 (file)
@@ -490,6 +490,10 @@ static void LookForAC3( hb_title_t * title, hb_buffer_t * b )
                        } else {
                                audio->lfechannels = 0;
                        }
+                       
+                       /* store the AC3 tags for future reference
+                       This enables us to find out if we had a stereo or Dolby source later on */
+                       audio->ac3flags = flags;
 
             /* XXX */
             sprintf( audio->lang + strlen( audio->lang ),
index 9a19b643a5f3c3f5d42c70f75e84145e7e943e71..58ba8385f4406f8bb39a32462766f52d856d2032 100644 (file)
@@ -246,6 +246,11 @@ static void do_job( hb_job_t * job, int cpu_count )
                /* store this audio's channel counts with the job */
                /* this should be an array -
                we just use the last channel count for now */
+               
+               /* we will only end up with a channelsused value other than 2
+               if we are encoding to AAC.  All other audio encodings will get
+               a stereo mix. */
+               
                if (audio->channels == 5 && audio->lfechannels == 1) {
                        /* we have a 5.1 AC-3 source soundtrack */
                        if (job->acodec == HB_ACODEC_FAAC && job->surround) {
@@ -253,14 +258,24 @@ static void do_job( hb_job_t * job, int cpu_count )
                                and have turned on the "preserve 5.1" flag */
                                job->channelsused = 6;
                        } else {
-                               /* mix 5.1 down to Dolby Digital (2-channel) */
+                               /* mix 5.1 down to Dolby Digital (2-channel) for
+                               non-AAC audio, or for AAC without 5.1 preservation */
                                job->channelsused = 2;
                        }
                } else if (audio->channels == 1 && audio->lfechannels == 0) {
-                       /* keep the mono-ness of the source audio */
-                       job->channelsused = 1;
+                       /* we have a 1.0 mono AC-3 source soundtrack */
+                       if (job->acodec == HB_ACODEC_FAAC) {
+                               /* we're going to be encoding to AAC,
+                               so mix down to a mono AAC track */
+                               job->channelsused = 1;
+                       } else {
+                               /* mix up the mono track to stereo for non-AAC formats */
+                               job->channelsused = 2;
+                       }
                } else {
                        /* mix everything else down to stereo */
+                       /* dolby pro-logic will be preserved in deca52.c if necessary
+                       by referring to the value of job->ac3flags stored below */
                        job->channelsused = 2;
                }
                
@@ -269,6 +284,10 @@ static void do_job( hb_job_t * job, int cpu_count )
                job->channels = audio->channels;
                job->lfechannels = audio->lfechannels;
                
+               /* remember the AC3 flags for future reference */
+               /* again, we are using the last channel's flags for now */
+               job->ac3flags = audio->ac3flags;
+               
     }
 
     /* Init read & write threads */