Ticket #529: ogg_seek.diff

File ogg_seek.diff, 1.9 KB (added by reimar, 20 years ago)

ogg seeking fix for -demuxer lavf

  • utils.c

     
    10971097 * @param timestamp new dts expressed in time_base of param ref_st
    10981098 * @param ref_st reference stream giving time_base of param timestamp
    10991099 */
    1100 static void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
     1100void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
    11011101    int i;
    11021102
    11031103    for(i = 0; i < s->nb_streams; i++) {
  • ogg2.c

     
    201201        return AVERROR_NOMEM;
    202202
    203203    av_set_pts_info(st, 64, 1, 1000000);
    204     st->start_time = 0;
    205204
    206205    return idx;
    207206}
     
    495494
    496495    ogg->size = size;
    497496    ogg_restore (s, 0);
     497    ogg_save (s);
     498    while (ogg_read_page (s, &i)) {
     499        if (i == idx && ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0)
     500            break;
     501    }
     502    if (i == idx) {
     503        s->streams[idx]->start_time = ogg_gptopts (s, idx, ogg->streams[idx].granule);
     504        s->streams[idx]->duration -= s->streams[idx]->start_time;
     505    }
     506    ogg_restore (s, 0);
    498507
    499508    return 0;
    500509}
     
    572581    ogg_t *ogg = s->priv_data;
    573582    ByteIOContext *bc = &s->pb;
    574583    uint64_t min = 0, max = ogg->size;
    575     uint64_t tmin = 0, tmax = st->duration;
     584    uint64_t tmin = st->start_time, tmax = st->start_time + st->duration;
    576585    int64_t pts = AV_NOPTS_VALUE;
    577586
    578587    ogg_save (s);
    579588
     589    if ((uint64_t)target_ts < tmin || target_ts < 0)
     590        target_ts = tmin;
    580591    while (min <= max){
    581592        uint64_t p = min + (max - min) * (target_ts - tmin) / (tmax - tmin);
    582593        int i = -1;
     
    615626        pts = AV_NOPTS_VALUE;
    616627    }
    617628
    618     return pts;
     629    av_update_cur_dts(s, st, pts);
     630    return 0;
    619631
    620632#if 0
    621633    //later...