/* 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 ) );
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;
}
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 */
uint64_t pts;
hb_list_t * list;
+ int channelsused;
+ 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->channelsused = w->config->vorbis.channelsused;
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->channelsused,
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->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;
}
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->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 );
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
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;
}
} 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;
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;
}
}\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
}\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