OSDN Git Service

Updated do_job() in work.c to remove any non-AC3 audio tracks from the job before...
[handbrake-jp/handbrake-jp-git.git] / libhb / encvorbis.c
index 4bdb6ef..df91e14 100644 (file)
@@ -37,6 +37,8 @@ struct hb_work_private_s
     uint64_t        pts;
 
     hb_list_t     * list;
+    int           out_discrete_channels;
+    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->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(w->amixdown);
 
     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->out_discrete_channels,
           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->out_discrete_channels * OGGVORBIS_FRAME_SIZE;
     pv->buf = malloc( pv->input_samples * sizeof( float ) );
 
     pv->list = hb_list_init();
 
+    switch (pv->out_discrete_channels) {
+        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->out_discrete_channels);
+        case 2:
+            // Assume stereo
+            pv->channel_map[0] = 0;
+            pv->channel_map[1] = 1;
+            break;
+    }
+
     return 0;
 }
 
@@ -95,6 +120,18 @@ int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
  **********************************************************************/
 void encvorbisClose( hb_work_object_t * w )
 {
+    hb_work_private_t * pv = w->private_data;
+    
+    vorbis_block_clear( &pv->vb );
+    vorbis_dsp_clear( &pv->vd );
+    vorbis_comment_clear( &pv->vc );
+    vorbis_info_clear( &pv->vi );
+    
+    hb_list_empty( &pv->list );
+    
+    free( pv->buf );
+    free( pv );
+    w->private_data = NULL;
 }
 
 /***********************************************************************
@@ -143,7 +180,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 +199,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->out_discrete_channels; j++)
+        {
+            buffer[j][i] = ((float *) pv->buf)[(pv->out_discrete_channels * i + pv->channel_map[j])] / 32768.f;
+        }
     }
     vorbis_analysis_wrote( &pv->vd, OGGVORBIS_FRAME_SIZE );