LCOV - code coverage report
Current view: top level - libavcodec - dnxhddata.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 23 24 95.8 %
Date: 2017-12-17 04:34:43 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /*
       2             :  * VC3/DNxHD decoder.
       3             :  * Copyright (c) 2007 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
       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             : #ifndef AVCODEC_DNXHDDATA_H
      23             : #define AVCODEC_DNXHDDATA_H
      24             : 
      25             : #include <stdint.h>
      26             : #include "avcodec.h"
      27             : #include "libavutil/internal.h"
      28             : #include "libavutil/intreadwrite.h"
      29             : 
      30             : /** Additional profile info flags */
      31             : #define DNXHD_INTERLACED   (1<<0)
      32             : #define DNXHD_MBAFF        (1<<1)
      33             : #define DNXHD_444          (1<<2)
      34             : 
      35             : /** Frame headers, extra 0x00 added to end for parser */
      36             : #define DNXHD_HEADER_INITIAL 0x000002800100
      37             : #define DNXHD_HEADER_444     0x000002800200
      38             : 
      39             : /** Indicate that a CIDEntry value must be read in the bitstream */
      40             : #define DNXHD_VARIABLE 0
      41             : 
      42             : typedef struct CIDEntry {
      43             :     int cid;
      44             :     unsigned int width, height;
      45             :     unsigned int frame_size;
      46             :     unsigned int coding_unit_size;
      47             :     uint16_t flags;
      48             :     int index_bits;
      49             :     int bit_depth;
      50             :     int eob_index;
      51             :     const uint8_t *luma_weight, *chroma_weight;
      52             :     const uint8_t *dc_codes, *dc_bits;
      53             :     const uint16_t *ac_codes;
      54             :     const uint8_t *ac_bits, *ac_info;
      55             :     const uint16_t *run_codes;
      56             :     const uint8_t *run_bits, *run;
      57             :     int bit_rates[5]; ///< Helper to choose variants, rounded to nearest 5Mb/s
      58             :     AVRational packet_scale;
      59             : } CIDEntry;
      60             : 
      61             : extern const CIDEntry ff_dnxhd_cid_table[];
      62             : 
      63             : int ff_dnxhd_get_cid_table(int cid);
      64             : int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth);
      65             : void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel);
      66             : 
      67        8416 : static av_always_inline uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix)
      68             : {
      69        8416 :     uint64_t data_offset = prefix >> 16;
      70        8416 :     if ((prefix & 0xFFFF0000FFFFLL) == 0x0300 &&
      71        1296 :          data_offset >= 0x0280 && data_offset <= 0x2170 &&
      72         648 :          (data_offset & 3) == 0)
      73         648 :         return prefix;
      74        7768 :     return 0;
      75             : }
      76             : 
      77        8676 : static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix)
      78             : {
      79        8676 :     if (prefix == DNXHD_HEADER_INITIAL ||
      80        8308 :         prefix == DNXHD_HEADER_444     ||
      81        8308 :         ff_dnxhd_check_header_prefix_hr(prefix))
      82         908 :         return prefix;
      83        7768 :     return 0;
      84             : }
      85             : 
      86        6654 : static av_always_inline uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf)
      87             : {
      88        6654 :     uint64_t prefix = AV_RB32(buf);
      89        6654 :     prefix = (prefix << 16) | buf[4] << 8;
      90        6654 :     return ff_dnxhd_check_header_prefix(prefix);
      91             : }
      92             : 
      93         250 : static av_always_inline int ff_dnxhd_get_hr_frame_size(int cid, int w, int h)
      94             : {
      95         250 :     int result, i = ff_dnxhd_get_cid_table(cid);
      96             : 
      97         250 :     if (i < 0)
      98           0 :         return i;
      99             : 
     100         250 :     result = ((h + 15) / 16) * ((w + 15) / 16) * (int64_t)ff_dnxhd_cid_table[i].packet_scale.num / ff_dnxhd_cid_table[i].packet_scale.den;
     101         250 :     result = (result + 2048) / 4096 * 4096;
     102             : 
     103         250 :     return FFMAX(result, 8192);
     104             : }
     105             : 
     106             : int avpriv_dnxhd_get_frame_size(int cid);
     107             : int avpriv_dnxhd_get_interlaced(int cid);
     108             : 
     109             : #endif /* AVCODEC_DNXHDDATA_H */

Generated by: LCOV version 1.13