Linux-DVB-DVBT-Advert

 view release on metacpan or  search on metacpan

clib/dvb_ad_lib/detect/advert.c  view on Meta::CPAN

	// set pid
	if (user_data->audio_pid < 0)
	{
		user_data->audio_pid = pidinfo->pid ;
		advert_dbg_prt(1, ("Locked down TS parsing just to audio PID = %d\n", pidinfo->pid)) ;
	}

	// Pass to individual processors
	if (user_data->detection_method & METHOD_AUDIO)
	{
		advert_dbg_prt(1, ("audio_detect_hook() : AUDIO\n")) ;

		audio_detector_run(user_data->tsreader, pidinfo, pesinfo, info,
				&user_data->audio_settings,
				&user_data->audio_state,
				&audio_results,
				&user_data->audio_totals) ;

		++handled ;

		// Track PTS
		if (info->audio_framenum == 0)
		{
			user_data->first_audio_pts = audio_results.pts ;
			user_data->prev_audio_framenum = 0 ;
		}

		advert_dbg_prt(1, ("audio pts=%"PRIu64" (pes pts %"PRId64") first=%"PRIu64" (video=%"PRIu64")\n",
				audio_results.pts,
				pesinfo->dts,
				user_data->first_audio_pts,
				user_data->first_video_pts)) ;

		// Only report audio once we've got some video
		if (user_data->first_video_pts != UNSET_TS)
		{
			// convert audio PTS into a video frame number
			int pts_framenum = video_pts_framenum(audio_results.pts, user_data->first_video_pts_framenum) ;

			if (pts_framenum >= 0)
			{
			struct Ad_results *results ;
			unsigned fnum ;

				// check for jumps
				if (pts_framenum > user_data->prev_audio_framenum + MAX_VIDEO_FRAME_JUMP)
				{
					advert_dbg_prt(2, (" !! audio fixed framenum: from %u to %u\n",pts_framenum, user_data->prev_audio_framenum+1)) ;

					// fix any major PTS jumps
					pts_framenum = user_data->prev_audio_framenum+1 ;
				}

				// fill in any gaps
				for (fnum=user_data->prev_audio_framenum+1; fnum < pts_framenum; ++fnum)
				{
					struct Ad_results *prev_results ;

					// copy last good values
					results = result_entry(user_data, fnum) ;
					prev_results = result_entry(user_data, user_data->prev_audio_framenum) ;	// NB: Must do this here each time because previous call can relocate the array

					results = result_entry(user_data, fnum) ;

					advert_dbg_prt(1, (" ++ audio copying frame %u [PTS %"PRId64"] to %u\n",
							user_data->prev_audio_framenum, prev_results->audio_results.pts, fnum)) ;

					memcpy(&results->audio_results, &prev_results->audio_results, sizeof(struct Ad_audio_results) ) ;
				}

				// update prev
				user_data->prev_audio_framenum = pts_framenum ;

				// Results
				results = result_entry(user_data, pts_framenum) ;

				// save results
				memcpy(&results->audio_results, &audio_results, sizeof(struct Ad_audio_results) ) ;

				advert_dbg_prt(1, ("Audio frame %06d : vol %d  vol dB %d : pkt %u [ %u ..  %u] PTS %"PRId64" (Adjusted  PTS %"PRId64")\n",
						pts_framenum,
						audio_results.volume,
						audio_results.volume_dB,
						pidinfo->pktnum,
						pesinfo->start_pkt, pesinfo->end_pkt,
						audio_results.pts,
						(int64_t)pts_framenum*(int64_t)VIDEO_PTS_DELTA));

			}
		}

	}

advert_dbg_prt(2, ("audio_detect_hook() - END : stop = %d\n", user_data->stop_processing)) ;

}




//============================================================================================
enum DVB_error run_preprocess(struct Ad_user_data *user_data,
		char *filename, tsparse_progress_hook progress_hook)
{
struct TS_reader *tsreader ;

	tsreader = tsreader_new(filename) ;
    if (!tsreader)
    {
		fprintf(stderr,"ERROR %s: %s\n",filename,dvb_error_str(dvb_error_code));
		return(ERR_FILE);
    }

    tsreader->num_pkts = 0 ;
    tsreader->skip = 0 ;
    tsreader->debug = user_data->ts_debug ;
    tsreader->user_data = user_data ;
    user_data->tsreader = tsreader ;

	tsreader->pid_hook = pid_hook ;
	tsreader->mpeg2_hook = mpeg2_preprocess_hook ;



( run in 1.299 second using v1.01-cache-2.11-cpan-71847e10f99 )