X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftiffenc.c;h=7504216f0ac63667cdb3b850d883c53a409caa17;hb=65d94f63ca38b46a9d3719cb7d986d2daef90416;hp=3d87568d99fae1098a40060b1319ed478c5cbb9a;hpb=62acb4937e06a3802735106a9d9fa48db87d0d36;p=ffmpeg diff --git a/libavcodec/tiffenc.c b/libavcodec/tiffenc.c index 3d87568d99f..7504216f0ac 100644 --- a/libavcodec/tiffenc.c +++ b/libavcodec/tiffenc.c @@ -74,7 +74,7 @@ typedef struct TiffEncoderContext { * @param need Needed bytes * @return 0 - ok, 1 - no free space */ -inline static int check_size(TiffEncoderContext * s, uint64_t need) +static inline int check_size(TiffEncoderContext * s, uint64_t need) { if (s->buf_size < *s->buf - s->buf_start + need) { *s->buf = s->buf_start + s->buf_size + 1; @@ -200,14 +200,13 @@ static void pack_yuv(TiffEncoderContext * s, uint8_t * dst, int lnum) } } -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) { TiffEncoderContext *s = avctx->priv_data; - AVFrame *pict = data; - AVFrame *const p = (AVFrame *) & s->picture; + AVFrame *const p = &s->picture; int i; - uint8_t *ptr = buf; + uint8_t *ptr; uint8_t *offset; uint32_t strips; uint32_t *strip_sizes = NULL; @@ -221,9 +220,6 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, int shift_h, shift_v; s->avctx = avctx; - s->buf_start = buf; - s->buf = &ptr; - s->buf_size = buf_size; *p = *pict; p->pict_type = AV_PICTURE_TYPE_I; @@ -287,6 +283,17 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, strips = (s->height - 1) / s->rps + 1; + if (!pkt->data && + (ret = av_new_packet(pkt, avctx->width * avctx->height * s->bpp * 2 + + avctx->height * 4 + FF_MIN_BUFFER_SIZE)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n"); + return ret; + } + ptr = pkt->data; + s->buf_start = pkt->data; + s->buf = &ptr; + s->buf_size = pkt->size; + if (check_size(s, 8)) goto fail; @@ -318,7 +325,7 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, zlen = bytes_per_row * s->rps; zbuf = av_malloc(zlen); - strip_offsets[0] = ptr - buf; + strip_offsets[0] = ptr - pkt->data; zn = 0; for (j = 0; j < s->rps; j++) { if (is_yuv){ @@ -338,7 +345,7 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, goto fail; } ptr += ret; - strip_sizes[0] = ptr - buf - strip_offsets[0]; + strip_sizes[0] = ptr - pkt->data - strip_offsets[0]; } else #endif { @@ -350,7 +357,7 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, ff_lzw_encode_init(s->lzws, ptr, s->buf_size - (*s->buf - s->buf_start), 12, FF_LZW_TIFF, put_bits); } - strip_offsets[i / s->rps] = ptr - buf; + strip_offsets[i / s->rps] = ptr - pkt->data; } if (is_yuv){ pack_yuv(s, yuv_line, i); @@ -418,7 +425,7 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, add_entry(s, TIFF_YCBCR_SUBSAMPLING, TIFF_SHORT, 2, s->subsampling); add_entry(s, TIFF_REFERENCE_BW, TIFF_RATIONAL, 6, refbw); } - bytestream_put_le32(&offset, ptr - buf); // write offset to dir + bytestream_put_le32(&offset, ptr - pkt->data); // write offset to dir if (check_size(s, 6 + s->num_entries * 12)) { ret = AVERROR(EINVAL); @@ -428,7 +435,9 @@ static int encode_frame(AVCodecContext * avctx, unsigned char *buf, bytestream_put_buffer(&ptr, s->entries, s->num_entries * 12); bytestream_put_le32(&ptr, 0); - ret = ptr - buf; + pkt->size = ptr - pkt->data; + pkt->flags |= AV_PKT_FLAG_KEY; + *got_packet = 1; fail: av_free(strip_sizes); @@ -462,14 +471,14 @@ AVCodec ff_tiff_encoder = { .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_TIFF, .priv_data_size = sizeof(TiffEncoderContext), - .encode = encode_frame, - .pix_fmts = - (const enum PixelFormat[]) {PIX_FMT_RGB24, PIX_FMT_PAL8, PIX_FMT_GRAY8, - PIX_FMT_MONOBLACK, PIX_FMT_MONOWHITE, - PIX_FMT_YUV420P, PIX_FMT_YUV422P, - PIX_FMT_YUV444P, PIX_FMT_YUV410P, - PIX_FMT_YUV411P, - PIX_FMT_NONE}, - .long_name = NULL_IF_CONFIG_SMALL("TIFF image"), + .encode2 = encode_frame, + .pix_fmts = (const enum PixelFormat[]) { + PIX_FMT_RGB24, PIX_FMT_PAL8, PIX_FMT_GRAY8, + PIX_FMT_MONOBLACK, PIX_FMT_MONOWHITE, + PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, + PIX_FMT_YUV410P, PIX_FMT_YUV411P, + PIX_FMT_NONE + }, + .long_name = NULL_IF_CONFIG_SMALL("TIFF image"), .priv_class = &tiffenc_class, };