X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdpx.c;h=d4effa4c4857a1f0a4f9258b7a92aebccae67beb;hb=6151e9128ce2a84a443c82b78f5b5cb364ba2ab4;hp=156f1deaa49e4d33780adea6b2304c809ce98558;hpb=ec6402b7c595c3ceed6d1b8c1b75c6aa8336e052;p=ffmpeg diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c index 156f1deaa49..d4effa4c485 100644 --- a/libavcodec/dpx.c +++ b/libavcodec/dpx.c @@ -23,11 +23,7 @@ #include "libavutil/imgutils.h" #include "bytestream.h" #include "avcodec.h" - -typedef struct DPXContext { - AVFrame picture; -} DPXContext; - +#include "internal.h" static unsigned int read32(const uint8_t **ptr, int is_big) { @@ -51,19 +47,18 @@ static inline unsigned make_16bit(unsigned value) static int decode_frame(AVCodecContext *avctx, void *data, - int *data_size, + int *got_frame, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; const uint8_t *buf_end = avpkt->data + avpkt->size; int buf_size = avpkt->size; - DPXContext *const s = avctx->priv_data; - AVFrame *picture = data; - AVFrame *const p = &s->picture; + AVFrame *const p = data; uint8_t *ptr; - int magic_num, offset, endian; - int x, y; + unsigned int offset; + int magic_num, endian; + int x, y, ret; int w, h, stride, bits_per_color, descriptor, elements, target_packet_size, source_packet_size; unsigned int rgbBuffer; @@ -84,7 +79,7 @@ static int decode_frame(AVCodecContext *avctx, endian = 1; } else { av_log(avctx, AV_LOG_ERROR, "DPX marker not found\n"); - return -1; + return AVERROR_INVALIDDATA; } offset = read32(&buf, endian); @@ -119,48 +114,47 @@ static int decode_frame(AVCodecContext *avctx, break; default: av_log(avctx, AV_LOG_ERROR, "Unsupported descriptor %d\n", descriptor); - return -1; + return AVERROR_INVALIDDATA; } switch (bits_per_color) { case 8: if (elements == 4) { - avctx->pix_fmt = PIX_FMT_RGBA; + avctx->pix_fmt = AV_PIX_FMT_RGBA; } else { - avctx->pix_fmt = PIX_FMT_RGB24; + avctx->pix_fmt = AV_PIX_FMT_RGB24; } source_packet_size = elements; target_packet_size = elements; break; case 10: - avctx->pix_fmt = PIX_FMT_RGB48; + avctx->pix_fmt = AV_PIX_FMT_RGB48; target_packet_size = 6; source_packet_size = 4; break; case 12: case 16: if (endian) { - avctx->pix_fmt = PIX_FMT_RGB48BE; + avctx->pix_fmt = AV_PIX_FMT_RGB48BE; } else { - avctx->pix_fmt = PIX_FMT_RGB48LE; + avctx->pix_fmt = AV_PIX_FMT_RGB48LE; } target_packet_size = 6; source_packet_size = elements * 2; break; default: av_log(avctx, AV_LOG_ERROR, "Unsupported color depth : %d\n", bits_per_color); - return -1; + return AVERROR_INVALIDDATA; } - if (s->picture.data[0]) - avctx->release_buffer(avctx, &s->picture); - if (av_image_check_size(w, h, 0, avctx)) - return -1; - if (w != avctx->width || h != avctx->height) - avcodec_set_dimensions(avctx, w, h); - if (avctx->get_buffer(avctx, p) < 0) { + if ((ret = ff_set_dimensions(avctx, w, h)) < 0) + return ret; + + ff_set_sar(avctx, avctx->sample_aspect_ratio); + + if ((ret = ff_get_buffer(avctx, p, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return -1; + return ret; } // Move pointer to offset from start of file @@ -171,7 +165,7 @@ static int decode_frame(AVCodecContext *avctx, if (source_packet_size*avctx->width*avctx->height > buf_end - buf) { av_log(avctx, AV_LOG_ERROR, "Overread buffer. Invalid header?\n"); - return -1; + return AVERROR_INVALIDDATA; } switch (bits_per_color) { case 10: @@ -210,36 +204,16 @@ static int decode_frame(AVCodecContext *avctx, break; } - *picture = s->picture; - *data_size = sizeof(AVPicture); + *got_frame = 1; return buf_size; } -static av_cold int decode_init(AVCodecContext *avctx) -{ - DPXContext *s = avctx->priv_data; - avcodec_get_frame_defaults(&s->picture); - avctx->coded_frame = &s->picture; - return 0; -} - -static av_cold int decode_end(AVCodecContext *avctx) -{ - DPXContext *s = avctx->priv_data; - if (s->picture.data[0]) - avctx->release_buffer(avctx, &s->picture); - - return 0; -} - AVCodec ff_dpx_decoder = { .name = "dpx", + .long_name = NULL_IF_CONFIG_SMALL("DPX image"), .type = AVMEDIA_TYPE_VIDEO, - .id = CODEC_ID_DPX, - .priv_data_size = sizeof(DPXContext), - .init = decode_init, - .close = decode_end, + .id = AV_CODEC_ID_DPX, .decode = decode_frame, - .long_name = NULL_IF_CONFIG_SMALL("DPX image"), + .capabilities = AV_CODEC_CAP_DR1, };