mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/jpeglsenc: Allocate buffers together
Having only one allocation that is not automatically freed in particular means that one does not need to free the already allocated buffers when allocating another one fails. Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
017baa8106
commit
e3c4e1f0c4
@ -276,7 +276,6 @@ static int encode_picture_ls(AVCodecContext *avctx, AVPacket *pkt,
|
||||
PutByteContext pb;
|
||||
PutBitContext pb2;
|
||||
GetBitContext gb;
|
||||
uint8_t *buf2 = NULL;
|
||||
const uint8_t *in;
|
||||
uint8_t *last = NULL;
|
||||
JLSState state = { 0 };
|
||||
@ -300,12 +299,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
AV_INPUT_BUFFER_MIN_SIZE, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
buf2 = av_malloc(pkt->size);
|
||||
if (!buf2)
|
||||
goto memfail;
|
||||
last = av_malloc((unsigned)pkt->size + FFABS(p->linesize[0]));
|
||||
if (!last)
|
||||
return AVERROR(ENOMEM);
|
||||
memset(last, 0, FFABS(p->linesize[0]));
|
||||
|
||||
bytestream2_init_writer(&pb, pkt->data, pkt->size);
|
||||
init_put_bits(&pb2, buf2, pkt->size);
|
||||
init_put_bits(&pb2, last + FFABS(p->linesize[0]), pkt->size);
|
||||
|
||||
/* write our own JPEG header, can't use mjpeg_picture_header */
|
||||
put_marker_byteu(&pb, SOI);
|
||||
@ -340,10 +340,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
|
||||
ls_store_lse(&state, &pb);
|
||||
|
||||
last = av_mallocz(FFABS(p->linesize[0]));
|
||||
if (!last)
|
||||
goto memfail;
|
||||
|
||||
in = p->data[0];
|
||||
if (avctx->pix_fmt == AV_PIX_FMT_GRAY8) {
|
||||
int t = 0;
|
||||
@ -393,8 +389,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
}
|
||||
}
|
||||
|
||||
av_freep(&last);
|
||||
|
||||
/* the specification says that after doing 0xff escaping unused bits in
|
||||
* the last byte must be set to 0, so just append 7 "optional" zero bits
|
||||
* to avoid special-casing. */
|
||||
@ -402,7 +396,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
size = put_bits_count(&pb2);
|
||||
flush_put_bits(&pb2);
|
||||
/* do escape coding */
|
||||
init_get_bits(&gb, buf2, size);
|
||||
init_get_bits(&gb, pb2.buf, size);
|
||||
size -= 7;
|
||||
while (get_bits_count(&gb) < size) {
|
||||
int v;
|
||||
@ -413,7 +407,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
bytestream2_put_byte(&pb, v);
|
||||
}
|
||||
}
|
||||
av_freep(&buf2);
|
||||
av_freep(&last);
|
||||
|
||||
/* End of image */
|
||||
put_marker_byte(&pb, EOI);
|
||||
@ -424,11 +418,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
pkt->flags |= AV_PKT_FLAG_KEY;
|
||||
*got_packet = 1;
|
||||
return 0;
|
||||
|
||||
memfail:
|
||||
av_freep(&buf2);
|
||||
av_freep(&last);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
static av_cold int encode_init_ls(AVCodecContext *ctx)
|
||||
|
Loading…
Reference in New Issue
Block a user