X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Frawenc.c;h=60bd0c776f6af4a65f44f361f82c44726402852a;hb=ea7ee4b4e381e0fa731458de0cbf740430eeb013;hp=926124c54baf99fafa35ec3b9f983c9ac0a820cc;hpb=975a1447f76e8d30fc01e6ea5466c84faf3d76e4;p=ffmpeg diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c index 926124c54ba..60bd0c776f6 100644 --- a/libavcodec/rawenc.c +++ b/libavcodec/rawenc.c @@ -26,41 +26,61 @@ #include "avcodec.h" #include "raw.h" +#include "internal.h" #include "libavutil/pixdesc.h" #include "libavutil/intreadwrite.h" +#include "libavutil/imgutils.h" +#include "libavutil/internal.h" -static av_cold int raw_init_encoder(AVCodecContext *avctx) +static av_cold int raw_encode_init(AVCodecContext *avctx) { - avctx->coded_frame = (AVFrame *)avctx->priv_data; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); + +#if FF_API_CODED_FRAME +FF_DISABLE_DEPRECATION_WARNINGS avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; avctx->coded_frame->key_frame = 1; - avctx->bits_per_coded_sample = av_get_bits_per_pixel(&av_pix_fmt_descriptors[avctx->pix_fmt]); +FF_ENABLE_DEPRECATION_WARNINGS +#endif + avctx->bits_per_coded_sample = av_get_bits_per_pixel(desc); if(!avctx->codec_tag) avctx->codec_tag = avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt); return 0; } -static int raw_encode(AVCodecContext *avctx, - unsigned char *frame, int buf_size, void *data) +static int raw_encode(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *frame, int *got_packet) { - int ret = avpicture_layout((AVPicture *)data, avctx->pix_fmt, avctx->width, - avctx->height, frame, buf_size); + int ret = av_image_get_buffer_size(avctx->pix_fmt, + avctx->width, avctx->height, 1); + + if (ret < 0) + return ret; + + if ((ret = ff_alloc_packet(pkt, ret)) < 0) + return ret; + if ((ret = av_image_copy_to_buffer(pkt->data, pkt->size, + frame->data, frame->linesize, + frame->format, + frame->width, frame->height, 1)) < 0) + return ret; if(avctx->codec_tag == AV_RL32("yuv2") && ret > 0 && - avctx->pix_fmt == PIX_FMT_YUYV422) { + avctx->pix_fmt == AV_PIX_FMT_YUYV422) { int x; for(x = 1; x < avctx->height*avctx->width*2; x += 2) - frame[x] ^= 0x80; + pkt->data[x] ^= 0x80; } - return ret; + pkt->flags |= AV_PKT_FLAG_KEY; + *got_packet = 1; + return 0; } AVCodec ff_rawvideo_encoder = { - "rawvideo", - AVMEDIA_TYPE_VIDEO, - CODEC_ID_RAWVIDEO, - sizeof(AVFrame), - raw_init_encoder, - raw_encode, - .long_name = NULL_IF_CONFIG_SMALL("raw video"), + .name = "rawvideo", + .long_name = NULL_IF_CONFIG_SMALL("raw video"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_RAWVIDEO, + .init = raw_encode_init, + .encode2 = raw_encode, };