static int hb_reader_init( hb_work_object_t * w, hb_job_t * job ) { hb_work_private_t * r; r = calloc( sizeof( hb_work_private_t ), 1 ); w->private_data = r; r->job = job; r->title = job->title; r->die = job->die; r->sequence = 0; r->st_slots = 4; r->stream_timing = calloc( sizeof(stream_timing_t), r->st_slots ); r->stream_timing[0].id = r->title->video_id; r->stream_timing[0].average = 90000. * (double)job->vrate_base / (double)job->vrate; r->stream_timing[0].last = -r->stream_timing[0].average; r->stream_timing[0].valid = 1; r->stream_timing[0].startup = 10; r->stream_timing[1].id = -1; r->demux.last_scr = -1; if ( !job->pts_to_start ) r->start_found = 1; else { // The frame at the actual start time may not be an i-frame // so can't be decoded without starting a little early. // sync.c will drop early frames. r->pts_to_start = MAX(0, job->pts_to_start - 180000); } // The stream needs to be open before starting the reader thead // to prevent a race with decoders that may share information // with the reader. Specifically avcodec needs this. if ( hb_reader_open( r ) ) { free( r->stream_timing ); free( r ); return 1; } return 0; }
static int reader_init( hb_work_object_t * w, hb_job_t * job ) { hb_work_private_t * r; r = calloc( sizeof( hb_work_private_t ), 1 ); w->private_data = r; r->h = job->h; r->job = job; r->title = job->title; r->die = job->die; r->sequence = 0; r->st_slots = 4; r->stream_timing = calloc( sizeof(stream_timing_t), r->st_slots ); r->stream_timing[0].id = r->title->video_id; r->stream_timing[0].average = 90000. * (double)job->vrate.den / job->vrate.num; r->stream_timing[0].filtered_average = r->stream_timing[0].average; r->stream_timing[0].last = -r->stream_timing[0].average; r->stream_timing[0].valid = 1; r->stream_timing[0].startup = 10; r->stream_timing[1].id = -1; r->demux.last_scr = AV_NOPTS_VALUE; r->chapter_end = job->chapter_end; if ( !job->pts_to_start ) r->start_found = 1; else { // The frame at the actual start time may not be an i-frame // so can't be decoded without starting a little early. // sync.c will drop early frames. // Starting a little over 10 seconds early r->pts_to_start = MAX(0, job->pts_to_start - 1000000); } if (job->pts_to_stop) { r->duration = job->pts_to_start + job->pts_to_stop; } else if (job->frame_to_stop) { int frames = job->frame_to_start + job->frame_to_stop; r->duration = (int64_t)frames * job->title->vrate.den * 90000 / job->title->vrate.num; } else { hb_chapter_t *chapter; int ii; r->duration = 0; for (ii = job->chapter_start; ii < job->chapter_end; ii++) { chapter = hb_list_item( job->title->list_chapter, ii - 1); r->duration += chapter->duration; } } // Count number of splice lists needed for merging buffers // that have been split int count = 1; // 1 for video count += hb_list_count( job->list_subtitle ); count += hb_list_count( job->list_audio ); r->splice_list_size = count; r->splice_list = calloc(count, sizeof(buffer_splice_list_t)); // Initialize stream id's of splice lists int ii, jj = 0; r->splice_list[jj++].id = r->title->video_id; for (ii = 0; ii < hb_list_count(job->list_subtitle); ii++) { hb_subtitle_t * subtitle = hb_list_item(job->list_subtitle, ii); r->splice_list[jj++].id = subtitle->id; } for (ii = 0; ii < hb_list_count(job->list_audio); ii++) { hb_audio_t * audio = hb_list_item(job->list_audio, ii); r->splice_list[jj++].id = audio->id; } // count also happens to be the upper bound for the number of // fifos that will be needed (+1 for null terminator) r->fifos = calloc(count + 1, sizeof(hb_fifo_t*)); // The stream needs to be open before starting the reader thead // to prevent a race with decoders that may share information // with the reader. Specifically avcodec needs this. if ( hb_reader_open( r ) ) { free( r->stream_timing ); free( r ); return 1; } return 0; }
static int hb_reader_init( hb_work_object_t * w, hb_job_t * job ) { hb_work_private_t * r; r = calloc( sizeof( hb_work_private_t ), 1 ); w->private_data = r; r->job = job; r->title = job->title; r->die = job->die; r->sequence = 0; r->st_slots = 4; r->stream_timing = calloc( sizeof(stream_timing_t), r->st_slots ); r->stream_timing[0].id = r->title->video_id; r->stream_timing[0].average = 90000. * (double)job->vrate_base / (double)job->vrate; r->stream_timing[0].filtered_average = r->stream_timing[0].average; r->stream_timing[0].last = -r->stream_timing[0].average; r->stream_timing[0].valid = 1; r->stream_timing[0].startup = 10; r->stream_timing[1].id = -1; r->demux.last_scr = -1; if ( !job->pts_to_start ) r->start_found = 1; else { // The frame at the actual start time may not be an i-frame // so can't be decoded without starting a little early. // sync.c will drop early frames. r->pts_to_start = MAX(0, job->pts_to_start - 180000); } if (job->pts_to_stop) { r->duration = job->pts_to_start + job->pts_to_stop; } else if (job->frame_to_stop) { int frames = job->frame_to_start + job->frame_to_stop; r->duration = (int64_t)frames * job->title->rate_base * 90000 / job->title->rate; } else { hb_chapter_t *chapter; int ii; r->duration = 0; for (ii = job->chapter_start; ii < job->chapter_end; ii++) { chapter = hb_list_item( job->title->list_chapter, ii - 1); r->duration += chapter->duration; } } // The stream needs to be open before starting the reader thead // to prevent a race with decoders that may share information // with the reader. Specifically avcodec needs this. if ( hb_reader_open( r ) ) { free( r->stream_timing ); free( r ); return 1; } return 0; }