The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
 # VERSION = "1.000"

 # /*---------------------------------------------------------------------------------------------------*/
 # /* Run advert detection */

AV *
dvb_advert_detect(char *filename, HV *settings_href=NULL)
	INIT:
		HV * results;
		HV * settings ;
		SV * sv_user_data ;
		AV * wrapper ;

		struct Ad_user_data *user_data ;
		SV **val;
		HV * rh;
		unsigned i ;
		char key[256] ;

	    wrapper = (AV *)sv_2mortal((SV *)newAV());
		results = (HV *)sv_2mortal((SV *)newHV());
	    settings = (HV *)sv_2mortal((SV *)newHV());

	CODE:
		/* Create Perl data */
		HVS(results, settings, newRV((SV *)settings)) ;

		dvb_error_clear() ;
		user_data = (struct Ad_user_data *)malloc(sizeof(struct Ad_user_data)) ;
		memset(user_data, 0, sizeof(struct Ad_user_data)) ;
		init_user_data(user_data) ;

		execute_advert_detection(user_data, filename, settings_href, results, settings) ;

	    // == Pass results back to Perl ==

	    av_push(wrapper, newRV((SV *)results));

	    sv_user_data = sv_newmortal();
	    sv_setref_pv(sv_user_data, "AdataPtr", (void*)user_data);
	    av_push(wrapper, newRV((SV *)sv_user_data));

	    //RETVAL = newRV((SV *)wrapper);
	    RETVAL = wrapper;
	    //RETVAL = user_data ;


	OUTPUT:
      RETVAL



# /*---------------------------------------------------------------------------------------------------*/
# /* Run advert detection */

AV *
dvb_advert_detect_from_file(char *filename, HV *settings_href=NULL)
	INIT:
		HV * results ;
		HV * settings ;
		SV * sv_user_data ;
		AV * wrapper ;

		struct Ad_user_data *user_data ;
		SV **val;
		HV * rh;
		unsigned i ;
		char key[256] ;

	    wrapper = (AV *)sv_2mortal((SV *)newAV());
		results = (HV *)sv_2mortal((SV *)newHV());
	    settings = (HV *)sv_2mortal((SV *)newHV());

	CODE:
		/* Create Perl data */
		HVS(results, settings, newRV((SV *)settings)) ;

		dvb_error_clear() ;
		user_data = (struct Ad_user_data *)malloc(sizeof(struct Ad_user_data)) ;
		memset(user_data, 0, sizeof(struct Ad_user_data)) ;
		init_user_data(user_data) ;

		// Set settings
		advert_set_settings(user_data, settings_href) ;

		if (user_data->debug) fprintf(stderr, "[XS] Detect-from-file... \n") ;

		// read file
		detect_from_file(user_data, filename) ;

	    if (user_data->debug) fprintf(stderr, "[XS] dvb_err=%s [%03d]\n", dvb_error_str(dvb_error_code), dvb_error_code) ;
		if (user_data->debug) fprintf(stderr, "[XS] Detect-from-file done\n") ;

	    // == Pass results back to Perl ==

	    // copy settings
	    advert_get_settings(user_data, settings) ;

	    av_push(wrapper, newRV((SV *)results));

	    sv_user_data = sv_newmortal();
	    sv_setref_pv(sv_user_data, "AdataPtr", (void*)user_data);
	    av_push(wrapper, newRV((SV *)sv_user_data));

	    //RETVAL = newRV((SV *)wrapper);
	    RETVAL = wrapper;
	    //RETVAL = user_data ;

	OUTPUT:
     RETVAL




# /*---------------------------------------------------------------------------------------------------*/
# /* Get advert default settings (combined with any specified settings) */

SV *
dvb_advert_def_settings(HV *settings_href=NULL)
	INIT:
		HV * results;
		HV * frames ;
		HV * settings ;

		struct Ad_user_data user_data ;
		SV **val;
		HV * rh;
		unsigned i ;
		char key[256] ;

	    settings = (HV *)sv_2mortal((SV *)newHV());

	CODE:
		dvb_error_clear() ;
		init_user_data(&user_data) ;

		// Set settings
		advert_set_settings(&user_data, settings_href) ;

	    // == Pass results back to Perl ==
		advert_get_settings(&user_data, settings) ;

	    // Free up structures
		free_user_data(&user_data) ;

	    RETVAL = newRV((SV *)settings);

	OUTPUT:
     RETVAL