Changeset 2d2d6180a4df83ec1a311556522aa49760b5f396

Show
Ignore:
Timestamp:
29/05/07 19:46:16 (2 years ago)
Author:
Laurent Aimar <fenrir@videolan.org>
git-committer:
Laurent Aimar <fenrir@videolan.org> 1180460776 +0000
git-parent:

[1ed7310548582b5b0e36e0a4bc481473ea93ab11]

git-author:
Laurent Aimar <fenrir@videolan.org> 1180460776 +0000
Message:

Factorize code.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/input/decoder.c

    r9025fab r2d2d618  
    448448 * \return VLC_SUCCESS or an error code 
    449449 */ 
     450static inline void DecoderUpdatePreroll( int64_t *pi_preroll, const block_t *p ) 
     451{ 
     452    if( p->i_pts > 0 ) 
     453        *pi_preroll = __MIN( *pi_preroll, p->i_pts ); 
     454    else if( p->i_dts > 0 ) 
     455        *pi_preroll = __MIN( *pi_preroll, p->i_dts ); 
     456} 
     457static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block ) 
     458{ 
     459    input_thread_t *p_input = p_dec->p_owner->p_input; 
     460    aout_buffer_t *p_aout_buf; 
     461 
     462    //DecoderUpdatePreroll( &p_dec->p_owner->i_preroll_end, p_block ); 
     463    while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) 
     464    { 
     465        vlc_mutex_lock( &p_input->p->counters.counters_lock ); 
     466        stats_UpdateInteger( p_dec, p_input->p->counters.p_decoded_audio, 1, NULL ); 
     467        vlc_mutex_unlock( &p_input->p->counters.counters_lock ); 
     468 
     469        /* FIXME the best would be to handle the case 
     470         * start_date < preroll < end_date 
     471         * but that's not easy with non raw audio stream */ 
     472//        if( p_dec->p_owner->i_preroll_end > 0 ) 
     473//            msg_Err( p_dec, "Prerolling %lld - %lld", p_dec->p_owner->i_preroll_end, p_aout_buf->start_date ); 
     474 
     475        if( p_dec->p_owner->i_preroll_end > 0 && 
     476            p_aout_buf->start_date < p_dec->p_owner->i_preroll_end ) 
     477        { 
     478            aout_DecDeleteBuffer( p_dec->p_owner->p_aout, 
     479                                  p_dec->p_owner->p_aout_input, p_aout_buf ); 
     480        } 
     481        else 
     482        { 
     483            p_dec->p_owner->i_preroll_end = -1; 
     484            aout_DecPlay( p_dec->p_owner->p_aout, 
     485                          p_dec->p_owner->p_aout_input, 
     486                          p_aout_buf ); 
     487        } 
     488    } 
     489} 
     490static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block ) 
     491{ 
     492    input_thread_t *p_input = p_dec->p_owner->p_input; 
     493    picture_t *p_pic; 
     494 
     495    //DecoderUpdatePreroll( &p_dec->p_owner->i_preroll_end, p_block ); 
     496    while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) ) 
     497    { 
     498        vlc_mutex_lock( &p_input->p->counters.counters_lock ); 
     499        stats_UpdateInteger( p_dec, p_input->p->counters.p_decoded_video, 1, NULL ); 
     500        vlc_mutex_unlock( &p_input->p->counters.counters_lock ); 
     501 
     502        if( p_dec->p_owner->i_preroll_end > 0 && 
     503            p_pic->date < p_dec->p_owner->i_preroll_end ) 
     504        { 
     505            vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic ); 
     506        } 
     507        else 
     508        { 
     509            p_dec->p_owner->i_preroll_end = -1; 
     510            vout_DatePicture( p_dec->p_owner->p_vout, p_pic, 
     511                              p_pic->date ); 
     512            vout_DisplayPicture( p_dec->p_owner->p_vout, p_pic ); 
     513        } 
     514    } 
     515} 
     516 
     517 
    450518static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) 
    451519{ 
     
    529597    else if( p_dec->fmt_in.i_cat == AUDIO_ES ) 
    530598    { 
    531         aout_buffer_t *p_aout_buf; 
    532  
    533599        if( p_dec->p_owner->p_packetizer ) 
    534600        { 
     
    551617                    p_packetized_block->i_rate = i_rate; 
    552618 
    553                     while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, 
    554                                                        &p_packetized_block )) ) 
    555                     { 
    556                         input_thread_t *p_i =(input_thread_t*)(p_dec->p_parent); 
    557                         vlc_mutex_lock( &p_i->p->counters.counters_lock ); 
    558                         stats_UpdateInteger( p_dec, 
    559                                p_i->p->counters.p_decoded_audio, 1, NULL ); 
    560                         vlc_mutex_unlock( &p_i->p->counters.counters_lock ); 
    561  
    562                         /* FIXME the best would be to handle the case 
    563                          * start_date < preroll < end_date 
    564                          * but that's not easy with non raw audio stream */ 
    565                         if( p_dec->p_owner->i_preroll_end > 0 && 
    566                             p_aout_buf->start_date < p_dec->p_owner->i_preroll_end ) 
    567                         { 
    568                             aout_DecDeleteBuffer( p_dec->p_owner->p_aout, 
    569                                                   p_dec->p_owner->p_aout_input, p_aout_buf ); 
    570                         } 
    571                         else 
    572                         { 
    573                             p_dec->p_owner->i_preroll_end = -1; 
    574                             aout_DecPlay( p_dec->p_owner->p_aout, 
    575                                           p_dec->p_owner->p_aout_input, 
    576                                           p_aout_buf ); 
    577                         } 
    578                     } 
     619                    DecoderDecodeAudio( p_dec, p_packetized_block ); 
    579620 
    580621                    p_packetized_block = p_next; 
     
    582623            } 
    583624        } 
    584         else while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) 
    585         { 
    586             input_thread_t *p_i = (input_thread_t*)(p_dec->p_parent); 
    587             vlc_mutex_lock( &p_i->p->counters.counters_lock ); 
    588             stats_UpdateInteger( p_dec, 
    589                                p_i->p->counters.p_decoded_audio, 1, NULL ); 
    590             vlc_mutex_unlock( &p_i->p->counters.counters_lock ); 
    591  
    592             if( p_dec->p_owner->i_preroll_end > 0 && 
    593                 p_aout_buf->start_date < p_dec->p_owner->i_preroll_end ) 
    594             { 
    595                 aout_DecDeleteBuffer( p_dec->p_owner->p_aout, 
    596                                       p_dec->p_owner->p_aout_input, p_aout_buf ); 
    597             } 
    598             else 
    599             { 
    600                 p_dec->p_owner->i_preroll_end = -1; 
    601                 aout_DecPlay( p_dec->p_owner->p_aout, 
    602                               p_dec->p_owner->p_aout_input, 
    603                               p_aout_buf ); 
    604             } 
     625        else 
     626        { 
     627            DecoderDecodeAudio( p_dec, p_block ); 
    605628        } 
    606629    } 
    607630    else if( p_dec->fmt_in.i_cat == VIDEO_ES ) 
    608631    { 
    609         picture_t *p_pic; 
    610  
    611632        if( p_dec->p_owner->p_packetizer ) 
    612633        { 
     
    629650                    p_packetized_block->i_rate = i_rate; 
    630651 
    631                     while( (p_pic = p_dec->pf_decode_video( p_dec, 
    632                                                        &p_packetized_block )) ) 
    633                     { 
    634                         input_thread_t *p_i =(input_thread_t*)(p_dec->p_parent); 
    635                         vlc_mutex_lock( &p_i->p->counters.counters_lock ); 
    636                         stats_UpdateInteger( p_dec, 
    637                                p_i->p->counters.p_decoded_video, 1, NULL ); 
    638                         vlc_mutex_unlock( &p_i->p->counters.counters_lock ); 
    639  
    640                         if( p_dec->p_owner->i_preroll_end > 0 && 
    641                             p_pic->date < p_dec->p_owner->i_preroll_end ) 
    642                         { 
    643                             vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic ); 
    644                         } 
    645                         else 
    646                         { 
    647                             p_dec->p_owner->i_preroll_end = -1; 
    648                             vout_DatePicture( p_dec->p_owner->p_vout, p_pic, 
    649                                               p_pic->date ); 
    650                             vout_DisplayPicture( p_dec->p_owner->p_vout, p_pic ); 
    651                         } 
    652                     } 
     652                    DecoderDecodeVideo( p_dec, p_packetized_block ); 
    653653 
    654654                    p_packetized_block = p_next; 
     
    656656            } 
    657657        } 
    658         else while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) ) 
    659         { 
    660             input_thread_t *p_i = (input_thread_t*)(p_dec->p_parent); 
    661             vlc_mutex_lock( &p_i->p->counters.counters_lock ); 
    662             stats_UpdateInteger( p_dec, 
    663                                p_i->p->counters.p_decoded_video, 1, NULL ); 
    664             vlc_mutex_unlock( &p_i->p->counters.counters_lock ); 
    665  
    666             if( p_dec->p_owner->i_preroll_end > 0 && 
    667                 p_pic->date < p_dec->p_owner->i_preroll_end ) 
    668             { 
    669                 vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic ); 
    670             } 
    671             else 
    672             { 
    673                 p_dec->p_owner->i_preroll_end = -1; 
    674                 vout_DatePicture( p_dec->p_owner->p_vout, p_pic, p_pic->date ); 
    675                 vout_DisplayPicture( p_dec->p_owner->p_vout, p_pic ); 
    676             } 
     658        else 
     659        { 
     660            DecoderDecodeVideo( p_dec, p_block ); 
    677661        } 
    678662    } 
    679663    else if( p_dec->fmt_in.i_cat == SPU_ES ) 
    680664    { 
     665        input_thread_t *p_input = p_dec->p_owner->p_input; 
    681666        vout_thread_t *p_vout; 
    682667        subpicture_t *p_spu; 
     668        //DecoderUpdatePreroll( &p_dec->p_owner->i_preroll_end, p_block ); 
    683669        while( (p_spu = p_dec->pf_decode_sub( p_dec, &p_block ) ) ) 
    684670        { 
    685             input_thread_t *p_i = (input_thread_t*)(p_dec->p_parent); 
    686             vlc_mutex_lock( &p_i->p->counters.counters_lock ); 
    687             stats_UpdateInteger( p_dec, 
    688                                p_i->p->counters.p_decoded_sub, 1, NULL ); 
    689             vlc_mutex_unlock( &p_i->p->counters.counters_lock ); 
     671            vlc_mutex_lock( &p_input->p->counters.counters_lock ); 
     672            stats_UpdateInteger( p_dec, p_input->p->counters.p_decoded_sub, 1, NULL ); 
     673            vlc_mutex_unlock( &p_input->p->counters.counters_lock ); 
    690674 
    691675            if( p_dec->p_owner->i_preroll_end > 0 &&