]> git.sesse.net Git - vlc/blob - modules/codec/avcodec/video.c
e42d6f627e5f024b29a565a5a0eb22cd01a9b448
[vlc] / modules / codec / avcodec / video.c
1 /*****************************************************************************
2  * video.c: video decoder using the ffmpeg library
3  *****************************************************************************
4  * Copyright (C) 1999-2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Gildas Bazin <gbazin@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <vlc_common.h>
33 #include <vlc_codec.h>
34 #include <vlc_vout.h>
35 #include <vlc_input.h>                  /* hmmm, just for INPUT_RATE_DEFAULT */
36 #include <vlc_codecs.h>                               /* BITMAPINFOHEADER */
37
38 /* ffmpeg header */
39 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
40 #   include <libavcodec/avcodec.h>
41 #elif defined(HAVE_FFMPEG_AVCODEC_H)
42 #   include <ffmpeg/avcodec.h>
43 #else
44 #   include <avcodec.h>
45 #endif
46
47 #include "avcodec.h"
48 #include "chroma.h"
49
50 /*****************************************************************************
51  * decoder_sys_t : decoder descriptor
52  *****************************************************************************/
53 struct decoder_sys_t
54 {
55     FFMPEG_COMMON_MEMBERS
56
57     /* Video decoder specific part */
58     mtime_t input_pts;
59     mtime_t input_dts;
60     mtime_t i_pts;
61
62     AVFrame          *p_ff_pic;
63     BITMAPINFOHEADER *p_format;
64
65     /* for frame skipping algo */
66     int b_hurry_up;
67     enum AVDiscard i_skip_frame;
68     enum AVDiscard i_skip_idct;
69
70     /* how many decoded frames are late */
71     int     i_late_frames;
72     mtime_t i_late_frames_start;
73
74     /* for direct rendering */
75     int b_direct_rendering;
76
77     bool b_has_b_frames;
78
79     /* Hack to force display of still pictures */
80     bool b_first_frame;
81
82     int i_buffer_orig, i_buffer;
83     char *p_buffer_orig, *p_buffer;
84
85     /* */
86     AVPaletteControl palette;
87
88     /* */
89     bool b_flush;
90 };
91
92 /* FIXME (dummy palette for now) */
93 static const AVPaletteControl palette_control;
94
95 /*****************************************************************************
96  * Local prototypes
97  *****************************************************************************/
98 static void ffmpeg_InitCodec      ( decoder_t * );
99 static void ffmpeg_CopyPicture    ( decoder_t *, picture_t *, AVFrame * );
100 static int  ffmpeg_GetFrameBuf    ( struct AVCodecContext *, AVFrame * );
101 static int  ffmpeg_ReGetFrameBuf( struct AVCodecContext *, AVFrame * );
102 static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * );
103 static void ffmpeg_NextPts( decoder_t *, int i_block_rate );
104
105 static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc )
106 {
107     uint8_t *p = (uint8_t*)&fcc;
108     return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
109 }
110
111 /*****************************************************************************
112  * Local Functions
113  *****************************************************************************/
114
115 /* Returns a new picture buffer */
116 static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
117                                             AVCodecContext *p_context )
118 {
119     picture_t *p_pic;
120
121     p_dec->fmt_out.video.i_width = p_context->width;
122     p_dec->fmt_out.video.i_height = p_context->height;
123
124     if( !p_context->width || !p_context->height )
125     {
126         return NULL; /* invalid display size */
127     }
128
129     if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) != VLC_SUCCESS )
130     {
131         /* we are doomed, but not really, because most codecs set their pix_fmt much later */
132         p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
133     }
134     p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
135
136     /* If an aspect-ratio was specified in the input format then force it */
137     if( p_dec->fmt_in.video.i_aspect )
138     {
139         p_dec->fmt_out.video.i_aspect = p_dec->fmt_in.video.i_aspect;
140     }
141     else
142     {
143         p_dec->fmt_out.video.i_aspect =
144             VOUT_ASPECT_FACTOR * ( av_q2d(p_context->sample_aspect_ratio) *
145                 p_context->width / p_context->height );
146         p_dec->fmt_out.video.i_sar_num = p_context->sample_aspect_ratio.num;
147         p_dec->fmt_out.video.i_sar_den = p_context->sample_aspect_ratio.den;
148
149         if( p_dec->fmt_out.video.i_aspect == 0 )
150         {
151             p_dec->fmt_out.video.i_aspect =
152                 VOUT_ASPECT_FACTOR * p_context->width / p_context->height;
153         }
154     }
155
156     if( p_dec->fmt_out.video.i_frame_rate > 0 &&
157         p_dec->fmt_out.video.i_frame_rate_base > 0 )
158     {
159         p_dec->fmt_out.video.i_frame_rate =
160             p_dec->fmt_in.video.i_frame_rate;
161         p_dec->fmt_out.video.i_frame_rate_base =
162             p_dec->fmt_in.video.i_frame_rate_base;
163     }
164     else if( p_context->time_base.num > 0 && p_context->time_base.den > 0 )
165     {
166         p_dec->fmt_out.video.i_frame_rate = p_context->time_base.den;
167         p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num;
168     }
169
170     p_pic = p_dec->pf_vout_buffer_new( p_dec );
171
172     return p_pic;
173 }
174
175 /*****************************************************************************
176  * InitVideo: initialize the video decoder
177  *****************************************************************************
178  * the ffmpeg codec will be opened, some memory allocated. The vout is not yet
179  * opened (done after the first decoded frame).
180  *****************************************************************************/
181 int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context,
182                       AVCodec *p_codec, int i_codec_id, const char *psz_namecodec )
183 {
184     decoder_sys_t *p_sys;
185     vlc_value_t val;
186
187     /* Allocate the memory needed to store the decoder's structure */
188     if( ( p_dec->p_sys = p_sys =
189           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
190     {
191         return VLC_ENOMEM;
192     }
193     memset( p_sys, 0, sizeof(decoder_sys_t) );
194
195     p_dec->p_sys->p_context = p_context;
196     p_dec->p_sys->p_codec = p_codec;
197     p_dec->p_sys->i_codec_id = i_codec_id;
198     p_dec->p_sys->psz_namecodec = psz_namecodec;
199     p_sys->p_ff_pic = avcodec_alloc_frame();
200
201     /* ***** Fill p_context with init values ***** */
202     p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_codec );
203     p_sys->p_context->width  = p_dec->fmt_in.video.i_width;
204     p_sys->p_context->height = p_dec->fmt_in.video.i_height;
205 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
206     p_sys->p_context->bits_per_sample = p_dec->fmt_in.video.i_bits_per_pixel;
207 #else
208     p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.video.i_bits_per_pixel;
209 #endif
210
211     /*  ***** Get configuration of ffmpeg plugin ***** */
212     p_sys->p_context->workaround_bugs =
213         config_GetInt( p_dec, "ffmpeg-workaround-bugs" );
214 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
215     p_sys->p_context->error_resilience =
216         config_GetInt( p_dec, "ffmpeg-error-resilience" );
217 #else
218     p_sys->p_context->error_recognition =
219         config_GetInt( p_dec, "ffmpeg-error-resilience" );
220 #endif
221
222     var_Create( p_dec, "grayscale", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
223     var_Get( p_dec, "grayscale", &val );
224     if( val.b_bool ) p_sys->p_context->flags |= CODEC_FLAG_GRAY;
225
226     var_Create( p_dec, "ffmpeg-vismv", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
227     var_Get( p_dec, "ffmpeg-vismv", &val );
228     if( val.i_int ) p_sys->p_context->debug_mv = val.i_int;
229
230     var_Create( p_dec, "ffmpeg-lowres", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
231     var_Get( p_dec, "ffmpeg-lowres", &val );
232     if( val.i_int > 0 && val.i_int <= 2 ) p_sys->p_context->lowres = val.i_int;
233
234     var_Create( p_dec, "ffmpeg-skiploopfilter",
235                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
236     var_Get( p_dec, "ffmpeg-skiploopfilter", &val );
237     if( val.i_int > 0 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONREF;
238     if( val.i_int > 1 ) p_sys->p_context->skip_loop_filter = AVDISCARD_BIDIR;
239     if( val.i_int > 2 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONKEY;
240     if( val.i_int > 3 ) p_sys->p_context->skip_loop_filter = AVDISCARD_ALL;
241
242     /* ***** ffmpeg frame skipping ***** */
243     var_Create( p_dec, "ffmpeg-hurry-up", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
244     var_Get( p_dec, "ffmpeg-hurry-up", &val );
245     p_sys->b_hurry_up = val.b_bool;
246
247     var_Create( p_dec, "ffmpeg-skip-frame", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
248     var_Get( p_dec, "ffmpeg-skip-frame", &val );
249     switch( val.i_int )
250     {
251         case -1:
252             p_sys->p_context->skip_frame = AVDISCARD_NONE;
253             break;
254         case 0:
255             p_sys->p_context->skip_frame = AVDISCARD_DEFAULT;
256             break;
257         case 1:
258             p_sys->p_context->skip_frame = AVDISCARD_BIDIR;
259             break;
260         case 2:
261             p_sys->p_context->skip_frame = AVDISCARD_NONKEY;
262             break;
263         case 3:
264             p_sys->p_context->skip_frame = AVDISCARD_ALL;
265             break;
266         default:
267             p_sys->p_context->skip_frame = AVDISCARD_NONE;
268             break;
269     }
270     p_sys->i_skip_frame = p_sys->p_context->skip_frame;
271
272     var_Create( p_dec, "ffmpeg-skip-idct",  VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
273     var_Get( p_dec, "ffmpeg-skip-idct", &val );
274     switch( val.i_int )
275     {
276         case -1:
277             p_sys->p_context->skip_idct = AVDISCARD_NONE;
278             break;
279         case 0:
280             p_sys->p_context->skip_idct = AVDISCARD_DEFAULT;
281             break;
282         case 1:
283             p_sys->p_context->skip_idct = AVDISCARD_BIDIR;
284             break;
285         case 2:
286             p_sys->p_context->skip_idct = AVDISCARD_NONKEY;
287             break;
288         case 3:
289             p_sys->p_context->skip_idct = AVDISCARD_ALL;
290             break;
291         default:
292             p_sys->p_context->skip_idct = AVDISCARD_NONE;
293             break;
294     }
295     p_sys->i_skip_idct = p_sys->p_context->skip_idct;
296
297     /* ***** ffmpeg direct rendering ***** */
298     p_sys->b_direct_rendering = 0;
299     var_Create( p_dec, "ffmpeg-dr", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
300     var_Get( p_dec, "ffmpeg-dr", &val );
301     if( val.b_bool && (p_sys->p_codec->capabilities & CODEC_CAP_DR1) &&
302         /* Apparently direct rendering doesn't work with YUV422P */
303         p_sys->p_context->pix_fmt != PIX_FMT_YUV422P &&
304         /* H264 uses too many reference frames */
305         p_sys->i_codec_id != CODEC_ID_H264 &&
306         !p_sys->p_context->debug_mv )
307     {
308         /* Some codecs set pix_fmt only after the 1st frame has been decoded,
309          * so we need to do another check in ffmpeg_GetFrameBuf() */
310         p_sys->b_direct_rendering = 1;
311     }
312
313     /* ffmpeg doesn't properly release old pictures when frames are skipped */
314     //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = 0;
315     if( p_sys->b_direct_rendering )
316     {
317         msg_Dbg( p_dec, "using direct rendering" );
318         p_sys->p_context->flags |= CODEC_FLAG_EMU_EDGE;
319     }
320
321     /* Always use our get_buffer wrapper so we can calculate the
322      * PTS correctly */
323     p_sys->p_context->get_buffer = ffmpeg_GetFrameBuf;
324     p_sys->p_context->reget_buffer = ffmpeg_ReGetFrameBuf;
325     p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf;
326     p_sys->p_context->opaque = p_dec;
327
328     /* ***** init this codec with special data ***** */
329     ffmpeg_InitCodec( p_dec );
330
331     /* ***** misc init ***** */
332     p_sys->input_pts = p_sys->input_dts = 0;
333     p_sys->i_pts = 0;
334     p_sys->b_has_b_frames = false;
335     p_sys->b_first_frame = true;
336     p_sys->b_flush = false;
337     p_sys->i_late_frames = 0;
338     p_sys->i_buffer = 0;
339     p_sys->i_buffer_orig = 1;
340     p_sys->p_buffer_orig = p_sys->p_buffer = malloc( p_sys->i_buffer_orig );
341     if( !p_sys->p_buffer_orig )
342     {
343         free( p_sys );
344         return VLC_ENOMEM;
345     }
346
347     /* Set output properties */
348     p_dec->fmt_out.i_cat = VIDEO_ES;
349     if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) != VLC_SUCCESS )
350     {
351         /* we are doomed. but not really, because most codecs set their pix_fmt later on */
352         p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
353     }
354     p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
355
356     /* Setup palette */
357     memset( &p_sys->palette, 0, sizeof(p_sys->palette) );
358     if( p_dec->fmt_in.video.p_palette )
359     {
360         p_sys->palette.palette_changed = 1;
361
362         for( int i = 0; i < __MIN( AVPALETTE_COUNT, p_dec->fmt_in.video.p_palette->i_entries ); i++ )
363         {
364             union {
365                 uint32_t u;
366                 uint8_t a[4];
367             } c;
368             c.a[0] = p_dec->fmt_in.video.p_palette->palette[i][0];
369             c.a[1] = p_dec->fmt_in.video.p_palette->palette[i][1];
370             c.a[2] = p_dec->fmt_in.video.p_palette->palette[i][2];
371             c.a[3] = p_dec->fmt_in.video.p_palette->palette[i][3];
372
373             p_sys->palette.palette[i] = c.u;
374         }
375         p_sys->p_context->palctrl = &p_sys->palette;
376
377         p_dec->fmt_out.video.p_palette = malloc( sizeof(video_palette_t) );
378         if( p_dec->fmt_out.video.p_palette )
379             *p_dec->fmt_out.video.p_palette = *p_dec->fmt_in.video.p_palette;
380     }
381     else if( p_sys->i_codec_id != CODEC_ID_MSVIDEO1 && p_sys->i_codec_id != CODEC_ID_CINEPAK )
382     {
383         p_sys->p_context->palctrl = &p_sys->palette;
384     }
385
386     /* ***** Open the codec ***** */
387     vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
388     if( lock == NULL )
389     {
390         free( p_sys->p_buffer_orig );
391         free( p_sys );
392         return VLC_ENOMEM;
393     }
394
395     if( avcodec_open( p_sys->p_context, p_sys->p_codec ) < 0 )
396     {
397         vlc_mutex_unlock( lock );
398         msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
399         free( p_sys->p_buffer_orig );
400         free( p_sys );
401         return VLC_EGENERIC;
402     }
403     vlc_mutex_unlock( lock );
404     msg_Dbg( p_dec, "ffmpeg codec (%s) started", p_sys->psz_namecodec );
405
406
407     return VLC_SUCCESS;
408 }
409
410 /*****************************************************************************
411  * DecodeVideo: Called to decode one or more frames
412  *****************************************************************************/
413 picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
414 {
415     decoder_sys_t *p_sys = p_dec->p_sys;
416     int b_drawpicture;
417     int b_null_size = false;
418     block_t *p_block;
419
420     if( !pp_block || !*pp_block ) return NULL;
421
422     if( !p_sys->p_context->extradata_size && p_dec->fmt_in.i_extra )
423         ffmpeg_InitCodec( p_dec );
424
425     p_block = *pp_block;
426
427     if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
428     {
429         p_sys->i_buffer = 0;
430         p_sys->i_pts = 0; /* To make sure we recover properly */
431
432         p_sys->input_pts = p_sys->input_dts = 0;
433         p_sys->i_late_frames = 0;
434
435         block_Release( p_block );
436
437         //if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
438             //avcodec_flush_buffers( p_sys->p_context );
439         return NULL;
440     }
441
442     if( p_block->i_flags & BLOCK_FLAG_PREROLL )
443     {
444         /* Do not care about late frames when prerolling
445          * TODO avoid decoding of non reference frame
446          * (ie all B except for H264 where it depends only on nal_ref_idc) */
447         p_sys->i_late_frames = 0;
448     }
449
450     if( !p_dec->b_pace_control && (p_sys->i_late_frames > 0) &&
451         (mdate() - p_sys->i_late_frames_start > INT64_C(5000000)) )
452     {
453         if( p_sys->i_pts )
454         {
455             msg_Err( p_dec, "more than 5 seconds of late video -> "
456                      "dropping frame (computer too slow ?)" );
457             p_sys->i_pts = 0; /* To make sure we recover properly */
458         }
459         block_Release( p_block );
460         p_sys->i_late_frames--;
461         return NULL;
462     }
463
464     if( p_block->i_pts > 0 || p_block->i_dts > 0 )
465     {
466         p_sys->input_pts = p_block->i_pts;
467         p_sys->input_dts = p_block->i_dts;
468
469         /* Make sure we don't reuse the same timestamps twice */
470         p_block->i_pts = p_block->i_dts = 0;
471     }
472
473     /* A good idea could be to decode all I pictures and see for the other */
474     if( !p_dec->b_pace_control &&
475         p_sys->b_hurry_up &&
476         (p_sys->i_late_frames > 4) )
477     {
478         b_drawpicture = 0;
479         if( p_sys->i_late_frames < 12 )
480         {
481             p_sys->p_context->skip_frame =
482                     (p_sys->i_skip_frame <= AVDISCARD_BIDIR) ?
483                     AVDISCARD_BIDIR : p_sys->i_skip_frame;
484         }
485         else
486         {
487             /* picture too late, won't decode
488              * but break picture until a new I, and for mpeg4 ...*/
489             p_sys->i_late_frames--; /* needed else it will never be decrease */
490             block_Release( p_block );
491             p_sys->i_buffer = 0;
492             return NULL;
493         }
494     }
495     else
496     {
497         if( p_sys->b_hurry_up )
498             p_sys->p_context->skip_frame = p_sys->i_skip_frame;
499         if( !(p_block->i_flags & BLOCK_FLAG_PREROLL) )
500             b_drawpicture = 1;
501         else
502             b_drawpicture = 0;
503     }
504
505     if( p_sys->p_context->width <= 0 || p_sys->p_context->height <= 0 )
506     {
507         if( p_sys->b_hurry_up )
508             p_sys->p_context->skip_frame = p_sys->i_skip_frame;
509         b_null_size = true;
510     }
511
512     /*
513      * Do the actual decoding now
514      */
515
516     /* Don't forget that ffmpeg requires a little more bytes
517      * that the real frame size */
518     if( p_block->i_buffer > 0 )
519     {
520         p_sys->b_flush = ( p_block->i_flags & BLOCK_FLAG_END_OF_SEQUENCE ) != 0;
521
522         p_sys->i_buffer = p_block->i_buffer;
523         if( p_sys->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE >
524             p_sys->i_buffer_orig )
525         {
526             free( p_sys->p_buffer_orig );
527             p_sys->i_buffer_orig =
528                 p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE;
529             p_sys->p_buffer_orig = malloc( p_sys->i_buffer_orig );
530         }
531         p_sys->p_buffer = p_sys->p_buffer_orig;
532         p_sys->i_buffer = p_block->i_buffer;
533         if( !p_sys->p_buffer )
534         {
535             block_Release( p_block );
536             return NULL;
537         }
538         vlc_memcpy( p_sys->p_buffer, p_block->p_buffer, p_block->i_buffer );
539         memset( p_sys->p_buffer + p_block->i_buffer, 0,
540                 FF_INPUT_BUFFER_PADDING_SIZE );
541
542         p_block->i_buffer = 0;
543     }
544
545     while( p_sys->i_buffer > 0 || p_sys->b_flush )
546     {
547         int i_used, b_gotpicture;
548         picture_t *p_pic;
549
550         i_used = avcodec_decode_video( p_sys->p_context, p_sys->p_ff_pic,
551                                        &b_gotpicture,
552                                        p_sys->i_buffer <= 0 && p_sys->b_flush ? NULL : (uint8_t*)p_sys->p_buffer, p_sys->i_buffer );
553
554         if( b_null_size && p_sys->p_context->width > 0 &&
555             p_sys->p_context->height > 0 &&
556             !p_sys->b_flush )
557         {
558             /* Reparse it to not drop the I frame */
559             b_null_size = false;
560             if( p_sys->b_hurry_up )
561                 p_sys->p_context->skip_frame = p_sys->i_skip_frame;
562             i_used = avcodec_decode_video( p_sys->p_context, p_sys->p_ff_pic,
563                                            &b_gotpicture,
564                                            (uint8_t*)p_sys->p_buffer, p_sys->i_buffer );
565         }
566
567         if( p_sys->b_flush )
568             p_sys->b_first_frame = true;
569
570         if( p_sys->i_buffer <= 0 )
571             p_sys->b_flush = false;
572
573         if( i_used < 0 )
574         {
575             msg_Warn( p_dec, "cannot decode one frame (%d bytes)",
576                       p_sys->i_buffer );
577             block_Release( p_block );
578             return NULL;
579         }
580         else if( i_used > p_sys->i_buffer )
581         {
582             i_used = p_sys->i_buffer;
583         }
584
585         /* Consumed bytes */
586         p_sys->i_buffer -= i_used;
587         p_sys->p_buffer += i_used;
588
589         /* Nothing to display */
590         if( !b_gotpicture )
591         {
592             if( i_used == 0 ) break;
593             continue;
594         }
595
596         /* Set the PTS */
597         if( p_sys->p_ff_pic->pts )
598             p_sys->i_pts = p_sys->p_ff_pic->pts;
599
600         /* Update frame late count (except when doing preroll) */
601         if( p_sys->i_pts && decoder_GetDisplayDate(p_dec, p_sys->i_pts) <= mdate() &&
602             !(p_block->i_flags & BLOCK_FLAG_PREROLL) )
603         {
604             p_sys->i_late_frames++;
605             if( p_sys->i_late_frames == 1 )
606                 p_sys->i_late_frames_start = mdate();
607         }
608         else
609         {
610             p_sys->i_late_frames = 0;
611         }
612
613         if( !b_drawpicture || !p_sys->p_ff_pic->linesize[0] )
614         {
615             /* Do not display the picture */
616             p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
617             if( !b_drawpicture && p_pic )
618                 p_dec->pf_vout_buffer_del( p_dec, p_pic );
619
620             ffmpeg_NextPts( p_dec, p_block->i_rate );
621             continue;
622         }
623
624         if( !p_sys->p_ff_pic->opaque )
625         {
626             /* Get a new picture */
627             p_pic = ffmpeg_NewPictBuf( p_dec, p_sys->p_context );
628             if( !p_pic )
629             {
630                 block_Release( p_block );
631                 return NULL;
632             }
633
634             /* Fill p_picture_t from AVVideoFrame and do chroma conversion
635              * if needed */
636             ffmpeg_CopyPicture( p_dec, p_pic, p_sys->p_ff_pic );
637         }
638         else
639         {
640             p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
641         }
642
643         /* Sanity check (seems to be needed for some streams) */
644         if( p_sys->p_ff_pic->pict_type == FF_B_TYPE )
645         {
646             p_sys->b_has_b_frames = true;
647         }
648
649         if( !p_dec->fmt_in.video.i_aspect )
650         {
651             /* Fetch again the aspect ratio in case it changed */
652             p_dec->fmt_out.video.i_aspect =
653                 VOUT_ASPECT_FACTOR
654                     * ( av_q2d(p_sys->p_context->sample_aspect_ratio)
655                     * p_sys->p_context->width / p_sys->p_context->height );
656             p_dec->fmt_out.video.i_sar_num
657                 = p_sys->p_context->sample_aspect_ratio.num;
658             p_dec->fmt_out.video.i_sar_den
659                 = p_sys->p_context->sample_aspect_ratio.den;
660
661             if( p_dec->fmt_out.video.i_aspect == 0 )
662             {
663                 p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR
664                     * p_sys->p_context->width / p_sys->p_context->height;
665             }
666         }
667
668         /* Send decoded frame to vout */
669         if( p_sys->i_pts )
670         {
671             int i;
672             p_pic->date = p_sys->i_pts;
673
674             ffmpeg_NextPts( p_dec, p_block->i_rate );
675
676             if( p_sys->b_first_frame )
677             {
678                 /* Hack to force display of still pictures */
679                 p_sys->b_first_frame = false;
680                 p_pic->b_force = true;
681             }
682
683             p_pic->i_nb_fields = 2 + p_sys->p_ff_pic->repeat_pict;
684             p_pic->b_progressive = !p_sys->p_ff_pic->interlaced_frame;
685             p_pic->b_top_field_first = p_sys->p_ff_pic->top_field_first;
686
687             p_pic->i_qstride = p_sys->p_ff_pic->qstride;
688             int i_mb_h = ( p_pic->format.i_height + 15 ) / 16;
689             p_pic->p_q = malloc( p_pic->i_qstride * i_mb_h );
690             memcpy( p_pic->p_q, p_sys->p_ff_pic->qscale_table,
691                     p_pic->i_qstride * i_mb_h );
692             switch( p_sys->p_ff_pic->qscale_type )
693             {
694                 case FF_QSCALE_TYPE_MPEG1:
695                     p_pic->i_qtype = QTYPE_MPEG1;
696                     break;
697                 case FF_QSCALE_TYPE_MPEG2:
698                     p_pic->i_qtype = QTYPE_MPEG2;
699                     break;
700                 case FF_QSCALE_TYPE_H264:
701                     p_pic->i_qtype = QTYPE_H264;
702                     break;
703             }
704
705             return p_pic;
706         }
707         else
708         {
709             p_dec->pf_vout_buffer_del( p_dec, p_pic );
710         }
711     }
712
713     block_Release( p_block );
714     return NULL;
715 }
716
717 /*****************************************************************************
718  * EndVideo: decoder destruction
719  *****************************************************************************
720  * This function is called when the thread ends after a successful
721  * initialization.
722  *****************************************************************************/
723 void EndVideoDec( decoder_t *p_dec )
724 {
725     decoder_sys_t *p_sys = p_dec->p_sys;
726
727     if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic );
728     free( p_sys->p_buffer_orig );
729 }
730
731 /*****************************************************************************
732  * ffmpeg_InitCodec: setup codec extra initialization data for ffmpeg
733  *****************************************************************************/
734 static void ffmpeg_InitCodec( decoder_t *p_dec )
735 {
736     decoder_sys_t *p_sys = p_dec->p_sys;
737     int i_size = p_dec->fmt_in.i_extra;
738
739     if( !i_size ) return;
740
741     if( p_sys->i_codec_id == CODEC_ID_SVQ3 )
742     {
743         uint8_t *p;
744
745         p_sys->p_context->extradata_size = i_size + 12;
746         p = p_sys->p_context->extradata  =
747             malloc( p_sys->p_context->extradata_size );
748         if( !p )
749             return;
750
751         memcpy( &p[0],  "SVQ3", 4 );
752         memset( &p[4], 0, 8 );
753         memcpy( &p[12], p_dec->fmt_in.p_extra, i_size );
754
755         /* Now remove all atoms before the SMI one */
756         if( p_sys->p_context->extradata_size > 0x5a &&
757             strncmp( (char*)&p[0x56], "SMI ", 4 ) )
758         {
759             uint8_t *psz = &p[0x52];
760
761             while( psz < &p[p_sys->p_context->extradata_size - 8] )
762             {
763                 int i_size = GetDWBE( psz );
764                 if( i_size <= 1 )
765                 {
766                     /* FIXME handle 1 as long size */
767                     break;
768                 }
769                 if( !strncmp( (char*)&psz[4], "SMI ", 4 ) )
770                 {
771                     memmove( &p[0x52], psz,
772                              &p[p_sys->p_context->extradata_size] - psz );
773                     break;
774                 }
775
776                 psz += i_size;
777             }
778         }
779     }
780     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'R', 'V', '1', '0' ) ||
781              p_dec->fmt_in.i_codec == VLC_FOURCC( 'R', 'V', '1', '3' ) ||
782              p_dec->fmt_in.i_codec == VLC_FOURCC( 'R', 'V', '2', '0' ) )
783     {
784         if( p_dec->fmt_in.i_extra == 8 )
785         {
786             p_sys->p_context->extradata_size = 8;
787             p_sys->p_context->extradata = malloc( 8 );
788             if( p_sys->p_context->extradata )
789             {
790                 memcpy( p_sys->p_context->extradata,
791                         p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra );
792                 p_sys->p_context->sub_id = ((uint32_t*)p_dec->fmt_in.p_extra)[1];
793
794                 msg_Warn( p_dec, "using extra data for RV codec sub_id=%08x",
795                           p_sys->p_context->sub_id );
796             }
797         }
798     }
799     else
800     {
801         p_sys->p_context->extradata_size = i_size;
802         p_sys->p_context->extradata =
803             malloc( i_size + FF_INPUT_BUFFER_PADDING_SIZE );
804         if( p_sys->p_context->extradata )
805         {
806             memcpy( p_sys->p_context->extradata,
807                     p_dec->fmt_in.p_extra, i_size );
808             memset( &((uint8_t*)p_sys->p_context->extradata)[i_size],
809                     0, FF_INPUT_BUFFER_PADDING_SIZE );
810         }
811     }
812 }
813
814 /*****************************************************************************
815  * ffmpeg_CopyPicture: copy a picture from ffmpeg internal buffers to a
816  *                     picture_t structure (when not in direct rendering mode).
817  *****************************************************************************/
818 static void ffmpeg_CopyPicture( decoder_t *p_dec,
819                                 picture_t *p_pic, AVFrame *p_ff_pic )
820 {
821     decoder_sys_t *p_sys = p_dec->p_sys;
822
823     if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) == VLC_SUCCESS )
824     {
825         int i_plane, i_size, i_line;
826         uint8_t *p_dst, *p_src;
827         int i_src_stride, i_dst_stride;
828
829         for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )
830         {
831             p_src  = p_ff_pic->data[i_plane];
832             p_dst = p_pic->p[i_plane].p_pixels;
833             i_src_stride = p_ff_pic->linesize[i_plane];
834             i_dst_stride = p_pic->p[i_plane].i_pitch;
835
836             i_size = __MIN( i_src_stride, i_dst_stride );
837             for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines;
838                  i_line++ )
839             {
840                 vlc_memcpy( p_dst, p_src, i_size );
841                 p_src += i_src_stride;
842                 p_dst += i_dst_stride;
843             }
844         }
845     }
846     else
847     {
848         msg_Err( p_dec, "don't know how to convert chroma %i",
849                  p_sys->p_context->pix_fmt );
850         p_dec->b_error = 1;
851     }
852 }
853
854 /*****************************************************************************
855  * ffmpeg_GetFrameBuf: callback used by ffmpeg to get a frame buffer.
856  *****************************************************************************
857  * It is used for direct rendering as well as to get the right PTS for each
858  * decoded picture (even in indirect rendering mode).
859  *****************************************************************************/
860 static void ffmpeg_SetFrameBufferPts( decoder_t *p_dec, AVFrame *p_ff_pic );
861
862 static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
863                                AVFrame *p_ff_pic )
864 {
865     decoder_t *p_dec = (decoder_t *)p_context->opaque;
866     decoder_sys_t *p_sys = p_dec->p_sys;
867     picture_t *p_pic;
868
869     /* Set picture PTS */
870     ffmpeg_SetFrameBufferPts( p_dec, p_ff_pic );
871
872     /* */
873     p_ff_pic->opaque = 0;
874
875     /* Not much to do in indirect rendering mode */
876     if( !p_sys->b_direct_rendering )
877     {
878         return avcodec_default_get_buffer( p_context, p_ff_pic );
879     }
880
881     /* Some codecs set pix_fmt only after the 1st frame has been decoded,
882      * so we need to check for direct rendering again. */
883
884     int i_width = p_sys->p_context->width;
885     int i_height = p_sys->p_context->height;
886     avcodec_align_dimensions( p_sys->p_context, &i_width, &i_height );
887
888     if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) != VLC_SUCCESS ||
889         p_sys->p_context->width % 16 || p_sys->p_context->height % 16 ||
890         /* We only pad picture up to 16 */
891         PAD(p_sys->p_context->width,16) < i_width || PAD(p_sys->p_context->height,16) < i_height ||
892         p_context->pix_fmt == PIX_FMT_PAL8 )
893     {
894         msg_Dbg( p_dec, "disabling direct rendering" );
895         p_sys->b_direct_rendering = 0;
896         return avcodec_default_get_buffer( p_context, p_ff_pic );
897     }
898     p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
899
900     /* Get a new picture */
901     //p_sys->p_vout->render.b_allow_modify_pics = 0;
902     p_pic = ffmpeg_NewPictBuf( p_dec, p_sys->p_context );
903     if( !p_pic )
904     {
905         p_sys->b_direct_rendering = 0;
906         return avcodec_default_get_buffer( p_context, p_ff_pic );
907     }
908     p_sys->p_context->draw_horiz_band = NULL;
909
910     p_ff_pic->opaque = (void*)p_pic;
911     p_ff_pic->type = FF_BUFFER_TYPE_USER;
912     p_ff_pic->data[0] = p_pic->p[0].p_pixels;
913     p_ff_pic->data[1] = p_pic->p[1].p_pixels;
914     p_ff_pic->data[2] = p_pic->p[2].p_pixels;
915     p_ff_pic->data[3] = NULL; /* alpha channel but I'm not sure */
916
917     p_ff_pic->linesize[0] = p_pic->p[0].i_pitch;
918     p_ff_pic->linesize[1] = p_pic->p[1].i_pitch;
919     p_ff_pic->linesize[2] = p_pic->p[2].i_pitch;
920     p_ff_pic->linesize[3] = 0;
921
922     if( p_ff_pic->reference != 0 )
923     {
924         p_dec->pf_picture_link( p_dec, p_pic );
925     }
926
927     /* FIXME what is that, should give good value */
928     p_ff_pic->age = 256*256*256*64; // FIXME FIXME from ffmpeg
929
930     return 0;
931 }
932 static int  ffmpeg_ReGetFrameBuf( struct AVCodecContext *p_context, AVFrame *p_ff_pic )
933 {
934     decoder_t *p_dec = (decoder_t *)p_context->opaque;
935     int i_ret;
936
937     /* */
938     p_ff_pic->pts = AV_NOPTS_VALUE;
939
940     /* We always use default reget function, it works perfectly fine */
941     i_ret = avcodec_default_reget_buffer( p_context, p_ff_pic );
942
943     /* Set picture PTS if avcodec_default_reget_buffer didn't set it (through a
944      * ffmpeg_GetFrameBuf call) */
945     if( !i_ret && p_ff_pic->pts == AV_NOPTS_VALUE )
946         ffmpeg_SetFrameBufferPts( p_dec, p_ff_pic );
947
948     return i_ret;
949 }
950
951 static void ffmpeg_SetFrameBufferPts( decoder_t *p_dec, AVFrame *p_ff_pic )
952 {
953     decoder_sys_t *p_sys = p_dec->p_sys;
954
955     /* Set picture PTS */
956     if( p_sys->input_pts )
957     {
958         p_ff_pic->pts = p_sys->input_pts;
959     }
960     else if( p_sys->input_dts )
961     {
962         /* Some demuxers only set the dts so let's try to find a useful
963          * timestamp from this */
964         if( !p_sys->p_context->has_b_frames || !p_sys->b_has_b_frames ||
965             !p_ff_pic->reference || !p_sys->i_pts )
966         {
967             p_ff_pic->pts = p_sys->input_dts;
968         }
969         else
970         {
971             p_ff_pic->pts = 0;
972         }
973     }
974     else
975     {
976         p_ff_pic->pts = 0;
977     }
978
979     if( p_sys->i_pts ) /* make sure 1st frame has a pts > 0 */
980     {
981         p_sys->input_pts = p_sys->input_dts = 0;
982     }
983 }
984
985 static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
986                                     AVFrame *p_ff_pic )
987 {
988     decoder_t *p_dec = (decoder_t *)p_context->opaque;
989     picture_t *p_pic;
990
991     if( !p_ff_pic->opaque )
992     {
993         avcodec_default_release_buffer( p_context, p_ff_pic );
994         return;
995     }
996
997     p_pic = (picture_t*)p_ff_pic->opaque;
998
999     p_ff_pic->data[0] = NULL;
1000     p_ff_pic->data[1] = NULL;
1001     p_ff_pic->data[2] = NULL;
1002     p_ff_pic->data[3] = NULL;
1003
1004     if( p_ff_pic->reference != 0 )
1005     {
1006         p_dec->pf_picture_unlink( p_dec, p_pic );
1007     }
1008 }
1009
1010 static void ffmpeg_NextPts( decoder_t *p_dec, int i_block_rate )
1011 {
1012     decoder_sys_t *p_sys = p_dec->p_sys;
1013
1014     if( p_sys->i_pts <= 0 )
1015         return;
1016
1017     /* interpolate the next PTS */
1018     if( p_dec->fmt_in.video.i_frame_rate > 0 &&
1019         p_dec->fmt_in.video.i_frame_rate_base > 0 )
1020     {
1021         p_sys->i_pts += INT64_C(1000000) *
1022             (2 + p_sys->p_ff_pic->repeat_pict) *
1023             p_dec->fmt_in.video.i_frame_rate_base *
1024             i_block_rate / INPUT_RATE_DEFAULT /
1025             (2 * p_dec->fmt_in.video.i_frame_rate);
1026     }
1027     else if( p_sys->p_context->time_base.den > 0 )
1028     {
1029         p_sys->i_pts += INT64_C(1000000) *
1030             (2 + p_sys->p_ff_pic->repeat_pict) *
1031             p_sys->p_context->time_base.num *
1032             i_block_rate / INPUT_RATE_DEFAULT /
1033             (2 * p_sys->p_context->time_base.den);
1034     }
1035 }