1 /*****************************************************************************
2 * xxmc.c : HW MPEG decoder thread
3 *****************************************************************************
4 * Copyright (C) 2000-2001 VideoLAN
7 * Authors: Samuel Hocevar <sam@zoy.org>
8 * Laurent Aimar <fenrir@via.ecp.fr>
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.
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.
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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
34 #include <vlc_codec.h>
35 #include <vlc_codec_synchro.h>
43 #include "attributes.h"
44 #include "mpeg2_internal.h"
47 /* Aspect ratio (ISO/IEC 13818-2 section 6.3.3, table 6-3) */
48 #define AR_SQUARE_PICTURE 1 /* square pixels */
49 #define AR_3_4_PICTURE 2 /* 3:4 picture (TV) */
50 #define AR_16_9_PICTURE 3 /* 16:9 picture (wide screen) */
51 #define AR_221_1_PICTURE 4 /* 2.21:1 picture (movie) */
53 /*****************************************************************************
54 * decoder_sys_t : libmpeg2 decoder descriptor
55 *****************************************************************************/
61 mpeg2dec_t
*p_mpeg2dec
;
62 const mpeg2_info_t
*p_info
;
69 mtime_t i_previous_pts
;
70 mtime_t i_current_pts
;
71 mtime_t i_previous_dts
;
72 mtime_t i_current_dts
;
74 picture_t
* p_picture_to_destroy
;
76 bool b_after_sequence_header
; /* is it the next frame after
77 * the sequence header ? */
78 bool b_slice_i
; /* intra-slice refresh stream */
83 decoder_synchro_t
*p_synchro
;
85 mtime_t i_last_frame_pts
;
88 /*****************************************************************************
90 *****************************************************************************/
92 static int OpenDecoder( vlc_object_t
* );
93 static void CloseDecoder( vlc_object_t
* );
95 static picture_t
*DecodeBlock( decoder_t
*, block_t
** );
97 static picture_t
*GetNewPicture( decoder_t
*, uint8_t ** );
99 /*****************************************************************************
101 *****************************************************************************/
103 set_description( _("MPEG I/II hw video decoder (using libmpeg2)") );
104 set_capability( "decoder", 160 );
105 set_callbacks( OpenDecoder
, CloseDecoder
);
106 add_shortcut( "xxmc" );
109 /*****************************************************************************
110 * OpenDecoder: probe the decoder and return score
111 *****************************************************************************/
112 static int OpenDecoder( vlc_object_t
*p_this
)
115 decoder_t
*p_dec
= (decoder_t
*)p_this
;
116 decoder_sys_t
*p_sys
= NULL
;
117 uint32_t i_accel
= 0;
123 if( p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('m','p','g','v') &&
124 p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('m','p','g','1') &&
125 /* Pinnacle hardware-mpeg1 */
126 p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('P','I','M','1') &&
127 /* VIA hardware-mpeg2 */
128 p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('X','x','M','C') &&
130 p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('V','C','R','2') &&
131 p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('m','p','g','2') )
136 msg_Dbg(p_dec
, "OpenDecoder Entering");
138 /* Allocate the memory needed to store the decoder's structure */
139 p_dec
->p_sys
= p_sys
= (decoder_sys_t
*)malloc(sizeof(decoder_sys_t
));
143 /* Initialize the thread properties */
144 memset( p_sys
, 0, sizeof(decoder_sys_t
) );
145 p_sys
->p_mpeg2dec
= NULL
;
146 p_sys
->p_synchro
= NULL
;
147 p_sys
->p_info
= NULL
;
148 p_sys
->i_pts
= mdate() + DEFAULT_PTS_DELAY
;
149 p_sys
->i_current_pts
= 0;
150 p_sys
->i_previous_pts
= 0;
151 p_sys
->i_current_dts
= 0;
152 p_sys
->i_previous_dts
= 0;
153 p_sys
->p_picture_to_destroy
= NULL
;
154 p_sys
->b_garbage_pic
= 0;
155 p_sys
->b_slice_i
= 0;
158 #if defined( __i386__ )
159 if( vlc_CPU() & CPU_CAPABILITY_MMX
)
161 i_accel
|= MPEG2_ACCEL_X86_MMX
;
164 if( vlc_CPU() & CPU_CAPABILITY_3DNOW
)
166 i_accel
|= MPEG2_ACCEL_X86_3DNOW
;
169 if( vlc_CPU() & CPU_CAPABILITY_MMXEXT
)
171 i_accel
|= MPEG2_ACCEL_X86_MMXEXT
;
174 #elif defined( __powerpc__ ) || defined( SYS_DARWIN )
175 if( vlc_CPU() & CPU_CAPABILITY_ALTIVEC
)
177 i_accel
|= MPEG2_ACCEL_PPC_ALTIVEC
;
181 /* If we do not know this CPU, trust libmpeg2's feature detection */
182 i_accel
= MPEG2_ACCEL_DETECT
;
186 /* Set CPU acceleration features */
187 mpeg2_accel( i_accel
);
189 /* Initialize decoder */
190 p_sys
->p_mpeg2dec
= mpeg2_init();
191 if( p_sys
->p_mpeg2dec
== NULL
)
193 msg_Err( p_dec
, "mpeg2_init() failed" );
198 p_sys
->p_info
= mpeg2_info( p_sys
->p_mpeg2dec
);
200 p_dec
->pf_decode_video
= DecodeBlock
;
202 f_wd_dec
= fopen("/vlc/dec_pid", "w");
203 if (f_wd_dec
!= NULL
)
205 fprintf(f_wd_dec
, "%d\n", getpid());
210 msg_Dbg(p_dec
, "OpenDecoder Leaving");
214 static void WriteDecodeFile(int value
)
218 f_wd_ok
= fopen("/vlc/dec_ok", "w");
221 fprintf(f_wd_ok
, "%d", value
);
227 /*****************************************************************************
228 * RunDecoder: the libmpeg2 decoder
229 *****************************************************************************/
230 static picture_t
*DecodeBlock( decoder_t
*p_dec
, block_t
**pp_block
)
232 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
238 if( !pp_block
|| !*pp_block
)
244 state
= mpeg2_parse( p_sys
->p_mpeg2dec
);
248 if( !p_block
->i_buffer
)
250 block_Release( p_block
);
253 if( (p_block
->i_flags
&BLOCK_FLAG_DISCONTINUITY
) &&
255 p_sys
->p_info
->sequence
&&
256 p_sys
->p_info
->sequence
->width
!= (unsigned int)-1 )
258 decoder_SynchroReset( p_sys
->p_synchro
);
259 if( p_sys
->p_info
->current_fbuf
!= NULL
260 && p_sys
->p_info
->current_fbuf
->id
!= NULL
)
262 p_sys
->b_garbage_pic
= 1;
263 p_pic
= p_sys
->p_info
->current_fbuf
->id
;
268 buf
[0] = buf
[1] = buf
[2] = NULL
;
269 if( (p_pic
= GetNewPicture( p_dec
, buf
)) == NULL
)
271 mpeg2_set_buf( p_sys
->p_mpeg2dec
, buf
, p_pic
);
273 p_sys
->p_picture_to_destroy
= p_pic
;
275 if ( p_sys
->b_slice_i
)
277 decoder_SynchroNewPicture( p_sys
->p_synchro
,
278 I_CODING_TYPE
, 2, 0, 0, p_sys
->i_current_rate
,
279 p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
);
280 decoder_SynchroDecode( p_sys
->p_synchro
);
281 decoder_SynchroEnd( p_sys
->p_synchro
, I_CODING_TYPE
, 0 );
288 mpeg2_pts( p_sys
->p_mpeg2dec
, (uint32_t)p_block
->i_pts
);
290 #else /* New interface */
291 if( p_block
->i_pts
|| p_block
->i_dts
)
293 mpeg2_tag_picture( p_sys
->p_mpeg2dec
,
294 (uint32_t)p_block
->i_pts
,
295 (uint32_t)p_block
->i_dts
);
297 p_sys
->i_previous_pts
= p_sys
->i_current_pts
;
298 p_sys
->i_current_pts
= p_block
->i_pts
;
299 p_sys
->i_previous_dts
= p_sys
->i_current_dts
;
300 p_sys
->i_current_dts
= p_block
->i_dts
;
302 p_sys
->i_current_rate
= p_block
->i_rate
;
304 mpeg2_buffer( p_sys
->p_mpeg2dec
, p_block
->p_buffer
,
305 p_block
->p_buffer
+ p_block
->i_buffer
);
306 p_block
->i_buffer
= 0;
311 /* Initialize video output */
313 buf
[0] = buf
[1] = buf
[2] = NULL
;
315 /* Check whether the input gave a particular aspect ratio */
316 if( p_dec
->fmt_in
.video
.i_aspect
)
318 p_sys
->i_aspect
= p_dec
->fmt_in
.video
.i_aspect
;
319 if( p_sys
->i_aspect
<= AR_221_1_PICTURE
)
320 switch( p_sys
->i_aspect
)
323 p_sys
->i_aspect
= VOUT_ASPECT_FACTOR
* 4 / 3;
325 case AR_16_9_PICTURE
:
326 p_sys
->i_aspect
= VOUT_ASPECT_FACTOR
* 16 / 9;
328 case AR_221_1_PICTURE
:
329 p_sys
->i_aspect
= VOUT_ASPECT_FACTOR
* 221 / 100;
331 case AR_SQUARE_PICTURE
:
332 p_sys
->i_aspect
= VOUT_ASPECT_FACTOR
*
333 p_sys
->p_info
->sequence
->width
/
334 p_sys
->p_info
->sequence
->height
;
340 /* Use the value provided in the MPEG sequence header */
341 if( p_sys
->p_info
->sequence
->pixel_height
> 0 )
344 ((uint64_t)p_sys
->p_info
->sequence
->display_width
) *
345 p_sys
->p_info
->sequence
->pixel_width
*
347 p_sys
->p_info
->sequence
->display_height
/
348 p_sys
->p_info
->sequence
->pixel_height
;
352 /* Invalid aspect, assume 4:3.
353 * This shouldn't happen and if it does it is a bug
354 * in libmpeg2 (likely triggered by an invalid stream) */
355 p_sys
->i_aspect
= VOUT_ASPECT_FACTOR
* 4 / 3;
359 msg_Dbg( p_dec
, "%dx%d, aspect %d, %u.%03u fps",
360 p_sys
->p_info
->sequence
->width
,
361 p_sys
->p_info
->sequence
->height
, p_sys
->i_aspect
,
362 (uint32_t)((uint64_t)1001000000 * 27 /
363 p_sys
->p_info
->sequence
->frame_period
/ 1001),
364 (uint32_t)((uint64_t)1001000000 * 27 /
365 p_sys
->p_info
->sequence
->frame_period
% 1001) );
367 mpeg2_custom_fbuf( p_sys
->p_mpeg2dec
, 1 );
369 /* Set the first 2 reference frames */
370 mpeg2_set_buf( p_sys
->p_mpeg2dec
, buf
, NULL
);
372 if( (p_pic
= GetNewPicture( p_dec
, buf
)) == NULL
)
374 block_Release( p_block
);
377 mpeg2_set_buf( p_sys
->p_mpeg2dec
, buf
, p_pic
);
380 p_dec
->pf_picture_link( p_dec
, p_pic
);
382 if( p_sys
->p_synchro
)
384 decoder_SynchroRelease( p_sys
->p_synchro
);
386 p_sys
->p_synchro
= decoder_SynchroInit( p_dec
,
387 (uint32_t)((uint64_t)1001000000 * 27 /
388 p_sys
->p_info
->sequence
->frame_period
) );
389 p_sys
->b_after_sequence_header
= 1;
393 case STATE_PICTURE_2ND
:
394 decoder_SynchroNewPicture( p_sys
->p_synchro
,
395 p_sys
->p_info
->current_picture
->flags
& PIC_MASK_CODING_TYPE
,
396 p_sys
->p_info
->current_picture
->nb_fields
,
397 0, 0, p_sys
->i_current_rate
,
398 p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
);
402 decoder_SynchroTrash( p_sys
->p_synchro
);
406 decoder_SynchroDecode( p_sys
->p_synchro
);
414 buf
[0] = buf
[1] = buf
[2] = NULL
;
416 if ( p_sys
->b_after_sequence_header
&&
417 ((p_sys
->p_info
->current_picture
->flags
&
418 PIC_MASK_CODING_TYPE
) == PIC_FLAG_CODING_TYPE_P
) )
420 /* Intra-slice refresh. Simulate a blank I picture. */
421 msg_Dbg( p_dec
, "intra-slice refresh stream" );
422 decoder_SynchroNewPicture( p_sys
->p_synchro
,
423 I_CODING_TYPE
, 2, 0, 0, p_sys
->i_current_rate
,
424 p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
);
425 decoder_SynchroDecode( p_sys
->p_synchro
);
426 decoder_SynchroEnd( p_sys
->p_synchro
, I_CODING_TYPE
, 0 );
427 p_sys
->b_slice_i
= 1;
429 p_sys
->b_after_sequence_header
= 0;
432 i_pts
= p_sys
->p_info
->current_picture
->flags
& PIC_FLAG_PTS
?
433 ( ( p_sys
->p_info
->current_picture
->pts
==
434 (uint32_t)p_sys
->i_current_pts
) ?
435 p_sys
->i_current_pts
: p_sys
->i_previous_pts
) : 0;
436 #else /* New interface */
437 i_pts
= p_sys
->p_info
->current_picture
->flags
& PIC_FLAG_TAGS
?
438 ( ( p_sys
->p_info
->current_picture
->tag
==
439 (uint32_t)p_sys
->i_current_pts
) ?
440 p_sys
->i_current_pts
: p_sys
->i_previous_pts
) : 0;
442 /* Hack to handle demuxers which only have DTS timestamps */
443 if( !i_pts
&& !p_block
->i_pts
&& p_block
->i_dts
> 0 )
445 if( p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
||
446 (p_sys
->p_info
->current_picture
->flags
&
447 PIC_MASK_CODING_TYPE
) == PIC_FLAG_CODING_TYPE_B
)
449 i_pts
= p_block
->i_dts
;
452 p_block
->i_pts
= p_block
->i_dts
= 0;
455 decoder_SynchroNewPicture( p_sys
->p_synchro
,
456 p_sys
->p_info
->current_picture
->flags
& PIC_MASK_CODING_TYPE
,
457 p_sys
->p_info
->current_picture
->nb_fields
, i_pts
,
458 0, p_sys
->i_current_rate
,
459 p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
);
461 if ( !(p_sys
->b_slice_i
462 && ((p_sys
->p_info
->current_picture
->flags
463 & PIC_MASK_CODING_TYPE
) == P_CODING_TYPE
))
464 && !decoder_SynchroChoose( p_sys
->p_synchro
,
465 p_sys
->p_info
->current_picture
->flags
466 & PIC_MASK_CODING_TYPE
,
467 /*FindVout(p_dec)->render_time*/ 0 /*FIXME*/,
468 p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
) )
470 mpeg2_skip( p_sys
->p_mpeg2dec
, 1 );
472 decoder_SynchroTrash( p_sys
->p_synchro
);
473 mpeg2_set_buf( p_sys
->p_mpeg2dec
, buf
, NULL
);
477 mpeg2_skip( p_sys
->p_mpeg2dec
, 0 );
479 decoder_SynchroDecode( p_sys
->p_synchro
);
481 if( (p_pic
= GetNewPicture( p_dec
, buf
)) == NULL
)
483 block_Release( p_block
);
487 p_sys
->p_mpeg2dec
->ptr_forward_ref_picture
= p_sys
->p_mpeg2dec
->fbuf
[2]->id
;
488 p_sys
->p_mpeg2dec
->ptr_backward_ref_picture
= p_sys
->p_mpeg2dec
->fbuf
[1]->id
;
490 if ((p_sys
->p_info
->current_picture
->flags
& PIC_MASK_CODING_TYPE
) != B_CODING_TYPE
)
492 //if (p_sys->p_mpeg2dec->ptr_forward_ref_picture &&
493 // p_sys->p_mpeg2dec->ptr_forward_ref_picture != picture->backward_reference_frame)
494 // p_pic->forward_reference_frame->free (p_pic->forward_reference_frame);
496 p_sys
->p_mpeg2dec
->ptr_forward_ref_picture
=
497 p_sys
->p_mpeg2dec
->ptr_backward_ref_picture
;
498 p_sys
->p_mpeg2dec
->ptr_backward_ref_picture
= (void *)p_pic
;
500 mpeg2_set_buf( p_sys
->p_mpeg2dec
, buf
, p_pic
);
508 if( p_sys
->p_info
->display_fbuf
509 && p_sys
->p_info
->display_fbuf
->id
)
511 p_pic
= (picture_t
*)p_sys
->p_info
->display_fbuf
->id
;
513 decoder_SynchroEnd( p_sys
->p_synchro
,
514 p_sys
->p_info
->display_picture
->flags
515 & PIC_MASK_CODING_TYPE
,
516 p_sys
->b_garbage_pic
);
517 p_sys
->b_garbage_pic
= 0;
519 if ( p_sys
->p_picture_to_destroy
!= p_pic
)
521 p_pic
->date
= decoder_SynchroDate( p_sys
->p_synchro
);
525 p_sys
->p_picture_to_destroy
= NULL
;
530 if( p_sys
->p_info
->discard_fbuf
&&
531 p_sys
->p_info
->discard_fbuf
->id
)
533 p_dec
->pf_picture_unlink( p_dec
, p_sys
->p_info
->discard_fbuf
->id
);
535 /* For still frames */
536 //if( state == STATE_END && p_pic ) p_pic->b_force = true;
541 /* Avoid frames with identical timestamps.
542 * Especially needed for still frames in DVD menus. */
543 if( p_sys
->i_last_frame_pts
== p_pic
->date
) p_pic
->date
++;
544 p_sys
->i_last_frame_pts
= p_pic
->date
;
553 buf
[0] = buf
[1] = buf
[2] = NULL
;
555 msg_Warn( p_dec
, "invalid picture encountered" );
556 if ( ( p_sys
->p_info
->current_picture
== NULL
) ||
557 ( ( p_sys
->p_info
->current_picture
->flags
&
558 PIC_MASK_CODING_TYPE
) != B_CODING_TYPE
) )
560 if( p_sys
->p_synchro
) decoder_SynchroReset( p_sys
->p_synchro
);
562 mpeg2_skip( p_sys
->p_mpeg2dec
, 1 );
565 if( p_sys
->p_info
->current_fbuf
&&
566 p_sys
->p_info
->current_fbuf
->id
)
568 p_sys
->b_garbage_pic
= 1;
569 p_pic
= p_sys
->p_info
->current_fbuf
->id
;
571 else if( !p_sys
->p_info
->sequence
)
577 if( (p_pic
= GetNewPicture( p_dec
, buf
)) == NULL
)
579 mpeg2_set_buf( p_sys
->p_mpeg2dec
, buf
, p_pic
);
581 p_sys
->p_picture_to_destroy
= p_pic
;
583 memset( p_pic
->p
[0].p_pixels
, 0,
584 p_sys
->p_info
->sequence
->width
585 * p_sys
->p_info
->sequence
->height
);
586 memset( p_pic
->p
[1].p_pixels
, 0x80,
587 p_sys
->p_info
->sequence
->width
588 * p_sys
->p_info
->sequence
->height
/ 4 );
589 memset( p_pic
->p
[2].p_pixels
, 0x80,
590 p_sys
->p_info
->sequence
->width
591 * p_sys
->p_info
->sequence
->height
/ 4 );
593 if( p_sys
->b_slice_i
)
595 decoder_SynchroNewPicture( p_sys
->p_synchro
,
596 I_CODING_TYPE
, 2, 0, 0, p_sys
->i_current_rate
,
597 p_sys
->p_info
->sequence
->flags
& SEQ_FLAG_LOW_DELAY
);
598 decoder_SynchroDecode( p_sys
->p_synchro
);
599 decoder_SynchroEnd( p_sys
->p_synchro
, I_CODING_TYPE
, 0 );
611 /*****************************************************************************
612 * CloseDecoder: libmpeg2 decoder destruction
613 *****************************************************************************/
614 static void CloseDecoder( vlc_object_t
*p_this
)
616 decoder_t
*p_dec
= (decoder_t
*)p_this
;
617 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
620 if( p_sys
->p_synchro
) decoder_SynchroRelease( p_sys
->p_synchro
);
621 if( p_sys
->p_mpeg2dec
) mpeg2_close( p_sys
->p_mpeg2dec
);
623 f_wd_dec
= fopen("/vlc/dec_pid", "w");
624 if (f_wd_dec
!= NULL
)
626 fprintf(f_wd_dec
, "0\n");
633 static double get_aspect_ratio( decoder_t
*p_dec
)
635 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
637 double mpeg1_pel_ratio
[16] = {1.0 /* forbidden */,
638 1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, 0.8935, 0.9157,
639 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, 1.2015, 1.0 /*reserved*/ };
641 if( !p_sys
->p_mpeg2dec
->decoder
.mpeg1
)
643 /* these hardcoded values are defined on mpeg2 standard for
644 * aspect ratio. other values are reserved or forbidden. */
645 switch( p_sys
->p_mpeg2dec
->decoder
.aspect_ratio_information
)
658 ratio
= (double)p_sys
->p_mpeg2dec
->decoder
.width
/(double)p_sys
->p_mpeg2dec
->decoder
.height
;
664 /* mpeg1 constants refer to pixel aspect ratio */
665 ratio
= (double)p_sys
->p_mpeg2dec
->decoder
.width
/(double)p_sys
->p_mpeg2dec
->decoder
.height
;
666 ratio
/= mpeg1_pel_ratio
[p_sys
->p_mpeg2dec
->decoder
.aspect_ratio_information
];
670 /*****************************************************************************
671 * GetNewPicture: Get a new picture from the vout and set the buf struct
672 *****************************************************************************/
673 static picture_t
*GetNewPicture( decoder_t
*p_dec
, uint8_t **pp_buf
)
675 //msg_Dbg(p_dec, "GetNewPicture Entering");
676 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
679 p_dec
->fmt_out
.video
.i_width
= p_sys
->p_info
->sequence
->width
;
680 p_dec
->fmt_out
.video
.i_height
= p_sys
->p_info
->sequence
->height
;
681 p_dec
->fmt_out
.video
.i_aspect
= p_sys
->i_aspect
;
683 if( p_sys
->p_info
->sequence
->frame_period
> 0 )
685 p_dec
->fmt_out
.video
.i_frame_rate
=
686 (uint32_t)( (uint64_t)1001000000 * 27 /
687 p_sys
->p_info
->sequence
->frame_period
);
688 p_dec
->fmt_out
.video
.i_frame_rate_base
= 1001;
691 p_dec
->fmt_out
.i_codec
=
692 ( p_sys
->p_info
->sequence
->chroma_height
<
693 p_sys
->p_info
->sequence
->height
) ?
694 VLC_FOURCC('I','4','2','0') : VLC_FOURCC('I','4','2','2');
697 p_sys
->f_wd_nb
= fopen("/vlc/dec_nb", "w");
698 if (p_sys
->f_wd_nb
!= NULL
)
700 // fprintf(p_sys->f_wd_nb, "%d\n", mdate());
701 fprintf(p_sys
->f_wd_nb
, "%s\n", mdate());
702 fflush(p_sys
->f_wd_nb
);
705 p_pic
= p_dec
->pf_vout_buffer_new( p_dec
);
707 if( p_pic
== NULL
) return NULL
;
709 p_pic
->b_progressive
= p_sys
->p_info
->current_picture
!= NULL
?
710 p_sys
->p_info
->current_picture
->flags
& PIC_FLAG_PROGRESSIVE_FRAME
: 1;
711 p_pic
->b_top_field_first
= p_sys
->p_info
->current_picture
!= NULL
?
712 p_sys
->p_info
->current_picture
->flags
& PIC_FLAG_TOP_FIELD_FIRST
: 1;
713 p_pic
->i_nb_fields
= p_sys
->p_info
->current_picture
!= NULL
?
714 p_sys
->p_info
->current_picture
->nb_fields
: 2;
715 p_pic
->format
.i_frame_rate
= p_dec
->fmt_out
.video
.i_frame_rate
;
716 p_pic
->format
.i_frame_rate_base
= p_dec
->fmt_out
.video
.i_frame_rate_base
;
718 p_dec
->pf_picture_link( p_dec
, p_pic
);
720 pp_buf
[0] = p_pic
->p
[0].p_pixels
;
721 pp_buf
[1] = p_pic
->p
[1].p_pixels
;
722 pp_buf
[2] = p_pic
->p
[2].p_pixels
;
724 /* let driver ensure this image has the right format */
726 this->driver
->update_frame_format( p_pic
->p_sys
->p_vout
, p_pic
,
727 p_dec
->fmt_out
.video
.i_width
,
728 p_dec
->fmt_out
.video
.i_height
,
729 p_dec
->fmt_out
.video
.i_aspect
,
732 mpeg2_xxmc_choose_coding( p_dec
, &p_sys
->p_mpeg2dec
->decoder
, p_pic
,
733 get_aspect_ratio(p_dec
), 0 );