| @@ -24,6 +24,7 @@ | |||||
| #include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "internal.h" | |||||
| #include "xwd.h" | #include "xwd.h" | ||||
| #define WINDOW_NAME "lavcxwdenc" | #define WINDOW_NAME "lavcxwdenc" | ||||
| @@ -38,16 +39,15 @@ static av_cold int xwd_encode_init(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int xwd_encode_frame(AVCodecContext *avctx, uint8_t *buf, | |||||
| int buf_size, void *data) | |||||
| static int xwd_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
| const AVFrame *p, int *got_packet) | |||||
| { | { | ||||
| AVFrame *p = data; | |||||
| enum PixelFormat pix_fmt = avctx->pix_fmt; | enum PixelFormat pix_fmt = avctx->pix_fmt; | ||||
| uint32_t pixdepth, bpp, bpad, ncolors = 0, lsize, vclass, be = 0; | uint32_t pixdepth, bpp, bpad, ncolors = 0, lsize, vclass, be = 0; | ||||
| uint32_t rgb[3] = { 0 }; | uint32_t rgb[3] = { 0 }; | ||||
| uint32_t header_size; | uint32_t header_size; | ||||
| int i, out_size; | |||||
| uint8_t *ptr; | |||||
| int i, out_size, ret; | |||||
| uint8_t *ptr, *buf; | |||||
| pixdepth = av_get_bits_per_pixel(&av_pix_fmt_descriptors[pix_fmt]); | pixdepth = av_get_bits_per_pixel(&av_pix_fmt_descriptors[pix_fmt]); | ||||
| if (av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_BE) | if (av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_BE) | ||||
| @@ -146,10 +146,11 @@ static int xwd_encode_frame(AVCodecContext *avctx, uint8_t *buf, | |||||
| header_size = XWD_HEADER_SIZE + WINDOW_NAME_SIZE; | header_size = XWD_HEADER_SIZE + WINDOW_NAME_SIZE; | ||||
| out_size = header_size + ncolors * XWD_CMAP_SIZE + avctx->height * lsize; | out_size = header_size + ncolors * XWD_CMAP_SIZE + avctx->height * lsize; | ||||
| if (buf_size < out_size) { | |||||
| if ((ret = ff_alloc_packet(pkt, out_size)) < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); | av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); | ||||
| return AVERROR(ENOMEM); | |||||
| return ret; | |||||
| } | } | ||||
| buf = pkt->data; | |||||
| avctx->coded_frame->key_frame = 1; | avctx->coded_frame->key_frame = 1; | ||||
| avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; | avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; | ||||
| @@ -204,7 +205,9 @@ static int xwd_encode_frame(AVCodecContext *avctx, uint8_t *buf, | |||||
| ptr += p->linesize[0]; | ptr += p->linesize[0]; | ||||
| } | } | ||||
| return out_size; | |||||
| pkt->flags |= AV_PKT_FLAG_KEY; | |||||
| *got_packet = 1; | |||||
| return 0; | |||||
| } | } | ||||
| static av_cold int xwd_encode_close(AVCodecContext *avctx) | static av_cold int xwd_encode_close(AVCodecContext *avctx) | ||||
| @@ -219,7 +222,7 @@ AVCodec ff_xwd_encoder = { | |||||
| .type = AVMEDIA_TYPE_VIDEO, | .type = AVMEDIA_TYPE_VIDEO, | ||||
| .id = CODEC_ID_XWD, | .id = CODEC_ID_XWD, | ||||
| .init = xwd_encode_init, | .init = xwd_encode_init, | ||||
| .encode = xwd_encode_frame, | |||||
| .encode2 = xwd_encode_frame, | |||||
| .close = xwd_encode_close, | .close = xwd_encode_close, | ||||
| .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_BGRA, | .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_BGRA, | ||||
| PIX_FMT_RGBA, | PIX_FMT_RGBA, | ||||