|
|
|
@ -68,12 +68,20 @@ typedef struct LclEncContext { |
|
|
|
|
* Encode a frame |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ |
|
|
|
|
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
|
const AVFrame *pict, int *got_packet) |
|
|
|
|
{ |
|
|
|
|
LclEncContext *c = avctx->priv_data; |
|
|
|
|
AVFrame *pict = data; |
|
|
|
|
AVFrame * const p = &c->pic; |
|
|
|
|
int i; |
|
|
|
|
int i, ret; |
|
|
|
|
int zret; // Zlib return code
|
|
|
|
|
int max_size = deflateBound(&c->zstream, avctx->width * avctx->height * 3); |
|
|
|
|
|
|
|
|
|
if (!pkt->data && |
|
|
|
|
(ret = av_new_packet(pkt, max_size)) < 0) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Error allocating packet of size %d.\n", max_size); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*p = *pict; |
|
|
|
|
p->pict_type= AV_PICTURE_TYPE_I; |
|
|
|
@ -89,8 +97,8 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Deflate reset error: %d\n", zret); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
c->zstream.next_out = buf; |
|
|
|
|
c->zstream.avail_out = buf_size; |
|
|
|
|
c->zstream.next_out = pkt->data; |
|
|
|
|
c->zstream.avail_out = pkt->size; |
|
|
|
|
|
|
|
|
|
for(i = avctx->height - 1; i >= 0; i--) { |
|
|
|
|
c->zstream.next_in = p->data[0]+p->linesize[0]*i; |
|
|
|
@ -107,7 +115,11 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return c->zstream.total_out; |
|
|
|
|
pkt->size = c->zstream.total_out; |
|
|
|
|
pkt->flags |= AV_PKT_FLAG_KEY; |
|
|
|
|
*got_packet = 1; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -176,7 +188,7 @@ AVCodec ff_zlib_encoder = { |
|
|
|
|
.id = CODEC_ID_ZLIB, |
|
|
|
|
.priv_data_size = sizeof(LclEncContext), |
|
|
|
|
.init = encode_init, |
|
|
|
|
.encode = encode_frame, |
|
|
|
|
.encode2 = encode_frame, |
|
|
|
|
.close = encode_end, |
|
|
|
|
.pix_fmts = (const enum PixelFormat[]) { PIX_FMT_BGR24, PIX_FMT_NONE }, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"), |
|
|
|
|