optimise dissolve case
[melted] / 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 NOTE: We need to have a valid [PAL or NTSC] frame rate before we can determine the
162 number of frames in the file. However, this is at odds with the way things work - the
163 constructor needs to provide in/out points before the user of the producer is able
164 to specify properties :-/. However, the PAL/NTSC distinction applies to all producers
165 and while we currently accept whatever the producer provides, this will not work in
166 the more general case. Plans are afoot... and this one will work without modification
167 (in theory anyway ;-)).
168 */
169
170 static int producer_open( mlt_producer this, char *file )
171 {
172 // Return an error code (0 == no error)
173 int error = 0;
174
175 // Context for avformat
176 AVFormatContext *context = NULL;
177
178 // Get the properties
179 mlt_properties properties = mlt_producer_properties( this );
180
181 // We will treat everything with the producer fps
182 double fps = mlt_properties_get_double( properties, "fps" );
183
184 // Lock the mutex now
185 pthread_mutex_lock( &avformat_mutex );
186
187 // Now attempt to open the file
188 error = av_open_input_file( &context, file, NULL, 0, NULL );
189 // fprintf( stderr, "AVFORMAT: open %d %s\n", error, file );
190 error = error < 0;
191
192 // If successful, then try to get additional info
193 if ( error == 0 )
194 {
195 // Get the stream info
196 error = av_find_stream_info( context ) < 0;
197
198 // Continue if no error
199 if ( error == 0 )
200 {
201 // We will default to the first audio and video streams found
202 int audio_index = -1;
203 int video_index = -1;
204
205 // Now set properties where we can (use default unknowns if required)
206 if ( context->duration != AV_NOPTS_VALUE )
207 {
208 // This isn't going to be accurate for all formats
209 mlt_position frames = ( mlt_position )( ( ( double )context->duration / ( double )AV_TIME_BASE ) * fps );
210 mlt_properties_set_position( properties, "out", frames - 2 );
211 mlt_properties_set_position( properties, "length", frames - 1 );
212 }
213
214 // Find default audio and video streams
215 find_default_streams( context, &audio_index, &video_index );
216
217 // Store selected audio and video indexes on properties
218 mlt_properties_set_int( properties, "audio_index", audio_index );
219 mlt_properties_set_int( properties, "video_index", video_index );
220
221 // We're going to cheat here - for a/v files, we will have two contexts (reasoning will be clear later)
222 if ( audio_index != -1 && video_index != -1 )
223 {
224 // We'll use the open one as our video_context
225 mlt_properties_set_data( properties, "video_context", context, 0, producer_file_close, NULL );
226
227 // And open again for our audio context
228 av_open_input_file( &context, file, NULL, 0, NULL );
229 av_find_stream_info( context );
230
231 // Audio context
232 mlt_properties_set_data( properties, "audio_context", context, 0, producer_file_close, NULL );
233 }
234 else if ( video_index != -1 )
235 {
236 // We only have a video context
237 mlt_properties_set_data( properties, "video_context", context, 0, producer_file_close, NULL );
238 }
239 else if ( audio_index != -1 )
240 {
241 // We only have an audio context
242 mlt_properties_set_data( properties, "audio_context", context, 0, producer_file_close, NULL );
243 }
244 else
245 {
246 // Something has gone wrong
247 error = -1;
248 }
249 }
250 }
251
252 // Unlock the mutex now
253 pthread_mutex_unlock( &avformat_mutex );
254
255 return error;
256 }
257
258 /** Convert a frame position to a time code.
259 */
260
261 static double producer_time_of_frame( mlt_producer this, mlt_position position )
262 {
263 // Get the properties
264 mlt_properties properties = mlt_producer_properties( this );
265
266 // Obtain the fps
267 double fps = mlt_properties_get_double( properties, "fps" );
268
269 // Do the calc
270 return ( double )position / fps;
271 }
272
273 /** Get an image from a frame.
274 */
275
276 static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable )
277 {
278 // Get the properties from the frame
279 mlt_properties frame_properties = mlt_frame_properties( frame );
280
281 // Obtain the frame number of this frame
282 mlt_position position = mlt_properties_get_position( frame_properties, "avformat_position" );
283
284 // Get the producer
285 mlt_producer this = mlt_properties_get_data( frame_properties, "avformat_producer", NULL );
286
287 // Get the producer properties
288 mlt_properties properties = mlt_producer_properties( this );
289
290 // Fetch the video_context
291 AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
292
293 // Get the video_index
294 int index = mlt_properties_get_int( properties, "video_index" );
295
296 // Obtain the expected frame numer
297 mlt_position expected = mlt_properties_get_position( properties, "video_expected" );
298
299 // Calculate the real time code
300 double real_timecode = producer_time_of_frame( this, position );
301
302 // Get the video stream
303 AVStream *stream = context->streams[ index ];
304
305 // Get codec context
306 AVCodecContext *codec_context = &stream->codec;
307
308 // Packet
309 AVPacket pkt;
310
311 // Get the conversion frame
312 AVPicture *output = mlt_properties_get_data( properties, "video_output_frame", NULL );
313
314 // Special case pause handling flag
315 int paused = 0;
316
317 // Special case ffwd handling
318 int ignore = 0;
319
320 // Current time calcs
321 double current_time = 0;
322
323 // We may want to use the source fps if available
324 double source_fps = mlt_properties_get_double( properties, "source_fps" );
325
326 // Set the result arguments that we know here (only *buffer is now required)
327 *format = mlt_image_yuv422;
328 *width = codec_context->width;
329 *height = codec_context->height;
330
331 // Set this on the frame properties
332 mlt_properties_set_int( frame_properties, "width", *width );
333 mlt_properties_set_int( frame_properties, "height", *height );
334
335 // Lock the mutex now
336 pthread_mutex_lock( &avformat_mutex );
337
338 // Construct an AVFrame for YUV422 conversion
339 if ( output == NULL )
340 {
341 int size = avpicture_get_size( PIX_FMT_YUV422, *width, *height );
342 void *frame_release = NULL;
343 void *buffer_release = NULL;
344 size += *width * 2;
345 uint8_t *buf = mlt_pool_allocate( size, &buffer_release );
346 output = mlt_pool_allocate( sizeof( AVPicture ), &frame_release );
347 memset( output, 0, sizeof( AVPicture ) );
348 avpicture_fill( output, buf, PIX_FMT_YUV422, *width, *height );
349 mlt_properties_set_data( properties, "video_output_frame_release", frame_release, 0, ( mlt_destructor )mlt_pool_release, NULL );
350 mlt_properties_set_data( properties, "video_output_buffer_release", buffer_release, 0, ( mlt_destructor )mlt_pool_release, NULL );
351 mlt_properties_set_data( properties, "video_output_frame", output, 0, NULL, NULL );
352 mlt_properties_set_data( properties, "video_output_buffer", buf, 0, NULL, NULL );
353 }
354
355 // Seek if necessary
356 if ( position != expected )
357 {
358 if ( position + 1 == expected )
359 {
360 // We're paused - use last image
361 paused = 1;
362 }
363 else if ( position > expected && ( position - expected ) < 250 )
364 {
365 // Fast forward - seeking is inefficient for small distances - just ignore following frames
366 ignore = position - expected;
367 }
368 else
369 {
370 // Set to the real timecode
371 av_seek_frame( context, -1, real_timecode * 1000000.0 );
372
373 // Remove the cached info relating to the previous position
374 mlt_properties_set_double( properties, "current_time", 0 );
375 mlt_properties_set_data( properties, "current_image", NULL, 0, NULL, NULL );
376 }
377 }
378
379 // Duplicate the last image if necessary
380 if ( mlt_properties_get_data( properties, "current_image", NULL ) != NULL &&
381 ( paused || mlt_properties_get_double( properties, "current_time" ) >= real_timecode ) )
382 {
383 // Get current image and size
384 int size = 0;
385 uint8_t *image = mlt_properties_get_data( properties, "current_image", &size );
386
387 // Duplicate it
388 void *release = NULL;
389 *buffer = mlt_pool_allocate( size, &release );
390 memcpy( *buffer, image, size );
391
392 // Set this on the frame properties
393 mlt_properties_set_data( frame_properties, "image_release", release, 0, ( mlt_destructor )mlt_pool_release, NULL );
394 mlt_properties_set_data( frame_properties, "image", *buffer, size, NULL, NULL );
395 }
396 else
397 {
398 int ret = 0;
399 int got_picture = 0;
400 AVFrame frame;
401
402 memset( &pkt, 0, sizeof( pkt ) );
403 memset( &frame, 0, sizeof( frame ) );
404
405 while( ret >= 0 && !got_picture )
406 {
407 // Read a packet
408 ret = av_read_frame( context, &pkt );
409
410 // We only deal with video from the selected video_index
411 if ( ret >= 0 && pkt.stream_index == index && pkt.size > 0 )
412 {
413 current_time = ( double )pkt.pts / 1000000.0;
414
415 // Decode the image
416 // Wouldn't it be great if I could use this...
417 //if ( (float)pkt.pts / 1000000.0 >= real_timecode )
418 ret = avcodec_decode_video( codec_context, &frame, &got_picture, pkt.data, pkt.size );
419
420 if ( got_picture )
421 {
422 // Handle ignore
423 if ( current_time < real_timecode )
424 {
425 ignore = 0;
426 got_picture = 0;
427 }
428 else if ( current_time >= real_timecode )
429 {
430 ignore = 0;
431 }
432 else if ( got_picture && ignore -- )
433 {
434 got_picture = 0;
435 }
436 }
437 }
438
439 // We're finished with this packet regardless
440 av_free_packet( &pkt );
441 }
442
443 // Now handle the picture if we have one
444 if ( got_picture )
445 {
446 // Get current image and size
447 int size = 0;
448 void *release = NULL;
449 uint8_t *image = mlt_properties_get_data( properties, "current_image", &size );
450
451 if ( image == NULL || size != *width * *height * 2 )
452 {
453 void *current_image_release = NULL;
454 size = *width * ( *height + 1 ) * 2;
455 image = mlt_pool_allocate( size, &current_image_release );
456 mlt_properties_set_data( properties, "current_image_release", current_image_release, 0, ( mlt_destructor )mlt_pool_release, NULL );
457 mlt_properties_set_data( properties, "current_image", image, size, NULL, NULL );
458 }
459
460 *buffer = mlt_pool_allocate( size, &release );
461 img_convert( output, PIX_FMT_YUV422, (AVPicture *)&frame, codec_context->pix_fmt, *width, *height );
462 memcpy( image, output->data[ 0 ], size );
463 memcpy( *buffer, output->data[ 0 ], size );
464 mlt_properties_set_data( frame_properties, "image_release", release, 0, ( mlt_destructor )mlt_pool_release, NULL );
465 mlt_properties_set_data( frame_properties, "image", *buffer, size, NULL, NULL );
466
467 if ( current_time == 0 && source_fps != 0 )
468 {
469 double fps = mlt_properties_get_double( properties, "fps" );
470 current_time = ceil( source_fps * ( double )position / fps ) * ( 1 / source_fps );
471 mlt_properties_set_double( properties, "current_time", current_time );
472 }
473 else
474 {
475 mlt_properties_set_double( properties, "current_time", current_time );
476 }
477 }
478 }
479
480 // Regardless of speed, we expect to get the next frame (cos we ain't too bright)
481 mlt_properties_set_position( properties, "video_expected", position + 1 );
482
483 // Unlock the mutex now
484 pthread_mutex_unlock( &avformat_mutex );
485
486 return 0;
487 }
488
489 /** Set up video handling.
490 */
491
492 static void producer_set_up_video( mlt_producer this, mlt_frame frame )
493 {
494 // Get the properties
495 mlt_properties properties = mlt_producer_properties( this );
496
497 // Fetch the video_context
498 AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
499
500 // Get the video_index
501 int index = mlt_properties_get_int( properties, "video_index" );
502
503 // Get the frame properties
504 mlt_properties frame_properties = mlt_frame_properties( frame );
505
506 // Lock the mutex now
507 pthread_mutex_lock( &avformat_mutex );
508
509 if ( context != NULL && index != -1 )
510 {
511 // Get the video stream
512 AVStream *stream = context->streams[ index ];
513
514 // Get codec context
515 AVCodecContext *codec_context = &stream->codec;
516
517 // Get the codec
518 AVCodec *codec = mlt_properties_get_data( properties, "video_codec", NULL );
519
520 // Initialise the codec if necessary
521 if ( codec == NULL )
522 {
523 // Find the codec
524 codec = avcodec_find_decoder( codec_context->codec_id );
525
526 // If we don't have a codec and we can't initialise it, we can't do much more...
527 if ( codec != NULL && avcodec_open( codec_context, codec ) >= 0 )
528 {
529 double aspect_ratio = 0;
530 double source_fps = 0;
531
532 // Set aspect ratio
533 if ( codec_context->sample_aspect_ratio.num == 0)
534 aspect_ratio = 0;
535 else
536 aspect_ratio = av_q2d( codec_context->sample_aspect_ratio ) * codec_context->width / codec_context->height;
537
538 if (aspect_ratio <= 0.0)
539 aspect_ratio = ( double )codec_context->width / ( double )codec_context->height;
540
541 mlt_properties_set_double( properties, "aspect_ratio", aspect_ratio );
542 fprintf( stderr, "AVFORMAT: sample aspect %f\n", aspect_ratio );
543
544 // Determine the fps
545 source_fps = ( double )codec_context->frame_rate / codec_context->frame_rate_base;
546
547 // We'll use fps if it's available
548 if ( source_fps > 0 && source_fps < 30 )
549 mlt_properties_set_double( properties, "source_fps", source_fps );
550
551 // Now store the codec with its destructor
552 mlt_properties_set_data( properties, "video_codec", codec_context, 0, producer_codec_close, NULL );
553
554 // Set to the real timecode
555 av_seek_frame( context, -1, 0 );
556 }
557 else
558 {
559 // Remember that we can't use this later
560 mlt_properties_set_int( properties, "video_index", -1 );
561 }
562 }
563
564 // No codec, no show...
565 if ( codec != NULL )
566 {
567 mlt_frame_push_get_image( frame, producer_get_image );
568 mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
569 }
570 else
571 {
572 mlt_properties_set_int( frame_properties, "test_image", 1 );
573 }
574 }
575 else
576 {
577 mlt_properties_set_int( frame_properties, "test_image", 1 );
578 }
579
580 // Unlock the mutex now
581 pthread_mutex_unlock( &avformat_mutex );
582 }
583
584 /** Get the audio from a frame.
585 */
586
587 static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
588 {
589 // Get the properties from the frame
590 mlt_properties frame_properties = mlt_frame_properties( frame );
591
592 // Obtain the frame number of this frame
593 mlt_position position = mlt_properties_get_position( frame_properties, "avformat_position" );
594
595 // Get the producer
596 mlt_producer this = mlt_properties_get_data( frame_properties, "avformat_producer", NULL );
597
598 // Get the producer properties
599 mlt_properties properties = mlt_producer_properties( this );
600
601 // Fetch the audio_context
602 AVFormatContext *context = mlt_properties_get_data( properties, "audio_context", NULL );
603
604 // Get the audio_index
605 int index = mlt_properties_get_int( properties, "audio_index" );
606
607 // Obtain the expected frame numer
608 mlt_position expected = mlt_properties_get_position( properties, "audio_expected" );
609
610 // Obtain the resample context if it exists (not always needed)
611 ReSampleContext *resample = mlt_properties_get_data( properties, "audio_resample", NULL );
612
613 // Obtain the audio buffer
614 int16_t *audio_buffer = mlt_properties_get_data( properties, "audio_buffer", NULL );
615
616 // Get amount of audio used
617 int audio_used = mlt_properties_get_int( properties, "audio_used" );
618
619 // Calculate the real time code
620 double real_timecode = producer_time_of_frame( this, position );
621
622 // Get the audio stream
623 AVStream *stream = context->streams[ index ];
624
625 // Get codec context
626 AVCodecContext *codec_context = &stream->codec;
627
628 // Packet
629 AVPacket pkt;
630
631 // Number of frames to ignore (for ffwd)
632 int ignore = 0;
633
634 // Flag for paused (silence)
635 int paused = 0;
636 int locked = 0;
637
638 // Lock the mutex now
639 pthread_mutex_lock( &avformat_mutex );
640
641 // Check for resample and create if necessary
642 if ( resample == NULL )
643 {
644 // Create the resampler
645 resample = audio_resample_init( *channels, codec_context->channels, *frequency, codec_context->sample_rate );
646
647 // And store it on properties
648 mlt_properties_set_data( properties, "audio_resample", resample, 0, ( mlt_destructor )audio_resample_close, NULL );
649 }
650
651 // Check for audio buffer and create if necessary
652 if ( audio_buffer == NULL )
653 {
654 // Audio buffer release pointer
655 void *buffer_release = NULL;
656
657 // Allocate the audio buffer
658 audio_buffer = mlt_pool_allocate( AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof( int16_t ), &buffer_release );
659
660 // And store it on properties for reuse
661 mlt_properties_set_data( properties, "audio_buffer_release", buffer_release, 0, ( mlt_destructor )mlt_pool_release, NULL );
662 mlt_properties_set_data( properties, "audio_buffer", audio_buffer, 0, NULL, NULL );
663 }
664
665 // Seek if necessary
666 if ( position != expected )
667 {
668 if ( position + 1 == expected )
669 {
670 // We're paused - silence required
671 paused = 1;
672 }
673 else if ( position > expected && ( position - expected ) < 250 )
674 {
675 // Fast forward - seeking is inefficient for small distances - just ignore following frames
676 ignore = position - expected;
677 }
678 else
679 {
680 // Set to the real timecode
681 av_seek_frame( context, -1, real_timecode * 1000000.0 );
682
683 // Clear the usage in the audio buffer
684 audio_used = 0;
685
686 locked = 1;
687 }
688 }
689
690 // Get the audio if required
691 if ( !paused )
692 {
693 int ret = 0;
694 int got_audio = 0;
695 void *temp_release = NULL;
696 int16_t *temp = mlt_pool_allocate( sizeof( int16_t ) * AVCODEC_MAX_AUDIO_FRAME_SIZE, &temp_release );
697
698 memset( &pkt, 0, sizeof( pkt ) );
699
700 while( ret >= 0 && !got_audio )
701 {
702 // Check if the buffer already contains the samples required
703 if ( audio_used >= *samples && ignore == 0 )
704 {
705 got_audio = 1;
706 break;
707 }
708
709 // Read a packet
710 ret = av_read_frame( context, &pkt );
711
712 int len = pkt.size;
713 uint8_t *ptr = pkt.data;
714 int data_size;
715
716 // We only deal with video from the selected video_index
717 while ( ptr != NULL && ret >= 0 && pkt.stream_index == index && len > 0 )
718 {
719 // Decode the audio
720 ret = avcodec_decode_audio( codec_context, temp, &data_size, ptr, len );
721
722 if ( ret < 0 )
723 {
724 ret = 0;
725 break;
726 }
727
728 len -= ret;
729 ptr += ret;
730
731 if ( data_size > 0 )
732 {
733 int size_out = audio_resample( resample, &audio_buffer[ audio_used * *channels ], temp, data_size / ( codec_context->channels * sizeof( int16_t ) ) );
734
735 audio_used += size_out;
736
737 // Handle ignore
738 while ( ignore && audio_used > *samples )
739 {
740 ignore --;
741 audio_used -= *samples;
742 memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * sizeof( int16_t ) );
743 }
744 }
745
746 // If we're behind, ignore this packet
747 float current_pts = (float)pkt.pts / 1000000.0;
748 double discrepancy = mlt_properties_get_double( properties, "discrepancy" );
749 if ( current_pts != 0 && real_timecode != 0 )
750 {
751 if ( discrepancy != 1 )
752 discrepancy = ( discrepancy + ( real_timecode / current_pts ) ) / 2;
753 else
754 discrepancy = real_timecode / current_pts;
755 if ( discrepancy > 0.9 && discrepancy < 1.1 )
756 discrepancy = 1.0;
757 else
758 discrepancy = floor( discrepancy + 0.5 );
759
760 if ( discrepancy == 0 )
761 discrepancy = 1.0;
762
763 mlt_properties_set_double( properties, "discrepancy", discrepancy );
764 }
765
766 if ( discrepancy * current_pts <= ( real_timecode - 0.02 ) )
767 ignore = 1;
768 }
769
770 // We're finished with this packet regardless
771 av_free_packet( &pkt );
772 }
773
774 // Now handle the audio if we have enough
775 if ( audio_used >= *samples )
776 {
777 void *buffer_release = NULL;
778 *buffer = mlt_pool_allocate( *samples * *channels * sizeof( int16_t ), &buffer_release );
779 memcpy( *buffer, audio_buffer, *samples * *channels * sizeof( int16_t ) );
780 audio_used -= *samples;
781 memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * *channels * sizeof( int16_t ) );
782 mlt_properties_set_data( frame_properties, "audio_release", buffer_release, 0, ( mlt_destructor )mlt_pool_release, NULL );
783 mlt_properties_set_data( frame_properties, "audio", *buffer, 0, NULL, NULL );
784 }
785 else
786 {
787 frame->get_audio = NULL;
788 mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples );
789 audio_used = 0;
790 }
791
792 // Store the number of audio samples still available
793 mlt_properties_set_int( properties, "audio_used", audio_used );
794
795 // Release the temporary audio
796 mlt_pool_release( temp_release );
797 }
798 else
799 {
800 // Get silence and don't touch the context
801 frame->get_audio = NULL;
802 mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples );
803 }
804
805 // Regardless of speed, we expect to get the next frame (cos we ain't too bright)
806 mlt_properties_set_position( properties, "audio_expected", position + 1 );
807
808 // Unlock the mutex now
809 pthread_mutex_unlock( &avformat_mutex );
810
811 return 0;
812 }
813
814 /** Set up audio handling.
815 */
816
817 static void producer_set_up_audio( mlt_producer this, mlt_frame frame )
818 {
819 // Get the properties
820 mlt_properties properties = mlt_producer_properties( this );
821
822 // Fetch the audio_context
823 AVFormatContext *context = mlt_properties_get_data( properties, "audio_context", NULL );
824
825 // Get the audio_index
826 int index = mlt_properties_get_int( properties, "audio_index" );
827
828 // Lock the mutex now
829 pthread_mutex_lock( &avformat_mutex );
830
831 // Deal with audio context
832 if ( context != NULL && index != -1 )
833 {
834 // Get the frame properties
835 mlt_properties frame_properties = mlt_frame_properties( frame );
836
837 // Get the audio stream
838 AVStream *stream = context->streams[ index ];
839
840 // Get codec context
841 AVCodecContext *codec_context = &stream->codec;
842
843 // Get the codec
844 AVCodec *codec = mlt_properties_get_data( properties, "audio_codec", NULL );
845
846 // Initialise the codec if necessary
847 if ( codec == NULL )
848 {
849 // Find the codec
850 codec = avcodec_find_decoder( codec_context->codec_id );
851
852 // If we don't have a codec and we can't initialise it, we can't do much more...
853 if ( codec != NULL && avcodec_open( codec_context, codec ) >= 0 )
854 {
855 // Now store the codec with its destructor
856 mlt_properties_set_data( properties, "audio_codec", codec_context, 0, producer_codec_close, NULL );
857
858 }
859 else
860 {
861 // Remember that we can't use this later
862 mlt_properties_set_int( properties, "audio_index", -1 );
863 }
864 }
865
866 // No codec, no show...
867 if ( codec != NULL )
868 {
869 frame->get_audio = producer_get_audio;
870 mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
871 }
872 }
873
874 // Unlock the mutex now
875 pthread_mutex_unlock( &avformat_mutex );
876 }
877
878 /** Our get frame implementation.
879 */
880
881 static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index )
882 {
883 // Create an empty frame
884 *frame = mlt_frame_init( );
885
886 // Update timecode on the frame we're creating
887 mlt_frame_set_position( *frame, mlt_producer_position( this ) );
888
889 // Set the position of this producer
890 mlt_properties_set_position( mlt_frame_properties( *frame ), "avformat_position", mlt_producer_get_in( this ) + mlt_producer_position( this ) );
891
892 // Set up the video
893 producer_set_up_video( this, *frame );
894
895 // Set up the audio
896 producer_set_up_audio( this, *frame );
897
898 // Set the aspect_ratio
899 mlt_properties_set_double( mlt_frame_properties( *frame ), "aspect_ratio", mlt_properties_get_double( mlt_producer_properties( this ), "aspect_ratio" ) );
900
901 // Calculate the next timecode
902 mlt_producer_prepare_next( this );
903
904 return 0;
905 }