diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index 99903f5525..e50f8e4519 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -234,16 +234,18 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) metadata_count_pos = avio_tell(pb); metadata_count = 4 * !!flv->video_par + 5 * !!flv->audio_par + - 1 * !!flv->data_par + - 2; // +2 for duration and file size - + 1 * !!flv->data_par; + if (pb->seekable) { + metadata_count += 2; // +2 for duration and file size + } avio_wb32(pb, metadata_count); - put_amf_string(pb, "duration"); - flv->duration_offset = avio_tell(pb); - - // fill in the guessed duration, it'll be corrected later if incorrect - put_amf_double(pb, s->duration / AV_TIME_BASE); + if (pb->seekable) { + put_amf_string(pb, "duration"); + flv->duration_offset = avio_tell(pb); + // fill in the guessed duration, it'll be corrected later if incorrect + put_amf_double(pb, s->duration / AV_TIME_BASE); + } if (flv->video_par) { put_amf_string(pb, "width"); @@ -319,9 +321,11 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) metadata_count++; } - put_amf_string(pb, "filesize"); - flv->filesize_offset = avio_tell(pb); - put_amf_double(pb, 0); // delayed write + if (pb->seekable) { + put_amf_string(pb, "filesize"); + flv->filesize_offset = avio_tell(pb); + put_amf_double(pb, 0); // delayed write + } put_amf_string(pb, ""); avio_w8(pb, AMF_END_OF_OBJECT); @@ -543,16 +547,19 @@ static int flv_write_trailer(AVFormatContext *s) file_size = avio_tell(pb); - /* update information */ - if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0) - av_log(s, AV_LOG_WARNING, "Failed to update header with correct duration.\n"); - else - put_amf_double(pb, flv->duration / (double)1000); - if (avio_seek(pb, flv->filesize_offset, SEEK_SET) < 0) - av_log(s, AV_LOG_WARNING, "Failed to update header with correct filesize.\n"); - else - put_amf_double(pb, file_size); - + if (pb->seekable) { + /* update information */ + if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0) { + av_log(s, AV_LOG_WARNING, "Failed to update header with correct duration.\n"); + } else { + put_amf_double(pb, flv->duration / (double)1000); + } + if (avio_seek(pb, flv->filesize_offset, SEEK_SET) < 0) { + av_log(s, AV_LOG_WARNING, "Failed to update header with correct filesize.\n"); + } else { + put_amf_double(pb, file_size); + } + } avio_seek(pb, file_size, SEEK_SET); return 0; }