From: ddennedy Date: Wed, 17 Mar 2004 18:26:09 +0000 (+0000) Subject: fezzik now accepts service:resource and strips \'avformat:\' before fallback avformat... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=b49b8059af440b18c427842272f57808fc465c4f;p=mlt fezzik now accepts service:resource and strips \'avformat:\' before fallback avformat construction. avformat now accepts urls with a format and format parameters designation. updated services.txt for above changes. added a video pts offset to avformat. git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@215 d19143bc-622f-0410-bfdd-b5b2a6649095 --- diff --git a/docs/services.txt b/docs/services.txt index 23fbf4bc..10d25a03 100644 --- a/docs/services.txt +++ b/docs/services.txt @@ -15,7 +15,19 @@ Producers Constructor Argument - 'file' - producer a/v from file + 'file' - a filename specification or URL in the form: + [{protocol}|{format}]:{resource}[?{format-parameter}[&{format-parameter}]] + For example, video4linux:/dev/video1?width=320&height=240 + Note: on the bash command line, '&' must be escaped as '\&' + Use 'ffmpeg -formats' to see a list of supported protocols + and formats. + + Details + + Format parameters only appear to be useful with 'video4linux' or + 'audio_device' formats. For 'video4linux' the parameters are + width, height, frame_rate, frame_rate_base, and standard (ntsc|pal). + For 'audio_device' the parameters are channels and sample_rate. Initialisation Properties @@ -54,7 +66,8 @@ Producers Constructor Argument - 'file' - produce a/v from file + 'file' - a filename specification: + [{mlt-service}:]{resource} | {mlt-service} - can also be the name of a producer service that can accept the resource specified post construction. @@ -1165,15 +1178,6 @@ Consumers Needs an argument or property for multi-card address. - ffmpeg - - Description - Constructor Argument - Initialisation Properties - Read Only Properties - Dependencies - Known Bugs - libdv Description @@ -1182,12 +1186,17 @@ Consumers Constructor Argument - string target + string target - the filename to write to, e.g. /dev/dv1394. Initialisation Properties - int buffer - string rescale + int buffer - the number of frames to buffer, minimum 1, default 25. + string rescale - a rescale method, see the Filters/rescale. + + Mutable Properties + + int progressive - indicates whether to use progressive or field- + based rendering, default 0 (off). Read Only Properties @@ -1211,6 +1220,12 @@ Consumers string video_standard - "PAL" (default), "NTSC", or "WxH" + Initialisation Properties + + int buffer - the number of frames to buffer, minimum 1, default 25. + string rescale - a rescale method, see the Filters/rescale. + - Hint: "none" works very good with SDL output. + Mutable Properties double volume - audio level factor @@ -1218,6 +1233,8 @@ Consumers int audio_off - if 1, disable audio output int scale_overlay - if 1, resample video from source pixel aspect ratio to square pixels. + int progressive - indicates whether to use progressive or field- + based rendering, default 0 (off). Read Only Properties @@ -1229,8 +1246,7 @@ Consumers Known Bugs - NTSC handling needs tightening up - sdl:NTSC is the only valid - constructor for NTSC playback at the moment. + none westley @@ -1242,7 +1258,7 @@ Consumers Constructor Argument resource - the name of a file in which to store the XML. - stdout is used if not supplied. + - stdout is default. Initialisation Properties diff --git a/src/modules/avformat/producer_avformat.c b/src/modules/avformat/producer_avformat.c index 2e39825a..773632ab 100644 --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -190,10 +190,84 @@ static int producer_open( mlt_producer this, char *file ) // Lock the mutex now pthread_mutex_lock( &avformat_mutex ); + + // If "MRL", then create AVInputFormat + AVInputFormat *format = NULL; + AVFormatParameters *params = NULL; + char *standard = NULL; + char *mrl = strchr( file, ':' ); + + // Only if there is not a protocol specification that avformat can handle + if ( mrl && !url_exist( file ) ) + { + // 'file' becomes format abbreviation + mrl[0] = 0; + + // Lookup the format + format = av_find_input_format( file ); + + // Eat the format designator + file = ++mrl; + + if ( format ) + { + // Allocate params + params = calloc( sizeof( AVFormatParameters ), 1 ); + + // These are required by video4linux (defaults) + params->width = 640; + params->height = 480; + params->frame_rate = 25; + params->frame_rate_base = 1; + params->device = file; + params->channels = 2; + params->sample_rate = 48000; + } + + // Parse out params + mrl = strchr( file, '?' ); + while ( mrl ) + { + mrl[0] = 0; + char *name = strdup( ++mrl ); + char *value = strchr( name, '=' ); + if ( value ) + { + value[0] = 0; + value++; + char *t = strchr( value, '&' ); + if ( t ) + t[0] = 0; + if ( !strcmp( name, "frame_rate" ) ) + params->frame_rate = atoi( value ); + else if ( !strcmp( name, "frame_rate_base" ) ) + params->frame_rate_base = atoi( value ); + else if ( !strcmp( name, "sample_rate" ) ) + params->sample_rate = atoi( value ); + else if ( !strcmp( name, "channels" ) ) + params->channels = atoi( value ); + else if ( !strcmp( name, "width" ) ) + params->width = atoi( value ); + else if ( !strcmp( name, "height" ) ) + params->height = atoi( value ); + else if ( !strcmp( name, "standard" ) ) + { + standard = strdup( value ); + params->standard = standard; + } + } + free( name ); + mrl = strchr( mrl, '&' ); + } + } // Now attempt to open the file - error = av_open_input_file( &context, file, NULL, 0, NULL ); + error = av_open_input_file( &context, file, format, 0, params ); error = error < 0; + + // Cleanup AVFormatParameters + free( standard ); + free( params ); // If successful, then try to get additional info if ( error == 0 ) @@ -303,7 +377,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form mlt_position expected = mlt_properties_get_position( properties, "video_expected" ); // Calculate the real time code - double real_timecode = producer_time_of_frame( this, position ); + double real_timecode = producer_time_of_frame( this, position ) + mlt_properties_get_double( properties, "_v_pts_offset" ); // Get the video stream AVStream *stream = context->streams[ index ]; @@ -416,7 +490,14 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form if ( got_picture ) { if ( pkt.pts != AV_NOPTS_VALUE && pkt.pts != 0 ) + { + if ( current_time == 0 ) + { + mlt_properties_set_double( properties, "_v_pts_offset", ( double )( pkt.pts / 1000000 ) ); + real_timecode += pkt.pts / 1000000; + } current_time = ( double )pkt.pts / 1000000.0; + } else current_time = real_timecode; @@ -597,7 +678,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) //fprintf( stderr, "AVFORMAT: sample aspect %f %dx%d\n", av_q2d( codec_context->sample_aspect_ratio ), codec_context->width, codec_context->height ); // Determine the fps - source_fps = ( double )codec_context->frame_rate / codec_context->frame_rate_base; + source_fps = ( double )codec_context->frame_rate / ( codec_context->frame_rate_base == 0 ? 1 : codec_context->frame_rate_base ); // We'll use fps if it's available if ( source_fps > 0 && source_fps < 30 ) diff --git a/src/modules/fezzik/producer_fezzik.c b/src/modules/fezzik/producer_fezzik.c index 3f0445b1..e409afc6 100644 --- a/src/modules/fezzik/producer_fezzik.c +++ b/src/modules/fezzik/producer_fezzik.c @@ -81,11 +81,20 @@ static mlt_producer create_producer( char *file ) // 3rd line fallbacks if ( result == NULL ) - result = mlt_factory_producer( "avformat", file ); + result = mlt_factory_producer( "avformat", file + + ( strncmp( file, "avformat:", 9 ) ? 0 : 9 ) ); // 4th - allow explicit construction if ( result == NULL ) - result = mlt_factory_producer( file, NULL ); + { + char *arg = strchr( file, ':' ); + if ( arg ) + { + arg[0] = 0; + arg++; + } + result = mlt_factory_producer( file, arg ); + } return result; } diff --git a/src/modules/inigo/producer_inigo.c b/src/modules/inigo/producer_inigo.c index b03d3d75..cb04dc0c 100644 --- a/src/modules/inigo/producer_inigo.c +++ b/src/modules/inigo/producer_inigo.c @@ -167,7 +167,7 @@ mlt_producer producer_inigo_init( char **argv ) track_service( field, playlist, ( mlt_destructor )mlt_playlist_close ); playlist = mlt_playlist_init( ); } - else if ( strstr( argv[ i ], "=" ) ) + else if ( strchr( argv[ i ], '=' ) && !strchr( argv[ i ], ':' ) ) { mlt_properties_parse( properties, argv[ i ] ); } @@ -219,4 +219,3 @@ mlt_producer producer_inigo_init( char **argv ) return mlt_tractor_producer( tractor ); } -