aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Conrad <lessen42@gmail.com>2010-03-04 08:53:04 +0000
committerDavid Conrad <lessen42@gmail.com>2010-03-04 08:53:04 +0000
commit7a2a484081ae5a4ad8d3805e27e3ee075cf7f2b7 (patch)
treed69b23ed921b1b83d292e2c7b7f642d486ba4b16
parent2529bb3019a027c39d6ba7de3e7d4c7a49bdf384 (diff)
downloadffmpeg-7a2a484081ae5a4ad8d3805e27e3ee075cf7f2b7.tar.gz
Write the first seekhead if writing to a stream, we won't be able to seek
back and write it at the end Originally committed as revision 22198 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/matroskaenc.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 0f74ad3fb8..98d47e5bef 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -288,7 +288,8 @@ static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid
* be written at the location reserved for it. Otherwise, it is written
* at the current location in the file.
*
- * @return The file offset where the seekhead was written.
+ * @return The file offset where the seekhead was written,
+ * -1 if an error occurred.
*/
static int64_t mkv_write_seekhead(ByteIOContext *pb, mkv_seekhead *seekhead)
{
@@ -299,7 +300,8 @@ static int64_t mkv_write_seekhead(ByteIOContext *pb, mkv_seekhead *seekhead)
currentpos = url_ftell(pb);
if (seekhead->reserved_size > 0)
- url_fseek(pb, seekhead->filepos, SEEK_SET);
+ if (url_fseek(pb, seekhead->filepos, SEEK_SET) < 0)
+ return -1;
metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size);
for (i = 0; i < seekhead->num_entries; i++) {
@@ -731,6 +733,9 @@ static int mkv_write_header(AVFormatContext *s)
put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0);
mkv->cluster_pts = 0;
+ if (url_is_streamed(s->pb))
+ mkv_write_seekhead(pb, mkv->main_seekhead);
+
mkv->cues = mkv_start_cues(mkv->segment_offset);
if (mkv->cues == NULL)
return AVERROR(ENOMEM);
@@ -896,8 +901,10 @@ static int mkv_write_trailer(AVFormatContext *s)
ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES , cuespos);
if (ret < 0) return ret;
- ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_SEEKHEAD, second_seekhead);
- if (ret < 0) return ret;
+ if (second_seekhead >= 0) {
+ ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_SEEKHEAD, second_seekhead);
+ if (ret < 0) return ret;
+ }
mkv_write_seekhead(pb, mkv->main_seekhead);
// update the duration