blob: 89262a13c1c33c25d99274ca70470636fffc74e3
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 frame_rates[5]; |
59 | AVRational packet_scale; |
60 | } CIDEntry; |
61 | |
62 | extern const CIDEntry ff_dnxhd_cid_table[]; |
63 | |
64 | int ff_dnxhd_get_cid_table(int cid); |
65 | int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth); |
66 | void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel); |
67 | |
68 | static av_always_inline uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix) |
69 | { |
70 | uint64_t data_offset = prefix >> 16; |
71 | if ((prefix & 0xFFFF0000FFFFLL) == 0x0300 && |
72 | data_offset >= 0x0280 && data_offset <= 0x2170 && |
73 | (data_offset & 3) == 0) |
74 | return prefix; |
75 | return 0; |
76 | } |
77 | |
78 | static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix) |
79 | { |
80 | if (prefix == DNXHD_HEADER_INITIAL || |
81 | prefix == DNXHD_HEADER_444 || |
82 | ff_dnxhd_check_header_prefix_hr(prefix)) |
83 | return prefix; |
84 | return 0; |
85 | } |
86 | |
87 | static av_always_inline uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf) |
88 | { |
89 | uint64_t prefix = AV_RB32(buf); |
90 | prefix = (prefix << 16) | buf[4] << 8; |
91 | return ff_dnxhd_check_header_prefix(prefix); |
92 | } |
93 | |
94 | int avpriv_dnxhd_get_frame_size(int cid); |
95 | int avpriv_dnxhd_get_interlaced(int cid); |
96 | #if LIBAVCODEC_VERSION_MAJOR < 58 |
97 | attribute_deprecated |
98 | uint64_t avpriv_dnxhd_parse_header_prefix(const uint8_t *buf); |
99 | #endif |
100 | #endif /* AVCODEC_DNXHDDATA_H */ |
101 |