summaryrefslogtreecommitdiffstats
path: root/libhb/encfaac.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/encfaac.c')
-rw-r--r--libhb/encfaac.c293
1 files changed, 0 insertions, 293 deletions
diff --git a/libhb/encfaac.c b/libhb/encfaac.c
deleted file mode 100644
index 4060c778a..000000000
--- a/libhb/encfaac.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/* encfaac.c
-
- Copyright (c) 2003-2014 HandBrake Team
- This file is part of the HandBrake source code
- Homepage: <http://handbrake.fr/>.
- It may be used under the terms of the GNU General Public License v2.
- For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
- */
-
-#ifdef USE_FAAC
-#include "hb.h"
-#include "audio_remap.h"
-
-#include "faac.h"
-
-struct hb_work_private_s
-{
- hb_job_t * job;
-
- faacEncHandle * faac;
- unsigned long input_samples;
- unsigned long output_bytes;
- uint8_t * buf;
- uint8_t * obuf;
- hb_list_t * list;
- double pts;
- double framedur;
- int out_discrete_channels;
-};
-
-int encfaacInit( hb_work_object_t *, hb_job_t * );
-int encfaacWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );
-void encfaacClose( hb_work_object_t * );
-
-hb_work_object_t hb_encfaac =
-{
- WORK_ENCFAAC,
- "AAC encoder (libfaac)",
- encfaacInit,
- encfaacWork,
- encfaacClose
-};
-
-/***********************************************************************
- * hb_work_encfaac_init
- ***********************************************************************
- *
- **********************************************************************/
-int encfaacInit( hb_work_object_t * w, hb_job_t * job )
-{
- hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
- hb_audio_t * audio = w->audio;
- faacEncConfigurationPtr cfg;
- uint8_t * bytes;
- unsigned long length;
-
- w->private_data = pv;
-
- pv->job = job;
-
- /* pass the number of channels used into the private work data */
- pv->out_discrete_channels = hb_mixdown_get_discrete_channel_count(audio->config.out.mixdown);
-
- pv->faac = faacEncOpen( audio->config.out.samplerate, pv->out_discrete_channels,
- &pv->input_samples, &pv->output_bytes );
- pv->buf = malloc( pv->input_samples * sizeof( float ) );
- pv->obuf = malloc( pv->output_bytes );
- pv->framedur = 90000.0 * pv->input_samples /
- ( audio->config.out.samplerate * pv->out_discrete_channels );
- audio->config.out.samples_per_frame = pv->input_samples / pv->out_discrete_channels;
-
- cfg = faacEncGetCurrentConfiguration( pv->faac );
- cfg->mpegVersion = MPEG4;
- cfg->aacObjectType = LOW;
- cfg->allowMidside = 1;
-
- /* channel configuration & remapping */
- uint64_t layout = hb_ff_mixdown_xlat(audio->config.out.mixdown, NULL);
- hb_audio_remap_build_table(&hb_aac_chan_map, audio->config.in.channel_map,
- layout, cfg->channel_map);
-
- switch (audio->config.out.mixdown)
- {
- case HB_AMIXDOWN_7POINT1:
- cfg->channelConfiguration = 0;
- cfg->numFrontChannels = 3;
- cfg->numSideChannels = 2;
- cfg->numBackChannels = 2;
- cfg->numLFEChannels = 1;
- break;
-
- case HB_AMIXDOWN_6POINT1:
- cfg->channelConfiguration = 0;
- cfg->numFrontChannels = 3;
- cfg->numSideChannels = 0;
- cfg->numBackChannels = 3;
- cfg->numLFEChannels = 1;
- break;
-
- case HB_AMIXDOWN_5_2_LFE:
- cfg->channelConfiguration = 7;
- break;
-
- default:
- cfg->channelConfiguration =
- hb_mixdown_get_discrete_channel_count(audio->config.out.mixdown);
- break;
- }
-
- cfg->useTns = 0;
- cfg->bitRate = audio->config.out.bitrate * 1000 / pv->out_discrete_channels; /* Per channel */
- cfg->bandWidth = 0;
- cfg->outputFormat = 0;
- cfg->inputFormat = FAAC_INPUT_FLOAT;
-
- if( !faacEncSetConfiguration( pv->faac, cfg ) )
- {
- hb_log( "faacEncSetConfiguration failed" );
- *job->done_error = HB_ERROR_INIT;
- *job->die = 1;
- return 0;
- }
-
- if( faacEncGetDecoderSpecificInfo( pv->faac, &bytes, &length ) < 0 )
- {
- hb_log( "faacEncGetDecoderSpecificInfo failed" );
- *job->done_error = HB_ERROR_INIT;
- *job->die = 1;
- return 0;
- }
- memcpy( w->config->extradata.bytes, bytes, length );
- w->config->extradata.length = length;
- free( bytes );
-
- pv->list = hb_list_init();
-
- return 0;
-}
-
-/***********************************************************************
- * Close
- ***********************************************************************
- *
- **********************************************************************/
-void encfaacClose( hb_work_object_t * w )
-{
- hb_work_private_t * pv = w->private_data;
- if ( pv )
- {
- if ( pv->faac )
- {
- faacEncClose( pv->faac );
- pv->faac = NULL;
- }
- if ( pv->buf )
- {
- free( pv->buf );
- pv->buf = NULL;
- }
- if ( pv->obuf )
- {
- free( pv->obuf );
- pv->obuf = NULL;
- }
- if ( pv->list )
- hb_list_empty( &pv->list );
-
- free( pv );
- w->private_data = NULL;
- }
-}
-
-/***********************************************************************
- * Encode
- ***********************************************************************
- *
- **********************************************************************/
-static hb_buffer_t * Encode( hb_work_object_t * w )
-{
- hb_work_private_t * pv = w->private_data;
-
- if( hb_list_bytes( pv->list ) < pv->input_samples * sizeof( float ) )
- {
- /* Need more data */
- return NULL;
- }
-
- uint64_t pts, pos;
- hb_list_getbytes( pv->list, pv->buf, pv->input_samples * sizeof( float ),
- &pts, &pos );
-
- int i;
- float *fltBuf = (float*)pv->buf;
- for ( i = 0; i < pv->input_samples; i++ )
- fltBuf[i] *= 32768.0;
-
- int size = faacEncEncode( pv->faac, (int32_t *)pv->buf, pv->input_samples,
- pv->obuf, pv->output_bytes );
-
- // AAC needs four frames before it can start encoding so we'll get nothing
- // on the first three calls to the encoder.
- if ( size > 0 )
- {
- hb_buffer_t * buf = hb_buffer_init( size );
- memcpy( buf->data, pv->obuf, size );
- buf->size = size;
- buf->s.start = pv->pts;
- buf->s.duration = pv->framedur;
- buf->s.stop = buf->s.start + buf->s.duration;
- buf->s.type = AUDIO_BUF;
- buf->s.frametype = HB_FRAME_AUDIO;
- pv->pts += pv->framedur;
- return buf;
- }
- return NULL;
-}
-
-static hb_buffer_t *Flush( hb_work_object_t *w, hb_buffer_t *bufin )
-{
- hb_work_private_t *pv = w->private_data;
-
- // pad whatever data we have out to four input frames.
- int nbytes = hb_list_bytes( pv->list );
- int pad = pv->input_samples * sizeof(float) * 4 - nbytes;
- if ( pad > 0 )
- {
- hb_buffer_t *tmp = hb_buffer_init( pad );
- memset( tmp->data, 0, pad );
- hb_list_add( pv->list, tmp );
- }
-
- // There are up to three frames buffered in the encoder plus one
- // in our list buffer so four calls to Encode should get them all.
- hb_buffer_t *bufout = NULL, *buf = NULL;
- while ( hb_list_bytes( pv->list ) >= pv->input_samples * sizeof(float) )
- {
- hb_buffer_t *b = Encode( w );
- if ( b )
- {
- if ( bufout == NULL )
- {
- bufout = b;
- }
- else
- {
- buf->next = b;
- }
- buf = b;
- }
- }
- // add the eof marker to the end of our buf chain
- if ( buf )
- buf->next = bufin;
- else
- bufout = bufin;
- return bufout;
-}
-
-/***********************************************************************
- * Work
- ***********************************************************************
- *
- **********************************************************************/
-int encfaacWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
- hb_buffer_t ** buf_out )
-{
- hb_work_private_t * pv = w->private_data;
- hb_buffer_t * buf;
-
- if ( (*buf_in)->size <= 0 )
- {
- // EOF on input. Finish encoding what we have buffered then send
- // it & the eof downstream.
-
- *buf_out = Flush( w, *buf_in );
- *buf_in = NULL;
- return HB_WORK_DONE;
- }
-
- hb_list_add( pv->list, *buf_in );
- *buf_in = NULL;
-
- *buf_out = buf = Encode( w );
-
- while( buf )
- {
- buf->next = Encode( w );
- buf = buf->next;
- }
-
- return HB_WORK_OK;
-}
-#endif // USE_FAAC