From 83548fe894cdb455cc127f754d09905b6d23c173 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 27 Sep 2016 16:26:37 +0200 Subject: [PATCH] lavf: fix usage of AVIOContext.seekable It is supposed to be a flag. The only currently defined value is AVIO_SEEKABLE_NORMAL, but other ones may be added in the future. However all the current lavf code treats this field as a bool (mainly for historical reasons). Change all those cases to properly check for AVIO_SEEKABLE_NORMAL. --- libavformat/aiffdec.c | 2 +- libavformat/aiffenc.c | 2 +- libavformat/ape.c | 2 +- libavformat/apetag.c | 2 +- libavformat/asfdec.c | 8 +++++--- libavformat/asfenc.c | 4 ++-- libavformat/au.c | 2 +- libavformat/avidec.c | 5 +++-- libavformat/avienc.c | 18 +++++++++--------- libavformat/aviobuf.c | 2 +- libavformat/bink.c | 2 +- libavformat/cafdec.c | 4 ++-- libavformat/filmstripdec.c | 2 +- libavformat/flacenc.c | 2 +- libavformat/flvdec.c | 3 ++- libavformat/gxfenc.c | 2 +- libavformat/id3v1.c | 2 +- libavformat/matroskadec.c | 2 +- libavformat/matroskaenc.c | 14 +++++++------- libavformat/mmf.c | 2 +- libavformat/mov.c | 12 ++++++------ libavformat/movenc.c | 2 +- libavformat/mp3enc.c | 2 +- libavformat/mpc.c | 2 +- libavformat/mpc8.c | 2 +- libavformat/mpeg.c | 2 +- libavformat/mpegts.c | 3 ++- libavformat/mvdec.c | 4 ++-- libavformat/mxfdec.c | 4 ++-- libavformat/mxfenc.c | 2 +- libavformat/nutdec.c | 2 +- libavformat/oggdec.c | 2 +- libavformat/r3d.c | 2 +- libavformat/rmdec.c | 3 ++- libavformat/rmenc.c | 6 +++--- libavformat/rsoenc.c | 2 +- libavformat/smjpegenc.c | 2 +- libavformat/soxenc.c | 2 +- libavformat/swfenc.c | 2 +- libavformat/takdec.c | 2 +- libavformat/tty.c | 2 +- libavformat/utils.c | 2 +- libavformat/vc1testenc.c | 2 +- libavformat/voc_packet.c | 2 +- libavformat/wavdec.c | 2 +- libavformat/wavenc.c | 4 ++-- libavformat/wvdec.c | 4 ++-- libavformat/wvenc.c | 2 +- 48 files changed, 84 insertions(+), 78 deletions(-) diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index 3c45c61b1a..481a92d351 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -251,7 +251,7 @@ static int aiff_read_header(AVFormatContext *s) offset += avio_tell(pb); /* Compute absolute data offset */ if (st->codecpar->block_align) /* Assume COMM already parsed */ goto got_sound; - if (!pb->seekable) { + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) { av_log(s, AV_LOG_ERROR, "file is not seekable\n"); return -1; } diff --git a/libavformat/aiffenc.c b/libavformat/aiffenc.c index 6449c00cad..191e746672 100644 --- a/libavformat/aiffenc.c +++ b/libavformat/aiffenc.c @@ -129,7 +129,7 @@ static int aiff_write_trailer(AVFormatContext *s) end_size++; } - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { /* File length */ avio_seek(pb, aiff->form, SEEK_SET); avio_wb32(pb, file_size - aiff->form - 4); diff --git a/libavformat/ape.c b/libavformat/ape.c index bcc1f7aa07..80e3372403 100644 --- a/libavformat/ape.c +++ b/libavformat/ape.c @@ -370,7 +370,7 @@ static int ape_read_header(AVFormatContext * s) } /* try to read APE tags */ - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { ff_ape_parse_tag(s); avio_seek(pb, 0, SEEK_SET); } diff --git a/libavformat/apetag.c b/libavformat/apetag.c index 044bfd8022..05430dd9bc 100644 --- a/libavformat/apetag.c +++ b/libavformat/apetag.c @@ -182,7 +182,7 @@ int ff_ape_write_tag(AVFormatContext *s) int64_t start, end; int size, count = 0; - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return 0; start = avio_tell(s->pb); diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c index 7d71789029..1c50ad627c 100644 --- a/libavformat/asfdec.c +++ b/libavformat/asfdec.c @@ -960,7 +960,7 @@ static int asf_read_data(AVFormatContext *s, const GUIDParseTable *g) size, asf->nb_packets); avio_skip(pb, 2); // skip reserved field asf->first_packet_offset = avio_tell(pb); - if (pb->seekable && !(asf->b_flags & ASF_FLAG_BROADCAST)) + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !(asf->b_flags & ASF_FLAG_BROADCAST)) align_position(pb, asf->offset, asf->data_size); return 0; @@ -1738,7 +1738,9 @@ static int asf_read_header(AVFormatContext *s) size = avio_rl64(pb); align_position(pb, asf->offset, size); } - if (asf->data_reached && (!pb->seekable || (asf->b_flags & ASF_FLAG_BROADCAST))) + if (asf->data_reached && + (!(pb->seekable & AVIO_SEEKABLE_NORMAL) || + (asf->b_flags & ASF_FLAG_BROADCAST))) break; } @@ -1747,7 +1749,7 @@ static int asf_read_header(AVFormatContext *s) ret = AVERROR_INVALIDDATA; goto failed; } - if (pb->seekable) + if (pb->seekable & AVIO_SEEKABLE_NORMAL) avio_seek(pb, asf->first_packet_offset, SEEK_SET); for (i = 0; i < asf->nb_streams; i++) { diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c index dc1dd73364..a40c02d00d 100644 --- a/libavformat/asfenc.c +++ b/libavformat/asfenc.c @@ -433,7 +433,7 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, avio_wl64(pb, play_duration); /* end time stamp (in 100ns units) */ avio_wl64(pb, send_duration); /* duration (in 100ns units) */ avio_wl64(pb, PREROLL_TIME); /* start time stamp */ - avio_wl32(pb, (asf->is_streamed || !pb->seekable) ? 3 : 2); /* ??? */ + avio_wl32(pb, (asf->is_streamed || !(pb->seekable & AVIO_SEEKABLE_NORMAL)) ? 3 : 2); /* ??? */ avio_wl32(pb, s->packet_size); /* packet size */ avio_wl32(pb, s->packet_size); /* packet size */ avio_wl32(pb, bit_rate); /* Nominal data rate in bps */ @@ -954,7 +954,7 @@ static int asf_write_trailer(AVFormatContext *s) asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->nb_index_count); avio_flush(s->pb); - if (asf->is_streamed || !s->pb->seekable) { + if (asf->is_streamed || !(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) { put_chunk(s, 0x4524, 0, 0); /* end of stream */ } else { /* rewrite an updated header */ diff --git a/libavformat/au.c b/libavformat/au.c index e30314239f..20c9d41f47 100644 --- a/libavformat/au.c +++ b/libavformat/au.c @@ -192,7 +192,7 @@ static int au_write_trailer(AVFormatContext *s) AVIOContext *pb = s->pb; int64_t file_size; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { /* update file size */ file_size = avio_tell(pb); avio_seek(pb, 8, SEEK_SET); diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 3666b573e0..ddc7c2b6f4 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -761,7 +761,8 @@ static int avi_read_header(AVFormatContext *s) break; case MKTAG('i', 'n', 'd', 'x'): pos = avio_tell(pb); - if (pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX) && + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && + !(s->flags & AVFMT_FLAG_IGNIDX) && read_braindead_odml_indx(s, 0) < 0 && (s->error_recognition & AV_EF_EXPLODE)) goto fail; @@ -828,7 +829,7 @@ fail: return AVERROR_INVALIDDATA; } - if (!avi->index_loaded && pb->seekable) + if (!avi->index_loaded && (pb->seekable & AVIO_SEEKABLE_NORMAL)) avi_load_index(s); avi->index_loaded = 1; diff --git a/libavformat/avienc.c b/libavformat/avienc.c index d89fab17e8..e4743981b8 100644 --- a/libavformat/avienc.c +++ b/libavformat/avienc.c @@ -189,7 +189,7 @@ static int avi_write_header(AVFormatContext *s) avio_wl32(pb, 0); avio_wl32(pb, bitrate / 8); /* XXX: not quite exact */ avio_wl32(pb, 0); /* padding */ - if (!pb->seekable) + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_ISINTERLEAVED); /* flags */ else avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_HASINDEX | AVIF_ISINTERLEAVED); /* flags */ @@ -261,7 +261,7 @@ static int avi_write_header(AVFormatContext *s) avio_wl32(pb, 0); /* start */ /* remember this offset to fill later */ avist->frames_hdr_strm = avio_tell(pb); - if (!pb->seekable) + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) /* FIXME: this may be broken, but who cares */ avio_wl32(pb, AVI_MAX_RIFF_SIZE); else @@ -306,7 +306,7 @@ static int avi_write_header(AVFormatContext *s) } } - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { unsigned char tag[5]; int j; @@ -366,7 +366,7 @@ static int avi_write_header(AVFormatContext *s) ff_end_tag(pb, list2); } - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { /* AVI could become an OpenDML one, if it grows beyond 2Gb range */ avi->odml_list = ff_start_tag(pb, "JUNK"); ffio_wfourcc(pb, "odml"); @@ -403,7 +403,7 @@ static int avi_write_ix(AVFormatContext *s) char ix_tag[] = "ix00"; int i, j; - assert(pb->seekable); + assert(pb->seekable & AVIO_SEEKABLE_NORMAL); if (avi->riff_id > AVI_MASTER_INDEX_SIZE) return -1; @@ -461,7 +461,7 @@ static int avi_write_idx1(AVFormatContext *s) int i; char tag[5]; - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { AVIStream *avist; AVIIentry *ie = 0, *tie; int empty, stream_id = -1; @@ -528,7 +528,7 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) avist->packet_count++; // Make sure to put an OpenDML chunk when the file size exceeds the limits - if (pb->seekable && + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && (avio_tell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE)) { avi_write_ix(s); ff_end_tag(pb, avi->movi_list); @@ -546,7 +546,7 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_type == AVMEDIA_TYPE_AUDIO) avist->audio_strm_length += size; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { int err; AVIIndex *idx = &avist->indexes; int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE; @@ -588,7 +588,7 @@ static int avi_write_trailer(AVFormatContext *s) int i, j, n, nb_frames; int64_t file_size; - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { if (avi->riff_id == 1) { ff_end_tag(pb, avi->movi_list); res = avi_write_idx1(s); diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 706cf5dd7f..39a11e21c4 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -265,7 +265,7 @@ int64_t avio_seek(AVIOContext *s, int64_t offset, int whence) offset1 >= 0 && offset1 < (s->buf_end - s->buffer)) { /* can do the seek inside the buffer */ s->buf_ptr = s->buffer + offset1; - } else if ((!s->seekable || + } else if ((!(s->seekable & AVIO_SEEKABLE_NORMAL) || offset1 <= s->buf_end + SHORT_SEEK_THRESHOLD - s->buffer) && !s->write_flag && offset1 >= 0 && (whence != SEEK_END || force)) { diff --git a/libavformat/bink.c b/libavformat/bink.c index 377db98971..8f28212ab4 100644 --- a/libavformat/bink.c +++ b/libavformat/bink.c @@ -267,7 +267,7 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in BinkDemuxContext *bink = s->priv_data; AVStream *vst = s->streams[0]; - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return -1; /* seek to the first frame */ diff --git a/libavformat/cafdec.c b/libavformat/cafdec.c index 65bdcfc1ef..efc8c49c4a 100644 --- a/libavformat/cafdec.c +++ b/libavformat/cafdec.c @@ -249,7 +249,7 @@ static int read_header(AVFormatContext *s) /* stop at data chunk if seeking is not supported or data chunk size is unknown */ - if (found_data && (caf->data_size < 0 || !pb->seekable)) + if (found_data && (caf->data_size < 0 || !(pb->seekable & AVIO_SEEKABLE_NORMAL))) break; tag = avio_rb32(pb); @@ -262,7 +262,7 @@ static int read_header(AVFormatContext *s) avio_skip(pb, 4); /* edit count */ caf->data_start = avio_tell(pb); caf->data_size = size < 0 ? -1 : size - 4; - if (caf->data_size > 0 && pb->seekable) + if (caf->data_size > 0 && (pb->seekable & AVIO_SEEKABLE_NORMAL)) avio_skip(pb, caf->data_size); found_data = 1; break; diff --git a/libavformat/filmstripdec.c b/libavformat/filmstripdec.c index b029d8023e..b5dad50c37 100644 --- a/libavformat/filmstripdec.c +++ b/libavformat/filmstripdec.c @@ -40,7 +40,7 @@ static int read_header(AVFormatContext *s) AVIOContext *pb = s->pb; AVStream *st; - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return AVERROR(EIO); avio_seek(pb, avio_size(pb) - 36, SEEK_SET); diff --git a/libavformat/flacenc.c b/libavformat/flacenc.c index 3cee668afc..06985cf240 100644 --- a/libavformat/flacenc.c +++ b/libavformat/flacenc.c @@ -130,7 +130,7 @@ static int flac_write_trailer(struct AVFormatContext *s) if (!c->write_header || !streaminfo) return 0; - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { /* rewrite the STREAMINFO header block data */ file_size = avio_tell(pb); avio_seek(pb, 8, SEEK_SET); diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 0d9a113edb..b82ea3303b 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -837,7 +837,8 @@ skip: // if not streamed and no duration from metadata then seek to end to find // the duration from the timestamps - if (s->pb->seekable && (!s->duration || s->duration == AV_NOPTS_VALUE) && + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && + (!s->duration || s->duration == AV_NOPTS_VALUE) && !flv->searched_for_end) { int size; const int64_t pos = avio_tell(s->pb); diff --git a/libavformat/gxfenc.c b/libavformat/gxfenc.c index 60f88fdabd..32714f63ae 100644 --- a/libavformat/gxfenc.c +++ b/libavformat/gxfenc.c @@ -633,7 +633,7 @@ static int gxf_write_header(AVFormatContext *s) uint8_t tracks[255] = {0}; int i, media_info = 0; - if (!pb->seekable) { + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) { av_log(s, AV_LOG_ERROR, "gxf muxer does not support streamed output, patch welcome"); return -1; } diff --git a/libavformat/id3v1.c b/libavformat/id3v1.c index 87930ff361..9420d9e57c 100644 --- a/libavformat/id3v1.c +++ b/libavformat/id3v1.c @@ -230,7 +230,7 @@ void ff_id3v1_read(AVFormatContext *s) uint8_t buf[ID3v1_TAG_SIZE]; int64_t filesize, position = avio_tell(s->pb); - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { /* XXX: change that */ filesize = avio_size(s->pb); if (filesize > 128) { diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 7ccba57fe5..991f86b8d5 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1394,7 +1394,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) int i; // we should not do any seeking in the streaming case - if (!matroska->ctx->pb->seekable || + if (!(matroska->ctx->pb->seekable & AVIO_SEEKABLE_NORMAL) || (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)) return; diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index dd5552c369..cfced72ada 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1252,14 +1252,14 @@ static int mkv_write_header(AVFormatContext *s) return ret; } - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) mkv_write_seekhead(pb, mkv->main_seekhead); mkv->cues = mkv_start_cues(mkv->segment_offset); if (!mkv->cues) return AVERROR(ENOMEM); - if (pb->seekable && mkv->reserve_cues_space) { + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && mkv->reserve_cues_space) { mkv->cues_pos = avio_tell(pb); put_ebml_void(pb, mkv->reserve_cues_space); } @@ -1271,7 +1271,7 @@ static int mkv_write_header(AVFormatContext *s) // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or // after 4k and on a keyframe - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { if (mkv->cluster_time_limit < 0) mkv->cluster_time_limit = 5000; if (mkv->cluster_size_limit < 0) @@ -1547,7 +1547,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt) } ts += mkv->tracks[pkt->stream_index].ts_offset; - if (!s->pb->seekable) { + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) { if (!mkv->dyn_bc) { ret = avio_open_dyn_buf(&mkv->dyn_bc); if (ret < 0) @@ -1613,7 +1613,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or // after 4k and on a keyframe - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { pb = s->pb; cluster_size = avio_tell(pb) - mkv->cluster_pos; } else { @@ -1666,7 +1666,7 @@ static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb; - if (s->pb->seekable) + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) pb = s->pb; else pb = mkv->dyn_bc; @@ -1717,7 +1717,7 @@ static int mkv_write_trailer(AVFormatContext *s) return ret; } - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { if (mkv->cues->num_entries) { if (mkv->reserve_cues_space) { int64_t cues_end; diff --git a/libavformat/mmf.c b/libavformat/mmf.c index 55aeff410f..454e609e67 100644 --- a/libavformat/mmf.c +++ b/libavformat/mmf.c @@ -140,7 +140,7 @@ static int mmf_write_trailer(AVFormatContext *s) int64_t pos, size; int gatetime; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { /* Fill in length fields */ end_tag_be(pb, mmf->awapos); end_tag_be(pb, mmf->atrpos); diff --git a/libavformat/mov.c b/libavformat/mov.c index ca49716026..36e75d5c38 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3270,9 +3270,9 @@ static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom) if (err < 0) return err; if (c->found_moov && c->found_mdat && - ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) || + ((!(pb->seekable & AVIO_SEEKABLE_NORMAL) || c->fc->flags & AVFMT_FLAG_IGNIDX) || start_pos + a.size == avio_size(pb))) { - if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL) || c->fc->flags & AVFMT_FLAG_IGNIDX) c->next_root_atom = start_pos + a.size; return 0; } @@ -3463,7 +3463,7 @@ static int mov_read_header(AVFormatContext *s) mov->fc = s; /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */ - if (pb->seekable) + if (pb->seekable & AVIO_SEEKABLE_NORMAL) atom.size = avio_size(pb); else atom.size = INT64_MAX; @@ -3481,7 +3481,7 @@ static int mov_read_header(AVFormatContext *s) } av_log(mov->fc, AV_LOG_TRACE, "on_parse_exit_offset=%"PRId64"\n", avio_tell(pb)); - if (pb->seekable && mov->chapter_track > 0) + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && mov->chapter_track > 0) mov_read_chapters(s); for (i = 0; i < s->nb_streams; i++) { @@ -3558,8 +3558,8 @@ static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st) AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample]; int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale); av_log(s, AV_LOG_TRACE, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts); - if (!sample || (!s->pb->seekable && current_sample->pos < sample->pos) || - (s->pb->seekable && + if (!sample || (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && current_sample->pos < sample->pos) || + ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb && ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) || (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) { diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 31b940a4b2..f99617a96e 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4037,7 +4037,7 @@ static int mov_write_header(AVFormatContext *s) /* Non-seekable output is ok if using fragmentation. If ism_lookahead * is enabled, we don't support non-seekable output at all. */ - if (!s->pb->seekable && + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (!(mov->flags & FF_MOV_FLAG_FRAGMENT) || mov->ism_lookahead)) { av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); return AVERROR(EINVAL); diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c index 1e2ff1aa94..d87d7be3f4 100644 --- a/libavformat/mp3enc.c +++ b/libavformat/mp3enc.c @@ -141,7 +141,7 @@ static void mp3_write_xing(AVFormatContext *s) int ver = 0; int lsf, bytes_needed; - if (!s->pb->seekable || !mp3->write_xing) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) || !mp3->write_xing) return; for (i = 0; i < FF_ARRAY_ELEMS(avpriv_mpa_freq_tab); i++) { diff --git a/libavformat/mpc.c b/libavformat/mpc.c index cf8fe1e136..5be50a7c24 100644 --- a/libavformat/mpc.c +++ b/libavformat/mpc.c @@ -105,7 +105,7 @@ static int mpc_read_header(AVFormatContext *s) st->duration = c->fcount; /* try to read APE tags */ - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { int64_t pos = avio_tell(s->pb); ff_ape_parse_tag(s); if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) diff --git a/libavformat/mpc8.c b/libavformat/mpc8.c index 2349ea5bb8..bd17c19838 100644 --- a/libavformat/mpc8.c +++ b/libavformat/mpc8.c @@ -252,7 +252,7 @@ static int mpc8_read_header(AVFormatContext *s) st->duration = c->samples / (1152 << (st->codecpar->extradata[1]&3)*2); size -= avio_tell(pb) - pos; - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { int64_t pos = avio_tell(s->pb); c->apetag_start = ff_ape_parse_tag(s); avio_seek(s->pb, pos, SEEK_SET); diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index f63e79f673..0898353ca8 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -378,7 +378,7 @@ redo: int i; for (i = 0; i < s->nb_streams; i++) { if (startcode == s->streams[i]->id && - s->pb->seekable /* index useless on streams anyway */) { + (s->pb->seekable & AVIO_SEEKABLE_NORMAL) /* index useless on streams anyway */) { ff_reduce_index(s, i); av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 40672aeb98..28b6d37bb3 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2087,7 +2087,8 @@ static int mpegts_read_header(AVFormatContext *s) /* normal demux */ /* first do a scan to get all the services */ - if (avio_seek(pb, pos, SEEK_SET) < 0 && pb->seekable) + if (avio_seek(pb, pos, SEEK_SET) < 0 && + (pb->seekable & AVIO_SEEKABLE_NORMAL)) av_log(s, AV_LOG_ERROR, "Unable to seek back to the start\n"); mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); diff --git a/libavformat/mvdec.c b/libavformat/mvdec.c index f13359c815..52c5355e6a 100644 --- a/libavformat/mvdec.c +++ b/libavformat/mvdec.c @@ -403,7 +403,7 @@ static int mv_read_packet(AVFormatContext *avctx, AVPacket *pkt) if (index->pos > pos) avio_skip(pb, index->pos - pos); else if (index->pos < pos) { - if (!pb->seekable) + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) return AVERROR(EIO); ret = avio_seek(pb, index->pos, SEEK_SET); if (ret < 0) @@ -445,7 +445,7 @@ static int mv_read_seek(AVFormatContext *avctx, int stream_index, if ((flags & AVSEEK_FLAG_FRAME) || (flags & AVSEEK_FLAG_BYTE)) return AVERROR(ENOSYS); - if (!avctx->pb->seekable) + if (!(avctx->pb->seekable & AVIO_SEEKABLE_NORMAL)) return AVERROR(EIO); frame = av_index_search_timestamp(st, timestamp, flags); diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 449af95e7a..1c7c280188 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -1933,7 +1933,7 @@ static int mxf_parse_handle_essence(MXFContext *mxf) /* remember where we were so we don't end up seeking further back than this */ mxf->last_forward_tell = avio_tell(pb); - if (!pb->seekable) { + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) { av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing last partition\n"); return -1; } @@ -2080,7 +2080,7 @@ static void mxf_read_random_index_pack(AVFormatContext *s) int64_t file_size; KLVPacket klv; - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return; file_size = avio_size(s->pb); diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 1431fc65e8..eb53dbff21 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -1805,7 +1805,7 @@ static int mxf_write_footer(AVFormatContext *s) mxf_write_klv_fill(s); mxf_write_random_index_pack(s); - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { avio_seek(pb, 0, SEEK_SET); if (mxf->edit_unit_byte_count) { if ((err = mxf_write_partition(s, 1, 2, header_closed_partition_key, 1)) < 0) diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c index b554f85101..e1a9f6db0f 100644 --- a/libavformat/nutdec.c +++ b/libavformat/nutdec.c @@ -765,7 +765,7 @@ static int nut_read_header(AVFormatContext *s) s->internal->data_offset = pos - 8; - if (bc->seekable) { + if (bc->seekable & AVIO_SEEKABLE_NORMAL) { int64_t orig_pos = avio_tell(bc); find_and_decode_index(nut); avio_seek(bc, orig_pos, SEEK_SET); diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 9ec24973c6..5965a9730f 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -509,7 +509,7 @@ static int ogg_get_length(AVFormatContext *s) int i, ret; int64_t size, end; - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return 0; // already set diff --git a/libavformat/r3d.c b/libavformat/r3d.c index 4b28379fc9..9369cdd7df 100644 --- a/libavformat/r3d.c +++ b/libavformat/r3d.c @@ -184,7 +184,7 @@ static int r3d_read_header(AVFormatContext *s) s->internal->data_offset = avio_tell(s->pb); av_log(s, AV_LOG_TRACE, "data offset %#"PRIx64"\n", s->internal->data_offset); - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return 0; // find REOB/REOF/REOS to load index avio_seek(s->pb, avio_size(s->pb)-48-8, SEEK_SET); diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 9774194e8e..51a5bf767c 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -519,7 +519,8 @@ static int rm_read_header(AVFormatContext *s) if (!data_off) data_off = avio_tell(pb) - 18; - if (indx_off && pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX) && + if (indx_off && (pb->seekable & AVIO_SEEKABLE_NORMAL) && + !(s->flags & AVFMT_FLAG_IGNIDX) && avio_seek(pb, indx_off, SEEK_SET) >= 0) { rm_read_index(s); avio_seek(pb, data_off + 18, SEEK_SET); diff --git a/libavformat/rmenc.c b/libavformat/rmenc.c index 59118c9484..6cbe700219 100644 --- a/libavformat/rmenc.c +++ b/libavformat/rmenc.c @@ -123,7 +123,7 @@ static int rv10_write_header(AVFormatContext *ctx, avio_wb32(s, 0); /* data offset : will be patched after */ avio_wb16(s, ctx->nb_streams); /* num streams */ flags = 1 | 2; /* save allowed & perfect play */ - if (!s->seekable) + if (!(s->seekable & AVIO_SEEKABLE_NORMAL)) flags |= 4; /* live broadcast */ avio_wb16(s, flags); @@ -175,7 +175,7 @@ static int rv10_write_header(AVFormatContext *ctx, avio_wb32(s, 0); /* start time */ avio_wb32(s, BUFFER_DURATION); /* preroll */ /* duration */ - if (!s->seekable || !stream->total_frames) + if (!(s->seekable & AVIO_SEEKABLE_NORMAL) || !stream->total_frames) avio_wb32(s, (int)(3600 * 1000)); else avio_wb32(s, (int)(stream->total_frames * 1000 / stream->frame_rate)); @@ -433,7 +433,7 @@ static int rm_write_trailer(AVFormatContext *s) int data_size, index_pos, i; AVIOContext *pb = s->pb; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { /* end of file: finish to write header */ index_pos = avio_tell(pb); data_size = index_pos - rm->data_pos; diff --git a/libavformat/rsoenc.c b/libavformat/rsoenc.c index dd0fbf8c41..4f8278c4ab 100644 --- a/libavformat/rsoenc.c +++ b/libavformat/rsoenc.c @@ -38,7 +38,7 @@ static int rso_write_header(AVFormatContext *s) return AVERROR_INVALIDDATA; } - if (!s->pb->seekable) { + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) { av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); return AVERROR_INVALIDDATA; } diff --git a/libavformat/smjpegenc.c b/libavformat/smjpegenc.c index 2a9505947f..91b0939cbc 100644 --- a/libavformat/smjpegenc.c +++ b/libavformat/smjpegenc.c @@ -120,7 +120,7 @@ static int smjpeg_write_trailer(AVFormatContext *s) AVIOContext *pb = s->pb; int64_t currentpos; - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { currentpos = avio_tell(pb); avio_seek(pb, 12, SEEK_SET); avio_wb32(pb, smc->duration); diff --git a/libavformat/soxenc.c b/libavformat/soxenc.c index ea05f36892..d0f7d410d2 100644 --- a/libavformat/soxenc.c +++ b/libavformat/soxenc.c @@ -98,7 +98,7 @@ static int sox_write_trailer(AVFormatContext *s) AVIOContext *pb = s->pb; AVCodecParameters *par = s->streams[0]->codecpar; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { /* update number of samples */ int64_t file_size = avio_tell(pb); int64_t num_samples = (file_size - sox->header_size - 4LL) >> 2LL; diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c index f8db3e9196..345688c654 100644 --- a/libavformat/swfenc.c +++ b/libavformat/swfenc.c @@ -495,7 +495,7 @@ static int swf_write_trailer(AVFormatContext *s) put_swf_end_tag(s); /* patch file size and number of frames if not streamed */ - if (s->pb->seekable && video_par) { + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && video_par) { file_size = avio_tell(pb); avio_seek(pb, 4, SEEK_SET); avio_wl32(pb, file_size); diff --git a/libavformat/takdec.c b/libavformat/takdec.c index b28d44ce00..19e0e69a5e 100644 --- a/libavformat/takdec.c +++ b/libavformat/takdec.c @@ -101,7 +101,7 @@ static int tak_read_header(AVFormatContext *s) case TAK_METADATA_END: { int64_t curpos = avio_tell(pb); - if (pb->seekable) { + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { ff_ape_parse_tag(s); avio_seek(pb, curpos, SEEK_SET); } diff --git a/libavformat/tty.c b/libavformat/tty.c index d4c4873b81..f4535bbd1c 100644 --- a/libavformat/tty.c +++ b/libavformat/tty.c @@ -103,7 +103,7 @@ static int read_header(AVFormatContext *avctx) /* simulate tty display speed */ s->chars_per_frame = FFMAX(av_q2d(st->time_base)*s->chars_per_frame, 1); - if (avctx->pb->seekable) { + if (avctx->pb->seekable & AVIO_SEEKABLE_NORMAL) { s->fsize = avio_size(avctx->pb); st->duration = (s->fsize + s->chars_per_frame - 1) / s->chars_per_frame; diff --git a/libavformat/utils.c b/libavformat/utils.c index 6df1a32199..0e94b15b72 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1827,7 +1827,7 @@ static void estimate_timings(AVFormatContext *ic, int64_t old_offset) if ((!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts")) && - file_size && ic->pb->seekable) { + file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) { /* get accurate estimate from the PTSes */ estimate_timings_from_pts(ic, old_offset); } else if (has_duration(ic)) { diff --git a/libavformat/vc1testenc.c b/libavformat/vc1testenc.c index dc23c1461d..c286f66a42 100644 --- a/libavformat/vc1testenc.c +++ b/libavformat/vc1testenc.c @@ -73,7 +73,7 @@ static int vc1test_write_trailer(AVFormatContext *s) RCVContext *ctx = s->priv_data; AVIOContext *pb = s->pb; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { avio_seek(pb, 0, SEEK_SET); avio_wl24(pb, ctx->frames); avio_flush(pb); diff --git a/libavformat/voc_packet.c b/libavformat/voc_packet.c index ff48d502f2..38650756f7 100644 --- a/libavformat/voc_packet.c +++ b/libavformat/voc_packet.c @@ -37,7 +37,7 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) return AVERROR(EIO); voc->remaining_size = avio_rl24(pb); if (!voc->remaining_size) { - if (!s->pb->seekable) + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) return AVERROR(EIO); voc->remaining_size = avio_size(pb) - avio_tell(pb); } diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c index 4bd2642d77..8c78666f84 100644 --- a/libavformat/wavdec.c +++ b/libavformat/wavdec.c @@ -289,7 +289,7 @@ static int wav_read_header(AVFormatContext *s) /* don't look for footer metadata if we can't seek or if we don't * know where the data tag ends */ - if (!pb->seekable || (!rf64 && !size)) + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL) || (!rf64 && !size)) goto break_loop; break; case MKTAG('f', 'a', 'c', 't'): diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c index 32d4bc184d..fc7d49e6d7 100644 --- a/libavformat/wavenc.c +++ b/libavformat/wavenc.c @@ -118,7 +118,7 @@ static int wav_write_header(AVFormatContext *s) ff_end_tag(pb, fmt); if (s->streams[0]->codecpar->codec_tag != 0x01 /* hence for all other than PCM */ - && s->pb->seekable) { + && (s->pb->seekable & AVIO_SEEKABLE_NORMAL)) { wav->fact_pos = ff_start_tag(pb, "fact"); avio_wl32(pb, 0); ff_end_tag(pb, wav->fact_pos); @@ -164,7 +164,7 @@ static int wav_write_trailer(AVFormatContext *s) avio_flush(pb); - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { ff_end_tag(pb, wav->data); /* update file size */ diff --git a/libavformat/wvdec.c b/libavformat/wvdec.c index c78bac1ff9..717275c6a0 100644 --- a/libavformat/wvdec.c +++ b/libavformat/wvdec.c @@ -116,7 +116,7 @@ static int wv_read_block_header(AVFormatContext *ctx, AVIOContext *pb) } if ((rate == -1 || !chan) && !wc->block_parsed) { int64_t block_end = avio_tell(pb) + wc->header.blocksize; - if (!pb->seekable) { + if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) { av_log(ctx, AV_LOG_ERROR, "Cannot determine additional parameters\n"); return AVERROR_INVALIDDATA; @@ -237,7 +237,7 @@ static int wv_read_header(AVFormatContext *s) st->start_time = 0; st->duration = wc->header.total_samples; - if (s->pb->seekable) { + if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { int64_t cur = avio_tell(s->pb); wc->apetag_start = ff_ape_parse_tag(s); if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) diff --git a/libavformat/wvenc.c b/libavformat/wvenc.c index a753c199db..63f1ea63b5 100644 --- a/libavformat/wvenc.c +++ b/libavformat/wvenc.c @@ -60,7 +60,7 @@ static av_cold int wv_write_trailer(AVFormatContext *ctx) WvMuxContext *s = ctx->priv_data; /* update total number of samples in the first block */ - if (ctx->pb->seekable && s->samples && + if ((ctx->pb->seekable & AVIO_SEEKABLE_NORMAL) && s->samples && s->samples < UINT32_MAX) { int64_t pos = avio_tell(ctx->pb); avio_seek(ctx->pb, 12, SEEK_SET);