[FFmpeg-devel] [PATCH 10/10] spdifenc: use put_nbyte to insert padding

Anssi Hannula anssi.hannula
Wed Dec 29 06:06:43 CET 2010


Use the new put_nbyte to insert padding instead of put_be16, making
the muxer several times faster for workloads that have significant
padding (which is usually the case, with the exception of DTS at
1.5Mbps).

---

Some benchmark results of the whole function below (on i7 M620):
Canyon-5.1-48khz-448kbit.ac3
BEFORE:
773400 dezicycles in spdif_write_packet, 1 runs, 0 skips
635285 dezicycles in spdif_write_packet, 2 runs, 0 skips
560185 dezicycles in spdif_write_packet, 4 runs, 0 skips
518393 dezicycles in spdif_write_packet, 8 runs, 0 skips
500050 dezicycles in spdif_write_packet, 16 runs, 0 skips
492169 dezicycles in spdif_write_packet, 32 runs, 0 skips
485978 dezicycles in spdif_write_packet, 64 runs, 0 skips
486383 dezicycles in spdif_write_packet, 128 runs, 0 skips
488229 dezicycles in spdif_write_packet, 256 runs, 0 skips
492583 dezicycles in spdif_write_packet, 512 runs, 0 skips
494580 dezicycles in spdif_write_packet, 1024 runs, 0 skips
AFTER:
400600 dezicycles in spdif_write_packet, 1 runs, 0 skips
275185 dezicycles in spdif_write_packet, 2 runs, 0 skips
208792 dezicycles in spdif_write_packet, 4 runs, 0 skips
174092 dezicycles in spdif_write_packet, 8 runs, 0 skips
156495 dezicycles in spdif_write_packet, 16 runs, 0 skips
149328 dezicycles in spdif_write_packet, 32 runs, 0 skips
149247 dezicycles in spdif_write_packet, 64 runs, 0 skips
143370 dezicycles in spdif_write_packet, 128 runs, 0 skips
146632 dezicycles in spdif_write_packet, 256 runs, 0 skips
152616 dezicycles in spdif_write_packet, 512 runs, 0 skips
152745 dezicycles in spdif_write_packet, 1024 runs, 0 skips

lotr_5.1_768.dts (DTS ES @ 768kbps)
BEFORE:
423770 dezicycles in spdif_write_packet, 1 runs, 0 skips
289870 dezicycles in spdif_write_packet, 2 runs, 0 skips
227250 dezicycles in spdif_write_packet, 4 runs, 0 skips
192125 dezicycles in spdif_write_packet, 8 runs, 0 skips
172110 dezicycles in spdif_write_packet, 16 runs, 0 skips
162682 dezicycles in spdif_write_packet, 32 runs, 0 skips
157046 dezicycles in spdif_write_packet, 64 runs, 0 skips
156656 dezicycles in spdif_write_packet, 128 runs, 0 skips
157263 dezicycles in spdif_write_packet, 256 runs, 0 skips
155924 dezicycles in spdif_write_packet, 512 runs, 0 skips
158197 dezicycles in spdif_write_packet, 1024 runs, 0 skips
158609 dezicycles in spdif_write_packet, 2047 runs, 1 skips
160447 dezicycles in spdif_write_packet, 4095 runs, 1 skips
161133 dezicycles in spdif_write_packet, 8191 runs, 1 skips
AFTER:
392230 dezicycles in spdif_write_packet, 1 runs, 0 skips
234730 dezicycles in spdif_write_packet, 2 runs, 0 skips
254557 dezicycles in spdif_write_packet, 4 runs, 0 skips
168563 dezicycles in spdif_write_packet, 8 runs, 0 skips
121702 dezicycles in spdif_write_packet, 16 runs, 0 skips
102441 dezicycles in spdif_write_packet, 32 runs, 0 skips
92429 dezicycles in spdif_write_packet, 64 runs, 0 skips
82591 dezicycles in spdif_write_packet, 128 runs, 0 skips
78694 dezicycles in spdif_write_packet, 256 runs, 0 skips
76835 dezicycles in spdif_write_packet, 512 runs, 0 skips
77847 dezicycles in spdif_write_packet, 1023 runs, 1 skips
78382 dezicycles in spdif_write_packet, 2047 runs, 1 skips
79707 dezicycles in spdif_write_packet, 4091 runs, 5 skips
79968 dezicycles in spdif_write_packet, 8186 runs, 6 skips

Master Audio 7.1 24bit.dts with -dtshd_rate 768000
BEFORE:
3336140 dezicycles in spdif_write_packet, 1 runs, 0 skips
3145525 dezicycles in spdif_write_packet, 2 runs, 0 skips
3028065 dezicycles in spdif_write_packet, 4 runs, 0 skips
3230842 dezicycles in spdif_write_packet, 8 runs, 0 skips
3160393 dezicycles in spdif_write_packet, 16 runs, 0 skips
3176111 dezicycles in spdif_write_packet, 32 runs, 0 skips
3065576 dezicycles in spdif_write_packet, 64 runs, 0 skips
2981507 dezicycles in spdif_write_packet, 128 runs, 0 skips
2902575 dezicycles in spdif_write_packet, 256 runs, 0 skips
2875893 dezicycles in spdif_write_packet, 512 runs, 0 skips
2815100 dezicycles in spdif_write_packet, 1024 runs, 0 skips
2818803 dezicycles in spdif_write_packet, 2048 runs, 0 skips
2793128 dezicycles in spdif_write_packet, 4096 runs, 0 skips
AFTER:
1179830 dezicycles in spdif_write_packet, 1 runs, 0 skips
884670 dezicycles in spdif_write_packet, 2 runs, 0 skips
706500 dezicycles in spdif_write_packet, 4 runs, 0 skips
612875 dezicycles in spdif_write_packet, 8 runs, 0 skips
605571 dezicycles in spdif_write_packet, 16 runs, 0 skips
570654 dezicycles in spdif_write_packet, 32 runs, 0 skips
552609 dezicycles in spdif_write_packet, 64 runs, 0 skips
544573 dezicycles in spdif_write_packet, 128 runs, 0 skips
543305 dezicycles in spdif_write_packet, 256 runs, 0 skips
554431 dezicycles in spdif_write_packet, 512 runs, 0 skips
564713 dezicycles in spdif_write_packet, 1024 runs, 0 skips
577008 dezicycles in spdif_write_packet, 2048 runs, 0 skips
579005 dezicycles in spdif_write_packet, 4096 runs, 0 skips

 libavformat/spdifenc.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/libavformat/spdifenc.c b/libavformat/spdifenc.c
index d7a42fc..1288432 100644
--- a/libavformat/spdifenc.c
+++ b/libavformat/spdifenc.c
@@ -506,7 +506,7 @@ static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
     if (!ctx->pkt_offset)
         return 0;
 
-    padding = (ctx->pkt_offset - ctx->use_preamble * BURST_HEADER_SIZE - ctx->out_bytes) >> 1;
+    padding = (ctx->pkt_offset - ctx->use_preamble * BURST_HEADER_SIZE - ctx->out_bytes) & ~1;
     if (padding < 0) {
         av_log(s, AV_LOG_ERROR, "bitrate is too high\n");
         return AVERROR(EINVAL);
@@ -533,8 +533,7 @@ static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
     if (ctx->out_bytes & 1)
         spdif_put_16(s, ctx->out_buf[ctx->out_bytes - 1] << 8);
 
-    for (; padding > 0; padding--)
-        put_be16(s->pb, 0);
+    put_nbyte(s->pb, 0, padding);
 
     av_log(s, AV_LOG_DEBUG, "type=%x len=%i pkt_offset=%i\n",
            ctx->data_type, ctx->out_bytes, ctx->pkt_offset);
-- 
1.7.3




More information about the ffmpeg-devel mailing list