3 * Copyright (c) 2007 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
5 * This file is part of FFmpeg.
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.
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.
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
22 #ifndef AVCODEC_DNXHDDATA_H
23 #define AVCODEC_DNXHDDATA_H
27 #include "libavutil/attributes.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/rational.h"
31 /** Additional profile info flags */
32 #define DNXHD_INTERLACED (1<<0)
33 #define DNXHD_MBAFF (1<<1)
34 #define DNXHD_444 (1<<2)
36 /** Frame headers, extra 0x00 added to end for parser */
37 #define DNXHD_HEADER_INITIAL 0x000002800100
38 #define DNXHD_HEADER_444 0x000002800200
40 /** Indicate that a CIDEntry value must be read in the bitstream */
41 #define DNXHD_VARIABLE 0
43 typedef struct CIDEntry
{
45 unsigned int width
, height
;
46 unsigned int frame_size
;
47 unsigned int coding_unit_size
;
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
;
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
);
66 static av_always_inline
uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix
)
68 uint64_t data_offset
= prefix
>> 16;
69 if ((prefix
& 0xFFFF0000FFFFLL
) == 0x0300 &&
70 data_offset
>= 0x0280 && data_offset
<= 0x2170 &&
71 (data_offset
& 3) == 0)
76 static av_always_inline
uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix
)
78 if (prefix
== DNXHD_HEADER_INITIAL
||
79 prefix
== DNXHD_HEADER_444
||
80 ff_dnxhd_check_header_prefix_hr(prefix
))
85 static av_always_inline
uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf
)
87 uint64_t prefix
= AV_RB32(buf
);
88 prefix
= (prefix
<< 16) | buf
[4] << 8;
89 return ff_dnxhd_check_header_prefix(prefix
);
92 int ff_dnxhd_get_frame_size(int cid
);
93 int ff_dnxhd_get_hr_frame_size(int cid
, int w
, int h
);
95 #endif /* AVCODEC_DNXHDDATA_H */