Mercurial > libavformat.hg
comparison rmdec.c @ 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 | 2a34ebe41c27 |
children | 22a672e45704 |
comparison
equal
deleted
inserted
replaced
2761:5e808c3a55a8 | 2762:137eec75e3df |
---|---|
517 return AVERROR(EIO); | 517 return AVERROR(EIO); |
518 rm->videobufpos += len, | 518 rm->videobufpos += len, |
519 rm->remaining_len-= len; | 519 rm->remaining_len-= len; |
520 | 520 |
521 if(type == 2 || (rm->videobufpos) == rm->videobufsize){ | 521 if(type == 2 || (rm->videobufpos) == rm->videobufsize){ |
522 //adjust slice headers | |
523 memmove(rm->videobuf + 1 + 8*rm->cur_slice, rm->videobuf + 1 + 8*rm->slices, rm->videobufsize - 1 - 8*rm->slices); | |
524 ssize = rm->videobufsize - 8*(rm->slices - rm->cur_slice); | |
525 | |
526 rm->videobuf[0] = rm->cur_slice-1; | 522 rm->videobuf[0] = rm->cur_slice-1; |
527 if(av_new_packet(pkt, ssize) < 0) | 523 if(av_new_packet(pkt, rm->videobufpos - 8*(rm->slices - rm->cur_slice)) < 0) |
528 return AVERROR(ENOMEM); | 524 return AVERROR(ENOMEM); |
529 memcpy(pkt->data, rm->videobuf, ssize); | 525 memcpy(pkt->data, rm->videobuf, 1 + 8*rm->cur_slice); |
526 memcpy(pkt->data + 1 + 8*rm->cur_slice, rm->videobuf + 1 + 8*rm->slices, rm->videobufpos - 1 - 8*rm->slices); | |
530 pkt->pts = AV_NOPTS_VALUE; | 527 pkt->pts = AV_NOPTS_VALUE; |
531 pkt->pos = rm->pktpos; | 528 pkt->pos = rm->pktpos; |
532 return 0; | 529 return 0; |
533 } | 530 } |
534 | 531 |