diff --git a/libavcodec/dv.c b/libavcodec/dv.c index 0781addaef..3deaa5e2ee 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -42,6 +42,7 @@ #include "avcodec.h" #include "dsputil.h" #include "get_bits.h" +#include "internal.h" #include "put_bits.h" #include "simple_idct.h" #include "dvdata.h" @@ -1275,29 +1276,37 @@ static void dv_format_frame(DVVideoContext* c, uint8_t* buf) } -static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size, - void *data) +static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt, + const AVFrame *frame, int *got_packet) { DVVideoContext *s = c->priv_data; + int ret; s->sys = avpriv_dv_codec_profile(c); - if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) + if (!s->sys || dv_init_dynamic_tables(s->sys)) return -1; + if ((ret = ff_alloc_packet(pkt, s->sys->frame_size)) < 0) { + av_log(c, AV_LOG_ERROR, "Error getting output packet.\n"); + return ret; + } c->pix_fmt = s->sys->pix_fmt; - s->picture = *((AVFrame *)data); + s->picture = *frame; s->picture.key_frame = 1; s->picture.pict_type = AV_PICTURE_TYPE_I; - s->buf = buf; + s->buf = pkt->data; c->execute(c, dv_encode_video_segment, s->sys->work_chunks, NULL, dv_work_pool_size(s->sys), sizeof(DVwork_chunk)); emms_c(); - dv_format_frame(s, buf); + dv_format_frame(s, pkt->data); - return s->sys->frame_size; + pkt->flags |= AV_PKT_FLAG_KEY; + *got_packet = 1; + + return 0; } #endif @@ -1319,7 +1328,7 @@ AVCodec ff_dvvideo_encoder = { .id = CODEC_ID_DVVIDEO, .priv_data_size = sizeof(DVVideoContext), .init = dvvideo_init_encoder, - .encode = dvvideo_encode_frame, + .encode2 = dvvideo_encode_frame, .capabilities = CODEC_CAP_SLICE_THREADS, .pix_fmts = (const enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),