Blame view

ffmpeg-4.2.2/libavcodec/dnxhddata.h 3.08 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  /*
   * VC3/DNxHD decoder.
   * Copyright (c) 2007 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
   *
   * This file is part of FFmpeg.
   *
   * FFmpeg 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,
   * 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
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVCODEC_DNXHDDATA_H
  #define AVCODEC_DNXHDDATA_H
  
  #include <stdint.h>
  #include "avcodec.h"
  #include "libavutil/internal.h"
  #include "libavutil/intreadwrite.h"
  
  /** Additional profile info flags */
  #define DNXHD_INTERLACED   (1<<0)
  #define DNXHD_MBAFF        (1<<1)
  #define DNXHD_444          (1<<2)
  
  /** Frame headers, extra 0x00 added to end for parser */
  #define DNXHD_HEADER_INITIAL 0x000002800100
  #define DNXHD_HEADER_444     0x000002800200
  
  /** Indicate that a CIDEntry value must be read in the bitstream */
  #define DNXHD_VARIABLE 0
  
  typedef struct CIDEntry {
      int cid;
      unsigned int width, height;
      unsigned int frame_size;
      unsigned int coding_unit_size;
      uint16_t flags;
      int index_bits;
      int bit_depth;
      int eob_index;
      const uint8_t *luma_weight, *chroma_weight;
      const uint8_t *dc_codes, *dc_bits;
      const uint16_t *ac_codes;
      const uint8_t *ac_bits, *ac_info;
      const uint16_t *run_codes;
      const uint8_t *run_bits, *run;
      int bit_rates[5]; ///< Helper to choose variants, rounded to nearest 5Mb/s
      AVRational packet_scale;
  } CIDEntry;
  
  extern const CIDEntry ff_dnxhd_cid_table[];
  
  int ff_dnxhd_get_cid_table(int cid);
  int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth);
  void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel);
  
  static av_always_inline uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix)
  {
      uint64_t data_offset = prefix >> 16;
      if ((prefix & 0xFFFF0000FFFFLL) == 0x0300 &&
           data_offset >= 0x0280 && data_offset <= 0x2170 &&
           (data_offset & 3) == 0)
          return prefix;
      return 0;
  }
  
  static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix)
  {
      if (prefix == DNXHD_HEADER_INITIAL ||
          prefix == DNXHD_HEADER_444     ||
          ff_dnxhd_check_header_prefix_hr(prefix))
          return prefix;
      return 0;
  }
  
  static av_always_inline uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf)
  {
      uint64_t prefix = AV_RB32(buf);
      prefix = (prefix << 16) | buf[4] << 8;
      return ff_dnxhd_check_header_prefix(prefix);
  }
  
  int avpriv_dnxhd_get_frame_size(int cid);
  int avpriv_dnxhd_get_hr_frame_size(int cid, int w, int h);
  int avpriv_dnxhd_get_interlaced(int cid);
  
  #endif /* AVCODEC_DNXHDDATA_H */