| @@ -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; | |||
| 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,7 +471,7 @@ AVCodec ff_tiff_encoder = { | |||
| .type = AVMEDIA_TYPE_VIDEO, | |||
| .id = CODEC_ID_TIFF, | |||
| .priv_data_size = sizeof(TiffEncoderContext), | |||
| .encode = encode_frame, | |||
| .encode2 = encode_frame, | |||
| .pix_fmts = | |||
| (const enum PixelFormat[]) {PIX_FMT_RGB24, PIX_FMT_PAL8, PIX_FMT_GRAY8, | |||
| PIX_FMT_MONOBLACK, PIX_FMT_MONOWHITE, | |||