Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}