]> git.sesse.net Git - vlc/blob - modules/codec/libmpeg2.c
7a903224a246129ae9cb17dadc2dd54b56247ba0
[vlc] / modules / codec / libmpeg2.c
1 /*****************************************************************************
2  * libmpeg2.c: mpeg2 video decoder module making use of libmpeg2.
3  *****************************************************************************
4  * Copyright (C) 1999-2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@videolan.org>
8  *          Christophe Massiot <massiot@via.ecp.fr>
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 #include <assert.h>
32
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
36 #include <vlc_block_helper.h>
37 #include "../codec/cc.h"
38
39 #include <mpeg2.h>
40
41 #include <vlc_codec_synchro.h>
42
43 /*****************************************************************************
44  * decoder_sys_t : libmpeg2 decoder descriptor
45  *****************************************************************************/
46 #define DPB_COUNT (3+1)
47 typedef struct
48 {
49     picture_t *p_picture;
50     bool      b_linked;
51     bool      b_displayed;
52 } picture_dpb_t;
53
54 struct decoder_sys_t
55 {
56     /*
57      * libmpeg2 properties
58      */
59     mpeg2dec_t          *p_mpeg2dec;
60     const mpeg2_info_t  *p_info;
61     bool                b_skip;
62
63     /*
64      * Input properties
65      */
66     mtime_t          i_previous_pts;
67     mtime_t          i_current_pts;
68     mtime_t          i_previous_dts;
69     mtime_t          i_current_dts;
70     bool             b_garbage_pic;
71     bool             b_after_sequence_header; /* is it the next frame after
72                                                * the sequence header ?    */
73     bool             b_slice_i;             /* intra-slice refresh stream */
74     bool             b_second_field;
75
76     bool             b_preroll;
77
78     /* */
79     picture_dpb_t        p_dpb[DPB_COUNT];
80
81     /*
82      * Output properties
83      */
84     decoder_synchro_t *p_synchro;
85     int             i_aspect;
86     int             i_sar_num;
87     int             i_sar_den;
88     mtime_t         i_last_frame_pts;
89
90     /* Closed captioning support */
91     uint32_t        i_cc_flags;
92     mtime_t         i_cc_pts;
93     mtime_t         i_cc_dts;
94     cc_data_t       cc;
95     uint8_t        *p_gop_user_data;
96     uint32_t        i_gop_user_data;
97 };
98
99 /*****************************************************************************
100  * Local prototypes
101  *****************************************************************************/
102 static int  OpenDecoder( vlc_object_t * );
103 static void CloseDecoder( vlc_object_t * );
104
105 static picture_t *DecodeBlock( decoder_t *, block_t ** );
106 static block_t   *GetCc( decoder_t *p_dec, bool pb_present[4] );
107
108 static picture_t *GetNewPicture( decoder_t * );
109 static void PutPicture( decoder_t *, picture_t * );
110
111 static void GetAR( decoder_t *p_dec );
112
113 static void Reset( decoder_t *p_dec );
114
115 /* */
116 static void DpbInit( decoder_t * );
117 static void DpbClean( decoder_t * );
118 static picture_t *DpbNewPicture( decoder_t * );
119 static void DpbUnlinkPicture( decoder_t *, picture_t * );
120 static int DpbDisplayPicture( decoder_t *, picture_t * );
121
122 /*****************************************************************************
123  * Module descriptor
124  *****************************************************************************/
125 vlc_module_begin ()
126     set_description( N_("MPEG I/II video decoder (using libmpeg2)") )
127     set_capability( "decoder", 150 )
128     set_category( CAT_INPUT )
129     set_subcategory( SUBCAT_INPUT_VCODEC )
130     set_callbacks( OpenDecoder, CloseDecoder )
131     add_shortcut( "libmpeg2" )
132 vlc_module_end ()
133
134 /*****************************************************************************
135  * OpenDecoder: probe the decoder and return score
136  *****************************************************************************/
137 static int OpenDecoder( vlc_object_t *p_this )
138 {
139     decoder_t *p_dec = (decoder_t*)p_this;
140     decoder_sys_t *p_sys;
141     uint32_t i_accel = 0;
142
143     if( p_dec->fmt_in.i_codec != VLC_CODEC_MPGV )
144         return VLC_EGENERIC;
145
146     /* Select onl recognized original format (standard mpeg video) */
147     switch( p_dec->fmt_in.i_original_fourcc )
148     {
149     case VLC_FOURCC('m','p','g','1'):
150     case VLC_FOURCC('m','p','g','2'):
151     case VLC_FOURCC('m','p','g','v'):
152     case VLC_FOURCC('P','I','M','1'):
153     case VLC_FOURCC('h','d','v','2'):
154         break;
155     default:
156         if( p_dec->fmt_in.i_original_fourcc )
157             return VLC_EGENERIC;
158         break;
159     }
160
161     /* Allocate the memory needed to store the decoder's structure */
162     if( ( p_dec->p_sys = p_sys = calloc( 1, sizeof(*p_sys)) ) == NULL )
163         return VLC_ENOMEM;
164
165     /* Initialize the thread properties */
166     p_sys->p_mpeg2dec = NULL;
167     p_sys->p_synchro  = NULL;
168     p_sys->p_info     = NULL;
169     p_sys->i_current_pts  = 0;
170     p_sys->i_previous_pts = 0;
171     p_sys->i_current_dts  = 0;
172     p_sys->i_previous_dts = 0;
173     p_sys->b_garbage_pic = false;
174     p_sys->b_slice_i  = false;
175     p_sys->b_second_field = false;
176     p_sys->b_skip     = false;
177     p_sys->b_preroll = false;
178     DpbInit( p_dec );
179
180     p_sys->i_cc_pts = 0;
181     p_sys->i_cc_dts = 0;
182     p_sys->i_cc_flags = 0;
183 #if MPEG2_RELEASE >= MPEG2_VERSION (0, 5, 0)
184     p_dec->pf_get_cc = GetCc;
185     cc_Init( &p_sys->cc );
186 #endif
187     p_sys->p_gop_user_data = NULL;
188     p_sys->i_gop_user_data = 0;
189
190 #if defined( __i386__ ) || defined( __x86_64__ )
191     if( vlc_CPU() & CPU_CAPABILITY_MMX )
192     {
193         i_accel |= MPEG2_ACCEL_X86_MMX;
194     }
195
196     if( vlc_CPU() & CPU_CAPABILITY_3DNOW )
197     {
198         i_accel |= MPEG2_ACCEL_X86_3DNOW;
199     }
200
201     if( vlc_CPU() & CPU_CAPABILITY_MMXEXT )
202     {
203         i_accel |= MPEG2_ACCEL_X86_MMXEXT;
204     }
205
206 #elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ )
207     if( vlc_CPU() & CPU_CAPABILITY_ALTIVEC )
208     {
209         i_accel |= MPEG2_ACCEL_PPC_ALTIVEC;
210     }
211
212 #else
213     /* If we do not know this CPU, trust libmpeg2's feature detection */
214     i_accel = MPEG2_ACCEL_DETECT;
215
216 #endif
217
218     /* Set CPU acceleration features */
219     mpeg2_accel( i_accel );
220
221     /* Initialize decoder */
222     p_sys->p_mpeg2dec = mpeg2_init();
223     if( p_sys->p_mpeg2dec == NULL)
224     {
225         msg_Err( p_dec, "mpeg2_init() failed" );
226         free( p_sys );
227         return VLC_EGENERIC;
228     }
229
230     p_sys->p_info = mpeg2_info( p_sys->p_mpeg2dec );
231
232     p_dec->pf_decode_video = DecodeBlock;
233     p_dec->fmt_out.i_cat = VIDEO_ES;
234     p_dec->fmt_out.i_codec = 0;
235
236     return VLC_SUCCESS;
237 }
238
239 /*****************************************************************************
240  * RunDecoder: the libmpeg2 decoder
241  *****************************************************************************/
242 static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
243 {
244     decoder_sys_t   *p_sys = p_dec->p_sys;
245     mpeg2_state_t   state;
246     picture_t       *p_pic;
247
248     block_t *p_block;
249
250     if( !pp_block || !*pp_block )
251         return NULL;
252
253     p_block = *pp_block;
254     if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
255         Reset( p_dec );
256
257     while( 1 )
258     {
259         state = mpeg2_parse( p_sys->p_mpeg2dec );
260
261         switch( state )
262         {
263         case STATE_SEQUENCE:
264         {
265             /* */
266             DpbClean( p_dec );
267
268             /* */
269             mpeg2_custom_fbuf( p_sys->p_mpeg2dec, 1 );
270
271             /* Set the first 2 reference frames */
272             GetAR( p_dec );
273             for( int i = 0; i < 2; i++ )
274             {
275                 picture_t *p_picture = DpbNewPicture( p_dec );
276                 if( !p_picture )
277                 {
278                     /* Is it ok ? or do we need a reset ? */
279                     block_Release( p_block );
280                     return NULL;
281                 }
282                 PutPicture( p_dec, p_picture );
283             }
284
285             if( p_sys->p_synchro )
286                 decoder_SynchroRelease( p_sys->p_synchro );
287
288             p_sys->p_synchro =
289                 decoder_SynchroInit( p_dec, (uint32_t)((uint64_t)1001000000 * 27 /
290                                      p_sys->p_info->sequence->frame_period) );
291             p_sys->b_after_sequence_header = true;
292             break;
293         }
294
295         case STATE_GOP:
296             /* There can be userdata in a GOP. It needs to be remembered for the next picture. */
297             if( p_sys->p_info->user_data_len > 2 )
298             {
299                 free( p_sys->p_gop_user_data );
300                 p_sys->p_gop_user_data = calloc( p_sys->p_info->user_data_len, sizeof(uint8_t) );
301                 if( p_sys->p_gop_user_data )
302                 {
303                     p_sys->i_gop_user_data = p_sys->p_info->user_data_len;
304                     memcpy( p_sys->p_gop_user_data, p_sys->p_info->user_data, p_sys->p_info->user_data_len );
305                 }
306             }
307             break;
308
309         case STATE_PICTURE:
310         {
311             const mpeg2_info_t *p_info = p_sys->p_info;
312             const mpeg2_picture_t *p_current = p_info->current_picture;
313
314             mtime_t i_pts, i_dts;
315
316             if( p_sys->b_after_sequence_header &&
317                 (p_current->flags &
318                     PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_P )
319             {
320                 /* Intra-slice refresh. Simulate a blank I picture. */
321                 msg_Dbg( p_dec, "intra-slice refresh stream" );
322                 decoder_SynchroNewPicture( p_sys->p_synchro,
323                                            I_CODING_TYPE, 2, 0, 0,
324                                            p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
325                 decoder_SynchroDecode( p_sys->p_synchro );
326                 decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
327                 p_sys->b_slice_i = true;
328             }
329             p_sys->b_after_sequence_header = false;
330
331 #ifdef PIC_FLAG_PTS
332             i_pts = p_current->flags & PIC_FLAG_PTS ?
333                 ( ( p_current->pts ==
334                     (uint32_t)p_sys->i_current_pts ) ?
335                   p_sys->i_current_pts : p_sys->i_previous_pts ) : 0;
336             i_dts = 0;
337
338             /* Hack to handle demuxers which only have DTS timestamps */
339             if( !i_pts && !p_block->i_pts && p_block->i_dts > 0 )
340             {
341                 if( p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ||
342                     (p_current->flags &
343                       PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B )
344                 {
345                     i_pts = p_block->i_dts;
346                 }
347             }
348             p_block->i_pts = p_block->i_dts = 0;
349             /* End hack */
350
351 #else /* New interface */
352
353             i_pts = p_current->flags & PIC_FLAG_TAGS ?
354                 ( ( p_current->tag == (uint32_t)p_sys->i_current_pts ) ?
355                             p_sys->i_current_pts : p_sys->i_previous_pts ) : 0;
356             i_dts = p_current->flags & PIC_FLAG_TAGS ?
357                 ( ( p_current->tag2 == (uint32_t)p_sys->i_current_dts ) ?
358                             p_sys->i_current_dts : p_sys->i_previous_dts ) : 0;
359 #endif
360
361             /* If nb_fields == 1, it is a field picture, and it will be
362              * followed by another field picture for which we won't call
363              * decoder_SynchroNewPicture() because this would have other
364              * problems, so we take it into account here.
365              * This kind of sucks, but I didn't think better. --Meuuh
366              */
367             decoder_SynchroNewPicture( p_sys->p_synchro,
368                                        p_current->flags & PIC_MASK_CODING_TYPE,
369                                        p_current->nb_fields == 1 ? 2 :
370                                        p_current->nb_fields, i_pts, i_dts,
371                                        p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
372
373
374             bool b_skip = false;
375             if( !p_dec->b_pace_control && !p_sys->b_preroll &&
376                 !(p_sys->b_slice_i
377                    && ((p_current->flags
378                          & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_P))
379                    && !decoder_SynchroChoose( p_sys->p_synchro,
380                               p_current->flags
381                                 & PIC_MASK_CODING_TYPE,
382                               /*p_sys->p_vout->render_time*/ 0 /*FIXME*/,
383                               p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ) )
384             {
385                 b_skip = true;
386             }
387
388             p_pic = NULL;
389             if( !b_skip )
390             {
391                 p_pic = DpbNewPicture( p_dec );
392                 if( !p_pic )
393                 {
394                     Reset( p_dec );
395                     block_Release( p_block );
396                     return NULL;
397                 }
398             }
399
400             if( b_skip || !p_pic )
401             {
402                 mpeg2_skip( p_sys->p_mpeg2dec, 1 );
403                 p_sys->b_skip = true;
404                 decoder_SynchroTrash( p_sys->p_synchro );
405
406                 PutPicture( p_dec, NULL );
407
408                 if( !b_skip )
409                 {
410                     block_Release( p_block );
411                     return NULL;
412                 }
413             }
414             else
415             {
416                 mpeg2_skip( p_sys->p_mpeg2dec, 0 );
417                 p_sys->b_skip = false;
418                 decoder_SynchroDecode( p_sys->p_synchro );
419
420                 PutPicture( p_dec, p_pic );
421             }
422             if( p_info->user_data_len > 2 || p_sys->i_gop_user_data > 2 )
423             {
424                 p_sys->i_cc_pts = i_pts;
425                 p_sys->i_cc_dts = i_dts;
426                 if( (p_current->flags
427                              & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_P )
428                     p_sys->i_cc_flags = BLOCK_FLAG_TYPE_P;
429                 else if( (p_current->flags
430                              & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B )
431                     p_sys->i_cc_flags = BLOCK_FLAG_TYPE_B;
432                 else p_sys->i_cc_flags = BLOCK_FLAG_TYPE_I;
433
434                 if( p_sys->i_gop_user_data > 2 )
435                 {
436                     /* We now have picture info for any cached user_data out of the gop */
437                     cc_Extract( &p_sys->cc, &p_sys->p_gop_user_data[0], p_sys->i_gop_user_data );
438                     p_sys->i_gop_user_data = 0;
439                 }
440
441                 /* Extract the CC from the user_data of the picture */
442                 if( p_info->user_data_len > 2 )
443                     cc_Extract( &p_sys->cc, &p_info->user_data[0], p_info->user_data_len );
444             }
445         }
446         break;
447
448
449         case STATE_BUFFER:
450             if( !p_block->i_buffer )
451             {
452                 block_Release( p_block );
453                 return NULL;
454             }
455
456             if( (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY
457                                       | BLOCK_FLAG_CORRUPTED)) &&
458                 p_sys->p_synchro &&
459                 p_sys->p_info->sequence &&
460                 p_sys->p_info->sequence->width != (unsigned)-1 )
461             {
462                 decoder_SynchroReset( p_sys->p_synchro );
463                 if( p_sys->p_info->current_fbuf != NULL &&
464                     p_sys->p_info->current_fbuf->id != NULL )
465                 {
466                     p_sys->b_garbage_pic = true;
467                 }
468                 if( p_sys->b_slice_i )
469                 {
470                     decoder_SynchroNewPicture( p_sys->p_synchro,
471                                                I_CODING_TYPE, 2, 0, 0,
472                                                p_sys->p_info->sequence->flags &
473                                                             SEQ_FLAG_LOW_DELAY );
474                     decoder_SynchroDecode( p_sys->p_synchro );
475                     decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
476                 }
477             }
478
479             if( p_block->i_flags & BLOCK_FLAG_PREROLL )
480             {
481                 p_sys->b_preroll = true;
482             }
483             else if( p_sys->b_preroll )
484             {
485                 p_sys->b_preroll = false;
486                 if( p_sys->p_synchro )
487                     decoder_SynchroReset( p_sys->p_synchro );
488             }
489
490 #ifdef PIC_FLAG_PTS
491             if( p_block->i_pts )
492             {
493                 mpeg2_pts( p_sys->p_mpeg2dec, (uint32_t)p_block->i_pts );
494
495 #else /* New interface */
496             if( p_block->i_pts || p_block->i_dts )
497             {
498                 mpeg2_tag_picture( p_sys->p_mpeg2dec,
499                                    (uint32_t)p_block->i_pts,
500                                    (uint32_t)p_block->i_dts );
501 #endif
502                 p_sys->i_previous_pts = p_sys->i_current_pts;
503                 p_sys->i_current_pts = p_block->i_pts;
504                 p_sys->i_previous_dts = p_sys->i_current_dts;
505                 p_sys->i_current_dts = p_block->i_dts;
506             }
507
508             mpeg2_buffer( p_sys->p_mpeg2dec, p_block->p_buffer,
509                           p_block->p_buffer + p_block->i_buffer );
510
511             p_block->i_buffer = 0;
512             break;
513
514 #if MPEG2_RELEASE >= MPEG2_VERSION (0, 5, 0)
515
516         case STATE_SEQUENCE_MODIFIED:
517             GetAR( p_dec );
518             break;
519 #endif
520         case STATE_PICTURE_2ND:
521             p_sys->b_second_field = true;
522             break;
523
524
525         case STATE_INVALID_END:
526         case STATE_END:
527         case STATE_SLICE:
528             p_pic = NULL;
529             if( p_sys->p_info->display_fbuf &&
530                 p_sys->p_info->display_fbuf->id )
531             {
532                 p_pic = p_sys->p_info->display_fbuf->id;
533                 if( DpbDisplayPicture( p_dec, p_pic ) )
534                     p_pic = NULL;
535
536                 decoder_SynchroEnd( p_sys->p_synchro,
537                                     p_sys->p_info->display_picture->flags & PIC_MASK_CODING_TYPE,
538                                     p_sys->b_garbage_pic );
539
540                 if( p_pic )
541                 {
542                     p_pic->date = decoder_SynchroDate( p_sys->p_synchro );
543                     if( p_sys->b_garbage_pic )
544                         p_pic->date = 0; /* ??? */
545                     p_sys->b_garbage_pic = false;
546                 }
547             }
548
549             if( p_sys->p_info->discard_fbuf &&
550                 p_sys->p_info->discard_fbuf->id )
551             {
552                 DpbUnlinkPicture( p_dec, p_sys->p_info->discard_fbuf->id );
553             }
554
555             /* For still frames */
556             if( state == STATE_END && p_pic )
557                 p_pic->b_force = true;
558
559             if( p_pic )
560             {
561                 /* Avoid frames with identical timestamps.
562                  * Especially needed for still frames in DVD menus. */
563                 if( p_sys->i_last_frame_pts == p_pic->date )
564                     p_pic->date++;
565                 p_sys->i_last_frame_pts = p_pic->date;
566                 return p_pic;
567             }
568             break;
569
570         case STATE_INVALID:
571         {
572             msg_Err( p_dec, "invalid picture encountered" );
573             /* I don't think we have anything to do, but well without
574              * docs ... */
575             break;
576         }
577
578         default:
579             break;
580         }
581     }
582
583     /* Never reached */
584     return NULL;
585 }
586
587 /*****************************************************************************
588  * CloseDecoder: libmpeg2 decoder destruction
589  *****************************************************************************/
590 static void CloseDecoder( vlc_object_t *p_this )
591 {
592     decoder_t *p_dec = (decoder_t *)p_this;
593     decoder_sys_t *p_sys = p_dec->p_sys;
594
595     DpbClean( p_dec );
596
597     free( p_sys->p_gop_user_data );
598
599     if( p_sys->p_synchro ) decoder_SynchroRelease( p_sys->p_synchro );
600
601     if( p_sys->p_mpeg2dec ) mpeg2_close( p_sys->p_mpeg2dec );
602
603     free( p_sys );
604 }
605
606 /*****************************************************************************
607  * Reset: reset the decoder state
608  *****************************************************************************/
609 static void Reset( decoder_t *p_dec )
610 {
611     decoder_sys_t *p_sys = p_dec->p_sys;
612
613     cc_Flush( &p_sys->cc );
614     mpeg2_reset( p_sys->p_mpeg2dec, p_sys->p_info->sequence != NULL );
615     DpbClean( p_dec );
616 }
617
618 /*****************************************************************************
619  * GetNewPicture: Get a new picture from the vout and set the buf struct
620  *****************************************************************************/
621 static picture_t *GetNewPicture( decoder_t *p_dec )
622 {
623     decoder_sys_t *p_sys = p_dec->p_sys;
624     picture_t *p_pic;
625
626     p_dec->fmt_out.video.i_width = p_sys->p_info->sequence->width;
627     p_dec->fmt_out.video.i_visible_width =
628         p_sys->p_info->sequence->picture_width;
629     p_dec->fmt_out.video.i_height = p_sys->p_info->sequence->height;
630     p_dec->fmt_out.video.i_visible_height =
631         p_sys->p_info->sequence->picture_height;
632     p_dec->fmt_out.video.i_aspect = p_sys->i_aspect;
633     p_dec->fmt_out.video.i_sar_num = p_sys->i_sar_num;
634     p_dec->fmt_out.video.i_sar_den = p_sys->i_sar_den;
635
636     if( p_sys->p_info->sequence->frame_period > 0 )
637     {
638         p_dec->fmt_out.video.i_frame_rate =
639             (uint32_t)( (uint64_t)1001000000 * 27 /
640                         p_sys->p_info->sequence->frame_period );
641         p_dec->fmt_out.video.i_frame_rate_base = 1001;
642     }
643
644     p_dec->fmt_out.i_codec =
645         ( p_sys->p_info->sequence->chroma_height <
646           p_sys->p_info->sequence->height ) ?
647         VLC_CODEC_I420 : VLC_CODEC_I422;
648
649     /* Get a new picture */
650     p_pic = decoder_NewPicture( p_dec );
651
652     if( p_pic == NULL )
653         return NULL;
654
655     p_pic->b_progressive = p_sys->p_info->current_picture != NULL ?
656         p_sys->p_info->current_picture->flags & PIC_FLAG_PROGRESSIVE_FRAME : 1;
657     p_pic->b_top_field_first = p_sys->p_info->current_picture != NULL ?
658         p_sys->p_info->current_picture->flags & PIC_FLAG_TOP_FIELD_FIRST : 1;
659     p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?
660         p_sys->p_info->current_picture->nb_fields : 2;
661
662     return p_pic;
663 }
664
665 /*****************************************************************************
666  * GetCc: Retrieves the Closed Captions for the CC decoder.
667  *****************************************************************************/
668 static block_t *GetCc( decoder_t *p_dec, bool pb_present[4] )
669 {
670     decoder_sys_t   *p_sys = p_dec->p_sys;
671     block_t         *p_cc = NULL;
672     int i;
673
674     for( i = 0; i < 4; i++ )
675         pb_present[i] = p_sys->cc.pb_present[i];
676
677     if( p_sys->cc.i_data <= 0 )
678         return NULL;
679
680     p_cc = block_New( p_dec, p_sys->cc.i_data);
681     if( p_cc )
682     {
683         memcpy( p_cc->p_buffer, p_sys->cc.p_data, p_sys->cc.i_data );
684         p_cc->i_dts =
685         p_cc->i_pts = p_sys->cc.b_reorder ? p_sys->i_cc_pts : p_sys->i_cc_dts;
686         p_cc->i_flags = ( p_sys->cc.b_reorder  ? p_sys->i_cc_flags : BLOCK_FLAG_TYPE_P ) & ( BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B);
687     }
688     cc_Flush( &p_sys->cc );
689     return p_cc;
690 }
691
692 /*****************************************************************************
693  * GetAR: Get aspect ratio
694  *****************************************************************************/
695 static void GetAR( decoder_t *p_dec )
696 {
697     decoder_sys_t *p_sys = p_dec->p_sys;
698
699     /* Check whether the input gave a particular aspect ratio */
700     if( p_dec->fmt_in.video.i_aspect )
701     {
702         p_sys->i_aspect = p_dec->fmt_in.video.i_aspect;
703     }
704     else
705     {
706         /* Use the value provided in the MPEG sequence header */
707         if( p_sys->p_info->sequence->pixel_height > 0 )
708         {
709             p_sys->i_aspect =
710                 ((uint64_t)p_sys->p_info->sequence->picture_width) *
711                 p_sys->p_info->sequence->pixel_width *
712                 VOUT_ASPECT_FACTOR /
713                 p_sys->p_info->sequence->picture_height /
714                 p_sys->p_info->sequence->pixel_height;
715             p_sys->i_sar_num = p_sys->p_info->sequence->pixel_width;
716             p_sys->i_sar_den = p_sys->p_info->sequence->pixel_height;
717         }
718         else
719         {
720             /* Invalid aspect, assume 4:3.
721              * This shouldn't happen and if it does it is a bug
722              * in libmpeg2 (likely triggered by an invalid stream) */
723             p_sys->i_aspect = VOUT_ASPECT_FACTOR * 4 / 3;
724             p_sys->i_sar_num = p_sys->p_info->sequence->picture_height * 4;
725             p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 3;
726         }
727     }
728
729     msg_Dbg( p_dec, "%dx%d (display %d,%d), aspect %d, sar %i:%i, %u.%03u fps",
730              p_sys->p_info->sequence->picture_width,
731              p_sys->p_info->sequence->picture_height,
732              p_sys->p_info->sequence->display_width,
733              p_sys->p_info->sequence->display_height,
734              p_sys->i_aspect, p_sys->i_sar_num, p_sys->i_sar_den,
735              (uint32_t)((uint64_t)1001000000 * 27 /
736                  p_sys->p_info->sequence->frame_period / 1001),
737              (uint32_t)((uint64_t)1001000000 * 27 /
738                  p_sys->p_info->sequence->frame_period % 1001) );
739 }
740
741 /*****************************************************************************
742  * PutPicture: Put a picture_t in mpeg2 context
743  *****************************************************************************/
744 static void PutPicture( decoder_t *p_dec, picture_t *p_picture )
745 {
746     decoder_sys_t *p_sys = p_dec->p_sys;
747
748     /* */
749     uint8_t *pp_buf[3];
750     for( int j = 0; j < 3; j++ )
751         pp_buf[j] = p_picture ? p_picture->p[j].p_pixels : NULL;
752     mpeg2_set_buf( p_sys->p_mpeg2dec, pp_buf, p_picture );
753
754     /* Completly broken API, why the hell does it suppose
755      * the stride of the chroma planes ! */
756     if( p_picture )
757         mpeg2_stride( p_sys->p_mpeg2dec, p_picture->p[Y_PLANE].i_pitch );
758 }
759
760
761 /**
762  * Initialize a virtual Decoded Picture Buffer to workaround
763  * libmpeg2 deficient API
764  */
765 static void DpbInit( decoder_t *p_dec )
766 {
767     decoder_sys_t *p_sys = p_dec->p_sys;
768
769     for( int i = 0; i < DPB_COUNT; i++ )
770         p_sys->p_dpb[i].p_picture = NULL;
771 }
772 /**
773  * Empty and reset the current DPB
774  */
775 static void DpbClean( decoder_t *p_dec )
776 {
777     decoder_sys_t *p_sys = p_dec->p_sys;
778
779     for( int i = 0; i < DPB_COUNT; i++ )
780     {
781         picture_dpb_t *p = &p_sys->p_dpb[i];
782         if( !p->p_picture )
783             continue;
784         if( p->b_linked )
785             decoder_UnlinkPicture( p_dec, p->p_picture );
786         if( !p->b_displayed )
787             decoder_DeletePicture( p_dec, p->p_picture );
788
789         p->p_picture = NULL;
790     }
791 }
792 /**
793  * Retreive a picture and reserve a place in the DPB
794  */
795 static picture_t *DpbNewPicture( decoder_t *p_dec )
796 {
797     decoder_sys_t *p_sys = p_dec->p_sys;
798
799     picture_dpb_t *p;
800     int i;
801
802     for( i = 0; i < DPB_COUNT; i++ )
803     {
804         p = &p_sys->p_dpb[i];
805         if( !p->p_picture )
806             break;
807     }
808     if( i >= DPB_COUNT )
809     {
810         msg_Err( p_dec, "Leaking picture" );
811         return NULL;
812     }
813
814     p->p_picture = GetNewPicture( p_dec );
815     if( p->p_picture )
816     {
817         decoder_LinkPicture( p_dec, p->p_picture );
818         p->b_linked = true;
819         p->b_displayed = false;
820
821         p->p_picture->date = 0;
822     }
823     return p->p_picture;
824 }
825 static picture_dpb_t *DpbFindPicture( decoder_t *p_dec, picture_t *p_picture )
826 {
827     decoder_sys_t *p_sys = p_dec->p_sys;
828
829     for( int i = 0; i < DPB_COUNT; i++ )
830     {
831         picture_dpb_t *p = &p_sys->p_dpb[i];
832         if( p->p_picture == p_picture )
833             return p;
834     }
835     return NULL;
836 }
837 /**
838  * Unlink the provided picture and ensure that the decoder
839  * does not own it anymore.
840  */
841 static void DpbUnlinkPicture( decoder_t *p_dec, picture_t *p_picture )
842 {
843     picture_dpb_t *p = DpbFindPicture( p_dec, p_picture );
844
845     /* XXX it is needed to workaround libmpeg2 bugs */
846     if( !p || !p->b_linked )
847     {
848         msg_Err( p_dec, "DpbUnlinkPicture called on an invalid picture" );
849         return;
850     }
851
852     assert( p && p->b_linked );
853
854     decoder_UnlinkPicture( p_dec, p->p_picture );
855     p->b_linked = false;
856
857     if( !p->b_displayed )
858         decoder_DeletePicture( p_dec, p->p_picture );
859     p->p_picture = NULL;
860 }
861 /**
862  * Mark the provided picture as displayed.
863  */
864 static int DpbDisplayPicture( decoder_t *p_dec, picture_t *p_picture )
865 {
866     picture_dpb_t *p = DpbFindPicture( p_dec, p_picture );
867
868     /* XXX it is needed to workaround libmpeg2 bugs */
869     if( !p || p->b_displayed || !p->b_linked )
870     {
871         msg_Err( p_dec, "DpbDisplayPicture called on an invalid picture" );
872         return VLC_EGENERIC;
873     }
874
875     assert( p && !p->b_displayed && p->b_linked );
876
877     p->b_displayed = true;
878     return VLC_SUCCESS;
879 }
880
881