LCOV - code coverage report
Current view: top level - libavcodec - bmvaudio.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 25 29 86.2 %
Date: 2017-12-18 13:19:42 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Discworld II BMV audio decoder
       3             :  * Copyright (c) 2011 Konstantin Shishkov
       4             :  *
       5             :  * This file is part of FFmpeg.
       6             :  *
       7             :  * FFmpeg is free software; you can redistribute it and/or
       8             :  * modify it under the terms of the GNU Lesser General Public
       9             :  * License as published by the Free Software Foundation; either
      10             :  * version 2.1 of the License, or (at your option) any later version.
      11             :  *
      12             :  * FFmpeg is distributed in the hope that it will be useful,
      13             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15             :  * Lesser General Public License for more details.
      16             :  *
      17             :  * You should have received a copy of the GNU Lesser General Public
      18             :  * License along with FFmpeg; if not, write to the Free Software
      19             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      20             :  */
      21             : 
      22             : #include "libavutil/channel_layout.h"
      23             : #include "libavutil/common.h"
      24             : 
      25             : #include "avcodec.h"
      26             : #include "internal.h"
      27             : 
      28             : static const int bmv_aud_mults[16] = {
      29             :     16512, 8256, 4128, 2064, 1032, 516, 258, 192, 129, 88, 64, 56, 48, 40, 36, 32
      30             : };
      31             : 
      32           3 : static av_cold int bmv_aud_decode_init(AVCodecContext *avctx)
      33             : {
      34           3 :     avctx->channels       = 2;
      35           3 :     avctx->channel_layout = AV_CH_LAYOUT_STEREO;
      36           3 :     avctx->sample_fmt     = AV_SAMPLE_FMT_S16;
      37             : 
      38           3 :     return 0;
      39             : }
      40             : 
      41          21 : static int bmv_aud_decode_frame(AVCodecContext *avctx, void *data,
      42             :                                 int *got_frame_ptr, AVPacket *avpkt)
      43             : {
      44          21 :     AVFrame *frame     = data;
      45          21 :     const uint8_t *buf = avpkt->data;
      46          21 :     int buf_size = avpkt->size;
      47          21 :     int blocks = 0, total_blocks, i;
      48             :     int ret;
      49             :     int16_t *output_samples;
      50             :     int scale[2];
      51             : 
      52          21 :     total_blocks = *buf++;
      53          21 :     if (buf_size < total_blocks * 65 + 1) {
      54           0 :         av_log(avctx, AV_LOG_ERROR, "expected %d bytes, got %d\n",
      55           0 :                total_blocks * 65 + 1, buf_size);
      56           0 :         return AVERROR_INVALIDDATA;
      57             :     }
      58             : 
      59             :     /* get output buffer */
      60          21 :     frame->nb_samples = total_blocks * 32;
      61          21 :     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
      62           0 :         return ret;
      63          21 :     output_samples = (int16_t *)frame->data[0];
      64             : 
      65        1227 :     for (blocks = 0; blocks < total_blocks; blocks++) {
      66        1206 :         uint8_t code = *buf++;
      67        1206 :         code = (code >> 1) | (code << 7);
      68        1206 :         scale[0] = bmv_aud_mults[code & 0xF];
      69        1206 :         scale[1] = bmv_aud_mults[code >> 4];
      70       39798 :         for (i = 0; i < 32; i++) {
      71       38592 :             *output_samples++ = av_clip_int16((scale[0] * (int8_t)*buf++) >> 5);
      72       38592 :             *output_samples++ = av_clip_int16((scale[1] * (int8_t)*buf++) >> 5);
      73             :         }
      74             :     }
      75             : 
      76          21 :     *got_frame_ptr = 1;
      77             : 
      78          21 :     return buf_size;
      79             : }
      80             : 
      81             : AVCodec ff_bmv_audio_decoder = {
      82             :     .name           = "bmv_audio",
      83             :     .long_name      = NULL_IF_CONFIG_SMALL("Discworld II BMV audio"),
      84             :     .type           = AVMEDIA_TYPE_AUDIO,
      85             :     .id             = AV_CODEC_ID_BMV_AUDIO,
      86             :     .init           = bmv_aud_decode_init,
      87             :     .decode         = bmv_aud_decode_frame,
      88             :     .capabilities   = AV_CODEC_CAP_DR1,
      89             : };

Generated by: LCOV version 1.13