Mercurial > libavformat.hg
changeset 2762:137eec75e3df libavformat
Optimize memory management to create an av_packet from multiple slices:
- remove memmove to pack the data, instead copy only the used areas
from the temp buffer in their final position
- use the minimum possible size for the av_packet (relevant when some
slices are missing)
author | rtogni |
---|---|
date | Sun, 18 Nov 2007 22:40:02 +0000 |
parents | 5e808c3a55a8 |
children | 22a672e45704 |
files | rmdec.c |
diffstat | 1 files changed, 3 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/rmdec.c Sat Nov 17 03:14:43 2007 +0000 +++ b/rmdec.c Sun Nov 18 22:40:02 2007 +0000 @@ -519,14 +519,11 @@ rm->remaining_len-= len; if(type == 2 || (rm->videobufpos) == rm->videobufsize){ - //adjust slice headers - memmove(rm->videobuf + 1 + 8*rm->cur_slice, rm->videobuf + 1 + 8*rm->slices, rm->videobufsize - 1 - 8*rm->slices); - ssize = rm->videobufsize - 8*(rm->slices - rm->cur_slice); - rm->videobuf[0] = rm->cur_slice-1; - if(av_new_packet(pkt, ssize) < 0) + if(av_new_packet(pkt, rm->videobufpos - 8*(rm->slices - rm->cur_slice)) < 0) return AVERROR(ENOMEM); - memcpy(pkt->data, rm->videobuf, ssize); + memcpy(pkt->data, rm->videobuf, 1 + 8*rm->cur_slice); + memcpy(pkt->data + 1 + 8*rm->cur_slice, rm->videobuf + 1 + 8*rm->slices, rm->videobufpos - 1 - 8*rm->slices); pkt->pts = AV_NOPTS_VALUE; pkt->pos = rm->pktpos; return 0;