Use it instead of url_is_streamed and AVIOContext.is_streamed.tags/n0.8
| @@ -2260,7 +2260,7 @@ static int http_prepare_data(HTTPContext *c) | |||||
| /* XXX: potential leak */ | /* XXX: potential leak */ | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| c->fmt_ctx.pb->is_streamed = 1; | |||||
| c->fmt_ctx.pb->seekable = 0; | |||||
| /* | /* | ||||
| * HACK to avoid mpeg ps muxer to spit many underflow errors | * HACK to avoid mpeg ps muxer to spit many underflow errors | ||||
| @@ -2399,7 +2399,7 @@ static int http_prepare_data(HTTPContext *c) | |||||
| } | } | ||||
| ost = ctx->streams[pkt.stream_index]; | ost = ctx->streams[pkt.stream_index]; | ||||
| ctx->pb->is_streamed = 1; | |||||
| ctx->pb->seekable = 0; | |||||
| if (pkt.dts != AV_NOPTS_VALUE) | if (pkt.dts != AV_NOPTS_VALUE) | ||||
| pkt.dts = av_rescale_q(pkt.dts, ist->time_base, ost->time_base); | pkt.dts = av_rescale_q(pkt.dts, ist->time_base, ost->time_base); | ||||
| if (pkt.pts != AV_NOPTS_VALUE) | if (pkt.pts != AV_NOPTS_VALUE) | ||||
| @@ -2436,7 +2436,7 @@ static int http_prepare_data(HTTPContext *c) | |||||
| /* XXX: potential leak */ | /* XXX: potential leak */ | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| c->fmt_ctx.pb->is_streamed = 1; | |||||
| c->fmt_ctx.pb->seekable = 0; | |||||
| av_write_trailer(ctx); | av_write_trailer(ctx); | ||||
| len = url_close_dyn_buf(ctx->pb, &c->pb_buffer); | len = url_close_dyn_buf(ctx->pb, &c->pb_buffer); | ||||
| c->buffer_ptr = c->pb_buffer; | c->buffer_ptr = c->pb_buffer; | ||||
| @@ -2723,7 +2723,7 @@ static int http_receive_data(HTTPContext *c) | |||||
| pb = avio_alloc_context(c->buffer, c->buffer_end - c->buffer, | pb = avio_alloc_context(c->buffer, c->buffer_end - c->buffer, | ||||
| 0, NULL, NULL, NULL, NULL); | 0, NULL, NULL, NULL, NULL); | ||||
| pb->is_streamed = 1; | |||||
| pb->seekable = 0; | |||||
| if (av_open_input_stream(&s, pb, c->stream->feed_filename, fmt_in, NULL) < 0) { | if (av_open_input_stream(&s, pb, c->stream->feed_filename, fmt_in, NULL) < 0) { | ||||
| av_free(pb); | av_free(pb); | ||||
| @@ -238,7 +238,7 @@ static int aiff_read_header(AVFormatContext *s, | |||||
| offset += avio_tell(pb); /* Compute absolute data offset */ | offset += avio_tell(pb); /* Compute absolute data offset */ | ||||
| if (st->codec->block_align) /* Assume COMM already parsed */ | if (st->codec->block_align) /* Assume COMM already parsed */ | ||||
| goto got_sound; | goto got_sound; | ||||
| if (url_is_streamed(pb)) { | |||||
| if (!pb->seekable) { | |||||
| av_log(s, AV_LOG_ERROR, "file is not seekable\n"); | av_log(s, AV_LOG_ERROR, "file is not seekable\n"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -124,7 +124,7 @@ static int aiff_write_trailer(AVFormatContext *s) | |||||
| end_size++; | end_size++; | ||||
| } | } | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| /* File length */ | /* File length */ | ||||
| avio_seek(pb, aiff->form, SEEK_SET); | avio_seek(pb, aiff->form, SEEK_SET); | ||||
| avio_wb32(pb, file_size - aiff->form - 4); | avio_wb32(pb, file_size - aiff->form - 4); | ||||
| @@ -296,7 +296,7 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap) | |||||
| ape_dumpinfo(s, ape); | ape_dumpinfo(s, ape); | ||||
| /* try to read APE tags */ | /* try to read APE tags */ | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| ff_ape_parse_tag(s); | ff_ape_parse_tag(s); | ||||
| avio_seek(pb, 0, SEEK_SET); | avio_seek(pb, 0, SEEK_SET); | ||||
| } | } | ||||
| @@ -347,7 +347,7 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, int64_t data | |||||
| avio_wl64(pb, duration); /* end time stamp (in 100ns units) */ | avio_wl64(pb, duration); /* end time stamp (in 100ns units) */ | ||||
| avio_wl64(pb, asf->duration); /* duration (in 100ns units) */ | avio_wl64(pb, asf->duration); /* duration (in 100ns units) */ | ||||
| avio_wl64(pb, PREROLL_TIME); /* start time stamp */ | avio_wl64(pb, PREROLL_TIME); /* start time stamp */ | ||||
| avio_wl32(pb, (asf->is_streamed || url_is_streamed(pb)) ? 3 : 2); /* ??? */ | |||||
| avio_wl32(pb, (asf->is_streamed || !pb->seekable ) ? 3 : 2); /* ??? */ | |||||
| avio_wl32(pb, s->packet_size); /* packet size */ | avio_wl32(pb, s->packet_size); /* packet size */ | ||||
| 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 */ | avio_wl32(pb, bit_rate); /* Nominal data rate in bps */ | ||||
| @@ -866,7 +866,7 @@ static int asf_write_trailer(AVFormatContext *s) | |||||
| } | } | ||||
| avio_flush(s->pb); | avio_flush(s->pb); | ||||
| if (asf->is_streamed || url_is_streamed(s->pb)) { | |||||
| if (asf->is_streamed || !s->pb->seekable) { | |||||
| put_chunk(s, 0x4524, 0, 0); /* end of stream */ | put_chunk(s, 0x4524, 0, 0); /* end of stream */ | ||||
| } else { | } else { | ||||
| /* rewrite an updated header */ | /* rewrite an updated header */ | ||||
| @@ -91,7 +91,7 @@ static int au_write_trailer(AVFormatContext *s) | |||||
| AVIOContext *pb = s->pb; | AVIOContext *pb = s->pb; | ||||
| int64_t file_size; | int64_t file_size; | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| /* update file size */ | /* update file size */ | ||||
| file_size = avio_tell(pb); | file_size = avio_tell(pb); | ||||
| @@ -665,7 +665,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| break; | break; | ||||
| case MKTAG('i', 'n', 'd', 'x'): | case MKTAG('i', 'n', 'd', 'x'): | ||||
| i= avio_tell(pb); | i= avio_tell(pb); | ||||
| if(!url_is_streamed(pb) && !(s->flags & AVFMT_FLAG_IGNIDX)){ | |||||
| if(pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX)){ | |||||
| read_braindead_odml_indx(s, 0); | read_braindead_odml_indx(s, 0); | ||||
| } | } | ||||
| avio_seek(pb, i+size, SEEK_SET); | avio_seek(pb, i+size, SEEK_SET); | ||||
| @@ -721,7 +721,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| if(!avi->index_loaded && !url_is_streamed(pb)) | |||||
| if(!avi->index_loaded && pb->seekable) | |||||
| avi_load_index(s); | avi_load_index(s); | ||||
| avi->index_loaded = 1; | avi->index_loaded = 1; | ||||
| avi->non_interleaved |= guess_ni_flag(s); | avi->non_interleaved |= guess_ni_flag(s); | ||||
| @@ -197,7 +197,7 @@ static int avi_write_header(AVFormatContext *s) | |||||
| } | } | ||||
| avio_wl32(pb, bitrate / 8); /* XXX: not quite exact */ | avio_wl32(pb, bitrate / 8); /* XXX: not quite exact */ | ||||
| avio_wl32(pb, 0); /* padding */ | avio_wl32(pb, 0); /* padding */ | ||||
| if (url_is_streamed(pb)) | |||||
| if (!pb->seekable) | |||||
| avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_ISINTERLEAVED); /* flags */ | avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_ISINTERLEAVED); /* flags */ | ||||
| else | else | ||||
| avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_HASINDEX | AVIF_ISINTERLEAVED); /* flags */ | avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_HASINDEX | AVIF_ISINTERLEAVED); /* flags */ | ||||
| @@ -259,7 +259,7 @@ static int avi_write_header(AVFormatContext *s) | |||||
| avio_wl32(pb, 0); /* start */ | avio_wl32(pb, 0); /* start */ | ||||
| avist->frames_hdr_strm = avio_tell(pb); /* remember this offset to fill later */ | avist->frames_hdr_strm = avio_tell(pb); /* remember this offset to fill later */ | ||||
| if (url_is_streamed(pb)) | |||||
| if (!pb->seekable) | |||||
| avio_wl32(pb, AVI_MAX_RIFF_SIZE); /* FIXME: this may be broken, but who cares */ | avio_wl32(pb, AVI_MAX_RIFF_SIZE); /* FIXME: this may be broken, but who cares */ | ||||
| else | else | ||||
| avio_wl32(pb, 0); /* length, XXX: filled later */ | avio_wl32(pb, 0); /* length, XXX: filled later */ | ||||
| @@ -303,7 +303,7 @@ static int avi_write_header(AVFormatContext *s) | |||||
| } | } | ||||
| } | } | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| unsigned char tag[5]; | unsigned char tag[5]; | ||||
| int j; | int j; | ||||
| @@ -362,7 +362,7 @@ static int avi_write_header(AVFormatContext *s) | |||||
| ff_end_tag(pb, list2); | ff_end_tag(pb, list2); | ||||
| } | } | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| /* AVI could become an OpenDML one, if it grows beyond 2Gb range */ | /* AVI could become an OpenDML one, if it grows beyond 2Gb range */ | ||||
| avi->odml_list = ff_start_tag(pb, "JUNK"); | avi->odml_list = ff_start_tag(pb, "JUNK"); | ||||
| ffio_wfourcc(pb, "odml"); | ffio_wfourcc(pb, "odml"); | ||||
| @@ -406,7 +406,7 @@ static int avi_write_ix(AVFormatContext *s) | |||||
| char ix_tag[] = "ix00"; | char ix_tag[] = "ix00"; | ||||
| int i, j; | int i, j; | ||||
| assert(!url_is_streamed(pb)); | |||||
| assert(pb->seekable); | |||||
| if (avi->riff_id > AVI_MASTER_INDEX_SIZE) | if (avi->riff_id > AVI_MASTER_INDEX_SIZE) | ||||
| return -1; | return -1; | ||||
| @@ -464,7 +464,7 @@ static int avi_write_idx1(AVFormatContext *s) | |||||
| int i; | int i; | ||||
| char tag[5]; | char tag[5]; | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| AVIStream *avist; | AVIStream *avist; | ||||
| AVIIentry* ie = 0, *tie; | AVIIentry* ie = 0, *tie; | ||||
| int empty, stream_id = -1; | int empty, stream_id = -1; | ||||
| @@ -532,7 +532,7 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| avist->packet_count++; | avist->packet_count++; | ||||
| // Make sure to put an OpenDML chunk when the file size exceeds the limits | // Make sure to put an OpenDML chunk when the file size exceeds the limits | ||||
| if (!url_is_streamed(pb) && | |||||
| if (pb->seekable && | |||||
| (avio_tell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE)) { | (avio_tell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE)) { | ||||
| avi_write_ix(s); | avi_write_ix(s); | ||||
| @@ -552,7 +552,7 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| avist->audio_strm_length += size; | avist->audio_strm_length += size; | ||||
| } | } | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| AVIIndex* idx = &avist->indexes; | AVIIndex* idx = &avist->indexes; | ||||
| int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE; | int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE; | ||||
| int id = idx->entry % AVI_INDEX_CLUSTER_SIZE; | int id = idx->entry % AVI_INDEX_CLUSTER_SIZE; | ||||
| @@ -590,7 +590,7 @@ static int avi_write_trailer(AVFormatContext *s) | |||||
| int i, j, n, nb_frames; | int i, j, n, nb_frames; | ||||
| int64_t file_size; | int64_t file_size; | ||||
| if (!url_is_streamed(pb)){ | |||||
| if (pb->seekable){ | |||||
| if (avi->riff_id == 1) { | if (avi->riff_id == 1) { | ||||
| ff_end_tag(pb, avi->movi_list); | ff_end_tag(pb, avi->movi_list); | ||||
| res = avi_write_idx1(s); | res = avi_write_idx1(s); | ||||
| @@ -332,6 +332,8 @@ attribute_deprecated int av_register_protocol(URLProtocol *protocol); | |||||
| */ | */ | ||||
| int av_register_protocol2(URLProtocol *protocol, int size); | int av_register_protocol2(URLProtocol *protocol, int size); | ||||
| #define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */ | |||||
| /** | /** | ||||
| * Bytestream IO Context. | * Bytestream IO Context. | ||||
| * New fields can be added to the end with minor version bumps. | * New fields can be added to the end with minor version bumps. | ||||
| @@ -351,7 +353,9 @@ typedef struct { | |||||
| int must_flush; /**< true if the next seek should flush */ | int must_flush; /**< true if the next seek should flush */ | ||||
| int eof_reached; /**< true if eof reached */ | int eof_reached; /**< true if eof reached */ | ||||
| int write_flag; /**< true if open for writing */ | int write_flag; /**< true if open for writing */ | ||||
| int is_streamed; | |||||
| #if FF_API_OLD_AVIO | |||||
| attribute_deprecated int is_streamed; | |||||
| #endif | |||||
| int max_packet_size; | int max_packet_size; | ||||
| unsigned long checksum; | unsigned long checksum; | ||||
| unsigned char *checksum_ptr; | unsigned char *checksum_ptr; | ||||
| @@ -360,6 +364,10 @@ typedef struct { | |||||
| int (*read_pause)(void *opaque, int pause); | int (*read_pause)(void *opaque, int pause); | ||||
| int64_t (*read_seek)(void *opaque, int stream_index, | int64_t (*read_seek)(void *opaque, int stream_index, | ||||
| int64_t timestamp, int flags); | int64_t timestamp, int flags); | ||||
| /** | |||||
| * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. | |||||
| */ | |||||
| int seekable; | |||||
| } AVIOContext; | } AVIOContext; | ||||
| #if FF_API_OLD_AVIO | #if FF_API_OLD_AVIO | ||||
| @@ -604,10 +612,15 @@ unsigned int avio_rb24(AVIOContext *s); | |||||
| unsigned int avio_rb32(AVIOContext *s); | unsigned int avio_rb32(AVIOContext *s); | ||||
| uint64_t avio_rb64(AVIOContext *s); | uint64_t avio_rb64(AVIOContext *s); | ||||
| static inline int url_is_streamed(AVIOContext *s) | |||||
| #if FF_API_OLD_AVIO | |||||
| /** | |||||
| * @deprecated Use AVIOContext.seekable field directly. | |||||
| */ | |||||
| attribute_deprecated static inline int url_is_streamed(AVIOContext *s) | |||||
| { | { | ||||
| return s->is_streamed; | |||||
| return !s->seekable; | |||||
| } | } | ||||
| #endif | |||||
| /** | /** | ||||
| * Create and initialize a AVIOContext for accessing the | * Create and initialize a AVIOContext for accessing the | ||||
| @@ -62,7 +62,10 @@ int ffio_init_context(AVIOContext *s, | |||||
| s->must_flush = 0; | s->must_flush = 0; | ||||
| s->eof_reached = 0; | s->eof_reached = 0; | ||||
| s->error = 0; | s->error = 0; | ||||
| #if FF_API_OLD_AVIO | |||||
| s->is_streamed = 0; | s->is_streamed = 0; | ||||
| #endif | |||||
| s->seekable = AVIO_SEEKABLE_NORMAL; | |||||
| s->max_packet_size = 0; | s->max_packet_size = 0; | ||||
| s->update_checksum= NULL; | s->update_checksum= NULL; | ||||
| if(!read_packet && !write_flag){ | if(!read_packet && !write_flag){ | ||||
| @@ -202,7 +205,7 @@ int64_t avio_seek(AVIOContext *s, int64_t offset, int whence) | |||||
| offset1 >= 0 && offset1 <= (s->buf_end - s->buffer)) { | offset1 >= 0 && offset1 <= (s->buf_end - s->buffer)) { | ||||
| /* can do the seek inside the buffer */ | /* can do the seek inside the buffer */ | ||||
| s->buf_ptr = s->buffer + offset1; | s->buf_ptr = s->buffer + offset1; | ||||
| } else if ((s->is_streamed || | |||||
| } else if ((!s->seekable || | |||||
| offset1 <= s->buf_end + SHORT_SEEK_THRESHOLD - s->buffer) && | offset1 <= s->buf_end + SHORT_SEEK_THRESHOLD - s->buffer) && | ||||
| !s->write_flag && offset1 >= 0 && | !s->write_flag && offset1 >= 0 && | ||||
| (whence != SEEK_END || force)) { | (whence != SEEK_END || force)) { | ||||
| @@ -831,7 +834,10 @@ int url_fdopen(AVIOContext **s, URLContext *h) | |||||
| av_freep(s); | av_freep(s); | ||||
| return AVERROR(EIO); | return AVERROR(EIO); | ||||
| } | } | ||||
| #if FF_API_OLD_AVIO | |||||
| (*s)->is_streamed = h->is_streamed; | (*s)->is_streamed = h->is_streamed; | ||||
| #endif | |||||
| (*s)->seekable = h->is_streamed ? 0 : AVIO_SEEKABLE_NORMAL; | |||||
| (*s)->max_packet_size = max_packet_size; | (*s)->max_packet_size = max_packet_size; | ||||
| if(h->prot) { | if(h->prot) { | ||||
| (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause; | (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause; | ||||
| @@ -247,7 +247,7 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in | |||||
| BinkDemuxContext *bink = s->priv_data; | BinkDemuxContext *bink = s->priv_data; | ||||
| AVStream *vst = s->streams[0]; | AVStream *vst = s->streams[0]; | ||||
| if (url_is_streamed(s->pb)) | |||||
| if (!s->pb->seekable) | |||||
| return -1; | return -1; | ||||
| /* seek to the first frame */ | /* seek to the first frame */ | ||||
| @@ -223,7 +223,7 @@ static int read_header(AVFormatContext *s, | |||||
| /* stop at data chunk if seeking is not supported or | /* stop at data chunk if seeking is not supported or | ||||
| data chunk size is unknown */ | data chunk size is unknown */ | ||||
| if (found_data && (caf->data_size < 0 || url_is_streamed(pb))) | |||||
| if (found_data && (caf->data_size < 0 || !pb->seekable)) | |||||
| break; | break; | ||||
| tag = avio_rb32(pb); | tag = avio_rb32(pb); | ||||
| @@ -236,7 +236,7 @@ static int read_header(AVFormatContext *s, | |||||
| avio_skip(pb, 4); /* edit count */ | avio_skip(pb, 4); /* edit count */ | ||||
| caf->data_start = avio_tell(pb); | caf->data_start = avio_tell(pb); | ||||
| caf->data_size = size < 0 ? -1 : size - 4; | caf->data_size = size < 0 ? -1 : size - 4; | ||||
| if (caf->data_size > 0 && !url_is_streamed(pb)) | |||||
| if (caf->data_size > 0 && pb->seekable) | |||||
| avio_skip(pb, caf->data_size); | avio_skip(pb, caf->data_size); | ||||
| found_data = 1; | found_data = 1; | ||||
| break; | break; | ||||
| @@ -281,7 +281,7 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| goto fail; | goto fail; | ||||
| ffm->write_index = avio_rb64(pb); | ffm->write_index = avio_rb64(pb); | ||||
| /* get also filesize */ | /* get also filesize */ | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| ffm->file_size = avio_size(pb); | ffm->file_size = avio_size(pb); | ||||
| if (ffm->write_index) | if (ffm->write_index) | ||||
| adjust_write_index(s); | adjust_write_index(s); | ||||
| @@ -40,7 +40,7 @@ static int read_header(AVFormatContext *s, | |||||
| AVIOContext *pb = s->pb; | AVIOContext *pb = s->pb; | ||||
| AVStream *st; | AVStream *st; | ||||
| if (url_is_streamed(s->pb)) | |||||
| if (!s->pb->seekable) | |||||
| return AVERROR(EIO); | return AVERROR(EIO); | ||||
| avio_seek(pb, avio_size(pb) - 36, SEEK_SET); | avio_seek(pb, avio_size(pb) - 36, SEEK_SET); | ||||
| @@ -98,7 +98,7 @@ static int flac_write_trailer(struct AVFormatContext *s) | |||||
| if (!ff_flac_is_extradata_valid(s->streams[0]->codec, &format, &streaminfo)) | if (!ff_flac_is_extradata_valid(s->streams[0]->codec, &format, &streaminfo)) | ||||
| return -1; | return -1; | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| /* rewrite the STREAMINFO header block data */ | /* rewrite the STREAMINFO header block data */ | ||||
| file_size = avio_tell(pb); | file_size = avio_tell(pb); | ||||
| avio_seek(pb, 8, SEEK_SET); | avio_seek(pb, 8, SEEK_SET); | ||||
| @@ -437,7 +437,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| } | } | ||||
| // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps | // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps | ||||
| if(!url_is_streamed(s->pb) && (!s->duration || s->duration==AV_NOPTS_VALUE)){ | |||||
| if(s->pb->seekable && (!s->duration || s->duration==AV_NOPTS_VALUE)){ | |||||
| int size; | int size; | ||||
| const int64_t pos= avio_tell(s->pb); | const int64_t pos= avio_tell(s->pb); | ||||
| const int64_t fsize= avio_size(s->pb); | const int64_t fsize= avio_size(s->pb); | ||||
| @@ -539,7 +539,7 @@ static int flv_read_seek2(AVFormatContext *s, int stream_index, | |||||
| if (ts - min_ts > (uint64_t)(max_ts - ts)) flags |= AVSEEK_FLAG_BACKWARD; | if (ts - min_ts > (uint64_t)(max_ts - ts)) flags |= AVSEEK_FLAG_BACKWARD; | ||||
| if (url_is_streamed(s->pb)) { | |||||
| if (!s->pb->seekable) { | |||||
| if (stream_index < 0) { | if (stream_index < 0) { | ||||
| stream_index = av_find_default_stream_index(s); | stream_index = av_find_default_stream_index(s); | ||||
| if (stream_index < 0) | if (stream_index < 0) | ||||
| @@ -634,7 +634,7 @@ static int gxf_write_header(AVFormatContext *s) | |||||
| uint8_t tracks[255] = {0}; | uint8_t tracks[255] = {0}; | ||||
| int i, media_info = 0; | int i, media_info = 0; | ||||
| if (url_is_streamed(pb)) { | |||||
| if (!pb->seekable) { | |||||
| av_log(s, AV_LOG_ERROR, "gxf muxer does not support streamed output, patch welcome"); | av_log(s, AV_LOG_ERROR, "gxf muxer does not support streamed output, patch welcome"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -229,7 +229,7 @@ void ff_id3v1_read(AVFormatContext *s) | |||||
| uint8_t buf[ID3v1_TAG_SIZE]; | uint8_t buf[ID3v1_TAG_SIZE]; | ||||
| int64_t filesize, position = avio_tell(s->pb); | int64_t filesize, position = avio_tell(s->pb); | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| /* XXX: change that */ | /* XXX: change that */ | ||||
| filesize = avio_size(s->pb); | filesize = avio_size(s->pb); | ||||
| if (filesize > 128) { | if (filesize > 128) { | ||||
| @@ -1117,7 +1117,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) | |||||
| int i; | int i; | ||||
| // we should not do any seeking in the streaming case | // we should not do any seeking in the streaming case | ||||
| if (url_is_streamed(matroska->ctx->pb) || | |||||
| if (!matroska->ctx->pb->seekable || | |||||
| (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)) | (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)) | ||||
| return; | return; | ||||
| @@ -848,7 +848,7 @@ static int mkv_write_header(AVFormatContext *s) | |||||
| if (ret < 0) return ret; | if (ret < 0) return ret; | ||||
| } | } | ||||
| if (url_is_streamed(s->pb)) | |||||
| if (!s->pb->seekable) | |||||
| mkv_write_seekhead(pb, mkv->main_seekhead); | mkv_write_seekhead(pb, mkv->main_seekhead); | ||||
| mkv->cues = mkv_start_cues(mkv->segment_offset); | mkv->cues = mkv_start_cues(mkv->segment_offset); | ||||
| @@ -1024,7 +1024,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt) | |||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| if (url_is_streamed(s->pb)) { | |||||
| if (!s->pb->seekable) { | |||||
| if (!mkv->dyn_bc) | if (!mkv->dyn_bc) | ||||
| url_open_dyn_buf(&mkv->dyn_bc); | url_open_dyn_buf(&mkv->dyn_bc); | ||||
| pb = mkv->dyn_bc; | pb = mkv->dyn_bc; | ||||
| @@ -1076,16 +1076,16 @@ static int mkv_copy_packet(MatroskaMuxContext *mkv, const AVPacket *pkt) | |||||
| static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) | static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) | ||||
| { | { | ||||
| MatroskaMuxContext *mkv = s->priv_data; | MatroskaMuxContext *mkv = s->priv_data; | ||||
| AVIOContext *pb = url_is_streamed(s->pb) ? mkv->dyn_bc : s->pb; | |||||
| AVIOContext *pb = s->pb->seekable ? s->pb : mkv->dyn_bc; | |||||
| AVCodecContext *codec = s->streams[pkt->stream_index]->codec; | AVCodecContext *codec = s->streams[pkt->stream_index]->codec; | ||||
| int ret, keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); | int ret, keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); | ||||
| int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; | int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; | ||||
| int cluster_size = avio_tell(pb) - (url_is_streamed(s->pb) ? 0 : mkv->cluster_pos); | |||||
| int cluster_size = avio_tell(pb) - (s->pb->seekable ? mkv->cluster_pos : 0); | |||||
| // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or | // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or | ||||
| // after 4k and on a keyframe | // after 4k and on a keyframe | ||||
| if (mkv->cluster_pos && | if (mkv->cluster_pos && | ||||
| ((url_is_streamed(s->pb) && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000)) | |||||
| ((!s->pb->seekable && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000)) | |||||
| || cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000 | || cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000 | ||||
| || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) { | || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) { | ||||
| av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 | av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 | ||||
| @@ -1139,7 +1139,7 @@ static int mkv_write_trailer(AVFormatContext *s) | |||||
| end_ebml_master(pb, mkv->cluster); | end_ebml_master(pb, mkv->cluster); | ||||
| } | } | ||||
| if (!url_is_streamed(pb)) { | |||||
| if (pb->seekable) { | |||||
| cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams); | cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams); | ||||
| ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES , cuespos); | ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES , cuespos); | ||||
| @@ -133,7 +133,7 @@ static int mmf_write_trailer(AVFormatContext *s) | |||||
| int64_t pos, size; | int64_t pos, size; | ||||
| int gatetime; | int gatetime; | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| /* Fill in length fields */ | /* Fill in length fields */ | ||||
| end_tag_be(pb, mmf->awapos); | end_tag_be(pb, mmf->awapos); | ||||
| end_tag_be(pb, mmf->atrpos); | end_tag_be(pb, mmf->atrpos); | ||||
| @@ -304,7 +304,7 @@ static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| if (err < 0) | if (err < 0) | ||||
| return err; | return err; | ||||
| if (c->found_moov && c->found_mdat && | if (c->found_moov && c->found_mdat && | ||||
| (url_is_streamed(pb) || start_pos + a.size == avio_size(pb))) | |||||
| (!pb->seekable || start_pos + a.size == avio_size(pb))) | |||||
| return 0; | return 0; | ||||
| left = a.size - avio_tell(pb) + start_pos; | left = a.size - avio_tell(pb) + start_pos; | ||||
| if (left > 0) /* skip garbage at atom end */ | if (left > 0) /* skip garbage at atom end */ | ||||
| @@ -2354,7 +2354,7 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| mov->fc = s; | mov->fc = s; | ||||
| /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */ | /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */ | ||||
| if(!url_is_streamed(pb)) | |||||
| if(pb->seekable) | |||||
| atom.size = avio_size(pb); | atom.size = avio_size(pb); | ||||
| else | else | ||||
| atom.size = INT64_MAX; | atom.size = INT64_MAX; | ||||
| @@ -2370,7 +2370,7 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| } | } | ||||
| av_dlog(mov->fc, "on_parse_exit_offset=%lld\n", avio_tell(pb)); | av_dlog(mov->fc, "on_parse_exit_offset=%lld\n", avio_tell(pb)); | ||||
| if (!url_is_streamed(pb) && mov->chapter_track > 0) | |||||
| if (pb->seekable && mov->chapter_track > 0) | |||||
| mov_read_chapters(s); | mov_read_chapters(s); | ||||
| return 0; | return 0; | ||||
| @@ -2388,8 +2388,8 @@ static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st) | |||||
| AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample]; | AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample]; | ||||
| int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale); | int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale); | ||||
| av_dlog(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts); | av_dlog(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts); | ||||
| if (!sample || (url_is_streamed(s->pb) && current_sample->pos < sample->pos) || | |||||
| (!url_is_streamed(s->pb) && | |||||
| if (!sample || (!s->pb->seekable && current_sample->pos < sample->pos) || | |||||
| (s->pb->seekable && | |||||
| ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb && | ((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 && current_sample->pos < sample->pos) || | ||||
| (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) { | (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) { | ||||
| @@ -2413,7 +2413,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| sample = mov_find_next_sample(s, &st); | sample = mov_find_next_sample(s, &st); | ||||
| if (!sample) { | if (!sample) { | ||||
| mov->found_mdat = 0; | mov->found_mdat = 0; | ||||
| if (!url_is_streamed(s->pb) || | |||||
| if (s->pb->seekable|| | |||||
| mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 || | mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 || | ||||
| s->pb->eof_reached) | s->pb->eof_reached) | ||||
| return AVERROR_EOF; | return AVERROR_EOF; | ||||
| @@ -1955,7 +1955,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| unsigned int samplesInChunk = 0; | unsigned int samplesInChunk = 0; | ||||
| int size= pkt->size; | int size= pkt->size; | ||||
| if (url_is_streamed(s->pb)) return 0; /* Can't handle that */ | |||||
| if (!s->pb->seekable) return 0; /* Can't handle that */ | |||||
| if (!size) return 0; /* Discard 0 sized packets */ | if (!size) return 0; /* Discard 0 sized packets */ | ||||
| if (enc->codec_id == CODEC_ID_AMR_NB) { | if (enc->codec_id == CODEC_ID_AMR_NB) { | ||||
| @@ -2090,7 +2090,7 @@ static int mov_write_header(AVFormatContext *s) | |||||
| MOVMuxContext *mov = s->priv_data; | MOVMuxContext *mov = s->priv_data; | ||||
| int i, hint_track = 0; | int i, hint_track = 0; | ||||
| if (url_is_streamed(s->pb)) { | |||||
| if (!s->pb->seekable) { | |||||
| av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); | av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -93,7 +93,7 @@ static int mpc_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| st->duration = c->fcount; | st->duration = c->fcount; | ||||
| /* try to read APE tags */ | /* try to read APE tags */ | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| int64_t pos = avio_tell(s->pb); | int64_t pos = avio_tell(s->pb); | ||||
| ff_ape_parse_tag(s); | ff_ape_parse_tag(s); | ||||
| if (!av_metadata_get(s->metadata, "", NULL, AV_METADATA_IGNORE_SUFFIX)) | if (!av_metadata_get(s->metadata, "", NULL, AV_METADATA_IGNORE_SUFFIX)) | ||||
| @@ -402,7 +402,7 @@ static int mpegps_read_pes_header(AVFormatContext *s, | |||||
| int i; | int i; | ||||
| for(i=0; i<s->nb_streams; i++){ | for(i=0; i<s->nb_streams; i++){ | ||||
| if(startcode == s->streams[i]->id && | if(startcode == s->streams[i]->id && | ||||
| !url_is_streamed(s->pb) /* index useless on streams anyway */) { | |||||
| s->pb->seekable /* index useless on streams anyway */) { | |||||
| ff_reduce_index(s, i); | ff_reduce_index(s, i); | ||||
| av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); | av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); | ||||
| } | } | ||||
| @@ -1784,7 +1784,7 @@ static int mxf_write_footer(AVFormatContext *s) | |||||
| mxf_write_klv_fill(s); | mxf_write_klv_fill(s); | ||||
| mxf_write_random_index_pack(s); | mxf_write_random_index_pack(s); | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| avio_seek(pb, 0, SEEK_SET); | avio_seek(pb, 0, SEEK_SET); | ||||
| if (mxf->edit_unit_byte_count) { | if (mxf->edit_unit_byte_count) { | ||||
| mxf_write_partition(s, 1, 2, header_closed_partition_key, 1); | mxf_write_partition(s, 1, 2, header_closed_partition_key, 1); | ||||
| @@ -653,7 +653,7 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| s->data_offset= pos-8; | s->data_offset= pos-8; | ||||
| if(!url_is_streamed(bc)){ | |||||
| if(bc->seekable){ | |||||
| int64_t orig_pos= avio_tell(bc); | int64_t orig_pos= avio_tell(bc); | ||||
| find_and_decode_index(nut); | find_and_decode_index(nut); | ||||
| avio_seek(bc, orig_pos, SEEK_SET); | avio_seek(bc, orig_pos, SEEK_SET); | ||||
| @@ -455,7 +455,7 @@ ogg_get_length (AVFormatContext * s) | |||||
| int i; | int i; | ||||
| int64_t size, end; | int64_t size, end; | ||||
| if(url_is_streamed(s->pb)) | |||||
| if(!s->pb->seekable) | |||||
| return 0; | return 0; | ||||
| // already set | // already set | ||||
| @@ -177,7 +177,7 @@ static int r3d_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| s->data_offset = avio_tell(s->pb); | s->data_offset = avio_tell(s->pb); | ||||
| av_dlog(s, "data offset %#llx\n", s->data_offset); | av_dlog(s, "data offset %#llx\n", s->data_offset); | ||||
| if (url_is_streamed(s->pb)) | |||||
| if (!s->pb->seekable) | |||||
| return 0; | return 0; | ||||
| // find REOB/REOF/REOS to load index | // find REOB/REOF/REOS to load index | ||||
| avio_seek(s->pb, avio_size(s->pb)-48-8, SEEK_SET); | avio_seek(s->pb, avio_size(s->pb)-48-8, SEEK_SET); | ||||
| @@ -481,7 +481,7 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| if (!data_off) | if (!data_off) | ||||
| data_off = avio_tell(pb) - 18; | data_off = avio_tell(pb) - 18; | ||||
| if (indx_off && !url_is_streamed(pb) && !(s->flags & AVFMT_FLAG_IGNIDX) && | |||||
| if (indx_off && pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX) && | |||||
| avio_seek(pb, indx_off, SEEK_SET) >= 0) { | avio_seek(pb, indx_off, SEEK_SET) >= 0) { | ||||
| rm_read_index(s); | rm_read_index(s); | ||||
| avio_seek(pb, data_off + 18, SEEK_SET); | avio_seek(pb, data_off + 18, SEEK_SET); | ||||
| @@ -118,7 +118,7 @@ static int rv10_write_header(AVFormatContext *ctx, | |||||
| avio_wb32(s, 0); /* data offset : will be patched after */ | avio_wb32(s, 0); /* data offset : will be patched after */ | ||||
| avio_wb16(s, ctx->nb_streams); /* num streams */ | avio_wb16(s, ctx->nb_streams); /* num streams */ | ||||
| flags = 1 | 2; /* save allowed & perfect play */ | flags = 1 | 2; /* save allowed & perfect play */ | ||||
| if (url_is_streamed(s)) | |||||
| if (!s->seekable) | |||||
| flags |= 4; /* live broadcast */ | flags |= 4; /* live broadcast */ | ||||
| avio_wb16(s, flags); | avio_wb16(s, flags); | ||||
| @@ -170,7 +170,7 @@ static int rv10_write_header(AVFormatContext *ctx, | |||||
| avio_wb32(s, 0); /* start time */ | avio_wb32(s, 0); /* start time */ | ||||
| avio_wb32(s, BUFFER_DURATION); /* preroll */ | avio_wb32(s, BUFFER_DURATION); /* preroll */ | ||||
| /* duration */ | /* duration */ | ||||
| if (url_is_streamed(s) || !stream->total_frames) | |||||
| if (!s->seekable || !stream->total_frames) | |||||
| avio_wb32(s, (int)(3600 * 1000)); | avio_wb32(s, (int)(3600 * 1000)); | ||||
| else | else | ||||
| avio_wb32(s, (int)(stream->total_frames * 1000 / stream->frame_rate)); | avio_wb32(s, (int)(stream->total_frames * 1000 / stream->frame_rate)); | ||||
| @@ -434,7 +434,7 @@ static int rm_write_trailer(AVFormatContext *s) | |||||
| int data_size, index_pos, i; | int data_size, index_pos, i; | ||||
| AVIOContext *pb = s->pb; | AVIOContext *pb = s->pb; | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| /* end of file: finish to write header */ | /* end of file: finish to write header */ | ||||
| index_pos = avio_tell(pb); | index_pos = avio_tell(pb); | ||||
| data_size = index_pos - rm->data_pos; | data_size = index_pos - rm->data_pos; | ||||
| @@ -38,7 +38,7 @@ static int rso_write_header(AVFormatContext *s) | |||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| } | } | ||||
| if (url_is_streamed(s->pb)) { | |||||
| if (!s->pb->seekable) { | |||||
| av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); | av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); | ||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| } | } | ||||
| @@ -96,7 +96,7 @@ static int sox_write_trailer(AVFormatContext *s) | |||||
| AVIOContext *pb = s->pb; | AVIOContext *pb = s->pb; | ||||
| AVCodecContext *enc = s->streams[0]->codec; | AVCodecContext *enc = s->streams[0]->codec; | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| /* update number of samples */ | /* update number of samples */ | ||||
| int64_t file_size = avio_tell(pb); | int64_t file_size = avio_tell(pb); | ||||
| int64_t num_samples = (file_size - sox->header_size - 4LL) >> 2LL; | int64_t num_samples = (file_size - sox->header_size - 4LL) >> 2LL; | ||||
| @@ -492,7 +492,7 @@ static int swf_write_trailer(AVFormatContext *s) | |||||
| avio_flush(s->pb); | avio_flush(s->pb); | ||||
| /* patch file size and number of frames if not streamed */ | /* patch file size and number of frames if not streamed */ | ||||
| if (!url_is_streamed(s->pb) && video_enc) { | |||||
| if (s->pb->seekable && video_enc) { | |||||
| file_size = avio_tell(pb); | file_size = avio_tell(pb); | ||||
| avio_seek(pb, 4, SEEK_SET); | avio_seek(pb, 4, SEEK_SET); | ||||
| avio_wl32(pb, file_size); | avio_wl32(pb, file_size); | ||||
| @@ -88,7 +88,7 @@ static int read_header(AVFormatContext *avctx, | |||||
| /* simulate tty display speed */ | /* simulate tty display speed */ | ||||
| s->chars_per_frame = FFMAX(av_q2d(st->time_base) * (ap->sample_rate ? ap->sample_rate : LINE_RATE), 1); | s->chars_per_frame = FFMAX(av_q2d(st->time_base) * (ap->sample_rate ? ap->sample_rate : LINE_RATE), 1); | ||||
| if (!url_is_streamed(avctx->pb)) { | |||||
| if (avctx->pb->seekable) { | |||||
| s->fsize = avio_size(avctx->pb); | s->fsize = avio_size(avctx->pb); | ||||
| st->duration = (s->fsize + s->chars_per_frame - 1) / s->chars_per_frame; | st->duration = (s->fsize + s->chars_per_frame - 1) / s->chars_per_frame; | ||||
| @@ -2019,7 +2019,7 @@ static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset) | |||||
| if ((!strcmp(ic->iformat->name, "mpeg") || | if ((!strcmp(ic->iformat->name, "mpeg") || | ||||
| !strcmp(ic->iformat->name, "mpegts")) && | !strcmp(ic->iformat->name, "mpegts")) && | ||||
| file_size && !url_is_streamed(ic->pb)) { | |||||
| file_size && ic->pb->seekable) { | |||||
| /* get accurate estimate from the PTSes */ | /* get accurate estimate from the PTSes */ | ||||
| av_estimate_timings_from_pts(ic, old_offset); | av_estimate_timings_from_pts(ic, old_offset); | ||||
| } else if (av_has_duration(ic)) { | } else if (av_has_duration(ic)) { | ||||
| @@ -73,7 +73,7 @@ static int vc1test_write_trailer(AVFormatContext *s) | |||||
| RCVContext *ctx = s->priv_data; | RCVContext *ctx = s->priv_data; | ||||
| AVIOContext *pb = s->pb; | AVIOContext *pb = s->pb; | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| avio_seek(pb, 0, SEEK_SET); | avio_seek(pb, 0, SEEK_SET); | ||||
| avio_wl24(pb, ctx->frames); | avio_wl24(pb, ctx->frames); | ||||
| avio_flush(pb); | avio_flush(pb); | ||||
| @@ -78,7 +78,7 @@ voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) | |||||
| return AVERROR(EIO); | return AVERROR(EIO); | ||||
| voc->remaining_size = avio_rl24(pb); | voc->remaining_size = avio_rl24(pb); | ||||
| if (!voc->remaining_size) { | if (!voc->remaining_size) { | ||||
| if (url_is_streamed(s->pb)) | |||||
| if (!s->pb->seekable) | |||||
| return AVERROR(EIO); | return AVERROR(EIO); | ||||
| voc->remaining_size = avio_size(pb) - avio_tell(pb); | voc->remaining_size = avio_size(pb) - avio_tell(pb); | ||||
| } | } | ||||
| @@ -58,7 +58,7 @@ static int wav_write_header(AVFormatContext *s) | |||||
| ff_end_tag(pb, fmt); | ff_end_tag(pb, fmt); | ||||
| if (s->streams[0]->codec->codec_tag != 0x01 /* hence for all other than PCM */ | if (s->streams[0]->codec->codec_tag != 0x01 /* hence for all other than PCM */ | ||||
| && !url_is_streamed(s->pb)) { | |||||
| && s->pb->seekable) { | |||||
| fact = ff_start_tag(pb, "fact"); | fact = ff_start_tag(pb, "fact"); | ||||
| avio_wl32(pb, 0); | avio_wl32(pb, 0); | ||||
| ff_end_tag(pb, fact); | ff_end_tag(pb, fact); | ||||
| @@ -98,7 +98,7 @@ static int wav_write_trailer(AVFormatContext *s) | |||||
| avio_flush(pb); | avio_flush(pb); | ||||
| if (!url_is_streamed(s->pb)) { | |||||
| if (s->pb->seekable) { | |||||
| ff_end_tag(pb, wav->data); | ff_end_tag(pb, wav->data); | ||||
| /* update file size */ | /* update file size */ | ||||
| @@ -121,7 +121,7 @@ static int wv_read_block_header(AVFormatContext *ctx, AVIOContext *pb, int appen | |||||
| } | } | ||||
| if((rate == -1 || !chan) && !wc->block_parsed){ | if((rate == -1 || !chan) && !wc->block_parsed){ | ||||
| int64_t block_end = avio_tell(pb) + wc->blksize - 24; | int64_t block_end = avio_tell(pb) + wc->blksize - 24; | ||||
| if(url_is_streamed(pb)){ | |||||
| if(!pb->seekable){ | |||||
| av_log(ctx, AV_LOG_ERROR, "Cannot determine additional parameters\n"); | av_log(ctx, AV_LOG_ERROR, "Cannot determine additional parameters\n"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -223,7 +223,7 @@ static int wv_read_header(AVFormatContext *s, | |||||
| st->start_time = 0; | st->start_time = 0; | ||||
| st->duration = wc->samples; | st->duration = wc->samples; | ||||
| if(!url_is_streamed(s->pb)) { | |||||
| if(s->pb->seekable) { | |||||
| int64_t cur = avio_tell(s->pb); | int64_t cur = avio_tell(s->pb); | ||||
| ff_ape_parse_tag(s); | ff_ape_parse_tag(s); | ||||
| if(!av_metadata_get(s->metadata, "", NULL, AV_METADATA_IGNORE_SUFFIX)) | if(!av_metadata_get(s->metadata, "", NULL, AV_METADATA_IGNORE_SUFFIX)) | ||||