summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaintdev <[email protected]>2007-03-27 09:28:40 +0000
committersaintdev <[email protected]>2007-03-27 09:28:40 +0000
commita7c616dbf0aa3a4d55f0f2ea0de6f0170b547e0a (patch)
tree3b13dd7e5a40a81ceb316e0dfd86a68d3b97b034
parente9a5be8343b44b27da04450f2c8ece93279097b1 (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
-rw-r--r--libhb/encfaac.c8
-rw-r--r--libhb/encvorbis.c37
-rw-r--r--libhb/internal.h3
-rw-r--r--libhb/work.c7
-rw-r--r--test/test.c6
5 files changed, 46 insertions, 15 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;
}
diff --git a/test/test.c b/test/test.c
index 2e1518a08..5506cbd11 100644
--- a/test/test.c
+++ b/test/test.c
@@ -236,7 +236,7 @@ static void PrintTitleInfo( hb_title_t * title )
}
else
{
- fprintf( stderr, " + %d, %s\n", i, audio->lang );
+ fprintf( stderr, " + %d, %s\n", i + 1, audio->lang );
}
}
fprintf( stderr, " + subtitle tracks:\n" );
@@ -980,9 +980,9 @@ static int CheckOptions( int argc, char ** argv )
}
}
- if (acodec != HB_ACODEC_FAAC)
+ if (acodec != HB_ACODEC_FAAC && acodec != HB_ACODEC_VORBIS)
{
- /* only attempt 5.1 export if exporting to AAC */
+ /* only attempt 5.1 export if exporting to AAC or Vorbis */
surround = 0;
} else {
if (!abitrate && surround)