Changeset 779340cfa2ce06d7226e037765807edd24942885

Show
Ignore:
Timestamp:
07/03/04 23:34:22 (5 years ago)
Author:
Gildas Bazin <gbazin@videolan.org>
git-committer:
Gildas Bazin <gbazin@videolan.org> 1078698862 +0000
git-parent:

[5c5ee97934a5f33c53aa5f2f83f2d984aa638d81]

git-author:
Gildas Bazin <gbazin@videolan.org> 1078698862 +0000
Message:

* include/vlc_es.h: added b_packetized field to es_format_t to tell a decoder if the input elementary stream will be fed in complete frames.
* include/vlc_codec.h: added a b_need_packetized field to decoder_t that is used by a decoder to tell if it wants to be fed complete frames.
* modules/demux/ts.c, modules/demux/ps.h, src/input/input_programs.c: b_packetized = VLC_FALSE.
* modules/codec/ffmpeg/ffmpeg.c, modules/codec/faad.c: b_need_packetized = VLC_TRUE;
* src/input/input_dec.c: if (b_need_packetized & !b_packetized) then kick off a packetizer that we'll use to feed the decoder.
* src/input/es_out.c: removed useless stuff.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • include/vlc_codec.h

    r8c816fe r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 1999-2003 VideoLAN 
    5  * $Id: vlc_codec.h,v 1.8 2004/02/20 18:34:28 massiot Exp
     5 * $Id
    66 * 
    77 * Authors: Gildas Bazin <gbazin@netcourrier.com> 
     
    5353    void                ( * pf_decode_sub)   ( decoder_t *, block_t ** ); 
    5454    block_t *           ( * pf_packetize )   ( decoder_t *, block_t ** ); 
     55 
     56    /* Some decoders only accept packetized data (ie. not truncated) */ 
     57    vlc_bool_t          b_need_packetized; 
    5558 
    5659    /* Input format ie from demuxer (XXX: a lot of field could be invalid) */ 
  • include/vlc_es.h

    ra02533c r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 1999-2001 VideoLAN 
    5  * $Id: vlc_es.h,v 1.10 2004/02/07 00:33:08 gbazin Exp
     5 * $Id
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    143143    subs_format_t  subs; 
    144144 
    145     int     i_bitrate; 
    146  
     145    int            i_bitrate; 
     146 
     147    vlc_bool_t     b_packetized; /* wether the data is packetized 
     148                                    (ie. not truncated) */ 
    147149    int     i_extra; 
    148150    void    *p_extra; 
     
    172174    memset( &fmt->subs, 0, sizeof(subs_format_t) ); 
    173175 
     176    fmt->b_packetized           = VLC_TRUE; 
    174177    fmt->i_bitrate              = 0; 
    175178    fmt->i_extra                = 0; 
     
    186189    if( src->i_extra > 0 ) 
    187190    { 
     191        dst->i_extra = src->i_extra; 
    188192        dst->p_extra = malloc( src->i_extra ); 
    189         memcpy( dst->p_extra, src->p_extra, 
    190                 src->i_extra ); 
     193        memcpy( dst->p_extra, src->p_extra, src->i_extra ); 
    191194    } 
    192195    else 
  • modules/codec/faad.c

    rde81c25 r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 2001, 2003 VideoLAN 
    5  * $Id: faad.c,v 1.14 2004/02/25 17:48:52 fenrir Exp
     5 * $Id
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    162162    p_sys->p_buffer = 0; 
    163163 
     164    /* Faad2 can't deal with truncated data (eg. from MPEG TS) */ 
     165    p_dec->b_need_packetized = VLC_TRUE; 
     166 
    164167    return VLC_SUCCESS; 
    165168} 
  • modules/codec/ffmpeg/ffmpeg.c

    r133d08f r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 1999-2001 VideoLAN 
    5  * $Id: ffmpeg.c,v 1.80 2004/01/26 18:57:18 gbazin Exp
     5 * $Id
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    181181    { 
    182182    case VIDEO_ES: 
     183        p_dec->b_need_packetized = VLC_TRUE; 
    183184        p_dec->pf_decode_video = E_(DecodeVideo); 
    184185        i_result = E_( InitVideoDec )( p_dec, p_context, p_codec, 
  • modules/demux/ps.h

    r1570d3b r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 2004 VideoLAN 
    5  * $Id: ps.h,v 1.5 2004/01/30 01:09:24 fenrir Exp
     5 * $Id
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    102102        } 
    103103    } 
     104 
     105    /* PES packets usually contain truncated frames */ 
     106    tk->fmt.b_packetized = VLC_FALSE; 
     107 
    104108    return VLC_SUCCESS; 
    105109} 
  • modules/demux/ts.c

    rb72b93e r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 2004 VideoLAN 
    5  * $Id: ts.c,v 1.13 2004/03/03 01:26:49 fenrir Exp
     5 * $Id
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    11481148            break; 
    11491149    } 
     1150 
     1151    /* PES packets usually contain truncated frames */ 
     1152    fmt->b_packetized = VLC_FALSE; 
    11501153 
    11511154    return fmt->i_cat == UNKNOWN_ES ? VLC_EGENERIC : VLC_SUCCESS ; 
  • src/input/es_out.c

    rb99b127 r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 2003-2004 VideoLAN 
    5  * $Id: es_out.c,v 1.25 2004/01/31 20:21:47 fenrir Exp
     5 * $Id
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    332332    switch( fmt->i_cat ) 
    333333    { 
    334         case AUDIO_ES: 
    335         { 
    336             WAVEFORMATEX *p_wf = 
    337                 malloc( sizeof( WAVEFORMATEX ) + fmt->i_extra); 
    338  
    339             p_wf->wFormatTag        = WAVE_FORMAT_UNKNOWN; 
    340             p_wf->nChannels         = fmt->audio.i_channels; 
    341             p_wf->nSamplesPerSec    = fmt->audio.i_rate; 
    342             p_wf->nAvgBytesPerSec   = fmt->i_bitrate / 8; 
    343             p_wf->nBlockAlign       = fmt->audio.i_blockalign; 
    344             p_wf->wBitsPerSample    = fmt->audio.i_bitspersample; 
    345             p_wf->cbSize            = fmt->i_extra; 
    346             if( fmt->i_extra > 0 ) 
    347             { 
    348                 memcpy( &p_wf[1], fmt->p_extra, fmt->i_extra ); 
    349             } 
    350             es->p_es->p_waveformatex = p_wf; 
    351  
    352             es->i_channel = p_sys->i_audio; 
    353             break; 
    354         } 
    355         case VIDEO_ES: 
    356         { 
    357             BITMAPINFOHEADER *p_bih = malloc( sizeof( BITMAPINFOHEADER ) + 
    358                                               fmt->i_extra ); 
    359             p_bih->biSize           = sizeof(BITMAPINFOHEADER) + fmt->i_extra; 
    360             p_bih->biWidth          = fmt->video.i_width; 
    361             p_bih->biHeight         = fmt->video.i_height; 
    362             p_bih->biPlanes         = 1; 
    363             p_bih->biBitCount       = 24; 
    364             p_bih->biCompression    = fmt->i_codec; 
    365             p_bih->biSizeImage      = fmt->video.i_width * 
    366                                           fmt->video.i_height; 
    367             p_bih->biXPelsPerMeter  = 0; 
    368             p_bih->biYPelsPerMeter  = 0; 
    369             p_bih->biClrUsed        = 0; 
    370             p_bih->biClrImportant   = 0; 
    371  
    372             if( fmt->i_extra > 0 ) 
    373             { 
    374                 memcpy( &p_bih[1], fmt->p_extra, fmt->i_extra ); 
    375             } 
    376             es->p_es->p_bitmapinfoheader = p_bih; 
    377  
    378             es->i_channel = p_sys->i_video; 
    379             break; 
    380         } 
    381         case SPU_ES: 
     334    case AUDIO_ES: 
     335        es->i_channel = p_sys->i_audio; 
     336        break; 
     337 
     338    case VIDEO_ES: 
     339        es->i_channel = p_sys->i_video; 
     340        break; 
     341 
     342    case SPU_ES: 
    382343        { 
    383344            subtitle_data_t *p_sub = malloc( sizeof( subtitle_data_t ) ); 
     
    397358        } 
    398359 
    399         default: 
    400             es->i_channel = 0; 
    401             break; 
     360    default: 
     361        es->i_channel = 0; 
     362        break; 
    402363    } 
    403364 
  • src/input/input_dec.c

    r6c95578 r779340c  
    7272    sout_packetizer_input_t *p_sout_input; 
    7373 
     74    /* Some decoders require already packetized data (ie. not truncated) */ 
     75    decoder_t *p_packetizer; 
     76 
    7477    /* Current format in use by the output */ 
    7578    video_format_t video; 
     
    9598decoder_t * input_RunDecoder( input_thread_t * p_input, es_descriptor_t * p_es ) 
    9699{ 
    97     decoder_t      *p_dec = NULL; 
    98     vlc_value_t    val; 
     100    decoder_t   *p_dec = NULL; 
     101    vlc_value_t val; 
    99102 
    100103    /* If we are in sout mode, search for packetizer module */ 
     
    108111            return NULL; 
    109112        } 
    110  
    111         p_dec->p_module = module_Need( p_dec, "packetizer", "$packetizer", 0 ); 
    112113    } 
    113114    else 
     
    120121            return NULL; 
    121122        } 
    122  
    123         /* default Get a suitable decoder module */ 
    124         p_dec->p_module = module_Need( p_dec, "decoder", "$codec", 0 ); 
    125123    } 
    126124 
     
    163161        } 
    164162    } 
     163 
     164    /* Select a new ES */ 
     165    INSERT_ELEM( p_input->stream.pp_selected_es, 
     166                 p_input->stream.i_selected_es_number, 
     167                 p_input->stream.i_selected_es_number, 
     168                 p_es ); 
    165169 
    166170    p_input->stream.b_changed = 1; 
     
    399403    p_dec->pf_packetize = 0; 
    400404 
    401     /* Select a new ES */ 
    402     INSERT_ELEM( p_input->stream.pp_selected_es, 
    403                  p_input->stream.i_selected_es_number, 
    404                  p_input->stream.i_selected_es_number, 
    405                  p_es ); 
    406  
    407405    /* Initialize the decoder fifo */ 
    408406    p_dec->p_module = NULL; 
    409407 
    410     p_dec->fmt_in = p_es->fmt
     408    es_format_Copy( &p_dec->fmt_in, &p_es->fmt )
    411409 
    412410    if( p_es->p_waveformatex ) 
     
    481479    p_dec->p_owner->p_sout = p_input->stream.p_sout; 
    482480    p_dec->p_owner->p_sout_input = NULL; 
     481    p_dec->p_owner->p_packetizer = NULL; 
    483482    p_dec->p_owner->p_es_descriptor = p_es; 
    484483 
     
    502501    vlc_object_attach( p_dec, p_input ); 
    503502 
     503    /* Find a suitable decoder/packetizer module */ 
     504    if( i_object_type == VLC_OBJECT_DECODER ) 
     505        p_dec->p_module = module_Need( p_dec, "decoder", "$codec", 0 ); 
     506    else 
     507        p_dec->p_module = module_Need( p_dec, "packetizer", "$packetizer", 0 ); 
     508 
     509    /* Check if decoder requires already packetized data */ 
     510    if( i_object_type == VLC_OBJECT_DECODER && 
     511        p_dec->b_need_packetized && !p_dec->fmt_in.b_packetized ) 
     512    { 
     513        p_dec->p_owner->p_packetizer = 
     514            vlc_object_create( p_input, VLC_OBJECT_PACKETIZER ); 
     515        if( p_dec->p_owner->p_packetizer ) 
     516        { 
     517            p_dec->p_owner->p_packetizer->fmt_in = null_es_format; 
     518            p_dec->p_owner->p_packetizer->fmt_out = null_es_format; 
     519            es_format_Copy( &p_dec->p_owner->p_packetizer->fmt_in, 
     520                            &p_dec->fmt_in ); 
     521 
     522            vlc_object_attach( p_dec->p_owner->p_packetizer, p_input ); 
     523 
     524            p_dec->p_owner->p_packetizer->p_module = 
     525                module_Need( p_dec->p_owner->p_packetizer, 
     526                             "packetizer", "$packetizer", 0 ); 
     527 
     528            if( !p_dec->p_owner->p_packetizer->p_module ) 
     529            { 
     530                es_format_Clean( &p_dec->p_owner->p_packetizer->fmt_in ); 
     531                vlc_object_detach( p_dec->p_owner->p_packetizer ); 
     532                vlc_object_destroy( p_dec->p_owner->p_packetizer ); 
     533            } 
     534        } 
     535    } 
     536 
    504537    return p_dec; 
    505538} 
     
    581614                        p_dec->p_owner->p_es_descriptor->p_pgrm->i_number; 
    582615                } 
    583                 p_dec->p_owner->sout.i_id = p_dec->p_owner->p_es_descriptor->i_id - 1; 
     616                p_dec->p_owner->sout.i_id = 
     617                    p_dec->p_owner->p_es_descriptor->i_id - 1; 
    584618                if( p_dec->fmt_in.psz_language ) 
    585619                { 
    586                     p_dec->p_owner->sout.psz_language = strdup( p_dec->fmt_in.psz_language ); 
     620                    p_dec->p_owner->sout.psz_language = 
     621                        strdup( p_dec->fmt_in.psz_language ); 
    587622                } 
    588623 
    589624                p_dec->p_owner->p_sout_input = 
    590                     sout_InputNew( p_dec->p_owner->p_sout, &p_dec->p_owner->sout ); 
     625                    sout_InputNew( p_dec->p_owner->p_sout, 
     626                                   &p_dec->p_owner->sout ); 
    591627 
    592628                if( p_dec->p_owner->p_sout_input == NULL ) 
     
    597633                    while( p_sout_block ) 
    598634                    { 
    599                         block_t       *p_next = p_sout_block->p_next; 
     635                        block_t *p_next = p_sout_block->p_next; 
    600636                        block_Release( p_sout_block ); 
    601637                        p_sout_block = p_next; 
     
    626662                p_sout_buffer->i_length = p_sout_block->i_length; 
    627663                p_sout_buffer->i_flags = 
    628                         (p_sout_block->i_flags << SOUT_BUFFER_FLAGS_BLOCK_SHIFT
    629                           & SOUT_BUFFER_FLAGS_BLOCK_MASK; 
     664                    ( p_sout_block->i_flags << SOUT_BUFFER_FLAGS_BLOCK_SHIFT
     665                    & SOUT_BUFFER_FLAGS_BLOCK_MASK; 
    630666 
    631667                block_Release( p_sout_block ); 
    632668 
    633                 sout_InputSendBuffer( p_dec->p_owner->p_sout_input, p_sout_buffer ); 
     669                sout_InputSendBuffer( p_dec->p_owner->p_sout_input, 
     670                                      p_sout_buffer ); 
    634671 
    635672                p_sout_block = p_next; 
     
    655692        aout_buffer_t *p_aout_buf; 
    656693 
    657         while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) 
     694        if( p_dec->p_owner->p_packetizer ) 
     695        { 
     696            block_t *p_packetized_block; 
     697            decoder_t *p_packetizer = p_dec->p_owner->p_packetizer; 
     698 
     699            while( (p_packetized_block = 
     700                    p_packetizer->pf_packetize( p_packetizer, &p_block )) ) 
     701            { 
     702                while( (p_aout_buf = 
     703                        p_dec->pf_decode_audio( p_dec, &p_packetized_block )) ) 
     704                { 
     705                    aout_DecPlay( p_dec->p_owner->p_aout, 
     706                                  p_dec->p_owner->p_aout_input, p_aout_buf ); 
     707                } 
     708            } 
     709        } 
     710        else while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) 
    658711        { 
    659712            aout_DecPlay( p_dec->p_owner->p_aout, 
     
    665718        picture_t *p_pic; 
    666719 
    667         while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) ) 
     720        if( p_dec->p_owner->p_packetizer ) 
     721        { 
     722            block_t *p_packetized_block; 
     723            decoder_t *p_packetizer = p_dec->p_owner->p_packetizer; 
     724 
     725            while( (p_packetized_block = 
     726                    p_packetizer->pf_packetize( p_packetizer, &p_block )) ) 
     727            { 
     728                while( (p_pic = 
     729                        p_dec->pf_decode_video( p_dec, &p_packetized_block )) ) 
     730                { 
     731                    vout_DatePicture( p_dec->p_owner->p_vout, p_pic, 
     732                                      p_pic->date ); 
     733                    vout_DisplayPicture( p_dec->p_owner->p_vout, p_pic ); 
     734                } 
     735            } 
     736        } 
     737        else while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) ) 
    668738        { 
    669739            vout_DatePicture( p_dec->p_owner->p_vout, p_pic, p_pic->date ); 
     
    694764    vlc_object_detach( p_dec ); 
    695765 
    696     msg_Dbg( p_dec, 
    697              "killing decoder fourcc `%4.4s', %d PES in FIFO", 
     766    msg_Dbg( p_dec, "killing decoder fourcc `%4.4s', %d PES in FIFO", 
    698767             (char*)&p_dec->fmt_in.i_codec, 
    699768             p_dec->p_owner->p_fifo->i_depth ); 
     
    730799    { 
    731800        sout_InputDelete( p_dec->p_owner->p_sout_input ); 
    732         if( p_dec->p_owner->sout.i_extra ) free(p_dec->p_owner->sout.p_extra); 
    733     } 
    734  
    735     if( p_dec->fmt_in.i_extra ) free( p_dec->fmt_in.p_extra ); 
    736     if( p_dec->fmt_out.i_extra ) free( p_dec->fmt_out.p_extra ); 
     801        es_format_Clean( &p_dec->p_owner->sout ); 
     802    } 
     803 
     804    es_format_Clean( &p_dec->fmt_in ); 
     805    es_format_Clean( &p_dec->fmt_out ); 
     806 
     807    if( p_dec->p_owner->p_packetizer ) 
     808    { 
     809        module_Unneed( p_dec->p_owner->p_packetizer, 
     810                       p_dec->p_owner->p_packetizer->p_module ); 
     811        es_format_Clean( &p_dec->p_owner->p_packetizer->fmt_in ); 
     812        es_format_Clean( &p_dec->p_owner->p_packetizer->fmt_out ); 
     813        vlc_object_detach( p_dec->p_owner->p_packetizer ); 
     814        vlc_object_destroy( p_dec->p_owner->p_packetizer ); 
     815    } 
    737816 
    738817    free( p_dec->p_owner ); 
  • src/input/input_programs.c

    r4c19e52 r779340c  
    33 ***************************************************************************** 
    44 * Copyright (C) 1999-2004 VideoLAN 
    5  * $Id: input_programs.c,v 1.133 2004/02/25 12:38:33 fenrir Exp
     5 * $Id
    66 * 
    77 * Authors: Christophe Massiot <massiot@via.ecp.fr> 
     
    625625    p_es->b_force_decoder = VLC_FALSE; 
    626626    es_format_Init( &p_es->fmt, UNKNOWN_ES, 0 ); 
     627    p_es->fmt.b_packetized = VLC_FALSE; /* Only there for old mpeg demuxers */ 
    627628 
    628629    if( i_data_len )