X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fframework%2Fmlt_profile.c;h=4385d7a789be5bf857c1d0b05f170256dce057f0;hb=9e781c515001a2428716557218200b2be634214e;hp=66f76012aee88f0d89807078e78114230dc7247b;hpb=4a5f6e16891f7f5349a3a19c50d15627ce5e28d1;p=mlt diff --git a/src/framework/mlt_profile.c b/src/framework/mlt_profile.c index 66f76012..4385d7a7 100644 --- a/src/framework/mlt_profile.c +++ b/src/framework/mlt_profile.c @@ -26,6 +26,7 @@ #include #include #include +#include /** the default subdirectory of the datadir for holding profiles */ @@ -231,6 +232,8 @@ mlt_profile mlt_profile_load_properties( mlt_properties properties ) mlt_profile mlt_profile_load_string( const char *string ) { mlt_properties properties = mlt_properties_new(); + mlt_profile profile = NULL; + if ( properties ) { const char *p = string; @@ -241,8 +244,10 @@ mlt_profile mlt_profile_load_string( const char *string ) p = strchr( p, '\n' ); if ( p ) p++; } + profile = mlt_profile_load_properties( properties ); + mlt_properties_close( properties ); } - return mlt_profile_load_properties( properties ); + return profile; } /** Get the video frame rate as a floating point value. @@ -398,15 +403,14 @@ mlt_properties mlt_profile_list( ) void mlt_profile_from_producer( mlt_profile profile, mlt_producer producer ) { mlt_frame fr = NULL; - uint8_t *buffer; - mlt_image_format fmt = mlt_image_yuv422; + uint8_t *buffer = NULL; + mlt_image_format fmt = mlt_image_none; mlt_properties p; int w = profile->width; int h = profile->height; if ( ! mlt_service_get_frame( MLT_PRODUCER_SERVICE(producer), &fr, 0 ) && fr ) { - mlt_properties_set_double( MLT_FRAME_PROPERTIES( fr ), "consumer_aspect_ratio", mlt_profile_sar( profile ) ); if ( ! mlt_frame_get_image( fr, &buffer, &fmt, &w, &h, 0 ) ) { // Some source properties are not exposed until after the first get_image call. @@ -414,13 +418,21 @@ void mlt_profile_from_producer( mlt_profile profile, mlt_producer producer ) mlt_service_get_frame( MLT_PRODUCER_SERVICE(producer), &fr, 0 ); p = MLT_FRAME_PROPERTIES( fr ); // mlt_properties_dump(p, stderr); - if ( mlt_properties_get_int( p, "meta.media.frame_rate_den" ) && mlt_properties_get_int( p, "meta.media.sample_aspect_den" ) ) + if ( mlt_properties_get_int( p, "meta.media.frame_rate_den" ) && + mlt_properties_get_int( p, "meta.media.sample_aspect_den" ) ) { profile->width = mlt_properties_get_int( p, "meta.media.width" ); profile->height = mlt_properties_get_int( p, "meta.media.height" ); profile->progressive = mlt_properties_get_int( p, "meta.media.progressive" ); - profile->frame_rate_num = mlt_properties_get_int( p, "meta.media.frame_rate_num" ); - profile->frame_rate_den = mlt_properties_get_int( p, "meta.media.frame_rate_den" ); + if ( 1000 > mlt_properties_get_double( p, "meta.media.frame_rate_num" ) + / mlt_properties_get_double( p, "meta.media.frame_rate_den" ) ) + { + profile->frame_rate_num = mlt_properties_get_int( p, "meta.media.frame_rate_num" ); + profile->frame_rate_den = mlt_properties_get_int( p, "meta.media.frame_rate_den" ); + } else { + profile->frame_rate_num = 60; + profile->frame_rate_den = 1; + } // AVCHD is mis-reported as double frame rate. if ( profile->progressive == 0 && ( profile->frame_rate_num / profile->frame_rate_den == 50 || @@ -429,7 +441,8 @@ void mlt_profile_from_producer( mlt_profile profile, mlt_producer producer ) profile->sample_aspect_num = mlt_properties_get_int( p, "meta.media.sample_aspect_num" ); profile->sample_aspect_den = mlt_properties_get_int( p, "meta.media.sample_aspect_den" ); profile->colorspace = mlt_properties_get_int( p, "meta.media.colorspace" ); - profile->display_aspect_num = (int) ( (double) profile->sample_aspect_num * profile->width / profile->sample_aspect_den + 0.5 ); + profile->display_aspect_num = lrint( (double) profile->sample_aspect_num * profile->width + / profile->sample_aspect_den ); profile->display_aspect_den = profile->height; free( profile->description ); profile->description = strdup( "automatic" );