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