Hi On Thu, Jan 18, 2007 at 04:41:21PM -0800, Roman Shaposhnik wrote: [...] > > > the extra if() also should disapear for av_fifo_read() if its inlined > > and the body of the while loop will be executed just once normally > > and rarely twice, but never more often then twice > > > > do you know of any specific places in libav* where there are so many > > calls to av_fifo_*read() that this could matter? > > Nope. All I care about is av_fifo_peek() ;-) attached patch removes it and makes your code about 35% faster ;) and i suspect it can be made even faster, of course this is not possible with a av_fifo_peek like system [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB There will always be a question for which you do not know the correct awnser. -------------- next part -------------- Index: libavformat/dvenc.c =================================================================== --- libavformat/dvenc.c (revision 7537) +++ libavformat/dvenc.c (working copy) @@ -177,21 +177,33 @@ static void dv_inject_audio(DVMuxContext *c, int channel, uint8_t* frame_ptr) { - int i, j, d, of, size; + int i, j, d, size; + uint8_t *fifo_ptr, *fifo_end; + AVFifoBuffer *f= &c->audio_data[channel]; size = 4 * dv_audio_frame_size(c->sys, c->frames); frame_ptr += channel * c->sys->difseg_size * 150 * 80; for (i = 0; i < c->sys->difseg_size; i++) { frame_ptr += 6 * 80; /* skip DIF segment header */ for (j = 0; j < 9; j++) { dv_write_pack(dv_aaux_packs_dist[i][j], c, &frame_ptr[3], i >= c->sys->difseg_size/2); - for (d = 8; d < 80; d+=2) { - of = c->sys->audio_shuffle[i][j] + (d - 8)/2 * c->sys->audio_stride; - if (of*2 >= size) - continue; + fifo_ptr = f->rptr + 2*c->sys->audio_shuffle[i][j]; + fifo_end = FFMIN(f->end, f->rptr + size); + for (d = 8; d < 80; d+=2, fifo_ptr += 2*c->sys->audio_stride) { + if (fifo_ptr >= fifo_end) + break; - frame_ptr[d] = av_fifo_peek(&c->audio_data[channel], of*2+1); // FIXME: may be we have to admit - frame_ptr[d+1] = av_fifo_peek(&c->audio_data[channel], of*2); // that DV is a big endian PCM + frame_ptr[d ] = fifo_ptr[1];// FIXME: may be we have to admit that DV is a big endian PCM + frame_ptr[d+1] = fifo_ptr[0]; } + fifo_ptr -= f->end - f->buffer; + fifo_end = f->rptr + size - f->end + f->buffer; + for (; d < 80; d+=2, fifo_ptr += 2*c->sys->audio_stride) { + if (fifo_ptr >= fifo_end) + break; + + frame_ptr[d ] = fifo_ptr[1];// FIXME: may be we have to admit that DV is a big endian PCM + frame_ptr[d+1] = fifo_ptr[0]; + } frame_ptr += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */ } } -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: not available URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070119/eb35afb8/attachment.pgp>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4