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