+/**********************************************************************
+ * hb_filter_close
+ **********************************************************************
+ *
+ *********************************************************************/
+void hb_filter_close( hb_filter_object_t ** _f )
+{
+ hb_filter_object_t * f = *_f;
+
+ f->close( f->private_data );
+
+ if( f->name )
+ free( f->name );
+ if( f->settings )
+ free( f->settings );
+
+ free( f );
+ *_f = NULL;
+}
+
+/**********************************************************************
+ * hb_audio_copy
+ **********************************************************************
+ *
+ *********************************************************************/
+hb_audio_t *hb_audio_copy(const hb_audio_t *src)
+{
+ hb_audio_t *audio = NULL;
+
+ if( src )
+ {
+ audio = calloc(1, sizeof(*audio));
+ memcpy(audio, src, sizeof(*audio));
+ }
+ return audio;
+}
+
+/**********************************************************************
+ * hb_audio_new
+ **********************************************************************
+ *
+ *********************************************************************/
+void hb_audio_config_init(hb_audio_config_t * audiocfg)
+{
+ /* Set read only paramaters to invalid values */
+ audiocfg->in.codec = 0xDEADBEEF;
+ audiocfg->in.bitrate = -1;
+ audiocfg->in.samplerate = -1;
+ audiocfg->in.channel_layout = 0;
+ audiocfg->in.version = 0;
+ audiocfg->in.mode = 0;
+ audiocfg->flags.ac3 = 0;
+ audiocfg->lang.description[0] = 0;
+ audiocfg->lang.simple[0] = 0;
+ audiocfg->lang.iso639_2[0] = 0;
+
+ /* Initalize some sensable defaults */
+ audiocfg->in.track = audiocfg->out.track = 0;
+ audiocfg->out.codec = HB_ACODEC_FAAC;
+ audiocfg->out.bitrate = 128;
+ audiocfg->out.samplerate = 44100;
+ audiocfg->out.mixdown = HB_AMIXDOWN_DOLBYPLII;
+ audiocfg->out.dynamic_range_compression = 0;
+ audiocfg->out.name = NULL;
+}
+
+/**********************************************************************
+ * hb_audio_add
+ **********************************************************************
+ *
+ *********************************************************************/
+int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg)
+{
+ hb_title_t *title = job->title;
+ hb_audio_t *audio;
+
+ audio = hb_audio_copy( hb_list_item( title->list_audio, audiocfg->in.track ) );
+ if( audio == NULL )
+ {
+ /* We fail! */
+ return 0;
+ }
+
+ if( (audiocfg->in.bitrate != -1) && (audiocfg->in.codec != 0xDEADBEEF) )
+ {
+ /* This most likely means the client didn't call hb_audio_config_init
+ * so bail.
+ */
+ return 0;
+ }
+
+ /* Really shouldn't ignore the passed out track, but there is currently no
+ * way to handle duplicates or out-of-order track numbers.
+ */
+ audio->config.out.track = hb_list_count(job->list_audio) + 1;
+ audio->config.out.codec = audiocfg->out.codec;
+ if( audiocfg->out.codec == audio->config.in.codec )
+ {
+ /* Pass-through, copy from input. */
+ audio->config.out.samplerate = audio->config.in.samplerate;
+ audio->config.out.bitrate = audio->config.in.bitrate;
+ audio->config.out.dynamic_range_compression = 0;
+ audio->config.out.mixdown = 0;
+ }
+ else
+ {
+ /* Non pass-through, use what is given. */
+ audio->config.out.samplerate = audiocfg->out.samplerate;
+ audio->config.out.bitrate = audiocfg->out.bitrate;
+ audio->config.out.dynamic_range_compression = audiocfg->out.dynamic_range_compression;
+ audio->config.out.mixdown = audiocfg->out.mixdown;
+ }
+
+ hb_list_add(job->list_audio, audio);
+ return 1;
+}
+
+hb_audio_config_t * hb_list_audio_config_item(hb_list_t * list, int i)
+{
+ hb_audio_t *audio = NULL;
+
+ if( (audio = hb_list_item(list, i)) )
+ return &(audio->config);
+
+ return NULL;
+}
+
+/**********************************************************************
+ * hb_subtitle_copy
+ **********************************************************************
+ *
+ *********************************************************************/
+hb_subtitle_t *hb_subtitle_copy(const hb_subtitle_t *src)
+{
+ hb_subtitle_t *subtitle = NULL;
+
+ if( src )
+ {
+ subtitle = calloc(1, sizeof(*subtitle));
+ memcpy(subtitle, src, sizeof(*subtitle));
+ }
+ return subtitle;
+}
+
+/**********************************************************************
+ * hb_subtitle_add
+ **********************************************************************
+ *
+ *********************************************************************/
+int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, int track)
+{
+ hb_title_t *title = job->title;
+ hb_subtitle_t *subtitle;
+
+ subtitle = hb_subtitle_copy( hb_list_item( title->list_subtitle, track ) );
+ if( subtitle == NULL )
+ {
+ /* We fail! */
+ return 0;
+ }
+ subtitle->config = *subtitlecfg;
+ hb_list_add(job->list_subtitle, subtitle);
+ return 1;
+}
+
+int hb_srt_add( const hb_job_t * job,
+ const hb_subtitle_config_t * subtitlecfg,
+ const char *lang )
+{
+ hb_subtitle_t *subtitle;
+ iso639_lang_t *language = NULL;
+ int retval = 0;
+
+ subtitle = calloc( 1, sizeof( *subtitle ) );
+
+ subtitle->format = TEXTSUB;
+ subtitle->source = SRTSUB;
+
+ language = lang_for_code2( lang );
+
+ if( language )
+ {
+
+ strcpy( subtitle->lang, language->eng_name );
+ strncpy( subtitle->iso639_2, lang, 4 );
+
+ subtitle->config = *subtitlecfg;
+ subtitle->config.dest = PASSTHRUSUB;
+
+ hb_list_add(job->list_subtitle, subtitle);
+ retval = 1;
+ }
+ return retval;
+}