]> git.sesse.net Git - mlt/blobdiff - src/modules/avformat/producer_avformat.c
profiles/dv_*, consumer_avformat.c, producer_avformat.c: bugfix (1912796) to override...
[mlt] / src / modules / avformat / producer_avformat.c
index 22331591de818308de1df58d409c55ad1584bde7..5103798108981b7d5df5082f929bbec7e8f1c831 100644 (file)
@@ -2,6 +2,7 @@
  * producer_avformat.c -- avformat producer
  * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
  * Author: Charles Yates <charles.yates@pandora.be>
+ * Much code borrowed from ffmpeg.c: Copyright (c) 2000-2003 Fabrice Bellard
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -90,13 +91,13 @@ static void find_default_streams( AVFormatContext *context, int *audio_index, in
        for( i = 0; i < context->nb_streams; i++ ) 
        {
                // Get the codec context
-               AVCodecContext *codec_context = context->streams[ i ]->codec;
+               AVCodecContext *codec_context = context->streams[ i ]->codec;
 
                if ( avcodec_find_decoder( codec_context->codec_id ) == NULL )
                        continue;
 
                // Determine the type and obtain the first index of each type
-               switch( codec_context->codec_type ) 
+               switch( codec_context->codec_type ) 
                {
                        case CODEC_TYPE_VIDEO:
                                if ( *video_index < 0 )
@@ -105,9 +106,9 @@ static void find_default_streams( AVFormatContext *context, int *audio_index, in
                        case CODEC_TYPE_AUDIO:
                                if ( *audio_index < 0 )
                                        *audio_index = i;
-                               break;
+                               break;
                        default:
-                               break;
+                               break;
                }
        }
 }
@@ -280,8 +281,8 @@ static int producer_open( mlt_producer this, mlt_profile profile, char *file )
                        // Find default audio and video streams
                        find_default_streams( context, &audio_index, &video_index );
 
-            if ( context->start_time != AV_NOPTS_VALUE )
-                mlt_properties_set_double( properties, "_start_time", context->start_time );
+                       if ( context->start_time != AV_NOPTS_VALUE )
+                               mlt_properties_set_double( properties, "_start_time", context->start_time );
                        
                        // Check if we're seekable (something funny about mpeg here :-/)
                        if ( strcmp( file, "pipe:" ) && strncmp( file, "http://", 6 ) )
@@ -639,7 +640,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
                        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 );
+                               mlt_properties_set_int( 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 );
                                mlt_properties_set_int( properties, "_current_position", int_position );
@@ -727,6 +728,28 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
                        double force_aspect_ratio = mlt_properties_get_double( properties, "force_aspect_ratio" );
                        double aspect_ratio;
 
+                       if ( strcmp( codec_context->codec->name, "dvvideo" ) == 0 )
+                       {
+                               // Override FFmpeg's notion of DV aspect ratios, which are
+                               // based upon a width of 704. Since we do not have a normaliser
+                               // that crops (nor is cropping 720 wide ITU-R 601 video always desirable)
+                               // we just coerce the values to facilitate a passive behaviour through
+                               // the rescale normaliser when using equivalent producers and consumers.
+                               // = display_aspect / (width * height)
+                               if ( codec_context->sample_aspect_ratio.num == 10 &&
+                                       codec_context->sample_aspect_ratio.den == 11 )
+                                       force_aspect_ratio = 8.0/9.0; // 4:3 NTSC
+                               else if ( codec_context->sample_aspect_ratio.num == 59 &&
+                                       codec_context->sample_aspect_ratio.den == 54 )
+                                       force_aspect_ratio = 16.0/15.0; // 4:3 PAL
+                               else if ( codec_context->sample_aspect_ratio.num == 40 &&
+                                       codec_context->sample_aspect_ratio.den == 33 )
+                                       force_aspect_ratio = 32.0/27.0; // 16:9 NTSC
+                               else if ( codec_context->sample_aspect_ratio.num == 118 &&
+                                       codec_context->sample_aspect_ratio.den == 81 )
+                                       force_aspect_ratio = 64.0/45.0; // 16:9 PAL
+                       }
+
                        // XXX: We won't know the real aspect ratio until an image is decoded
                        // but we do need it now (to satisfy filter_resize) - take a guess based
                        // on pal/ntsc
@@ -740,8 +763,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
                        }
                        else
                        {
-                               int is_pal = mlt_producer_get_fps( this ) == 25.0;
-                               aspect_ratio = is_pal ? 59.0/54.0 : 10.0/11.0;
+                               aspect_ratio = 1.0;
                        }
 
                        // Determine the fps
@@ -1028,7 +1050,7 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame )
                                avcodec_thread_init( codec_context, thread_count );
                                codec_context->thread_count = thread_count;
                        }
-                       
+
                        // Find the codec
                        codec = avcodec_find_decoder( codec_context->codec_id );