summaryrefslogtreecommitdiffstats
path: root/libhb/decavcodec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/decavcodec.c')
-rw-r--r--libhb/decavcodec.c83
1 files changed, 45 insertions, 38 deletions
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 610ec1120..63b1c6dff 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -74,7 +74,7 @@ static int decavcodecBSInfo( hb_work_object_t *, const hb_buffer_t *, hb_work_in
hb_work_object_t hb_decavcodec =
{
WORK_DECAVCODEC,
- "MPGA decoder (libavcodec)",
+ "Audio decoder (libavcodec)",
decavcodecInit,
decavcodecWork,
decavcodecClose,
@@ -1327,23 +1327,6 @@ static void init_ffmpeg_context( hb_work_object_t *w )
pv->brokenByMicrosoft = 1;
}
-static void prepare_ffmpeg_buffer( hb_buffer_t * in )
-{
- // ffmpeg requires an extra 8 bytes of zero at the end of the buffer and
- // will seg fault in odd, data dependent ways if it's not there. (my guess
- // is this is a case of a local performance optimization creating a global
- // performance degradation since all the time wasted by extraneous data
- // copies & memory zeroing has to be huge compared to the minor reduction
- // in inner-loop instructions this affords - modern cpus bottleneck on
- // memory bandwidth not instruction bandwidth).
- if ( in->size + FF_INPUT_BUFFER_PADDING_SIZE > in->alloc )
- {
- // have to realloc to add the padding
- hb_buffer_realloc( in, in->size + FF_INPUT_BUFFER_PADDING_SIZE );
- }
- memset( in->data + in->size, 0, FF_INPUT_BUFFER_PADDING_SIZE );
-}
-
static int decavcodecviInit( hb_work_object_t * w, hb_job_t * job )
{
@@ -1429,7 +1412,6 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
pv->new_chap = in->new_chap;
pv->chap_time = pts >= 0? pts : pv->pts_next;
}
- prepare_ffmpeg_buffer( in );
decodeFrame( pv, in->data, in->size, in->sequence, in->start, in->renderOffset );
hb_buffer_close( &in );
*buf_out = link_buf_list( pv );
@@ -1475,7 +1457,7 @@ static hb_buffer_t * downmixAudio(
else
{
buf = hb_buffer_init( nsamples * sizeof(float) );
- memcpy(buf->data, buffer, nsamples * sizeof(float) );
+ memcpy( buf->data, buffer, nsamples * sizeof(float) );
}
return buf;
@@ -1524,7 +1506,34 @@ static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *dat
pos += len;
if( out_size > 0 )
{
- // We require signed 16-bit ints for the output format. If
+ int isamp = av_get_bytes_per_sample( context->sample_fmt );
+ nsamples = out_size / isamp;
+ double pts_next = pv->pts_next + nsamples * pv->duration;
+
+ // DTS-HD can be passed through to mkv
+ if( audio->config.out.codec & HB_ACODEC_PASS_FLAG )
+ {
+ // Note that even though we are doing passthru, we had
+ // to decode so that we know the stop time and the
+ // pts of the next audio packet.
+ hb_buffer_t * buf;
+
+ buf = hb_buffer_init( avp.size );
+ memcpy( buf->data, avp.data, len );
+ buf->start = pv->pts_next;
+ buf->stop = pts_next;
+ hb_list_add( pv->list, buf );
+
+ if ( hb_list_count( audio->priv.ff_audio_list ) == 0 )
+ {
+ pv->pts_next = pts_next;
+ continue;
+ }
+ // Fall through and process the list of other audio
+ // pipelines that use this ffmpeg audio stream.
+ }
+
+ // We require signed floats for the output format. If
// we got something different convert it.
if ( context->sample_fmt != AV_SAMPLE_FMT_FLT )
{
@@ -1535,16 +1544,13 @@ static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *dat
// anything more complicated than a one-for-one format
// conversion we'd probably want to cache the converter
// context in the pv.
- int isamp;
AVAudioConvert *ctx;
- isamp = av_get_bytes_per_sample( context->sample_fmt );
ctx = av_audio_convert_alloc( AV_SAMPLE_FMT_FLT, 1,
context->sample_fmt, 1,
NULL, 0 );
// get output buffer size then malloc a buffer
- nsamples = out_size / isamp;
buffer = av_malloc( nsamples * sizeof(hb_sample_t) );
// we're doing straight sample format conversion which
@@ -1557,16 +1563,11 @@ static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *dat
av_audio_convert( ctx, obuf, ostride, ibuf, istride, nsamples );
av_audio_convert_free( ctx );
}
- else
- {
- nsamples = out_size / sizeof(hb_sample_t);
- }
- hb_buffer_t * buf;
- double pts_next = pv->pts_next + nsamples * pv->duration;
- buf = downmixAudio( audio, pv, buffer, context->channels, nsamples );
- if ( buf )
+ if ( !( audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
{
+ hb_buffer_t * buf;
+ buf = downmixAudio( audio, pv, buffer, context->channels, nsamples );
buf->start = pv->pts_next;
buf->stop = pts_next;
hb_list_add( pv->list, buf );
@@ -1579,13 +1580,20 @@ static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *dat
hb_work_private_t *ff_pv = hb_list_item( pv->ff_audio_list, i );
if ( ff_pv )
{
- buf = downmixAudio( ff_audio, ff_pv, buffer, context->channels, nsamples );
- if ( buf )
+ hb_buffer_t * buf;
+
+ if ( !( ff_audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
+ {
+ buf = downmixAudio( ff_audio, ff_pv, buffer, context->channels, nsamples );
+ }
+ else
{
- buf->start = pv->pts_next;
- buf->stop = pts_next;
- hb_list_add( ff_pv->list, buf );
+ buf = hb_buffer_init( avp.size );
+ memcpy( buf->data, avp.data, len );
}
+ buf->start = pv->pts_next;
+ buf->stop = pts_next;
+ hb_list_add( ff_pv->list, buf );
}
}
pv->pts_next = pts_next;
@@ -1639,7 +1647,6 @@ static int decavcodecaiWork( hb_work_object_t *w, hb_buffer_t **buf_in,
{
pv->pts_next = in->start;
}
- prepare_ffmpeg_buffer( in );
decodeAudio( w->audio, pv, in->data, in->size, pv->pts_next );
writeAudioFifos( w );
*buf_out = link_buf_list( pv );