|
|
@@ -336,20 +336,15 @@ static void end_ebml_master(AVIOContext *pb, ebml_master master) |
|
|
|
static int start_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, |
|
|
|
ebml_master *master, uint32_t elementid, uint64_t expectedsize) |
|
|
|
{ |
|
|
|
int ret; |
|
|
|
int ret, bytes = expectedsize ? ebml_num_size(expectedsize) : 8; |
|
|
|
|
|
|
|
if ((ret = avio_open_dyn_buf(dyn_cp)) < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
if (pb->seekable & AVIO_SEEKABLE_NORMAL) { |
|
|
|
int bytes = expectedsize ? ebml_num_size(expectedsize) : 8; |
|
|
|
|
|
|
|
put_ebml_id(pb, elementid); |
|
|
|
*master = (ebml_master) { avio_tell(pb), bytes }; |
|
|
|
if (mkv->write_crc) |
|
|
|
put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */ |
|
|
|
} else |
|
|
|
*master = start_ebml_master(*dyn_cp, elementid, expectedsize); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
@@ -360,7 +355,6 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, Matrosk |
|
|
|
uint8_t *buf, crc[4]; |
|
|
|
int size, skip = 0; |
|
|
|
|
|
|
|
if (pb->seekable & AVIO_SEEKABLE_NORMAL) { |
|
|
|
size = avio_close_dyn_buf(*dyn_cp, &buf); |
|
|
|
put_ebml_num(pb, size, master.sizebytes); |
|
|
|
if (mkv->write_crc) { |
|
|
@@ -369,11 +363,7 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, Matrosk |
|
|
|
put_ebml_binary(pb, EBML_ID_CRC32, crc, sizeof(crc)); |
|
|
|
} |
|
|
|
avio_write(pb, buf + skip, size - skip); |
|
|
|
} else { |
|
|
|
end_ebml_master(*dyn_cp, master); |
|
|
|
size = avio_close_dyn_buf(*dyn_cp, &buf); |
|
|
|
avio_write(pb, buf, size); |
|
|
|
} |
|
|
|
|
|
|
|
av_free(buf); |
|
|
|
*dyn_cp = NULL; |
|
|
|
} |
|
|
|