mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-16 20:07:04 +00:00
avformat/matroskaenc: Don't waste bytes writing level 1 elements
Up until now, the length field of most level 1 elements has been written using eight bytes, although it is known in advance how much space the content of said elements will take up so that it would be possible to determine the minimal amount of bytes for the length field. This commit changes this. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
08f5d97299
commit
0b61ddb576
@ -60,7 +60,7 @@
|
||||
typedef struct ebml_master {
|
||||
int64_t pos; ///< absolute offset in the containing AVIOContext where the size field starts
|
||||
///< for level 1 elements or else where the master's elements start
|
||||
int sizebytes; ///< how many bytes were reserved/shall be used for the size
|
||||
int sizebytes; ///< how many bytes were reserved for the size
|
||||
} ebml_master;
|
||||
|
||||
typedef struct mkv_seekhead_entry {
|
||||
@ -334,15 +334,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)
|
||||
ebml_master *master, uint32_t elementid)
|
||||
{
|
||||
int ret, bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
|
||||
int ret;
|
||||
|
||||
if ((ret = avio_open_dyn_buf(dyn_cp)) < 0)
|
||||
return ret;
|
||||
|
||||
put_ebml_id(pb, elementid);
|
||||
*master = (ebml_master) { avio_tell(pb), bytes };
|
||||
*master = (ebml_master) { avio_tell(pb), 0 };
|
||||
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 */
|
||||
|
||||
@ -356,7 +356,7 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, Matrosk
|
||||
int size, skip = 0;
|
||||
|
||||
size = avio_close_dyn_buf(*dyn_cp, &buf);
|
||||
put_ebml_num(pb, size, master.sizebytes);
|
||||
put_ebml_num(pb, size, 0);
|
||||
if (mkv->write_crc) {
|
||||
skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */
|
||||
AV_WL32(crc, av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), UINT32_MAX, buf + skip, size - skip) ^ UINT32_MAX);
|
||||
@ -377,7 +377,7 @@ static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext **dyn
|
||||
uint8_t *buf;
|
||||
int size = avio_get_dyn_buf(*dyn_cp, &buf);
|
||||
|
||||
put_ebml_num(pb, size, master.sizebytes);
|
||||
put_ebml_num(pb, size, 0);
|
||||
avio_write(pb, buf, size);
|
||||
}
|
||||
|
||||
@ -502,8 +502,7 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv)
|
||||
}
|
||||
}
|
||||
|
||||
if (start_ebml_master_crc32(pb, &dyn_cp, mkv, &metaseek, MATROSKA_ID_SEEKHEAD,
|
||||
seekhead->reserved_size) < 0) {
|
||||
if (start_ebml_master_crc32(pb, &dyn_cp, mkv, &metaseek, MATROSKA_ID_SEEKHEAD) < 0) {
|
||||
currentpos = -1;
|
||||
goto fail;
|
||||
}
|
||||
@ -578,7 +577,7 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra
|
||||
int i, j, ret;
|
||||
|
||||
currentpos = avio_tell(pb);
|
||||
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &cues_element, MATROSKA_ID_CUES, 0);
|
||||
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &cues_element, MATROSKA_ID_CUES);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -1454,7 +1453,7 @@ static int mkv_write_tracks(AVFormatContext *s)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, &mkv->tracks_master, MATROSKA_ID_TRACKS, 0);
|
||||
ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, &mkv->tracks_master, MATROSKA_ID_TRACKS);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -1490,7 +1489,7 @@ static int mkv_write_chapters(AVFormatContext *s)
|
||||
ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
|
||||
if (ret < 0) return ret;
|
||||
|
||||
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &chapters, MATROSKA_ID_CHAPTERS, 0);
|
||||
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &chapters, MATROSKA_ID_CHAPTERS);
|
||||
if (ret < 0) return ret;
|
||||
|
||||
editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0);
|
||||
@ -1581,7 +1580,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid,
|
||||
ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
|
||||
if (ret < 0) return ret;
|
||||
|
||||
start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, tags, MATROSKA_ID_TAGS, 0);
|
||||
start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, tags, MATROSKA_ID_TAGS);
|
||||
}
|
||||
pb = mkv->tags_bc;
|
||||
|
||||
@ -1748,7 +1747,7 @@ static int mkv_write_attachments(AVFormatContext *s)
|
||||
ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
|
||||
if (ret < 0) return ret;
|
||||
|
||||
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &attachments, MATROSKA_ID_ATTACHMENTS, 0);
|
||||
ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &attachments, MATROSKA_ID_ATTACHMENTS);
|
||||
if (ret < 0) return ret;
|
||||
|
||||
for (i = 0; i < s->nb_streams; i++) {
|
||||
@ -1907,7 +1906,7 @@ static int mkv_write_header(AVFormatContext *s)
|
||||
ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_INFO, avio_tell(pb));
|
||||
if (ret < 0) goto fail;
|
||||
|
||||
ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, &mkv->info, MATROSKA_ID_INFO, 0);
|
||||
ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, &mkv->info, MATROSKA_ID_INFO);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
pb = mkv->info_bc;
|
||||
@ -2400,7 +2399,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_
|
||||
|
||||
if (mkv->cluster_pos == -1) {
|
||||
mkv->cluster_pos = avio_tell(s->pb);
|
||||
ret = start_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, &mkv->cluster, MATROSKA_ID_CLUSTER, 0);
|
||||
ret = start_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, &mkv->cluster, MATROSKA_ID_CLUSTER);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
|
||||
|
@ -4,7 +4,7 @@
|
||||
FATE_MATROSKA-$(call DEMMUX, MATROSKA, MATROSKA) += fate-matroska-remux
|
||||
fate-matroska-remux: CMD = md5pipe -i $(TARGET_SAMPLES)/vp9-test-vectors/vp90-2-2pass-akiyo.webm -color_trc 4 -c:v copy -fflags +bitexact -strict -2 -f matroska
|
||||
fate-matroska-remux: CMP = oneline
|
||||
fate-matroska-remux: REF = 82a5beaf7a0fb5bb2970d9bba9028086
|
||||
fate-matroska-remux: REF = e5457e5fa606d564a54914bd12f426c8
|
||||
|
||||
FATE_MATROSKA_FFPROBE-$(call ALLYES, MATROSKA_DEMUXER) += fate-matroska-spherical-mono
|
||||
fate-matroska-spherical-mono: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream_side_data_list -select_streams v -v 0 $(TARGET_SAMPLES)/mkv/spherical.mkv
|
||||
|
@ -91,12 +91,12 @@ fate-wavpack-matroskamode: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/special/matros
|
||||
FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono
|
||||
fate-wavpack-matroska_mux-mono: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska
|
||||
fate-wavpack-matroska_mux-mono: CMP = oneline
|
||||
fate-wavpack-matroska_mux-mono: REF = 942af4e88c4045e822508400545c47fd
|
||||
fate-wavpack-matroska_mux-mono: REF = c5a2b46d8b31c9c2e7bfb436f9d56f02
|
||||
|
||||
FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61
|
||||
fate-wavpack-matroska_mux-61: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska
|
||||
fate-wavpack-matroska_mux-61: CMP = oneline
|
||||
fate-wavpack-matroska_mux-61: REF = c874587c6172feb74df52230197396de
|
||||
fate-wavpack-matroska_mux-61: REF = 22fc2a591be22657d19cab89ad6eef55
|
||||
|
||||
FATE_SAMPLES_AVCONV += $(FATE_WAVPACK-yes)
|
||||
fate-wavpack: $(FATE_WAVPACK-yes)
|
||||
|
@ -1,5 +1,5 @@
|
||||
63292d538da403964777e17eb65deae7 *tests/data/fate/aac-autobsf-adtstoasc.matroska
|
||||
6721 tests/data/fate/aac-autobsf-adtstoasc.matroska
|
||||
b09fc2f554712adbf84fe7899eb679d4 *tests/data/fate/aac-autobsf-adtstoasc.matroska
|
||||
6695 tests/data/fate/aac-autobsf-adtstoasc.matroska
|
||||
#extradata 0: 2, 0x0030001c
|
||||
#tb 0: 1/1000
|
||||
#media_type 0: audio
|
||||
|
@ -1 +1 @@
|
||||
1d0977e91873b77b4c78b61f4f3cdec5
|
||||
a5811caa0caba3a3f9a449b91569745c
|
||||
|
@ -1,5 +1,5 @@
|
||||
a00bb0c1bc614872d2267ce9059ae3c7 *tests/data/fate/rgb24-mkv.matroska
|
||||
58336 tests/data/fate/rgb24-mkv.matroska
|
||||
ffe2c21083d56764aaae7945fd146326 *tests/data/fate/rgb24-mkv.matroska
|
||||
58305 tests/data/fate/rgb24-mkv.matroska
|
||||
#tb 0: 1/10
|
||||
#media_type 0: video
|
||||
#codec_id 0: rawvideo
|
||||
|
@ -1,3 +1,3 @@
|
||||
8b1992d17a836e07c1464dc1eb4595ac *tests/data/lavf/lavf.mka
|
||||
43677 tests/data/lavf/lavf.mka
|
||||
a91bfdb08ff5a1e62b039748d16b07f7 *tests/data/lavf/lavf.mka
|
||||
43652 tests/data/lavf/lavf.mka
|
||||
tests/data/lavf/lavf.mka CRC=0x3a1da17e
|
||||
|
@ -1,3 +1,3 @@
|
||||
c6d8a608b7d90820812962972926ef25 *tests/data/lavf/lavf.mkv
|
||||
320596 tests/data/lavf/lavf.mkv
|
||||
3cddd26ed41f34925d3f34acabab174e *tests/data/lavf/lavf.mkv
|
||||
320555 tests/data/lavf/lavf.mkv
|
||||
tests/data/lavf/lavf.mkv CRC=0xec6c3c68
|
||||
|
@ -1,3 +1,3 @@
|
||||
27cb59473419ffb0b24fa1737ddcd6c7 *tests/data/lavf/lavf.mkv_attachment
|
||||
472752 tests/data/lavf/lavf.mkv_attachment
|
||||
4a25c53150c09537cd4fcbff8f8f14ff *tests/data/lavf/lavf.mkv_attachment
|
||||
472706 tests/data/lavf/lavf.mkv_attachment
|
||||
tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68
|
||||
|
@ -1,48 +1,48 @@
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 827 size: 208
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 803 size: 208
|
||||
ret: 0 st:-1 flags:0 ts:-1.000000
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
ret: 0 st:-1 flags:1 ts: 1.894167
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292469 size: 27834
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834
|
||||
ret: 0 st: 0 flags:0 ts: 0.788000
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292469 size: 27834
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834
|
||||
ret: 0 st: 0 flags:1 ts:-0.317000
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
ret:-1 st: 1 flags:0 ts: 2.577000
|
||||
ret: 0 st: 1 flags:1 ts: 1.471000
|
||||
ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320310 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320276 size: 209
|
||||
ret: 0 st:-1 flags:0 ts: 0.365002
|
||||
ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147016 size: 27925
|
||||
ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146987 size: 27925
|
||||
ret: 0 st:-1 flags:1 ts:-0.740831
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
ret:-1 st: 0 flags:0 ts: 2.153000
|
||||
ret: 0 st: 0 flags:1 ts: 1.048000
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292469 size: 27834
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834
|
||||
ret: 0 st: 1 flags:0 ts:-0.058000
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 827 size: 208
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 803 size: 208
|
||||
ret: 0 st: 1 flags:1 ts: 2.836000
|
||||
ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320310 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320276 size: 209
|
||||
ret:-1 st:-1 flags:0 ts: 1.730004
|
||||
ret: 0 st:-1 flags:1 ts: 0.624171
|
||||
ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147016 size: 27925
|
||||
ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146987 size: 27925
|
||||
ret: 0 st: 0 flags:0 ts:-0.482000
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
ret: 0 st: 0 flags:1 ts: 2.413000
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292469 size: 27834
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834
|
||||
ret:-1 st: 1 flags:0 ts: 1.307000
|
||||
ret: 0 st: 1 flags:1 ts: 0.201000
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 827 size: 208
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 803 size: 208
|
||||
ret: 0 st:-1 flags:0 ts:-0.904994
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
ret: 0 st:-1 flags:1 ts: 1.989173
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292469 size: 27834
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834
|
||||
ret: 0 st: 0 flags:0 ts: 0.883000
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292469 size: 27834
|
||||
ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834
|
||||
ret: 0 st: 0 flags:1 ts:-0.222000
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
ret:-1 st: 1 flags:0 ts: 2.672000
|
||||
ret: 0 st: 1 flags:1 ts: 1.566000
|
||||
ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320310 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320276 size: 209
|
||||
ret: 0 st:-1 flags:0 ts: 0.460008
|
||||
ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147016 size: 27925
|
||||
ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146987 size: 27925
|
||||
ret: 0 st:-1 flags:1 ts:-0.645825
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1043 size: 27837
|
||||
ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837
|
||||
|
Loading…
Reference in New Issue
Block a user