]> git.sesse.net Git - mlt/blob - src/modules/avformat/producer_avformat.c
fix broken aspect handling again
[mlt] / src / modules / avformat / producer_avformat.c
1 /*
2  * producer_avformat.c -- avformat producer
3  * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
4  * Author: Charles Yates <charles.yates@pandora.be>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 // Local header files
22 #include "producer_avformat.h"
23
24 // MLT Header files
25 #include <framework/mlt_frame.h>
26
27 // ffmpeg Header files
28 #include <ffmpeg/avformat.h>
29
30 // System header files
31 #include <stdlib.h>
32 #include <string.h>
33 #include <pthread.h>
34 #include <math.h>
35
36 // Forward references.
37 static int producer_open( mlt_producer this, char *file );
38 static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index );
39
40 // A static flag used to determine if avformat has been initialised
41 static int avformat_initialised = 0;
42 static pthread_mutex_t avformat_mutex;
43
44 /** Constructor for libavformat.
45 */
46
47 mlt_producer producer_avformat_init( char *file )
48 {
49         mlt_producer this = NULL;
50
51         // Check that we have a non-NULL argument
52         if ( file != NULL )
53         {
54                 // Construct the producer
55                 this = calloc( 1, sizeof( struct mlt_producer_s ) );
56
57                 // Initialise it
58                 if ( mlt_producer_init( this, NULL ) == 0 )
59                 {
60                         // Get the properties
61                         mlt_properties properties = mlt_producer_properties( this );
62
63                         // Set the resource property (required for all producers)
64                         mlt_properties_set( properties, "resource", file );
65
66                         // TEST: audio sync tweaking
67                         mlt_properties_set_double( properties, "discrepancy", 1 );
68
69                         // Register our get_frame implementation
70                         this->get_frame = producer_get_frame;
71
72                         // Initialise avformat if necessary
73                         if ( avformat_initialised == 0 )
74                         {
75                                 pthread_mutex_init( &avformat_mutex, NULL );
76                                 avformat_initialised = 1;
77                                 av_register_all( );
78                         }
79
80                         // Open the file
81                         if ( producer_open( this, file ) != 0 )
82                         {
83                                 // Clean up
84                                 mlt_producer_close( this );
85                                 this = NULL;
86                         }
87                 }
88         }
89
90         return this;
91 }
92
93 /** Find the default streams.
94 */
95
96 static void find_default_streams( AVFormatContext *context, int *audio_index, int *video_index )
97 {
98         int i;
99
100         // Allow for multiple audio and video streams in the file and select first of each (if available)
101         for( i = 0; i < context->nb_streams; i++ ) 
102         {
103                 // Get the codec context
104                 AVCodecContext *codec_context = &context->streams[ i ]->codec;
105
106                 // Determine the type and obtain the first index of each type
107                 switch( codec_context->codec_type ) 
108                 {
109                         case CODEC_TYPE_VIDEO:
110                                 if ( *video_index < 0 )
111                                         *video_index = i;
112                                 break;
113                         case CODEC_TYPE_AUDIO:
114                                 if ( *audio_index < 0 )
115                                         *audio_index = i;
116                                 break;
117                         default:
118                                 break;
119                 }
120         }
121 }
122
123 /** Producer file destructor.
124 */
125
126 static void producer_file_close( void *context )
127 {
128         if ( context != NULL )
129         {
130                 // Lock the mutex now
131                 pthread_mutex_lock( &avformat_mutex );
132
133                 // Close the file
134                 av_close_input_file( context );
135
136                 // Unlock the mutex now
137                 pthread_mutex_unlock( &avformat_mutex );
138         }
139 }
140
141 /** Producer file destructor.
142 */
143
144 static void producer_codec_close( void *codec )
145 {
146         if ( codec != NULL )
147         {
148                 // Lock the mutex now
149                 pthread_mutex_lock( &avformat_mutex );
150
151                 // Close the file
152                 avcodec_close( codec );
153
154                 // Unlock the mutex now
155                 pthread_mutex_unlock( &avformat_mutex );
156         }
157 }
158
159 /** Open the file.
160 */
161
162 static int producer_open( mlt_producer this, char *file )
163 {
164         // Return an error code (0 == no error)
165         int error = 0;
166
167         // Context for avformat
168         AVFormatContext *context = NULL;
169
170         // Get the properties
171         mlt_properties properties = mlt_producer_properties( this );
172
173         // We will treat everything with the producer fps
174         double fps = mlt_properties_get_double( properties, "fps" );
175
176         // Lock the mutex now
177         pthread_mutex_lock( &avformat_mutex );
178
179         // Now attempt to open the file
180         error = av_open_input_file( &context, file, NULL, 0, NULL );
181         error = error < 0;
182
183         // If successful, then try to get additional info
184         if ( error == 0 )
185         {
186                 // Get the stream info
187                 error = av_find_stream_info( context ) < 0;
188
189                 // Continue if no error
190                 if ( error == 0 )
191                 {
192                         // We will default to the first audio and video streams found
193                         int audio_index = -1;
194                         int video_index = -1;
195
196                         // Now set properties where we can (use default unknowns if required)
197                         if ( context->duration != AV_NOPTS_VALUE ) 
198                         {
199                                 // This isn't going to be accurate for all formats
200                                 mlt_position frames = ( mlt_position )( ( ( double )context->duration / ( double )AV_TIME_BASE ) * fps );
201                                 mlt_properties_set_position( properties, "out", frames - 2 );
202                                 mlt_properties_set_position( properties, "length", frames - 1 );
203                         }
204
205                         // Find default audio and video streams
206                         find_default_streams( context, &audio_index, &video_index );
207
208                         // Store selected audio and video indexes on properties
209                         mlt_properties_set_int( properties, "audio_index", audio_index );
210                         mlt_properties_set_int( properties, "video_index", video_index );
211
212                         // We're going to cheat here - for a/v files, we will have two contexts (reasoning will be clear later)
213                         if ( audio_index != -1 && video_index != -1 )
214                         {
215                                 // We'll use the open one as our video_context
216                                 mlt_properties_set_data( properties, "video_context", context, 0, producer_file_close, NULL );
217
218                                 // And open again for our audio context
219                                 av_open_input_file( &context, file, NULL, 0, NULL );
220                                 av_find_stream_info( context );
221
222                                 // Audio context
223                                 mlt_properties_set_data( properties, "audio_context", context, 0, producer_file_close, NULL );
224                         }
225                         else if ( video_index != -1 )
226                         {
227                                 // We only have a video context
228                                 mlt_properties_set_data( properties, "video_context", context, 0, producer_file_close, NULL );
229                         }
230                         else if ( audio_index != -1 )
231                         {
232                                 // We only have an audio context
233                                 mlt_properties_set_data( properties, "audio_context", context, 0, producer_file_close, NULL );
234                         }
235                         else
236                         {
237                                 // Something has gone wrong
238                                 error = -1;
239                         }
240                 }
241         }
242
243         // Unlock the mutex now
244         pthread_mutex_unlock( &avformat_mutex );
245
246         return error;
247 }
248
249 /** Convert a frame position to a time code.
250 */
251
252 static double producer_time_of_frame( mlt_producer this, mlt_position position )
253 {
254         // Get the properties
255         mlt_properties properties = mlt_producer_properties( this );
256
257         // Obtain the fps
258         double fps = mlt_properties_get_double( properties, "fps" );
259
260         // Do the calc
261         return ( double )position / fps;
262 }
263
264 /** Get an image from a frame.
265 */
266
267 static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable )
268 {
269         // Get the properties from the frame
270         mlt_properties frame_properties = mlt_frame_properties( frame );
271
272         // Obtain the frame number of this frame
273         mlt_position position = mlt_properties_get_position( frame_properties, "avformat_position" );
274
275         // Get the producer 
276         mlt_producer this = mlt_properties_get_data( frame_properties, "avformat_producer", NULL );
277
278         // Get the producer properties
279         mlt_properties properties = mlt_producer_properties( this );
280
281         // Fetch the video_context
282         AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
283
284         // Get the video_index
285         int index = mlt_properties_get_int( properties, "video_index" );
286
287         // Obtain the expected frame numer
288         mlt_position expected = mlt_properties_get_position( properties, "video_expected" );
289
290         // Calculate the real time code
291         double real_timecode = producer_time_of_frame( this, position );
292
293         // Get the video stream
294         AVStream *stream = context->streams[ index ];
295
296         // Get codec context
297         AVCodecContext *codec_context = &stream->codec;
298
299         // Packet
300         AVPacket pkt;
301
302         // Get the conversion frame
303         AVPicture *output = mlt_properties_get_data( properties, "video_output_frame", NULL );
304
305         // Special case pause handling flag
306         int paused = 0;
307
308         // Special case ffwd handling
309         int ignore = 0;
310
311         // Current time calcs
312         double current_time = 0;
313
314         // We may want to use the source fps if available
315         double source_fps = mlt_properties_get_double( properties, "source_fps" );
316
317         // Set the result arguments that we know here (only *buffer is now required)
318         *format = mlt_image_yuv422;
319         *width = codec_context->width;
320         *height = codec_context->height;
321
322         // Set this on the frame properties
323         mlt_properties_set_int( frame_properties, "width", *width );
324         mlt_properties_set_int( frame_properties, "height", *height );
325
326         // Lock the mutex now
327         pthread_mutex_lock( &avformat_mutex );
328
329         // Construct an AVFrame for YUV422 conversion
330         if ( output == NULL )
331         {
332                 int size = avpicture_get_size( PIX_FMT_YUV422, *width, *height );
333                 size += *width * 2;
334                 uint8_t *buf = mlt_pool_alloc( size );
335                 output = mlt_pool_alloc( sizeof( AVPicture ) );
336                 //memset( output, 0, sizeof( AVPicture ) );
337                 avpicture_fill( output, buf, PIX_FMT_YUV422, *width, *height );
338                 mlt_properties_set_data( properties, "video_output_frame", output, 0, ( mlt_destructor )mlt_pool_release, NULL );
339                 mlt_properties_set_data( properties, "video_output_buffer", buf, 0, ( mlt_destructor )mlt_pool_release, NULL );
340         }
341
342         // Seek if necessary
343         if ( position != expected )
344         {
345                 if ( position + 1 == expected )
346                 {
347                         // We're paused - use last image
348                         paused = 1;
349                 }
350                 else if ( position > expected && ( position - expected ) < 250 )
351                 {
352                         // Fast forward - seeking is inefficient for small distances - just ignore following frames
353                         ignore = position - expected;
354                 }
355                 else
356                 {
357                         // Set to the real timecode
358                         av_seek_frame( context, -1, real_timecode * 1000000.0 );
359         
360                         // Remove the cached info relating to the previous position
361                         mlt_properties_set_double( properties, "current_time", 0 );
362                         mlt_properties_set_data( properties, "current_image", NULL, 0, NULL, NULL );
363                 }
364         }
365         
366         // Duplicate the last image if necessary
367         if ( mlt_properties_get_data( properties, "current_image", NULL ) != NULL &&
368                  ( paused || mlt_properties_get_double( properties, "current_time" ) >= real_timecode ) )
369         {
370                 // Get current image and size
371                 int size = 0;
372                 uint8_t *image = mlt_properties_get_data( properties, "current_image", &size );
373
374                 // Duplicate it
375                 *buffer = mlt_pool_alloc( size );
376                 memcpy( *buffer, image, size );
377
378                 // Set this on the frame properties
379                 mlt_properties_set_data( frame_properties, "image", *buffer, size, ( mlt_destructor )mlt_pool_release, NULL );
380         }
381         else
382         {
383                 int ret = 0;
384                 int got_picture = 0;
385                 AVFrame frame;
386
387                 memset( &pkt, 0, sizeof( pkt ) );
388                 memset( &frame, 0, sizeof( frame ) );
389
390                 while( ret >= 0 && !got_picture )
391                 {
392                         // Read a packet
393                         ret = av_read_frame( context, &pkt );
394
395                         // We only deal with video from the selected video_index
396                         if ( ret >= 0 && pkt.stream_index == index && pkt.size > 0 )
397                         {
398                                 current_time = ( double )pkt.pts / 1000000.0;
399
400                                 // Decode the image
401                                 ret = avcodec_decode_video( codec_context, &frame, &got_picture, pkt.data, pkt.size );
402
403                                 if ( got_picture )
404                                 {
405                                         // Handle ignore
406                                         if ( current_time < real_timecode )
407                                         {
408                                                 ignore = 0;
409                                                 got_picture = 0;
410                                         }
411                                         else if ( current_time >= real_timecode )
412                                         {
413                                                 ignore = 0;
414                                         }
415                                         else if ( got_picture && ignore -- )
416                                         {
417                                                 got_picture = 0;
418                                         }
419                                 }
420                         }
421
422                         // We're finished with this packet regardless
423                         av_free_packet( &pkt );
424                 }
425
426                 // Now handle the picture if we have one
427                 if ( got_picture )
428                 {
429                         // Get current image and size
430                         int size = 0;
431                         uint8_t *image = mlt_properties_get_data( properties, "current_image", &size );
432
433                         if ( image == NULL || size != *width * *height * 2 )
434                         {
435                                 size = *width * ( *height + 1 ) * 2;
436                                 image = mlt_pool_alloc( size );
437                                 mlt_properties_set_data( properties, "current_image", image, size, ( mlt_destructor )mlt_pool_release, NULL );
438                         }
439
440                         *buffer = mlt_pool_alloc( size );
441
442                         // EXPERIMENTAL IMAGE NORMALISATIONS
443                         if ( codec_context->pix_fmt == PIX_FMT_YUV420P )
444                         {
445                                 register int i, j;
446                                 register int half = *width >> 1;
447                                 uint8_t *Y = ( ( AVPicture * )&frame )->data[ 0 ];
448                                 uint8_t *U = ( ( AVPicture * )&frame )->data[ 1 ];
449                                 uint8_t *V = ( ( AVPicture * )&frame )->data[ 2 ];
450                                 register uint8_t *d = *buffer;
451                                 register uint8_t *y, *u, *v;
452
453                                 i = *height >> 1;
454                                 while ( i -- )
455                                 {
456                                         y = Y;
457                                         u = U;
458                                         v = V;
459                                         j = half;
460                                         while ( j -- )
461                                         {
462                                                 *d ++ = *y ++;
463                                                 *d ++ = *u ++;
464                                                 *d ++ = *y ++;
465                                                 *d ++ = *v ++;
466                                         }
467
468                                         Y += ( ( AVPicture * )&frame )->linesize[ 0 ];
469                                         y = Y;
470                                         u = U;
471                                         v = V;
472                                         j = half;
473                                         while ( j -- )
474                                         {
475                                                 *d ++ = *y ++;
476                                                 *d ++ = *u ++;
477                                                 *d ++ = *y ++;
478                                                 *d ++ = *v ++;
479                                         }
480
481                                         Y += ( ( AVPicture * )&frame )->linesize[ 0 ];
482                                         U += ( ( AVPicture * )&frame )->linesize[ 1 ];
483                                         V += ( ( AVPicture * )&frame )->linesize[ 2 ];
484                                 }
485                         }
486                         else
487                         {
488                                 img_convert( output, PIX_FMT_YUV422, (AVPicture *)&frame, codec_context->pix_fmt, *width, *height );
489                                 memcpy( *buffer, output->data[ 0 ], size );
490                         }
491
492                         memcpy( image, *buffer, size );
493                         mlt_properties_set_data( frame_properties, "image", *buffer, size, ( mlt_destructor )mlt_pool_release, NULL );
494
495                         if ( current_time == 0 && source_fps != 0 )
496                         {
497                                 double fps = mlt_properties_get_double( properties, "fps" );
498                                 current_time = ceil( source_fps * ( double )position / fps ) * ( 1 / source_fps );
499                                 mlt_properties_set_double( properties, "current_time", current_time );
500                         }
501                         else
502                         {
503                                 mlt_properties_set_double( properties, "current_time", current_time );
504                         }
505                 }
506         }
507
508         // Regardless of speed, we expect to get the next frame (cos we ain't too bright)
509         mlt_properties_set_position( properties, "video_expected", position + 1 );
510
511         // Unlock the mutex now
512         pthread_mutex_unlock( &avformat_mutex );
513
514         return 0;
515 }
516
517 /** Set up video handling.
518 */
519
520 static void producer_set_up_video( mlt_producer this, mlt_frame frame )
521 {
522         // Get the properties
523         mlt_properties properties = mlt_producer_properties( this );
524
525         // Fetch the video_context
526         AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
527
528         // Get the video_index
529         int index = mlt_properties_get_int( properties, "video_index" );
530
531         // Get the frame properties
532         mlt_properties frame_properties = mlt_frame_properties( frame );
533
534         // Lock the mutex now
535         pthread_mutex_lock( &avformat_mutex );
536
537         if ( context != NULL && index != -1 )
538         {
539                 // Get the video stream
540                 AVStream *stream = context->streams[ index ];
541
542                 // Get codec context
543                 AVCodecContext *codec_context = &stream->codec;
544
545                 // Get the codec
546                 AVCodec *codec = mlt_properties_get_data( properties, "video_codec", NULL );
547
548                 // Initialise the codec if necessary
549                 if ( codec == NULL )
550                 {
551                         // Find the codec
552                         codec = avcodec_find_decoder( codec_context->codec_id );
553
554                         // If we don't have a codec and we can't initialise it, we can't do much more...
555                         if ( codec != NULL && avcodec_open( codec_context, codec ) >= 0 )
556                         {
557                                 double aspect_ratio = 0;
558                                 double source_fps = 0;
559
560                                 // Set aspect ratio
561                                 if ( codec_context->sample_aspect_ratio.num == 0 ) 
562                                         aspect_ratio = 0;
563                                 else
564                                         aspect_ratio = av_q2d( codec_context->sample_aspect_ratio ) * codec_context->width / codec_context->height;
565
566                                 // XXX: This assumes square pixels!
567                         if (aspect_ratio <= 0.0)
568                                         aspect_ratio = ( double )codec_context->width / ( double )codec_context->height;
569
570                                 mlt_properties_set_double( properties, "aspect_ratio", aspect_ratio );
571                                 fprintf( stderr, "AVFORMAT: sample aspect %f computed display aspect %f\n", av_q2d( codec_context->sample_aspect_ratio ), aspect_ratio );
572
573                                 // Determine the fps
574                                 source_fps = ( double )codec_context->frame_rate / codec_context->frame_rate_base;
575
576                                 // We'll use fps if it's available
577                                 if ( source_fps > 0 && source_fps < 30 )
578                                         mlt_properties_set_double( properties, "source_fps", source_fps );
579
580                                 // Now store the codec with its destructor
581                                 mlt_properties_set_data( properties, "video_codec", codec_context, 0, producer_codec_close, NULL );
582
583                                 // Set to the real timecode
584                                 av_seek_frame( context, -1, 0 );
585                         }
586                         else
587                         {
588                                 // Remember that we can't use this later
589                                 mlt_properties_set_int( properties, "video_index", -1 );
590                         }
591                 }
592
593                 // No codec, no show...
594                 if ( codec != NULL )
595                 {
596                         mlt_frame_push_get_image( frame, producer_get_image );
597                         mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
598                 }
599                 else
600                 {
601                         mlt_properties_set_int( frame_properties, "test_image", 1 );
602                 }
603         }
604         else
605         {
606                 mlt_properties_set_int( frame_properties, "test_image", 1 );
607         }
608
609         // Unlock the mutex now
610         pthread_mutex_unlock( &avformat_mutex );
611 }
612
613 /** Get the audio from a frame.
614 */
615
616 static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
617 {
618         // Get the properties from the frame
619         mlt_properties frame_properties = mlt_frame_properties( frame );
620
621         // Obtain the frame number of this frame
622         mlt_position position = mlt_properties_get_position( frame_properties, "avformat_position" );
623
624         // Get the producer 
625         mlt_producer this = mlt_properties_get_data( frame_properties, "avformat_producer", NULL );
626
627         // Get the producer properties
628         mlt_properties properties = mlt_producer_properties( this );
629
630         // Fetch the audio_context
631         AVFormatContext *context = mlt_properties_get_data( properties, "audio_context", NULL );
632
633         // Get the audio_index
634         int index = mlt_properties_get_int( properties, "audio_index" );
635
636         // Obtain the expected frame numer
637         mlt_position expected = mlt_properties_get_position( properties, "audio_expected" );
638
639         // Obtain the resample context if it exists (not always needed)
640         ReSampleContext *resample = mlt_properties_get_data( properties, "audio_resample", NULL );
641
642         // Obtain the audio buffer
643         int16_t *audio_buffer = mlt_properties_get_data( properties, "audio_buffer", NULL );
644
645         // Get amount of audio used
646         int audio_used =  mlt_properties_get_int( properties, "audio_used" );
647
648         // Calculate the real time code
649         double real_timecode = producer_time_of_frame( this, position );
650
651         // Get the audio stream
652         AVStream *stream = context->streams[ index ];
653
654         // Get codec context
655         AVCodecContext *codec_context = &stream->codec;
656
657         // Packet
658         AVPacket pkt;
659
660         // Number of frames to ignore (for ffwd)
661         int ignore = 0;
662
663         // Flag for paused (silence) 
664         int paused = 0;
665         int locked = 0;
666
667         // Lock the mutex now
668         pthread_mutex_lock( &avformat_mutex );
669
670         // Check for resample and create if necessary
671         if ( resample == NULL )
672         {
673                 // Create the resampler
674                 resample = audio_resample_init( *channels, codec_context->channels, *frequency, codec_context->sample_rate );
675
676                 // And store it on properties
677                 mlt_properties_set_data( properties, "audio_resample", resample, 0, ( mlt_destructor )audio_resample_close, NULL );
678         }
679
680         // Check for audio buffer and create if necessary
681         if ( audio_buffer == NULL )
682         {
683                 // Allocate the audio buffer
684                 audio_buffer = mlt_pool_alloc( AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof( int16_t ) );
685
686                 // And store it on properties for reuse
687                 mlt_properties_set_data( properties, "audio_buffer", audio_buffer, 0, ( mlt_destructor )mlt_pool_release, NULL );
688         }
689
690         // Seek if necessary
691         if ( position != expected )
692         {
693                 if ( position + 1 == expected )
694                 {
695                         // We're paused - silence required
696                         paused = 1;
697                 }
698                 else if ( position > expected && ( position - expected ) < 250 )
699                 {
700                         // Fast forward - seeking is inefficient for small distances - just ignore following frames
701                         ignore = position - expected;
702                 }
703                 else
704                 {
705                         // Set to the real timecode
706                         av_seek_frame( context, -1, real_timecode * 1000000.0 );
707
708                         // Clear the usage in the audio buffer
709                         audio_used = 0;
710
711                         locked = 1;
712                 }
713         }
714
715         // Get the audio if required
716         if ( !paused )
717         {
718                 int ret = 0;
719                 int got_audio = 0;
720                 int16_t *temp = mlt_pool_alloc( sizeof( int16_t ) * AVCODEC_MAX_AUDIO_FRAME_SIZE );
721
722                 memset( &pkt, 0, sizeof( pkt ) );
723
724                 while( ret >= 0 && !got_audio )
725                 {
726                         // Check if the buffer already contains the samples required
727                         if ( audio_used >= *samples && ignore == 0 )
728                         {
729                                 got_audio = 1;
730                                 break;
731                         }
732
733                         // Read a packet
734                         ret = av_read_frame( context, &pkt );
735
736                 int len = pkt.size;
737                 uint8_t *ptr = pkt.data;
738                         int data_size;
739
740                         // We only deal with video from the selected video_index
741                         while ( ptr != NULL && ret >= 0 && pkt.stream_index == index && len > 0 )
742                         {
743                                 // Decode the audio
744                                 ret = avcodec_decode_audio( codec_context, temp, &data_size, ptr, len );
745
746                                 if ( ret < 0 )
747                                 {
748                                         ret = 0;
749                                         break;
750                                 }
751
752                                 len -= ret;
753                                 ptr += ret;
754
755                                 if ( data_size > 0 )
756                                 {
757                                         int size_out = audio_resample( resample, &audio_buffer[ audio_used * *channels ], temp, data_size / ( codec_context->channels * sizeof( int16_t ) ) );
758
759                                         audio_used += size_out;
760
761                                         // Handle ignore
762                                         while ( ignore && audio_used > *samples )
763                                         {
764                                                 ignore --;
765                                                 audio_used -= *samples;
766                                                 memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * sizeof( int16_t ) );
767                                         }
768                                 }
769
770                                 // If we're behind, ignore this packet
771                                 float current_pts = (float)pkt.pts / 1000000.0;
772                                 double discrepancy = mlt_properties_get_double( properties, "discrepancy" );
773                                 if ( current_pts != 0 && real_timecode != 0 )
774                                 {
775                                         if ( discrepancy != 1 )
776                                                 discrepancy = ( discrepancy + ( real_timecode / current_pts ) ) / 2;
777                                         else
778                                                 discrepancy = real_timecode / current_pts;
779                                         if ( discrepancy > 0.9 && discrepancy < 1.1 )
780                                                 discrepancy = 1.0;
781                                         else
782                                                 discrepancy = floor( discrepancy + 0.5 );
783
784                                         if ( discrepancy == 0 )
785                                                 discrepancy = 1.0;
786
787                                         mlt_properties_set_double( properties, "discrepancy", discrepancy );
788                                 }
789
790                                 if ( discrepancy * current_pts <= ( real_timecode - 0.02 ) )
791                                         ignore = 1;
792                         }
793
794                         // We're finished with this packet regardless
795                         av_free_packet( &pkt );
796                 }
797
798                 *buffer = mlt_pool_alloc( *samples * *channels * sizeof( int16_t ) );
799                 mlt_properties_set_data( frame_properties, "audio", *buffer, 0, ( mlt_destructor )mlt_pool_release, NULL );
800
801                 // Now handle the audio if we have enough
802                 if ( audio_used >= *samples )
803                 {
804                         memcpy( *buffer, audio_buffer, *samples * *channels * sizeof( int16_t ) );
805                         audio_used -= *samples;
806                         memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * *channels * sizeof( int16_t ) );
807                 }
808                 else
809                 {
810                         memset( *buffer, 0, *samples * *channels * sizeof( int16_t ) );
811                 }
812                 
813                 // Store the number of audio samples still available
814                 mlt_properties_set_int( properties, "audio_used", audio_used );
815
816                 // Release the temporary audio
817                 mlt_pool_release( temp );
818         }
819         else
820         {
821                 // Get silence and don't touch the context
822                 frame->get_audio = NULL;
823                 mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples );
824         }
825
826         // Regardless of speed, we expect to get the next frame (cos we ain't too bright)
827         mlt_properties_set_position( properties, "audio_expected", position + 1 );
828
829         // Unlock the mutex now
830         pthread_mutex_unlock( &avformat_mutex );
831
832         return 0;
833 }
834
835 /** Set up audio handling.
836 */
837
838 static void producer_set_up_audio( mlt_producer this, mlt_frame frame )
839 {
840         // Get the properties
841         mlt_properties properties = mlt_producer_properties( this );
842
843         // Fetch the audio_context
844         AVFormatContext *context = mlt_properties_get_data( properties, "audio_context", NULL );
845
846         // Get the audio_index
847         int index = mlt_properties_get_int( properties, "audio_index" );
848
849         // Lock the mutex now
850         pthread_mutex_lock( &avformat_mutex );
851
852         // Deal with audio context
853         if ( context != NULL && index != -1 )
854         {
855                 // Get the frame properties
856                 mlt_properties frame_properties = mlt_frame_properties( frame );
857
858                 // Get the audio stream
859                 AVStream *stream = context->streams[ index ];
860
861                 // Get codec context
862                 AVCodecContext *codec_context = &stream->codec;
863
864                 // Get the codec
865                 AVCodec *codec = mlt_properties_get_data( properties, "audio_codec", NULL );
866
867                 // Initialise the codec if necessary
868                 if ( codec == NULL )
869                 {
870                         // Find the codec
871                         codec = avcodec_find_decoder( codec_context->codec_id );
872
873                         // If we don't have a codec and we can't initialise it, we can't do much more...
874                         if ( codec != NULL && avcodec_open( codec_context, codec ) >= 0 )
875                         {
876                                 // Now store the codec with its destructor
877                                 mlt_properties_set_data( properties, "audio_codec", codec_context, 0, producer_codec_close, NULL );
878
879                         }
880                         else
881                         {
882                                 // Remember that we can't use this later
883                                 mlt_properties_set_int( properties, "audio_index", -1 );
884                         }
885                 }
886
887                 // No codec, no show...
888                 if ( codec != NULL )
889                 {
890                         frame->get_audio = producer_get_audio;
891                         mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
892                 }
893         }
894
895         // Unlock the mutex now
896         pthread_mutex_unlock( &avformat_mutex );
897 }
898
899 /** Our get frame implementation.
900 */
901
902 static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index )
903 {
904         // Create an empty frame
905         *frame = mlt_frame_init( );
906
907         // Update timecode on the frame we're creating
908         mlt_frame_set_position( *frame, mlt_producer_position( this ) );
909
910         // Set the position of this producer
911         mlt_properties_set_position( mlt_frame_properties( *frame ), "avformat_position", mlt_producer_get_in( this ) + mlt_producer_position( this ) );
912
913         // Set up the video
914         producer_set_up_video( this, *frame );
915
916         // Set up the audio
917         producer_set_up_audio( this, *frame );
918
919         // Set the aspect_ratio
920         mlt_properties_set_double( mlt_frame_properties( *frame ), "aspect_ratio", mlt_properties_get_double( mlt_producer_properties( this ), "aspect_ratio" ) );
921
922         // Calculate the next timecode
923         mlt_producer_prepare_next( this );
924
925         return 0;
926 }