X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Fproducer_avformat.c;h=c6c013553409fe25da7347efc12e0733e0fcebe9;hb=3d366fcfb46c1ae8ae3e38e15012edb6affd9828;hp=b589468b0239c8b6d5415cacd54d5ba23b68aefb;hpb=2a04e5dceebd174e24be42da8643a815640db27d;p=melted diff --git a/src/modules/avformat/producer_avformat.c b/src/modules/avformat/producer_avformat.c index b589468..c6c0135 100644 --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -287,6 +287,15 @@ static int producer_open( mlt_producer this, char *file ) // Store selected audio and video indexes on properties mlt_properties_set_int( properties, "audio_index", audio_index ); mlt_properties_set_int( properties, "video_index", video_index ); + + // Fetch the width, height and aspect ratio + if ( video_index != -1 ) + { + AVCodecContext *codec_context = context->streams[ video_index ]->codec; + mlt_properties_set_int( properties, "width", codec_context->width ); + mlt_properties_set_int( properties, "height", codec_context->height ); + mlt_properties_set_double( properties, "aspect_ratio", av_q2d( codec_context->sample_aspect_ratio ) ); + } // We're going to cheat here - for a/v files, we will have two contexts (reasoning will be clear later) if ( av == 0 && !av_bypass && audio_index != -1 && video_index != -1 ) @@ -344,51 +353,7 @@ static double producer_time_of_frame( mlt_producer this, mlt_position position ) static inline void convert_image( AVFrame *frame, uint8_t *buffer, int pix_fmt, mlt_image_format format, int width, int height ) { - // EXPERIMENTAL IMAGE NORMALISATIONS - if ( pix_fmt == PIX_FMT_YUV420P && format == mlt_image_yuv422 ) - { - register int i, j; - register int half = width >> 1; - register uint8_t *Y = ( ( AVPicture * )frame )->data[ 0 ]; - register uint8_t *U = ( ( AVPicture * )frame )->data[ 1 ]; - register uint8_t *V = ( ( AVPicture * )frame )->data[ 2 ]; - register uint8_t *d = buffer; - register uint8_t *y, *u, *v; - - i = height >> 1; - while ( i -- ) - { - y = Y; - u = U; - v = V; - j = half; - while ( j -- ) - { - *d ++ = *y ++; - *d ++ = *u ++; - *d ++ = *y ++; - *d ++ = *v ++; - } - - Y += ( ( AVPicture * )frame )->linesize[ 0 ]; - y = Y; - u = U; - v = V; - j = half; - while ( j -- ) - { - *d ++ = *y ++; - *d ++ = *u ++; - *d ++ = *y ++; - *d ++ = *v ++; - } - - Y += ( ( AVPicture * )frame )->linesize[ 0 ]; - U += ( ( AVPicture * )frame )->linesize[ 1 ]; - V += ( ( AVPicture * )frame )->linesize[ 2 ]; - } - } - else if ( format == mlt_image_yuv420p ) + if ( format == mlt_image_yuv420p ) { AVPicture pict; pict.data[0] = buffer; @@ -589,7 +554,6 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form { got_picture = 0; } - mlt_properties_set_int( properties, "top_field_first", av_frame->top_field_first ); } } @@ -600,6 +564,9 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form // Now handle the picture if we have one if ( got_picture ) { + mlt_properties_set_int( frame_properties, "progressive", !av_frame->interlaced_frame ); + mlt_properties_set_int( frame_properties, "top_field_first", av_frame->top_field_first ); + convert_image( av_frame, *buffer, codec_context->pix_fmt, *format, *width, *height ); mlt_properties_set_data( frame_properties, "image", *buffer, size, (mlt_destructor)mlt_pool_release, NULL );