diff options
author | saintdev <[email protected]> | 2007-03-27 09:28:40 +0000 |
---|---|---|
committer | saintdev <[email protected]> | 2007-03-27 09:28:40 +0000 |
commit | a7c616dbf0aa3a4d55f0f2ea0de6f0170b547e0a (patch) | |
tree | 3b13dd7e5a40a81ceb316e0dfd86a68d3b97b034 /libhb | |
parent | e9a5be8343b44b27da04450f2c8ece93279097b1 (diff) |
-6 channel surround for Vorbis/OGM. The channel mapping seems right for VLC, but may be messed up for other players.
-Other small fixes.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@456 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r-- | libhb/encfaac.c | 8 | ||||
-rw-r--r-- | libhb/encvorbis.c | 37 | ||||
-rw-r--r-- | libhb/internal.h | 3 | ||||
-rw-r--r-- | libhb/work.c | 7 |
4 files changed, 43 insertions, 12 deletions
diff --git a/libhb/encfaac.c b/libhb/encfaac.c index 84e1fcbaf..5eee39508 100644 --- a/libhb/encfaac.c +++ b/libhb/encfaac.c @@ -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 */ diff --git a/libhb/encvorbis.c b/libhb/encvorbis.c index 4bdb6efeb..01c71e844 100644 --- a/libhb/encvorbis.c +++ b/libhb/encvorbis.c @@ -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 ); diff --git a/libhb/internal.h b/libhb/internal.h index baba5627b..fb5731881 100644 --- a/libhb/internal.h +++ b/libhb/internal.h @@ -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 diff --git a/libhb/work.c b/libhb/work.c index e9ce46e9f..e8fafbdc4 100644 --- a/libhb/work.c +++ b/libhb/work.c @@ -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; } |