video.c 44.9 KB
Newer Older
1
/*****************************************************************************
2
 * video.c: video decoder using the libavcodec library
3
 *****************************************************************************
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
4
 * Copyright (C) 1999-2001 VLC authors and VideoLAN
5 6 7 8 9
 * $Id$
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
 *          Gildas Bazin <gbazin@videolan.org>
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
10 11 12
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
13 14 15 16
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
17 18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
19
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
20 21 22
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 24 25 26 27
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
28 29 30 31
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

32
#include <vlc_common.h>
zorglub's avatar
zorglub committed
33
#include <vlc_codec.h>
34
#include <vlc_avcodec.h>
Laurent Aimar's avatar
Laurent Aimar committed
35
#include <vlc_cpu.h>
36
#include <assert.h>
37

38
#include <libavcodec/avcodec.h>
39
#include <libavutil/mem.h>
40
#include <libavutil/pixdesc.h>
41

42
#include "avcodec.h"
43
#include "va.h"
44 45 46 47 48 49

/*****************************************************************************
 * decoder_sys_t : decoder descriptor
 *****************************************************************************/
struct decoder_sys_t
{
50
    AVCODEC_COMMON_MEMBERS
51 52 53 54 55 56 57

    /* Video decoder specific part */
    mtime_t i_pts;

    AVFrame          *p_ff_pic;

    /* for frame skipping algo */
58
    bool b_hurry_up;
59 60
    enum AVDiscard i_skip_frame;
    enum AVDiscard i_skip_idct;
61 62 63 64 65 66

    /* how many decoded frames are late */
    int     i_late_frames;
    mtime_t i_late_frames_start;

    /* for direct rendering */
67
    bool b_direct_rendering;
68
    int  i_direct_rendering_used;
69

70
    bool b_has_b_frames;
71 72

    /* Hack to force display of still pictures */
73
    bool b_first_frame;
74

75

76
    /* */
77
    bool palette_sent;
78 79 80

    /* */
    bool b_flush;
81 82 83

    /* VA API */
    vlc_va_t *p_va;
Laurent Aimar's avatar
Laurent Aimar committed
84 85

    vlc_sem_t sem_mt;
86 87
};

Laurent Aimar's avatar
Laurent Aimar committed
88 89 90 91 92 93 94 95
#ifdef HAVE_AVCODEC_MT
#   define wait_mt(s) vlc_sem_wait( &s->sem_mt )
#   define post_mt(s) vlc_sem_post( &s->sem_mt )
#else
#   define wait_mt(s)
#   define post_mt(s)
#endif

96 97 98
/*****************************************************************************
 * Local prototypes
 *****************************************************************************/
99
static void ffmpeg_InitCodec      ( decoder_t * );
100
static void ffmpeg_CopyPicture    ( decoder_t *, picture_t *, AVFrame * );
101 102 103
#if LIBAVCODEC_VERSION_MAJOR >= 55
static int lavc_GetFrame(struct AVCodecContext *, AVFrame *, int);
#else
104 105
static int  ffmpeg_GetFrameBuf    ( struct AVCodecContext *, AVFrame * );
static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * );
106
#endif
107 108
static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *,
                                          const enum PixelFormat * );
109
static picture_t *DecodeVideo( decoder_t *, block_t ** );
110

111 112 113 114 115 116 117 118 119 120 121 122 123 124
static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc )
{
    uint8_t *p = (uint8_t*)&fcc;
    return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
}

/*****************************************************************************
 * Local Functions
 *****************************************************************************/

/* Returns a new picture buffer */
static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
                                            AVCodecContext *p_context )
{
125
    decoder_sys_t *p_sys = p_dec->p_sys;
126 127
    int width = p_context->coded_width;
    int height = p_context->coded_height;
128

129 130 131 132 133 134
    if( p_sys->p_va == NULL )
    {
        int aligns[AV_NUM_DATA_POINTERS];

        avcodec_align_dimensions2(p_context, &width, &height, aligns);
    }
135 136


137 138 139 140 141
    if( width == 0 || height == 0 || width > 8192 || height > 8192 )
    {
        msg_Err( p_dec, "Invalid frame size %dx%d.", width, height );
        return NULL; /* invalid display size */
    }
142 143 144 145
    p_dec->fmt_out.video.i_width = width;
    p_dec->fmt_out.video.i_height = height;

    if( width != p_context->width || height != p_context->height )
146 147 148 149
    {
        p_dec->fmt_out.video.i_visible_width = p_context->width;
        p_dec->fmt_out.video.i_visible_height = p_context->height;
    }
150 151 152 153 154
    else
    {
        p_dec->fmt_out.video.i_visible_width = width;
        p_dec->fmt_out.video.i_visible_height = height;
    }
155

156
    if( !p_sys->p_va && GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) )
157
    {
158 159 160 161
        /* we are doomed, but not really, because most codecs set their pix_fmt
         * much later
         * FIXME does it make sense here ? */
        p_dec->fmt_out.video.i_chroma = VLC_CODEC_I420;
162
    }
163
    p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
164 165

    /* If an aspect-ratio was specified in the input format then force it */
Laurent Aimar's avatar
Laurent Aimar committed
166
    if( p_dec->fmt_in.video.i_sar_num > 0 && p_dec->fmt_in.video.i_sar_den > 0 )
167
    {
Laurent Aimar's avatar
Laurent Aimar committed
168 169
        p_dec->fmt_out.video.i_sar_num = p_dec->fmt_in.video.i_sar_num;
        p_dec->fmt_out.video.i_sar_den = p_dec->fmt_in.video.i_sar_den;
170 171 172
    }
    else
    {
173 174
        p_dec->fmt_out.video.i_sar_num = p_context->sample_aspect_ratio.num;
        p_dec->fmt_out.video.i_sar_den = p_context->sample_aspect_ratio.den;
175

Laurent Aimar's avatar
Laurent Aimar committed
176
        if( !p_dec->fmt_out.video.i_sar_num || !p_dec->fmt_out.video.i_sar_den )
177
        {
Laurent Aimar's avatar
Laurent Aimar committed
178 179
            p_dec->fmt_out.video.i_sar_num = 1;
            p_dec->fmt_out.video.i_sar_den = 1;
180 181 182
        }
    }

Laurent Aimar's avatar
Laurent Aimar committed
183 184
    if( p_dec->fmt_in.video.i_frame_rate > 0 &&
        p_dec->fmt_in.video.i_frame_rate_base > 0 )
185 186 187 188
    {
        p_dec->fmt_out.video.i_frame_rate =
            p_dec->fmt_in.video.i_frame_rate;
        p_dec->fmt_out.video.i_frame_rate_base =
damienf's avatar
damienf committed
189
            p_dec->fmt_in.video.i_frame_rate_base;
190
    }
191
    else if( p_context->time_base.num > 0 && p_context->time_base.den > 0 )
192 193
    {
        p_dec->fmt_out.video.i_frame_rate = p_context->time_base.den;
194
        p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num * __MAX( p_context->ticks_per_frame, 1 );
195
    }
196

197
    return decoder_NewPicture( p_dec );
198 199
}

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
static int OpenVideoCodec( decoder_t *p_dec )
{
    decoder_sys_t *p_sys = p_dec->p_sys;

    if( p_sys->p_context->extradata_size <= 0 )
    {
        if( p_sys->i_codec_id == AV_CODEC_ID_VC1 ||
            p_sys->i_codec_id == AV_CODEC_ID_THEORA )
        {
            msg_Warn( p_dec, "waiting for extra data for codec %s",
                      p_sys->psz_namecodec );
            return 1;
        }
    }

    p_sys->p_context->width  = p_dec->fmt_in.video.i_visible_width;
    p_sys->p_context->height = p_dec->fmt_in.video.i_visible_height;
    if (p_sys->p_context->width  == 0)
        p_sys->p_context->width  = p_dec->fmt_in.video.i_width;
    else if (p_sys->p_context->width != p_dec->fmt_in.video.i_width)
        p_sys->p_context->coded_width = p_dec->fmt_in.video.i_width;
    if (p_sys->p_context->height == 0)
        p_sys->p_context->height = p_dec->fmt_in.video.i_height;
    else if (p_sys->p_context->height != p_dec->fmt_in.video.i_height)
        p_sys->p_context->coded_height = p_dec->fmt_in.video.i_height;
    p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.video.i_bits_per_pixel;

    int ret = ffmpeg_OpenCodec( p_dec );
    if( ret < 0 )
        return ret;

#ifdef HAVE_AVCODEC_MT
    switch( p_sys->p_context->active_thread_type )
    {
        case FF_THREAD_FRAME:
            msg_Dbg( p_dec, "using frame thread mode with %d threads",
                     p_sys->p_context->thread_count );
            break;
        case FF_THREAD_SLICE:
            msg_Dbg( p_dec, "using slice thread mode with %d threads",
                     p_sys->p_context->thread_count );
            break;
        case 0:
            if( p_sys->p_context->thread_count > 1 )
                msg_Warn( p_dec, "failed to enable threaded decoding" );
            break;
        default:
            msg_Warn( p_dec, "using unknown thread mode with %d threads",
                      p_sys->p_context->thread_count );
            break;
    }
#endif
    return VLC_SUCCESS;
}

255 256 257 258 259 260
/*****************************************************************************
 * InitVideo: initialize the video decoder
 *****************************************************************************
 * the ffmpeg codec will be opened, some memory allocated. The vout is not yet
 * opened (done after the first decoded frame).
 *****************************************************************************/
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
261
int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context,
262
                      AVCodec *p_codec, int i_codec_id, const char *psz_namecodec )
263 264
{
    decoder_sys_t *p_sys;
265
    int i_val;
266 267

    /* Allocate the memory needed to store the decoder's structure */
ivoire's avatar
ivoire committed
268
    if( ( p_dec->p_sys = p_sys = calloc( 1, sizeof(decoder_sys_t) ) ) == NULL )
269
        return VLC_ENOMEM;
270

271 272
    p_codec->type = AVMEDIA_TYPE_VIDEO;
    p_context->codec_type = AVMEDIA_TYPE_VIDEO;
273
    p_context->codec_id = i_codec_id;
274 275 276 277
    p_sys->p_context = p_context;
    p_sys->p_codec = p_codec;
    p_sys->i_codec_id = i_codec_id;
    p_sys->psz_namecodec = psz_namecodec;
278
    p_sys->p_ff_pic = avcodec_alloc_frame();
279
    p_sys->b_delayed_open = true;
280
    p_sys->p_va = NULL;
Laurent Aimar's avatar
Laurent Aimar committed
281
    vlc_sem_init( &p_sys->sem_mt, 0 );
282 283

    /* ***** Fill p_context with init values ***** */
284
    p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_original_fourcc ?: p_dec->fmt_in.i_codec );
285 286 287

    /*  ***** Get configuration of ffmpeg plugin ***** */
    p_sys->p_context->workaround_bugs =
288
        var_InheritInteger( p_dec, "avcodec-workaround-bugs" );
289
    p_sys->p_context->err_recognition =
290
        var_InheritInteger( p_dec, "avcodec-error-resilience" );
291

292 293
    if( var_CreateGetBool( p_dec, "grayscale" ) )
        p_sys->p_context->flags |= CODEC_FLAG_GRAY;
294

Luca Barbato's avatar
Luca Barbato committed
295 296 297 298 299
    /* ***** Output always the frames ***** */
#if LIBAVCODEC_VERSION_CHECK(55, 23, 1, 40, 101)
    p_sys->p_context->flags |= CODEC_FLAG_OUTPUT_CORRUPT;
#endif

300
    i_val = var_CreateGetInteger( p_dec, "avcodec-vismv" );
301
    if( i_val ) p_sys->p_context->debug_mv = i_val;
302

303
    i_val = var_CreateGetInteger( p_dec, "avcodec-skiploopfilter" );
304 305 306 307
    if( i_val >= 4 ) p_sys->p_context->skip_loop_filter = AVDISCARD_ALL;
    else if( i_val == 3 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONKEY;
    else if( i_val == 2 ) p_sys->p_context->skip_loop_filter = AVDISCARD_BIDIR;
    else if( i_val == 1 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONREF;
308

309
    if( var_CreateGetBool( p_dec, "avcodec-fast" ) )
310
        p_sys->p_context->flags2 |= CODEC_FLAG2_FAST;
311

312
    /* ***** libavcodec frame skipping ***** */
313
    p_sys->b_hurry_up = var_CreateGetBool( p_dec, "avcodec-hurry-up" );
314

315 316 317 318 319 320 321
    i_val = var_CreateGetInteger( p_dec, "avcodec-skip-frame" );
    if( i_val >= 4 ) p_sys->p_context->skip_frame = AVDISCARD_ALL;
    else if( i_val == 3 ) p_sys->p_context->skip_frame = AVDISCARD_NONKEY;
    else if( i_val == 2 ) p_sys->p_context->skip_frame = AVDISCARD_BIDIR;
    else if( i_val == 1 ) p_sys->p_context->skip_frame = AVDISCARD_NONREF;
    else if( i_val == -1 ) p_sys->p_context->skip_frame = AVDISCARD_NONE;
    else p_sys->p_context->skip_frame = AVDISCARD_DEFAULT;
322
    p_sys->i_skip_frame = p_sys->p_context->skip_frame;
323

324 325 326 327 328 329 330
    i_val = var_CreateGetInteger( p_dec, "avcodec-skip-idct" );
    if( i_val >= 4 ) p_sys->p_context->skip_idct = AVDISCARD_ALL;
    else if( i_val == 3 ) p_sys->p_context->skip_idct = AVDISCARD_NONKEY;
    else if( i_val == 2 ) p_sys->p_context->skip_idct = AVDISCARD_BIDIR;
    else if( i_val == 1 ) p_sys->p_context->skip_idct = AVDISCARD_NONREF;
    else if( i_val == -1 ) p_sys->p_context->skip_idct = AVDISCARD_NONE;
    else p_sys->p_context->skip_idct = AVDISCARD_DEFAULT;
331
    p_sys->i_skip_idct = p_sys->p_context->skip_idct;
332

333
    /* ***** libavcodec direct rendering ***** */
334
    p_sys->b_direct_rendering = false;
335
    p_sys->i_direct_rendering_used = -1;
336
    if( var_CreateGetBool( p_dec, "avcodec-dr" ) &&
337
       (p_sys->p_codec->capabilities & CODEC_CAP_DR1) &&
338
        /* No idea why ... but this fixes flickering on some TSCC streams */
339 340
        p_sys->i_codec_id != AV_CODEC_ID_TSCC && p_sys->i_codec_id != AV_CODEC_ID_CSCD &&
        p_sys->i_codec_id != AV_CODEC_ID_CINEPAK &&
341 342 343 344
        !p_sys->p_context->debug_mv )
    {
        /* Some codecs set pix_fmt only after the 1st frame has been decoded,
         * so we need to do another check in ffmpeg_GetFrameBuf() */
345
        p_sys->b_direct_rendering = true;
346 347
    }

348
    /* libavcodec doesn't properly release old pictures when frames are skipped */
349
    //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = false;
350 351
    if( p_sys->b_direct_rendering )
    {
352
        msg_Dbg( p_dec, "trying to use direct rendering" );
353 354
        p_sys->p_context->flags |= CODEC_FLAG_EMU_EDGE;
    }
355 356 357 358
    else
    {
        msg_Dbg( p_dec, "direct rendering is disabled" );
    }
359

360
    p_sys->p_context->get_format = ffmpeg_GetFormat;
361 362
    /* Always use our get_buffer wrapper so we can calculate the
     * PTS correctly */
363 364 365
#if LIBAVCODEC_VERSION_MAJOR >= 55
    p_sys->p_context->get_buffer2 = lavc_GetFrame;
#else
366
    p_sys->p_context->get_buffer = ffmpeg_GetFrameBuf;
367
    p_sys->p_context->reget_buffer = avcodec_default_reget_buffer;
368
    p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf;
369
#endif
370 371
    p_sys->p_context->opaque = p_dec;

Laurent Aimar's avatar
Laurent Aimar committed
372
#ifdef HAVE_AVCODEC_MT
373
    int i_thread_count = var_InheritInteger( p_dec, "avcodec-threads" );
Laurent Aimar's avatar
Laurent Aimar committed
374
    if( i_thread_count <= 0 )
375
    {
Laurent Aimar's avatar
Laurent Aimar committed
376
        i_thread_count = vlc_GetCPUCount();
377 378
        if( i_thread_count > 1 )
            i_thread_count++;
379 380 381

        //FIXME: take in count the decoding time
        i_thread_count = __MIN( i_thread_count, 4 );
382
    }
383
    i_thread_count = __MIN( i_thread_count, 16 );
384 385
    msg_Dbg( p_dec, "allowing %d thread(s) for decoding", i_thread_count );
    p_sys->p_context->thread_count = i_thread_count;
386
    p_sys->p_context->thread_safe_callbacks = true;
387

388
    switch( i_codec_id )
Laurent Aimar's avatar
Laurent Aimar committed
389
    {
390 391 392 393 394 395 396 397
        case AV_CODEC_ID_MPEG4:
        case AV_CODEC_ID_H263:
            p_sys->p_context->thread_type = 0;
            break;
        case AV_CODEC_ID_MPEG1VIDEO:
        case AV_CODEC_ID_MPEG2VIDEO:
            p_sys->p_context->thread_type &= ~FF_THREAD_SLICE;
            /* fall through */
398
# if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 1, 0))
399 400 401
        case AV_CODEC_ID_H264:
        case AV_CODEC_ID_VC1:
        case AV_CODEC_ID_WMV3:
402
            p_sys->p_context->thread_type &= ~FF_THREAD_FRAME;
403
# endif
404
    }
405

406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
    /* Workaround: frame multithreading is not compatible with
     * DXVA2. When a frame is being copied to host memory, the frame
     * is locked and cannot be used as a reference frame
     * simultaneously and thus decoding fails for some frames. This
     * causes major image corruption. */
# if defined(_WIN32)
    char *avcodec_hw = var_InheritString( p_dec, "avcodec-hw" );
    if( avcodec_hw == NULL || strcasecmp( avcodec_hw, "none" ) )
    {
        msg_Warn( p_dec, "threaded frame decoding is not compatible with DXVA2, disabled" );
        p_sys->p_context->thread_type &= ~FF_THREAD_FRAME;
    }
    free( avcodec_hw );
# endif

421 422 423 424
    if( p_sys->p_context->thread_type & FF_THREAD_FRAME )
        p_dec->i_extra_picture_buffers = 2 * p_sys->p_context->thread_count;
#endif

425
    /* ***** misc init ***** */
426
    p_sys->i_pts = VLC_TS_INVALID;
427 428
    p_sys->b_has_b_frames = false;
    p_sys->b_first_frame = true;
429
    p_sys->b_flush = false;
430 431 432 433
    p_sys->i_late_frames = 0;

    /* Set output properties */
    p_dec->fmt_out.i_cat = VIDEO_ES;
434 435
    if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) != VLC_SUCCESS )
    {
436
        /* we are doomed. but not really, because most codecs set their pix_fmt later on */
437
        p_dec->fmt_out.i_codec = VLC_CODEC_I420;
438 439
    }
    p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
440

441 442
    p_dec->fmt_out.video.orientation = p_dec->fmt_in.video.orientation;

443 444 445 446 447 448 449
    if( p_dec->fmt_in.video.p_palette ) {
        p_sys->palette_sent = false;
        p_dec->fmt_out.video.p_palette = malloc( sizeof(video_palette_t) );
        if( p_dec->fmt_out.video.p_palette )
            *p_dec->fmt_out.video.p_palette = *p_dec->fmt_in.video.p_palette;
    } else
        p_sys->palette_sent = true;
450

451 452 453
    /* ***** init this codec with special data ***** */
    ffmpeg_InitCodec( p_dec );

454
    /* ***** Open the codec ***** */
455
    if( OpenVideoCodec( p_dec ) < 0 )
456
    {
457
        avcodec_free_frame( &p_sys->p_ff_pic );
Laurent Aimar's avatar
Laurent Aimar committed
458
        vlc_sem_destroy( &p_sys->sem_mt );
459 460 461 462
        free( p_sys );
        return VLC_EGENERIC;
    }

463
    p_dec->pf_decode_video = DecodeVideo;
464 465 466 467 468 469
    return VLC_SUCCESS;
}

/*****************************************************************************
 * DecodeVideo: Called to decode one or more frames
 *****************************************************************************/
470
static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
471 472
{
    decoder_sys_t *p_sys = p_dec->p_sys;
473
    AVCodecContext *p_context = p_sys->p_context;
474 475 476
    int b_drawpicture;
    block_t *p_block;

477
    if( !pp_block )
478
        return NULL;
479

480
    if( !p_context->extradata_size && p_dec->fmt_in.i_extra )
481
    {
482
        ffmpeg_InitCodec( p_dec );
483
        if( p_sys->b_delayed_open )
484
            OpenVideoCodec( p_dec );
485
    }
486

487
    p_block = *pp_block;
488 489 490
    if(!p_block && !(p_sys->p_codec->capabilities & CODEC_CAP_DELAY) )
        return NULL;

491 492
    if( p_sys->b_delayed_open )
    {
493 494
        if( p_block )
            block_Release( p_block );
495 496
        return NULL;
    }
497

498
    if( p_block)
499
    {
500 501 502
        if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
        {
            p_sys->i_pts = VLC_TS_INVALID; /* To make sure we recover properly */
503

504
            p_sys->i_late_frames = 0;
505

506 507 508 509
            post_mt( p_sys );
            if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
                avcodec_flush_buffers( p_context );
            wait_mt( p_sys );
Laurent Aimar's avatar
Laurent Aimar committed
510

511 512 513
            block_Release( p_block );
            return NULL;
        }
514

515 516 517 518 519 520 521
        if( p_block->i_flags & BLOCK_FLAG_PREROLL )
        {
            /* Do not care about late frames when prerolling
             * TODO avoid decoding of non reference frame
             * (ie all B except for H264 where it depends only on nal_ref_idc) */
            p_sys->i_late_frames = 0;
        }
522 523
    }

524
    if( !p_dec->b_pace_control && (p_sys->i_late_frames > 0) &&
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
525
        (mdate() - p_sys->i_late_frames_start > INT64_C(5000000)) )
526
    {
527
        if( p_sys->i_pts > VLC_TS_INVALID )
528
        {
529
            p_sys->i_pts = VLC_TS_INVALID; /* To make sure we recover properly */
530
        }
531 532
        if( p_block )
            block_Release( p_block );
533
        p_sys->i_late_frames--;
534 535
        msg_Err( p_dec, "more than 5 seconds of late video -> "
                 "dropping frame (computer too slow ?)" );
536 537 538 539 540
        return NULL;
    }

    /* A good idea could be to decode all I pictures and see for the other */
    if( !p_dec->b_pace_control &&
541 542
        p_sys->b_hurry_up &&
        (p_sys->i_late_frames > 4) )
543 544
    {
        b_drawpicture = 0;
545
        if( p_sys->i_late_frames < 12 )
546
        {
547
            p_context->skip_frame =
548 549
                    (p_sys->i_skip_frame <= AVDISCARD_NONREF) ?
                    AVDISCARD_NONREF : p_sys->i_skip_frame;
550 551 552 553 554 555
        }
        else
        {
            /* picture too late, won't decode
             * but break picture until a new I, and for mpeg4 ...*/
            p_sys->i_late_frames--; /* needed else it will never be decrease */
556 557
            if( p_block )
                block_Release( p_block );
558
            msg_Warn( p_dec, "More than 4 late frames, dropping frame" );
559 560 561 562 563
            return NULL;
        }
    }
    else
    {
564
        if( p_sys->b_hurry_up )
565
            p_context->skip_frame = p_sys->i_skip_frame;
566
        if( !p_block || !(p_block->i_flags & BLOCK_FLAG_PREROLL) )
567 568 569 570 571
            b_drawpicture = 1;
        else
            b_drawpicture = 0;
    }

572
    if( p_context->width <= 0 || p_context->height <= 0 )
573
    {
574
        if( p_sys->b_hurry_up )
575
            p_context->skip_frame = p_sys->i_skip_frame;
576
    }
Laurent Aimar's avatar
Laurent Aimar committed
577 578
    else if( !b_drawpicture )
    {
579 580 581
        /* It creates broken picture
         * FIXME either our parser or ffmpeg is broken */
#if 0
582
        if( p_sys->b_hurry_up )
583
            p_context->skip_frame = __MAX( p_context->skip_frame,
584
                                                  AVDISCARD_NONREF );
585
#endif
Laurent Aimar's avatar
Laurent Aimar committed
586
    }
587 588

    /*
589
     * Do the actual decoding now */
590

591
    /* Don't forget that libavcodec requires a little more bytes
592
     * that the real frame size */
593
    if( p_block && p_block->i_buffer > 0 )
594
    {
595 596
        p_sys->b_flush = ( p_block->i_flags & BLOCK_FLAG_END_OF_SEQUENCE ) != 0;

597 598 599
        p_block = block_Realloc( p_block, 0,
                            p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
        if( !p_block )
ivoire's avatar
ivoire committed
600
            return NULL;
601
        p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
602
        *pp_block = p_block;
603
        memset( p_block->p_buffer + p_block->i_buffer, 0,
604 605 606
                FF_INPUT_BUFFER_PADDING_SIZE );
    }

607
    while( !p_block || p_block->i_buffer > 0 || p_sys->b_flush )
608 609 610
    {
        int i_used, b_gotpicture;
        picture_t *p_pic;
611
        AVPacket pkt;
612

Laurent Aimar's avatar
Laurent Aimar committed
613
        post_mt( p_sys );
614

615
        av_init_packet( &pkt );
616 617 618 619 620 621 622 623 624 625 626 627 628
        if( p_block )
        {
            pkt.data = p_block->p_buffer;
            pkt.size = p_block->i_buffer;
            pkt.pts = p_block->i_pts;
            pkt.dts = p_block->i_dts;
        }
        else
        {
            /* Return delayed frames if codec has CODEC_CAP_DELAY */
            pkt.data = NULL;
            pkt.size = 0;
        }
629

630 631 632 633 634 635 636 637 638
        if( !p_sys->palette_sent )
        {
            uint8_t *pal = av_packet_new_side_data(&pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE);
            if (pal) {
                memcpy(pal, p_dec->fmt_in.video.p_palette->palette, AVPALETTE_SIZE);
                p_sys->palette_sent = true;
            }
        }

639
        /* Make sure we don't reuse the same timestamps twice */
640 641 642 643 644
        if( p_block )
        {
            p_block->i_pts =
            p_block->i_dts = VLC_TS_INVALID;
        }
645

646 647
        i_used = avcodec_decode_video2( p_context, p_sys->p_ff_pic,
                                       &b_gotpicture, &pkt );
ssbssa's avatar
ssbssa committed
648
        av_free_packet( &pkt );
649

Laurent Aimar's avatar
Laurent Aimar committed
650
        wait_mt( p_sys );
651

652 653 654
        if( p_sys->b_flush )
            p_sys->b_first_frame = true;

655
        if( p_block )
656
        {
657 658
            if( p_block->i_buffer <= 0 )
                p_sys->b_flush = false;
659

660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
            if( i_used < 0 )
            {
                if( b_drawpicture )
                    msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
                            p_block->i_buffer );
                block_Release( p_block );
                return NULL;
            }
            else if( (unsigned)i_used > p_block->i_buffer ||
                    p_context->thread_count > 1 )
            {
                i_used = p_block->i_buffer;
            }

            /* Consumed bytes */
            p_block->i_buffer -= i_used;
            p_block->p_buffer += i_used;
        }
678 679 680 681 682 683 684 685

        /* Nothing to display */
        if( !b_gotpicture )
        {
            if( i_used == 0 ) break;
            continue;
        }

686
        /* Sanity check (seems to be needed for some streams) */
687
        if( p_sys->p_ff_pic->pict_type == AV_PICTURE_TYPE_B)
688 689 690 691
        {
            p_sys->b_has_b_frames = true;
        }

692
        /* Compute the PTS */
693 694 695 696 697
        mtime_t i_pts =
                    p_sys->p_ff_pic->pkt_pts;
        if (i_pts <= VLC_TS_INVALID)
            i_pts = p_sys->p_ff_pic->pkt_dts;

698 699 700 701 702 703 704 705 706 707 708 709
        if( i_pts <= VLC_TS_INVALID )
            i_pts = p_sys->i_pts;

        /* Interpolate the next PTS */
        if( i_pts > VLC_TS_INVALID )
            p_sys->i_pts = i_pts;
        if( p_sys->i_pts > VLC_TS_INVALID )
        {
            /* interpolate the next PTS */
            if( p_dec->fmt_in.video.i_frame_rate > 0 &&
                p_dec->fmt_in.video.i_frame_rate_base > 0 )
            {
710
                p_sys->i_pts += CLOCK_FREQ *
711 712 713 714 715 716 717 718 719 720
                    (2 + p_sys->p_ff_pic->repeat_pict) *
                    p_dec->fmt_in.video.i_frame_rate_base /
                    (2 * p_dec->fmt_in.video.i_frame_rate);
            }
            else if( p_context->time_base.den > 0 )
            {
                int i_tick = p_context->ticks_per_frame;
                if( i_tick <= 0 )
                    i_tick = 1;

721
                p_sys->i_pts += CLOCK_FREQ *
722 723 724 725 726
                    (2 + p_sys->p_ff_pic->repeat_pict) *
                    i_tick * p_context->time_base.num /
                    (2 * p_context->time_base.den);
            }
        }
727

728
        /* Update frame late count (except when doing preroll) */
729
        mtime_t i_display_date = 0;
730
        if( !p_block || !(p_block->i_flags & BLOCK_FLAG_PREROLL) )
731
            i_display_date = decoder_GetDisplayDate( p_dec, i_pts );
732

733
        if( i_display_date > 0 && i_display_date <= mdate() )
734 735 736 737 738 739 740 741 742 743
        {
            p_sys->i_late_frames++;
            if( p_sys->i_late_frames == 1 )
                p_sys->i_late_frames_start = mdate();
        }
        else
        {
            p_sys->i_late_frames = 0;
        }

744
        if( !b_drawpicture || ( !p_sys->p_va && !p_sys->p_ff_pic->linesize[0] ) )
745 746
            continue;

747
        if( p_sys->p_va != NULL || p_sys->p_ff_pic->opaque == NULL )
748 749
        {
            /* Get a new picture */
750
            p_pic = ffmpeg_NewPictBuf( p_dec, p_context );
751 752
            if( !p_pic )
            {
753 754
                if( p_block )
                    block_Release( p_block );
755 756 757 758 759 760 761 762 763 764
                return NULL;
            }

            /* Fill p_picture_t from AVVideoFrame and do chroma conversion
             * if needed */
            ffmpeg_CopyPicture( p_dec, p_pic, p_sys->p_ff_pic );
        }
        else
        {
            p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
765
            decoder_LinkPicture( p_dec, p_pic );
766 767
        }

Laurent Aimar's avatar
Laurent Aimar committed
768
        if( !p_dec->fmt_in.video.i_sar_num || !p_dec->fmt_in.video.i_sar_den )
769 770
        {
            /* Fetch again the aspect ratio in case it changed */
771
            p_dec->fmt_out.video.i_sar_num
772
                = p_context->sample_aspect_ratio.num;
773
            p_dec->fmt_out.video.i_sar_den
774
                = p_context->sample_aspect_ratio.den;
775

Laurent Aimar's avatar
Laurent Aimar committed
776
            if( !p_dec->fmt_out.video.i_sar_num || !p_dec->fmt_out.video.i_sar_den )
777
            {
Laurent Aimar's avatar
Laurent Aimar committed
778 779
                p_dec->fmt_out.video.i_sar_num = 1;
                p_dec->fmt_out.video.i_sar_den = 1;
780 781 782
            }
        }

783
        /* Send decoded frame to vout */
784
        if( i_pts > VLC_TS_INVALID)
785
        {
786
            p_pic->date = i_pts;
787 788 789 790

            if( p_sys->b_first_frame )
            {
                /* Hack to force display of still pictures */
791 792
                p_sys->b_first_frame = false;
                p_pic->b_force = true;
793 794 795 796 797 798 799 800 801 802
            }

            p_pic->i_nb_fields = 2 + p_sys->p_ff_pic->repeat_pict;
            p_pic->b_progressive = !p_sys->p_ff_pic->interlaced_frame;
            p_pic->b_top_field_first = p_sys->p_ff_pic->top_field_first;

            return p_pic;
        }
        else
        {
803
            decoder_DeletePicture( p_dec, p_pic );
804 805 806
        }
    }

807 808
    if( p_block )
        block_Release( p_block );
809 810 811 812 813 814
    return NULL;
}

/*****************************************************************************
 * EndVideo: decoder destruction
 *****************************************************************************
815
 * This function is called when the thread ends after a successful
816 817
 * initialization.
 *****************************************************************************/
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
818
void EndVideoDec( decoder_t *p_dec )
819 820 821
{
    decoder_sys_t *p_sys = p_dec->p_sys;

Laurent Aimar's avatar
Laurent Aimar committed
822 823
    post_mt( p_sys );

824 825 826
    /* do not flush buffers if codec hasn't been opened (theora/vorbis/VC1) */
    if( p_sys->p_context->codec )
        avcodec_flush_buffers( p_sys->p_context );
827

Laurent Aimar's avatar
Laurent Aimar committed
828 829
    wait_mt( p_sys );

830
    if( p_sys->p_ff_pic )
831
        avcodec_free_frame( &p_sys->p_ff_pic );
832 833

    if( p_sys->p_va )
834
        vlc_va_Delete( p_sys->p_va );
835

Laurent Aimar's avatar
Laurent Aimar committed
836
    vlc_sem_destroy( &p_sys->sem_mt );
837 838
}

839 840 841 842 843 844 845 846 847 848
/*****************************************************************************
 * ffmpeg_InitCodec: setup codec extra initialization data for ffmpeg
 *****************************************************************************/
static void ffmpeg_InitCodec( decoder_t *p_dec )
{
    decoder_sys_t *p_sys = p_dec->p_sys;
    int i_size = p_dec->fmt_in.i_extra;

    if( !i_size ) return;

849
    if( p_sys->i_codec_id == AV_CODEC_ID_SVQ3 )
850 851 852 853
    {
        uint8_t *p;

        p_sys->p_context->extradata_size = i_size + 12;
854 855 856
        p = p_sys->p_context->extradata =
            av_malloc( p_sys->p_context->extradata_size +
                       FF_INPUT_BUFFER_PADDING_SIZE );
ivoire's avatar
ivoire committed
857 858
        if( !p )
            return;
859 860 861 862 863 864 865

        memcpy( &p[0],  "SVQ3", 4 );
        memset( &p[4], 0, 8 );
        memcpy( &p[12], p_dec->fmt_in.p_extra, i_size );

        /* Now remove all atoms before the SMI one */
        if( p_sys->p_context->extradata_size > 0x5a &&
866
            strncmp( (char*)&p[0x56], "SMI ", 4 ) )