mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
avformat/flvenc: do not attempt to write duration and filesize when not seekable
Its impossible to update the filesize & duration values if seekback is not possible as with live streams Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
c0e2846dcd
commit
5702416c57
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user