Ticket #4690: patchmkvseekable.diff

File patchmkvseekable.diff, 2.4 KB (added by Carl Eugen Hoyos, 11 years ago)
  • libavformat/matroskaenc.c

    diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
    index 3b525ad..f07851e 100644
    a b static int mkv_write_tracks(AVFormatContext *s)  
    10471047    ebml_master tracks;
    10481048    int i, ret, default_stream_exists = 0;
    10491049
     1050    if (s->pb->seekable) {
    10501051    ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
    10511052    if (ret < 0)
    10521053        return ret;
     1054    }
    10531055
    10541056    tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0);
    10551057    for (i = 0; i < s->nb_streams; i++) {
    static int mkv_write_chapters(AVFormatContext *s)  
    10761078    if (!s->nb_chapters || mkv->wrote_chapters)
    10771079        return 0;
    10781080
     1081    if (s->pb->seekable) {
    10791082    ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
    10801083    if (ret < 0) return ret;
     1084    }
    10811085
    10821086    chapters     = start_ebml_master(pb, MATROSKA_ID_CHAPTERS    , 0);
    10831087    editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0);
    static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int eleme  
    11601164    int ret;
    11611165
    11621166    if (!tags->pos) {
     1167        if (s->pb->seekable) {
    11631168        ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
    11641169        if (ret < 0) return ret;
     1170        }
    11651171
    11661172        *tags = start_ebml_master(s->pb, MATROSKA_ID_TAGS, 0);
    11671173    }
    static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_  
    17721778
    17731779    if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
    17741780        mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe);
    1775         if (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue) {
     1781        if (s->pb->seekable && (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) {
    17761782            ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts, mkv->cluster_pos, relative_packet_pos, -1);
    17771783            if (ret < 0) return ret;
    17781784        }
    static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_  
    17921798        end_ebml_master(pb, blockgroup);
    17931799    }
    17941800
     1801    if (s->pb->seekable) {
    17951802    ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts,
    17961803                           mkv->cluster_pos, relative_packet_pos, duration);
    17971804    if (ret < 0)
    17981805        return ret;
    17991806    }
     1807    }
    18001808
    18011809    mkv->duration = FFMAX(mkv->duration, ts + duration);
    18021810    return 0;