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 )
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;
/* 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 ) )
/* 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);
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;
}
**********************************************************************/
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;
}
/***********************************************************************
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 ) ) )
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 );