X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fv210x.c;h=2922c05175675c4f9dbe255c335d8becbcf92863;hb=3a651f599a18b023602370b67a77eb0efa309b20;hp=754b70a1f0f4dc70325e375bb0edf6c288ebe10b;hpb=b157e3e56bca48bd0325f6e8425a52b9821f1380;p=ffmpeg diff --git a/libavcodec/v210x.c b/libavcodec/v210x.c index 754b70a1f0f..2922c051756 100644 --- a/libavcodec/v210x.c +++ b/libavcodec/v210x.c @@ -1,137 +1,131 @@ /* * 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); } - if(avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) - return -1; - 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(avctx, AV_LOG_ERROR, "Probably padded data, need sample!\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= FF_I_TYPE; - pic->key_frame= 1; - - for(;;){ - uint32_t v= be2me_32(*src++); - *udst++= (v>>16) & 0xFFC0; - *ydst++= (v>>6 ) & 0xFFC0; - *vdst++= (v<<4 ) & 0xFFC0; - - v= be2me_32(*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= be2me_32(*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= be2me_32(*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; } -AVCodec v210x_decoder = { - "v210x", - CODEC_TYPE_VIDEO, - CODEC_ID_V210X, - 0, - decode_init, - NULL, - NULL, - decode_frame, - CODEC_CAP_DR1, +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, + .decode = decode_frame, + .capabilities = CODEC_CAP_DR1, };