LCOV - code coverage report
Current view: top level - libavcodec - v210x.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 65 0.0 %
Date: 2017-12-12 11:08:38 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2009 Michael Niedermayer <michaelni@gmx.at>
       3             :  *
       4             :  * This file is part of FFmpeg.
       5             :  *
       6             :  * FFmpeg is free software; you can redistribute it and/or
       7             :  * modify it under the terms of the GNU Lesser General Public
       8             :  * License as published by the Free Software Foundation; either
       9             :  * version 2.1 of the License, or (at your option) any later version.
      10             :  *
      11             :  * FFmpeg is distributed in the hope that it will be useful,
      12             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14             :  * Lesser General Public License for more details.
      15             :  *
      16             :  * You should have received a copy of the GNU Lesser General Public
      17             :  * License along with FFmpeg; if not, write to the Free Software
      18             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      19             :  */
      20             : 
      21             : #include "avcodec.h"
      22             : #include "internal.h"
      23             : #include "libavutil/bswap.h"
      24             : #include "libavutil/internal.h"
      25             : #include "libavutil/mem.h"
      26             : 
      27           0 : static av_cold int decode_init(AVCodecContext *avctx)
      28             : {
      29           0 :     if (avctx->width & 1) {
      30           0 :         av_log(avctx, AV_LOG_ERROR, "v210x needs even width\n");
      31           0 :         return AVERROR(EINVAL);
      32             :     }
      33           0 :     avctx->pix_fmt             = AV_PIX_FMT_YUV422P16;
      34           0 :     avctx->bits_per_raw_sample = 10;
      35             : 
      36           0 :     return 0;
      37             : }
      38             : 
      39           0 : static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
      40             :                         AVPacket *avpkt)
      41             : {
      42           0 :     const uint32_t *src = (const uint32_t *)avpkt->data;
      43           0 :     AVFrame *pic        = data;
      44           0 :     int width           = avctx->width;
      45           0 :     int y               = 0;
      46             :     uint16_t *ydst, *udst, *vdst, *yend;
      47             :     int ret;
      48             : 
      49           0 :     if (avpkt->size < avctx->width * avctx->height * 8 / 3) {
      50           0 :         av_log(avctx, AV_LOG_ERROR, "Packet too small\n");
      51           0 :         return AVERROR_INVALIDDATA;
      52             :     }
      53             : 
      54           0 :     if (avpkt->size > avctx->width * avctx->height * 8 / 3) {
      55           0 :         avpriv_request_sample(avctx, "(Probably) padded data");
      56             :     }
      57             : 
      58           0 :     if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
      59           0 :         return ret;
      60             : 
      61           0 :     ydst = (uint16_t *)pic->data[0];
      62           0 :     udst = (uint16_t *)pic->data[1];
      63           0 :     vdst = (uint16_t *)pic->data[2];
      64           0 :     yend = ydst + width;
      65           0 :     pic->pict_type = AV_PICTURE_TYPE_I;
      66           0 :     pic->key_frame = 1;
      67             : 
      68           0 :     for (;;) {
      69           0 :         uint32_t v = av_be2ne32(*src++);
      70           0 :         *udst++ = (v >> 16) & 0xFFC0;
      71           0 :         *ydst++ = (v >> 6 ) & 0xFFC0;
      72           0 :         *vdst++ = (v << 4 ) & 0xFFC0;
      73             : 
      74           0 :         v       = av_be2ne32(*src++);
      75           0 :         *ydst++ = (v >> 16) & 0xFFC0;
      76             : 
      77           0 :         if (ydst >= yend) {
      78           0 :             ydst += pic->linesize[0] / 2 - width;
      79           0 :             udst += pic->linesize[1] / 2 - width / 2;
      80           0 :             vdst += pic->linesize[2] / 2 - width / 2;
      81           0 :             yend = ydst + width;
      82           0 :             if (++y >= avctx->height)
      83           0 :                 break;
      84             :         }
      85             : 
      86           0 :         *udst++ = (v >> 6 ) & 0xFFC0;
      87           0 :         *ydst++ = (v << 4 ) & 0xFFC0;
      88             : 
      89           0 :         v = av_be2ne32(*src++);
      90           0 :         *vdst++ = (v >> 16) & 0xFFC0;
      91           0 :         *ydst++ = (v >> 6 ) & 0xFFC0;
      92             : 
      93           0 :         if (ydst >= yend) {
      94           0 :             ydst += pic->linesize[0] / 2 - width;
      95           0 :             udst += pic->linesize[1] / 2 - width / 2;
      96           0 :             vdst += pic->linesize[2] / 2 - width / 2;
      97           0 :             yend  = ydst + width;
      98           0 :             if (++y >= avctx->height)
      99           0 :                 break;
     100             :         }
     101             : 
     102           0 :         *udst++ = (v << 4 ) & 0xFFC0;
     103             : 
     104           0 :         v = av_be2ne32(*src++);
     105           0 :         *ydst++ = (v >> 16) & 0xFFC0;
     106           0 :         *vdst++ = (v >> 6 ) & 0xFFC0;
     107           0 :         *ydst++ = (v << 4 ) & 0xFFC0;
     108           0 :         if (ydst >= yend) {
     109           0 :             ydst += pic->linesize[0] / 2 - width;
     110           0 :             udst += pic->linesize[1] / 2 - width / 2;
     111           0 :             vdst += pic->linesize[2] / 2 - width / 2;
     112           0 :             yend  = ydst + width;
     113           0 :             if (++y >= avctx->height)
     114           0 :                 break;
     115             :         }
     116             :     }
     117             : 
     118           0 :     *got_frame = 1;
     119             : 
     120           0 :     return avpkt->size;
     121             : }
     122             : 
     123             : AVCodec ff_v210x_decoder = {
     124             :     .name           = "v210x",
     125             :     .long_name      = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"),
     126             :     .type           = AVMEDIA_TYPE_VIDEO,
     127             :     .id             = AV_CODEC_ID_V210X,
     128             :     .init           = decode_init,
     129             :     .decode         = decode_frame,
     130             :     .capabilities   = AV_CODEC_CAP_DR1,
     131             : };

Generated by: LCOV version 1.13