[FFmpeg-devel] [Patch] QT RLE encoder, bis
Michael Niedermayer
michaelni
Tue Jun 26 12:53:35 CEST 2007
Hi
On Mon, Jun 25, 2007 at 11:18:15PM +0200, Alexis Ballier wrote:
[...]
> >
> >[...]
> >> +/** Dumps frame including header */
> >> +static int dump_frame(QtrleEncContext *s, AVFrame *p, uint8_t *buf)
> >
> >encode_frame()
>
> not sure what you meant there, I just renamed it to encode_frame.
> Do you mean that this should be merged into qtrle_encode_frame() ?
no i just meant that dump_frame() is a bad name
>
> >> +{
> >> + int i;
> >> + int start_line=0;
> >> + int end_line=s->avctx->height;
> >> + uint8_t *orig_buf=buf;
> >> +
> >> + if(!((s->frame).key_frame)){
> >
> >superflous () and there are many more in the patch
>
> Yep, most likely that I'm too paranoid with the parser that might
> understand it wrongly, I removed some other () aswell
gcc is broken but not that broken
>
> >> +
> >> + /* save the current frame */
> >> + memcpy(s->previous_frame, p->data[0],
> >avctx->height*avctx->width*s->pixel_size);
> >
> >this is wrong if linesize != width*pixel_size
>
> Indeed
> I changed the "previous_frame" to an AVPicture, copying it with
> av_picture_copy, I hope I got it right this time [one of the previous
> patches used img_copy which I didn't want to use due to the attribute
> deprecated]
>
> The other minor things should also be fixed in enclosed patch
>
>
> In the end, the encoding time is almost divided by 2, so I just
> removed the heuristic and the hack to switch between the optimal &
> heuristic. Basic tests showed that the speed gain is even more
> important with screencasts (difference between pictures is very small
> thus not searching for every possible bulk copy helps a lot), I can
> now do realtime encoding with this algorithm at 1024x768 at 25fps :)
[...]
> + if (avpicture_alloc(&s->previous_frame, avctx->pix_fmt, avctx->width, avctx->height) < 0) {
> + av_log(avctx, AV_LOG_ERROR, "Error allocating picture\n");
> + return -1;
> + }
why not AVCodecContext.buf_buffer()?
no, theres not much difference for an encoder, avpicture_alloc() should work
too
[...]
> +/**
> + * Computes the best RLE sequence for a line
> + */
> +static void qtrle_dump_line(QtrleEncContext *s, AVFrame *p, int line, uint8_t **buf)
encode_line() or something else without "dump" seems to be a better name
dump reminds me of dumping the thing as a hex values to stderr
[...]
> + uint8_t *this_line = p->data[0]+(line*p->linesize[0]) + (width-1)*s->pixel_size;
> + uint8_t *prev_line = s->previous_frame.data[0]+(line*p->linesize[0]) + (width-1)*s->pixel_size;
superflous ()
[...]
> + if((!s->frame.key_frame) && (!memcmp(this_line, prev_line, s->pixel_size)))
superflous ()
[...]
> + total_skip_cost = (s->length_table[i+skipcount] + 2);
superflous ()
[...]
> + if((repeatcount > 1) && ((skipcount==0) || (total_repeat_cost < total_skip_cost))){
superflous ()
[...]
> + else{
> + /* We cannot do neither skip nor repeat
> + * thus we search for the best bulk copy to do */
> +
> + limit = FFMIN(width-i,MAX_RLE_BULK);
the declaration could be merged (int limit = FFMIN...)
> +
> + if(i==0) temp_cost = 2 + s->pixel_size;
> + else temp_cost = 1 + s->pixel_size;
these can be aligned like:
if(i==0) temp_cost = 2 + s->pixel_size;
else temp_cost = 1 + s->pixel_size;
> + total_bulk_cost = s->length_table[i+1] + temp_cost;
> + bulkcount = 1;
> +
> + for(j=2;j<=limit;j++){
> + temp_cost += s->pixel_size;
> + if(s->length_table[i+j] + temp_cost < total_bulk_cost){
> + /* We have found a better bulk copy ... */
> + total_bulk_cost = s->length_table[i+j] + temp_cost;
> + bulkcount = j;
> + }
> + }
the loop could begin with j=1 and total_bulk_cost could be set to INT_MAX
that would avoid the bulkcount = 1
[...]
> + bytestream_put_buffer(buf,this_line+(i*s->pixel_size),s->pixel_size);
superflous ()
[...]
> + bytestream_put_be32(&buf, 0); // CHUNK SIZE, patched later
> +
trailing whitespace is forbidden in svn
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
No human being will ever know the Truth, for even if they happen to say it
by chance, they would not even known they had done so. -- Xenophanes
-------------- 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/20070626/235dd33b/attachment.pgp>
More information about the ffmpeg-devel
mailing list