Changeset dfc8392cd3b2de84dc55e0f4dabf9de63e4d2a42

Show
Ignore:
Timestamp:
22/08/06 21:03:20 (2 years ago)
Author:
Gildas Bazin <gbazin@videolan.org>
git-committer:
Gildas Bazin <gbazin@videolan.org> 1156273400 +0000
git-parent:

[834b64d0f742bf300b015afdfef91a5f3fa7382c]

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

* modules/codec/ffmpeg/mux.c: libavformat is much more happy with timestamps which start from 0.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/codec/ffmpeg/mux.c

    r63fa138 rdfc8392  
    6060    vlc_bool_t     b_write_header; 
    6161    vlc_bool_t     b_error; 
     62 
     63    int64_t        i_initial_dts; 
    6264}; 
    6365 
     
    136138    p_sys->b_write_header = VLC_TRUE; 
    137139    p_sys->b_error = VLC_FALSE; 
     140    p_sys->i_initial_dts = 0; 
    138141 
    139142    return VLC_SUCCESS; 
     
    288291    if( pi_stream ) *pi_stream = i_stream; 
    289292    if( pi_dts ) *pi_dts = i_dts; 
     293    if( !p_mux->p_sys->i_initial_dts ) p_mux->p_sys->i_initial_dts = i_dts; 
    290294    return i_stream; 
    291295} 
     
    296300    block_t *p_data = block_FifoGet( p_input->p_fifo ); 
    297301    int i_stream = *((int *)p_input->p_sys); 
     302    AVStream *p_stream = p_sys->oc->streams[i_stream]; 
    298303    AVPacket pkt = {0}; 
    299304 
     305    av_init_packet(&pkt); 
    300306    pkt.data = p_data->p_buffer; 
    301307    pkt.size = p_data->i_buffer; 
     
    303309 
    304310    if( p_data->i_flags & BLOCK_FLAG_TYPE_I ) pkt.flags |= PKT_FLAG_KEY; 
     311 
     312    /* avformat expects pts/dts which start from 0 */ 
     313    p_data->i_dts -= p_mux->p_sys->i_initial_dts; 
     314    p_data->i_pts -= p_mux->p_sys->i_initial_dts; 
     315 
    305316    if( p_data->i_pts > 0 ) 
    306         pkt.pts = p_data->i_pts * p_sys->oc->streams[i_stream]->time_base.den / 
    307             I64C(1000000) / p_sys->oc->streams[i_stream]->time_base.num; 
     317        pkt.pts = p_data->i_pts * p_stream->time_base.den / 
     318            I64C(1000000) / p_stream->time_base.num; 
    308319    if( p_data->i_dts > 0 ) 
    309         pkt.dts = p_data->i_dts * p_sys->oc->streams[i_stream]->time_base.den / 
    310             I64C(1000000) / p_sys->oc->streams[i_stream]->time_base.num; 
     320        pkt.dts = p_data->i_dts * p_stream->time_base.den / 
     321            I64C(1000000) / p_stream->time_base.num; 
    311322 
    312323    if( av_write_frame( p_sys->oc, &pkt ) < 0 ) 
     
    315326                 "(pkt pts: "I64Fd", dts: "I64Fd")", 
    316327                 p_data->i_pts, p_data->i_dts, pkt.pts, pkt.dts ); 
     328        block_Release( p_data ); 
    317329        return VLC_EGENERIC; 
    318330    }