Line | Branch | Exec | Source |
---|---|---|---|
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/attributes.h" | ||
28 | #include "libavutil/intreadwrite.h" | ||
29 | #include "libavutil/rational.h" | ||
30 | |||
31 | /** Additional profile info flags */ | ||
32 | #define DNXHD_INTERLACED (1<<0) | ||
33 | #define DNXHD_MBAFF (1<<1) | ||
34 | #define DNXHD_444 (1<<2) | ||
35 | |||
36 | /** Frame headers, extra 0x00 added to end for parser */ | ||
37 | #define DNXHD_HEADER_INITIAL 0x000002800100 | ||
38 | #define DNXHD_HEADER_444 0x000002800200 | ||
39 | |||
40 | /** Indicate that a CIDEntry value must be read in the bitstream */ | ||
41 | #define DNXHD_VARIABLE 0 | ||
42 | |||
43 | typedef struct CIDEntry { | ||
44 | int cid; | ||
45 | unsigned int width, height; | ||
46 | unsigned int frame_size; | ||
47 | unsigned int coding_unit_size; | ||
48 | uint16_t flags; | ||
49 | int index_bits; | ||
50 | int bit_depth; | ||
51 | int eob_index; | ||
52 | const uint8_t *luma_weight, *chroma_weight; | ||
53 | const uint8_t *dc_codes, *dc_bits; | ||
54 | const uint16_t *ac_codes; | ||
55 | const uint8_t *ac_bits, *ac_info; | ||
56 | const uint16_t *run_codes; | ||
57 | const uint8_t *run_bits, *run; | ||
58 | int bit_rates[5]; ///< Helper to choose variants, rounded to nearest 5Mb/s | ||
59 | AVRational packet_scale; | ||
60 | } CIDEntry; | ||
61 | |||
62 | const CIDEntry *ff_dnxhd_get_cid_table(int cid); | ||
63 | int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth); | ||
64 | void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel); | ||
65 | |||
66 | 9899 | static av_always_inline uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix) | |
67 | { | ||
68 | 9899 | uint64_t data_offset = prefix >> 16; | |
69 |
4/4✓ Branch 0 taken 701 times.
✓ Branch 1 taken 9198 times.
✓ Branch 2 taken 656 times.
✓ Branch 3 taken 45 times.
|
9899 | if ((prefix & 0xFFFF0000FFFFLL) == 0x0300 && |
70 |
1/2✓ Branch 0 taken 656 times.
✗ Branch 1 not taken.
|
656 | data_offset >= 0x0280 && data_offset <= 0x2170 && |
71 |
1/2✓ Branch 0 taken 656 times.
✗ Branch 1 not taken.
|
656 | (data_offset & 3) == 0) |
72 | 656 | return prefix; | |
73 | 9243 | return 0; | |
74 | } | ||
75 | |||
76 | 10235 | static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix) | |
77 | { | ||
78 |
4/4✓ Branch 0 taken 9793 times.
✓ Branch 1 taken 442 times.
✓ Branch 2 taken 9791 times.
✓ Branch 3 taken 2 times.
|
10235 | if (prefix == DNXHD_HEADER_INITIAL || |
79 |
2/2✓ Branch 0 taken 548 times.
✓ Branch 1 taken 9243 times.
|
9791 | prefix == DNXHD_HEADER_444 || |
80 | 9791 | ff_dnxhd_check_header_prefix_hr(prefix)) | |
81 | 992 | return prefix; | |
82 | 9243 | return 0; | |
83 | } | ||
84 | |||
85 | 7709 | static av_always_inline uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf) | |
86 | { | ||
87 | 7709 | uint64_t prefix = AV_RB32(buf); | |
88 | 7709 | prefix = (prefix << 16) | buf[4] << 8; | |
89 | 7709 | return ff_dnxhd_check_header_prefix(prefix); | |
90 | } | ||
91 | |||
92 | int ff_dnxhd_get_frame_size(int cid); | ||
93 | int ff_dnxhd_get_hr_frame_size(int cid, int w, int h); | ||
94 | |||
95 | #endif /* AVCODEC_DNXHDDATA_H */ | ||
96 |