* 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
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-// Local header files
-#include "producer_avformat.h"
-
// MLT Header files
+#include <framework/mlt_producer.h>
#include <framework/mlt_frame.h>
// ffmpeg Header files
void avformat_unlock( );
// Forward references.
-static int producer_open( mlt_producer this, char *file );
+static int producer_open( mlt_producer this, mlt_profile profile, char *file );
static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index );
/** Constructor for libavformat.
*/
-mlt_producer producer_avformat_init( char *file )
+mlt_producer producer_avformat_init( mlt_profile profile, char *file )
{
mlt_producer this = NULL;
this->get_frame = producer_get_frame;
// Open the file
- if ( producer_open( this, file ) != 0 )
+ if ( producer_open( this, profile, file ) != 0 )
{
// Clean up
mlt_producer_close( this );
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 )
case CODEC_TYPE_AUDIO:
if ( *audio_index < 0 )
*audio_index = i;
- break;
+ break;
default:
- break;
+ break;
}
}
}
/** Open the file.
*/
-static int producer_open( mlt_producer this, char *file )
+static int producer_open( mlt_producer this, mlt_profile profile, char *file )
{
// Return an error code (0 == no error)
int error = 0;
mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// We will treat everything with the producer fps
- double fps = mlt_producer_get_fps( this );
+ double fps = mlt_profile_fps( profile );
// Lock the mutex now
avformat_lock( );
// 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 ) )
{
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 );
// Initialise the codec if necessary
if ( codec == NULL )
{
+ // Initialise multi-threading
+ int thread_count = mlt_properties_get_int( properties, "threads" );
+ if ( thread_count == 0 && getenv( "MLT_AVFORMAT_THREADS" ) )
+ thread_count = atoi( getenv( "MLT_AVFORMAT_THREADS" ) );
+ if ( thread_count > 1 )
+ {
+ avcodec_thread_init( codec_context, thread_count );
+ codec_context->thread_count = thread_count;
+ }
+
// Find the codec
codec = avcodec_find_decoder( codec_context->codec_id );
// Initialise the codec if necessary
if ( codec == NULL )
{
+ // Initialise multi-threading
+ int thread_count = mlt_properties_get_int( properties, "threads" );
+ if ( thread_count == 0 && getenv( "MLT_AVFORMAT_THREADS" ) )
+ thread_count = atoi( getenv( "MLT_AVFORMAT_THREADS" ) );
+ if ( thread_count > 1 )
+ {
+ avcodec_thread_init( codec_context, thread_count );
+ codec_context->thread_count = thread_count;
+ }
+
// Find the codec
codec = avcodec_find_decoder( codec_context->codec_id );
static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index )
{
// Create an empty frame
- *frame = mlt_frame_init( );
+ *frame = mlt_frame_init( MLT_PRODUCER_SERVICE( this ) );
// Update timecode on the frame we're creating
mlt_frame_set_position( *frame, mlt_producer_position( this ) );