include ../../../config.mak
include config.mak
-TARGET = ../libmltavformat$(LIBSUF)
+TARGET = ../libmltffmpeg$(LIBSUF)
OBJS = factory.o \
producer_avformat.o \
install: all
install -m 755 $(TARGET) "$(prefix)/share/mlt/modules"
if [ $(LOCAL_FFMPEG) ] ; then \
- install -m 755 ../../framework/libmltavcodec.$(LIBSUF) "$(prefix)/share/mlt/modules" ; \
- install -m 755 ../../framework/libmltavformat.$(LIBSUF) "$(prefix)/share/mlt/modules" ; \
+ install -m 755 ../../framework/libmltavcodec$(LIBSUF) "$(prefix)/share/mlt/modules" ; \
+ install -m 755 ../../framework/libmltavformat$(LIBSUF) "$(prefix)/share/mlt/modules" ; \
fi
ifneq ($(wildcard .depend),)
echo "EXTRA_LIBS=$extra_libs" >> config.mak
cat << EOF >> ../producers.dat
-avformat libmltavformat$LIBSUF
+avformat libmltffmpeg$LIBSUF
EOF
cat << EOF >> ../filters.dat
-avdeinterlace libmltavformat$LIBSUF
-avresample libmltavformat$LIBSUF
-avcolour_space libmltavformat$LIBSUF
+avdeinterlace libmltffmpeg$LIBSUF
+avresample libmltffmpeg$LIBSUF
+avcolour_space libmltffmpeg$LIBSUF
EOF
cat << EOF >> ../consumers.dat
-avformat libmltavformat$LIBSUF
+avformat libmltffmpeg$LIBSUF
EOF
fi
c->bit_rate_tolerance = mlt_properties_get_int( properties, "video_bit_rate_tolerance" );
c->width = mlt_properties_get_int( properties, "width" );
c->height = mlt_properties_get_int( properties, "height" );
- c->frame_rate = mlt_properties_get_double( properties, "fps" );
- c->frame_rate_base = mlt_properties_get_double( properties, "frame_rate_base" );
- c->frame_rate_base = 1;
+ c->time_base.den = mlt_properties_get_double( properties, "fps" );
+ c->time_base.num = mlt_properties_get_double( properties, "frame_rate_base" );
+ c->time_base.num = 1;
c->gop_size = mlt_properties_get_int( properties, "gop_size" );
+ c->pix_fmt = PIX_FMT_YUV420P;
if ( mlt_properties_get_int( properties, "b_frames" ) )
{
AVStream *video_st = NULL;
// Time stamps
- double audio_pts, video_pts;
+ double audio_pts = 0;
+ double video_pts = 0;
// Loop variable
int i;
// While we have stuff to process, process...
while ( 1 )
{
- // Compute current audio and video time
- if (audio_st)
- audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
+ if (audio_st)
+ audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
else
- audio_pts = 0.0;
-
+ audio_pts = 0.0;
+
if (video_st)
- video_pts = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
- else
- video_pts = 0.0;
+ video_pts = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
+ else
+ video_pts = 0.0;
// Write interleaved audio and video frames
if ( !video_st || ( video_st && audio_st && audio_pts < video_pts ) )
pkt.size = avcodec_encode_audio( c, audio_outbuf, audio_outbuf_size, buffer );
// Write the compressed frame in the media file
if ( c->coded_frame )
- pkt.pts= c->coded_frame->pts;
+ pkt.pts = av_rescale_q( c->coded_frame->pts, c->time_base, audio_st->time_base );
pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= audio_st->index;
pkt.data= audio_outbuf;
if ( av_interleaved_write_frame( oc, &pkt ) != 0)
fprintf(stderr, "Error while writing audio frame\n");
+
+ audio_pts += c->frame_size;
}
else
{
pkt.size= sizeof(AVPicture);
ret = av_write_frame(oc, &pkt);
+ video_pts += c->frame_size;
}
else
{
av_init_packet( &pkt );
if ( c->coded_frame )
- pkt.pts= c->coded_frame->pts;
+ pkt.pts= av_rescale_q( c->coded_frame->pts, c->time_base, video_st->time_base );
if(c->coded_frame->key_frame)
pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= video_st->index;
// write the compressed frame in the media file
ret = av_interleaved_write_frame(oc, &pkt);
+ video_pts += c->frame_size;
}
}
frame_count++;
pthread_mutex_init( &avformat_mutex, NULL );
av_register_all( );
mlt_factory_register_for_clean_up( NULL, avformat_destroy );
- av_log_set_level( -1 );
+ //av_log_set_level( -1 );
}
}
// These are required by video4linux (defaults)
params->width = 640;
params->height = 480;
- params->frame_rate = 25;
- params->frame_rate_base = 1;
+ params->time_base= (AVRational){1,25};
params->device = file;
params->channels = 2;
params->sample_rate = 48000;
if ( t )
t[0] = 0;
if ( !strcmp( name, "frame_rate" ) )
- params->frame_rate = atoi( value );
+ params->time_base.den = atoi( value );
else if ( !strcmp( name, "frame_rate_base" ) )
- params->frame_rate_base = atoi( value );
+ params->time_base.num = atoi( value );
else if ( !strcmp( name, "sample_rate" ) )
params->sample_rate = atoi( value );
else if ( !strcmp( name, "channels" ) )
if ( ret >= 0 && pkt.stream_index == index && pkt.size > 0 )
{
// Determine time code of the packet
- if ( pkt.pts != AV_NOPTS_VALUE )
- current_time = ( double )pkt.pts / 1000000.0;
+ if ( pkt.dts != AV_NOPTS_VALUE )
+ current_time = av_q2d( stream->time_base ) * pkt.dts;
else
current_time = real_timecode;
mlt_properties_set_double( properties, "aspect_ratio", is_pal ? 59.0/54.0 : 10.0/11.0 );
}
- //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 == 0 ? 1 : codec_context->frame_rate_base );
+ source_fps = ( double )codec_context->time_base.den / ( codec_context->time_base.num == 0 ? 1 : codec_context->time_base.num );
// We'll use fps if it's available
if ( source_fps > 0 && source_fps < 30 )
}
// If we're behind, ignore this packet
- float current_pts = (float)pkt.pts / 1000000.0;
+ float current_pts = av_q2d( stream->time_base ) * pkt.pts;
if ( seekable && ( !ignore && current_pts <= ( real_timecode - 0.02 ) ) )
ignore = 1;
}