X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fv210x.c;h=97938b1090d1729a46a91a24c2560571ec3dfeee;hb=b2d688ea9f9c2d37cdabc1e32b25f2a898e1e245;hp=0d6a681b783f8073eb5846e32a016beaf60b970c;hpb=d36beb3f6902b1217beda576aa18abf7eb72b03c;p=ffmpeg diff --git a/libavcodec/v210x.c b/libavcodec/v210x.c index 0d6a681b783..97938b1090d 100644 --- a/libavcodec/v210x.c +++ b/libavcodec/v210x.c @@ -1,122 +1,127 @@ /* * Copyright (C) 2009 Michael Niedermayer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #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->pix_fmt = AV_PIX_FMT_YUV422P16; + avctx->bits_per_raw_sample = 10; avctx->coded_frame= avcodec_alloc_frame(); 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 = avctx->coded_frame; + int width = avctx->width; + int y = 0; uint16_t *ydst, *udst, *vdst, *yend; + int ret; - if(pic->data[0]) + 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(avctx, AV_LOG_ERROR, "Probably padded data, need sample!\n"); + if (avpkt->size > avctx->width * avctx->height * 8 / 3) { + av_log_ask_for_sample(avctx, "Probably padded data\n"); } - 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= FF_I_TYPE; - 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) + pic->reference = 0; + if ((ret = ff_get_buffer(avctx, pic)) < 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); + *got_frame = 1; *(AVFrame*)data= *avctx->coded_frame; return avpkt->size; @@ -133,14 +138,12 @@ static av_cold int decode_close(AVCodecContext *avctx) } AVCodec ff_v210x_decoder = { - "v210x", - AVMEDIA_TYPE_VIDEO, - CODEC_ID_V210X, - 0, - decode_init, - NULL, - decode_close, - decode_frame, - CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"), + .name = "v210x", + .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"), };