1 /*****************************************************************************
2 * video.c: video decoder using the ffmpeg library
3 *****************************************************************************
4 * Copyright (C) 1999-2001 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@videolan.org>
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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
32 #include <vlc_common.h>
33 #include <vlc_codec.h>
34 #include <vlc_avcodec.h>
39 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
40 # include <libavcodec/avcodec.h>
41 # ifdef HAVE_AVCODEC_VAAPI
42 # include <libavcodec/vaapi.h>
44 # ifdef HAVE_AVCODEC_DXVA2
45 # include <libavcodec/dxva2.h>
47 #elif defined(HAVE_FFMPEG_AVCODEC_H)
48 # include <ffmpeg/avcodec.h>
55 #if defined(HAVE_AVCODEC_VAAPI) || defined(HAVE_AVCODEC_DXVA2)
56 # define HAVE_AVCODEC_VA
59 /*****************************************************************************
60 * decoder_sys_t : decoder descriptor
61 *****************************************************************************/
64 AVCODEC_COMMON_MEMBERS
66 /* Video decoder specific part */
71 /* for frame skipping algo */
73 enum AVDiscard i_skip_frame
;
74 enum AVDiscard i_skip_idct
;
76 /* how many decoded frames are late */
78 mtime_t i_late_frames_start
;
80 /* for direct rendering */
81 bool b_direct_rendering
;
82 int i_direct_rendering_used
;
86 /* Hack to force display of still pictures */
90 AVPaletteControl palette
;
101 #ifdef HAVE_AVCODEC_MT
102 # define wait_mt(s) vlc_sem_wait( &s->sem_mt )
103 # define post_mt(s) vlc_sem_post( &s->sem_mt )
109 /* FIXME (dummy palette for now) */
110 static const AVPaletteControl palette_control
;
112 /*****************************************************************************
114 *****************************************************************************/
115 static void ffmpeg_InitCodec ( decoder_t
* );
116 static void ffmpeg_CopyPicture ( decoder_t
*, picture_t
*, AVFrame
* );
117 static int ffmpeg_GetFrameBuf ( struct AVCodecContext
*, AVFrame
* );
118 static int ffmpeg_ReGetFrameBuf( struct AVCodecContext
*, AVFrame
* );
119 static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext
*, AVFrame
* );
121 #ifdef HAVE_AVCODEC_VA
122 static enum PixelFormat
ffmpeg_GetFormat( AVCodecContext
*,
123 const enum PixelFormat
* );
126 static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc
)
128 uint8_t *p
= (uint8_t*)&fcc
;
129 return p
[0] | (p
[1] << 8) | (p
[2] << 16) | (p
[3] << 24);
132 /*****************************************************************************
134 *****************************************************************************/
136 /* Returns a new picture buffer */
137 static inline picture_t
*ffmpeg_NewPictBuf( decoder_t
*p_dec
,
138 AVCodecContext
*p_context
)
140 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
142 p_dec
->fmt_out
.video
.i_width
= p_context
->width
;
143 p_dec
->fmt_out
.video
.i_height
= p_context
->height
;
145 if( !p_context
->width
|| !p_context
->height
)
147 return NULL
; /* invalid display size */
150 if( !p_sys
->p_va
&& GetVlcChroma( &p_dec
->fmt_out
.video
, p_context
->pix_fmt
) )
152 /* we are doomed, but not really, because most codecs set their pix_fmt
154 * FIXME does it make sense here ? */
155 p_dec
->fmt_out
.video
.i_chroma
= VLC_CODEC_I420
;
157 p_dec
->fmt_out
.i_codec
= p_dec
->fmt_out
.video
.i_chroma
;
159 /* If an aspect-ratio was specified in the input format then force it */
160 if( p_dec
->fmt_in
.video
.i_sar_num
> 0 && p_dec
->fmt_in
.video
.i_sar_den
> 0 )
162 p_dec
->fmt_out
.video
.i_sar_num
= p_dec
->fmt_in
.video
.i_sar_num
;
163 p_dec
->fmt_out
.video
.i_sar_den
= p_dec
->fmt_in
.video
.i_sar_den
;
167 p_dec
->fmt_out
.video
.i_sar_num
= p_context
->sample_aspect_ratio
.num
;
168 p_dec
->fmt_out
.video
.i_sar_den
= p_context
->sample_aspect_ratio
.den
;
170 if( !p_dec
->fmt_out
.video
.i_sar_num
|| !p_dec
->fmt_out
.video
.i_sar_den
)
172 p_dec
->fmt_out
.video
.i_sar_num
= 1;
173 p_dec
->fmt_out
.video
.i_sar_den
= 1;
177 if( p_dec
->fmt_in
.video
.i_frame_rate
> 0 &&
178 p_dec
->fmt_in
.video
.i_frame_rate_base
> 0 )
180 p_dec
->fmt_out
.video
.i_frame_rate
=
181 p_dec
->fmt_in
.video
.i_frame_rate
;
182 p_dec
->fmt_out
.video
.i_frame_rate_base
=
183 p_dec
->fmt_in
.video
.i_frame_rate_base
;
185 else if( p_context
->time_base
.num
> 0 && p_context
->time_base
.den
> 0 )
187 p_dec
->fmt_out
.video
.i_frame_rate
= p_context
->time_base
.den
;
188 p_dec
->fmt_out
.video
.i_frame_rate_base
= p_context
->time_base
.num
;
191 return decoder_NewPicture( p_dec
);
194 /*****************************************************************************
195 * InitVideo: initialize the video decoder
196 *****************************************************************************
197 * the ffmpeg codec will be opened, some memory allocated. The vout is not yet
198 * opened (done after the first decoded frame).
199 *****************************************************************************/
200 int InitVideoDec( decoder_t
*p_dec
, AVCodecContext
*p_context
,
201 AVCodec
*p_codec
, int i_codec_id
, const char *psz_namecodec
)
203 decoder_sys_t
*p_sys
;
206 /* Allocate the memory needed to store the decoder's structure */
207 if( ( p_dec
->p_sys
= p_sys
= calloc( 1, sizeof(decoder_sys_t
) ) ) == NULL
)
210 p_codec
->type
= AVMEDIA_TYPE_VIDEO
;
211 p_context
->codec_type
= AVMEDIA_TYPE_VIDEO
;
212 p_context
->codec_id
= i_codec_id
;
213 p_sys
->p_context
= p_context
;
214 p_sys
->p_codec
= p_codec
;
215 p_sys
->i_codec_id
= i_codec_id
;
216 p_sys
->psz_namecodec
= psz_namecodec
;
217 p_sys
->p_ff_pic
= avcodec_alloc_frame();
218 p_sys
->b_delayed_open
= true;
220 vlc_sem_init( &p_sys
->sem_mt
, 0 );
222 /* ***** Fill p_context with init values ***** */
223 p_sys
->p_context
->codec_tag
= ffmpeg_CodecTag( p_dec
->fmt_in
.i_original_fourcc
?: p_dec
->fmt_in
.i_codec
);
225 /* ***** Get configuration of ffmpeg plugin ***** */
226 p_sys
->p_context
->workaround_bugs
=
227 var_InheritInteger( p_dec
, "ffmpeg-workaround-bugs" );
228 p_sys
->p_context
->error_recognition
=
229 var_InheritInteger( p_dec
, "ffmpeg-error-resilience" );
231 if( var_CreateGetBool( p_dec
, "grayscale" ) )
232 p_sys
->p_context
->flags
|= CODEC_FLAG_GRAY
;
234 i_val
= var_CreateGetInteger( p_dec
, "ffmpeg-vismv" );
235 if( i_val
) p_sys
->p_context
->debug_mv
= i_val
;
237 i_val
= var_CreateGetInteger( p_dec
, "ffmpeg-lowres" );
238 if( i_val
> 0 && i_val
<= 2 ) p_sys
->p_context
->lowres
= i_val
;
240 i_val
= var_CreateGetInteger( p_dec
, "ffmpeg-skiploopfilter" );
241 if( i_val
>= 4 ) p_sys
->p_context
->skip_loop_filter
= AVDISCARD_ALL
;
242 else if( i_val
== 3 ) p_sys
->p_context
->skip_loop_filter
= AVDISCARD_NONKEY
;
243 else if( i_val
== 2 ) p_sys
->p_context
->skip_loop_filter
= AVDISCARD_BIDIR
;
244 else if( i_val
== 1 ) p_sys
->p_context
->skip_loop_filter
= AVDISCARD_NONREF
;
246 if( var_CreateGetBool( p_dec
, "ffmpeg-fast" ) )
247 p_sys
->p_context
->flags2
|= CODEC_FLAG2_FAST
;
249 /* ***** ffmpeg frame skipping ***** */
250 p_sys
->b_hurry_up
= var_CreateGetBool( p_dec
, "ffmpeg-hurry-up" );
252 switch( var_CreateGetInteger( p_dec
, "ffmpeg-skip-frame" ) )
255 p_sys
->p_context
->skip_frame
= AVDISCARD_NONE
;
258 p_sys
->p_context
->skip_frame
= AVDISCARD_DEFAULT
;
261 p_sys
->p_context
->skip_frame
= AVDISCARD_NONREF
;
264 p_sys
->p_context
->skip_frame
= AVDISCARD_NONKEY
;
267 p_sys
->p_context
->skip_frame
= AVDISCARD_ALL
;
270 p_sys
->p_context
->skip_frame
= AVDISCARD_NONE
;
273 p_sys
->i_skip_frame
= p_sys
->p_context
->skip_frame
;
275 switch( var_CreateGetInteger( p_dec
, "ffmpeg-skip-idct" ) )
278 p_sys
->p_context
->skip_idct
= AVDISCARD_NONE
;
281 p_sys
->p_context
->skip_idct
= AVDISCARD_DEFAULT
;
284 p_sys
->p_context
->skip_idct
= AVDISCARD_NONREF
;
287 p_sys
->p_context
->skip_idct
= AVDISCARD_NONKEY
;
290 p_sys
->p_context
->skip_idct
= AVDISCARD_ALL
;
293 p_sys
->p_context
->skip_idct
= AVDISCARD_NONE
;
296 p_sys
->i_skip_idct
= p_sys
->p_context
->skip_idct
;
298 /* ***** ffmpeg direct rendering ***** */
299 p_sys
->b_direct_rendering
= false;
300 p_sys
->i_direct_rendering_used
= -1;
301 if( var_CreateGetBool( p_dec
, "ffmpeg-dr" ) &&
302 (p_sys
->p_codec
->capabilities
& CODEC_CAP_DR1
) &&
303 /* No idea why ... but this fixes flickering on some TSCC streams */
304 p_sys
->i_codec_id
!= CODEC_ID_TSCC
&&
305 #if (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 68, 2 ) ) && (LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 100, 1 ) )
306 /* avcodec native vp8 decode doesn't handle EMU_EDGE flag, and I
307 don't have idea howto implement fallback to libvpx decoder */
308 p_sys
->i_codec_id
!= CODEC_ID_VP8
&&
310 !p_sys
->p_context
->debug_mv
)
312 /* Some codecs set pix_fmt only after the 1st frame has been decoded,
313 * so we need to do another check in ffmpeg_GetFrameBuf() */
314 p_sys
->b_direct_rendering
= true;
317 /* ffmpeg doesn't properly release old pictures when frames are skipped */
318 //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = false;
319 if( p_sys
->b_direct_rendering
)
321 msg_Dbg( p_dec
, "trying to use direct rendering" );
322 p_sys
->p_context
->flags
|= CODEC_FLAG_EMU_EDGE
;
326 msg_Dbg( p_dec
, "direct rendering is disabled" );
329 /* Always use our get_buffer wrapper so we can calculate the
331 p_sys
->p_context
->get_buffer
= ffmpeg_GetFrameBuf
;
332 p_sys
->p_context
->reget_buffer
= ffmpeg_ReGetFrameBuf
;
333 p_sys
->p_context
->release_buffer
= ffmpeg_ReleaseFrameBuf
;
334 p_sys
->p_context
->opaque
= p_dec
;
336 #ifdef HAVE_AVCODEC_MT
337 int i_thread_count
= var_InheritInteger( p_dec
, "ffmpeg-threads" );
338 if( i_thread_count
<= 0 )
339 i_thread_count
= vlc_GetCPUCount();
340 msg_Dbg( p_dec
, "allowing %d thread(s) for decoding", i_thread_count
);
341 p_sys
->p_context
->thread_count
= i_thread_count
;
344 #ifdef HAVE_AVCODEC_VA
345 const bool b_use_hw
= var_CreateGetBool( p_dec
, "ffmpeg-hw" );
348 #ifdef HAVE_AVCODEC_MT
349 msg_Err( p_dec
, "ffmpeg-hw is not compatible with ffmpeg-mt" );
351 p_sys
->p_context
->get_format
= ffmpeg_GetFormat
;
356 /* ***** misc init ***** */
357 p_sys
->i_pts
= VLC_TS_INVALID
;
358 p_sys
->b_has_b_frames
= false;
359 p_sys
->b_first_frame
= true;
360 p_sys
->b_flush
= false;
361 p_sys
->i_late_frames
= 0;
363 /* Set output properties */
364 p_dec
->fmt_out
.i_cat
= VIDEO_ES
;
365 if( GetVlcChroma( &p_dec
->fmt_out
.video
, p_context
->pix_fmt
) != VLC_SUCCESS
)
367 /* we are doomed. but not really, because most codecs set their pix_fmt later on */
368 p_dec
->fmt_out
.i_codec
= VLC_CODEC_I420
;
370 p_dec
->fmt_out
.i_codec
= p_dec
->fmt_out
.video
.i_chroma
;
373 memset( &p_sys
->palette
, 0, sizeof(p_sys
->palette
) );
374 if( p_dec
->fmt_in
.video
.p_palette
)
376 p_sys
->palette
.palette_changed
= 1;
378 for( int i
= 0; i
< __MIN( AVPALETTE_COUNT
, p_dec
->fmt_in
.video
.p_palette
->i_entries
); i
++ )
384 c
.a
[0] = p_dec
->fmt_in
.video
.p_palette
->palette
[i
][0];
385 c
.a
[1] = p_dec
->fmt_in
.video
.p_palette
->palette
[i
][1];
386 c
.a
[2] = p_dec
->fmt_in
.video
.p_palette
->palette
[i
][2];
387 c
.a
[3] = p_dec
->fmt_in
.video
.p_palette
->palette
[i
][3];
389 p_sys
->palette
.palette
[i
] = c
.u
;
391 p_sys
->p_context
->palctrl
= &p_sys
->palette
;
393 p_dec
->fmt_out
.video
.p_palette
= malloc( sizeof(video_palette_t
) );
394 if( p_dec
->fmt_out
.video
.p_palette
)
395 *p_dec
->fmt_out
.video
.p_palette
= *p_dec
->fmt_in
.video
.p_palette
;
397 else if( p_sys
->i_codec_id
!= CODEC_ID_MSVIDEO1
&& p_sys
->i_codec_id
!= CODEC_ID_CINEPAK
)
399 p_sys
->p_context
->palctrl
= &p_sys
->palette
;
402 /* ***** init this codec with special data ***** */
403 ffmpeg_InitCodec( p_dec
);
405 /* ***** Open the codec ***** */
406 if( ffmpeg_OpenCodec( p_dec
) < 0 )
408 msg_Err( p_dec
, "cannot open codec (%s)", p_sys
->psz_namecodec
);
409 av_free( p_sys
->p_ff_pic
);
410 vlc_sem_destroy( &p_sys
->sem_mt
);
418 /*****************************************************************************
419 * DecodeVideo: Called to decode one or more frames
420 *****************************************************************************/
421 picture_t
*DecodeVideo( decoder_t
*p_dec
, block_t
**pp_block
)
423 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
424 AVCodecContext
*p_context
= p_sys
->p_context
;
426 int b_null_size
= false;
429 if( !pp_block
|| !*pp_block
)
432 if( !p_context
->extradata_size
&& p_dec
->fmt_in
.i_extra
)
434 ffmpeg_InitCodec( p_dec
);
435 if( p_sys
->b_delayed_open
)
437 if( ffmpeg_OpenCodec( p_dec
) )
438 msg_Err( p_dec
, "cannot open codec (%s)", p_sys
->psz_namecodec
);
443 if( p_sys
->b_delayed_open
)
445 block_Release( p_block
);
449 if( p_block
->i_flags
& (BLOCK_FLAG_DISCONTINUITY
|BLOCK_FLAG_CORRUPTED
) )
451 p_sys
->i_pts
= VLC_TS_INVALID
; /* To make sure we recover properly */
453 p_sys
->i_late_frames
= 0;
455 if( p_block
->i_flags
& BLOCK_FLAG_DISCONTINUITY
)
456 avcodec_flush_buffers( p_context
);
458 block_Release( p_block
);
462 if( p_block
->i_flags
& BLOCK_FLAG_PREROLL
)
464 /* Do not care about late frames when prerolling
465 * TODO avoid decoding of non reference frame
466 * (ie all B except for H264 where it depends only on nal_ref_idc) */
467 p_sys
->i_late_frames
= 0;
470 if( !p_dec
->b_pace_control
&& (p_sys
->i_late_frames
> 0) &&
471 (mdate() - p_sys
->i_late_frames_start
> INT64_C(5000000)) )
473 if( p_sys
->i_pts
> VLC_TS_INVALID
)
475 msg_Err( p_dec
, "more than 5 seconds of late video -> "
476 "dropping frame (computer too slow ?)" );
477 p_sys
->i_pts
= VLC_TS_INVALID
; /* To make sure we recover properly */
479 block_Release( p_block
);
480 p_sys
->i_late_frames
--;
484 /* A good idea could be to decode all I pictures and see for the other */
485 if( !p_dec
->b_pace_control
&&
487 (p_sys
->i_late_frames
> 4) )
490 if( p_sys
->i_late_frames
< 12 )
492 p_context
->skip_frame
=
493 (p_sys
->i_skip_frame
<= AVDISCARD_NONREF
) ?
494 AVDISCARD_NONREF
: p_sys
->i_skip_frame
;
498 /* picture too late, won't decode
499 * but break picture until a new I, and for mpeg4 ...*/
500 p_sys
->i_late_frames
--; /* needed else it will never be decrease */
501 block_Release( p_block
);
507 if( p_sys
->b_hurry_up
)
508 p_context
->skip_frame
= p_sys
->i_skip_frame
;
509 if( !(p_block
->i_flags
& BLOCK_FLAG_PREROLL
) )
515 if( p_context
->width
<= 0 || p_context
->height
<= 0 )
517 if( p_sys
->b_hurry_up
)
518 p_context
->skip_frame
= p_sys
->i_skip_frame
;
521 else if( !b_drawpicture
)
523 /* It creates broken picture
524 * FIXME either our parser or ffmpeg is broken */
526 if( p_sys
->b_hurry_up
)
527 p_context
->skip_frame
= __MAX( p_context
->skip_frame
,
533 * Do the actual decoding now */
535 /* Don't forget that ffmpeg requires a little more bytes
536 * that the real frame size */
537 if( p_block
->i_buffer
> 0 )
539 p_sys
->b_flush
= ( p_block
->i_flags
& BLOCK_FLAG_END_OF_SEQUENCE
) != 0;
541 p_block
= block_Realloc( p_block
, 0,
542 p_block
->i_buffer
+ FF_INPUT_BUFFER_PADDING_SIZE
);
545 p_block
->i_buffer
-= FF_INPUT_BUFFER_PADDING_SIZE
;
547 memset( p_block
->p_buffer
+ p_block
->i_buffer
, 0,
548 FF_INPUT_BUFFER_PADDING_SIZE
);
551 while( p_block
->i_buffer
> 0 || p_sys
->b_flush
)
553 int i_used
, b_gotpicture
;
557 /* Set the PTS/DTS in the context reordered_opaque field */
558 if( p_block
->i_pts
> VLC_TS_INVALID
)
559 p_context
->reordered_opaque
= (p_block
->i_pts
<< 1) | 0;
560 else if( p_block
->i_dts
> VLC_TS_INVALID
)
561 p_context
->reordered_opaque
= (p_block
->i_dts
<< 1) | 1;
563 p_context
->reordered_opaque
= INT64_MIN
;
564 p_sys
->p_ff_pic
->reordered_opaque
= p_context
->reordered_opaque
;
566 /* Make sure we don't reuse the same timestamps twice */
568 p_block
->i_dts
= VLC_TS_INVALID
;
572 av_init_packet( &pkt
);
573 pkt
.data
= p_block
->p_buffer
;
574 pkt
.size
= p_block
->i_buffer
;
575 i_used
= avcodec_decode_video2( p_context
, p_sys
->p_ff_pic
,
576 &b_gotpicture
, &pkt
);
578 if( b_null_size
&& !p_sys
->b_flush
&&
579 p_context
->width
> 0 && p_context
->height
> 0 )
581 /* Reparse it to not drop the I frame */
583 if( p_sys
->b_hurry_up
)
584 p_context
->skip_frame
= p_sys
->i_skip_frame
;
585 i_used
= avcodec_decode_video2( p_context
, p_sys
->p_ff_pic
,
586 &b_gotpicture
, &pkt
);
591 p_sys
->b_first_frame
= true;
593 if( p_block
->i_buffer
<= 0 )
594 p_sys
->b_flush
= false;
599 msg_Warn( p_dec
, "cannot decode one frame (%zu bytes)",
601 block_Release( p_block
);
604 else if( i_used
> p_block
->i_buffer
||
605 p_context
->thread_count
> 1 )
607 i_used
= p_block
->i_buffer
;
611 p_block
->i_buffer
-= i_used
;
612 p_block
->p_buffer
+= i_used
;
614 /* Nothing to display */
617 if( i_used
== 0 ) break;
621 /* Sanity check (seems to be needed for some streams) */
622 if( p_sys
->p_ff_pic
->pict_type
== FF_B_TYPE
)
624 p_sys
->b_has_b_frames
= true;
627 /* Compute the PTS */
628 mtime_t i_pts
= VLC_TS_INVALID
;
629 if( p_sys
->p_ff_pic
->reordered_opaque
!= INT64_MIN
)
631 mtime_t i_ts
= p_sys
->p_ff_pic
->reordered_opaque
>> 1;
632 bool b_dts
= p_sys
->p_ff_pic
->reordered_opaque
& 1;
635 if( !p_context
->has_b_frames
||
636 !p_sys
->b_has_b_frames
||
637 !p_sys
->p_ff_pic
->reference
||
638 p_sys
->i_pts
<= VLC_TS_INVALID
)
641 /* Guess what ? The rules are different for Real Video :( */
642 if( (p_dec
->fmt_in
.i_codec
== VLC_CODEC_RV30
||
643 p_dec
->fmt_in
.i_codec
== VLC_CODEC_RV40
) &&
644 p_sys
->b_has_b_frames
)
646 i_pts
= VLC_TS_INVALID
;
647 if(p_sys
->p_ff_pic
->reference
) i_pts
= i_ts
;
655 if( i_pts
<= VLC_TS_INVALID
)
656 i_pts
= p_sys
->i_pts
;
658 /* Interpolate the next PTS */
659 if( i_pts
> VLC_TS_INVALID
)
660 p_sys
->i_pts
= i_pts
;
661 if( p_sys
->i_pts
> VLC_TS_INVALID
)
663 /* interpolate the next PTS */
664 if( p_dec
->fmt_in
.video
.i_frame_rate
> 0 &&
665 p_dec
->fmt_in
.video
.i_frame_rate_base
> 0 )
667 p_sys
->i_pts
+= INT64_C(1000000) *
668 (2 + p_sys
->p_ff_pic
->repeat_pict
) *
669 p_dec
->fmt_in
.video
.i_frame_rate_base
/
670 (2 * p_dec
->fmt_in
.video
.i_frame_rate
);
672 else if( p_context
->time_base
.den
> 0 )
674 int i_tick
= p_context
->ticks_per_frame
;
678 p_sys
->i_pts
+= INT64_C(1000000) *
679 (2 + p_sys
->p_ff_pic
->repeat_pict
) *
680 i_tick
* p_context
->time_base
.num
/
681 (2 * p_context
->time_base
.den
);
685 /* Update frame late count (except when doing preroll) */
686 mtime_t i_display_date
= 0;
687 if( !(p_block
->i_flags
& BLOCK_FLAG_PREROLL
) )
688 i_display_date
= decoder_GetDisplayDate( p_dec
, i_pts
);
690 if( i_display_date
> 0 && i_display_date
<= mdate() )
692 p_sys
->i_late_frames
++;
693 if( p_sys
->i_late_frames
== 1 )
694 p_sys
->i_late_frames_start
= mdate();
698 p_sys
->i_late_frames
= 0;
701 if( !b_drawpicture
|| ( !p_sys
->p_va
&& !p_sys
->p_ff_pic
->linesize
[0] ) )
704 if( !p_sys
->p_ff_pic
->opaque
)
706 /* Get a new picture */
707 p_pic
= ffmpeg_NewPictBuf( p_dec
, p_context
);
710 block_Release( p_block
);
714 /* Fill p_picture_t from AVVideoFrame and do chroma conversion
716 ffmpeg_CopyPicture( p_dec
, p_pic
, p_sys
->p_ff_pic
);
720 p_pic
= (picture_t
*)p_sys
->p_ff_pic
->opaque
;
721 decoder_LinkPicture( p_dec
, p_pic
);
724 if( !p_dec
->fmt_in
.video
.i_sar_num
|| !p_dec
->fmt_in
.video
.i_sar_den
)
726 /* Fetch again the aspect ratio in case it changed */
727 p_dec
->fmt_out
.video
.i_sar_num
728 = p_context
->sample_aspect_ratio
.num
;
729 p_dec
->fmt_out
.video
.i_sar_den
730 = p_context
->sample_aspect_ratio
.den
;
732 if( !p_dec
->fmt_out
.video
.i_sar_num
|| !p_dec
->fmt_out
.video
.i_sar_den
)
734 p_dec
->fmt_out
.video
.i_sar_num
= 1;
735 p_dec
->fmt_out
.video
.i_sar_den
= 1;
739 /* Send decoded frame to vout */
740 if( i_pts
> VLC_TS_INVALID
)
744 if( p_sys
->b_first_frame
)
746 /* Hack to force display of still pictures */
747 p_sys
->b_first_frame
= false;
748 p_pic
->b_force
= true;
751 p_pic
->i_nb_fields
= 2 + p_sys
->p_ff_pic
->repeat_pict
;
752 p_pic
->b_progressive
= !p_sys
->p_ff_pic
->interlaced_frame
;
753 p_pic
->b_top_field_first
= p_sys
->p_ff_pic
->top_field_first
;
755 p_pic
->i_qstride
= p_sys
->p_ff_pic
->qstride
;
756 int i_mb_h
= ( p_pic
->format
.i_height
+ 15 ) / 16;
757 p_pic
->p_q
= malloc( p_pic
->i_qstride
* i_mb_h
);
758 memcpy( p_pic
->p_q
, p_sys
->p_ff_pic
->qscale_table
,
759 p_pic
->i_qstride
* i_mb_h
);
760 switch( p_sys
->p_ff_pic
->qscale_type
)
762 case FF_QSCALE_TYPE_MPEG1
:
763 p_pic
->i_qtype
= QTYPE_MPEG1
;
765 case FF_QSCALE_TYPE_MPEG2
:
766 p_pic
->i_qtype
= QTYPE_MPEG2
;
768 case FF_QSCALE_TYPE_H264
:
769 p_pic
->i_qtype
= QTYPE_H264
;
777 decoder_DeletePicture( p_dec
, p_pic
);
781 block_Release( p_block
);
785 /*****************************************************************************
786 * EndVideo: decoder destruction
787 *****************************************************************************
788 * This function is called when the thread ends after a successful
790 *****************************************************************************/
791 void EndVideoDec( decoder_t
*p_dec
)
793 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
797 /* do not flush buffers if codec hasn't been opened (theora/vorbis/VC1) */
798 if( p_sys
->p_context
->codec
)
799 avcodec_flush_buffers( p_sys
->p_context
);
803 if( p_sys
->p_ff_pic
) av_free( p_sys
->p_ff_pic
);
807 vlc_va_Delete( p_sys
->p_va
);
810 vlc_sem_destroy( &p_sys
->sem_mt
);
813 /*****************************************************************************
814 * ffmpeg_InitCodec: setup codec extra initialization data for ffmpeg
815 *****************************************************************************/
816 static void ffmpeg_InitCodec( decoder_t
*p_dec
)
818 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
819 int i_size
= p_dec
->fmt_in
.i_extra
;
821 if( !i_size
) return;
823 if( p_sys
->i_codec_id
== CODEC_ID_SVQ3
)
827 p_sys
->p_context
->extradata_size
= i_size
+ 12;
828 p
= p_sys
->p_context
->extradata
=
829 malloc( p_sys
->p_context
->extradata_size
);
833 memcpy( &p
[0], "SVQ3", 4 );
834 memset( &p
[4], 0, 8 );
835 memcpy( &p
[12], p_dec
->fmt_in
.p_extra
, i_size
);
837 /* Now remove all atoms before the SMI one */
838 if( p_sys
->p_context
->extradata_size
> 0x5a &&
839 strncmp( (char*)&p
[0x56], "SMI ", 4 ) )
841 uint8_t *psz
= &p
[0x52];
843 while( psz
< &p
[p_sys
->p_context
->extradata_size
- 8] )
845 int i_size
= GetDWBE( psz
);
848 /* FIXME handle 1 as long size */
851 if( !strncmp( (char*)&psz
[4], "SMI ", 4 ) )
853 memmove( &p
[0x52], psz
,
854 &p
[p_sys
->p_context
->extradata_size
] - psz
);
864 p_sys
->p_context
->extradata_size
= i_size
;
865 p_sys
->p_context
->extradata
=
866 malloc( i_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
867 if( p_sys
->p_context
->extradata
)
869 memcpy( p_sys
->p_context
->extradata
,
870 p_dec
->fmt_in
.p_extra
, i_size
);
871 memset( &((uint8_t*)p_sys
->p_context
->extradata
)[i_size
],
872 0, FF_INPUT_BUFFER_PADDING_SIZE
);
877 /*****************************************************************************
878 * ffmpeg_CopyPicture: copy a picture from ffmpeg internal buffers to a
879 * picture_t structure (when not in direct rendering mode).
880 *****************************************************************************/
881 static void ffmpeg_CopyPicture( decoder_t
*p_dec
,
882 picture_t
*p_pic
, AVFrame
*p_ff_pic
)
884 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
888 vlc_va_Extract( p_sys
->p_va
, p_pic
, p_ff_pic
);
890 else if( TestFfmpegChroma( p_sys
->p_context
->pix_fmt
, -1 ) == VLC_SUCCESS
)
892 int i_plane
, i_size
, i_line
;
893 uint8_t *p_dst
, *p_src
;
894 int i_src_stride
, i_dst_stride
;
896 for( i_plane
= 0; i_plane
< p_pic
->i_planes
; i_plane
++ )
898 p_src
= p_ff_pic
->data
[i_plane
];
899 p_dst
= p_pic
->p
[i_plane
].p_pixels
;
900 i_src_stride
= p_ff_pic
->linesize
[i_plane
];
901 i_dst_stride
= p_pic
->p
[i_plane
].i_pitch
;
903 i_size
= __MIN( i_src_stride
, i_dst_stride
);
904 for( i_line
= 0; i_line
< p_pic
->p
[i_plane
].i_visible_lines
;
907 vlc_memcpy( p_dst
, p_src
, i_size
);
908 p_src
+= i_src_stride
;
909 p_dst
+= i_dst_stride
;
915 msg_Err( p_dec
, "don't know how to convert chroma %i",
916 p_sys
->p_context
->pix_fmt
);
921 /*****************************************************************************
922 * ffmpeg_GetFrameBuf: callback used by ffmpeg to get a frame buffer.
923 *****************************************************************************
924 * It is used for direct rendering as well as to get the right PTS for each
925 * decoded picture (even in indirect rendering mode).
926 *****************************************************************************/
927 static int ffmpeg_GetFrameBuf( struct AVCodecContext
*p_context
,
930 decoder_t
*p_dec
= (decoder_t
*)p_context
->opaque
;
931 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
935 p_ff_pic
->reordered_opaque
= p_context
->reordered_opaque
;
936 p_ff_pic
->opaque
= NULL
;
940 #ifdef HAVE_AVCODEC_VA
941 /* hwaccel_context is not present in old fffmpeg version */
942 if( vlc_va_Setup( p_sys
->p_va
,
943 &p_sys
->p_context
->hwaccel_context
, &p_dec
->fmt_out
.video
.i_chroma
,
944 p_sys
->p_context
->width
, p_sys
->p_context
->height
) )
946 msg_Err( p_dec
, "vlc_va_Setup failed" );
954 p_ff_pic
->type
= FF_BUFFER_TYPE_USER
;
955 /* FIXME what is that, should give good value */
956 p_ff_pic
->age
= 256*256*256*64; // FIXME FIXME from ffmpeg
958 if( vlc_va_Get( p_sys
->p_va
, p_ff_pic
) )
960 msg_Err( p_dec
, "VaGrabSurface failed" );
965 else if( !p_sys
->b_direct_rendering
)
967 /* Not much to do in indirect rendering mode. */
968 return avcodec_default_get_buffer( p_context
, p_ff_pic
);
973 /* Some codecs set pix_fmt only after the 1st frame has been decoded,
974 * so we need to check for direct rendering again. */
976 int i_width
= p_sys
->p_context
->width
;
977 int i_height
= p_sys
->p_context
->height
;
978 avcodec_align_dimensions( p_sys
->p_context
, &i_width
, &i_height
);
980 if( GetVlcChroma( &p_dec
->fmt_out
.video
, p_context
->pix_fmt
) != VLC_SUCCESS
||
981 p_context
->pix_fmt
== PIX_FMT_PAL8
)
984 p_dec
->fmt_out
.i_codec
= p_dec
->fmt_out
.video
.i_chroma
;
986 /* Get a new picture */
987 p_pic
= ffmpeg_NewPictBuf( p_dec
, p_sys
->p_context
);
990 bool b_compatible
= true;
991 if( p_pic
->p
[0].i_pitch
/ p_pic
->p
[0].i_pixel_pitch
< i_width
||
992 p_pic
->p
[0].i_lines
< i_height
)
993 b_compatible
= false;
994 for( int i
= 0; i
< p_pic
->i_planes
&& b_compatible
; i
++ )
997 switch( p_sys
->i_codec_id
)
1007 i_align
= i
== 0 ? 16 : 8;
1010 if( p_pic
->p
[i
].i_pitch
% i_align
)
1011 b_compatible
= false;
1012 if( (intptr_t)p_pic
->p
[i
].p_pixels
% i_align
)
1013 b_compatible
= false;
1015 if( p_context
->pix_fmt
== PIX_FMT_YUV422P
&& b_compatible
)
1017 if( 2 * p_pic
->p
[1].i_pitch
!= p_pic
->p
[0].i_pitch
||
1018 2 * p_pic
->p
[2].i_pitch
!= p_pic
->p
[0].i_pitch
)
1019 b_compatible
= false;
1023 decoder_DeletePicture( p_dec
, p_pic
);
1027 if( p_sys
->i_direct_rendering_used
!= 1 )
1029 msg_Dbg( p_dec
, "using direct rendering" );
1030 p_sys
->i_direct_rendering_used
= 1;
1033 p_sys
->p_context
->draw_horiz_band
= NULL
;
1035 p_ff_pic
->opaque
= (void*)p_pic
;
1036 p_ff_pic
->type
= FF_BUFFER_TYPE_USER
;
1037 p_ff_pic
->data
[0] = p_pic
->p
[0].p_pixels
;
1038 p_ff_pic
->data
[1] = p_pic
->p
[1].p_pixels
;
1039 p_ff_pic
->data
[2] = p_pic
->p
[2].p_pixels
;
1040 p_ff_pic
->data
[3] = NULL
; /* alpha channel but I'm not sure */
1042 p_ff_pic
->linesize
[0] = p_pic
->p
[0].i_pitch
;
1043 p_ff_pic
->linesize
[1] = p_pic
->p
[1].i_pitch
;
1044 p_ff_pic
->linesize
[2] = p_pic
->p
[2].i_pitch
;
1045 p_ff_pic
->linesize
[3] = 0;
1047 /* FIXME what is that, should give good value */
1048 p_ff_pic
->age
= 256*256*256*64; // FIXME FIXME from ffmpeg
1054 if( p_sys
->i_direct_rendering_used
!= 0 )
1056 msg_Warn( p_dec
, "disabling direct rendering" );
1057 p_sys
->i_direct_rendering_used
= 0;
1060 return avcodec_default_get_buffer( p_context
, p_ff_pic
);
1062 static int ffmpeg_ReGetFrameBuf( struct AVCodecContext
*p_context
, AVFrame
*p_ff_pic
)
1064 p_ff_pic
->reordered_opaque
= p_context
->reordered_opaque
;
1066 /* We always use default reget function, it works perfectly fine */
1067 return avcodec_default_reget_buffer( p_context
, p_ff_pic
);
1070 static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext
*p_context
,
1073 decoder_t
*p_dec
= (decoder_t
*)p_context
->opaque
;
1074 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
1078 vlc_va_Release( p_sys
->p_va
, p_ff_pic
);
1080 else if( !p_ff_pic
->opaque
)
1082 /* We can end up here without the AVFrame being allocated by
1083 * avcodec_default_get_buffer() if VA is used and the frame is
1084 * released when the decoder is closed
1086 if( p_ff_pic
->type
== FF_BUFFER_TYPE_INTERNAL
)
1087 avcodec_default_release_buffer( p_context
, p_ff_pic
);
1091 picture_t
*p_pic
= (picture_t
*)p_ff_pic
->opaque
;
1093 decoder_UnlinkPicture( p_dec
, p_pic
);
1095 for( int i
= 0; i
< 4; i
++ )
1096 p_ff_pic
->data
[i
] = NULL
;
1099 #ifdef HAVE_AVCODEC_VA
1100 static enum PixelFormat
ffmpeg_GetFormat( AVCodecContext
*p_codec
,
1101 const enum PixelFormat
*pi_fmt
)
1103 decoder_t
*p_dec
= p_codec
->opaque
;
1104 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
1108 vlc_va_Delete( p_sys
->p_va
);
1112 /* Try too look for a supported hw acceleration */
1113 for( int i
= 0; pi_fmt
[i
] != PIX_FMT_NONE
; i
++ )
1115 static const char *ppsz_name
[PIX_FMT_NB
] = {
1116 [PIX_FMT_VDPAU_H264
] = "PIX_FMT_VDPAU_H264",
1117 [PIX_FMT_VAAPI_IDCT
] = "PIX_FMT_VAAPI_IDCT",
1118 [PIX_FMT_VAAPI_VLD
] = "PIX_FMT_VAAPI_VLD",
1119 [PIX_FMT_VAAPI_MOCO
] = "PIX_FMT_VAAPI_MOCO",
1120 #ifdef HAVE_AVCODEC_DXVA2
1121 [PIX_FMT_DXVA2_VLD
] = "PIX_FMT_DXVA2_VLD",
1123 [PIX_FMT_YUYV422
] = "PIX_FMT_YUYV422",
1124 [PIX_FMT_YUV420P
] = "PIX_FMT_YUV420P",
1126 msg_Dbg( p_dec
, "Available decoder output format %d (%s)", pi_fmt
[i
], ppsz_name
[pi_fmt
[i
]] ?: "Unknown" );
1128 /* Only VLD supported */
1129 if( pi_fmt
[i
] == PIX_FMT_VAAPI_VLD
)
1131 if( !var_InheritBool( p_dec
, "xlib" ) )
1133 msg_Warn( p_dec
, "Ignoring VA API" );
1136 #ifdef HAVE_AVCODEC_VAAPI
1137 msg_Dbg( p_dec
, "Trying VA API" );
1138 p_sys
->p_va
= vlc_va_NewVaapi( VLC_OBJECT(p_dec
), p_sys
->i_codec_id
);
1140 msg_Warn( p_dec
, "Failed to open VA API" );
1145 #ifdef HAVE_AVCODEC_DXVA2
1146 if( pi_fmt
[i
] == PIX_FMT_DXVA2_VLD
)
1148 msg_Dbg( p_dec
, "Trying DXVA2" );
1149 p_sys
->p_va
= vlc_va_NewDxva2( VLC_OBJECT(p_dec
), p_sys
->i_codec_id
);
1151 msg_Warn( p_dec
, "Failed to open DXVA2" );
1156 p_sys
->p_context
->width
> 0 && p_sys
->p_context
->height
> 0 )
1158 /* We try to call vlc_va_Setup when possible to detect errors when
1159 * possible (later is too late) */
1160 if( vlc_va_Setup( p_sys
->p_va
,
1161 &p_sys
->p_context
->hwaccel_context
,
1162 &p_dec
->fmt_out
.video
.i_chroma
,
1163 p_sys
->p_context
->width
, p_sys
->p_context
->height
) )
1165 msg_Err( p_dec
, "vlc_va_Setup failed" );
1166 vlc_va_Delete( p_sys
->p_va
);
1173 if( p_sys
->p_va
->description
)
1174 msg_Info( p_dec
, "Using %s for hardware decoding.", p_sys
->p_va
->description
);
1176 /* FIXME this will disabled direct rendering
1177 * even if a new pixel format is renegociated
1179 p_sys
->b_direct_rendering
= false;
1180 p_sys
->p_context
->draw_horiz_band
= NULL
;
1185 /* Fallback to default behaviour */
1186 return avcodec_default_get_format( p_codec
, pi_fmt
);