static int close_file( hnd_t handle, int64_t largest_pts, int64_t second_largest_pts ) { mkv_hnd_t *p_mkv = handle; int ret; int64_t i_last_delta; i_last_delta = p_mkv->i_timebase_den ? (int64_t)(((largest_pts - second_largest_pts) * p_mkv->i_timebase_num / p_mkv->i_timebase_den) + 0.5) : 0; ret = mk_close( p_mkv->w, i_last_delta ); free( p_mkv ); return ret; }
static int MKVEnd(hb_mux_object_t *m) { char chapter_name[1024]; hb_chapter_t *chapter_data; hb_job_t *job = m->job; hb_mux_data_t *mux_data = job->mux_data; if( !job->mux_data ) { /* * We must have failed to create the file in the first place. */ return 0; } if (job->chapter_markers) { // get the last chapter chapter_data = hb_list_item(job->list_chapter, mux_data->current_chapter++); // only write the last chapter marker if it lasts at least 1.5 second if (chapter_data != NULL && chapter_data->duration > 135000LL) { if (chapter_data->title != NULL) { snprintf(chapter_name, 1023, "%s", chapter_data->title); } else { snprintf(chapter_name, 1023, "Chapter %d", mux_data->current_chapter); } mk_createChapterSimple(m->file, mux_data->prev_chapter_tc, mux_data->prev_chapter_tc, chapter_name); } } if( job->metadata ) { hb_metadata_t *md = job->metadata; hb_deep_log( 2, "Writing Metadata to output file..."); if ( md->name ) { mk_createTagSimple( m->file, MK_TAG_TITLE, md->name ); } if ( md->artist ) { mk_createTagSimple( m->file, "ARTIST", md->artist ); } if ( md->album_artist ) { mk_createTagSimple( m->file, "DIRECTOR", md->album_artist ); } if ( md->composer ) { mk_createTagSimple( m->file, "COMPOSER", md->composer ); } if ( md->release_date ) { mk_createTagSimple( m->file, "DATE_RELEASED", md->release_date ); } if ( md->comment ) { mk_createTagSimple( m->file, "SUMMARY", md->comment ); } if ( !md->name && md->album ) { mk_createTagSimple( m->file, MK_TAG_TITLE, md->album ); } if ( md->genre ) { mk_createTagSimple( m->file, MK_TAG_GENRE, md->genre ); } if ( md->description ) { mk_createTagSimple( m->file, "DESCRIPTION", md->description ); } if ( md->long_description ) { mk_createTagSimple( m->file, "SYNOPSIS", md->long_description ); } } // Update and track private data that can change during // encode. int i; for( i = 0; i < hb_list_count( job->list_audio ); i++ ) { mk_Track * track; hb_audio_t * audio; audio = hb_list_item( job->list_audio, i ); track = audio->priv.mux_data->track; switch (audio->config.out.codec & HB_ACODEC_MASK) { case HB_ACODEC_FFFLAC: case HB_ACODEC_FFFLAC24: if( audio->priv.config.extradata.bytes ) { uint8_t *header; header = create_flac_header( audio->priv.config.extradata.bytes, audio->priv.config.extradata.length ); mk_updateTrackPrivateData( m->file, track, header, audio->priv.config.extradata.length + 8 ); free( header ); } break; default: break; } } if( mk_close(m->file) < 0 ) { hb_error( "Failed to flush the last frame and close the output file, Disk Full?" ); *job->die = 1; } // TODO: Free what we alloc'd return 0; }