OSDN Git Service

-6 channel surround for Vorbis/OGM. The channel mapping seems right for VLC, but...
authorsaintdev <saintdev@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Tue, 27 Mar 2007 09:28:40 +0000 (09:28 +0000)
committersaintdev <saintdev@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Tue, 27 Mar 2007 09:28:40 +0000 (09:28 +0000)
-Other small fixes.

git-svn-id: svn://localhost/HandBrake/trunk@456 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/encfaac.c
libhb/encvorbis.c
libhb/internal.h
libhb/work.c
test/test.c

index 84e1fcb..5eee395 100644 (file)
@@ -56,7 +56,7 @@ int encfaacInit( hb_work_object_t * w, hb_job_t * job )
        /* pass the number of channels used into the private work data */
        pv->channelsused = w->config->aac.channelsused;
 
-    pv->faac = faacEncOpen( job->arate, w->config->aac.channelsused, &pv->input_samples,
+    pv->faac = faacEncOpen( job->arate, pv->channelsused, &pv->input_samples,
                            &pv->output_bytes );
     pv->buf  = malloc( pv->input_samples * sizeof( float ) );
     
@@ -65,7 +65,7 @@ int encfaacInit( hb_work_object_t * w, hb_job_t * job )
     cfg->aacObjectType = LOW;
     cfg->allowMidside  = 1;
        
-       if (w->config->aac.channelsused == 6) {
+       if (pv->channelsused == 6) {
                /* we are preserving 5.1 audio into 6-channel AAC,
                so indicate that we have an lfe channel */
                cfg->useLfe    = 1;
@@ -74,12 +74,12 @@ int encfaacInit( hb_work_object_t * w, hb_job_t * job )
        }
 
     cfg->useTns        = 0;
-    cfg->bitRate       = job->abitrate * 1000 / w->config->aac.channelsused; /* Per channel */
+    cfg->bitRate       = job->abitrate * 1000 / pv->channelsused; /* Per channel */
     cfg->bandWidth     = 0;
     cfg->outputFormat  = 0;
     cfg->inputFormat   =  FAAC_INPUT_FLOAT;
        
-       if (w->config->aac.channelsused == 6) {
+       if (pv->channelsused == 6) {
                /* we are preserving 5.1 audio into 6-channel AAC, and need to
                re-map the output of deca52 into our own mapping - the mapping
                below is the default mapping expected by QuickTime */
index 4bdb6ef..01c71e8 100644 (file)
@@ -37,6 +37,8 @@ struct hb_work_private_s
     uint64_t        pts;
 
     hb_list_t     * list;
+    int           channelsused;
+    int           channel_map[6];
 };
 
 int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
@@ -46,6 +48,7 @@ int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
 
     hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
     w->private_data = pv;
+    pv->channelsused = w->config->vorbis.channelsused;
 
     pv->job   = job;
 
@@ -53,7 +56,7 @@ int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
 
     /* init */
     vorbis_info_init( &pv->vi );
-    if( vorbis_encode_setup_managed( &pv->vi, 2,
+    if( vorbis_encode_setup_managed( &pv->vi, pv->channelsused,
           job->arate, -1, 1000 * job->abitrate, -1 ) ||
         vorbis_encode_ctl( &pv->vi, OV_ECTL_RATEMANAGE_AVG, NULL ) ||
           vorbis_encode_setup_init( &pv->vi ) )
@@ -64,6 +67,7 @@ int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
     /* add a comment */
     vorbis_comment_init( &pv->vc );
     vorbis_comment_add_tag( &pv->vc, "Encoder", "HandBrake");
+    vorbis_comment_add_tag( &pv->vc, "LANGUAGE", w->config->vorbis.language);
 
     /* set up the analysis state and auxiliary encoding storage */
     vorbis_analysis_init( &pv->vd, &pv->vi);
@@ -80,11 +84,32 @@ int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
                 header[i].packet, header[i].bytes );
     }
 
-    pv->input_samples = 2 * OGGVORBIS_FRAME_SIZE;
+    pv->input_samples = pv->channelsused * OGGVORBIS_FRAME_SIZE;
     pv->buf = malloc( pv->input_samples * sizeof( float ) );
 
     pv->list = hb_list_init();
 
+    switch (pv->channelsused) {
+        case 1:
+            pv->channel_map[0] = 0;
+            break;
+        case 6:
+            pv->channel_map[0] = 0;
+            pv->channel_map[1] = 2;
+            pv->channel_map[2] = 1;
+            pv->channel_map[3] = 4;
+            pv->channel_map[4] = 5;
+            pv->channel_map[5] = 3;
+            break;
+        default:
+            hb_log("encvorbis.c: Unable to correctly proccess %d channels, assuming stereo.", pv->channelsused);
+        case 2:
+            // Assume stereo
+            pv->channel_map[0] = 0;
+            pv->channel_map[1] = 1;
+            break;
+    }
+
     return 0;
 }
 
@@ -143,7 +168,7 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     hb_work_private_t * pv = w->private_data;
     hb_buffer_t * buf;
     float ** buffer;
-    int i;
+    int i, j;
 
     /* Try to extract more data */
     if( ( buf = Flush( w ) ) )
@@ -162,8 +187,10 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     buffer = vorbis_analysis_buffer( &pv->vd, OGGVORBIS_FRAME_SIZE );
     for( i = 0; i < OGGVORBIS_FRAME_SIZE; i++ )
     {
-        buffer[0][i] = ((float *) pv->buf)[2*i]   / 32768.f;
-        buffer[1][i] = ((float *) pv->buf)[2*i+1] / 32768.f;
+        for( j = 0; j < pv->channelsused; j++)
+        {
+            buffer[j][i] = ((float *) pv->buf)[(pv->channelsused * i + pv->channel_map[j])] / 32768.f;
+        }
     }
     vorbis_analysis_wrote( &pv->vd, OGGVORBIS_FRAME_SIZE );
 
index baba562..fb57318 100644 (file)
@@ -136,11 +136,14 @@ union hb_esconfig_u
         int     length;
        /* Total channels actually used for this audio track */
        int channelsused;
+        int lfechannels;
     } aac;
 
     struct
     {
         uint8_t headers[3][HB_CONFIG_MAX_SIZE];
+        int channelsused;
+        char *language;
     } vorbis;
     
     struct
index e9ce46e..e8fafbd 100644 (file)
@@ -279,7 +279,7 @@ static void do_job( hb_job_t * job, int cpu_count )
                
                if (audio->channels == 5 && audio->lfechannels == 1) {
                        /* we have a 5.1 AC-3 source soundtrack */
-                       if (job->acodec == HB_ACODEC_FAAC && job->surround) {
+                       if ((job->acodec == HB_ACODEC_FAAC || job->acodec == HB_ACODEC_VORBIS) && job->surround) {
                                /* we're going to be encoding to AAC,
                                and have turned on the "preserve 5.1" flag */
                                audio->channelsused = 6;
@@ -290,7 +290,7 @@ static void do_job( hb_job_t * job, int cpu_count )
                        }
                } else if (audio->channels == 1 && audio->lfechannels == 0) {
                        /* we have a 1.0 mono AC-3 source soundtrack */
-                       if (job->acodec == HB_ACODEC_FAAC) {
+                       if (job->acodec == HB_ACODEC_FAAC || job->acodec == HB_ACODEC_VORBIS) {
                                /* we're going to be encoding to AAC,
                                so mix down to a mono AAC track */
                                audio->channelsused = 1;
@@ -305,7 +305,8 @@ static void do_job( hb_job_t * job, int cpu_count )
                        audio->channelsused = 2;
                }
                
-        audio->config.aac.channelsused = audio->config.a52.channelsused = audio->channelsused;
+        audio->config.aac.channelsused = audio->config.a52.channelsused = audio->config.vorbis.channelsused = audio->channelsused;
+        audio->config.vorbis.language = audio->lang_simple;
                
     }
 
index 2e1518a..5506cbd 100644 (file)
@@ -236,7 +236,7 @@ static void PrintTitleInfo( hb_title_t * title )
         }\r
         else\r
         {\r
-            fprintf( stderr, "    + %d, %s\n", i, audio->lang );\r
+            fprintf( stderr, "    + %d, %s\n", i + 1, audio->lang );\r
         }\r
     }\r
     fprintf( stderr, "  + subtitle tracks:\n" );\r
@@ -980,9 +980,9 @@ static int CheckOptions( int argc, char ** argv )
             }\r
         }\r
                \r
-               if (acodec != HB_ACODEC_FAAC)\r
+               if (acodec != HB_ACODEC_FAAC && acodec != HB_ACODEC_VORBIS)\r
                {\r
-                       /* only attempt 5.1 export if exporting to AAC */\r
+                       /* only attempt 5.1 export if exporting to AAC or Vorbis */\r
                        surround = 0;\r
                } else {\r
                    if (!abitrate && surround)\r