ffmpeg.c 20.2 KB
Newer Older
1
2
3
4
/*****************************************************************************
 * ffmpeg.c: video decoder using ffmpeg library
 *****************************************************************************
 * Copyright (C) 1999-2001 VideoLAN
5
 * $Id: ffmpeg.c,v 1.35 2003/05/07 15:44:59 fenrir Exp $
6
7
8
9
10
11
12
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
13
 *
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
#include <stdlib.h>                                      /* malloc(), free() */

#include <vlc/vlc.h>
#include <vlc/vout.h>
31
#include <vlc/aout.h>
32
33
34
35
36
37
38
39
40
#include <vlc/decoder.h>
#include <vlc/input.h>

#include <string.h>

#ifdef HAVE_SYS_TIMES_H
#   include <sys/times.h>
#endif

gbazin's avatar
   
gbazin committed
41
42
43
44
45
46
/* ffmpeg header */
#ifdef HAVE_FFMPEG_AVCODEC_H
#   include <ffmpeg/avcodec.h>
#else
#   include <avcodec.h>
#endif
47
48
49
50

#if LIBAVCODEC_BUILD < 4655
#   error You must have a libavcodec >= 4655 (get CVS)
#endif
51
52


53
#include "ffmpeg.h"
54
55

#ifdef LIBAVCODEC_PP
gbazin's avatar
   
gbazin committed
56
#   ifdef HAVE_POSTPROC_POSTPROCESS_H
gbazin's avatar
   
gbazin committed
57
58
59
60
#       include <postproc/postprocess.h>
#   else
#       include <libpostproc/postprocess.h>
#   endif
61
62
63
64
#else
#   include "postprocessing/postprocessing.h"
#endif

65
66
#include "video.h" // video ffmpeg specific
#include "audio.h" // audio ffmpeg specific
67
68
69
70

/*
 * Local prototypes
 */
gbazin's avatar
   
gbazin committed
71
int             E_(OpenChroma)  ( vlc_object_t * );
72
73
static int      OpenDecoder     ( vlc_object_t * );
static int      RunDecoder      ( decoder_fifo_t * );
74
75
76

static int      InitThread      ( generic_thread_t * );
static void     EndThread       ( generic_thread_t * );
77
78
79
80


static int      b_ffmpeginit = 0;

81
82
static int ffmpeg_GetFfmpegCodec( vlc_fourcc_t, int *, int *, char ** );

83
84
85
86
87
/*****************************************************************************
 * Module descriptor
 *****************************************************************************/

#define ERROR_RESILIENCE_LONGTEXT \
88
    "ffmpeg can make errors resiliences.          \n" \
89
90
91
92
93
94
95
96
    "Nevertheless, with buggy encoder (like ISO MPEG-4 encoder from M$) " \
    "this will produce a lot of errors.\n" \
    "Valid range is -1 to 99 (-1 disable all errors resiliences)."

#define HURRY_UP_LONGTEXT \
    "Allow the decoder to partially decode or skip frame(s) " \
    "when there not enough time.\n It's usefull with low CPU power " \
    "but it could produce broken pictures."
97
98
99

#define POSTPROCESSING_Q_LONGTEXT \
    "Quality of post processing\n"\
100
    "Valid range is 0 to 6"
101

102
#define POSTPROCESSING_AQ_LONGTEXT \
103
    "Post processing quality is selected upon time left " \
104
105
106
    "but no more than requested quality\n" \
    "Not yet implemented !"

107
#define WORKAROUND_BUGS_LONGTEXT \
108
109
110
111
112
113
114
115
116
    "Try to fix some bugs\n" \
    "1  autodetect\n" \
    "2  old msmpeg4\n" \
    "4  xvid interlaced\n" \
    "8  ump4 \n" \
    "16 no padding\n" \
    "32 ac vlc" \
    "64 Qpel chroma"

117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* FIXME (cut/past from ffmpeg */
#define LIBAVCODEC_PP_LONGHELP \
"<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n" \
"long form example:\n" \
"vdeblock:autoq/hdeblock:autoq/linblenddeint    default,-vdeblock\n" \
"short form example:\n" \
"vb:a/hb:a/lb                                   de,-vb\n" \
"more examples:\n" \
"tn:64:128:256\n" \
"Filters                        Options\n" \
"short  long name       short   long option     Description\n" \
"*      *               a       autoq           cpu power dependant enabler\n" \
"                       c       chrom           chrominance filtring enabled\n" \
"                       y       nochrom         chrominance filtring disabled\n" \
"hb     hdeblock        (2 Threshold)           horizontal deblocking filter\n" \
"       1. difference factor: default=64, higher -> more deblocking\n" \
"       2. flatness threshold: default=40, lower -> more deblocking\n" \
"                       the h & v deblocking filters share these\n" \
"                       so u cant set different thresholds for h / v\n" \
"vb     vdeblock        (2 Threshold)           vertical deblocking filter\n" \
"h1     x1hdeblock                              Experimental h deblock filter 1\n" \
"v1     x1vdeblock                              Experimental v deblock filter 1\n" \
"dr     dering                                  Deringing filter\n" \
"al     autolevels                              automatic brightness / contrast\n" \
"                       f       fullyrange      stretch luminance to (0..255)\n" \
"lb     linblenddeint                           linear blend deinterlacer\n" \
"li     linipoldeint                            linear interpolating deinterlace\n" \
"ci     cubicipoldeint                          cubic interpolating deinterlacer\n" \
"md     mediandeint                             median deinterlacer\n" \
"fd     ffmpegdeint                             ffmpeg deinterlacer\n" \
"de     default                                 hb:a,vb:a,dr:a,al\n" \
"fa     fast                                    h1:a,v1:a,dr:a,al\n" \
"tn     tmpnoise        (3 Thresholds)          Temporal Noise Reducer\n" \
"                       1. <= 2. <= 3.          larger -> stronger filtering\n" \
"fq     forceQuant      <quantizer>             Force quantizer\n"

153
vlc_module_begin();
154
    add_category_hint( N_("ffmpeg"), NULL, VLC_FALSE );
gbazin's avatar
   
gbazin committed
155
156
157
158
    set_capability( "decoder", 70 );
    set_callbacks( OpenDecoder, NULL );
    set_description( _("ffmpeg audio/video decoder((MS)MPEG4,SVQ1,H263,WMV,WMA)") );

159
    add_bool( "ffmpeg-dr", 0, NULL,
160
              "direct rendering",
161
              "direct rendering", VLC_TRUE );
162
    add_integer ( "ffmpeg-error-resilience", -1, NULL,
163
                  "error resilience", ERROR_RESILIENCE_LONGTEXT, VLC_TRUE );
164
    add_integer ( "ffmpeg-workaround-bugs", 1, NULL,
165
166
                  "workaround bugs", WORKAROUND_BUGS_LONGTEXT, VLC_FALSE );
    add_bool( "ffmpeg-hurry-up", 0, NULL, "hurry up", HURRY_UP_LONGTEXT, VLC_FALSE );
167
    add_integer( "ffmpeg-truncated", -1, NULL, "truncated stream", "truncated stream -1:auto,0:disable,:1:enable", VLC_FALSE );
168
    add_category_hint( N_("Post processing"), NULL, VLC_FALSE );
169

170
    add_integer( "ffmpeg-pp-q", 0, NULL,
171
                 "post processing quality", POSTPROCESSING_Q_LONGTEXT, VLC_FALSE );
172
173
174
175
176
177
#ifdef LIBAVCODEC_PP
    add_string( "ffmpeg-pp-name", "default", NULL,
                "ffmpeg postproc filter chains", LIBAVCODEC_PP_LONGHELP, VLC_TRUE );
#else
    add_module( "ffmpeg-pp", "postprocessing",NULL, NULL,
                N_( "ffmpeg postprocessing module" ), NULL, VLC_FALSE );
178
    add_bool( "ffmpeg-pp-auto", 0, NULL,
179
              "auto-level Post processing quality", POSTPROCESSING_AQ_LONGTEXT, VLC_FALSE );
180
181
    add_bool( "ffmpeg-db-yv", 0, NULL,
              "force vertical luminance deblocking",
182
              "force vertical luminance deblocking (override other settings)", VLC_TRUE );
183
    add_bool( "ffmpeg-db-yh", 0, NULL,
184
              "force horizontal luminance deblocking",
185
              "force horizontal luminance deblocking (override other settings)", VLC_TRUE );
186
    add_bool( "ffmpeg-db-cv", 0, NULL,
187
              "force vertical chrominance deblocking",
188
              "force vertical chrominance deblocking (override other settings)", VLC_TRUE );
189
    add_bool( "ffmpeg-db-ch", 0, NULL,
190
              "force horizontal chrominance deblocking",
191
              "force horizontal chrominance deblocking (override other settings) ", VLC_TRUE );
192
193
    add_bool( "ffmpeg-dr-y", 0, NULL,
              "force luminance deringing",
194
              "force luminance deringing (override other settings)", VLC_TRUE );
195
196
    add_bool( "ffmpeg-dr-c", 0, NULL,
              "force chrominance deringing",
197
              "force chrominance deringing (override other settings)", VLC_TRUE );
198
#endif
gbazin's avatar
   
gbazin committed
199
200
201
202
203
204
205

    /* chroma conversion submodule */
    add_submodule();
    set_capability( "chroma", 50 );
    set_callbacks( E_(OpenChroma), NULL );
    set_description( _("ffmpeg chroma conversion") );

206
207
208
209
210
vlc_module_end();

/*****************************************************************************
 * OpenDecoder: probe the decoder and return score
 *****************************************************************************
211
 * Tries to launch a decoder and return score so that the interface is able
212
213
214
215
216
217
 * to chose.
 *****************************************************************************/
static int OpenDecoder( vlc_object_t *p_this )
{
    decoder_fifo_t *p_fifo = (decoder_fifo_t*) p_this;

218
    if( ffmpeg_GetFfmpegCodec( p_fifo->i_fourcc, NULL, NULL, NULL ) )
219
220
221
222
223
224
225
226
    {
        p_fifo->pf_run = RunDecoder;
        return VLC_SUCCESS;
    }

    return VLC_EGENERIC;
}

227
228
229
230
231
232
233
234
235
typedef union decoder_thread_u
{
    generic_thread_t gen;
    adec_thread_t    audio;
    vdec_thread_t    video;

} decoder_thread_t;


236
237
238
239
240
/*****************************************************************************
 * RunDecoder: this function is called just after the thread is created
 *****************************************************************************/
static int RunDecoder( decoder_fifo_t *p_fifo )
{
241
    generic_thread_t *p_decoder;
242
243
    int b_error;

244
    if ( !(p_decoder = malloc( sizeof( decoder_thread_t ) ) ) )
245
246
247
248
249
    {
        msg_Err( p_fifo, "out of memory" );
        DecoderError( p_fifo );
        return( -1 );
    }
250
    memset( p_decoder, 0, sizeof( decoder_thread_t ) );
251

252
    p_decoder->p_fifo = p_fifo;
253

254
    if( InitThread( p_decoder ) != 0 )
255
    {
256
        msg_Err( p_fifo, "initialization failed" );
257
258
259
        DecoderError( p_fifo );
        return( -1 );
    }
260

261
    while( (!p_decoder->p_fifo->b_die) && (!p_decoder->p_fifo->b_error) )
262
    {
263
264
265
266
267
268
269
270
271
        switch( p_decoder->i_cat )
        {
            case VIDEO_ES:
                E_( DecodeThread_Video )( (vdec_thread_t*)p_decoder );
                break;
            case AUDIO_ES:
                E_( DecodeThread_Audio )( (adec_thread_t*)p_decoder );
                break;
        }
272
273
    }

274
    if( ( b_error = p_decoder->p_fifo->b_error ) )
275
    {
276
        DecoderError( p_decoder->p_fifo );
277
278
    }

279
    EndThread( p_decoder );
280
281
282
283
284

    if( b_error )
    {
        return( -1 );
    }
285

286
    return( 0 );
287
}
288
289
290
291
292
293
294
295
296
297

/*****************************************************************************
 *
 * Functions that initialize, decode and end the decoding process
 *
 *****************************************************************************/

/*****************************************************************************
 * InitThread: initialize vdec output thread
 *****************************************************************************
298
299
 * This function is called from decoder_Run and performs the second step
 * of the initialization. It returns 0 on success. Note that the thread's
300
 * flag are not modified inside this function.
301
302
303
 *
 * ffmpeg codec will be open, some memory allocated. But Vout is not yet
 *   open (done after the first decoded frame)
304
 *****************************************************************************/
305
306

static int InitThread( generic_thread_t *p_decoder )
307
{
308
    int i_result;
309

310
     /* *** init ffmpeg library (libavcodec) *** */
311
312
313
314
315
    if( !b_ffmpeginit )
    {
        avcodec_init();
        avcodec_register_all();
        b_ffmpeginit = 1;
316

317
318
        msg_Dbg( p_decoder->p_fifo, "libavcodec initialized (interface "
                                    LIBAVCODEC_BUILD_STR ")" );
319
320
321
    }
    else
    {
322
        msg_Dbg( p_decoder->p_fifo, "libavcodec already initialized" );
323
    }
324

325
326
327
328
329
    /* *** determine codec type *** */
    ffmpeg_GetFfmpegCodec( p_decoder->p_fifo->i_fourcc,
                           &p_decoder->i_cat,
                           &p_decoder->i_codec_id,
                           &p_decoder->psz_namecodec );
330

331
    /* *** ask ffmpeg for a decoder *** */
332
    if( !( p_decoder->p_codec =
333
                avcodec_find_decoder( p_decoder->i_codec_id ) ) )
334
    {
335
        msg_Err( p_decoder->p_fifo,
336
337
                 "codec not found (%s)",
                 p_decoder->psz_namecodec );
338
339
340
        return( -1 );
    }

341
342
     /* *** Get a p_context *** */
    p_decoder->p_context = avcodec_alloc_context();
343

344
    switch( p_decoder->i_cat )
345
    {
346
347
348
349
350
351
352
353
        case VIDEO_ES:
            i_result = E_( InitThread_Video )( (vdec_thread_t*)p_decoder );
            break;
        case AUDIO_ES:
            i_result = E_( InitThread_Audio )( (adec_thread_t*)p_decoder );
            break;
        default:
            i_result = -1;
354
    }
355

356
    p_decoder->pts = 0;
357
358
359
360
    p_decoder->p_buffer = NULL;
    p_decoder->i_buffer = 0;
    p_decoder->i_buffer_size = 0;

361
362
    return( i_result );
}
363

364
365
366
367
368
369
370
371
/*****************************************************************************
 * EndThread: thread destruction
 *****************************************************************************
 * This function is called when the thread ends after a sucessful
 * initialization.
 *****************************************************************************/
static void EndThread( generic_thread_t *p_decoder )
{
372

373
    if( !p_decoder )
374
    {
375
        return;
376
    }
377

378
    if( p_decoder->p_context != NULL)
379
    {
380
381
        FREE( p_decoder->p_context->extradata );
        avcodec_close( p_decoder->p_context );
382
        msg_Dbg( p_decoder->p_fifo,
383
384
385
                 "ffmpeg codec (%s) stopped",
                 p_decoder->psz_namecodec );
        free( p_decoder->p_context );
386
387
    }

388
    FREE( p_decoder->p_buffer );
389

390
    switch( p_decoder->i_cat )
391
    {
392
393
394
395
396
397
        case AUDIO_ES:
            E_( EndThread_Audio )( (adec_thread_t*)p_decoder );
            break;
        case VIDEO_ES:
            E_( EndThread_Video )( (vdec_thread_t*)p_decoder );
            break;
398
    }
399

400
    free( p_decoder );
401
402
403
}

/*****************************************************************************
404
 * locales Functions
405
 *****************************************************************************/
406

407
int E_( GetPESData )( u8 *p_buf, int i_max, pes_packet_t *p_pes )
408
409
{
    int i_copy;
410
    int i_count;
411

412
    data_packet_t   *p_data;
413

414
415
416
    i_count = 0;
    p_data = p_pes->p_first;
    while( p_data != NULL && i_count < i_max )
417
418
    {

419
        i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
420
421
422
                        i_max - i_count );

        if( i_copy > 0 )
423
        {
424
425
426
            memcpy( p_buf,
                    p_data->p_payload_start,
                    i_copy );
427
        }
428
429
430
431

        p_data = p_data->p_next;
        i_count += i_copy;
        p_buf   += i_copy;
432
433
    }

434
    if( i_count < i_max )
435
    {
436
        memset( p_buf, 0, i_max - i_count );
437
    }
438
    return( i_count );
439
440
441
}


442
443
444
445
static int ffmpeg_GetFfmpegCodec( vlc_fourcc_t i_fourcc,
                                  int *pi_cat,
                                  int *pi_ffmpeg_codec,
                                  char **ppsz_name )
446
{
447
448
449
450
451
452
    int i_cat;
    int i_codec;
    char *psz_name;

    switch( i_fourcc )
    {
453
454
455
456
457
458
459
460
#if 0
        /* XXX don't use it */
        case FOURCC_mpgv:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MPEG1VIDEO;
            psz_name = "MPEG-1/2 Video";
            break;
#endif
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
        case FOURCC_DIV1:
        case FOURCC_div1:
        case FOURCC_MPG4:
        case FOURCC_mpg4:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MSMPEG4V1;
            psz_name = "MS MPEG-4 v1";
            break;

        case FOURCC_DIV2:
        case FOURCC_div2:
        case FOURCC_MP42:
        case FOURCC_mp42:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MSMPEG4V2;
            psz_name = "MS MPEG-4 v2";
            break;

        case FOURCC_MPG3:
        case FOURCC_mpg3:
        case FOURCC_div3:
        case FOURCC_MP43:
        case FOURCC_mp43:
        case FOURCC_DIV3:
        case FOURCC_DIV4:
        case FOURCC_div4:
        case FOURCC_DIV5:
        case FOURCC_div5:
        case FOURCC_DIV6:
        case FOURCC_div6:
        case FOURCC_AP41:
492
        case FOURCC_3VID:
493
        case FOURCC_3vid:
494
495
        case FOURCC_3IVD:
        case FOURCC_3ivd:
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MSMPEG4V3;
            psz_name = "MS MPEG-4 v3";
            break;

        case FOURCC_SVQ1:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_SVQ1;
            psz_name = "SVQ-1 (Sorenson Video v1)";
            break;

        case FOURCC_DIVX:
        case FOURCC_divx:
        case FOURCC_MP4S:
        case FOURCC_mp4s:
        case FOURCC_M4S2:
        case FOURCC_m4s2:
        case FOURCC_xvid:
        case FOURCC_XVID:
        case FOURCC_XviD:
        case FOURCC_DX50:
        case FOURCC_mp4v:
        case FOURCC_4:
519
        /* 3iv1 is unsupported by ffmpeg
520
           putting it here gives extreme distorted images
521
522
        case FOURCC_3IV1:
        case FOURCC_3iv1:
523
        */
524
        case FOURCC_3IV2:
525
        case FOURCC_3iv2:
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MPEG4;
            psz_name = "MPEG-4";
            break;
/* FIXME FOURCC_H263P exist but what fourcc ? */
        case FOURCC_H263:
        case FOURCC_h263:
        case FOURCC_U263:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_H263;
            psz_name = "H263";
            break;

        case FOURCC_I263:
        case FOURCC_i263:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_H263I;
            psz_name = "I263.I";
            break;
        case FOURCC_WMV1:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_WMV1;
            psz_name ="Windows Media Video 1";
            break;
        case FOURCC_WMV2:
551
        case FOURCC_MSS1:
552
553
554
555
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_WMV2;
            psz_name ="Windows Media Video 2";
            break;
556
557
558
559
        case FOURCC_MJPG:
        case FOURCC_mjpg:
        case FOURCC_mjpa:
        case FOURCC_jpeg:
560
        case FOURCC_JPEG:
561
562
563
564
565
566
567
568
569
570
        case FOURCC_JFIF:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MJPEG;
            psz_name = "Motion JPEG";
            break;
        case FOURCC_mjpb:
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_MJPEGB;
            psz_name = "Motion JPEG B";
            break;
571
572
573
574
        case FOURCC_dvsl:
        case FOURCC_dvsd:
        case FOURCC_DVSD:
        case FOURCC_dvhd:
gbazin's avatar
   
gbazin committed
575
576
        case FOURCC_dvc:
        case FOURCC_dvp:
577
578
579
580
            i_cat = VIDEO_ES;
            i_codec = CODEC_ID_DVVIDEO;
            psz_name = "DV video";
            break;
581

582
583
584
585
586
587
588
589
590
591
        case FOURCC_MAC3:
            i_cat = AUDIO_ES;
            i_codec = CODEC_ID_MACE3;
            psz_name = "MACE-3 audio";
            break;
        case FOURCC_MAC6:
            i_cat = AUDIO_ES;
            i_codec = CODEC_ID_MACE6;
            psz_name = "MACE-6 audio";
            break;
gbazin's avatar
   
gbazin committed
592
593
594
595
596
597
        case FOURCC_dvau:
            i_cat = AUDIO_ES;
            i_codec = CODEC_ID_DVAUDIO;
            psz_name = "DV audio";
            break;

598
599
600
601
602
603
604
605
606
607
608
609
        case FOURCC_WMA1:
        case FOURCC_wma1:
            i_cat = AUDIO_ES;
            i_codec = CODEC_ID_WMAV1;
            psz_name ="Windows Media Audio 1";
            break;
        case FOURCC_WMA2:
        case FOURCC_wma2:
            i_cat = AUDIO_ES;
            i_codec = CODEC_ID_WMAV2;
            psz_name ="Windows Media Audio 2";
            break;
610
611
612
613
614
615
616
617
618
619
620

#if LIBAVCODEC_BUILD >= 4663
        case FOURCC_IV31:
        case FOURCC_iv31:
        case FOURCC_IV32:
        case FOURCC_iv32:
            i_cat    = VIDEO_ES;
            i_codec  = CODEC_ID_INDEO3;
            psz_name = "Indeo v3";
            break;
#endif
621
622
623
624
625
        default:
            i_cat = UNKNOWN_ES;
            i_codec = CODEC_ID_NONE;
            psz_name = NULL;
            break;
626
627
    }

628
    if( i_codec != CODEC_ID_NONE )
629
    {
630
631
632
633
        if( pi_cat ) *pi_cat = i_cat;
        if( pi_ffmpeg_codec ) *pi_ffmpeg_codec = i_codec;
        if( ppsz_name ) *ppsz_name = psz_name;
        return( VLC_TRUE );
634
635
    }

636
    return( VLC_FALSE );
637
}
638

639
640