X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fv210x.c;h=3f220ff6f46ecfe16e539c2a7938508bafb5ae75;hb=4628443ca3534060888dd0015b229337eac13fd2;hp=75449cd5f500de47128b34bee66ee577ac9abe51;hpb=36ef5369ee9b336febc2c270f8718cec4476cb85;p=ffmpeg diff --git a/libavcodec/v210x.c b/libavcodec/v210x.c index 75449cd5f50..3f220ff6f46 100644 --- a/libavcodec/v210x.c +++ b/libavcodec/v210x.c @@ -19,126 +19,113 @@ */ #include "avcodec.h" +#include "internal.h" #include "libavutil/bswap.h" +#include "libavutil/internal.h" +#include "libavutil/mem.h" static av_cold int decode_init(AVCodecContext *avctx) { - if(avctx->width & 1){ + if (avctx->width & 1) { av_log(avctx, AV_LOG_ERROR, "v210x needs even width\n"); - return -1; + return AVERROR(EINVAL); } - avctx->pix_fmt = PIX_FMT_YUV422P16; - avctx->bits_per_raw_sample= 10; - - avctx->coded_frame= avcodec_alloc_frame(); + avctx->pix_fmt = AV_PIX_FMT_YUV422P16; + avctx->bits_per_raw_sample = 10; return 0; } -static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) +static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, + AVPacket *avpkt) { - int y=0; - int width= avctx->width; - AVFrame *pic= avctx->coded_frame; - const uint32_t *src= (const uint32_t *)avpkt->data; + const uint32_t *src = (const uint32_t *)avpkt->data; + AVFrame *pic = data; + int width = avctx->width; + int y = 0; uint16_t *ydst, *udst, *vdst, *yend; + int ret; - if(pic->data[0]) - avctx->release_buffer(avctx, pic); - - if(avpkt->size < avctx->width * avctx->height * 8 / 3){ + if (avpkt->size < avctx->width * avctx->height * 8 / 3) { av_log(avctx, AV_LOG_ERROR, "Packet too small\n"); - return -1; + return AVERROR_INVALIDDATA; } - if(avpkt->size > avctx->width * avctx->height * 8 / 3){ - av_log_ask_for_sample(avctx, "Probably padded data\n"); + if (avpkt->size > avctx->width * avctx->height * 8 / 3) { + avpriv_request_sample(avctx, "(Probably) padded data"); } - pic->reference= 0; - if(avctx->get_buffer(avctx, pic) < 0) - return -1; - - ydst= (uint16_t *)pic->data[0]; - udst= (uint16_t *)pic->data[1]; - vdst= (uint16_t *)pic->data[2]; - yend= ydst + width; - pic->pict_type= AV_PICTURE_TYPE_I; - pic->key_frame= 1; - - for(;;){ - uint32_t v= av_be2ne32(*src++); - *udst++= (v>>16) & 0xFFC0; - *ydst++= (v>>6 ) & 0xFFC0; - *vdst++= (v<<4 ) & 0xFFC0; - - v= av_be2ne32(*src++); - *ydst++= (v>>16) & 0xFFC0; - - if(ydst >= yend){ - ydst+= pic->linesize[0]/2 - width; - udst+= pic->linesize[1]/2 - width/2; - vdst+= pic->linesize[2]/2 - width/2; - yend= ydst + width; - if(++y >= avctx->height) + if ((ret = ff_get_buffer(avctx, pic, 0)) < 0) + return ret; + + ydst = (uint16_t *)pic->data[0]; + udst = (uint16_t *)pic->data[1]; + vdst = (uint16_t *)pic->data[2]; + yend = ydst + width; + pic->pict_type = AV_PICTURE_TYPE_I; + pic->key_frame = 1; + + for (;;) { + uint32_t v = av_be2ne32(*src++); + *udst++ = (v >> 16) & 0xFFC0; + *ydst++ = (v >> 6 ) & 0xFFC0; + *vdst++ = (v << 4 ) & 0xFFC0; + + v = av_be2ne32(*src++); + *ydst++ = (v >> 16) & 0xFFC0; + + if (ydst >= yend) { + ydst += pic->linesize[0] / 2 - width; + udst += pic->linesize[1] / 2 - width / 2; + vdst += pic->linesize[2] / 2 - width / 2; + yend = ydst + width; + if (++y >= avctx->height) break; } - *udst++= (v>>6 ) & 0xFFC0; - *ydst++= (v<<4 ) & 0xFFC0; + *udst++ = (v >> 6 ) & 0xFFC0; + *ydst++ = (v << 4 ) & 0xFFC0; - v= av_be2ne32(*src++); - *vdst++= (v>>16) & 0xFFC0; - *ydst++= (v>>6 ) & 0xFFC0; + v = av_be2ne32(*src++); + *vdst++ = (v >> 16) & 0xFFC0; + *ydst++ = (v >> 6 ) & 0xFFC0; - if(ydst >= yend){ - ydst+= pic->linesize[0]/2 - width; - udst+= pic->linesize[1]/2 - width/2; - vdst+= pic->linesize[2]/2 - width/2; - yend= ydst + width; - if(++y >= avctx->height) + if (ydst >= yend) { + ydst += pic->linesize[0] / 2 - width; + udst += pic->linesize[1] / 2 - width / 2; + vdst += pic->linesize[2] / 2 - width / 2; + yend = ydst + width; + if (++y >= avctx->height) break; } - *udst++= (v<<4 ) & 0xFFC0; - - v= av_be2ne32(*src++); - *ydst++= (v>>16) & 0xFFC0; - *vdst++= (v>>6 ) & 0xFFC0; - *ydst++= (v<<4 ) & 0xFFC0; - if(ydst >= yend){ - ydst+= pic->linesize[0]/2 - width; - udst+= pic->linesize[1]/2 - width/2; - vdst+= pic->linesize[2]/2 - width/2; - yend= ydst + width; - if(++y >= avctx->height) + *udst++ = (v << 4 ) & 0xFFC0; + + v = av_be2ne32(*src++); + *ydst++ = (v >> 16) & 0xFFC0; + *vdst++ = (v >> 6 ) & 0xFFC0; + *ydst++ = (v << 4 ) & 0xFFC0; + if (ydst >= yend) { + ydst += pic->linesize[0] / 2 - width; + udst += pic->linesize[1] / 2 - width / 2; + vdst += pic->linesize[2] / 2 - width / 2; + yend = ydst + width; + if (++y >= avctx->height) break; } } - *data_size=sizeof(AVFrame); - *(AVFrame*)data= *avctx->coded_frame; + *got_frame = 1; return avpkt->size; } -static av_cold int decode_close(AVCodecContext *avctx) -{ - AVFrame *pic = avctx->coded_frame; - if (pic->data[0]) - avctx->release_buffer(avctx, pic); - av_freep(&avctx->coded_frame); - - return 0; -} - AVCodec ff_v210x_decoder = { .name = "v210x", + .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_V210X, .init = decode_init, - .close = decode_close, .decode = decode_frame, - .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"), + .capabilities = AV_CODEC_CAP_DR1, };