From: Dan Dennedy Date: Sat, 28 May 2011 07:23:48 +0000 (-0700) Subject: Add mlt_profile_from_producer(). X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=3894b24fb83c1ae4a94150b3b836573cb2c92013;p=mlt Add mlt_profile_from_producer(). This new function contains the auto-profile feature. Plus setters for Mlt::Profile. --- diff --git a/src/framework/mlt_profile.c b/src/framework/mlt_profile.c index 04b04cc9..542a8f11 100644 --- a/src/framework/mlt_profile.c +++ b/src/framework/mlt_profile.c @@ -21,9 +21,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "mlt_profile.h" -#include "mlt_factory.h" -#include "mlt_properties.h" +#include "mlt.h" #include #include @@ -390,3 +388,59 @@ mlt_properties mlt_profile_list( ) return properties; } + +/** Update the profile using the attributes of a producer. + * + * Use this to make an "auto-profile." Typically, you need to re-open the producer + * after you use this because some producers (e.g. avformat) adjust their framerate + * to that of the profile used when you created it. + * \public \memberof mlt_profile_s + * \param profile the profile to update + * \param producer the producer to inspect + */ + +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; + 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. + mlt_frame_close( fr ); + 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" ) ) + { + 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" ); + // AVCHD is mis-reported as double frame rate. + if ( profile->progressive == 0 && ( + profile->frame_rate_num / profile->frame_rate_den == 50 || + profile->frame_rate_num / profile->frame_rate_den == 59 ) ) + profile->frame_rate_num /= 2; + 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_den = profile->height; + free( profile->description ); + profile->description = strdup( "automatic" ); + profile->is_explicit = 0; + } + } + } + mlt_frame_close( fr ); + mlt_producer_seek( producer, 0 ); +} diff --git a/src/framework/mlt_profile.h b/src/framework/mlt_profile.h index 02638e54..c545404c 100644 --- a/src/framework/mlt_profile.h +++ b/src/framework/mlt_profile.h @@ -56,4 +56,5 @@ extern double mlt_profile_dar( mlt_profile profile ); extern void mlt_profile_close( mlt_profile profile ); extern mlt_profile mlt_profile_clone( mlt_profile profile ); extern mlt_properties mlt_profile_list( ); +extern void mlt_profile_from_producer( mlt_profile profile, mlt_producer producer ); #endif diff --git a/src/mlt++/MltProfile.cpp b/src/mlt++/MltProfile.cpp index 47302b7a..051a9a42 100644 --- a/src/mlt++/MltProfile.cpp +++ b/src/mlt++/MltProfile.cpp @@ -19,6 +19,8 @@ #include "MltProfile.h" #include "MltProperties.h" +#include "MltProducer.h" + using namespace Mlt; Profile::Profile( ) : @@ -125,3 +127,45 @@ Properties* Profile::list() { return new Properties( mlt_profile_list() ); } + +void Profile::from_producer( Producer &producer ) +{ + mlt_profile_from_producer( instance, producer.get_producer() ); +} + +void Profile::set_width( int width ) +{ + instance->width = width; +} + +void Profile::set_height( int height ) +{ + instance->height = height; +} + +void Profile::set_sample_aspect( int numerator, int denominator ) +{ + instance->sample_aspect_num = numerator; + instance->sample_aspect_den = denominator; +} + +void Profile::set_progressive( int progressive ) +{ + instance->progressive = progressive; +} + +void Profile::set_colorspace( int colorspace ) +{ + instance->colorspace = colorspace; +} + +void Profile::set_frame_rate( int numerator, int denominator ) +{ + instance->sample_aspect_num = numerator; + instance->sample_aspect_den = denominator; +} + +void Profile::set_explicit( int boolean ) +{ + instance->is_explicit = boolean; +} diff --git a/src/mlt++/MltProfile.h b/src/mlt++/MltProfile.h index e51543db..248c8370 100644 --- a/src/mlt++/MltProfile.h +++ b/src/mlt++/MltProfile.h @@ -31,6 +31,7 @@ namespace Mlt { class Properties; + class Producer; class MLTPP_DECLSPEC Profile { @@ -58,6 +59,14 @@ namespace Mlt int display_aspect_den() const; double dar() const; static Properties* list(); + void from_producer( Producer &producer ); + void set_width( int width ); + void set_height( int height ); + void set_sample_aspect( int numerator, int denominator ); + void set_progressive( int progressive ); + void set_colorspace( int colorspace ); + void set_frame_rate( int numerator, int denominator ); + void set_explicit( int boolean ); }; }