On Wed, Feb 22, 2012 at 06:29:41PM +0100, Anton Khirnov wrote:
> ---
> libavcodec/qtrleenc.c | 29 +++++++++++++++++------------
> 1 files changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/libavcodec/qtrleenc.c b/libavcodec/qtrleenc.c
> index 3ffce2b..a60d7a3 100644
> --- a/libavcodec/qtrleenc.c
> +++ b/libavcodec/qtrleenc.c
> @@ -25,6 +25,7 @@
> #include "libavutil/imgutils.h"
> #include "avcodec.h"
> #include "bytestream.h"
> +#include "internal.h"
>
> /** Maximum RLE code for bulk copy */
> #define MAX_RLE_BULK 127
> @@ -96,7 +97,7 @@ static av_cold int qtrle_encode_init(AVCodecContext *avctx)
> return -1;
> }
>
> - s->max_buf_size = s->avctx->width*s->avctx->height*s->pixel_size /*
> image base material */
> + s->max_buf_size = s->avctx->width*s->avctx->height*s->pixel_size*2 /*
> image base material */
> + 15 /*
> header + footer */
> + s->avctx->height*2 /* skip
> code+rle end */
> + s->avctx->width/MAX_RLE_BULK + 1 /* rle
> codes */;
> @@ -107,7 +108,7 @@ static av_cold int qtrle_encode_init(AVCodecContext
> *avctx)
> /**
> * Compute the best RLE sequence for a line
> */
> -static void qtrle_encode_line(QtrleEncContext *s, AVFrame *p, int line,
> uint8_t **buf)
> +static void qtrle_encode_line(QtrleEncContext *s, const AVFrame *p, int
> line, uint8_t **buf)
> {
> int width=s->avctx->width;
> int i;
> @@ -237,7 +238,7 @@ static void qtrle_encode_line(QtrleEncContext *s, AVFrame
> *p, int line, uint8_t
> }
>
> /** Encode frame including header */
> -static int encode_frame(QtrleEncContext *s, AVFrame *p, uint8_t *buf)
> +static int encode_frame(QtrleEncContext *s, const AVFrame *p, uint8_t *buf)
> {
> int i;
> int start_line = 0;
> @@ -278,19 +279,19 @@ static int encode_frame(QtrleEncContext *s, AVFrame *p,
> uint8_t *buf)
> return buf - orig_buf;
> }
>
> -static int qtrle_encode_frame(AVCodecContext *avctx, uint8_t *buf, int
> buf_size, void *data)
> +static int qtrle_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
> + const AVFrame *pict, int *got_packet)
> {
> QtrleEncContext * const s = avctx->priv_data;
> - AVFrame *pict = data;
> AVFrame * const p = &s->frame;
> - int chunksize;
> + int ret;
>
> *p = *pict;
>
> - if (buf_size < s->max_buf_size) {
> + if ((ret = ff_alloc_packet(pkt, s->max_buf_size)) < 0) {
> /* Upper bound check for compressed data */
> - av_log(avctx, AV_LOG_ERROR, "buf_size %d < %d\n", buf_size,
> s->max_buf_size);
> - return -1;
> + av_log(avctx, AV_LOG_ERROR, "Error getting output packet of size
> %d.\n", s->max_buf_size);
> + return ret;
> }
>
> if (avctx->gop_size == 0 || (s->avctx->frame_number % avctx->gop_size)
> == 0) {
> @@ -303,11 +304,15 @@ static int qtrle_encode_frame(AVCodecContext *avctx,
> uint8_t *buf, int buf_size,
> p->key_frame = 0;
> }
>
> - chunksize = encode_frame(s, pict, buf);
> + pkt->size = encode_frame(s, pict, pkt->data);
>
> /* save the current frame */
> av_picture_copy(&s->previous_frame, (AVPicture *)p, avctx->pix_fmt,
> avctx->width, avctx->height);
> - return chunksize;
> +
> + pkt->flags |= AV_PKT_FLAG_KEY*p->key_frame;
this is perversion, an old-fashioned if(p->key_frame) would be much nicer
in general LGTM
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel