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 )