summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-06-10 18:20:30 +0000
committerjstebbins <[email protected]>2011-06-10 18:20:30 +0000
commitbf638bca8ae57005b4d570b4260d10af45d1c7a0 (patch)
tree582f371110d7a1ab53b0ee107d3f35599b9495b7
parent8b804a5e65b322aa2a0cbbfd43e0c54b62b5f5f5 (diff)
libhb: clean up AVCodecContext initializations
also fixes warning message generated by libav when initializing "silence" sample about channel layout setting. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4038 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/decavcodec.c11
-rw-r--r--libhb/encavcodecaudio.c5
-rw-r--r--libhb/sync.c44
3 files changed, 50 insertions, 10 deletions
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 6d9632bab..770a7914e 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -203,8 +203,7 @@ static int decavcodecInit( hb_work_object_t * w, hb_job_t * job )
codec = avcodec_find_decoder( codec_id );
pv->parser = av_parser_init( codec_id );
- pv->context = avcodec_alloc_context();
- avcodec_get_context_defaults3(pv->context, codec);
+ pv->context = avcodec_alloc_context3(codec);
hb_ff_set_sample_fmt( pv->context, codec );
hb_avcodec_open( pv->context, codec, 0 );
@@ -522,8 +521,7 @@ static int decavcodecBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
info->name = strncpy( codec_name, codec->name, sizeof(codec_name)-1 );
AVCodecParserContext *parser = av_parser_init( codec->id );
- AVCodecContext *context = avcodec_alloc_context();
- avcodec_get_context_defaults3(context, codec);
+ AVCodecContext *context = avcodec_alloc_context3(codec);
hb_ff_set_sample_fmt( context, codec );
hb_avcodec_open( context, codec, 0 );
uint8_t *buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
@@ -1150,6 +1148,9 @@ static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
// first frame because of M$ VC1 braindamage).
if ( pv->context->extradata == NULL )
{
+ AVCodec *codec = avcodec_find_decoder( w->codec_param );
+ avcodec_get_context_defaults3( pv->context, codec );
+ hb_ff_set_sample_fmt( pv->context, codec );
if ( setup_extradata( w, in ) )
{
// we didn't find the headers needed to set up extradata.
@@ -1158,11 +1159,9 @@ static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
hb_buffer_close( &in );
return HB_WORK_OK;
}
- AVCodec *codec = avcodec_find_decoder( w->codec_param );
// There's a mis-feature in ffmpeg that causes the context to be
// incorrectly initialized the 1st time avcodec_open is called.
// If you close it and open a 2nd time, it finishes the job.
- hb_ff_set_sample_fmt( pv->context, codec );
hb_avcodec_open( pv->context, codec, 0 );
hb_avcodec_close( pv->context );
// disable threaded decoding for scan, can cause crashes
diff --git a/libhb/encavcodecaudio.c b/libhb/encavcodecaudio.c
index 9cf9c9831..7c0a51971 100644
--- a/libhb/encavcodecaudio.c
+++ b/libhb/encavcodecaudio.c
@@ -55,8 +55,7 @@ static int encavcodecaInit( hb_work_object_t * w, hb_job_t * job )
"failed" );
return 1;
}
- context = avcodec_alloc_context();
- avcodec_get_context_defaults3(context, codec);
+ context = avcodec_alloc_context3(codec);
int ret = av_set_string3( context, "stereo_mode", "ms_off", 1, NULL );
/* Let avutil sanity check the options for us*/
@@ -83,7 +82,7 @@ static int encavcodecaInit( hb_work_object_t * w, hb_job_t * job )
break;
default:
- hb_log(" encavcodecaInit: bad mixdown" );
+ hb_log("encavcodecaInit: bad mixdown" );
break;
}
diff --git a/libhb/sync.c b/libhb/sync.c
index f4cb29f25..670c019f2 100644
--- a/libhb/sync.c
+++ b/libhb/sync.c
@@ -1112,13 +1112,55 @@ static void InitAudio( hb_job_t * job, hb_sync_common_t * common, int i )
short * zeros;
codec = avcodec_find_encoder( CODEC_ID_AC3 );
- c = avcodec_alloc_context();
+ c = avcodec_alloc_context3( codec );
c->bit_rate = w->audio->config.in.bitrate;
c->sample_rate = w->audio->config.in.samplerate;
c->channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT( w->audio->config.in.channel_layout );
c->sample_fmt = AV_SAMPLE_FMT_FLT;
+ switch( w->audio->config.in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK )
+ {
+ case HB_INPUT_CH_LAYOUT_MONO:
+ c->channel_layout = AV_CH_LAYOUT_MONO;
+ break;
+
+ case HB_INPUT_CH_LAYOUT_STEREO:
+ case HB_INPUT_CH_LAYOUT_DOLBY:
+ c->channel_layout = AV_CH_LAYOUT_STEREO;
+ break;
+
+ case HB_INPUT_CH_LAYOUT_3F2R:
+ c->channel_layout = AV_CH_LAYOUT_5POINT0;
+ break;
+
+ case HB_INPUT_CH_LAYOUT_3F1R:
+ c->channel_layout = AV_CH_LAYOUT_4POINT0;
+ break;
+
+ case HB_INPUT_CH_LAYOUT_3F:
+ c->channel_layout = AV_CH_LAYOUT_SURROUND;
+ break;
+
+ case HB_INPUT_CH_LAYOUT_2F1R:
+ c->channel_layout = AV_CH_LAYOUT_2_1;
+ break;
+
+ case HB_INPUT_CH_LAYOUT_2F2R:
+ c->channel_layout = AV_CH_LAYOUT_QUAD;
+ break;
+
+ default:
+ c->channel_layout = AV_CH_LAYOUT_STEREO;
+ hb_log("sync: unrecognized channel layout" );
+ break;
+ }
+
+ if ( w->audio->config.in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE )
+ {
+ c->channel_layout |= AV_CH_LOW_FREQUENCY;
+ }
+
if( hb_avcodec_open( c, codec, 0 ) < 0 )
{
hb_log( "sync: avcodec_open failed" );